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