mirror of git://gcc.gnu.org/git/gcc.git
i386.c (ix86_expand_prologue): Emit frame info for the special register pushes before frame probing and allocation.
* config/i386/i386.c (ix86_expand_prologue): Emit frame info for the special register pushes before frame probing and allocation. From-SVN: r193044
This commit is contained in:
parent
03d31730bf
commit
2455de3809
|
|
@ -1,3 +1,8 @@
|
||||||
|
2012-10-31 Eric Botcazou <ebotcazou@adacore.com>
|
||||||
|
|
||||||
|
* config/i386/i386.c (ix86_expand_prologue): Emit frame info for the
|
||||||
|
special register pushes before frame probing and allocation.
|
||||||
|
|
||||||
2012-10-31 Vladimir Makarov <vmakarov@redhat.com>
|
2012-10-31 Vladimir Makarov <vmakarov@redhat.com>
|
||||||
|
|
||||||
PR middle-end/55150
|
PR middle-end/55150
|
||||||
|
|
|
||||||
|
|
@ -10699,7 +10699,7 @@ ix86_expand_prologue (void)
|
||||||
rtx eax = gen_rtx_REG (Pmode, AX_REG);
|
rtx eax = gen_rtx_REG (Pmode, AX_REG);
|
||||||
rtx r10 = NULL;
|
rtx r10 = NULL;
|
||||||
rtx (*adjust_stack_insn)(rtx, rtx, rtx);
|
rtx (*adjust_stack_insn)(rtx, rtx, rtx);
|
||||||
|
const bool sp_is_cfa_reg = (m->fs.cfa_reg == stack_pointer_rtx);
|
||||||
bool eax_live = false;
|
bool eax_live = false;
|
||||||
bool r10_live = false;
|
bool r10_live = false;
|
||||||
|
|
||||||
|
|
@ -10708,16 +10708,31 @@ ix86_expand_prologue (void)
|
||||||
if (!TARGET_64BIT_MS_ABI)
|
if (!TARGET_64BIT_MS_ABI)
|
||||||
eax_live = ix86_eax_live_at_start_p ();
|
eax_live = ix86_eax_live_at_start_p ();
|
||||||
|
|
||||||
|
/* Note that SEH directives need to continue tracking the stack
|
||||||
|
pointer even after the frame pointer has been set up. */
|
||||||
if (eax_live)
|
if (eax_live)
|
||||||
{
|
{
|
||||||
emit_insn (gen_push (eax));
|
insn = emit_insn (gen_push (eax));
|
||||||
allocate -= UNITS_PER_WORD;
|
allocate -= UNITS_PER_WORD;
|
||||||
|
if (sp_is_cfa_reg || TARGET_SEH)
|
||||||
|
{
|
||||||
|
if (sp_is_cfa_reg)
|
||||||
|
m->fs.cfa_offset += UNITS_PER_WORD;
|
||||||
|
RTX_FRAME_RELATED_P (insn) = 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (r10_live)
|
if (r10_live)
|
||||||
{
|
{
|
||||||
r10 = gen_rtx_REG (Pmode, R10_REG);
|
r10 = gen_rtx_REG (Pmode, R10_REG);
|
||||||
emit_insn (gen_push (r10));
|
insn = emit_insn (gen_push (r10));
|
||||||
allocate -= UNITS_PER_WORD;
|
allocate -= UNITS_PER_WORD;
|
||||||
|
if (sp_is_cfa_reg || TARGET_SEH)
|
||||||
|
{
|
||||||
|
if (sp_is_cfa_reg)
|
||||||
|
m->fs.cfa_offset += UNITS_PER_WORD;
|
||||||
|
RTX_FRAME_RELATED_P (insn) = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
emit_move_insn (eax, GEN_INT (allocate));
|
emit_move_insn (eax, GEN_INT (allocate));
|
||||||
|
|
@ -10731,13 +10746,10 @@ ix86_expand_prologue (void)
|
||||||
insn = emit_insn (adjust_stack_insn (stack_pointer_rtx,
|
insn = emit_insn (adjust_stack_insn (stack_pointer_rtx,
|
||||||
stack_pointer_rtx, eax));
|
stack_pointer_rtx, eax));
|
||||||
|
|
||||||
/* Note that SEH directives need to continue tracking the stack
|
if (sp_is_cfa_reg || TARGET_SEH)
|
||||||
pointer even after the frame pointer has been set up. */
|
|
||||||
if (m->fs.cfa_reg == stack_pointer_rtx || TARGET_SEH)
|
|
||||||
{
|
{
|
||||||
if (m->fs.cfa_reg == stack_pointer_rtx)
|
if (sp_is_cfa_reg)
|
||||||
m->fs.cfa_offset += allocate;
|
m->fs.cfa_offset += allocate;
|
||||||
|
|
||||||
RTX_FRAME_RELATED_P (insn) = 1;
|
RTX_FRAME_RELATED_P (insn) = 1;
|
||||||
add_reg_note (insn, REG_FRAME_RELATED_EXPR,
|
add_reg_note (insn, REG_FRAME_RELATED_EXPR,
|
||||||
gen_rtx_SET (VOIDmode, stack_pointer_rtx,
|
gen_rtx_SET (VOIDmode, stack_pointer_rtx,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue