From: Jakub Jelinek Date: Mon, 19 Nov 2018 13:44:13 +0000 (+0100) Subject: re PR debug/87039 (DW_OP_fbreg used without a frame base on a C++ code w/ -fopenmp) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4ccc4e30141613c4585a0497e050cb5deda06007;p=gcc.git re PR debug/87039 (DW_OP_fbreg used without a frame base on a C++ code w/ -fopenmp) PR debug/87039 * omp-expand.c: Don't include debug.h. (adjust_context_and_scope): Add REGION argument. Find DECL_CONTEXT from innermost outer parallel, task, teams or target that has a child_fn set, or, if there is no such outer region, use current_function_decl. Do the DECL_CONTEXT adjustment regardless of whether a suitable BLOCK is found or not. (expand_parallel_call, expand_teams_call): Don't call adjust_context_and_scope here. (grid_expand_target_grid_body): Revert 2017-01-25 changes. (expand_omp_taskreg, expand_omp_target): Likewise. Call adjust_context_and_scope. * dwarf2out.c (dwarf2out_early_global_decl): For decl_function_context recurse instead of calling dwarf2out_decl. * g++.dg/gomp/pr78363-4.C: New test. * g++.dg/gomp/pr78363-5.C: New test. * g++.dg/gomp/pr78363-6.C: New test. * g++.dg/gomp/pr78363-7.C: New test. From-SVN: r266272 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9cd89fb941b..dab88746349 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,20 @@ +2018-11-19 Jakub Jelinek + + PR debug/87039 + * omp-expand.c: Don't include debug.h. + (adjust_context_and_scope): Add REGION argument. Find DECL_CONTEXT + from innermost outer parallel, task, teams or target that has a + child_fn set, or, if there is no such outer region, use + current_function_decl. Do the DECL_CONTEXT adjustment regardless of + whether a suitable BLOCK is found or not. + (expand_parallel_call, expand_teams_call): Don't call + adjust_context_and_scope here. + (grid_expand_target_grid_body): Revert 2017-01-25 changes. + (expand_omp_taskreg, expand_omp_target): Likewise. Call + adjust_context_and_scope. + * dwarf2out.c (dwarf2out_early_global_decl): For + decl_function_context recurse instead of calling dwarf2out_decl. + 2018-11-19 Richard Biener PR lto/87229 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index d2bea2770fd..9933650e33b 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -26403,7 +26403,7 @@ dwarf2out_early_global_decl (tree decl) enough so that it lands in its own context. This avoids type pruning issues later on. */ if (context_die == NULL || is_declaration_die (context_die)) - dwarf2out_decl (context); + dwarf2out_early_global_decl (context); } /* Emit an abstract origin of a function first. This happens diff --git a/gcc/omp-expand.c b/gcc/omp-expand.c index 2361520e60b..76c09c5883b 100644 --- a/gcc/omp-expand.c +++ b/gcc/omp-expand.c @@ -56,7 +56,6 @@ along with GCC; see the file COPYING3. If not see #include "gomp-constants.h" #include "gimple-pretty-print.h" #include "hsa-common.h" -#include "debug.h" #include "stringpool.h" #include "attribs.h" @@ -517,27 +516,44 @@ parallel_needs_hsa_kernel_p (struct omp_region *region) function will be emitted with the correct lexical scope. */ static void -adjust_context_and_scope (tree entry_block, tree child_fndecl) +adjust_context_and_scope (struct omp_region *region, tree entry_block, + tree child_fndecl) { + tree parent_fndecl = NULL_TREE; + gimple *entry_stmt; + /* OMP expansion expands inner regions before outer ones, so if + we e.g. have explicit task region nested in parallel region, when + expanding the task region current_function_decl will be the original + source function, but we actually want to use as context the child + function of the parallel. */ + for (region = region->outer; + region && parent_fndecl == NULL_TREE; region = region->outer) + switch (region->type) + { + case GIMPLE_OMP_PARALLEL: + case GIMPLE_OMP_TASK: + case GIMPLE_OMP_TEAMS: + entry_stmt = last_stmt (region->entry); + parent_fndecl = gimple_omp_taskreg_child_fn (entry_stmt); + break; + case GIMPLE_OMP_TARGET: + entry_stmt = last_stmt (region->entry); + parent_fndecl + = gimple_omp_target_child_fn (as_a (entry_stmt)); + break; + default: + break; + } + + if (parent_fndecl == NULL_TREE) + parent_fndecl = current_function_decl; + DECL_CONTEXT (child_fndecl) = parent_fndecl; + if (entry_block != NULL_TREE && TREE_CODE (entry_block) == BLOCK) { tree b = BLOCK_SUPERCONTEXT (entry_block); - if (TREE_CODE (b) == BLOCK) { - tree parent_fndecl; - - /* Follow supercontext chain until the parent fndecl - is found. */ - for (parent_fndecl = BLOCK_SUPERCONTEXT (b); - TREE_CODE (parent_fndecl) == BLOCK; - parent_fndecl = BLOCK_SUPERCONTEXT (parent_fndecl)) - ; - - gcc_assert (TREE_CODE (parent_fndecl) == FUNCTION_DECL); - - DECL_CONTEXT (child_fndecl) = parent_fndecl; - DECL_CHAIN (child_fndecl) = BLOCK_VARS (b); BLOCK_VARS (b) = child_fndecl; } @@ -723,8 +739,6 @@ expand_parallel_call (struct omp_region *region, basic_block bb, tree child_fndecl = gimple_omp_parallel_child_fn (entry_stmt); t2 = build_fold_addr_expr (child_fndecl); - adjust_context_and_scope (gimple_block (entry_stmt), child_fndecl); - vec_alloc (args, 4 + vec_safe_length (ws_args)); args->quick_push (t2); args->quick_push (t1); @@ -952,8 +966,6 @@ expand_teams_call (basic_block bb, gomp_teams *entry_stmt) tree child_fndecl = gimple_omp_teams_child_fn (entry_stmt); tree t2 = build_fold_addr_expr (child_fndecl); - adjust_context_and_scope (gimple_block (entry_stmt), child_fndecl); - vec *args; vec_alloc (args, 5); args->quick_push (t2); @@ -1412,11 +1424,6 @@ expand_omp_taskreg (struct omp_region *region) else block = gimple_block (entry_stmt); - /* Make sure to generate early debug for the function before - outlining anything. */ - if (! gimple_in_ssa_p (cfun)) - (*debug_hooks->early_global_decl) (cfun->decl); - new_bb = move_sese_region_to_fn (child_cfun, entry_bb, exit_bb, block); if (exit_bb) single_succ_edge (new_bb)->flags = EDGE_FALLTHRU; @@ -1497,6 +1504,8 @@ expand_omp_taskreg (struct omp_region *region) } } + adjust_context_and_scope (region, gimple_block (entry_stmt), child_fn); + if (gimple_code (entry_stmt) == GIMPLE_OMP_PARALLEL) expand_parallel_call (region, new_bb, as_a (entry_stmt), ws_args); @@ -7399,11 +7408,6 @@ expand_omp_target (struct omp_region *region) gsi_remove (&gsi, true); } - /* Make sure to generate early debug for the function before - outlining anything. */ - if (! gimple_in_ssa_p (cfun)) - (*debug_hooks->early_global_decl) (cfun->decl); - /* Move the offloading region into CHILD_CFUN. */ block = gimple_block (entry_stmt); @@ -7480,6 +7484,8 @@ expand_omp_target (struct omp_region *region) dump_function_header (dump_file, child_fn, dump_flags); dump_function_to_file (child_fn, dump_file, dump_flags); } + + adjust_context_and_scope (region, gimple_block (entry_stmt), child_fn); } /* Emit a library call to launch the offloading region, or do data @@ -7977,11 +7983,6 @@ grid_expand_target_grid_body (struct omp_region *target) init_tree_ssa (cfun); pop_cfun (); - /* Make sure to generate early debug for the function before - outlining anything. */ - if (! gimple_in_ssa_p (cfun)) - (*debug_hooks->early_global_decl) (cfun->decl); - tree old_parm_decl = DECL_ARGUMENTS (kern_fndecl); gcc_assert (!DECL_CHAIN (old_parm_decl)); tree new_parm_decl = copy_node (DECL_ARGUMENTS (kern_fndecl)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5fce6a84818..30fbd325f49 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2018-11-19 Jakub Jelinek + + PR debug/87039 + * g++.dg/gomp/pr78363-4.C: New test. + * g++.dg/gomp/pr78363-5.C: New test. + * g++.dg/gomp/pr78363-6.C: New test. + * g++.dg/gomp/pr78363-7.C: New test. + 2018-11-19 Richard Biener PR lto/87229 diff --git a/gcc/testsuite/g++.dg/gomp/pr78363-4.C b/gcc/testsuite/g++.dg/gomp/pr78363-4.C new file mode 100644 index 00000000000..54d00788ff7 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr78363-4.C @@ -0,0 +1,18 @@ +// { dg-do compile } +// { dg-require-effective-target c++11 } +// { dg-additional-options "-g" } + +int main() +{ + int n = 0; + +#pragma omp parallel +#pragma omp master +#pragma omp parallel +#pragma omp master +#pragma omp parallel for reduction (+: n) + for (int i = [](){ return 3; }(); i < 10; ++i) + n++; + + return n; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr78363-5.C b/gcc/testsuite/g++.dg/gomp/pr78363-5.C new file mode 100644 index 00000000000..760cc4d8070 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr78363-5.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-require-effective-target c++11 } +// { dg-additional-options "-g" } + +int main() +{ + int n = 0; +#pragma omp task shared(n) +#pragma omp target map(tofrom:n) +#pragma omp for reduction (+: n) + for (int i = [](){ return 3; }(); i < 10; ++i) + n++; + if (n != 7) + __builtin_abort (); +#pragma omp taskwait + return 0; +} diff --git a/gcc/testsuite/g++.dg/gomp/pr78363-6.C b/gcc/testsuite/g++.dg/gomp/pr78363-6.C new file mode 100644 index 00000000000..e49ef0628d0 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr78363-6.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// { dg-require-effective-target c++11 } +// { dg-additional-options "-g" } + +int main() +{ + int n = 0; +#pragma omp parallel +#pragma omp master +#pragma omp task shared (n) + for (int i = [](){ return 3; }(); i < 10; ++i) + n = i; +#pragma omp taskwait + if (n != 7) + __builtin_abort (); +} diff --git a/gcc/testsuite/g++.dg/gomp/pr78363-7.C b/gcc/testsuite/g++.dg/gomp/pr78363-7.C new file mode 100644 index 00000000000..4a0caee3dc3 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr78363-7.C @@ -0,0 +1,15 @@ +// { dg-do compile } +// { dg-require-effective-target c++11 } +// { dg-additional-options "-g" } + +int main() +{ + int n = 0; + +#pragma omp target map(tofrom: n) +#pragma omp parallel for reduction (+: n) + for (int i = [](){ return 3; }(); i < 10; ++i) + n++; + + return n; +}