aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2000-11-08 14:10:00 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2000-11-08 14:10:00 +0100
commitdf6018fd2855dde2f06d355760e61d3eda587074 (patch)
treeba1b8d1af8c7165a8360784aadc7676cbba1be34
parent14ae1d508d156407fdb838a39b9eaee2f5c427b5 (diff)
downloadgcc-df6018fd2855dde2f06d355760e61d3eda587074.zip
gcc-df6018fd2855dde2f06d355760e61d3eda587074.tar.gz
gcc-df6018fd2855dde2f06d355760e61d3eda587074.tar.bz2
expr.c (expand_expr): Handle when op0 is RETURN_DECL passed in multiple non-contiguous locations.
* expr.c (expand_expr) [ADDR_EXPR]: Handle when op0 is RETURN_DECL passed in multiple non-contiguous locations. From-SVN: r37316
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/expr.c12
2 files changed, 15 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 67c8b20..053253f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2000-11-08 Jakub Jelinek <jakub@redhat.com>
+
+ * expr.c (expand_expr) [ADDR_EXPR]: Handle when op0 is RETURN_DECL
+ passed in multiple non-contiguous locations.
+
2000-11-08 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
* README.gnat: Remove file.
diff --git a/gcc/expr.c b/gcc/expr.c
index 22ed6ad..b28db7f 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -8371,7 +8371,8 @@ expand_expr (exp, target, tmode, modifier)
}
else if (GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG
- || GET_CODE (op0) == CONCAT || GET_CODE (op0) == ADDRESSOF)
+ || GET_CODE (op0) == CONCAT || GET_CODE (op0) == ADDRESSOF
+ || GET_CODE (op0) == PARALLEL)
{
/* If this object is in a register, it must be not
be BLKmode. */
@@ -8379,7 +8380,14 @@ expand_expr (exp, target, tmode, modifier)
rtx memloc = assign_temp (inner_type, 1, 1, 1);
mark_temp_addr_taken (memloc);
- emit_move_insn (memloc, op0);
+ if (GET_CODE (op0) == PARALLEL)
+ /* Handle calls that pass values in multiple non-contiguous
+ locations. The Irix 6 ABI has examples of this. */
+ emit_group_store (memloc, op0,
+ int_size_in_bytes (inner_type),
+ TYPE_ALIGN (inner_type));
+ else
+ emit_move_insn (memloc, op0);
op0 = memloc;
}