From b0670cc0eb260ce182c7eb2c0b25bcc0b59a0e68 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 26 Jan 2017 22:45:57 +0100 Subject: [PATCH] re PR c++/79129 (ICE with -fdebug-types-section starting with r240578) PR debug/79129 * dwarf2out.c (generate_skeleton_bottom_up): For children with comdat_type_p set, just clone them, but keep the children in the original DIE. * g++.dg/debug/dwarf2/pr79129.C: New test. From-SVN: r244955 --- gcc/ChangeLog | 5 +++++ gcc/dwarf2out.c | 14 ++++++++++++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/debug/dwarf2/pr79129.C | 12 ++++++++++++ 4 files changed, 34 insertions(+) create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/pr79129.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 553cf5ee064..2dc64c6dcc0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2017-01-26 Jakub Jelinek + PR debug/79129 + * dwarf2out.c (generate_skeleton_bottom_up): For children with + comdat_type_p set, just clone them, but keep the children in the + original DIE. + PR debug/78835 * dwarf2out.c (prune_unused_types): Mark all functions with DIEs which have direct callers with -fvar-tracking-assignments enabled diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index f69c58850f3..1b2c04cc00a 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -7918,6 +7918,19 @@ generate_skeleton_bottom_up (skeleton_chain_node *parent) add_child_die (parent->new_die, c); c = prev; } + else if (c->comdat_type_p) + { + /* This is the skeleton of earlier break_out_comdat_types + type. Clone the existing DIE, but keep the children + under the original (which is in the main CU). */ + dw_die_ref clone = clone_die (c); + + replace_child (c, clone, prev); + generate_skeleton_ancestor_tree (parent); + add_child_die (parent->new_die, c); + c = clone; + continue; + } else { /* Clone the existing DIE, move the original to the skeleton @@ -7936,6 +7949,7 @@ generate_skeleton_bottom_up (skeleton_chain_node *parent) replace_child (c, clone, prev); generate_skeleton_ancestor_tree (parent); add_child_die (parent->new_die, c); + node.old_die = clone; node.new_die = c; c = clone; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bec6f154d4b..4d427fa9689 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2017-01-26 Jakub Jelinek + PR debug/79129 + * g++.dg/debug/dwarf2/pr79129.C: New test. + PR debug/78835 * g++.dg/debug/dwarf2/pr78835.C: New test. diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr79129.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr79129.C new file mode 100644 index 00000000000..a1ffd3d8246 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr79129.C @@ -0,0 +1,12 @@ +/* PR debug/79129 */ +/* { dg-do compile } */ +/* { dg-options "-gdwarf-4 -O2 -fdebug-types-section" } */ + +struct B +{ + struct A { void foo (int &); }; + A *bar (); + ~B () { int a = 1; bar ()->foo (a); } +}; +struct C { ~C (); B c; }; +C::~C () {} -- 2.30.2