diff options
author | Richard Kenner <kenner@vlsi1.ultra.nyu.edu> | 2001-06-17 00:18:44 +0000 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 2001-06-16 20:18:44 -0400 |
commit | d04218c0d48c356563d23f4acf44e2a14dbd1a86 (patch) | |
tree | 22007ec64d1ed8a75a584fdbb4dc6fbe487786c0 /gcc | |
parent | eaea542ac23577f776afa97cdc13d1901d0db7c2 (diff) | |
download | gcc-d04218c0d48c356563d23f4acf44e2a14dbd1a86.zip gcc-d04218c0d48c356563d23f4acf44e2a14dbd1a86.tar.gz gcc-d04218c0d48c356563d23f4acf44e2a14dbd1a86.tar.bz2 |
expr.c (expand_expr, [...]): If taking address of SAVE_EXPR, use put_var_into_stack.
* expr.c (expand_expr, case ADDR_EXPR): If taking address of SAVE_EXPR,
use put_var_into_stack.
From-SVN: r43423
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/expr.c | 22 |
2 files changed, 20 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 65f241a..e0092a4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Sat Jun 16 20:20:39 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> + + * expr.c (expand_expr, case ADDR_EXPR): If taking address of SAVE_EXPR, + use put_var_into_stack. + 2001-06-16 Franz Sirl <Franz.Sirl-kernel@lauterbach.com> * gccspec.c (lang_specific_driver): If compiling ObjC, add @@ -7034,14 +7034,22 @@ expand_expr (exp, target, tmode, modifier) if (GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG || GET_CODE (op0) == CONCAT || GET_CODE (op0) == ADDRESSOF) { - tree nt = build_qualified_type (TREE_TYPE (tem), - (TYPE_QUALS (TREE_TYPE (tem)) - | TYPE_QUAL_CONST)); - rtx memloc = assign_temp (nt, 1, 1, 1); + /* 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)); + else + { + tree nt + = build_qualified_type (TREE_TYPE (tem), + (TYPE_QUALS (TREE_TYPE (tem)) + | TYPE_QUAL_CONST)); + rtx memloc = assign_temp (nt, 1, 1, 1); - mark_temp_addr_taken (memloc); - emit_move_insn (memloc, op0); - op0 = memloc; + mark_temp_addr_taken (memloc); + emit_move_insn (memloc, op0); + op0 = memloc; + } } if (GET_CODE (op0) != MEM) |