This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] MinGW and attribute format(printf/gnu_printf)


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=91ee7171d0886731900ab0238ce3795241d877a4

commit 91ee7171d0886731900ab0238ce3795241d877a4
Author: Pedro Alves <palves@redhat.com>
Date:   Tue Nov 17 15:17:45 2015 +0000

    MinGW and attribute format(printf/gnu_printf)
    
    Cross building gdbserver for --host=x86_64-w64-mingw32 with gcc 4.8.4
    20141219 (Fedora MinGW 4.8.4-1.fc20), I get:
    
      src/gdb/gdbserver/tracepoint.c: In function 'cmd_qtdp':
      src/gdb/gdbserver/tracepoint.c:2577:7: error: unknown conversion type character 'l' in format [-Werror=format=]
    	 trace_debug ("Defined %stracepoint %d at 0x%s, "
    	 ^
      src/gdb/gdbserver/tracepoint.c:2577:7: error: unknown conversion type character 'l' in format [-Werror=format=]
      src/gdb/gdbserver/tracepoint.c:2577:7: error: too many arguments for format [-Werror=format-extra-args]
      src/gdb/gdbserver/tracepoint.c: In function 'stop_tracing':
      src/gdb/gdbserver/tracepoint.c:3447:7: error: unknown conversion type character 'l' in format [-Werror=format=]
    	 trace_debug ("Stopping the trace because "
    	 ^
      src/gdb/gdbserver/tracepoint.c:3447:7: error: too many arguments for format [-Werror=format-extra-args]
      src/gdb/gdbserver/tracepoint.c: In function 'collect_data_at_tracepoint':
      src/gdb/gdbserver/tracepoint.c:4651:3: error: unknown conversion type character 'l' in format [-Werror=format=]
         trace_debug ("Making new traceframe for tracepoint %d at 0x%s, hit %" PRIu64,
         ^
      src/gdb/gdbserver/tracepoint.c:4651:3: error: too many arguments for format [-Werror=format-extra-args]
      src/gdb/gdbserver/tracepoint.c: In function 'collect_data_at_step':
      src/gdb/gdbserver/tracepoint.c:4687:3: error: unknown conversion type character 'l' in format [-Werror=format=]
         trace_debug ("Making new step traceframe for "
         ^
    
    trace_debug is a macro that calls:
    
      static void trace_vdebug (const char *, ...) ATTRIBUTE_PRINTF (1, 2);
    
    The calls that fail checking use PRIu64, etc., like:
    
          trace_debug ("Defined %stracepoint %d at 0x%s, "
    		   "enabled %d step %" PRIu64 " pass %" PRIu64,
    		   tpoint->type == fast_tracepoint ? "fast "
    		   : tpoint->type == static_tracepoint ? "static " : "",
    		   tpoint->number, paddress (tpoint->address), tpoint->enabled,
    		   tpoint->step_count, tpoint->pass_count);
    
    gnulib's stdio/printf module replacements may make %llu, etc. work on
    mingw, instead of the MS-specific %I64u, and thus may make PRIu64
    expand to %llu.  However, gcc isn't aware of that, because libiberty's
    ansidecl.h defines ATTRIBUTE_PRINTF as using attribute format(printf).
    But, with that format, gcc checks for MS-style format strings (%I64u).
    In order to have gcc expect gnu/standard formats, we need to use
    gnu_printf format instead.  Which version to use (printf/gnu_printf)
    depends on msvcrt and mingw version, and so gnulib has a
    configure-time check, and defines _GL_ATTRIBUTE_FORMAT_PRINTF
    accordingly.
    
    Since _GL_ATTRIBUTE_FORMAT_PRINTF is compatible with ATTRIBUTE_PRINTF,
    the fix is simply to make use of the former.
    
    gdb/ChangeLog:
    2015-11-17  Pedro Alves  <palves@redhat.com>
    
    	* common/common-defs.h (ATTRIBUTE_PRINTF): Redefine in terms of
    	_GL_ATTRIBUTE_FORMAT_PRINTF after including ansidecl.h.

Diff:
---
 gdb/ChangeLog            | 5 +++++
 gdb/common/common-defs.h | 9 +++++++++
 2 files changed, 14 insertions(+)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index d326b9c..044140e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
 2015-11-17  Pedro Alves  <palves@redhat.com>
 
+	* common/common-defs.h (ATTRIBUTE_PRINTF): Redefine in terms of
+	_GL_ATTRIBUTE_FORMAT_PRINTF after including ansidecl.h.
+
+2015-11-17  Pedro Alves  <palves@redhat.com>
+
 	* common/common-defs.h (__STDC_CONSTANT_MACROS)
 	(__STDC_LIMIT_MACROS): Define before including stdint.h.
 
diff --git a/gdb/common/common-defs.h b/gdb/common/common-defs.h
index 548fe42..acea663 100644
--- a/gdb/common/common-defs.h
+++ b/gdb/common/common-defs.h
@@ -51,7 +51,16 @@
 #include <string.h>
 #include <errno.h>
 #include <alloca.h>
+
 #include "ansidecl.h"
+/* This is defined by ansidecl.h, but we prefer gnulib's version.  On
+   MinGW, gnulib might enable __USE_MINGW_ANSI_STDIO, which may or not
+   require use of attribute gnu_printf instead of printf.  gnulib
+   checks that at configure time.  Since _GL_ATTRIBUTE_FORMAT_PRINTF
+   is compatible with ATTRIBUTE_PRINTF, simply use it.  */
+#undef ATTRIBUTE_PRINTF
+#define ATTRIBUTE_PRINTF _GL_ATTRIBUTE_FORMAT_PRINTF
+
 #include "libiberty.h"
 #include "pathmax.h"
 #include "gdb/signals.h"


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]