Go to the documentation of this file. 63 #ifndef AUTOINIT_FUNCS_INCLUDED 64 #define AUTOINIT_FUNCS_INCLUDED 1 70 #define AUTOINIT_FUNCS_VERSION 0x01001000 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); \ 89 void __attribute__ ((destructor)) _GNUC_deinit_helper_ ## FD (void); \ 90 void __attribute__ ((constructor)) _GNUC_init_helper_ ## FI (void) \ 92 void __attribute__ ((destructor)) _GNUC_deinit_helper_ ## FD (void) \ 94 struct _GNUC_dummy_str_ ## FI {int i;} 96 #define _SET_INIT_AND_DEINIT_FUNCS(FI,FD) GNUC_SET_INIT_AND_DEINIT (FI,FD) 97 #define _AUTOINIT_FUNCS_ARE_SUPPORTED 1 99 #elif defined(_MSC_FULL_VER) && _MSC_VER + 0 >= 1600 112 #define _INSTRMACRO(a) #a 113 #define _STRMACRO(a) _INSTRMACRO (a) 115 #if ! defined(_USRDLL) || defined(AUTOINIT_FUNCS_DECLARE_STATIC_REG) \ 116 || defined(AUTOINIT_FUNCS_FORCE_STATIC_REG) 120 #define W32_INITVARDECL extern "C" 122 #define W32_INITVARDECL extern 126 #if (defined(_WIN32) || defined(_WIN64)) \ 127 && ! defined(_M_IX86) && ! defined(_X86_) 128 #if ! defined(_M_X64) && ! defined(_M_AMD64) && ! defined(_x86_64_) \ 129 && ! defined(_M_ARM) && ! defined(_M_ARM64) 130 #pragma message(__FILE__ "(" _STRMACRO(__LINE__) ") : warning AIFW001 : " \ 131 "Untested architecture, linker may fail with unresolved symbol") 133 #define W32_VARDECORPREFIX 134 #define W32_DECORVARNAME(v) v 135 #define W32_VARDECORPREFIXSTR "" 136 #elif defined(_WIN32) && (defined(_M_IX86) || defined(_X86_)) 137 #define W32_VARDECORPREFIX _ 138 #define W32_DECORVARNAME(v) _ ## v 139 #define W32_VARDECORPREFIXSTR "_" 141 #error Do not know how to decorate symbols for this architecture 145 #define W32_INITHELPERVARNAME(f) _initHelperDummy_ ## f 146 #define W32_INITHELPERVARNAMEDECORSTR(f) \ 147 W32_VARDECORPREFIXSTR _STRMACRO (W32_INITHELPERVARNAME (f)) 154 #define W32_VFPTR_IN_SEG(S,F) \ 155 __pragma (section (S,long,read)) \ 156 __pragma (comment (linker, "/INCLUDE:" W32_INITHELPERVARNAMEDECORSTR (F))) \ 157 W32_INITVARDECL __declspec(allocate (S))void \ 158 (__cdecl * W32_INITHELPERVARNAME (F))(void) = &F 164 #define W32_SEG_INIT_EARLY ".CRT$XCT" 167 #define W32_SEG_INIT_LATE ".CRT$XCV" 172 #define W32_SEG_INIT_CXX_LIB ".CRT$XCL" 174 #define W32_SEG_INIT_CXX_USER ".CRT$XCU" 183 #define W32_IFPTR_IN_SEG(S,F) \ 184 __pragma (section (S,long,read)) \ 185 __pragma (comment (linker, "/INCLUDE:" W32_INITHELPERVARNAMEDECORSTR (F))) \ 186 W32_INITVARDECL __declspec(allocate (S))int \ 187 (__cdecl * W32_INITHELPERVARNAME (F))(void) = &F 194 #define W32_SEG_INIT_C_LIB ".CRT$XIL" 197 #define W32_SEG_INIT_C_USER ".CRT$XIU" 204 #define W32_REG_INIT_EARLY(F) W32_VFPTR_IN_SEG (W32_SEG_INIT_EARLY,F) 205 #define W32_REG_INIT_LATE(F) W32_VFPTR_IN_SEG (W32_SEG_INIT_LATE,F) 211 #define W32_REG_INIT_C_USER(F) W32_FPTR_IN_SEG (W32_SEG_INIT_C_USER,F) 212 #define W32_REG_INIT_C_LIB(F) W32_FPTR_IN_SEG (W32_SEG_INIT_C_LIB,F) 213 #define W32_REG_INIT_CXX_USER(F) W32_FPTR_IN_SEG (W32_SEG_INIT_CXX_USER,F) 214 #define W32_REG_INIT_CXX_LIB(F) W32_FPTR_IN_SEG (W32_SEG_INIT_CXX_LIB,F) 228 #if (! defined(__cplusplus) || \ 229 ((defined(_LIB) && ! defined(_CONSOLE)) || defined(_USRDLL)) || \ 230 defined(AUTOINIT_FUNCS_FORCE_EARLY_INIT)) && \ 231 ! defined(AUTOINIT_FUNCS_FORCE_LATE_INIT) 232 #define W32_REGISTER_INIT(F) W32_REG_INIT_EARLY(F) 234 #define W32_REGISTER_INIT(F) W32_REG_INIT_LATE(F) 241 #if ! defined(_USRDLL) || defined(AUTOINIT_FUNCS_FORCE_STATIC_REG) 245 #define W32_SET_INIT_AND_DEINIT(FI,FD) \ 246 void __cdecl _W32_init_helper_ ## FI (void); \ 247 void __cdecl _W32_deinit_helper_ ## FD (void); \ 248 void __cdecl _W32_init_helper_ ## FI (void) \ 249 { (void) (FI) (); atexit (_W32_deinit_helper_ ## FD); } \ 250 void __cdecl _W32_deinit_helper_ ## FD (void) \ 251 { (void) (FD) (); } \ 252 W32_REGISTER_INIT (_W32_init_helper_ ## FI) 255 #ifndef WIN32_LEAN_AND_MEAN 256 #define WIN32_LEAN_AND_MEAN 1 263 #ifndef AUTOINIT_FUNCS_CALL_USR_DLLMAIN 264 #define W32_SET_INIT_AND_DEINIT(FI,FD) \ 265 BOOL WINAPI DllMain (HINSTANCE hinst,DWORD reason,LPVOID unused); \ 266 BOOL WINAPI DllMain (HINSTANCE hinst,DWORD reason,LPVOID unused) \ 267 { (void) hinst; (void) unused; \ 268 if (DLL_PROCESS_ATTACH==reason) {(void) (FI) ();} \ 269 else if (DLL_PROCESS_DETACH==reason) {(void) (FD) ();} \ 271 } struct _W32_dummy_strc_ ## FI {int i;} 273 #define W32_SET_INIT_AND_DEINIT(FI,FD) \ 274 BOOL WINAPI usr_DllMain (HINSTANCE hinst,DWORD reason,LPVOID unused); \ 275 BOOL WINAPI DllMain (HINSTANCE hinst,DWORD reason,LPVOID unused); \ 276 BOOL WINAPI DllMain (HINSTANCE hinst,DWORD reason,LPVOID unused) \ 277 { if (DLL_PROCESS_ATTACH==reason) {(void) (FI) ();} \ 278 else if (DLL_PROCESS_DETACH==reason) {(void) (FD) ();} \ 279 return usr_DllMain (hinst,reason,unused); \ 280 } struct _W32_dummy_strc_ ## FI {int i;} 284 #define _SET_INIT_AND_DEINIT_FUNCS(FI,FD) W32_SET_INIT_AND_DEINIT (FI,FD) 286 #define _AUTOINIT_FUNCS_ARE_SUPPORTED 1 292 #ifdef EMIT_ERROR_IF_AUTOINIT_FUNCS_ARE_NOT_SUPPORTED 294 Compiler/platform does not support automatic calls of user-defined initializer and deinitializer 298 #define _SET_INIT_AND_DEINIT_FUNCS(FI,FD) 300 #define _AUTOINIT_FUNCS_ARE_NOT_SUPPORTED 1