6 #ifndef __RZ_CONSTRUCTOR_H__
7 #define __RZ_CONSTRUCTOR_H__
24 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
26 #define RZ_HAS_CONSTRUCTORS 1
28 #define RZ_DEFINE_CONSTRUCTOR(_func) static void __attribute__((constructor)) _func(void);
29 #define RZ_DEFINE_DESTRUCTOR(_func) static void __attribute__((destructor)) _func(void);
31 #elif defined(_MSC_VER) && (_MSC_VER >= 1500)
36 #define RZ_HAS_CONSTRUCTORS 1
52 #define RZ_MSVC_SYMBOL_PREFIX "_"
54 #define RZ_MSVC_SYMBOL_PREFIX ""
57 #define RZ_DEFINE_CONSTRUCTOR(_func) RZ_MSVC_CTOR(_func, RZ_MSVC_SYMBOL_PREFIX)
58 #define RZ_DEFINE_DESTRUCTOR(_func) RZ_MSVC_DTOR(_func, RZ_MSVC_SYMBOL_PREFIX)
60 #define RZ_MSVC_CTOR(_func, _sym_prefix) \
61 static void _func(void); \
62 extern int (*_array##_func)(void); \
63 int _func##_wrapper(void) { \
65 char *_func##_var = rz_str_new(""); \
69 __pragma(comment(linker, "/include:" _sym_prefix #_func "_wrapper")) \
70 __pragma(section(".CRT$XCU", read)) __declspec(allocate(".CRT$XCU")) int (*_array##_func)(void) = _func##_wrapper;
72 #define RZ_MSVC_DTOR(_func, _sym_prefix) \
73 static void _func(void); \
74 extern int (*_array##_func)(void); \
75 int _func##_constructor(void) { \
77 char *_func##_var = rz_str_new(""); \
81 __pragma(comment(linker, "/include:" _sym_prefix #_func "_constructor")) \
82 __pragma(section(".CRT$XCU", read)) __declspec(allocate(".CRT$XCU")) int (*_array##_func)(void) = _func##_constructor;
84 #elif defined(_MSC_VER)
86 #define RZ_HAS_CONSTRUCTORS 1
89 #define RZ_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1
90 #define RZ_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1
92 #define RZ_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \
93 section(".CRT$XCU", read)
94 #define RZ_DEFINE_CONSTRUCTOR(_func) \
95 static void _func(void); \
96 static int _func##_wrapper(void) { \
100 __declspec(allocate(".CRT$XCU")) static int (*p)(void) = _func##_wrapper;
102 #define RZ_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \
103 section(".CRT$XCU", read)
104 #define RZ_DEFINE_DESTRUCTOR(_func) \
105 static void _func(void); \
106 static int _func##_constructor(void) { \
110 __declspec(allocate(".CRT$XCU")) static int (*_array##_func)(void) = _func##_constructor;
112 #elif defined(__SUNPRO_C)
118 #define RZ_HAS_CONSTRUCTORS 1
120 #define RZ_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1
121 #define RZ_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1
123 #define RZ_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \
125 #define RZ_DEFINE_CONSTRUCTOR(_func) \
126 static void _func(void);
128 #define RZ_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \
130 #define RZ_DEFINE_DESTRUCTOR(_func) \
131 static void _func(void);