From 907af001f77f9dee04ecb77a6cb0d21a55850033 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Fri, 26 Mar 2010 18:05:46 +0000 Subject: ChangeLog: * dwarf2read.c (dwarf2_name): Work around GCC bugzilla debug/41828 by ignoring spurious DW_AT_name attributes for unnamed structs or unions. * completer.c (add_struct_fields): Fix inverted logic. testsuite/ChangeLog: * gdb.cp/inherit.exp (test_ptype_si): XFAIL test for GCC versions that do not provide the tagless_struct type name at all. (test_print_anon_union): Do not check value of uninitialized union member. Do not use cp_test_ptype_class, so we can accept "long" as well as "long int". --- gdb/dwarf2read.c | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) (limited to 'gdb/dwarf2read.c') diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 4de0797..2987039 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -9187,6 +9187,7 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu) /* These tags always have simple identifiers already; no need to canonicalize them. */ return DW_STRING (attr); + case DW_TAG_subprogram: /* Java constructors will all be named "", so return the class name when we see this special case. */ @@ -9214,17 +9215,33 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu) } while (die->tag != DW_TAG_compile_unit); } - /* fall through */ + break; + + case DW_TAG_class_type: + case DW_TAG_interface_type: + case DW_TAG_structure_type: + case DW_TAG_union_type: + /* Some GCC versions emit spurious DW_AT_name attributes for unnamed + structures or unions. These were of the form "._%d" in GCC 4.1, + or simply "" or "" in GCC 4.3 + and GCC 4.4. We work around this problem by ignoring these. */ + if (strncmp (DW_STRING (attr), "._", 2) == 0 + || strncmp (DW_STRING (attr), "objfile->objfile_obstack); - DW_STRING_IS_CANONICAL (attr) = 1; - } - return DW_STRING (attr); + break; + } + + if (!DW_STRING_IS_CANONICAL (attr)) + { + DW_STRING (attr) + = dwarf2_canonicalize_name (DW_STRING (attr), cu, + &cu->objfile->objfile_obstack); + DW_STRING_IS_CANONICAL (attr) = 1; } + return DW_STRING (attr); } /* Return the die that this die in an extension of, or NULL if there -- cgit v1.1