feat: device subsystem rework
[lunaix-os.git] / lunaix-os / includes / lunaix / ds / ldga.h
1 /**
2  * @file ldga.h
3  * @author Lunaixsky (lunaxisky@qq.com)
4  * @brief Linker generated array definition
5  * @version 0.1
6  * @date 2023-08-18
7  *
8  * @copyright Copyright (c) 2023
9  *
10  */
11 #ifndef __LUNAIX_LDGA_H
12 #define __LUNAIX_LDGA_H
13
14 #include <lunaix/types.h>
15
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)))
18
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)
21
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) =     \
24       (type)(val)
25
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)
30
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])
37
38 /**
39  * @brief Invoke all elements in the array named `ga_name` of parameterless
40  * function pointers
41  *
42  */
43 #define ldga_invoke_fn0(ga_name)                                               \
44     ({                                                                         \
45         int i = 0;                                                             \
46         ptr_t fn0;                                                             \
47         ldga_foreach(ga_name, ptr_t, i, fn0)                                   \
48         {                                                                      \
49             ((void (*)())fn0)();                                               \
50         }                                                                      \
51     })
52
53 #endif /* __LUNAIX_LDGA_H */