crt: Cleanup _scprintf/_vscprintf for non-msvcrtos builds For non-msvcrtos builds are global variables __MINGW_IMP_SYMBOL(_scprintf) __MINGW_IMP_SYMBOL(_vscprintf) not changing, they are constant. So define _scprintf and _vscprintf functions as direct alias to emu_scprintf and emu_vscprintf functions instead of via indirect unconditional jump or function call. This also simplifies _scprintf definition for non-msvcrtos builds as it reduces usage of inline assembly code. There is no change for msvcrtos build. Signed-off-by: LIU Hao <lh_mouse@126.com>
diff --git a/mingw-w64-crt/stdio/_scprintf.c b/mingw-w64-crt/stdio/_scprintf.c index bcee08a..42f2e5f 100644 --- a/mingw-w64-crt/stdio/_scprintf.c +++ b/mingw-w64-crt/stdio/_scprintf.c
@@ -22,17 +22,8 @@ #ifndef __LIBMSVCRT_OS__ -int (__cdecl *__MINGW_IMP_SYMBOL(_scprintf))(const char * __restrict__, ...) = emu_scprintf; - -/* gcc does not provide an easy way to call another variadic function with reusing current arguments - * this source file is used only on i386, so do this function redirect via inline i386 assembly */ -#define ASM_SYM(sym) __MINGW64_STRINGIFY(__MINGW_USYMBOL(sym)) -asm ( -".globl\t" ASM_SYM(_scprintf) "\n\t" -".def\t" ASM_SYM(_scprintf) ";\t.scl\t2;\t.type\t32;\t.endef\n" -ASM_SYM(_scprintf) ":\n\t" - "jmp\t*" ASM_SYM(__MINGW_IMP_SYMBOL(_scprintf)) -); +int __attribute__ ((alias ("emu_scprintf"))) __cdecl _scprintf (const char * __restrict__, ...); +int (__cdecl *__MINGW_IMP_SYMBOL(_scprintf))(const char * __restrict__, ...) = _scprintf; #else
diff --git a/mingw-w64-crt/stdio/_vscprintf.c b/mingw-w64-crt/stdio/_vscprintf.c index bb596b4..cc11473 100644 --- a/mingw-w64-crt/stdio/_vscprintf.c +++ b/mingw-w64-crt/stdio/_vscprintf.c
@@ -54,7 +54,8 @@ #ifndef __LIBMSVCRT_OS__ -int (__cdecl *__MINGW_IMP_SYMBOL(_vscprintf))(const char * __restrict__, va_list) = emu_vscprintf; +int __attribute__ ((alias ("emu_vscprintf"))) __cdecl _vscprintf (const char * __restrict__, va_list); +int (__cdecl *__MINGW_IMP_SYMBOL(_vscprintf))(const char * __restrict__, va_list) = _vscprintf; #else @@ -78,9 +79,9 @@ return (__MINGW_IMP_SYMBOL(_vscprintf) = func)(format, arglist); } -#endif - int __cdecl _vscprintf(const char * __restrict__ format, va_list arglist) { return __MINGW_IMP_SYMBOL(_vscprintf)(format, arglist); } + +#endif