Adding so that the DIEs of unused external variables can be removed from the output when using -feliminate-unused-debug-symbols.
Tested on x86_64-elf, aarch64-elf, powerpc-eabi, powerpc64-elf and arm-eabi. 2019-02-18 Johan Karlsson <johan.karls...@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. * gcc.dg/debug/dwarf2/pr86964.c: New testcase. Index: gcc/dwarf2out.c =================================================================== --- gcc/dwarf2out.c (revision 268977) +++ gcc/dwarf2out.c (working copy) @@ -22658,6 +22658,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. */ @@ -29264,6 +29279,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; @@ -29390,6 +29418,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) Index: gcc/testsuite/gcc.dg/debug/dwarf2/pr86964.c =================================================================== --- gcc/testsuite/gcc.dg/debug/dwarf2/pr86964.c (nonexistent) +++ gcc/testsuite/gcc.dg/debug/dwarf2/pr86964.c (working copy) @@ -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" } } */