aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBob Wilson <bob.wilson@acm.org>2007-09-12 16:57:25 +0000
committerBob Wilson <bwilson@gcc.gnu.org>2007-09-12 16:57:25 +0000
commit0d8442b8195b8b7b8c8f7d02e10743055bf45024 (patch)
tree84631dcd5fa6bb8d02363dd9f3ca67e907f44834 /gcc
parenta01246247eebd298896fa7634bb91276827aa743 (diff)
downloadgcc-0d8442b8195b8b7b8c8f7d02e10743055bf45024.zip
gcc-0d8442b8195b8b7b8c8f7d02e10743055bf45024.tar.gz
gcc-0d8442b8195b8b7b8c8f7d02e10743055bf45024.tar.bz2
xtensa.c (machine_function): Add vararg_a7_copy.
* config/xtensa/xtensa.c (machine_function): Add vararg_a7_copy. (xtensa_copy_incoming_a7): Use start_sequence instead of push_to_sequence. Stash insns in vararg_a7_copy for builtin_saveregs. (xtensa_builtin_saveregs): Place code from vararg_a7_copy at the start of the saveregs sequence. From-SVN: r128443
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/xtensa/xtensa.c16
2 files changed, 19 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5c380f3..af05fca 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2007-09-12 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/xtensa.c (machine_function): Add vararg_a7_copy.
+ (xtensa_copy_incoming_a7): Use start_sequence instead of
+ push_to_sequence. Stash insns in vararg_a7_copy for builtin_saveregs.
+ (xtensa_builtin_saveregs): Place code from vararg_a7_copy at the start
+ of the saveregs sequence.
+
2007-09-12 Richard Sandiford <richard@codesourcery.com>
* c-tree.h (grokfield): Add a "tree *" argument.
diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c
index 2b30799..79c4d89 100644
--- a/gcc/config/xtensa/xtensa.c
+++ b/gcc/config/xtensa/xtensa.c
@@ -94,6 +94,7 @@ struct machine_function GTY(())
int accesses_prev_frame;
bool need_a7_copy;
bool vararg_a7;
+ rtx vararg_a7_copy;
rtx set_frame_ptr_insn;
};
@@ -1004,7 +1005,7 @@ xtensa_copy_incoming_a7 (rtx opnd)
/* Copy a7 to a new pseudo at the function entry. Use gen_raw_REG to
create the REG for a7 so that hard_frame_pointer_rtx is not used. */
- push_to_sequence (entry_insns);
+ start_sequence ();
tmp = gen_reg_rtx (mode);
switch (mode)
@@ -1038,10 +1039,11 @@ xtensa_copy_incoming_a7 (rtx opnd)
if (cfun->machine->vararg_a7)
{
- /* This is called from within builtin_savereg, so we're already
- inside a start_sequence that will be placed at the start of
- the function. */
- emit_insn (entry_insns);
+ /* This is called from within builtin_saveregs, which will insert the
+ saveregs code at the function entry, ahead of anything placed at
+ the function entry now. Instead, save the sequence to be inserted
+ at the beginning of the saveregs code. */
+ cfun->machine->vararg_a7_copy = entry_insns;
}
else
{
@@ -1050,6 +1052,8 @@ xtensa_copy_incoming_a7 (rtx opnd)
chain current, so the code is placed at the start of the
function. */
push_topmost_sequence ();
+ /* Do not use entry_of_function() here. This is called from within
+ expand_function_start, when the CFG still holds GIMPLE. */
emit_insn_after (entry_insns, get_insns ());
pop_topmost_sequence ();
}
@@ -2454,6 +2458,8 @@ xtensa_builtin_saveregs (void)
adjust_address (gp_regs, BLKmode,
arg_words * UNITS_PER_WORD),
gp_left);
+ gcc_assert (cfun->machine->vararg_a7_copy != 0);
+ emit_insn_before (cfun->machine->vararg_a7_copy, get_insns ());
return XEXP (gp_regs, 0);
}