From 0394741f9b89489efdd72c95fae7d2867065a72b Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Tue, 4 Jan 2011 09:43:56 +0000 Subject: [PATCH] trans.c (Subprogram_Body_to_gnu): Evaluate the expressions of the parameter cache within the statement group of... * 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 | 6 +++++ gcc/ada/gcc-interface/trans.c | 50 +++++++++++++++++------------------ 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 57d9c58b28f..f644a5569b0 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2011-01-04 Eric Botcazou + + * 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 Eric Botcazou diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 9bf7c3d77b7..ecd948993fb 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -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 -- 2.30.2