+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.
int accesses_prev_frame;
bool need_a7_copy;
bool vararg_a7;
+ rtx vararg_a7_copy;
rtx set_frame_ptr_insn;
};
/* 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)
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
{
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 ();
}
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);
}