]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
debug/92763 keep DIEs that might be used in DW_TAG_inlined_subroutine
authorRichard Biener <rguenther@suse.de>
Fri, 14 Feb 2020 08:17:57 +0000 (09:17 +0100)
committerRichard Biener <rguenther@suse.de>
Fri, 14 Feb 2020 10:01:50 +0000 (11:01 +0100)
We were pruning type-local subroutine DIEs if their context is unused
despite us later needing those DIEs as abstract origins for inlines.
The patch makes code already present for -fvar-tracking-assignments
unconditional.

2020-02-14  Richard Biener  <rguenther@suse.de>

Backport from mainline
2020-01-20  Richard Biener  <rguenther@suse.de>

PR debug/92763
* dwarf2out.c (prune_unused_types): Unconditionally mark
called function DIEs.

* g++.dg/debug/pr92763.C: New testcase.

gcc/ChangeLog
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/debug/pr92763.C [new file with mode: 0644]

index bfed93eac8713412da83fc18b2b6917bb871440b..eda6c1fb747c8af9f718ddc925fbc7efdc797bdb 100644 (file)
@@ -1,3 +1,12 @@
+2020-02-14  Richard Biener  <rguenther@suse.de>
+
+       Backport from mainline
+       2020-01-20  Richard Biener  <rguenther@suse.de>
+
+       PR debug/92763
+       * dwarf2out.c (prune_unused_types): Unconditionally mark
+       called function DIEs.
+
 2020-02-14  Richard Biener  <rguenther@suse.de>
 
        Backport from mainline
index 67a6bc92077d72c4d25f6bd2b2e422d6388afaba..d5b5e20c2d42ca32fd3caa0389ef324d32481e5f 100644 (file)
@@ -29580,9 +29580,9 @@ 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).  */
+  /* Also set the mark on nodes that could be referenced by
+     DW_TAG_call_site DW_AT_call_origin (i.e. direct call callees) or
+     by DW_TAG_inlined_subroutine origins.  */
   cgraph_node *cnode;
   FOR_EACH_FUNCTION (cnode)
     if (cnode->referred_to_p (false))
@@ -29591,8 +29591,7 @@ prune_unused_types (void)
        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))
+         if (e->caller != cnode)
            {
              prune_unused_types_mark (die, 1);
              break;
index 22660ff856e4c8e6b7e7b6e58944e2c57062b8ae..b096a03ea907db022abd7d702bb8d21e26ea6d08 100644 (file)
@@ -1,3 +1,11 @@
+2020-02-14  Richard Biener  <rguenther@suse.de>
+
+       Backport from mainline
+       2020-01-20  Richard Biener  <rguenther@suse.de>
+
+       PR debug/92763
+       * g++.dg/debug/pr92763.C: New testcase.
+
 2020-02-14  Richard Biener  <rguenther@suse.de>
 
        Backport from mainline
diff --git a/gcc/testsuite/g++.dg/debug/pr92763.C b/gcc/testsuite/g++.dg/debug/pr92763.C
new file mode 100644 (file)
index 0000000..16dccf3
--- /dev/null
@@ -0,0 +1,20 @@
+// { dg-do compile }
+// { dg-require-effective-target fopenmp }
+// { dg-additional-options "-fno-var-tracking-assignments -fopenmp" }
+
+struct A
+{
+  typedef int T;
+  #pragma omp declare reduction (y : T : [&omp_out, &omp_in]() { omp_out += omp_in; return 0; }()) initializer (omp_priv = [omp_orig]() { return omp_orig; }())
+  static void foo ();
+};
+
+void
+A::foo ()
+{
+  int r = 0, s = 0;
+  #pragma omp parallel for reduction (y : r, s)
+  for (int i = 0; i < 1; i++)
+    {
+    }
+}