From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30312 invoked by alias); 20 Jul 2010 15:42:35 -0000 Received: (qmail 30302 invoked by uid 22791); 20 Jul 2010 15:42:34 -0000 X-SWARE-Spam-Status: No, hits=-1.3 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN X-Spam-Check-By: sourceware.org Received: from mel.act-europe.fr (HELO mel.act-europe.fr) (212.99.106.210) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 20 Jul 2010 15:42:28 +0000 Received: from localhost (localhost [127.0.0.1]) by filtered-smtp.eu.adacore.com (Postfix) with ESMTP id 35A57CB0215; Tue, 20 Jul 2010 17:42:23 +0200 (CEST) Received: from mel.act-europe.fr ([127.0.0.1]) by localhost (smtp.eu.adacore.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Uif-zhcWiDWZ; Tue, 20 Jul 2010 17:42:23 +0200 (CEST) Received: from province.act-europe.fr (province.act-europe.fr [10.10.0.214]) by mel.act-europe.fr (Postfix) with ESMTP id 24E6BCB01D3; Tue, 20 Jul 2010 17:42:23 +0200 (CEST) Received: by province.act-europe.fr (Postfix, from userid 560) id 1471716488D; Tue, 20 Jul 2010 17:42:23 +0200 (CEST) Date: Tue, 20 Jul 2010 15:42:00 -0000 From: Jerome Guitton To: Tom Tromey Cc: gdb-patches@sourceware.org Subject: Re: [RFA] Nullified garbage-collected global variables Message-ID: <20100720154223.GA80443@adacore.com> References: <1278948088-15391-1-git-send-email-guitton@adacore.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.17 (2007-11-01) 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-07/txt/msg00301.txt.bz2 Tom Tromey (tromey@redhat.com): > >>>>> "Jerome" == Jerome Guitton writes: > > Jerome> * dwarf2read.c (add_partial_symbol): Do not add a global variable if > Jerome> its adress is null. Add comment to explain why. > > I am not totally sure about this. The patch itself looks reasonable, > but I have a couple of questions. > > Do you need to apply the same treatment to full symbols? What happens > if the psymtab is expanded for some other reason and a full symbol of > this sort is then created? Or is that already impossible? > > What about has_section_at_zero? Here is a new patch that should fix these issues. I have tested it on x86-linux, no regression. OK to apply? gdb/ChangeLog: * dwarf2read.c (add_partial_symbol): Do not add a global variable if its adress is null. Add comment to explain why. (new_symbol): Ditto. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 288d777..15926c6 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -3427,7 +3427,10 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) Don't enter into the minimal symbol tables as there is a minimal symbol table entry from the ELF symbols already. Enter into partial symbol table if it has a location - descriptor or a type. + descriptor or a type. A global variable may also have been + stripped out by the linker if unused, in which case its + address will be nullified; do not add such variables into + partial symbol table then. If the location descriptor is missing, new_symbol will create a LOC_UNRESOLVED symbol, the address of the variable will then be determined from the minimal symbol table whenever the variable @@ -3438,7 +3441,9 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) if (pdi->locdesc) addr = decode_locdesc (pdi->locdesc, cu); - if (pdi->locdesc || pdi->has_type) + if ((pdi->locdesc + && (addr || dwarf2_per_objfile->has_section_at_zero)) + || (!pdi->locdesc && pdi->has_type)) psym = add_psymbol_to_list (actual_name, strlen (actual_name), built_actual_name, VAR_DOMAIN, LOC_STATIC, @@ -9860,7 +9865,16 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) { var_decode_location (attr, sym, cu); attr2 = dwarf2_attr (die, DW_AT_external, cu); - if (attr2 && (DW_UNSND (attr2) != 0)) + if (SYMBOL_CLASS (sym) == LOC_STATIC + && SYMBOL_VALUE_ADDRESS (sym) == 0 + && !dwarf2_per_objfile->has_section_at_zero) + { + /* When a static variable is eliminated by the linker, + the corresponding debug information is not stripped + out, but the variable address is set to null; + do not add such variables into symbol table. */ + } + else if (attr2 && (DW_UNSND (attr2) != 0)) { struct pending **list_to_add;