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" } } */

Reply via email to