trans.c (Subprogram_Body_to_gnu): Evaluate the expressions of the parameter cache...
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 4 Jan 2011 09:43:56 +0000 (09:43 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 4 Jan 2011 09:43:56 +0000 (09:43 +0000)
* gcc-interface/trans.c (Subprogram_Body_to_gnu): Evaluate the
expressions of the parameter cache within the statement group of
the CICO mechanism.

From-SVN: r168456

gcc/ada/ChangeLog
gcc/ada/gcc-interface/trans.c

index 57d9c58b28f713686eaac4171704e81360a4814b..f644a5569b064aae5657ac505c92fc33dac7b755 100644 (file)
@@ -1,3 +1,9 @@
+2011-01-04  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/trans.c (Subprogram_Body_to_gnu): Evaluate the
+       expressions of the parameter cache within the statement group of
+       the CICO mechanism.
+
 2011-01-04  Olivier Hainque  <hainque@adacore.com>
             Eric Botcazou  <ebotcazou@adacore.com>
 
index 9bf7c3d77b7af06b4b82b648f46a1a2174add94d..ecd948993fb7cdb233ceab0081ca73d05e414351 100644 (file)
@@ -2603,6 +2603,31 @@ Subprogram_Body_to_gnu (Node_Id gnat_node)
   gnat_poplevel ();
   gnu_result = end_stmt_group ();
 
+  /* If we populated the parameter attributes cache, we need to make sure that
+     the cached expressions are evaluated on all the possible paths leading to
+     their uses.  So we force their evaluation on entry of the function.  */
+  cache = DECL_STRUCT_FUNCTION (gnu_subprog_decl)->language->parm_attr_cache;
+  if (cache)
+    {
+      struct parm_attr_d *pa;
+      int i;
+
+      start_stmt_group ();
+
+      FOR_EACH_VEC_ELT (parm_attr, cache, i, pa)
+       {
+         if (pa->first)
+           add_stmt_with_node_force (pa->first, gnat_node);
+         if (pa->last)
+           add_stmt_with_node_force (pa->last, gnat_node);
+         if (pa->length)
+           add_stmt_with_node_force (pa->length, gnat_node);
+       }
+
+      add_stmt (gnu_result);
+      gnu_result = end_stmt_group ();
+    }
+
   /* If we are dealing with a return from an Ada procedure with parameters
      passed by copy-in/copy-out, we need to return a record containing the
      final values of these parameters.  If the list contains only one entry,
@@ -2637,31 +2662,6 @@ Subprogram_Body_to_gnu (Node_Id gnat_node)
 
   VEC_pop (tree, gnu_return_label_stack);
 
-  /* If we populated the parameter attributes cache, we need to make sure that
-     the cached expressions are evaluated on all the possible paths leading to
-     their uses.  So we force their evaluation on entry of the function.  */
-  cache = DECL_STRUCT_FUNCTION (gnu_subprog_decl)->language->parm_attr_cache;
-  if (cache)
-    {
-      struct parm_attr_d *pa;
-      int i;
-
-      start_stmt_group ();
-
-      FOR_EACH_VEC_ELT (parm_attr, cache, i, pa)
-       {
-         if (pa->first)
-           add_stmt_with_node_force (pa->first, gnat_node);
-         if (pa->last)
-           add_stmt_with_node_force (pa->last, gnat_node);
-         if (pa->length)
-           add_stmt_with_node_force (pa->length, gnat_node);
-       }
-
-      add_stmt (gnu_result);
-      gnu_result = end_stmt_group ();
-    }
-
   end_subprog_body (gnu_result);
 
   /* Attempt setting the end_locus of our GCC body tree, typically a