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/ada/gcc-interface | |
parent | 4fcb1fcaf3b342a70b7978d60584f0b291d027d9 (diff) | |
download | gcc-5b3636ce314ae920baa8ccd6357cf72188c84987.tar.gz |
* 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/ada/gcc-interface')
-rw-r--r-- | gcc/ada/gcc-interface/trans.c | 18 |
1 files changed, 6 insertions, 12 deletions
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) |