diff options
author | Jakub Jelinek <jakub@redhat.com> | 2008-06-20 04:18:07 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2008-06-20 04:18:07 +0200 |
commit | 2368a460c8d49c4d9aa1aab2b79d6727d19f5b2c (patch) | |
tree | f28feb4e7a51182a0bf7d4ca97a21a4def2af406 | |
parent | c598874b4bc7d816b81b8f839f75029122e4fe92 (diff) | |
download | gcc-2368a460c8d49c4d9aa1aab2b79d6727d19f5b2c.zip gcc-2368a460c8d49c4d9aa1aab2b79d6727d19f5b2c.tar.gz gcc-2368a460c8d49c4d9aa1aab2b79d6727d19f5b2c.tar.bz2 |
re PR c++/36523 (OpenMP task construct fails to instantiate copy constructor)
PR c++/36523
* cgraphunit.c (cgraph_process_new_functions): Don't clear
node->needed and node->reachable.
* cgraphbuild.c (record_reference): Handle OMP_PARALLEL and OMP_TASK.
* omp-low.c (delete_omp_context): Call finalize_task_copyfn.
(expand_task_call): Don't call expand_task_copyfn.
(expand_task_copyfn): Renamed to...
(finalize_task_copyfn): ... this.
* testsuite/libgomp.c++/task-7.C: New function.
From-SVN: r136977
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/cgraphbuild.c | 18 | ||||
-rw-r--r-- | gcc/cgraphunit.c | 1 | ||||
-rw-r--r-- | gcc/omp-low.c | 66 | ||||
-rw-r--r-- | libgomp/ChangeLog | 3 | ||||
-rw-r--r-- | libgomp/testsuite/libgomp.c++/task-7.C | 18 |
6 files changed, 84 insertions, 33 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d9f6157..74a8161 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2008-06-19 Jakub Jelinek <jakub@redhat.com> + + PR c++/36523 + * cgraphunit.c (cgraph_process_new_functions): Don't clear + node->needed and node->reachable. + * cgraphbuild.c (record_reference): Handle OMP_PARALLEL and OMP_TASK. + * omp-low.c (delete_omp_context): Call finalize_task_copyfn. + (expand_task_call): Don't call expand_task_copyfn. + (expand_task_copyfn): Renamed to... + (finalize_task_copyfn): ... this. + 2008-06-19 Jan Hubicka <jh@suse.cz> * builtins.c (expand_builtin_nonlocal_goto): Stabilize r_sp before diff --git a/gcc/cgraphbuild.c b/gcc/cgraphbuild.c index e37ca86..19e1983 100644 --- a/gcc/cgraphbuild.c +++ b/gcc/cgraphbuild.c @@ -62,6 +62,24 @@ record_reference (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) } break; + case OMP_PARALLEL: + if (flag_unit_at_a_time) + { + if (OMP_PARALLEL_FN (*tp)) + cgraph_mark_needed_node (cgraph_node (OMP_PARALLEL_FN (*tp))); + } + break; + + case OMP_TASK: + if (flag_unit_at_a_time) + { + if (OMP_TASK_FN (*tp)) + cgraph_mark_needed_node (cgraph_node (OMP_TASK_FN (*tp))); + if (OMP_TASK_COPYFN (*tp)) + cgraph_mark_needed_node (cgraph_node (OMP_TASK_COPYFN (*tp))); + } + break; + default: /* Save some cycles by not walking types and declaration as we won't find anything useful there anyway. */ diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 6b00bd5..2dcccc1 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -443,7 +443,6 @@ cgraph_process_new_functions (void) it into reachable functions list. */ node->next_needed = NULL; - node->needed = node->reachable = false; cgraph_finalize_function (fndecl, false); cgraph_mark_reachable_node (node); output = true; diff --git a/gcc/omp-low.c b/gcc/omp-low.c index 09b7260..db5f858 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -1188,6 +1188,37 @@ new_omp_context (tree stmt, omp_context *outer_ctx) return ctx; } +static void maybe_catch_exception (tree *stmt_p); + +/* Finalize task copyfn. */ + +static void +finalize_task_copyfn (tree task_stmt) +{ + struct function *child_cfun; + tree child_fn, old_fn; + + child_fn = OMP_TASK_COPYFN (task_stmt); + if (child_fn == NULL_TREE) + return; + + child_cfun = DECL_STRUCT_FUNCTION (child_fn); + + /* Inform the callgraph about the new function. */ + DECL_STRUCT_FUNCTION (child_fn)->curr_properties + = cfun->curr_properties; + + old_fn = current_function_decl; + push_cfun (child_cfun); + current_function_decl = child_fn; + gimplify_body (&DECL_SAVED_TREE (child_fn), child_fn, false); + maybe_catch_exception (&BIND_EXPR_BODY (DECL_SAVED_TREE (child_fn))); + pop_cfun (); + current_function_decl = old_fn; + + cgraph_add_new_function (child_fn, false); +} + /* Destroy a omp_context data structures. Called through the splay tree value delete callback. */ @@ -1218,6 +1249,9 @@ delete_omp_context (splay_tree_value value) DECL_ABSTRACT_ORIGIN (t) = NULL; } + if (is_task_ctx (ctx)) + finalize_task_copyfn (ctx->stmt); + XDELETE (ctx); } @@ -2882,35 +2916,6 @@ expand_parallel_call (struct omp_region *region, basic_block bb, } -static void maybe_catch_exception (tree *stmt_p); - - -/* Finalize task copyfn. */ - -static void -expand_task_copyfn (tree task_stmt) -{ - struct function *child_cfun; - tree child_fn, old_fn; - - child_fn = OMP_TASK_COPYFN (task_stmt); - child_cfun = DECL_STRUCT_FUNCTION (child_fn); - - /* Inform the callgraph about the new function. */ - DECL_STRUCT_FUNCTION (child_fn)->curr_properties - = cfun->curr_properties; - - old_fn = current_function_decl; - push_cfun (child_cfun); - current_function_decl = child_fn; - gimplify_body (&DECL_SAVED_TREE (child_fn), child_fn, false); - maybe_catch_exception (&BIND_EXPR_BODY (DECL_SAVED_TREE (child_fn))); - pop_cfun (); - current_function_decl = old_fn; - - cgraph_add_new_function (child_fn, false); -} - /* Build the function call to GOMP_task to actually generate the task operation. BB is the block where to insert the code. */ @@ -2922,9 +2927,6 @@ expand_task_call (basic_block bb, tree entry_stmt) clauses = OMP_TASK_CLAUSES (entry_stmt); - if (OMP_TASK_COPYFN (entry_stmt)) - expand_task_copyfn (entry_stmt); - c = find_omp_clause (clauses, OMP_CLAUSE_IF); if (c) cond = gimple_boolify (OMP_CLAUSE_IF_EXPR (c)); diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 784d59f..ed27454 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -2,6 +2,9 @@ * testsuite/libgomp.c/nqueens-1.c: New test. + PR c++/36523 + * testsuite/libgomp.c++/task-7.C: New function. + 2008-06-17 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> * configure: Regenerate. diff --git a/libgomp/testsuite/libgomp.c++/task-7.C b/libgomp/testsuite/libgomp.c++/task-7.C new file mode 100644 index 0000000..e9828cd --- /dev/null +++ b/libgomp/testsuite/libgomp.c++/task-7.C @@ -0,0 +1,18 @@ +// PR c++/36523 +// { dg-do run } + +template<typename T> +struct A +{ + A() { } + A(const A&) { } + void foo() { } +}; + +int main() +{ + A<int> a; + #pragma omp task firstprivate (a) + a.foo(); + return 0; +} |