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:
parent
5d93da1d11
commit
f7c06c0f99
4 changed files with 65 additions and 10 deletions
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
@ -28694,16 +28713,27 @@ resolve_addr (dw_die_ref die)
|
|||
&& DECL_ABSTRACT_ORIGIN (tdecl) == NULL_TREE
|
||||
&& (cdie = lookup_context_die (DECL_CONTEXT (tdecl))))
|
||||
{
|
||||
/* Creating a full DIE for tdecl is overly expensive and
|
||||
at this point even wrong when in the LTO phase
|
||||
as it can end up generating new type DIEs we didn't
|
||||
output and thus optimize_external_refs will crash. */
|
||||
tdie = new_die (DW_TAG_subprogram, cdie, NULL_TREE);
|
||||
add_AT_flag (tdie, DW_AT_external, 1);
|
||||
add_AT_flag (tdie, DW_AT_declaration, 1);
|
||||
add_linkage_attr (tdie, tdecl);
|
||||
add_name_and_src_coords_attributes (tdie, tdecl);
|
||||
equate_decl_number_to_die (tdecl, tdie);
|
||||
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
|
||||
as it can end up generating new type DIEs we didn't
|
||||
output and thus optimize_external_refs will crash. */
|
||||
tdie = new_die (DW_TAG_subprogram, cdie, NULL_TREE);
|
||||
add_AT_flag (tdie, DW_AT_external, 1);
|
||||
add_AT_flag (tdie, DW_AT_declaration, 1);
|
||||
add_linkage_attr (tdie, tdecl);
|
||||
add_name_and_src_coords_attributes (tdie, tdecl);
|
||||
equate_decl_number_to_die (tdecl, tdie);
|
||||
}
|
||||
}
|
||||
if (tdie)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
11
gcc/testsuite/g++.dg/debug/dwarf2/pr78835.C
Normal file
11
gcc/testsuite/g++.dg/debug/dwarf2/pr78835.C
Normal 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 ();
|
||||
}
|
Loading…
Add table
Reference in a new issue