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#define Z_MARKUP_NOT_EXPORTED_SYMBOL(grp, sym_ident, sym_name) \
127 static const char Z_LLEXT_DISCARD_STRTAB __used \
128 __llext_sym_name_ ## sym_name[] = STRINGIFY(sym_name); \
129 static const char Z_LLEXT_DISCARD_STRTAB __used \
130 __llext_sym_group_ ## sym_name[] = STRINGIFY(grp); \
131 static const struct z_llext_discarded_const_symbol \
132 Z_GENERIC_SECTION(llext_discarded_exports_table) __used \
133 __llext_sym_discarded_ ## sym_name = { \
134 .name = __llext_sym_name_ ## sym_name, \
135 .group = __llext_sym_group_ ## sym_name, \
136 };
138
140#ifdef LL_EXTENSION_BUILD
141/* Extension build: add exported symbols to llext table */
142#define Z_LL_EXTENSION_SYMBOL_NAMED(sym_ident, sym_name) \
143 static const struct llext_const_symbol \
144 Z_GENERIC_SECTION(.exported_sym) __used \
145 __llext_sym_ ## sym_name = { \
146 .name = STRINGIFY(sym_name), .addr = (const void *)&sym_ident, \
147 }
148#else
149/* No-op when not building an extension */
150#define Z_LL_EXTENSION_SYMBOL_NAMED(sym_ident, sym_name)
151#endif
153
163#define LL_EXTENSION_SYMBOL_NAMED(sym_ident, sym_name) \
164 Z_LL_EXTENSION_SYMBOL_NAMED(sym_ident, sym_name)
165
177#define LL_EXTENSION_SYMBOL(x) Z_LL_EXTENSION_SYMBOL_NAMED(x, x)
178
180#if defined(LL_EXTENSION_BUILD)
181/* Extension build: EXPORT_SYMBOL maps to LL_EXTENSION_SYMBOL */
182#define Z_EXPORT_SYMBOL_NAMED(sym_ident, sym_name) \
183 Z_LL_EXTENSION_SYMBOL_NAMED(sym_ident, sym_name)
184#elif defined(CONFIG_LLEXT_EXPORT_BUILTINS_BY_SLID)
185/* SLID-enabled LLEXT application: export symbols, names in separate section */
186#define Z_EXPORT_SYMBOL_NAMED(sym_ident, sym_name) \
187 static const char Z_GENERIC_SECTION(llext_exports_strtab) __used \
188 __llext_sym_name_ ## sym_name[] = STRINGIFY(sym_name); \
189 static const STRUCT_SECTION_ITERABLE(llext_const_symbol, \
190 __llext_sym_ ## sym_name) = { \
191 .name = __llext_sym_name_ ## sym_name, \
192 .addr = (const void *)&sym_ident, \
193 }
194#elif defined(CONFIG_LLEXT)
195/* LLEXT application: export symbols */
196#define Z_EXPORT_SYMBOL_NAMED(sym_ident, sym_name) \
197 static const STRUCT_SECTION_ITERABLE(llext_const_symbol, \
198 __llext_sym_ ## sym_name) = { \
199 .name = STRINGIFY(sym_name), .addr = (const void *)&sym_ident, \
200 }
201#else
202/* No extension support in this build */
203#define Z_EXPORT_SYMBOL_NAMED(sym_ident, sym_name)
204#endif
206
207#if defined(LL_EXTENSION_BUILD)
208/* Extension build: No Kconfig conditionals */
209#define Z_EXPORT_SYMBOL_NAMED_IN_GROUP(group, sym_ident, sym_name) \
210 Z_EXPORT_SYMBOL_NAMED(sym_ident, sym_name)
211#else
212/* LLEXT application: Export if relevant group is enabled */
213#define Z_EXPORT_SYMBOL_NAMED_IN_GROUP(group, sym_ident, sym_name) \
214 COND_CODE_1(CONFIG_LLEXT_EXPORT_SYMBOL_GROUP_ ## group, \
215 (Z_EXPORT_SYMBOL_NAMED(sym_ident, sym_name)), \
216 (Z_MARKUP_NOT_EXPORTED_SYMBOL(group, sym_ident, sym_name)))
217#endif /* defined(LL_EXTENSION_BUILD) */
218
233#define EXPORT_SYMBOL_NAMED(sym_ident, sym_name) \
234 Z_EXPORT_SYMBOL_NAMED_IN_GROUP(UNASSIGNED, sym_ident, sym_name)
235
251#define EXPORT_SYMBOL(x) EXPORT_SYMBOL_NAMED(x, x)
252
268#define EXPORT_GROUP_SYMBOL_NAMED(group, sym_ident, sym_name) \
269 Z_EXPORT_SYMBOL_NAMED_IN_GROUP(group, sym_ident, sym_name)
270
285#define EXPORT_GROUP_SYMBOL(group, sym_ident) \
286 EXPORT_GROUP_SYMBOL_NAMED(group, sym_ident, sym_ident)
287
291
292#ifdef __cplusplus
293}
294#endif
295
296
297#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.