3 * @author Lunaixsky (lunaxisky@qq.com)
4 * @brief Linker generated array definition
8 * @copyright Copyright (c) 2023
11 #ifndef __LUNAIX_LDGA_H
12 #define __LUNAIX_LDGA_H
14 #include <lunaix/types.h>
15 #include <lunaix/compiler.h>
17 #define ldga_el_id(ga_name, el_name) __lga_##ga_name##_##el_name
18 #define ldga_section(ga_name) __attribute__((section(".lga." ga_name)))
20 #define export_ldga_el(ga_name, el_name, type, val) \
21 type ldga_section(#ga_name) must_emit ldga_el_id(ga_name, el_name) = (type)(val)
23 #define export_ldga_el_sfx(ga_name, el_name, type, val, suffix) \
24 type ldga_section(#ga_name "." #suffix) must_emit ldga_el_id(ga_name, el_name) = \
27 #define export_ldga_el_idx(ga_name, i, type, val) \
28 export_ldga_el(ga_name, i, type, val)
29 #define export_ldga_el_anon(ga_name, type, val) \
30 export_ldga_el_idx(ga_name, __COUNTER__, type, val)
32 #define ldga_foreach(ga_name, el_type, index, el) \
33 extern el_type __lga_##ga_name##_start[], __lga_##ga_name##_end; \
34 for (index = 0, el = __lga_##ga_name##_start[index]; \
35 (ptr_t)&__lga_##ga_name##_start[index] < \
36 (ptr_t)&__lga_##ga_name##_end; \
37 el = __lga_##ga_name##_start[++index])
40 * @brief Invoke all elements in the array named `ga_name` of parameterless
44 #define ldga_invoke_fn0(ga_name) \
48 ldga_foreach(ga_name, ptr_t, i, fn0) \
50 ((void (*)())fn0)(); \
54 #endif /* __LUNAIX_LDGA_H */