Go to the documentation of this file.
63 #ifndef AUTOINIT_FUNCS_INCLUDED
64 #define AUTOINIT_FUNCS_INCLUDED 1
70 #define AUTOINIT_FUNCS_VERSION 0x01000100
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(_GNUC_ATTR_CONSTR_NOT_SUPPORTED)) || \
84 (defined(__SUNPRO_C) && __SUNPRO_C+0 >= 0x5100)
86 #define GNUC_SET_INIT_AND_DEINIT(FI,FD) \
87 void __attribute__ ((constructor)) _GNUC_init_helper_##FI(void) \
89 void __attribute__ ((destructor)) _GNUC_deinit_helper_##FD(void) \
91 struct _GNUC_dummy_str_##FI{int i;}
93 #define _SET_INIT_AND_DEINIT_FUNCS(FI,FD) GNUC_SET_INIT_AND_DEINIT(FI,FD)
94 #define _AUTOINIT_FUNCS_ARE_SUPPORTED 1
96 #elif defined (_MSC_FULL_VER) && _MSC_VER+0 >= 1600
109 #define _INSTRMACRO(a) #a
110 #define _STRMACRO(a) _INSTRMACRO(a)
112 #if !defined(_USRDLL) || defined(AUTOINIT_FUNCS_DECLARE_STATIC_REG)
119 #define W32_INITVARDECL extern "C"
121 #define W32_INITVARDECL extern
125 #if defined(_M_X64) || defined(_M_AMD64)
126 #define W32_VARDECORPREFIX
127 #define W32_DECORVARNAME(v) v
128 #define W32_VARDECORPEFIXSTR ""
129 #elif defined(_M_IX86) || defined(_X86_)
130 #define W32_VARDECORPREFIX _
131 #define W32_DECORVARNAME(v) _##v
132 #define W32_VARDECORPEFIXSTR "_"
134 #error Do not know how to decorate symbols for this architecture
138 #define W32_INITHELPERVARNAME(f) _initHelperDummy_##f
139 #define W32_INITHELPERVARNAMEDECORSTR(f) W32_VARDECORPEFIXSTR _STRMACRO(W32_INITHELPERVARNAME(f))
147 #define W32_FPTR_IN_SEG(S,F) \
148 __pragma(section(S,long,read)) \
149 __pragma(comment(linker, "/INCLUDE:" W32_INITHELPERVARNAMEDECORSTR(F))) \
150 W32_INITVARDECL __declspec(allocate(S)) int(__cdecl *W32_INITHELPERVARNAME(F))(void) = &F
153 #define W32_SEG_INIT_C_USER ".CRT$XCU"
154 #define W32_SEG_INIT_C_LIB ".CRT$XCL"
155 #define W32_SEG_INIT_CXX_USER ".CRT$XIU"
156 #define W32_SEG_INIT_CXX_LIB ".CRT$XIL"
164 #define W32_REG_INIT_C_USER(F) W32_FPTR_IN_SEG(W32_SEG_INIT_C_USER,F)
165 #define W32_REG_INIT_C_LIB(F) W32_FPTR_IN_SEG(W32_SEG_INIT_C_LIB,F)
166 #define W32_REG_INIT_CXX_USER(F) W32_FPTR_IN_SEG(W32_SEG_INIT_CXX_USER,F)
167 #define W32_REG_INIT_CXX_LIB(F) W32_FPTR_IN_SEG(W32_SEG_INIT_CXX_LIB,F)
177 #if ((defined(_LIB) && !defined(_CONSOLE)) || defined(_USRDLL)) && !defined(AUTOINIT_FUNCS_FORCE_USER_LVL_INIT)
178 #define W32_REGISTER_INIT(F) W32_REG_INIT_CXX_LIB(F)
180 #define W32_REGISTER_INIT(F) W32_REG_INIT_CXX_USER(F)
183 #if ((defined(_LIB) && !defined(_CONSOLE)) || defined(_USRDLL)) && !defined(AUTOINIT_FUNCS_FORCE_USER_LVL_INIT)
184 #define W32_REGISTER_INIT(F) W32_REG_INIT_C_LIB(F)
186 #define W32_REGISTER_INIT(F) W32_REG_INIT_C_USER(F)
192 #ifndef WIN32_LEAN_AND_MEAN
193 #define WIN32_LEAN_AND_MEAN 1
200 #if !defined(_USRDLL) || defined(AUTOINIT_FUNCS_FORCE_STATIC_REG)
201 #define W32_SET_INIT_AND_DEINIT(FI,FD) \
202 void __cdecl _W32_deinit_helper_##FD(void) \
204 int __cdecl _W32_init_helper_##FI(void) \
205 { (void)(FI)(); atexit(_W32_deinit_helper_##FD); return 0; } \
206 W32_REGISTER_INIT(_W32_init_helper_##FI)
211 #ifndef AUTOINIT_FUNCS_CALL_USR_DLLMAIN
212 #define W32_SET_INIT_AND_DEINIT(FI,FD) \
213 BOOL WINAPI DllMain(HINSTANCE hinst,DWORD reason,LPVOID unused) \
214 { if(DLL_PROCESS_ATTACH==reason) {(void)(FI)();} \
215 else if(DLL_PROCESS_DETACH==reason) {(void)(FD)();} \
217 } struct _W32_dummy_strc_##FI{int i;}
219 #define W32_SET_INIT_AND_DEINIT(FI,FD) \
220 BOOL WINAPI usr_DllMain(HINSTANCE hinst,DWORD reason,LPVOID unused); \
221 BOOL WINAPI DllMain(HINSTANCE hinst,DWORD reason,LPVOID unused) \
222 { if(DLL_PROCESS_ATTACH==reason) {(void)(FI)();} \
223 else if(DLL_PROCESS_DETACH==reason) {(void)(FD)();} \
224 return usr_DllMain(hinst,reason,unused); \
225 } struct _W32_dummy_strc_##FI{int i;}
229 #define _SET_INIT_AND_DEINIT_FUNCS(FI,FD) W32_SET_INIT_AND_DEINIT(FI,FD)
231 #define _AUTOINIT_FUNCS_ARE_SUPPORTED 1
237 #ifdef EMIT_ERROR_IF_AUTOINIT_FUNCS_ARE_NOT_SUPPORTED
238 #error Compiler/platform don not support automatic calls of user-defined initializer and deinitializer
242 #define _SET_INIT_AND_DEINIT_FUNCS(FI,FD)
244 #define _AUTOINIT_FUNCS_ARE_NOT_SUPPORTED 1