AFAICS most of the *printf() and *scanf() inline wrappers are not (or no longer) needed. Prototypes with __asm__() could be used instead.

This patch removes a subset of these functions. As a side effect, It also fixes a regression introduced by my _FORTIFY_SOURCE patch.

From 12c43914d2d0086bc182e5ac23485157cd85912f Mon Sep 17 00:00:00 2001
From: Christian Franke <[email protected]>
Date: Tue, 10 Sep 2019 23:23:31 +0200
Subject: [PATCH] headers: Remove __USE_MINGW_ANSI_STDIO *printf() inline
 functions.

Redirect *printf() to __mingw_*printf() functions via __asm__() prototypes.
Declare _FORTIFY_SOURCE inline functions as 'extern'.
This also fixes a '__builtin_va_arg_pack()' compile error which occurred
if function address is used.

Signed-off-by: Christian Franke <[email protected]>
---
 mingw-w64-headers/crt/_mingw_mac.h |   8 +-
 mingw-w64-headers/crt/stdio.h      | 147 +++++++++++------------------
 2 files changed, 63 insertions(+), 92 deletions(-)

diff --git a/mingw-w64-headers/crt/_mingw_mac.h 
b/mingw-w64-headers/crt/_mingw_mac.h
index 404d109a..85c17dda 100644
--- a/mingw-w64-headers/crt/_mingw_mac.h
+++ b/mingw-w64-headers/crt/_mingw_mac.h
@@ -297,7 +297,7 @@
 #if __MINGW_GNUC_PREREQ(4, 3) && !defined(__clang__)
 #  define __mingw_attribute_artificial \
      __attribute__((__artificial__))
-#  define __mingw_va_arg_pack_ovr __mingw_ovr \
+#  define __mingw_va_arg_pack_ovr extern __inline__ __cdecl \
      __attribute__((__always_inline__,  __gnu_inline__)) \
      __mingw_attribute_artificial
 #else
@@ -354,6 +354,12 @@
 #  define __mingw_bos_ovr __mingw_ovr
 #endif /* __MINGW_FORTIFY_LEVEL > 0 */
 
+#if __MINGW_FORTIFY_LEVEL > 0 && defined(__mingw_va_arg_pack_ovr)
+#  define __MINGW_FORTIFY_VA_ARG 1
+#else
+#  define __MINGW_FORTIFY_VA_ARG 0
+#endif
+
 /* Enable workaround for ABI incompatibility on affected platforms */
 #ifndef WIDL_EXPLICIT_AGGREGATE_RETURNS
 #if defined(__GNUC__) && defined(__cplusplus) && (defined(__x86_64__) || 
defined(__i386__))
diff --git a/mingw-w64-headers/crt/stdio.h b/mingw-w64-headers/crt/stdio.h
index 75fb4f2d..018cdbb2 100644
--- a/mingw-w64-headers/crt/stdio.h
+++ b/mingw-w64-headers/crt/stdio.h
@@ -330,139 +330,108 @@ int vfscanf (FILE *__stream,  const char *__format, 
__builtin_va_list __local_ar
 #endif
 #endif /* __NO_ISOCEXT */
 
+#ifdef __cplusplus
+} /* extern "C++" */
+#endif
 
-
-__mingw_ovr
 __attribute__((__format__ (gnu_printf, 2, 3))) __MINGW_ATTRIB_NONNULL(2)
-int fprintf (FILE *__stream, const char *__format, ...)
-{
-  int __retval;
-  __builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format );
-  __retval = __mingw_vfprintf( __stream, __format, __local_argv );
-  __builtin_va_end( __local_argv );
-  return __retval;
-}
+int __cdecl fprintf (FILE * __restrict__, const char * __restrict__, ...)
+  __MINGW_ASM_CALL(__mingw_fprintf) __MINGW_NOTHROW;
 
-__mingw_ovr
 __attribute__((__format__ (gnu_printf, 1, 2))) __MINGW_ATTRIB_NONNULL(1)
-int printf (const char *__format, ...)
-{
-  int __retval;
-  __builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format );
-  __retval = __mingw_vfprintf( stdout, __format, __local_argv );
-  __builtin_va_end( __local_argv );
-  return __retval;
-}
+int __cdecl printf (const char * __restrict__, ... )
+  __MINGW_ASM_CALL(__mingw_printf) __MINGW_NOTHROW;
 
-#ifdef __mingw_va_arg_pack_ovr
+__attribute__((__format__ (gnu_printf, 2, 3))) __MINGW_ATTRIB_NONNULL(2)
+int __cdecl sprintf (char * __restrict__, const char * __restrict__, ...)
+  __MINGW_ASM_CALL(__mingw_sprintf) __MINGW_NOTHROW;
+
+#if __MINGW_FORTIFY_VA_ARG
 
 __mingw_va_arg_pack_ovr
 __attribute__((__format__ (gnu_printf, 2, 3))) __MINGW_ATTRIB_NONNULL(2)
