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