re PR debug/78835 (ICE with -fdebug-types-section and member function)

PR debug/78835
	* dwarf2out.c (prune_unused_types): Mark all functions with DIEs
	which have direct callers with -fvar-tracking-assignments enabled
	in the current TU.
	(resolve_addr): Avoid adding skeleton DIEs for DW_AT_call_origin
	inside of type units.

	* g++.dg/debug/dwarf2/pr78835.C: New test.

From-SVN: r244954
This commit is contained in:
Jakub Jelinek 2017-01-26 22:44:49 +01:00 committed by Jakub Jelinek
parent 5d93da1d11
commit f7c06c0f99
4 changed files with 65 additions and 10 deletions

View File

@ -1,3 +1,12 @@
2017-01-26 Jakub Jelinek <jakub@redhat.com>
PR debug/78835
* dwarf2out.c (prune_unused_types): Mark all functions with DIEs
which have direct callers with -fvar-tracking-assignments enabled
in the current TU.
(resolve_addr): Avoid adding skeleton DIEs for DW_AT_call_origin
inside of type units.
2017-01-26 Martin Sebor <msebor@redhat.com>
PR middle-end/78703

View File

@ -27793,6 +27793,25 @@ prune_unused_types (void)
for (i = 0; base_types.iterate (i, &base_type); i++)
prune_unused_types_mark (base_type, 1);
/* For -fvar-tracking-assignments, also set the mark on nodes that could be
referenced by DW_TAG_call_site DW_AT_call_origin (i.e. direct call
callees). */
cgraph_node *cnode;
FOR_EACH_FUNCTION (cnode)
if (cnode->referred_to_p (false))
{
dw_die_ref die = lookup_decl_die (cnode->decl);
if (die == NULL || die->die_mark)
continue;
for (cgraph_edge *e = cnode->callers; e; e = e->next_caller)
if (e->caller != cnode
&& opt_for_fn (e->caller->decl, flag_var_tracking_assignments))
{
prune_unused_types_mark (die, 1);
break;
}
}
if (debug_str_hash)
debug_str_hash->empty ();
if (skeleton_debug_str_hash)
@ -28693,6 +28712,16 @@ resolve_addr (dw_die_ref die)
&& DECL_EXTERNAL (tdecl)
&& DECL_ABSTRACT_ORIGIN (tdecl) == NULL_TREE
&& (cdie = lookup_context_die (DECL_CONTEXT (tdecl))))
{
dw_die_ref pdie = cdie;
/* Make sure we don't add these DIEs into type units.
We could emit skeleton DIEs for context (namespaces,
outer structs/classes) and a skeleton DIE for the
innermost context with DW_AT_signature pointing to the
type unit. See PR78835. */
while (pdie && pdie->die_tag != DW_TAG_type_unit)
pdie = pdie->die_parent;
if (pdie == NULL)
{
/* Creating a full DIE for tdecl is overly expensive and
at this point even wrong when in the LTO phase
@ -28705,6 +28734,7 @@ resolve_addr (dw_die_ref die)
add_name_and_src_coords_attributes (tdie, tdecl);
equate_decl_number_to_die (tdecl, tdie);
}
}
if (tdie)
{
a->dw_attr_val.val_class = dw_val_class_die_ref;

View File

@ -1,3 +1,8 @@
2017-01-26 Jakub Jelinek <jakub@redhat.com>
PR debug/78835
* g++.dg/debug/dwarf2/pr78835.C: New test.
2017-01-26 Martin Sebor <msebor@redhat.com>
PR middle-end/78703

View File

@ -0,0 +1,11 @@
/* PR debug/78835 */
/* { dg-do compile } */
/* { dg-options "-gdwarf-4 -O2 -fdebug-types-section" } */
struct A { void foo (); };
void
bar (A &x)
{
x.foo ();
}