Commit 586fea26 by Eric Botcazou Committed by Eric Botcazou

gigi.h (add_stmt_force): Declare.

	* gcc-interface/gigi.h (add_stmt_force): Declare.
	(add_stmt_with_node_force): Likewise.
	* gcc-interface/trans.c (Attribute_to_gnu): Don't set TREE_SIDE_EFFECTS
	on the SAVE_EXPR built for cached expressions of parameter attributes.
	(Subprogram_Body_to_gnu): Force evaluation of the SAVE_EXPR built for
	cached expressions of parameter attributes.
	(add_stmt_force): New function.
	(add_stmt_with_node_force): Likewise.

From-SVN: r166222
parent 04ae82aa
2010-11-02 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/gigi.h (add_stmt_force): Declare.
(add_stmt_with_node_force): Likewise.
* gcc-interface/trans.c (Attribute_to_gnu): Don't set TREE_SIDE_EFFECTS
on the SAVE_EXPR built for cached expressions of parameter attributes.
(Subprogram_Body_to_gnu): Force evaluation of the SAVE_EXPR built for
cached expressions of parameter attributes.
(add_stmt_force): New function.
(add_stmt_with_node_force): Likewise.
2010-10-27 Eric Botcazou <ebotcazou@adacore.com> 2010-10-27 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/trans.c (gigi): Fix formatting issues. * gcc-interface/trans.c (gigi): Fix formatting issues.
......
...@@ -57,12 +57,19 @@ extern void rest_of_type_decl_compilation (tree t); ...@@ -57,12 +57,19 @@ extern void rest_of_type_decl_compilation (tree t);
/* Start a new statement group chained to the previous group. */ /* Start a new statement group chained to the previous group. */
extern void start_stmt_group (void); extern void start_stmt_group (void);
/* Add GNU_STMT to the current BLOCK_STMT node. */ /* Add GNU_STMT to the current statement group. If it is an expression with
no effects, it is ignored. */
extern void add_stmt (tree gnu_stmt); extern void add_stmt (tree gnu_stmt);
/* Similar, but set the location of GNU_STMT to that of GNAT_NODE. */ /* Similar, but the statement is always added, regardless of side-effects. */
extern void add_stmt_force (tree gnu_stmt);
/* Like add_stmt, but set the location of GNU_STMT to that of GNAT_NODE. */
extern void add_stmt_with_node (tree gnu_stmt, Node_Id gnat_node); extern void add_stmt_with_node (tree gnu_stmt, Node_Id gnat_node);
/* Similar, but the statement is always added, regardless of side-effects. */
extern void add_stmt_with_node_force (tree gnu_stmt, Node_Id gnat_node);
/* Return code corresponding to the current code group. It is normally /* Return code corresponding to the current code group. It is normally
a STATEMENT_LIST, but may also be a BIND_EXPR or TRY_FINALLY_EXPR if a STATEMENT_LIST, but may also be a BIND_EXPR or TRY_FINALLY_EXPR if
BLOCK or cleanups were set. */ BLOCK or cleanups were set. */
......
...@@ -1739,12 +1739,13 @@ Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute) ...@@ -1739,12 +1739,13 @@ Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute)
/* Cache the expression we have just computed. Since we want to do it /* Cache the expression we have just computed. Since we want to do it
at run time, we force the use of a SAVE_EXPR and let the gimplifier at run time, we force the use of a SAVE_EXPR and let the gimplifier
create the temporary. */ create the temporary in the outermost binding level. We will make
sure in Subprogram_Body_to_gnu that it is evaluated on all possible
paths by forcing its evaluation on entry of the function. */
if (pa) if (pa)
{ {
gnu_result gnu_result
= build1 (SAVE_EXPR, TREE_TYPE (gnu_result), gnu_result); = build1 (SAVE_EXPR, TREE_TYPE (gnu_result), gnu_result);
TREE_SIDE_EFFECTS (gnu_result) = 1;
if (attribute == Attr_First) if (attribute == Attr_First)
pa->first = gnu_result; pa->first = gnu_result;
else if (attribute == Attr_Last) else if (attribute == Attr_Last)
...@@ -2634,8 +2635,9 @@ Subprogram_Body_to_gnu (Node_Id gnat_node) ...@@ -2634,8 +2635,9 @@ Subprogram_Body_to_gnu (Node_Id gnat_node)
VEC_pop (tree, gnu_return_label_stack); VEC_pop (tree, gnu_return_label_stack);
/* If we populated the parameter attributes cache, we need to make sure /* If we populated the parameter attributes cache, we need to make sure that
that the cached expressions are evaluated on all possible paths. */ 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; cache = DECL_STRUCT_FUNCTION (gnu_subprog_decl)->language->parm_attr_cache;
if (cache) if (cache)
{ {
...@@ -2647,11 +2649,11 @@ Subprogram_Body_to_gnu (Node_Id gnat_node) ...@@ -2647,11 +2649,11 @@ Subprogram_Body_to_gnu (Node_Id gnat_node)
FOR_EACH_VEC_ELT (parm_attr, cache, i, pa) FOR_EACH_VEC_ELT (parm_attr, cache, i, pa)
{ {
if (pa->first) if (pa->first)
add_stmt_with_node (pa->first, gnat_node); add_stmt_with_node_force (pa->first, gnat_node);
if (pa->last) if (pa->last)
add_stmt_with_node (pa->last, gnat_node); add_stmt_with_node_force (pa->last, gnat_node);
if (pa->length) if (pa->length)
add_stmt_with_node (pa->length, gnat_node); add_stmt_with_node_force (pa->length, gnat_node);
} }
add_stmt (gnu_result); add_stmt (gnu_result);
...@@ -5969,7 +5971,8 @@ start_stmt_group (void) ...@@ -5969,7 +5971,8 @@ start_stmt_group (void)
current_stmt_group = group; current_stmt_group = group;
} }
/* Add GNU_STMT to the current statement group. */ /* Add GNU_STMT to the current statement group. If it is an expression with
no effects, it is ignored. */
void void
add_stmt (tree gnu_stmt) add_stmt (tree gnu_stmt)
...@@ -5977,7 +5980,15 @@ add_stmt (tree gnu_stmt) ...@@ -5977,7 +5980,15 @@ add_stmt (tree gnu_stmt)
append_to_statement_list (gnu_stmt, &current_stmt_group->stmt_list); append_to_statement_list (gnu_stmt, &current_stmt_group->stmt_list);
} }
/* Similar, but set the location of GNU_STMT to that of GNAT_NODE. */ /* Similar, but the statement is always added, regardless of side-effects. */
void
add_stmt_force (tree gnu_stmt)
{
append_to_statement_list_force (gnu_stmt, &current_stmt_group->stmt_list);
}
/* Like add_stmt, but set the location of GNU_STMT to that of GNAT_NODE. */
void void
add_stmt_with_node (tree gnu_stmt, Node_Id gnat_node) add_stmt_with_node (tree gnu_stmt, Node_Id gnat_node)
...@@ -5987,6 +5998,16 @@ add_stmt_with_node (tree gnu_stmt, Node_Id gnat_node) ...@@ -5987,6 +5998,16 @@ add_stmt_with_node (tree gnu_stmt, Node_Id gnat_node)
add_stmt (gnu_stmt); add_stmt (gnu_stmt);
} }
/* Similar, but the statement is always added, regardless of side-effects. */
void
add_stmt_with_node_force (tree gnu_stmt, Node_Id gnat_node)
{
if (Present (gnat_node))
set_expr_location_from_node (gnu_stmt, gnat_node);
add_stmt_force (gnu_stmt);
}
/* Add a declaration statement for GNU_DECL to the current statement group. /* Add a declaration statement for GNU_DECL to the current statement group.
Get SLOC from Entity_Id. */ Get SLOC from Entity_Id. */
......
2010-11-02 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/sizetype4.adb: New test.
2010-11-02 H.J. Lu <hongjiu.lu@intel.com> 2010-11-02 H.J. Lu <hongjiu.lu@intel.com>
* gcc.target/i386/avx-vzeroupper-15.c: New. * gcc.target/i386/avx-vzeroupper-15.c: New.
......
-- { dg-do run }
procedure Sizetype4 is
type Float_Array is array (Integer range <>) of Float;
NoFloats : Float_Array (1 .. 0);
procedure Q (Results : Float_Array := NoFloats) is
type Reply_Msg is
record
Request_Id : Integer;
Status : Integer;
Data : Float_Array (Results'Range);
end record;
begin
if Reply_Msg'Size /= 64 then
raise Program_Error;
end if;
end;
begin
Q;
end;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment