Go to the documentation of this file.
63 #ifndef AUTOINIT_FUNCS_INCLUDED
64 #define AUTOINIT_FUNCS_INCLUDED 1
70 #define AUTOINIT_FUNCS_VERSION 0x01000200
72 #if defined(__GNUC__) || defined(__clang__)
74 #ifdef __has_attribute
75 #if ! __has_attribute (constructor) || ! __has_attribute (destructor)
76 #define _GNUC_ATTR_CONSTR_NOT_SUPPORTED 1
83 #if ((defined(__GNUC__) || defined(__clang__)) && \
84 ! defined(_GNUC_ATTR_CONSTR_NOT_SUPPORTED)) || \
85 (defined(__SUNPRO_C) && __SUNPRO_C + 0 >= 0x5100)
87 #define GNUC_SET_INIT_AND_DEINIT(FI,FD) \
88 void __attribute__ ((constructor)) _GNUC_init_helper_ ## FI (void) \
90 void __attribute__ ((destructor)) _GNUC_deinit_helper_ ## FD (void) \
92 struct _GNUC_dummy_str_ ## FI {int i;}
94 #define _SET_INIT_AND_DEINIT_FUNCS(FI,FD) GNUC_SET_INIT_AND_DEINIT (FI,FD)
95 #define _AUTOINIT_FUNCS_ARE_SUPPORTED 1
97 #elif defined (_MSC_FULL_VER) && _MSC_VER + 0 >= 1600
110 #define _INSTRMACRO(a) #a
111 #define _STRMACRO(a) _INSTRMACRO (a)
113 #if ! defined(_USRDLL) || defined(AUTOINIT_FUNCS_DECLARE_STATIC_REG)
120 #define W32_INITVARDECL extern "C"
122 #define W32_INITVARDECL extern
126 #if defined(_M_X64) || defined(_M_AMD64)
127 #define W32_VARDECORPREFIX
128 #define W32_DECORVARNAME(v) v
129 #define W32_VARDECORPEFIXSTR ""
130 #elif defined(_M_IX86) || defined(_X86_)
131 #define W32_VARDECORPREFIX _
132 #define W32_DECORVARNAME(v) _ ## v
133 #define W32_VARDECORPEFIXSTR "_"
135 #error Do not know how to decorate symbols for this architecture
139 #define W32_INITHELPERVARNAME(f) _initHelperDummy_ ## f
140 #define W32_INITHELPERVARNAMEDECORSTR(f) W32_VARDECORPEFIXSTR _STRMACRO ( \
141 W32_INITHELPERVARNAME (f))
149 #define W32_FPTR_IN_SEG(S,F) \
150 __pragma (section (S,long,read)) \
151 __pragma (comment (linker, "/INCLUDE:" W32_INITHELPERVARNAMEDECORSTR (F))) \
152 W32_INITVARDECL __declspec(allocate (S))int (__cdecl * W32_INITHELPERVARNAME ( \
156 #define W32_SEG_INIT_C_USER ".CRT$XCU"
157 #define W32_SEG_INIT_C_LIB ".CRT$XCL"
158 #define W32_SEG_INIT_CXX_USER ".CRT$XIU"
159 #define W32_SEG_INIT_CXX_LIB ".CRT$XIL"
167 #define W32_REG_INIT_C_USER(F) W32_FPTR_IN_SEG (W32_SEG_INIT_C_USER,F)
168 #define W32_REG_INIT_C_LIB(F) W32_FPTR_IN_SEG (W32_SEG_INIT_C_LIB,F)
169 #define W32_REG_INIT_CXX_USER(F) W32_FPTR_IN_SEG (W32_SEG_INIT_CXX_USER,F)
170 #define W32_REG_INIT_CXX_LIB(F) W32_FPTR_IN_SEG (W32_SEG_INIT_CXX_LIB,F)
180 #if ((defined(_LIB) && ! defined(_CONSOLE)) || defined(_USRDLL)) && \
181 ! defined(AUTOINIT_FUNCS_FORCE_USER_LVL_INIT)
182 #define W32_REGISTER_INIT(F) W32_REG_INIT_CXX_LIB (F)
184 #define W32_REGISTER_INIT(F) W32_REG_INIT_CXX_USER (F)
187 #if ((defined(_LIB) && ! defined(_CONSOLE)) || defined(_USRDLL)) && \
188 ! defined(AUTOINIT_FUNCS_FORCE_USER_LVL_INIT)
189 #define W32_REGISTER_INIT(F) W32_REG_INIT_C_LIB (F)
191 #define W32_REGISTER_INIT(F) W32_REG_INIT_C_USER (F)
197 #ifndef WIN32_LEAN_AND_MEAN
198 #define WIN32_LEAN_AND_MEAN 1
205 #if ! defined(_USRDLL) || defined(AUTOINIT_FUNCS_FORCE_STATIC_REG)
206 #define W32_SET_INIT_AND_DEINIT(FI,FD) \
207 void __cdecl _W32_deinit_helper_ ## FD (void) \
208 { (void) (FD) (); } \
209 int __cdecl _W32_init_helper_ ## FI (void) \
210 { (void) (FI) (); atexit (_W32_deinit_helper_ ## FD); return 0; } \
211 W32_REGISTER_INIT (_W32_init_helper_ ## FI)
216 #ifndef AUTOINIT_FUNCS_CALL_USR_DLLMAIN
217 #define W32_SET_INIT_AND_DEINIT(FI,FD) \
218 BOOL WINAPI DllMain (HINSTANCE hinst,DWORD reason,LPVOID unused) \
219 { if (DLL_PROCESS_ATTACH==reason) {(void) (FI) ();} \
220 else if (DLL_PROCESS_DETACH==reason) {(void) (FD) ();} \
222 } struct _W32_dummy_strc_ ## FI {int i;}
224 #define W32_SET_INIT_AND_DEINIT(FI,FD) \
225 BOOL WINAPI usr_DllMain (HINSTANCE hinst,DWORD reason,LPVOID unused); \
226 BOOL WINAPI DllMain (HINSTANCE hinst,DWORD reason,LPVOID unused) \
227 { if (DLL_PROCESS_ATTACH==reason) {(void) (FI) ();} \
228 else if (DLL_PROCESS_DETACH==reason) {(void) (FD) ();} \
229 return usr_DllMain (hinst,reason,unused); \
230 } struct _W32_dummy_strc_ ## FI {int i;}
234 #define _SET_INIT_AND_DEINIT_FUNCS(FI,FD) W32_SET_INIT_AND_DEINIT (FI,FD)
236 #define _AUTOINIT_FUNCS_ARE_SUPPORTED 1
242 #ifdef EMIT_ERROR_IF_AUTOINIT_FUNCS_ARE_NOT_SUPPORTED
244 Compiler/platform don not support automatic calls of user-defined initializer and deinitializer
248 #define _SET_INIT_AND_DEINIT_FUNCS(FI,FD)
250 #define _AUTOINIT_FUNCS_ARE_NOT_SUPPORTED 1