From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13525 invoked by alias); 16 Jun 2010 16:08:58 -0000 Received: (qmail 13497 invoked by uid 22791); 16 Jun 2010 16:08:54 -0000 X-SWARE-Spam-Status: No, hits=-0.6 required=5.0 tests=AWL,BAYES_05,KAM_STOCKGEN,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 16 Jun 2010 16:08:49 +0000 Received: (qmail 28511 invoked from network); 16 Jun 2010 16:08:47 -0000 Received: from unknown (HELO orlando.localnet) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 16 Jun 2010 16:08:47 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: Re: [RFA]dwarf reader: Avoid complaint on const type Date: Wed, 16 Jun 2010 16:08:00 -0000 User-Agent: KMail/1.13.2 (Linux/2.6.32-22-generic; KDE/4.4.2; x86_64; ; ) Cc: "Pierre Muller" , tromey@redhat.com References: <41597.7287375883$1274454923@news.gmane.org> <001001caf925$2c771bb0$85655310$@muller@ics-cnrs.unistra.fr> In-Reply-To: <001001caf925$2c771bb0$85655310$@muller@ics-cnrs.unistra.fr> MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201006161708.41089.pedro@codesourcery.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-06/txt/msg00365.txt.bz2 On Friday 21 May 2010 21:35:37, Pierre Muller wrote: > > Pierre> 2010-05-21 Pierre Muller > > Pierre> * dwarf2read.c (process_die): Also allow DW_TAG_const_type > > Pierre> and DW_TAG_volatile_type. > > Pierre> (new_symbol): Likewise. This caused @@ -7385,16 +7385,16 @@ PASS: gdb.base/sigaltstack.exp: handle S PASS: gdb.base/sigaltstack.exp: handle SIGVTALRM print pass nostop PASS: gdb.base/sigaltstack.exp: handle SIGPROF print pass nostop PASS: gdb.base/sigaltstack.exp: break catcher if level == INNER -PASS: gdb.base/sigaltstack.exp: continue to catch +FAIL: gdb.base/sigaltstack.exp: continue to catch (the program exited) PASS: gdb.base/sigaltstack.exp: next -PASS: gdb.base/sigaltstack.exp: backtrace -PASS: gdb.base/sigaltstack.exp: finish from catch LEAF -PASS: gdb.base/sigaltstack.exp: finish to throw INNER -PASS: gdb.base/sigaltstack.exp: finish to catch INNER -PASS: gdb.base/sigaltstack.exp: finish from catch INNER -PASS: gdb.base/sigaltstack.exp: finish to OUTER -PASS: gdb.base/sigaltstack.exp: finish to catch MAIN -PASS: gdb.base/sigaltstack.exp: finish to MAIN +FAIL: gdb.base/sigaltstack.exp: backtrace (pattern 1) +FAIL: gdb.base/sigaltstack.exp: finish from catch LEAF (the program is no longer running) +FAIL: gdb.base/sigaltstack.exp: finish to throw INNER (the program is no longer running) +FAIL: gdb.base/sigaltstack.exp: finish to catch INNER (the program is no longer running) +FAIL: gdb.base/sigaltstack.exp: finish from catch INNER (the program is no longer running) +FAIL: gdb.base/sigaltstack.exp: finish to OUTER (the program is no longer running) +FAIL: gdb.base/sigaltstack.exp: finish to catch MAIN (the program is no longer running) +FAIL: gdb.base/sigaltstack.exp: finish to MAIN (the program is no longer running) for me. The problem is in the `level' variable in the test. (gdb) break catcher if level == INNER A syntax error in expression, near `== INNER'. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ (gdb) PASS: gdb.base/sigaltstack.exp: break catcher if level == INNER continue Continuing. Program received signal SIGALRM, Alarm clock. Program received signal SIGVTALRM, Virtual timer expired. Program exited with code 03. (gdb) FAIL: gdb.base/sigaltstack.exp: continue to catch (the program exited) ... Note that the variable has the same name as the enum: enum level { MAIN, OUTER, INNER, LEAF, NR_LEVELS }; /* Levels completed flag. */ volatile enum level level = NR_LEVELS; It boils down to this --- before the patch, running sigaltstack under gdb (run to main): (gdb) p level $1 = NR_LEVELS (gdb) ptype level type = volatile enum level {MAIN, OUTER, INNER, LEAF, NR_LEVELS} and after the patch: (gdb) p level Attempt to use a type name as an expression (gdb) ptype level type = volatile enum level {MAIN, OUTER, INNER, LEAF, NR_LEVELS} Here's the relevant dwarf: <1><44d>: Abbrev Number: 20 (DW_TAG_enumeration_type) <44e> DW_AT_name : (indirect string, offset: 0xe3): level <452> DW_AT_byte_size : 4 <453> DW_AT_decl_file : 1 <454> DW_AT_decl_line : 24 <455> DW_AT_sibling : <0x478> <2><459>: Abbrev Number: 21 (DW_TAG_enumerator) <45a> DW_AT_name : (indirect string, offset: 0x2be): MAIN <45e> DW_AT_const_value : 0 <2><45f>: Abbrev Number: 21 (DW_TAG_enumerator) <460> DW_AT_name : (indirect string, offset: 0x281): OUTER <464> DW_AT_const_value : 1 ... <1><5b7>: Abbrev Number: 31 (DW_TAG_variable) <5b8> DW_AT_name : (indirect string, offset: 0xe3): level <5bc> DW_AT_decl_file : 1 <5bd> DW_AT_decl_line : 27 <5be> DW_AT_type : <0x5cd> <5c2> DW_AT_external : 1 <5c3> DW_AT_location : 9 byte block: 3 48 10 60 0 0 0 0 0 (DW_OP_addr: 601048) <1><5cd>: Abbrev Number: 32 (DW_TAG_volatile_type) <5ce> DW_AT_name : (indirect string, offset: 0xe3): level <5d2> DW_AT_type : <0x44d> Below's the patch again: It's not clear to me why is it correct to treat DW_TAG_const_type and DW_TAG_volatile_type qualifiers as typedefs, though I haven't investigated this much yet. FYI, or in case it rings a bell... > Index: src/gdb/dwarf2read.c > =================================================================== > RCS file: /cvs/src/src/gdb/dwarf2read.c,v > retrieving revision 1.386 > diff -u -p -r1.386 dwarf2read.c > --- src/gdb/dwarf2read.c 17 May 2010 15:55:01 -0000 1.386 > +++ src/gdb/dwarf2read.c 21 May 2010 14:40:59 -0000 > @@ -3194,6 +3194,8 @@ process_die (struct die_info *die, struc > case DW_TAG_base_type: > case DW_TAG_subrange_type: > case DW_TAG_typedef: > + case DW_TAG_const_type: > + case DW_TAG_volatile_type: > /* Add a typedef symbol for the type definition, if it has a > DW_AT_name. */ > new_symbol (die, read_type_die (die, cu), cu); > @@ -8742,6 +8744,8 @@ new_symbol (struct die_info *die, struct > break; > case DW_TAG_base_type: > case DW_TAG_subrange_type: > + case DW_TAG_const_type: > + case DW_TAG_volatile_type: > SYMBOL_CLASS (sym) = LOC_TYPEDEF; > SYMBOL_DOMAIN (sym) = VAR_DOMAIN; > add_symbol_to_list (sym, cu->list_in_scope); -- Pedro Alves