Message ID | 1446164397-12493-1-git-send-email-palves@redhat.com |
---|---|
State | New, archived |
Headers |
Received: (qmail 83365 invoked by alias); 30 Oct 2015 00:20:02 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: <gdb-patches.sourceware.org> List-Unsubscribe: <mailto:gdb-patches-unsubscribe-##L=##H@sourceware.org> List-Subscribe: <mailto:gdb-patches-subscribe@sourceware.org> List-Archive: <http://sourceware.org/ml/gdb-patches/> List-Post: <mailto:gdb-patches@sourceware.org> List-Help: <mailto:gdb-patches-help@sourceware.org>, <http://sourceware.org/ml/#faqs> Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 83339 invoked by uid 89); 30 Oct 2015 00:20:01 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Fri, 30 Oct 2015 00:20:00 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id E454F96E5 for <gdb-patches@sourceware.org>; Fri, 30 Oct 2015 00:19:58 +0000 (UTC) Received: from brno.lan (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t9U0JvH5022786 for <gdb-patches@sourceware.org>; Thu, 29 Oct 2015 20:19:58 -0400 From: Pedro Alves <palves@redhat.com> To: gdb-patches@sourceware.org Subject: [PATCH] MinGW and attribute format(printf/gnu_printf) Date: Fri, 30 Oct 2015 00:19:57 +0000 Message-Id: <1446164397-12493-1-git-send-email-palves@redhat.com> |
Commit Message
Pedro Alves
Oct. 30, 2015, 12:19 a.m. UTC
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-10-29 Pedro Alves <palves@redhat.com> * common/common-defs.h (ATTRIBUTE_PRINTF): Redefine in terms of _GL_ATTRIBUTE_FORMAT_PRINTF after including ansidecl.h. --- gdb/common/common-defs.h | 9 +++++++++ 1 file changed, 9 insertions(+)
Comments
On 10/30/2015 12:19 AM, Pedro Alves wrote: > 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-10-29 Pedro Alves <palves@redhat.com> > > * common/common-defs.h (ATTRIBUTE_PRINTF): Redefine in terms of > _GL_ATTRIBUTE_FORMAT_PRINTF after including ansidecl.h. I've pushed this in. Thanks, Pedro Alves
diff --git a/gdb/common/common-defs.h b/gdb/common/common-defs.h index 2be0d7d..372b404 100644 --- a/gdb/common/common-defs.h +++ b/gdb/common/common-defs.h @@ -35,7 +35,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"