63#ifndef AUTOINIT_FUNCS_INCLUDED
64#define AUTOINIT_FUNCS_INCLUDED 1
70#define AUTOINIT_FUNCS_VERSION 0x01001000
72#if defined(__GNUC__) || defined(__clang__)
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