From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id VXnNFNYKNmCrDgAAWB0awg (envelope-from ) for ; Wed, 24 Feb 2021 03:14:14 -0500 Received: by simark.ca (Postfix, from userid 112) id 453EB1E789; Wed, 24 Feb 2021 03:14:14 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=MAILING_LIST_MULTI,RDNS_NONE, URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Received: from sourceware.org (unknown [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 168B91E789 for ; Wed, 24 Feb 2021 03:14:13 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 973633896C11; Wed, 24 Feb 2021 08:14:12 +0000 (GMT) Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by sourceware.org (Postfix) with ESMTPS id 36902389364F for ; Wed, 24 Feb 2021 08:14:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 36902389364F 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 55566AD2B; Wed, 24 Feb 2021 08:14:08 +0000 (UTC) Subject: [PING][PATCH][gdb/symtab] Handle DW_AT_decl_file with form DW_FORM_implicit_const From: Tom de Vries To: gdb-patches@sourceware.org References: <20210205122854.GA19272@delia> Message-ID: Date: Wed, 24 Feb 2021 09:14:07 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1 MIME-Version: 1.0 In-Reply-To: <20210205122854.GA19272@delia> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit 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: , Cc: Tom Tromey Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" On 2/5/21 1:28 PM, Tom de Vries wrote: > Hi, > > With test-case gdb.cp/temargs.exp on target board \ > unix/gdb:debug_flags=-gdwarf-5 I run into: > ... > (gdb) info addr I^M > ERROR: GDB process no longer exists > GDB process exited with wait status 32286 exp19 0 0 CHILDKILLED SIGABRT SIGABRT > UNRESOLVED: gdb.cp/temargs.exp: test address of I in templ_m > ... > > This is a regression since commit 529908cbd0a "Remove DW_UNSND". > > The problem is that this DW_AT_decl_file: > ... > <1><221>: Abbrev Number: 4 (DW_TAG_structure_type) > <222> DW_AT_name : Base > <226> DW_AT_byte_size : 1 > <226> DW_AT_decl_file : 1 > <226> DW_AT_decl_line : 30 > <227> DW_AT_sibling : <0x299> > ... > is not read by this code in new_symbol: > .... > attr = dwarf2_attr (die, > inlined_func ? DW_AT_call_file : DW_AT_decl_file, > cu); > if (attr != nullptr && attr->form_is_unsigned ()) > ... > because DW_AT_decl_file has form DW_FORM_implicit_const: > ... > 4 DW_TAG_structure_type [has children] > DW_AT_name DW_FORM_strp > DW_AT_byte_size DW_FORM_implicit_const: 1 > DW_AT_decl_file DW_FORM_implicit_const: 1 > DW_AT_decl_line DW_FORM_data1 > DW_AT_sibling DW_FORM_ref4 > DW_AT value: 0 DW_FORM value: 0 > ... > which is a signed LEB128, so attr->form_is_unsigned () returns false. > > Fix this by introducing new functions is_nonnegative and as_nonnegative, and > use these instead of form_is_unsigned and as_unsigned. > > Tested on x86_64-linux. > > Any comments? > Ping. Thanks, - Tom > [gdb/symtab] Handle DW_AT_decl_file with form DW_FORM_implicit_const > > gdb/ChangeLog: > > 2021-02-05 Tom de Vries > > PR symtab/27336 > * dwarf2/attribute.c (attribute::form_is_signed): New function > factored out of ... > * dwarf2/attribute.h (attribute::as_signed): ... here. > (attribute::is_nonnegative, attribute::as_nonnegative): New function. > (attribute::form_is_signed): Declare. > * dwarf2/read.c (new_symbol): Use is_nonnegative and as_nonnegative > for DW_AT_decl_file. > > --- > gdb/dwarf2/attribute.c | 8 ++++++++ > gdb/dwarf2/attribute.h | 27 ++++++++++++++++++++++++++- > gdb/dwarf2/read.c | 4 ++-- > 3 files changed, 36 insertions(+), 3 deletions(-) > > diff --git a/gdb/dwarf2/attribute.c b/gdb/dwarf2/attribute.c > index b4f188a096e..8c58f1bcd9f 100644 > --- a/gdb/dwarf2/attribute.c > +++ b/gdb/dwarf2/attribute.c > @@ -189,6 +189,14 @@ attribute::form_is_unsigned () const > > /* See attribute.h. */ > > +bool > +attribute::form_is_signed () const > +{ > + return form == DW_FORM_sdata || form == DW_FORM_implicit_const; > +} > + > +/* See attribute.h. */ > + > bool > attribute::form_requires_reprocessing () const > { > diff --git a/gdb/dwarf2/attribute.h b/gdb/dwarf2/attribute.h > index 56776d64ed3..b0b3e14cc68 100644 > --- a/gdb/dwarf2/attribute.h > +++ b/gdb/dwarf2/attribute.h > @@ -70,7 +70,7 @@ struct attribute > form. */ > LONGEST as_signed () const > { > - gdb_assert (form == DW_FORM_sdata || form == DW_FORM_implicit_const); > + gdb_assert (form_is_signed ()); > return u.snd; > } > > @@ -92,6 +92,28 @@ struct attribute > return u.unsnd; > } > > + /* Return true if the value is nonnegative. Requires that that > + reprocessing not be needed. */ > + bool is_nonnegative () const > + { > + if (form_is_unsigned ()) > + return true; > + if (form_is_signed ()) > + return as_signed () >= (LONGEST)0; > + return false; > + } > + > + /* Return the nonnegative value. Requires that that reprocessing not be > + needed. */ > + ULONGEST as_nonnegative () const > + { > + if (form_is_unsigned ()) > + return as_unsigned (); > + if (form_is_signed ()) > + return (ULONGEST)as_signed (); > + gdb_assert (false); > + } > + > /* Return non-zero if ATTR's value is a section offset --- classes > lineptr, loclistptr, macptr or rangelistptr --- or zero, otherwise. > You may use the as_unsigned method to retrieve such offsets. > @@ -147,6 +169,9 @@ struct attribute > /* Check if the attribute's form is an unsigned integer form. */ > bool form_is_unsigned () const; > > + /* Check if the attribute's form is a signed integer form. */ > + bool form_is_signed () const; > + > /* Check if the attribute's form is a form that requires > "reprocessing". */ > bool form_requires_reprocessing () const; > diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c > index 98189f7b566..424a0da3d6c 100644 > --- a/gdb/dwarf2/read.c > +++ b/gdb/dwarf2/read.c > @@ -22180,10 +22180,10 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu, > attr = dwarf2_attr (die, > inlined_func ? DW_AT_call_file : DW_AT_decl_file, > cu); > - if (attr != nullptr && attr->form_is_unsigned ()) > + if (attr != nullptr && attr->is_nonnegative ()) > { > file_name_index file_index > - = (file_name_index) attr->as_unsigned (); > + = (file_name_index) attr->as_nonnegative (); > struct file_entry *fe; > > if (cu->line_header != NULL) >