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

Reply via email to