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