From: Ulrich Weigand Date: Fri, 26 Mar 2010 18:05:46 +0000 (+0000) Subject: ChangeLog: X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=907af001f77f9dee04ecb77a6cb0d21a55850033;p=binutils-gdb.git 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". --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7cfac07ae66..5effdf36729 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2010-03-26 Ulrich Weigand + + * 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. + 2010-03-26 Ulrich Weigand * breakpoint.c (bpstat_clear_actions): Reset bs->commands_left. diff --git a/gdb/completer.c b/gdb/completer.c index 53275c0e73a..e678fb1b20c 100644 --- a/gdb/completer.c +++ b/gdb/completer.c @@ -401,7 +401,7 @@ add_struct_fields (struct type *type, int *nextp, char **output, computed_type_name = 1; } /* Omit constructors from the completion list. */ - if (type_name && strcmp (type_name, name)) + if (!type_name || strcmp (type_name, name)) { output[*nextp] = xstrdup (name); ++*nextp; diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 4de07976f73..298703912fa 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 diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 08946f3f2db..d506e1ac212 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2010-03-26 Ulrich Weigand + + * 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". + 2010-03-26 Pedro Alves * gdb.trace/tfile.c (tohex, bin2hex): New. diff --git a/gdb/testsuite/gdb.cp/inherit.exp b/gdb/testsuite/gdb.cp/inherit.exp index b3bfea28a17..a593bc6b984 100644 --- a/gdb/testsuite/gdb.cp/inherit.exp +++ b/gdb/testsuite/gdb.cp/inherit.exp @@ -114,6 +114,11 @@ proc test_ptype_si { } { # gcc 3.4.1 -gstabs+ pass "$name" } + -re "No symbol \"tagless_struct\" in current context.$nl$gdb_prompt $" { + # Several GCC 4.x versions provide neither a DW_TAG_typedef DIE + # nor use the typedef name as struct tag name. + xfail "$name" + } } set name "ptype variable of type tagless struct" @@ -490,25 +495,20 @@ proc test_print_anon_union {} { set name "print variable of type anonymous union" gdb_test_multiple "print g_anon_union" $name { - -re "$vhn = \{one = 1, \{a = 2, b = 2\}\}$nl$gdb_prompt $" { + -re "$vhn = \{one = 1, \{a = 2, b = \[0-9\]+\}\}$nl$gdb_prompt $" { pass $name } } - # The nested union prints as a multi-line field, but the class body - # scanner is inherently line-oriented. This is ugly but it works. - - cp_test_ptype_class \ - "ptype g_anon_union" "print type of anonymous union" \ - "class" "class_with_anon_union" \ - { - { field public "int one;" } - { field public "union \{" } - { field public "int a;" } - { field public "long int b;" } - { field public "\};" } + set name "print type of anonymous union" + set re_tag "class_with_anon_union" + set re_class "(class $re_tag \{${ws}public:|struct $re_tag\{)" + set re_fields "int one;${ws}union \{${ws}int a;${ws}long( int)? b;${ws}\};" + gdb_test_multiple "ptype g_anon_union" $name { + -re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" { + pass $name } - + } }