diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2010-05-19 17:53:58 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2010-05-19 17:53:58 +0000 |
commit | 616f1431bf3ad91356460164fcd7d4d8a6f3bd3f (patch) | |
tree | e941e9d3872b8da1472eb83529eb4f4677ae6331 /gcc/ada | |
parent | daf8c6f03b7b7ae33e2e8e301d367eb8cce80e5c (diff) | |
download | gcc-616f1431bf3ad91356460164fcd7d4d8a6f3bd3f.zip gcc-616f1431bf3ad91356460164fcd7d4d8a6f3bd3f.tar.gz gcc-616f1431bf3ad91356460164fcd7d4d8a6f3bd3f.tar.bz2 |
langhooks.h (struct lang_hooks): Add new field deep_unsharing.
* langhooks.h (struct lang_hooks): Add new field deep_unsharing.
* langhooks-def.h (LANG_HOOKS_DEEP_UNSHARING): New macro.
(LANG_HOOKS_INITIALIZER): Add LANG_HOOKS_DEEP_UNSHARING.
* gimplify.c: (mostly_copy_tree_r): Copy trees under SAVE_EXPR and
TARGET_EXPR nodes, but only once, if instructed to do so. Do not
propagate the 'data' argument to copy_tree_r.
(copy_if_shared_r): Remove bogus ATTRIBUTE_UNUSED marker.
Propagate 'data' argument to walk_tree.
(copy_if_shared): New function.
(unmark_visited_r): Remove bogus ATTRIBUTE_UNUSED marker.
(unmark_visited): New function.
(unshare_body): Call copy_if_shared instead of doing it manually.
(unvisit_body): Call unmark_visited instead of doing it manually.
ada/
* gcc-interface/misc.c (LANG_HOOKS_DEEP_UNSHARING): Redefine.
* gcc-interface/trans.c (unshare_save_expr): Delete.
(gigi): Do not unshare trees under SAVE_EXPRs here.
From-SVN: r159592
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/misc.c | 2 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/trans.c | 25 |
3 files changed, 8 insertions, 25 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 822790b..d5aa53a 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2010-05-19 Eric Botcazou <ebotcazou@adacore.com> + + * gcc-interface/misc.c (LANG_HOOKS_DEEP_UNSHARING): Redefine. + * gcc-interface/trans.c (unshare_save_expr): Delete. + (gigi): Do not unshare trees under SAVE_EXPRs here. + 2010-05-18 Nathan Froyd <froydnj@codesourcery.com> * gcc-interface/trans.c (call_to_gnu): Use build_call_vec instead of diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c index 0f85393..dba6dca 100644 --- a/gcc/ada/gcc-interface/misc.c +++ b/gcc/ada/gcc-interface/misc.c @@ -132,6 +132,8 @@ static tree gnat_eh_personality (void); #define LANG_HOOKS_BUILTIN_FUNCTION gnat_builtin_function #undef LANG_HOOKS_EH_PERSONALITY #define LANG_HOOKS_EH_PERSONALITY gnat_eh_personality +#undef LANG_HOOKS_DEEP_UNSHARING +#define LANG_HOOKS_DEEP_UNSHARING true struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 13e9d1a..b025020 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -191,7 +191,6 @@ static void Compilation_Unit_to_gnu (Node_Id); static void record_code_position (Node_Id); static void insert_code_for (Node_Id); static void add_cleanup (tree, Node_Id); -static tree unshare_save_expr (tree *, int *, void *); static void add_stmt_list (List_Id); static void push_exception_label_stack (tree *, Entity_Id); static tree build_stmt_group (List_Id, bool); @@ -636,16 +635,6 @@ gigi (Node_Id gnat_root, int max_gnat_node, int number_name ATTRIBUTE_UNUSED, { tree gnu_body = DECL_SAVED_TREE (info->elab_proc), gnu_stmts; - /* Unshare SAVE_EXPRs between subprograms. These are not unshared by - the gimplifier for obvious reasons, but it turns out that we need to - unshare them for the global level because of SAVE_EXPRs made around - checks for global objects and around allocators for global objects - of variable size, in order to prevent node sharing in the underlying - expression. Note that this implicitly assumes that the SAVE_EXPR - nodes themselves are not shared between subprograms, which would be - an upstream bug for which we would not change the outcome. */ - walk_tree_without_duplicates (&gnu_body, unshare_save_expr, NULL); - /* We should have a BIND_EXPR but it may not have any statements in it. If it doesn't have any, we have nothing to do except for setting the flag on the GNAT node. Otherwise, process the function as others. */ @@ -5865,20 +5854,6 @@ mark_visited (tree t) walk_tree (&t, mark_visited_r, NULL, NULL); } -/* Utility function to unshare expressions wrapped up in a SAVE_EXPR. */ - -static tree -unshare_save_expr (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, - void *data ATTRIBUTE_UNUSED) -{ - tree t = *tp; - - if (TREE_CODE (t) == SAVE_EXPR) - TREE_OPERAND (t, 0) = unshare_expr (TREE_OPERAND (t, 0)); - - return NULL_TREE; -} - /* Add GNU_CLEANUP, a cleanup action, to the current code group and set its location to that of GNAT_NODE if present. */ |