From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id NRhSKxdi81+3IwAAWB0awg (envelope-from ) for ; Mon, 04 Jan 2021 13:44:39 -0500 Received: by simark.ca (Postfix, from userid 112) id A91CB1F0AA; Mon, 4 Jan 2021 13:44:39 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=MAILING_LIST_MULTI, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id A798A1E590 for ; Mon, 4 Jan 2021 13:44:38 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6799238930F7; Mon, 4 Jan 2021 18:44:38 +0000 (GMT) Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by sourceware.org (Postfix) with ESMTPS id EAFAA388A437 for ; Mon, 4 Jan 2021 18:44:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org EAFAA388A437 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=tdevries@suse.de X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 0738FAD11; Mon, 4 Jan 2021 18:44:35 +0000 (UTC) To: Bernd Edlinger , gdb-patches@sourceware.org References: <20210104135927.GA3115@delia> From: Tom de Vries Subject: Re: [PATCH][gdb/symtab] Remove superfluous end-of-sequence marker Message-ID: Date: Mon, 4 Jan 2021 19:44:34 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.5.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------49B3B31F32238A49AEAB04FF" Content-Language: en-US X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" This is a multi-part message in MIME format. --------------49B3B31F32238A49AEAB04FF Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit On 1/4/21 5:27 PM, Bernd Edlinger wrote: > On 1/4/21 2:59 PM, Tom de Vries wrote: >> Hi, >> >> While working on PR26935 I noticed that when running test-case >> gdb.base/morestack.exp with target board unix/-m32/-fPIE/-pie and ld linker, >> I get this linetable fragment for morestack.S using readelf -wL: >> ... >> CU: ../../../../libgcc/config/i386/morestack.S: >> Line number Starting address View Stmt >> 109 0xc9c x >> ... >> 838 0xe03 x >> - 0xe04 >> >> 636 0 x >> 637 0x3 x >> - 0x4 >> ... >> but with "maint info line-table" I get: >> ... >> INDEX LINE ADDRESS IS-STMT >> 0 END 0x00000004 Y >> 1 109 0x00000c9c Y >> ... >> 110 838 0x00000e03 Y >> 111 END 0x00000e04 Y >> ... >> >> So, apparently the entries with addresses 0x0 and 0x3 are filtered out >> because the addresses are out of range, but the same doesn't happen with the >> end-of-seq terminator. >> >> Fix this by filtering out end-of-seq terminators that do not actually >> terminate anything. >> >> Tested on x86_64-linux. >> >> Any comments? >> >> Thanks, >> - Tom >> >> [gdb/symtab] Remove superfluous end-of-sequence marker >> >> gdb/ChangeLog: >> >> 2021-01-04 Tom de Vries >> >> * buildsym.c (buildsym_compunit::record_line): Filter out end-of-seq >> terminators that do not terminate anything. >> >> gdb/testsuite/ChangeLog: >> >> 2021-01-04 Tom de Vries >> >> * gdb.dwarf2/dw2-out-of-range-end-of-seq.exp: New file. >> >> --- >> gdb/buildsym.c | 8 ++ >> .../gdb.dwarf2/dw2-out-of-range-end-of-seq.exp | 94 ++++++++++++++++++++++ >> 2 files changed, 102 insertions(+) >> >> diff --git a/gdb/buildsym.c b/gdb/buildsym.c >> index 1d8c579b7b8..245aecf0c38 100644 >> --- a/gdb/buildsym.c >> +++ b/gdb/buildsym.c >> @@ -714,6 +714,14 @@ buildsym_compunit::record_line (struct subfile *subfile, int line, >> break; >> subfile->line_vector->nitems--; >> } >> + >> + /* Ignore an end-of-sequence marker marking an empty sequence. */ >> + struct linetable_entry *last >> + = (subfile->line_vector->nitems == 0 >> + ? nullptr >> + : &subfile->line_vector->item[subfile->line_vector->nitems - 1]); >> + if (last == nullptr || last->line == 0) >> + return; >> } >> > > What you want to achieve here can probably be done more easily this way: > > diff --git a/gdb/buildsym.c b/gdb/buildsym.c > index 1d8c579..dda83f7 100644 > --- a/gdb/buildsym.c > +++ b/gdb/buildsym.c > @@ -710,6 +710,8 @@ struct blockvector * > while (subfile->line_vector->nitems > 0) > { > e = subfile->line_vector->item + subfile->line_vector->nitems - 1; > + if (e->line == 0) > + return; > if (e->pc != pc) > break; > subfile->line_vector->nitems--; > > Hi Bernd, Thanks for the review. Indeed, that's less verbose than the current patch, but to me it feels more convoluted. I'd rather keep the additional test out of the loop. I did realize because of your comment that in both cases we're dealing with the last entry in the table, so I've rewritten the patch to use a last variable in the loop, and to reuse it afterwards. > I wonder however where the out-of-range line entries are filtered away. > Would it be better to filter the end of sequence markers there? I'm also curious about that, but I don't think it matters much. Committed to trunk as attached. Thanks, - Tom --------------49B3B31F32238A49AEAB04FF Content-Type: text/x-patch; charset=UTF-8; name="0001-gdb-symtab-Remove-superfluous-end-of-sequence-marker.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline; filename*0="0001-gdb-symtab-Remove-superfluous-end-of-sequence-marker.pa"; filename*1="tch" [gdb/symtab] Remove superfluous end-of-sequence marker While working on PR26935 I noticed that when running test-case gdb.base/morestack.exp with target board unix/-m32/-fPIE/-pie and ld link= er, I get this linetable fragment for morestack.S using readelf -wL: =2E.. CU: ../../../../libgcc/config/i386/morestack.S: Line number Starting address View Stmt 109 0xc9c x ... 838 0xe03 x - 0xe04 636 0 x 637 0x3 x - 0x4 =2E.. but with "maint info line-table" I get: =2E.. INDEX LINE ADDRESS IS-STMT 0 END 0x00000004 Y 1 109 0x00000c9c Y ... 110 838 0x00000e03 Y 111 END 0x00000e04 Y =2E.. So, apparently the entries with addresses 0x0 and 0x3 are filtered out because the addresses are out of range, but the same doesn't happen with = the end-of-seq terminator. Fix this by filtering out end-of-seq terminators that do not actually terminate anything. Tested on x86_64-linux. gdb/ChangeLog: 2021-01-04 Tom de Vries * buildsym.c (buildsym_compunit::record_line): Filter out end-of-seq terminators that do not terminate anything. gdb/testsuite/ChangeLog: 2021-01-04 Tom de Vries * gdb.dwarf2/dw2-out-of-range-end-of-seq.exp: New file. --- gdb/buildsym.c | 9 ++- .../gdb.dwarf2/dw2-out-of-range-end-of-seq.exp | 94 ++++++++++++++++= ++++++ 2 files changed, 101 insertions(+), 2 deletions(-) diff --git a/gdb/buildsym.c b/gdb/buildsym.c index 1d8c579b7b8..0f7449fed97 100644 --- a/gdb/buildsym.c +++ b/gdb/buildsym.c @@ -707,13 +707,18 @@ buildsym_compunit::record_line (struct subfile *sub= file, int line, anyway. */ if (line =3D=3D 0) { + struct linetable_entry *last =3D nullptr; while (subfile->line_vector->nitems > 0) { - e =3D subfile->line_vector->item + subfile->line_vector->nitems - 1; - if (e->pc !=3D pc) + last =3D subfile->line_vector->item + subfile->line_vector->nitems - = 1; + if (last->pc !=3D pc) break; subfile->line_vector->nitems--; } + + /* Ignore an end-of-sequence marker marking an empty sequence. */= + if (last =3D=3D nullptr || last->line =3D=3D 0) + return; } =20 e =3D subfile->line_vector->item + subfile->line_vector->nitems++; diff --git a/gdb/testsuite/gdb.dwarf2/dw2-out-of-range-end-of-seq.exp b/g= db/testsuite/gdb.dwarf2/dw2-out-of-range-end-of-seq.exp new file mode 100644 index 00000000000..7a32a01389c --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-out-of-range-end-of-seq.exp @@ -0,0 +1,94 @@ +# Copyright 2021 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Check that an out-of-range DW_LNE_end_sequence is removed from the +# line table. + +load_lib dwarf.exp + +# This test can only be run on targets which support DWARF-2 and use gas= =2E +if {![dwarf2_support]} { + verbose "Skipping $gdb_test_file_name." + return 0 +} + +# The .c files use __attribute__. +if [get_compiler_info] { + return -1 +} +if !$gcc_compiled { + verbose "Skipping $gdb_test_file_name." + return 0 +} + +standard_testfile main.c -dw.S + +set asm_file [standard_output_file $srcfile2] +Dwarf::assemble $asm_file { + declare_labels Llines + global srcdir subdir srcfile + + cu {} { + compile_unit { + {language @DW_LANG_C} + {name $srcfile} + {stmt_list $Llines DW_FORM_sec_offset} + } { + subprogram { + {external 1 flag} + {MACRO_AT_func {main}} + } + } + } + + lines {version 2} Llines { + include_dir "${srcdir}/${subdir}" + file_name "$srcfile" 1 + + program { + {DW_LNE_set_address main_label} + {line 1} + {DW_LNS_copy} + + {DW_LNS_advance_pc 1} + {DW_LNE_end_sequence} + + {DW_LNE_set_address 0} + {line 2} + {DW_LNS_copy} + + {DW_LNS_advance_pc 1} + {DW_LNE_end_sequence} + } + } +} + +if { [prepare_for_testing "failed to prepare" ${testfile} \ + [list $srcfile $asm_file] {nodebug}] } { + return -1 +} + +if ![runto_main] { + return -1 +} + +gdb_test_multiple "maint info line-table" "END with address 1 eliminated= " { + -re -wrap "END *0x0*1 Y \r\n.*" { + fail $gdb_test_name + } + -re -wrap "" { + pass $gdb_test_name + } +} --------------49B3B31F32238A49AEAB04FF--