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>
16 #define ldga_el_id(ga_name, el_name) __lga_##ga_name##_##el_name
17 #define ldga_section(ga_name) __attribute__((section(".lga." ga_name)))
19 #define export_ldga_el(ga_name, el_name, type, val) \
20 type ldga_section(#ga_name) ldga_el_id(ga_name, el_name) = (type)(val)
22 #define export_ldga_el_sfx(ga_name, el_name, type, val, suffix) \
23 type ldga_section(#ga_name "." #suffix) ldga_el_id(ga_name, el_name) = \
26 #define export_ldga_el_idx(ga_name, i, type, val) \
27 export_ldga_el(ga_name, i, type, val)
28 #define export_ldga_el_anon(ga_name, type, val) \
29 export_ldga_el_idx(ga_name, __COUNTER__, type, val)
31 #define ldga_foreach(ga_name, el_type, index, el) \
32 extern el_type __lga_##ga_name##_start[], __lga_##ga_name##_end; \
33 for (index = 0, el = __lga_##ga_name##_start[index]; \
34 (ptr_t)&__lga_##ga_name##_start[index] < \
35 (ptr_t)&__lga_##ga_name##_end; \
36 el = __lga_##ga_name##_start[++index])
39 * @brief Invoke all elements in the array named `ga_name` of parameterless
43 #define ldga_invoke_fn0(ga_name) \
47 ldga_foreach(ga_name, ptr_t, i, fn0) \
49 ((void (*)())fn0)(); \
53 #endif /* __LUNAIX_LDGA_H */