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
This commit is contained in:
Jakub Jelinek 2017-01-26 22:45:57 +01:00 committed by Jakub Jelinek
parent f7c06c0f99
commit b0670cc0eb
4 changed files with 34 additions and 0 deletions

View File

@ -1,5 +1,10 @@
2017-01-26 Jakub Jelinek <jakub@redhat.com>
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

View File

@ -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;
}

View File

@ -1,5 +1,8 @@
2017-01-26 Jakub Jelinek <jakub@redhat.com>
PR debug/79129
* g++.dg/debug/dwarf2/pr79129.C: New test.
PR debug/78835
* g++.dg/debug/dwarf2/pr78835.C: New test.

View File

@ -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 () {}