re PR debug/86964 (Too many debug symbols included, especially for extern globals)

PR debug/86964
	* dwarf2out.c (premark_used_variables): New function.
	(prune_unused_types_walk): Do not mark not premarked external
	variables.
	(prune_unused_types): Call premark_used_variables.

	* gcc.dg/debug/dwarf2/pr86964.c: New testcase.

From-SVN: r269925
This commit is contained in:
Johan Karlsson 2019-03-25 21:19:09 +00:00 committed by Jeff Law
parent 33163a622d
commit 715e3349b0
4 changed files with 59 additions and 0 deletions

View File

@ -1,3 +1,11 @@
2019-03-25 Johan Karlsson <johan.karlsson@enea.com>
PR debug/86964
* dwarf2out.c (premark_used_variables): New function.
(prune_unused_types_walk): Do not mark not premarked external
variables.
(prune_unused_types): Call premark_used_variables.
2019-03-25 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/89676

View File

@ -22732,6 +22732,21 @@ premark_types_used_by_global_vars (void)
->traverse<void *, premark_types_used_by_global_vars_helper> (NULL);
}
/* Mark all variables used by the symtab as perennial. */
static void
premark_used_variables (void)
{
/* Mark DIEs in the symtab as used. */
varpool_node *var;
FOR_EACH_VARIABLE (var)
{
dw_die_ref die = lookup_decl_die (var->decl);
if (die)
die->die_perennial_p = 1;
}
}
/* Generate a DW_TAG_call_site DIE in function DECL under SUBR_DIE
for CA_LOC call arg loc node. */
@ -29394,6 +29409,19 @@ prune_unused_types_walk (dw_die_ref die)
return;
case DW_TAG_variable:
if (flag_debug_only_used_symbols)
{
if (die->die_perennial_p)
break;
/* premark_used_variables marks external variables --- don't mark
them here. */
if (get_AT (die, DW_AT_external))
return;
}
/* FALLTHROUGH */
default:
/* Mark everything else. */
break;
@ -29520,6 +29548,10 @@ prune_unused_types (void)
/* Mark types that are used in global variables. */
premark_types_used_by_global_vars ();
/* Mark variables used in the symtab. */
if (flag_debug_only_used_symbols)
premark_used_variables ();
/* Set the mark on nodes that are actually used. */
prune_unused_types_walk (comp_unit_die ());
for (node = limbo_die_list; node; node = node->next)

View File

@ -1,3 +1,8 @@
2019-03-25 Johan Karlsson <johan.karlsson@enea.com>
PR debug/86964
* gcc.dg/debug/dwarf2/pr86964.c: New testcase.
2019-03-25 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/84661

View File

@ -0,0 +1,14 @@
/* { dg-do compile } */
/* { dg-options "-O2 -gdwarf -feliminate-unused-debug-symbols -dA" } */
struct S { int i; };
extern struct S x;
int y;
int main()
{
return y;
}
/* We should elide the DIEs for x and S but not y. */
/* { dg-final { scan-assembler-times "DW_TAG_variable" 2 } } */
/* { dg-final { scan-assembler-not "DW_TAG_structure_type" } } */