From d04218c0d48c356563d23f4acf44e2a14dbd1a86 Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Sun, 17 Jun 2001 00:18:44 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/expr.c | 22 +++++++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 65f241aac1a..e0092a4900b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Sat Jun 16 20:20:39 2001 Richard Kenner + + * expr.c (expand_expr, case ADDR_EXPR): If taking address of SAVE_EXPR, + use put_var_into_stack. + 2001-06-16 Franz Sirl * gccspec.c (lang_specific_driver): If compiling ObjC, add diff --git a/gcc/expr.c b/gcc/expr.c index 96665688643..230cf9f1e6e 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -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) -- 2.30.2