diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 008924c1985119a68a6f7c51e84548678d23b7a9..379631922ec72739ca35954fde2dda3baade35ae 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +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 diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index ec2b8ca2cb691e4605574c1fcb317376d8d824bc..adaa7ee53c9082f1b340da172849b73498e494fc 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)