From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16995 invoked by alias); 19 Jul 2010 15:28:18 -0000 Received: (qmail 16986 invoked by uid 22791); 19 Jul 2010 15:28:16 -0000 X-SWARE-Spam-Status: No, hits=-5.3 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 19 Jul 2010 15:28:11 +0000 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id o6JFS9IY013975 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 19 Jul 2010 11:28:10 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id o6JFS9jO032157 for ; Mon, 19 Jul 2010 11:28:09 -0400 Received: from [10.15.16.129] (dhcp-10-15-16-129.yyz.redhat.com [10.15.16.129]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id o6JFS96K019757 for ; Mon, 19 Jul 2010 11:28:09 -0400 Message-ID: <4C446F09.50107@redhat.com> Date: Mon, 19 Jul 2010 15:28:00 -0000 From: sami wagiaalla User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.10) Gecko/20100621 Fedora/3.0.5-1.fc13 Thunderbird/3.0.5 MIME-Version: 1.0 To: gdb-patches@sourceware.org Subject: [patch] Defer symbol addition until construction is complete Content-Type: multipart/mixed; boundary="------------090505020106040805000805" 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-07/txt/msg00283.txt.bz2 This is a multi-part message in MIME format. --------------090505020106040805000805 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 346 In new_symbol adding the symbol to the pending symbol list is performed at various times and it is added to various lists making uniform treatment of of symbols at addition point difficult. This patch unifies the addition point and defers it to the end of construction. Tested by running the testsuit on Fedora 13 with gcc 4.4.4 on x8664. --------------090505020106040805000805 Content-Type: text/plain; name="defer_symbol_addtion.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="defer_symbol_addtion.patch" Content-length: 6102 Complete symbol construction before adding to pending list. 2010-07-13 Sami Wagiaalla * dwarf2read.c (new_symbol): Add symbol to variable list at end of fucntion after symbol construction is complete. diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 622331e..a8692ea 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -8651,6 +8651,8 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) struct attribute *attr = NULL; struct attribute *attr2 = NULL; CORE_ADDR baseaddr; + struct pending **list_to_add = NULL; + int inlined_func = (die->tag == DW_TAG_inlined_subroutine); baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); @@ -8738,11 +8740,11 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) access them globally. For instance, we want to be able to break on a nested subprogram without having to specify the context. */ - add_symbol_to_list (sym, &global_symbols); + list_to_add = &global_symbols; } else { - add_symbol_to_list (sym, cu->list_in_scope); + list_to_add = cu->list_in_scope; } break; case DW_TAG_inlined_subroutine: @@ -8767,9 +8769,9 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) dwarf2_const_value (attr, sym, cu); attr2 = dwarf2_attr (die, DW_AT_external, cu); if (attr2 && (DW_UNSND (attr2) != 0)) - add_symbol_to_list (sym, &global_symbols); + list_to_add = &global_symbols; else - add_symbol_to_list (sym, cu->list_in_scope); + list_to_add = cu->list_in_scope; break; } attr = dwarf2_attr (die, DW_AT_location, cu); @@ -8779,7 +8781,6 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) attr2 = dwarf2_attr (die, DW_AT_external, cu); if (attr2 && (DW_UNSND (attr2) != 0)) { - struct pending **list_to_add; /* Workaround gfortran PR debug/40040 - it uses DW_AT_location for variables in -fPIC libraries which may @@ -8799,10 +8800,9 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) but it may be block-scoped. */ list_to_add = (cu->list_in_scope == &file_symbols ? &global_symbols : cu->list_in_scope); - add_symbol_to_list (sym, list_to_add); } else - add_symbol_to_list (sym, cu->list_in_scope); + list_to_add = cu->list_in_scope; } else { @@ -8816,21 +8816,18 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) if (attr2 && (DW_UNSND (attr2) != 0) && dwarf2_attr (die, DW_AT_type, cu) != NULL) { - struct pending **list_to_add; - /* A variable with DW_AT_external is never static, but it may be block-scoped. */ list_to_add = (cu->list_in_scope == &file_symbols ? &global_symbols : cu->list_in_scope); SYMBOL_CLASS (sym) = LOC_UNRESOLVED; - add_symbol_to_list (sym, list_to_add); } else if (!die_is_declaration (die, cu)) { /* Use the default LOC_OPTIMIZED_OUT class. */ gdb_assert (SYMBOL_CLASS (sym) == LOC_OPTIMIZED_OUT); - add_symbol_to_list (sym, cu->list_in_scope); + list_to_add = cu->list_in_scope; } } break; @@ -8862,7 +8859,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) SYMBOL_TYPE (sym) = ref_type; } - add_symbol_to_list (sym, cu->list_in_scope); + list_to_add = cu->list_in_scope; break; case DW_TAG_unspecified_parameters: /* From varargs functions; gdb doesn't seem to have any @@ -8887,14 +8884,10 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) saves you. See the OtherFileClass tests in gdb.c++/namespace.exp. */ - struct pending **list_to_add; - list_to_add = (cu->list_in_scope == &file_symbols && (cu->language == language_cplus || cu->language == language_java) ? &global_symbols : cu->list_in_scope); - - add_symbol_to_list (sym, list_to_add); /* The semantics of C++ state that "struct foo { ... }" also defines a typedef for "foo". A Java class declaration also @@ -8914,7 +8907,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) case DW_TAG_typedef: SYMBOL_CLASS (sym) = LOC_TYPEDEF; SYMBOL_DOMAIN (sym) = VAR_DOMAIN; - add_symbol_to_list (sym, cu->list_in_scope); + list_to_add = cu->list_in_scope; break; case DW_TAG_base_type: case DW_TAG_subrange_type: @@ -8922,7 +8915,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) case DW_TAG_volatile_type: SYMBOL_CLASS (sym) = LOC_TYPEDEF; SYMBOL_DOMAIN (sym) = VAR_DOMAIN; - add_symbol_to_list (sym, cu->list_in_scope); + list_to_add = cu->list_in_scope; break; case DW_TAG_enumerator: attr = dwarf2_attr (die, DW_AT_const_value, cu); @@ -8934,19 +8927,16 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) /* NOTE: carlton/2003-11-10: See comment above in the DW_TAG_class_type, etc. block. */ - struct pending **list_to_add; - list_to_add = (cu->list_in_scope == &file_symbols && (cu->language == language_cplus || cu->language == language_java) ? &global_symbols : cu->list_in_scope); - add_symbol_to_list (sym, list_to_add); } break; case DW_TAG_namespace: SYMBOL_CLASS (sym) = LOC_TYPEDEF; - add_symbol_to_list (sym, &global_symbols); + list_to_add = &global_symbols; break; default: /* Not a tag we recognize. Hopefully we aren't processing @@ -8958,6 +8948,9 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu) break; } + if (list_to_add != NULL) + add_symbol_to_list (sym, list_to_add); + /* For the benefit of old versions of GCC, check for anonymous namespaces based on the demangled name. */ if (!processing_has_namespace_info --------------090505020106040805000805--