From 991b91497fd50f6e70e5f2c0cfa96e1b74157bdc Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 20 Jan 2020 10:36:09 +0100 Subject: [PATCH] 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 PR debug/92763 * dwarf2out.c (prune_unused_types): Unconditionally mark called function DIEs. * g++.dg/debug/pr92763.C: New testcase. --- gcc/ChangeLog | 6 ++++++ gcc/dwarf2out.c | 9 ++++----- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/debug/pr92763.C | 19 +++++++++++++++++++ 4 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/debug/pr92763.C 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 + + PR debug/92763 + * dwarf2out.c (prune_unused_types): Unconditionally mark + called function DIEs. + 2020-01-20 Martin Liska 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 + + PR debug/92763 + * g++.dg/debug/pr92763.C: New testcase. + 2020-01-20 Paolo Carlini 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++) + { + } +} -- 2.7.4