OSDN Git Service

* gcc-interface/trans.c (call_to_gnu): Do not unnecessarily force
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 15 Apr 2010 10:17:54 +0000 (10:17 +0000)
committerMasaki Muranaka <monaka@monami-software.com>
Sun, 23 May 2010 05:32:39 +0000 (14:32 +0900)
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
gcc/ada/gcc-interface/trans.c

index 008924c..3796319 100644 (file)
@@ -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.
index 34cb88a..678f5b1 100644 (file)
@@ -2911,7 +2911,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.  */
@@ -2986,22 +2991,11 @@ call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target)
 
       if (length > 1)
        {
-         tree gnu_temp, gnu_stmt;
-
          /* 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)