diff options
author | Jakub Jelinek <jakub@redhat.com> | 2000-11-08 14:10:00 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2000-11-08 14:10:00 +0100 |
commit | df6018fd2855dde2f06d355760e61d3eda587074 (patch) | |
tree | ba1b8d1af8c7165a8360784aadc7676cbba1be34 /gcc/expr.c | |
parent | 14ae1d508d156407fdb838a39b9eaee2f5c427b5 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 12 |
1 files changed, 10 insertions, 2 deletions
@@ -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; } |