summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2004-09-11 17:48:22 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2004-09-11 17:48:22 +0000
commitb51e4016594502ad1c52dd6171b1df9a7356fb2c (patch)
tree854d5dc6fbfba7a5cf0b697767d56a2aa32db0d7
parent9ee3fec2629299e74674f4bb7b83c443d942fcc6 (diff)
downloadgcc-b51e4016594502ad1c52dd6171b1df9a7356fb2c.tar.gz
* expr.c (expand_expr_addr_expr_1) Rename from expand_expr_addr_expr.
(expand_expr_addr_expr): New function. Take ADDR_EXPR instead of the operand of the ADDR_EXPR. (expand_expr_real_1): Update to match. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@87355 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/expr.c40
2 files changed, 40 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e01779a5d46..80d1437f056 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-09-11 Richard Henderson <rth@redhat.com>
+
+ * expr.c (expand_expr_addr_expr_1) Rename from expand_expr_addr_expr.
+ (expand_expr_addr_expr): New function. Take ADDR_EXPR instead of the
+ operand of the ADDR_EXPR.
+ (expand_expr_real_1): Update to match.
+
2004-09-11 David Edelsohn <edelsohn@gnu.org>
PR target/17277
diff --git a/gcc/expr.c b/gcc/expr.c
index 44f485b32d4..83c8be5240f 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -6048,12 +6048,12 @@ expand_operands (tree exp0, tree exp1, rtx target, rtx *op0, rtx *op1,
}
-/* A subroutine of expand_expr. Evaluate the address of EXP.
+/* A subroutine of expand_expr_addr_expr. Evaluate the address of EXP.
The TARGET, TMODE and MODIFIER arguments are as for expand_expr. */
static rtx
-expand_expr_addr_expr (tree exp, rtx target, enum machine_mode tmode,
- enum expand_modifier modifier)
+expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode,
+ enum expand_modifier modifier)
{
rtx result, subtarget;
tree inner, offset;
@@ -6080,7 +6080,7 @@ expand_expr_addr_expr (tree exp, rtx target, enum machine_mode tmode,
case CONST_DECL:
/* Recurse and make the output_constant_def clause above handle this. */
- return expand_expr_addr_expr (DECL_INITIAL (exp), target,
+ return expand_expr_addr_expr_1 (DECL_INITIAL (exp), target,
tmode, modifier);
case REALPART_EXPR:
@@ -6140,7 +6140,7 @@ expand_expr_addr_expr (tree exp, rtx target, enum machine_mode tmode,
gcc_assert (inner != exp);
subtarget = offset || bitpos ? NULL_RTX : target;
- result = expand_expr_addr_expr (inner, subtarget, tmode, modifier);
+ result = expand_expr_addr_expr_1 (inner, subtarget, tmode, modifier);
if (tmode == VOIDmode)
{
@@ -6181,6 +6181,33 @@ expand_expr_addr_expr (tree exp, rtx target, enum machine_mode tmode,
return result;
}
+/* A subroutine of expand_expr. Evaluate EXP, which is an ADDR_EXPR.
+ The TARGET, TMODE and MODIFIER arguments are as for expand_expr. */
+
+static rtx
+expand_expr_addr_expr (tree exp, rtx target, enum machine_mode tmode,
+ enum expand_modifier modifier)
+{
+ enum machine_mode rmode;
+ rtx result;
+
+ result = expand_expr_addr_expr_1 (TREE_OPERAND (exp, 0), target,
+ tmode, modifier);
+
+ /* Despite expand_expr claims concerning ignoring TMODE when not
+ strictly convenient, stuff breaks if we don't honor it. */
+ if (tmode == VOIDmode)
+ tmode = TYPE_MODE (TREE_TYPE (exp));
+ rmode = GET_MODE (result);
+ if (rmode == VOIDmode)
+ rmode = tmode;
+ if (rmode != tmode)
+ result = convert_memory_address (tmode, result);
+
+ return result;
+}
+
+
/* expand_expr: generate code for computing expression EXP.
An rtx for the computed value is returned. The value is never null.
In the case of a void EXP, const0_rtx is returned.
@@ -8064,8 +8091,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
return const0_rtx;
case ADDR_EXPR:
- return expand_expr_addr_expr (TREE_OPERAND (exp, 0), target,
- tmode, modifier);
+ return expand_expr_addr_expr (exp, target, tmode, modifier);
/* COMPLEX type for Extended Pascal & Fortran */
case COMPLEX_EXPR: