aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-01-20 10:36:09 +0100
committerRichard Biener <rguenther@suse.de>2020-01-20 12:56:43 +0100
commit991b91497fd50f6e70e5f2c0cfa96e1b74157bdc (patch)
treec3ca6b40e715fc26295a664e2ac29e2492217bbb
parent24b178184f260a6ec1516cfb8bb8876874a078a7 (diff)
downloadgcc-991b91497fd50f6e70e5f2c0cfa96e1b74157bdc.zip
gcc-991b91497fd50f6e70e5f2c0cfa96e1b74157bdc.tar.gz
gcc-991b91497fd50f6e70e5f2c0cfa96e1b74157bdc.tar.bz2
debug/92763 keep DIEs that might be used in DW_TAG_inlined_subroutine
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-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.
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/dwarf2out.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/debug/pr92763.C19
4 files changed, 34 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 53224da..dd2e329 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2020-01-20 Richard Biener <rguenther@suse.de>
+
+ PR debug/92763
+ * dwarf2out.c (prune_unused_types): Unconditionally mark
+ called function DIEs.
+
2020-01-20 Martin Liska <mliska@suse.cz>
PR tree-optimization/93199
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 70b3fad..fe46c7e 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -29529,9 +29529,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))
@@ -29540,8 +29540,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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 888f2cd..220485b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-01-20 Richard Biener <rguenther@suse.de>
+
+ PR debug/92763
+ * g++.dg/debug/pr92763.C: New testcase.
+
2020-01-20 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/92536
diff --git a/gcc/testsuite/g++.dg/debug/pr92763.C b/gcc/testsuite/g++.dg/debug/pr92763.C
new file mode 100644
index 0000000..8e32d60
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr92763.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { 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++)
+ {
+ }
+}