diff options
author | Richard Kenner <kenner@vlsi1.ultra.nyu.edu> | 2001-12-22 15:06:55 +0000 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 2001-12-22 10:06:55 -0500 |
commit | 6c7d86ec5e891cdd8ce1c8cfd1d28fe484e21e6b (patch) | |
tree | aeee74a86e08dd9c07d45510c1f95eee0a186bf1 /gcc/expr.c | |
parent | b5cd4ed4c3eb1db3d47e390a4546e2e8463a9a0c (diff) | |
download | gcc-6c7d86ec5e891cdd8ce1c8cfd1d28fe484e21e6b.zip gcc-6c7d86ec5e891cdd8ce1c8cfd1d28fe484e21e6b.tar.gz gcc-6c7d86ec5e891cdd8ce1c8cfd1d28fe484e21e6b.tar.bz2 |
expr.c (expand_expr, [...]): Handling taking address of SAVE_EXPR.
* expr.c (expand_expr, case ADDR_EXPR): Handling taking address of
SAVE_EXPR.
* function.c (gen_mem_addressof): Add missing tests for SAVE_EXPR.
(put_addressof_into_stack): Clarify code in setting of used_p.
From-SVN: r48268
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 40 |
1 files changed, 26 insertions, 14 deletions
@@ -8481,21 +8481,33 @@ expand_expr (exp, target, tmode, modifier) || GET_CODE (op0) == CONCAT || GET_CODE (op0) == ADDRESSOF || GET_CODE (op0) == PARALLEL) { - /* If this object is in a register, it must can't be BLKmode. */ - tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0)); - tree nt = build_qualified_type (inner_type, - (TYPE_QUALS (inner_type) - | TYPE_QUAL_CONST)); - rtx memloc = assign_temp (nt, 1, 1, 1); - - 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)); + /* If the operand is a SAVE_EXPR, we can deal with this by + forcing the SAVE_EXPR into memory. */ + if (TREE_CODE (TREE_OPERAND (exp, 0)) == SAVE_EXPR) + { + put_var_into_stack (TREE_OPERAND (exp, 0)); + op0 = SAVE_EXPR_RTL (TREE_OPERAND (exp, 0)); + } else - emit_move_insn (memloc, op0); - - op0 = memloc; + { + /* If this object is in a register, it can't be BLKmode. */ + tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0)); + tree nt = build_qualified_type (inner_type, + (TYPE_QUALS (inner_type) + | TYPE_QUAL_CONST)); + rtx memloc = assign_temp (nt, 1, 1, 1); + + 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)); + else + emit_move_insn (memloc, op0); + + op0 = memloc; + } } if (GET_CODE (op0) != MEM) |