Comments
Patch
@@ -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),
new file mode 100644
@@ -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;
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.