From patchwork Thu Nov 14 16:49:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 35889 Received: (qmail 95581 invoked by alias); 14 Nov 2019 16:49:51 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 95561 invoked by uid 89); 14 Nov 2019 16:49:51 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-23.7 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=strncpy X-HELO: mail-wr1-f43.google.com Received: from mail-wr1-f43.google.com (HELO mail-wr1-f43.google.com) (209.85.221.43) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 14 Nov 2019 16:49:49 +0000 Received: by mail-wr1-f43.google.com with SMTP id r10so7280831wrx.3 for ; Thu, 14 Nov 2019 08:49:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=U1dpprwozMj6pbwOEiWJNc9Y0REQovQLI/OPiq9omjY=; b=gqu8d9aGtEopCT3byT+IE6h7AtyfZdpzkWuECkCiEuju469dnxR0KGqrcutAYIH6iQ 07DZ5Y69r0hI+yR+IwrDiX5mET9Lybf5lDK7tS70s+5fDEgdYmWIJ+WJjYoIK6x4Tchk zi0oGFenWPEAqPusRI3U2J8sDtLGUar+YjBMnucMBDlevcVM7f9AEqDsCBnS4LltsQgt PS1gQ0uGcyB9rs9kv3w9ipwqhWYGULuNmjlR77irmDHQ0mfmrYLIMIQ9wk2RP57jJ0a7 q2cKkYUMHxH9BTu9xSQxsPdBt99LTwonQQMCAyfV6z45OHDW7t17oaQF1giFkfLLr4yI 3mKw== Return-Path: Received: from localhost (host86-128-12-122.range86-128.btcentralplus.com. [86.128.12.122]) by smtp.gmail.com with ESMTPSA id a186sm6340223wmc.48.2019.11.14.08.49.46 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 14 Nov 2019 08:49:46 -0800 (PST) Date: Thu, 14 Nov 2019 16:49:45 +0000 From: Andrew Burgess To: Eli Zaretskii Cc: noreply@gnutoolchain-gerrit.osci.io, simon.marchi@polymtl.ca, tromey@sourceware.org, palves@redhat.com, brobecker@adacore.com, kevinb@redhat.com, gdb-patches@sourceware.org Subject: Re: [pushed] gdb: Support printf 'z' size modifier Message-ID: <20191114164945.GP11037@embecosm.com> References: <20191112235315.5BD6728171@gnutoolchain-gerrit.osci.io> <83y2wi62jp.fsf@gnu.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <83y2wi62jp.fsf@gnu.org> X-Fortune: If at first you don't succeed, you are running about average. X-Editor: GNU Emacs [ http://www.gnu.org/software/emacs ] User-Agent: Mutt/1.9.2 (2017-12-15) X-IsSubscribed: yes * Eli Zaretskii [2019-11-14 14:54:50 +0200]: > > Date: Tue, 12 Nov 2019 18:53:15 -0500 > > From: "Sourceware to Gerrit sync (Code Review)" > > Cc: Kevin Buettner , Joel Brobecker , Pedro Alves , Simon Marchi , Tom Tromey > > > > gdb/ChangeLog: > > > > * gdbsupport/format.c (format_pieces::format_pieces): Support > > printf 'z' size modifier. > > * gdbsupport/format.h (enum argclass): Add size_t_arg. > > * printcmd.c (ui_printf): Handle size_t_arg. > > * ui-out.c (ui_out::vmessage): Likewise. > > * unittests/format_pieces-selftests.c (test_format_int_sizes): New > > function. > > (run_tests): Call test_format_int_sizes. > > I believe this requires to use __USE_MINGW_ANSI_STDIO with the MinGW > builds, since %z is not universally supported by the Windows runtime. I only stumbled onto this issue as I hit a use of %z (which wasn't guarded with __USE_MINGW_ANSI_STDIO) and wanted it to work now that these strings pass through GDB's formatting code. I guess we're no worse off now than we were before, but obviously that's not saying much if we were possibly broken before. I guess there are a couple of solutions: 1. Remove all uses of %z from GDB, and back out the %z support, or 2. Have GDB translate %z into some other suitable format specifier for targets where %z is not supported. Below is a patch that tries to take the second approach. Feedback / thoughts welcome. Thanks, Andrew ---- commit fb431811b59597b63c5bb9bcf7bf8559991c52e1 Author: Andrew Burgess Date: Thu Nov 14 16:40:57 2019 +0000 gdb: Support for %z format on MinGW Eli pointed out that the %z size specifier is not supported on all versions of MinGW. This commit attempts to work around this by translating %z into some other suitable format specifier. So something like %zd will become either %d, %ld, or %lld depending on whether the sizeof (size_t) matches the sizeof (int), sizeof (long), or sizeof (long long). For the long long case we might also translate to %I64d if USE_PRINTF_I64 is true. I don't have access to MinGW so this code is mostly untested - I did remove the '#if defined __MINGW32__ ....' check and try using %z in some formatted prints, this all seemed to work fine - on my machine sizeof (size_t) == sizeof (long). gdb/ChangeLog: * gdbsupport/format.c (format_pieces::format_pieces): Translate %z into some other suitable format size specifier if it is not supported. Change-Id: I20f5e4cb1a7ab88f00f5e42d3fd8ca4aef00993d diff --git a/gdb/gdbsupport/format.c b/gdb/gdbsupport/format.c index 2e2d90a9246..e316e840e22 100644 --- a/gdb/gdbsupport/format.c +++ b/gdb/gdbsupport/format.c @@ -375,6 +375,40 @@ format_pieces::format_pieces (const char **arg, bool gdb_extensions) strcpy (current_substring + length_before_ls, "s"); current_substring += length_before_ls + 2; } +#if defined __MINGW32__ && !defined __USE_MINGW_ANSI_STDIO + else if (this_argclass == size_t_arg) + { + /* Some versions of MinGW don't support the %z size format, so + lets change to use some appropriate alternative. */ + *current_substring++ = '%'; + if (sizeof (size_t) == sizeof (int)) + { + *current_substring++ = *(percent_loc + 2); + this_argclass = int_arg; + } + else if (sizeof (size_t) == sizeof (long)) + { + *current_substring++ = 'l'; + *current_substring++ = *(percent_loc + 2); + this_argclass = long_arg; + } + else if (sizeof (size_t) == sizeof (long long)) + { + if (USE_PRINTF_I64) + { + strcpy (current_substring, "I64"); + current_substring += 3; + } + else + { + strcpy (current_substring, "ll"); + current_substring += 2; + } + *current_substring++ = *(percent_loc + 2); + this_argclass = long_long_arg; + } + } +#endif /* defined __MINGW32__ && !defined __USE_MINGW_ANSI_STDIO */ else { strncpy (current_substring, percent_loc, f - percent_loc);