]> gcc.gnu.org Git - gcc.git/commitdiff
re PR debug/53235 (20120504 broke -fdebug-types-section)
authorJason Merrill <jason@redhat.com>
Sun, 13 May 2012 03:37:38 +0000 (23:37 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sun, 13 May 2012 03:37:38 +0000 (23:37 -0400)
PR debug/53235
* dwarf2out.c (build_local_stub): Prefer DW_AT_signature for
comdat types.

From-SVN: r187435

gcc/ChangeLog
gcc/dwarf2out.c

index 355ae3a049e1bf6a07626fdb64c037299c5900b8..305bd5c5819fec763f067a07f9db7d77a937aa71 100644 (file)
@@ -1,3 +1,9 @@
+2012-05-12  Jason Merrill  <jason@redhat.com>
+
+       PR debug/53235
+       * dwarf2out.c (build_local_stub): Prefer DW_AT_signature for
+       comdat types.
+
 2012-05-12  Eric Botcazou  <ebotcazou@adacore.com>
 
        * function.c (requires_stack_frame_p): If the function can throw
index 1e5e335cdb30368aafec73160f3bba56e82deb8b..9ba65fb8bac4085cd018bcb869de7652e8de637d 100644 (file)
@@ -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)
-       {
-         /* 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)
+      /* 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 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;
 }
This page took 0.119278 seconds and 5 git commands to generate.