From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7618 invoked by alias); 10 Oct 2002 20:26:28 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 7609 invoked from network); 10 Oct 2002 20:26:25 -0000 Received: from unknown (HELO zenia.red-bean.com) (66.244.67.22) by sources.redhat.com with SMTP; 10 Oct 2002 20:26:25 -0000 Received: (from jimb@localhost) by zenia.red-bean.com (8.11.6/8.11.6) id g9AK9BH17528; Thu, 10 Oct 2002 15:09:11 -0500 To: David Edelsohn Cc: gdb-patches@sources.redhat.com Subject: Re: [PATCH] C++ Dwarf2 inner scope PR/789 References: <200210080410.AAA29076@makai.watson.ibm.com> From: Jim Blandy Date: Thu, 10 Oct 2002 13:26:00 -0000 In-Reply-To: <200210080410.AAA29076@makai.watson.ibm.com> Message-ID: User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2.90 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2002-10/txt/msg00218.txt.bz2 Could you provide a test case for this? David Edelsohn writes: > While debugging a C++ application compiled with g++-3.2 and Dwarf2 > debugging information, we discovered that some functions would not have > any symbols available. This problem occurs when a method is defined > inside a class-local function and prevents any symbols from appearing. > > We traced this back to gdb/dwarf2read.c:read_func_scope(). That > function is called recursively for the inner scope, but it currently is > written to always pop back to file scope instead of the previous scope. > The appended patch saves the current scope in a local variable on the > stack and restores that scope after parsing the inner scope. This allows > global symbols to be seen, but we still have not been able to fix the > innermost scope problem. > > Thanks, David > > > --- dwarf2read.c.orig Sun Oct 6 15:00:32 2002 > +++ dwarf2read.c Sun Oct 6 14:05:39 2002 > @@ -1663,6 +1663,7 @@ read_func_scope (struct die_info *die, s > struct die_info *child_die; > struct attribute *attr; > char *name; > + struct pending **prev_list_in_scope; > > name = dwarf2_linkage_name (die); > > @@ -1704,6 +1705,7 @@ read_func_scope (struct die_info *die, s > > new = push_context (0, lowpc); > new->name = new_symbol (die, die->type, objfile, cu_header); > + prev_list_in_scope = list_in_scope; > list_in_scope = &local_symbols; > > if (die->has_children) > @@ -1720,7 +1722,10 @@ read_func_scope (struct die_info *die, s > /* Make a block for the local symbols within. */ > finish_block (new->name, &local_symbols, new->old_blocks, > lowpc, highpc, objfile); > - list_in_scope = &file_symbols; > + > + local_symbols = new->locals; > + param_symbols = new->params; > + list_in_scope = prev_list_in_scope; > } > > /* Process all the DIES contained within a lexical block scope. Start