This allows to remove the whole pre_c_init() and pre_cpp_init() functions
and registration of __mingw_pcinit and __mingw_pcppinit hooks.

Inlining the code allows to easily figure out in which order is
initialization code called.

Also merge code which is protected by __native_startup_lock into one
if-branch for better code readability.

Function pre_c_init() was the first callback in .CRT$XI section, so now
call its code before the _initterm_e(__xi_a, __xi_z) (which executes all
remaining .CRT$XI callbacks).

Function pre_cpp_init() was the first callback in .CRT$XC section, so now
call its code before the _initterm (__xc_a, __xc_z) (which executes all
remaining .CRT$XC callbacks).
---
 mingw-w64-crt/crt/crtexe.c | 98 +++++++++++++++-----------------------
 1 file changed, 38 insertions(+), 60 deletions(-)

diff --git a/mingw-w64-crt/crt/crtexe.c b/mingw-w64-crt/crt/crtexe.c
index 6da7e23fba92..620f08b9467d 100644
--- a/mingw-w64-crt/crt/crtexe.c
+++ b/mingw-w64-crt/crt/crtexe.c
@@ -60,11 +60,6 @@ extern void _pei386_runtime_relocator (void);
 long CALLBACK _gnu_exception_handler (EXCEPTION_POINTERS * exception_data);
 static void duplicate_ppstrings (int ac, _TCHAR ***av);
 
-static int __cdecl pre_c_init (void);
-static void __cdecl pre_cpp_init (void);
-_CRTALLOC(".CRT$XIAA") _PIFV __mingw_pcinit = pre_c_init;
-_CRTALLOC(".CRT$XCAA") _PVFV __mingw_pcppinit = pre_cpp_init;
-
 extern int _MINGW_INSTALL_DEBUG_MATHERR;
 
 #ifdef __MINGW_SHOW_INVALID_PARAMETER_EXCEPTION
@@ -85,55 +80,6 @@ __mingw_invalidParameterHandler (const wchar_t * 
__UNUSED_PARAM_1(expression),
 #endif
 }
 
-static int __cdecl
-pre_c_init (void)
-{
-  int ret;
-  managedapp = check_managed_app ();
-  if (__mingw_app_type)
-    __set_app_type(_GUI_APP);
-  else
-    __set_app_type (_CONSOLE_APP);
-
-  * __p__fmode() = _fmode;
-  * __p__commode() = _commode;
-
-#ifdef _UNICODE
-  ret = _wsetargv();
-#else
-  ret = _setargv();
-#endif
-  if (ret < 0)
-    _amsg_exit(8); /* _RT_SPACEARG */
-  if (_MINGW_INSTALL_DEBUG_MATHERR == 1)
-    {
-      __setusermatherr (_matherr);
-    }
-
-  if (__globallocalestatus == -1)
-    {
-      _configthreadlocale(-1);
-    }
-  return 0;
-}
-
-static void __cdecl
-pre_cpp_init (void)
-{
-  _startupinfo startinfo;
-  int argret;
-
-  startinfo.newmode = _newmode;
-
-#ifdef _UNICODE
-  argret = __wgetmainargs(&argc,&argv,&envp,_dowildcard,&startinfo);
-#else
-  argret = __getmainargs(&argc,&argv,&envp,_dowildcard,&startinfo);
-#endif
-  if (argret < 0)
-    _amsg_exit(8); /* _RT_SPACEARG */
-}
-
 static int __tmainCRTStartup (void);
 
 int WinMainCRTStartup (void);
@@ -206,6 +152,8 @@ __tmainCRTStartup (void)
     void *lock_free = NULL;
     void *fiberid = ((PNT_TIB)NtCurrentTeb())->StackBase;
     BOOL nested = FALSE;
+    _startupinfo startinfo;
+    int ret = 0;
     while((lock_free = InterlockedCompareExchangePointer 
(&__native_startup_lock,
                                                          fiberid, NULL)) != 0)
       {
@@ -223,18 +171,48 @@ __tmainCRTStartup (void)
     else if (__native_startup_state == __uninitialized)
       {
        __native_startup_state = __initializing;
+
+       managedapp = check_managed_app ();
+       if (__mingw_app_type)
+         __set_app_type (_GUI_APP);
+       else
+         __set_app_type (_CONSOLE_APP);
+
+       *__p__fmode () = _fmode;
+       *__p__commode () = _commode;
+
+#ifdef _UNICODE
+       ret = _wsetargv ();
+#else
+       ret = _setargv ();
+#endif
+       if (ret < 0)
+         _amsg_exit (8); /* _RT_SPACEARG */
+
+       if (_MINGW_INSTALL_DEBUG_MATHERR == 1)
+         __setusermatherr (_matherr);
+
+       if (__globallocalestatus == -1)
+         _configthreadlocale (-1);
+
        if (_initterm_e (__xi_a, __xi_z) != 0)
          return 255;
-      }
-    else
-      has_cctor = 1;
 
-    if (__native_startup_state == __initializing)
-      {
+       startinfo.newmode = _newmode;
+#ifdef _UNICODE
+       ret = __wgetmainargs (&argc, &argv, &envp, _dowildcard, &startinfo);
+#else
+       ret = __getmainargs (&argc, &argv, &envp, _dowildcard, &startinfo);
+#endif
+       if (ret < 0)
+         _amsg_exit (8); /* _RT_SPACEARG */
+
        _initterm (__xc_a, __xc_z);
+
        __native_startup_state = __initialized;
       }
-    _ASSERTE(__native_startup_state == __initialized);
+    else
+      has_cctor = 1;
     if (! nested)
       (VOID)InterlockedExchangePointer (&__native_startup_lock, NULL);
     
-- 
2.20.1



_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to