Redirect (v)snprintf() call with n==0 arg directly to _(v)scprintf() call at compile time. With this change gcc can optimize out __ms_(v)snprintf() call even when MinGW-w64 runtime was not compiled with LTO. --- mingw-w64-headers/crt/stdio.h | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/mingw-w64-headers/crt/stdio.h b/mingw-w64-headers/crt/stdio.h index 4c67973b47cd..d96f5c96fc65 100644 --- a/mingw-w64-headers/crt/stdio.h +++ b/mingw-w64-headers/crt/stdio.h @@ -745,6 +745,8 @@ int vsnprintf (char *__stream, size_t __n, const char *__format, __builtin_va_li _CRTIMP int __cdecl _scprintf(const char * __restrict__ _Format,...); _CRTIMP int __cdecl _snscanf(const char * __restrict__ _Src,size_t _MaxCount,const char * __restrict__ _Format,...) __MINGW_ATTRIB_DEPRECATED_SEC_WARN; #endif + __MINGW_ATTRIB_PURE + _CRTIMP int __cdecl _vscprintf(const char * __restrict__ _Format,va_list _ArgList); FILE *__cdecl tmpfile(void) __MINGW_ATTRIB_DEPRECATED_SEC_WARN; char *__cdecl tmpnam(char *_Buffer); int __cdecl ungetc(int _Ch,FILE *_File); @@ -846,6 +848,8 @@ char * tmpnam(char * __dst) #if __MINGW_FORTIFY_LEVEL > 0 __mingw_bos_ptr_chk_warn(__stream, __n, 1); #endif + if (__builtin_constant_p(__n) && __n == 0) + return _vscprintf(__format, __local_argv); return __ms_vsnprintf (__stream, __n, __format, __local_argv); } @@ -860,6 +864,8 @@ __attribute__((__format__ (ms_printf, 3, 4))) __MINGW_ATTRIB_NONNULL(3) int snprintf (char * __restrict__ __stream, size_t __n, const char * __restrict__ __format, ...) { __mingw_bos_ptr_chk_warn(__stream, __n, 1); + if (__builtin_constant_p(__n) && __n == 0) + return _scprintf(__format, __builtin_va_arg_pack()); return __ms_snprintf(__stream, __n, __format, __builtin_va_arg_pack()); } @@ -871,7 +877,10 @@ int snprintf (char * __restrict__ __stream, size_t __n, const char * __restrict_ { int __retval; __builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format ); - __retval = __ms_vsnprintf (__stream, __n, __format, __local_argv); + if (__builtin_constant_p(__n) && __n == 0) + __retval = _vscprintf(__format, __local_argv); + else + __retval = __ms_vsnprintf (__stream, __n, __format, __local_argv); __builtin_va_end( __local_argv ); return __retval; } @@ -923,9 +932,6 @@ int vsprintf (char * __restrict__ __stream, const char * __restrict__ __format, #endif /* _UCRT */ #endif /* __USE_MINGW_ANSI_STDIO */ - __MINGW_ATTRIB_PURE - _CRTIMP int __cdecl _vscprintf(const char * __restrict__ _Format,va_list _ArgList); - _CRTIMP int __cdecl _set_printf_count_output(int _Value); _CRTIMP int __cdecl _get_printf_count_output(void); -- 2.20.1 _______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public