diff options
author | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-04-15 10:17:54 +0000 |
---|---|---|
committer | ebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-04-15 10:17:54 +0000 |
commit | 5b3636ce314ae920baa8ccd6357cf72188c84987 (patch) | |
tree | aa826ca1631bf85a3d9e79762dc859d1c01d5c29 /gcc | |
parent | 4fcb1fcaf3b342a70b7978d60584f0b291d027d9 (diff) |
* gcc-interface/trans.c (call_to_gnu): Do not unnecessarily force
side-effects of actual parameters before the call.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158369 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/trans.c | 18 |
2 files changed, 11 insertions, 12 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 008924c1985..379631922ec 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,5 +1,10 @@ 2010-04-15 Eric Botcazou <ebotcazou@adacore.com> + * gcc-interface/trans.c (call_to_gnu): Do not unnecessarily force + side-effects of actual parameters before the call. + +2010-04-15 Eric Botcazou <ebotcazou@adacore.com> + * gcc-interface/decl.c (validate_size): Reorder, remove obsolete test and warning. (set_rm_size): Reorder and remove obsolete test. diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index ec2b8ca2cb6..adaa7ee53c9 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -2778,7 +2778,12 @@ call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target) gnu_name_list = tree_cons (NULL_TREE, gnu_name, gnu_name_list); if (!(gnu_formal && TREE_CODE (gnu_formal) == PARM_DECL)) - continue; + { + /* Make sure side-effects are evaluated before the call. */ + if (TREE_SIDE_EFFECTS (gnu_name)) + append_to_statement_list (gnu_name, &gnu_before_list); + continue; + } /* If this is 'Null_Parameter, pass a zero even though we are dereferencing it. */ @@ -2849,22 +2854,11 @@ call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target) if (length > 1) { - tree gnu_name; - /* The call sequence must contain one and only one call, even though the function is const or pure. So force a SAVE_EXPR. */ gnu_call = build1 (SAVE_EXPR, TREE_TYPE (gnu_call), gnu_call); TREE_SIDE_EFFECTS (gnu_call) = 1; gnu_name_list = nreverse (gnu_name_list); - - /* If any of the names had side-effects, ensure they are all - evaluated before the call. */ - for (gnu_name = gnu_name_list; - gnu_name; - gnu_name = TREE_CHAIN (gnu_name)) - if (TREE_SIDE_EFFECTS (TREE_VALUE (gnu_name))) - append_to_statement_list (TREE_VALUE (gnu_name), - &gnu_before_list); } if (Nkind (Name (gnat_node)) == N_Explicit_Dereference) |