From 2455de38092d824391fe2612cbf9dad890e349a7 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Wed, 31 Oct 2012 20:10:26 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/config/i386/i386.c | 28 ++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c9348ca184a..02e0d4ea66a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-10-31 Eric Botcazou + + * 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 PR middle-end/55150 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 7fbf3a73ad2..1c34bb28799 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -10699,7 +10699,7 @@ ix86_expand_prologue (void) rtx eax = gen_rtx_REG (Pmode, AX_REG); rtx r10 = NULL; 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 r10_live = false; @@ -10708,16 +10708,31 @@ ix86_expand_prologue (void) if (!TARGET_64BIT_MS_ABI) 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) { - emit_insn (gen_push (eax)); + insn = emit_insn (gen_push (eax)); 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) { r10 = gen_rtx_REG (Pmode, R10_REG); - emit_insn (gen_push (r10)); + insn = emit_insn (gen_push (r10)); 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)); @@ -10731,13 +10746,10 @@ ix86_expand_prologue (void) insn = emit_insn (adjust_stack_insn (stack_pointer_rtx, stack_pointer_rtx, eax)); - /* Note that SEH directives need to continue tracking the stack - pointer even after the frame pointer has been set up. */ - if (m->fs.cfa_reg == stack_pointer_rtx || TARGET_SEH) + if (sp_is_cfa_reg || TARGET_SEH) { - if (m->fs.cfa_reg == stack_pointer_rtx) + if (sp_is_cfa_reg) m->fs.cfa_offset += allocate; - RTX_FRAME_RELATED_P (insn) = 1; add_reg_note (insn, REG_FRAME_RELATED_EXPR, gen_rtx_SET (VOIDmode, stack_pointer_rtx, -- 2.34.1