From 5b3636ce314ae920baa8ccd6357cf72188c84987 Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Thu, 15 Apr 2010 10:17:54 +0000 Subject: * 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 --- gcc/ada/ChangeLog | 5 +++++ gcc/ada/gcc-interface/trans.c | 18 ++++++------------ 2 files changed, 11 insertions(+), 12 deletions(-) (limited to 'gcc') diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 008924c1985..379631922ec 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2010-04-15 Eric Botcazou + + * gcc-interface/trans.c (call_to_gnu): Do not unnecessarily force + side-effects of actual parameters before the call. + 2010-04-15 Eric Botcazou * gcc-interface/decl.c (validate_size): Reorder, 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) -- cgit v1.2.3