Zephyr API Documentation 4.3.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
symbol.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2023 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_LLEXT_SYMBOL_H
8#define ZEPHYR_LLEXT_SYMBOL_H
9
12#include <zephyr/toolchain.h>
13#include <stddef.h>
14#include <stdint.h>
15
16#ifdef __cplusplus
17extern "C" {
18#endif
19
32
48 union {
50 const char *const name;
51
54 };
55
57 const void *const addr;
58};
59BUILD_ASSERT(sizeof(struct llext_const_symbol) == 2 * sizeof(uintptr_t));
60
70 const char *name;
71
73 void *addr;
74};
75
76
84 size_t sym_cnt;
85
88};
89
91
116struct z_llext_discarded_const_symbol {
118 const char *const name;
119
121 const char *const group;
122};
123
124#define Z_LLEXT_DISCARD_STRTAB Z_GENERIC_SECTION(llext_discarded_exports_strtab)
125
126#ifdef CONFIG_LLEXT
127#define Z_MARKUP_NOT_EXPORTED_SYMBOL(grp, sym_ident, sym_name) \
128 static const char Z_LLEXT_DISCARD_STRTAB __used \
129 __llext_sym_name_ ## sym_name[] = STRINGIFY(sym_name); \
130 static const char Z_LLEXT_DISCARD_STRTAB __used \
131 __llext_sym_group_ ## sym_name[] = STRINGIFY(grp); \
132 static const struct z_llext_discarded_const_symbol \
133 Z_GENERIC_SECTION(llext_discarded_exports_table) __used \
134 __llext_sym_discarded_ ## sym_name = { \
135 .name = __llext_sym_name_ ## sym_name, \
136 .group = __llext_sym_group_ ## sym_name, \
137 };
138#else /* CONFIG_LLEXT */
139/* No extension support in this build */
140#define Z_MARKUP_NOT_EXPORTED_SYMBOL(grp, sym_ident, sym_name)
141#endif /* CONFIG_LLEXT */
142
144
146#ifdef LL_EXTENSION_BUILD
147/* Extension build: add exported symbols to llext table */
148#define Z_LL_EXTENSION_SYMBOL_NAMED(sym_ident, sym_name) \
149 static const struct llext_const_symbol \
150 Z_GENERIC_SECTION(.exported_sym) __used \
151 __llext_sym_ ## sym_name = { \
152 .name = STRINGIFY(sym_name), .addr = (const void *)&sym_ident, \
153 }
154#else
155/* No-op when not building an extension */
156#define Z_LL_EXTENSION_SYMBOL_NAMED(sym_ident, sym_name)
157#endif
159
169#define LL_EXTENSION_SYMBOL_NAMED(sym_ident, sym_name) \
170 Z_LL_EXTENSION_SYMBOL_NAMED(sym_ident, sym_name)
171
183#define LL_EXTENSION_SYMBOL(x) Z_LL_EXTENSION_SYMBOL_NAMED(x, x)
184
186#if defined(LL_EXTENSION_BUILD)
187/* Extension build: EXPORT_SYMBOL maps to LL_EXTENSION_SYMBOL */
188#define Z_EXPORT_SYMBOL_NAMED(sym_ident, sym_name) \
189 Z_LL_EXTENSION_SYMBOL_NAMED(sym_ident, sym_name)
190#elif defined(CONFIG_LLEXT_EXPORT_BUILTINS_BY_SLID)
191/* SLID-enabled LLEXT application: export symbols, names in separate section */
192#define Z_EXPORT_SYMBOL_NAMED(sym_ident, sym_name) \
193 static const char Z_GENERIC_SECTION(llext_exports_strtab) __used \
194 __llext_sym_name_ ## sym_name[] = STRINGIFY(sym_name); \
195 static const STRUCT_SECTION_ITERABLE(llext_const_symbol, \
196 __llext_sym_ ## sym_name) = { \
197 .name = __llext_sym_name_ ## sym_name, \
198 .addr = (const void *)&sym_ident, \
199 }
200#elif defined(CONFIG_LLEXT)
201/* LLEXT application: export symbols */
202#define Z_EXPORT_SYMBOL_NAMED(sym_ident, sym_name) \
203 static const STRUCT_SECTION_ITERABLE(llext_const_symbol, \
204 __llext_sym_ ## sym_name) = { \
205 .name = STRINGIFY(sym_name), .addr = (const void *)&sym_ident, \
206 }
207#else
208/* No extension support in this build */
209#define Z_EXPORT_SYMBOL_NAMED(sym_ident, sym_name)
210#endif
212
213#if defined(LL_EXTENSION_BUILD)
214/* Extension build: No Kconfig conditionals */
215#define Z_EXPORT_SYMBOL_NAMED_IN_GROUP(group, sym_ident, sym_name) \
216 Z_EXPORT_SYMBOL_NAMED(sym_ident, sym_name)
217#else
218/* LLEXT application: Export if relevant group is enabled */
219#define Z_EXPORT_SYMBOL_NAMED_IN_GROUP(group, sym_ident, sym_name) \
220 COND_CODE_1(CONFIG_LLEXT_EXPORT_SYMBOL_GROUP_ ## group, \
221 (Z_EXPORT_SYMBOL_NAMED(sym_ident, sym_name)), \
222 (Z_MARKUP_NOT_EXPORTED_SYMBOL(group, sym_ident, sym_name)))
223#endif /* defined(LL_EXTENSION_BUILD) */
224
239#define EXPORT_SYMBOL_NAMED(sym_ident, sym_name) \
240 Z_EXPORT_SYMBOL_NAMED_IN_GROUP(UNASSIGNED, sym_ident, sym_name)
241
257#define EXPORT_SYMBOL(x) EXPORT_SYMBOL_NAMED(x, x)
258
274#define EXPORT_GROUP_SYMBOL_NAMED(group, sym_ident, sym_name) \
275 Z_EXPORT_SYMBOL_NAMED_IN_GROUP(group, sym_ident, sym_name)
276
291#define EXPORT_GROUP_SYMBOL(group, sym_ident) \
292 EXPORT_GROUP_SYMBOL_NAMED(group, sym_ident, sym_ident)
293
297
298#ifdef __cplusplus
299}
300#endif
301
302
303#endif /* ZEPHYR_LLEXT_SYMBOL_H */
#define BUILD_ASSERT(EXPR, MSG...)
Definition llvm.h:51
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:105
Group structure.
Definition grp.h:18
Constant symbols are unchangeable named memory addresses.
Definition symbol.h:43
const char *const name
Name of symbol.
Definition symbol.h:50
const void *const addr
Address of symbol.
Definition symbol.h:57
const uintptr_t slid
Symbol Link Identifier.
Definition symbol.h:53
Symbols are named memory addresses.
Definition symbol.h:68
const char * name
Name of symbol.
Definition symbol.h:70
void * addr
Address of symbol.
Definition symbol.h:73
A symbol table.
Definition symbol.h:82
size_t sym_cnt
Number of symbols in the table.
Definition symbol.h:84
struct llext_symbol * syms
Array of symbols.
Definition symbol.h:87
Macros to abstract toolchain specific capabilities.
Macro utilities.