Patchwork dwarf2out PATCH for debug/53235

login
register
mail settings
Submitter Jason Merrill
Date May 13, 2012, 3:38 a.m.
Message ID <4FAF2CC8.90309@redhat.com>
Download mbox | patch
Permalink /patch/158801/
State New
Headers show

Comments

Jason Merrill - May 13, 2012, 3:38 a.m.
According to discussion in the PR, GDB would prefer a 
DW_TAG_structure_type with DW_AT_signature to a DW_TAG_typedef with 
DW_AT_type when the type in question is a class.  I haven't been able to 
reproduce the failure with current GDB, but it passes the testsuite 
after the change as well.

Tested x86_64-pc-linux-gnu, applied to trunk.

Patch

commit d03ef85f43045bd98e0b6c0e2c811896fbc10a3f
Author: Jason Merrill <jason@redhat.com>
Date:   Tue May 8 06:15:13 2012 -0400

    	PR debug/53235
    	* dwarf2out.c (build_local_stub): Prefer DW_AT_signature for
    	comdat types.

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 1e5e335..9ba65fb 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -6929,36 +6929,31 @@  static int
 build_local_stub (void **slot, void *data)
 {
   struct external_ref *ref_p = (struct external_ref *)*slot;
-  dw_die_ref cu = (dw_die_ref) data;
-  dw_die_ref type = ref_p->type;
-  dw_die_ref stub = NULL;
 
-  if (ref_p->stub == NULL && ref_p->n_refs > 1)
+  if (ref_p->stub == NULL && ref_p->n_refs > 1 && !dwarf_strict)
     {
-      if (!dwarf_strict)
+      /* We have multiple references to this type, so build a small stub.
+	 Both of these forms are a bit dodgy from the perspective of the
+	 DWARF standard, since technically they should have names.  */
+      dw_die_ref cu = (dw_die_ref) data;
+      dw_die_ref type = ref_p->type;
+      dw_die_ref stub = NULL;
+
+      if (type->comdat_type_p)
 	{
-	  /* If we aren't being strict, use a typedef with no name
-	     to just forward to the real type.  In strict DWARF, a
-	     typedef must have a name.  */
-	  stub = new_die (DW_TAG_typedef, cu, NULL_TREE);
-	  add_AT_die_ref (stub, DW_AT_type, type);
-	}
-      else if (type->comdat_type_p)
-	{
-	  /* If we refer to this type via sig8, we can use a simple
-	     declaration; this is larger than the typedef, but strictly
-	     correct.  */
+	  /* If we refer to this type via sig8, use AT_signature.  */
 	  stub = new_die (type->die_tag, cu, NULL_TREE);
-	  add_AT_string (stub, DW_AT_name, get_AT_string (type, DW_AT_name));
-	  add_AT_flag (stub, DW_AT_declaration, 1);
 	  add_AT_die_ref (stub, DW_AT_signature, type);
 	}
-
-      if (stub)
+      else
 	{
-	  stub->die_mark++;
-	  ref_p->stub = stub;
+	  /* Otherwise, use a typedef with no name.  */
+	  stub = new_die (DW_TAG_typedef, cu, NULL_TREE);
+	  add_AT_die_ref (stub, DW_AT_type, type);
 	}
+
+      stub->die_mark++;
+      ref_p->stub = stub;
     }
   return 1;
 }