diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2012-10-31 20:10:26 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2012-10-31 20:10:26 +0000 |
commit | 2455de38092d824391fe2612cbf9dad890e349a7 (patch) | |
tree | c24922c6ba76cf3ef0324fab9758a7ba02cce799 | |
parent | 03d31730bfa422561a7e62915eb2c304bac27f19 (diff) | |
download | gcc-2455de38092d824391fe2612cbf9dad890e349a7.zip gcc-2455de38092d824391fe2612cbf9dad890e349a7.tar.gz gcc-2455de38092d824391fe2612cbf9dad890e349a7.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 28 |
2 files changed, 25 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c9348ca1..02e0d4e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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> PR middle-end/55150 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 7fbf3a7..1c34bb2 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, |