-int sprintf (char *__stream, const char *__format, ...)
+int sprintf (char * __restrict__ __stream, const char * __restrict__ __format, 
...)
 {
-#if __MINGW_FORTIFY_LEVEL > 0
   if (__mingw_bos_known(__stream)) {
     int __retval = __mingw_snprintf( __stream, __mingw_bos(__stream), 
__format, __builtin_va_arg_pack() );
     if (__retval >= 0)
       __mingw_bos_ptr_chk(__stream, (size_t)__retval + 1);
     return __retval;
   }
-#endif
   return __mingw_sprintf( __stream, __format, __builtin_va_arg_pack() );
 }
 
-#else /* !__mingw_va_arg_pack_ovr */
+#endif /* __MINGW_FORTIFY_VA_ARG */
 
-__mingw_ovr
-__attribute__((__format__ (gnu_printf, 2, 3))) __MINGW_ATTRIB_NONNULL(2)
-int sprintf (char *__stream, const char *__format, ...)
-{
-  int __retval;
-  __builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format );
-  __retval = __mingw_vsprintf( __stream, __format, __local_argv );
-  __builtin_va_end( __local_argv );
-  return __retval;
-}
+__attribute__((__format__ (gnu_printf, 2, 0))) __MINGW_ATTRIB_NONNULL(2)
+int __cdecl vfprintf (FILE * __restrict__, const char * __restrict__, va_list)
+  __MINGW_ASM_CALL(__mingw_vfprintf) __MINGW_NOTHROW;
 
-#endif /* __mingw_va_arg_pack_ovr */
+__attribute__((__format__ (gnu_printf, 2, 0))) __MINGW_ATTRIB_NONNULL(2)
+int __cdecl vprintf (FILE * __restrict__, const char * __restrict__, va_list)
+  __MINGW_ASM_CALL(__mingw_vprintf) __MINGW_NOTHROW;
 
-__mingw_ovr
 __attribute__((__format__ (gnu_printf, 2, 0))) __MINGW_ATTRIB_NONNULL(2)
-int vfprintf (FILE *__stream, const char *__format, __builtin_va_list 
__local_argv)
-{
-  return __mingw_vfprintf( __stream, __format, __local_argv );
-}
+int __cdecl vsprintf (char * __restrict__, const char * __restrict__, va_list)
+  __MINGW_ASM_CALL(__mingw_vsprintf) __MINGW_NOTHROW;
 
-__mingw_ovr
-__attribute__((__format__ (gnu_printf, 1, 0))) __MINGW_ATTRIB_NONNULL(1)
-int vprintf (const char *__format, __builtin_va_list __local_argv)
-{
-  return __mingw_vfprintf( stdout, __format, __local_argv );
-}
+#if __MINGW_FORTIFY_LEVEL > 0
 
-__mingw_bos_ovr
+__mingw_bos_extern_ovr
 __attribute__((__format__ (gnu_printf, 2, 0))) __MINGW_ATTRIB_NONNULL(2)
 int vsprintf (char *__stream, const char *__format, __builtin_va_list 
__local_argv)
 {
-#if __MINGW_FORTIFY_LEVEL > 0
   if (__mingw_bos_known(__stream)) {
     int __retval = __mingw_vsnprintf( __stream, __mingw_bos(__stream), 
__format, __local_argv );
     if (__retval >= 0)
       __mingw_bos_ptr_chk(__stream, (size_t)__retval + 1);
     return __retval;
   }
-#endif
   return __mingw_vsprintf( __stream, __format, __local_argv );
 }
+
+#endif /* __MINGW_FORTIFY_LEVEL > 0 */
+
 /* #ifndef __NO_ISOCEXT */  /* externs in libmingwex.a */
 
-#ifdef __mingw_va_arg_pack_ovr
+__attribute__((__format__ (gnu_printf, 3, 4))) __MINGW_ATTRIB_NONNULL(3)
+int __cdecl snprintf(char * __restrict__, size_t, const char * __restrict__, 
...)
+  __MINGW_ASM_CALL(__mingw_snprintf);
+
+#if __MINGW_FORTIFY_VA_ARG
 
 __mingw_va_arg_pack_ovr
 __attribute__((__format__ (gnu_printf, 3, 4))) __MINGW_ATTRIB_NONNULL(3)
-int snprintf (char *__stream, size_t __n, const char *__format, ...)
+int snprintf (char *  __restrict__ __stream, size_t __n, const char * 
__restrict__ __format, ...)
 {
-#if __MINGW_FORTIFY_LEVEL > 0
   __mingw_bos_ptr_chk_warn(__stream, __n);
-#endif
   return __mingw_snprintf( __stream, __n, __format, __builtin_va_arg_pack() );
 }
 
-#else /* !__mingw_va_arg_pack_ovr */
+#endif /* __MINGW_FORTIFY_VA_ARG */
 
