Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: "Ulrich Weigand" <uweigand@de.ibm.com>
To: tromey@redhat.com
Cc: gdb-patches@sourceware.org
Subject: Re: [rfc] Work around invalid G++ DWARF for unnamed aggregates
Date: Fri, 26 Mar 2010 18:07:00 -0000	[thread overview]
Message-ID: <201003261807.o2QI7ihN030662@d12av02.megacenter.de.ibm.com> (raw)
In-Reply-To: <m3k4t0dv93.fsf@fleche.redhat.com> from "Tom Tromey" at Mar 25, 2010 02:03:20 PM

Tom Tromey wrote:
> >>>>> "Ulrich" == Ulrich Weigand <uweigand@de.ibm.com> writes:
> 
> Ulrich> It should be easy to work around this problem with older GCC
> Ulrich> versions by simply ignoring DW_AT_name attributes with such
> Ulrich> names in dwarf2_name.  The patch below implements this.  It also
> Ulrich> fixes a logic bug in completer.c exposed by this change, where
> Ulrich> in an unnamed struct *every* method was considered to be a
> Ulrich> constructor (instead of none).
> [...]
> Ulrich> Does this look reasonable?
> 
> FWIW, yes, it looks reasonable to me.

Thanks for having a look!

Due to a conflict with Keith's recent patch, I've had to rework the
dwarf2_name change a bit.  Updated patch below.

Retested on powerpc64-linux.  Committed to mainline.

Bye,
Ulrich


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".


Index: gdb/completer.c
===================================================================
RCS file: /cvs/src/src/gdb/completer.c,v
retrieving revision 1.36
diff -u -r1.36 completer.c
--- gdb/completer.c	1 Jan 2010 07:31:30 -0000	1.36
+++ gdb/completer.c	26 Mar 2010 13:57:55 -0000
@@ -401,7 +401,7 @@
 	      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;
Index: gdb/dwarf2read.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2read.c,v
retrieving revision 1.374
diff -u -r1.374 dwarf2read.c
--- gdb/dwarf2read.c	25 Mar 2010 22:13:15 -0000	1.374
+++ gdb/dwarf2read.c	26 Mar 2010 13:57:57 -0000
@@ -9187,6 +9187,7 @@
       /* 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 "<init>", so return
 	 the class name when we see this special case.  */
@@ -9214,17 +9215,33 @@
 	    }
 	  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 "<anonymous struct>" or "<anonymous union>" 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), "<anonymous", 10) == 0)
+	return NULL;
+      break;
+
     default:
-      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);
+      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
Index: gdb/testsuite/gdb.cp/inherit.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.cp/inherit.exp,v
retrieving revision 1.15
diff -u -r1.15 inherit.exp
--- gdb/testsuite/gdb.cp/inherit.exp	1 Jan 2010 07:32:01 -0000	1.15
+++ gdb/testsuite/gdb.cp/inherit.exp	26 Mar 2010 13:57:57 -0000
@@ -114,6 +114,11 @@
 	    # 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 @@
 
     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
 	}
-
+    }
 }
 
 


-- 
  Dr. Ulrich Weigand
  GNU Toolchain for Linux on System z and Cell BE
  Ulrich.Weigand@de.ibm.com


  reply	other threads:[~2010-03-26 18:07 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-03-25 10:22 Ulrich Weigand
2010-03-25 20:03 ` Tom Tromey
2010-03-26 18:07   ` Ulrich Weigand [this message]
2010-04-06 12:50     ` [commit] Fix typo (Re: [rfc] Work around invalid G++ DWARF for unnamed aggregates) Ulrich Weigand

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201003261807.o2QI7ihN030662@d12av02.megacenter.de.ibm.com \
    --to=uweigand@de.ibm.com \
    --cc=gdb-patches@sourceware.org \
    --cc=tromey@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox