aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSami Wagiaalla <swagiaal@redhat.com>2010-08-09 20:34:06 +0000
committerSami Wagiaalla <swagiaal@redhat.com>2010-08-09 20:34:06 +0000
commite37fd15a52f02219b85b4d4a27973c7be1ee9951 (patch)
tree19e01336b4a32f3c3bcd4f85d9e338f455f57117
parent45c58896fccae96ae023059410027791537cb285 (diff)
downloadgdb-e37fd15a52f02219b85b4d4a27973c7be1ee9951.zip
gdb-e37fd15a52f02219b85b4d4a27973c7be1ee9951.tar.gz
gdb-e37fd15a52f02219b85b4d4a27973c7be1ee9951.tar.bz2
Complete symbol construction before adding to pending list.
2010-08-09 Sami Wagiaalla <swagiaal@redhat.com> * dwarf2read.c (new_symbol): Add symbol to variable list at end of function after symbol construction is complete. Do the same for template symbol addition to template_symbols list.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/dwarf2read.c73
2 files changed, 31 insertions, 48 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index d0522f8..d85f913 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,11 @@
2010-08-09 Sami Wagiaalla <swagiaal@redhat.com>
+ * dwarf2read.c (new_symbol): Add symbol to variable list at end of
+ function after symbol construction is complete.
+ Do the same for template symbol addition to template_symbols list.
+
+2010-08-09 Sami Wagiaalla <swagiaal@redhat.com>
+
* symtab.c (symbol_get_demangled_name): Remove assertion and
return NULL when language_specific.cplus_specific is not initialized.
* stabsread.c (define_symbol): Set the name before calling
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index aecd042..78491c8 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -9996,6 +9996,8 @@ new_symbol_full (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));
@@ -10088,11 +10090,11 @@ new_symbol_full (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:
@@ -10129,17 +10131,12 @@ new_symbol_full (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 (suppress_add)
- {
- sym->hash_next = objfile->template_symbols;
- objfile->template_symbols = sym;
- }
- else
+ if (!suppress_add)
{
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;
}
@@ -10159,8 +10156,6 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
}
else 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
get overriden by other libraries/executable and get
@@ -10179,10 +10174,9 @@ new_symbol_full (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
{
@@ -10196,33 +10190,19 @@ new_symbol_full (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;
- if (suppress_add)
- {
- sym->hash_next = objfile->template_symbols;
- objfile->template_symbols = sym;
- }
- else
- 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);
- if (suppress_add)
- {
- sym->hash_next = objfile->template_symbols;
- objfile->template_symbols = sym;
- }
- else
- add_symbol_to_list (sym, cu->list_in_scope);
+ if (!suppress_add)
+ list_to_add = cu->list_in_scope;
}
}
break;
@@ -10254,7 +10234,7 @@ new_symbol_full (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
@@ -10282,21 +10262,12 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
saves you. See the OtherFileClass tests in
gdb.c++/namespace.exp. */
- if (suppress_add)
+ if (!suppress_add)
{
- sym->hash_next = objfile->template_symbols;
- objfile->template_symbols = sym;
- }
- else
- {
- 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
@@ -10317,13 +10288,13 @@ new_symbol_full (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:
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);
@@ -10335,19 +10306,15 @@ new_symbol_full (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
@@ -10359,6 +10326,16 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
break;
}
+ if (suppress_add)
+ {
+ sym->hash_next = objfile->template_symbols;
+ objfile->template_symbols = sym;
+ list_to_add = NULL;
+ }
+
+ 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