-__mingw_ovr
-__attribute__((__format__ (gnu_printf, 3, 4))) __MINGW_ATTRIB_NONNULL(3)
-int snprintf (char *__stream, size_t __n, const char *__format, ...)
-{
-  int __retval;
-  __builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format );
-  __retval = __mingw_vsnprintf( __stream, __n, __format, __local_argv );
-  __builtin_va_end( __local_argv );
-  return __retval;
-}
+__attribute__((__format__ (gnu_printf, 3, 0))) __MINGW_ATTRIB_NONNULL(3)
+int __cdecl vsnprintf(char * __restrict__, size_t, const char * __restrict__, 
va_list)
+  __MINGW_ASM_CALL(__mingw_vsnprintf);
 
-#endif /* __mingw_va_arg_pack_ovr */
+#if __MINGW_FORTIFY_LEVEL > 0
 
-__mingw_bos_ovr
+__mingw_bos_extern_ovr
 __attribute__((__format__ (gnu_printf, 3, 0))) __MINGW_ATTRIB_NONNULL(3)
-int vsnprintf (char *__stream, size_t __n, const char *__format, 
__builtin_va_list __local_argv)
+int vsnprintf (char * __restrict__ __stream, size_t __n, const char * 
__restrict__ __format, __builtin_va_list __local_argv)
 {
-#if __MINGW_FORTIFY_LEVEL > 0
   __mingw_bos_ptr_chk_warn(__stream, __n);
-#endif
   return __mingw_vsnprintf( __stream, __n, __format, __local_argv );
 }
 
+#endif /* __MINGW_FORTIFY_LEVEL > 0 */
+
 /* Override __builtin_printf-routines ... Kludge for libstdc++ ...*/
 #define __builtin_vsnprintf __mingw_vsnprintf
 #define __builtin_vsprintf __mingw_vsprintf
 
 /* #endif */ /* __NO_ISOCEXT */
 
-#ifdef __cplusplus
-}
-#endif
-
 #else /* !__USE_MINGW_ANSI_STDIO */
 
 #undef __builtin_vsnprintf
@@ -1096,42 +1065,38 @@ int vwprintf (const wchar_t *__format, 
__builtin_va_list __local_argv)
 
 #ifndef __NO_ISOCEXT  /* externs in libmingwex.a */
 
-#ifdef __mingw_va_arg_pack_ovr
+/* __attribute__((__format__ (gnu_wprintf, 3, 4))) */ __MINGW_ATTRIB_NONNULL(3)
+int __cdecl snwprintf (wchar_t * __restrict__, size_t, const wchar_t * 
__restrict__, ...)
+  __MINGW_ASM_CALL(__mingw_snwprintf);
+
+#if __MINGW_FORTIFY_VA_ARG
 
 __mingw_va_arg_pack_ovr
 /* __attribute__((__format__ (gnu_wprintf, 3, 4))) */ __MINGW_ATTRIB_NONNULL(3)
 int snwprintf (wchar_t *__stream, size_t __n, const wchar_t *__format, ...)
 {
-#if __MINGW_FORTIFY_LEVEL > 0
   __mingw_bos_ptr_chk_warn(__stream, __n * sizeof(wchar_t));
-#endif
   return __mingw_snwprintf( __stream, __n, __format, __builtin_va_arg_pack() );
 }
 
-#else /* !__mingw_va_arg_pack_ovr */
+#endif /* __MINGW_FORTIFY_VA_ARG */
 
-__mingw_ovr
-/* __attribute__((__format__ (gnu_wprintf, 3, 4))) */ __MINGW_ATTRIB_NONNULL(3)
-int snwprintf (wchar_t *__stream, size_t __n, const wchar_t *__format, ...)
-{
-  int __retval;
-  __builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format );
-  __retval = __mingw_vsnwprintf( __stream, __n, __format, __local_argv );
-  __builtin_va_end( __local_argv );
-  return __retval;
-}
+/* __attribute__((__format__ (gnu_wprintf, 3, 0))) */ __MINGW_ATTRIB_NONNULL(3)
+int __cdecl vsnwprintf (wchar_t * __restrict__, size_t, const wchar_t * 
__restrict__, va_list)
+  __MINGW_ASM_CALL(__mingw_vsnwprintf);
 
-#endif /* __mingw_va_arg_pack_ovr */
+#if __MINGW_FORTIFY_LEVEL > 0
 
-__mingw_bos_ovr
+__mingw_bos_extern_ovr
 /* __attribute__((__format__ (gnu_wprintf, 3, 0))) */ __MINGW_ATTRIB_NONNULL(3)
 int vsnwprintf (wchar_t *__stream, size_t __n, const wchar_t *__format, 
__builtin_va_list __local_argv)
 {
-#if __MINGW_FORTIFY_LEVEL > 0
   __mingw_bos_ptr_chk_warn(__stream, __n * sizeof(wchar_t));
-#endif
   return __mingw_vsnwprintf( __stream, __n, __format, __local_argv );
 }
+
+#endif /* __MINGW_FORTIFY_LEVEL > 0 */
+
 #endif /* __NO_ISOCEXT */
 
 #else /* !__USE_MINGW_ANSI_STDIO */
-- 
2.21.0

_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to