From patchwork Sat Jun 22 09:01:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom de Vries X-Patchwork-Id: 33277 Received: (qmail 1618 invoked by alias); 22 Jun 2019 09:01: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 1610 invoked by uid 89); 22 Jun 2019 09:01:51 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 22 Jun 2019 09:01:49 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 74F7CAE78; Sat, 22 Jun 2019 09:01:47 +0000 (UTC) Subject: Re: [PATCH][gdb] Fix s390x -m31 build From: Tom de Vries To: Tom Tromey Cc: gdb-patches@sourceware.org, Andreas Arnez References: <20190620093339.GA6388@delia> <87y31uc4a3.fsf@tromey.com> Message-ID: <72353d1b-df8c-9b34-4c2e-1bb3d332319b@suse.de> Date: Sat, 22 Jun 2019 11:01:45 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 MIME-Version: 1.0 In-Reply-To: X-IsSubscribed: yes On 21-06-19 19:07, Tom de Vries wrote: > On 21-06-19 18:05, Tom Tromey wrote: >>>>>>> "Tom" == Tom de Vries writes: >> >> Tom> Fix this by changing the length modifier from 'z' to the ptrdiff_t length >> Tom> modifier 't', and change the conversion specifier from 'u' to the more >> Tom> appropriate 'd'. >> >> gdb probably shouldn't be using 'z' anyway. IIRC it causes problems on >> Windows. >> >> How portable is %td? I do not know. Maybe check the gnulib manual and >> see what they have to say about it? Anyway, this is my main concern >> with this patch. >> > > I found here ( https://www.gnu.org/software/gnulib/manual/gnulib.html ): > ... > Portability problems fixed by Gnulib module fprintf-posix: > > This function does not support size specifiers as in C99 (hh, ll, j, > t, z) on some platforms: AIX 5.1, HP-UX 11.23, IRIX 6.5, OSF/1 5.1, > Solaris 9, Cygwin 1.5.24, mingw, MSVC 14, BeOS. > ... > >> The standard gdb approach here is to use plongest / pulongest in >> conjunction with %s. That avoids any problems. > > I'll update the patch to use that method, thanks for pointing that out. Committed as attached. Thanks, - Tom [gdb] Fix s390x -m31 build When building gdb on s390x with -m31, we run into this Wformat warning (which Werror turns into an error): ... gdb/dwarf2read.c: In function \ 'void create_addrmap_from_aranges(dwarf2_per_objfile*, \ dwarf2_section_info*)': gdb/dwarf2read.c:3277:22: error: format '%zu' expects argument of type \ 'size_t', but argument 3 has type 'int' [-Werror=format=] warning (_("Section .debug_aranges in %s entry at offset %zu " ... The Wformat warning is triggered in this statement: ... warning (_("Section .debug_aranges in %s entry at offset %zu " "length %s exceeds section length %s, " "ignoring .debug_aranges."), objfile_name (objfile), entry_addr - section->buffer, plongest (bytes_read + entry_length), pulongest (section->size)); ... where 'entry_addr - section->buffer' is of type ptrdiff_t and '%zu' prints an unsigned with the same size as size_t/ssize_t. On s390x with -m31, we have: - size_t : unsigned long int (32-bit) - ptrdiff_t: int (32-bit) Wformat warns against this because even though long int and int have the same size, the types are not compatible. [ The Wformat warning is to similar to what we would get for x86_64 -m32 (where long and int are also the same size) and: ... int i; printf ("%ld", i); ... ] Fix this by using '%s' and plongest instead of '%zu' to print ptrdiff_t. Build and reg-tested on x86_64. gdb/ChangeLog: 2019-06-20 Tom de Vries * dwarf2read.c (create_addrmap_from_aranges) (read_debug_names_from_section): Print ptrdiff_t using '%s' and plongest instead of '%zu'. --- gdb/dwarf2read.c | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index fccbd05e2d..85f2b1dfc4 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -3229,10 +3229,11 @@ create_addrmap_from_aranges (struct dwarf2_per_objfile *dwarf2_per_objfile, const uint8_t offset_size = dwarf5_is_dwarf64 ? 8 : 4; if (addr + entry_length > section->buffer + section->size) { - warning (_("Section .debug_aranges in %s entry at offset %zu " + warning (_("Section .debug_aranges in %s entry at offset %s " "length %s exceeds section length %s, " "ignoring .debug_aranges."), - objfile_name (objfile), entry_addr - section->buffer, + objfile_name (objfile), + plongest (entry_addr - section->buffer), plongest (bytes_read + entry_length), pulongest (section->size)); return; @@ -3243,10 +3244,10 @@ create_addrmap_from_aranges (struct dwarf2_per_objfile *dwarf2_per_objfile, addr += 2; if (version != 2) { - warning (_("Section .debug_aranges in %s entry at offset %zu " + warning (_("Section .debug_aranges in %s entry at offset %s " "has unsupported version %d, ignoring .debug_aranges."), - objfile_name (objfile), entry_addr - section->buffer, - version); + objfile_name (objfile), + plongest (entry_addr - section->buffer), version); return; } @@ -3257,10 +3258,11 @@ create_addrmap_from_aranges (struct dwarf2_per_objfile *dwarf2_per_objfile, = debug_info_offset_to_per_cu.find (sect_offset (debug_info_offset)); if (per_cu_it == debug_info_offset_to_per_cu.cend ()) { - warning (_("Section .debug_aranges in %s entry at offset %zu " + warning (_("Section .debug_aranges in %s entry at offset %s " "debug_info_offset %s does not exists, " "ignoring .debug_aranges."), - objfile_name (objfile), entry_addr - section->buffer, + objfile_name (objfile), + plongest (entry_addr - section->buffer), pulongest (debug_info_offset)); return; } @@ -3269,20 +3271,21 @@ create_addrmap_from_aranges (struct dwarf2_per_objfile *dwarf2_per_objfile, const uint8_t address_size = *addr++; if (address_size < 1 || address_size > 8) { - warning (_("Section .debug_aranges in %s entry at offset %zu " + warning (_("Section .debug_aranges in %s entry at offset %s " "address_size %u is invalid, ignoring .debug_aranges."), - objfile_name (objfile), entry_addr - section->buffer, - address_size); + objfile_name (objfile), + plongest (entry_addr - section->buffer), address_size); return; } const uint8_t segment_selector_size = *addr++; if (segment_selector_size != 0) { - warning (_("Section .debug_aranges in %s entry at offset %zu " + warning (_("Section .debug_aranges in %s entry at offset %s " "segment_selector_size %u is not supported, " "ignoring .debug_aranges."), - objfile_name (objfile), entry_addr - section->buffer, + objfile_name (objfile), + plongest (entry_addr - section->buffer), segment_selector_size); return; } @@ -3295,9 +3298,10 @@ create_addrmap_from_aranges (struct dwarf2_per_objfile *dwarf2_per_objfile, padding > 0; padding--) if (*addr++ != 0) { - warning (_("Section .debug_aranges in %s entry at offset %zu " + warning (_("Section .debug_aranges in %s entry at offset %s " "padding is not zero, ignoring .debug_aranges."), - objfile_name (objfile), entry_addr - section->buffer); + objfile_name (objfile), + plongest (entry_addr - section->buffer)); return; } @@ -3305,10 +3309,11 @@ create_addrmap_from_aranges (struct dwarf2_per_objfile *dwarf2_per_objfile, { if (addr + 2 * address_size > entry_end) { - warning (_("Section .debug_aranges in %s entry at offset %zu " + warning (_("Section .debug_aranges in %s entry at offset %s " "address list is not properly terminated, " "ignoring .debug_aranges."), - objfile_name (objfile), entry_addr - section->buffer); + objfile_name (objfile), + plongest (entry_addr - section->buffer)); return; } ULONGEST start = extract_unsigned_integer (addr, address_size, @@ -5517,8 +5522,9 @@ read_debug_names_from_section (struct objfile *objfile, if (addr != abbrev_table_start + abbrev_table_size) { warning (_("Section .debug_names in %s has abbreviation_table " - "of size %zu vs. written as %u, ignoring .debug_names."), - filename, addr - abbrev_table_start, abbrev_table_size); + "of size %s vs. written as %u, ignoring .debug_names."), + filename, plongest (addr - abbrev_table_start), + abbrev_table_size); return false; } map.entry_pool = addr;