aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-03-21 17:14:41 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1994-03-21 17:14:41 -0500
commit987c71d9bcf5f1211dfde6e515d8a35675ca5983 (patch)
tree1c5e830176000ce5276584ff0f4c3f40dbf863c8 /gcc
parent88bdba96d92d97a61a674b1f4aa86364e0a1be60 (diff)
downloadgcc-987c71d9bcf5f1211dfde6e515d8a35675ca5983.zip
gcc-987c71d9bcf5f1211dfde6e515d8a35675ca5983.tar.gz
gcc-987c71d9bcf5f1211dfde6e515d8a35675ca5983.tar.bz2
(expand_expr, case ADDR_EXPR): Update temp slot address if we put it
in a register; mark result as pointer. From-SVN: r6842
Diffstat (limited to 'gcc')
-rw-r--r--gcc/expr.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 130d406..7a49abf 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -5779,6 +5779,10 @@ expand_expr (exp, target, tmode, modifier)
return expand_increment (exp, ! ignore);
case ADDR_EXPR:
+ /* If nonzero, TEMP will be set to the address of something that might
+ be a MEM corresponding to a stack slot. */
+ temp = 0;
+
/* Are we taking the address of a nested function? */
if (TREE_CODE (TREE_OPERAND (exp, 0)) == FUNCTION_DECL
&& decl_function_context (TREE_OPERAND (exp, 0)) != 0)
@@ -5803,6 +5807,8 @@ expand_expr (exp, target, tmode, modifier)
if (CONSTANT_P (op0))
op0 = force_const_mem (TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0))),
op0);
+ else if (GET_CODE (op0) == MEM)
+ temp = XEXP (op0, 0);
/* These cases happen in Fortran. Is that legitimate?
Should Fortran work in another way?
@@ -5827,10 +5833,21 @@ expand_expr (exp, target, tmode, modifier)
if (modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
return XEXP (op0, 0);
+
op0 = force_operand (XEXP (op0, 0), target);
}
+
if (flag_force_addr && GET_CODE (op0) != REG)
- return force_reg (Pmode, op0);
+ op0 = force_reg (Pmode, op0);
+
+ if (GET_CODE (op0) == REG)
+ mark_reg_pointer (op0);
+
+ /* If we might have had a temp slot, add an equivalent address
+ for it. */
+ if (temp != 0)
+ update_temp_slot_address (temp, op0);
+
return op0;
case ENTRY_VALUE_EXPR: