Skip to content

Commit

Permalink
PR ada/29025
Browse files Browse the repository at this point in the history
	* trans.c (gnat_gimplify_expr) <ADDR_EXPR>: When taking the address
	of a SAVE_EXPR, just make the operand addressable/not-readonly and
	let the common gimplifier code make and propagate a temporary copy.
	(call_to_gnu): Clarify the use of SAVE_EXPR for not addressable
	out/in-out actuals and defer setting the addressable/readonly bits
	to the gimplifier.



git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116929 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
ebotcazou committed Sep 13, 2006
1 parent 9f31d8d commit f55abd0
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 10 deletions.
10 changes: 10 additions & 0 deletions gcc/ada/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
2006-09-13 Olivier Hainque <[email protected]>

PR ada/29025
* trans.c (gnat_gimplify_expr) <ADDR_EXPR>: When taking the address
of a SAVE_EXPR, just make the operand addressable/not-readonly and
let the common gimplifier code make and propagate a temporary copy.
(call_to_gnu): Clarify the use of SAVE_EXPR for not addressable
out/in-out actuals and defer setting the addressable/readonly bits
to the gimplifier.

2006-09-13 Eric Botcazou <[email protected]>

PR ada/28591
Expand Down
27 changes: 17 additions & 10 deletions gcc/ada/trans.c
Original file line number Diff line number Diff line change
Expand Up @@ -1775,18 +1775,12 @@ call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target)
&& (TYPE_JUSTIFIED_MODULAR_P (gnu_name_type)))
gnu_name = convert (gnu_name_type, gnu_name);

/* Make a SAVE_EXPR to both properly account for potential side
effects and handle the creation of a temporary copy. Special
code in gnat_gimplify_expr ensures that the same temporary is
used as the actual and copied back after the call. */
gnu_actual = save_expr (gnu_name);

/* Since we're going to take the address of the SAVE_EXPR, we
don't want it to be marked as unchanging. So set
TREE_ADDRESSABLE. */
gnu_temp = skip_simple_arithmetic (gnu_actual);
if (TREE_CODE (gnu_temp) == SAVE_EXPR)
{
TREE_ADDRESSABLE (gnu_temp) = 1;
TREE_READONLY (gnu_temp) = 0;
}

/* Set up to move the copy back to the original. */
gnu_temp = build_binary_op (MODIFY_EXPR, NULL_TREE,
gnu_copy, gnu_actual);
Expand Down Expand Up @@ -4697,6 +4691,19 @@ gnat_gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p ATTRIBUTE_UNUSED)
return GS_ALL_DONE;
}

/* If we are taking the address of a SAVE_EXPR, we are typically
processing a misaligned argument to be passed by reference in a
procedure call. We just mark the operand as addressable + not
readonly here and let the common gimplifier code perform the
temporary creation, initialization, and "instantiation" in place of
the SAVE_EXPR in further operands, in particular in the copy back
code inserted after the call. */
else if (TREE_CODE (op) == SAVE_EXPR)
{
TREE_ADDRESSABLE (op) = 1;
TREE_READONLY (op) = 0;
}

/* Otherwise, if we are taking the address of something that is neither
reference, declaration, or constant, make a variable for the operand
here and then take its address. If we don't do it this way, we may
Expand Down

0 comments on commit f55abd0

Please sign in to comment.