Patchwork Fix debug/45171

login
register
mail settings
Submitter Richard Henderson
Date Aug. 4, 2010, 11:40 p.m.
Message ID <4C59FA70.8090206@redhat.com>
Download mbox | patch
Permalink /patch/60903/
State New
Headers show

Comments

Richard Henderson - Aug. 4, 2010, 11:40 p.m.
Following 

2010-05-25  Dodji Seketeli  <dodji@redhat.com>

        PR c++/44188
        * c-common.c (is_typedef_decl): Move this definition ...
        * tree.c (is_typedef_decl): ... here.
        (typdef_variant_p): Move definition here from gcc/cp/tree.c.
        * c-common.h (is_typedef_decl): Move this declaration ...
        * tree.h (is_typedef_decl): ... here.
        (typedef_variant_p): Move declaration here from gcc/cp/cp-tree.h
        * dwarf2out.c (is_naming_typedef_decl): New function.
        (gen_tagged_type_die): Split out of ...
        (gen_type_die_with_usage): ... this function. When an anonymous
        tagged type is named by a typedef, make sure a DW_TAG_typedef DIE
        is emitted for the typedef.
        (gen_typedef_die): Emit DW_TAG_typedef also for typedefs naming
        anonymous tagged types.

The test case shows a path through gen_typedef_die for which the unnamed
type had already been emitted.  "Emitting" it again results in duplicate
attributes being added to the existing die.

In the future, I hope that we can (optionally) incorporate dwarflint into
the gcc testsuite, at least within dwarf2.exp.  Talking with Roland, it
isn't quite ready for that yet.

Tested on x86_64-linux.


r~
commit 27fead82006aba0eb90dd61e2195e4463ba70708
Author: Richard Henderson <rth@twiddle.net>
Date:   Wed Aug 4 16:29:16 2010 -0700

        PR debug/45171
        * dwarf2out.c (gen_typedef_die): Don't re-generate the die of
        an is_naming_typedef_decl.

Patch

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 95de468..651642a 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -19785,22 +19785,24 @@  gen_typedef_die (tree decl, dw_die_ref context_die)
 	  type = TREE_TYPE (decl);
 
 	  if (is_naming_typedef_decl (TYPE_NAME (type)))
-	    /* 
-	       Here, we are in the case of decl being a typedef naming
-	       an anonymous type, e.g:
+	    {
+	      /* Here, we are in the case of decl being a typedef naming
+	         an anonymous type, e.g:
 	             typedef struct {...} foo;
-	       In that case TREE_TYPE (decl) is not a typedef variant
-	       type and TYPE_NAME of the anonymous type is set to the
-	       TYPE_DECL of the typedef. This construct is emitted by
-	       the C++ FE.
-
-	       TYPE is the anonymous struct named by the typedef
-	       DECL. As we need the DW_AT_type attribute of the
-	       DW_TAG_typedef to point to the DIE of TYPE, let's
-	       generate that DIE right away. add_type_attribute
-	       called below will then pick (via lookup_type_die) that
-	       anonymous struct DIE.  */
-	    gen_tagged_type_die (type, context_die, DINFO_USAGE_DIR_USE);
+	         In that case TREE_TYPE (decl) is not a typedef variant
+	         type and TYPE_NAME of the anonymous type is set to the
+	         TYPE_DECL of the typedef. This construct is emitted by
+	         the C++ FE.
+
+	         TYPE is the anonymous struct named by the typedef
+	         DECL. As we need the DW_AT_type attribute of the
+	         DW_TAG_typedef to point to the DIE of TYPE, let's
+	         generate that DIE right away. add_type_attribute
+	         called below will then pick (via lookup_type_die) that
+	         anonymous struct DIE.  */
+	      if (!TREE_ASM_WRITTEN (type))
+	        gen_tagged_type_die (type, context_die, DINFO_USAGE_DIR_USE);
+	    }
 	}
 
       add_type_attribute (type_die, type, TREE_READONLY (decl),
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C b/gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C
new file mode 100644
index 0000000..2879f60
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C
@@ -0,0 +1,10 @@ 
+// Origin: PR debug/45171
+// { dg-options "-g -dA -fno-eliminate-unused-debug-types" }
+// { dg-do compile }
+
+// There should be 2 real instances of byte_size -- one for the
+// struct and one for "int".  The other two instances are from
+// the comments in the .debug_abbrev section.
+// { dg-final { scan-assembler-times "DW_AT_byte_size" 4 } }
+
+typedef struct { int a, b; } x;