From acebe513da394dadf74e768cedb76c192b22a93f Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Mon, 22 Mar 2010 13:21:39 +0000 Subject: [PATCH] * dwarf2read.c (partial_die_parent_scope): Work around buggy GCC 4.1 debug info generation (GCC PR c++/28460). (determine_prefix): Likewise. --- gdb/ChangeLog | 6 ++++++ gdb/dwarf2read.c | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6507b66274..c081aa6d1f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2010-03-22 Ulrich Weigand + + * dwarf2read.c (partial_die_parent_scope): Work around buggy + GCC 4.1 debug info generation (GCC PR c++/28460). + (determine_prefix): Likewise. + 2010-03-20 Daniel Jacobowitz * tui/tui-disasm.c (tui_get_begin_asm_address): Default to diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 92cda0e600..ed7923e995 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -2307,6 +2307,19 @@ partial_die_parent_scope (struct partial_die_info *pdi, grandparent_scope = partial_die_parent_scope (parent, cu); + /* GCC 4.0 and 4.1 had a bug (PR c++/28460) where they generated bogus + DW_TAG_namespace DIEs with a name of "::" for the global namespace. + Work around this problem here. */ + if (cu->language == language_cplus + && parent->tag == DW_TAG_namespace + && strcmp (parent->name, "::") == 0 + && grandparent_scope == NULL) + { + parent->scope = NULL; + parent->scope_set = 1; + return NULL; + } + if (parent->tag == DW_TAG_namespace || parent->tag == DW_TAG_structure_type || parent->tag == DW_TAG_class_type @@ -9029,6 +9042,12 @@ determine_prefix (struct die_info *die, struct dwarf2_cu *cu) { case DW_TAG_namespace: parent_type = read_type_die (parent, cu); + /* GCC 4.0 and 4.1 had a bug (PR c++/28460) where they generated bogus + DW_TAG_namespace DIEs with a name of "::" for the global namespace. + Work around this problem here. */ + if (cu->language == language_cplus + && strcmp (TYPE_TAG_NAME (parent_type), "::") == 0) + return ""; /* We give a name to even anonymous namespaces. */ return TYPE_TAG_NAME (parent_type); case DW_TAG_class_type: