diff options
author | Walter Lee <walt@tilera.com> | 2012-03-07 17:58:52 +0000 |
---|---|---|
committer | Walter Lee <walt@gcc.gnu.org> | 2012-03-07 17:58:52 +0000 |
commit | 95f2389a7d909045ccbe7475945f823eabf91a03 (patch) | |
tree | 1f246a231a409cfe684156447a6b6c50bd088cf0 /gcc | |
parent | 5869104b39a940b7845b3546c510cad63cd791a2 (diff) | |
download | gcc-95f2389a7d909045ccbe7475945f823eabf91a03.zip gcc-95f2389a7d909045ccbe7475945f823eabf91a03.tar.gz gcc-95f2389a7d909045ccbe7475945f823eabf91a03.tar.bz2 |
Fix an unwinding bug for functions with dynamic stack frames.
* config/tilegx/tilegx.c (tilegx_expand_prologue): Don't generate
REG_CFA_* notes for the stack pointer.
(tilegx_expand_epilogue): Restore stack pointer by adjusting it by
EH_RETURN_STACKADJ_RTX.
* config/tilepro/tilepro.c (tilepro_expand_prologue): Don't
generate REG_CFA_* notes for the stack pointer.
(tilepro_expand_epilogue): Restore stack pointer by adjusting it
by EH_RETURN_STACKADJ_RTX.
From-SVN: r185070
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/config/tilegx/tilegx.c | 30 | ||||
-rw-r--r-- | gcc/config/tilepro/tilepro.c | 24 |
3 files changed, 35 insertions, 30 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4dee2ea..055832b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2012-03-07 Walter Lee <walt@tilera.com> + + * config/tilegx/tilegx.c (tilegx_expand_prologue): Don't generate + REG_CFA_* notes for the stack pointer. + (tilegx_expand_epilogue): Restore stack pointer by adjusting it by + EH_RETURN_STACKADJ_RTX. + * config/tilepro/tilepro.c (tilepro_expand_prologue): Don't + generate REG_CFA_* notes for the stack pointer. + (tilepro_expand_epilogue): Restore stack pointer by adjusting it + by EH_RETURN_STACKADJ_RTX. + 2012-03-07 Georg-Johann Lay <avr@gjlay.de> * doc/invoke.texi (AVR Built-in Macros): Correct condition for diff --git a/gcc/config/tilegx/tilegx.c b/gcc/config/tilegx/tilegx.c index fa739e3..217682e 100644 --- a/gcc/config/tilegx/tilegx.c +++ b/gcc/config/tilegx/tilegx.c @@ -3881,9 +3881,8 @@ tilegx_expand_prologue (void) { /* Copy the old stack pointer aside so we can save it later. */ sp_copy_regno = next_scratch_regno--; - insn = FRP (emit_move_insn (gen_rtx_REG (Pmode, sp_copy_regno), - stack_pointer_rtx)); - add_reg_note (insn, REG_CFA_REGISTER, NULL_RTX); + emit_move_insn (gen_rtx_REG (Pmode, sp_copy_regno), + stack_pointer_rtx); } if (tilegx_current_function_is_leaf ()) @@ -3925,8 +3924,8 @@ tilegx_expand_prologue (void) } /* Save our frame pointer for backtrace chaining. */ - FRP (frame_emit_store (sp_copy_regno, STACK_POINTER_REGNUM, - chain_addr, cfa, cfa_offset)); + emit_insn (gen_movdi (gen_frame_mem (DImode, chain_addr), + gen_rtx_REG (DImode, sp_copy_regno))); } /* Compute where to start storing registers we need to save. */ @@ -4067,16 +4066,7 @@ tilegx_expand_epilogue (bool sibcall_p) emit_insn (gen_blockage ()); - if (crtl->calls_eh_return) - { - rtx r = compute_frame_addr (-total_size + UNITS_PER_WORD, - &next_scratch_regno); - insn = emit_move_insn (gen_lowpart (DImode, stack_pointer_rtx), - gen_frame_mem (DImode, r)); - RTX_FRAME_RELATED_P (insn) = 1; - REG_NOTES (insn) = cfa_restores; - } - else if (frame_pointer_needed) + if (frame_pointer_needed) { /* Restore the old stack pointer by copying from the frame pointer. */ @@ -4100,6 +4090,16 @@ tilegx_expand_epilogue (bool sibcall_p) cfa_restores); } + if (crtl->calls_eh_return) + { + if (TARGET_32BIT) + emit_insn (gen_sp_adjust_32bit (stack_pointer_rtx, stack_pointer_rtx, + EH_RETURN_STACKADJ_RTX)); + else + emit_insn (gen_sp_adjust (stack_pointer_rtx, stack_pointer_rtx, + EH_RETURN_STACKADJ_RTX)); + } + /* Restore the old frame pointer. */ if (frame_pointer_needed) { diff --git a/gcc/config/tilepro/tilepro.c b/gcc/config/tilepro/tilepro.c index 71b5807..011ac08 100644 --- a/gcc/config/tilepro/tilepro.c +++ b/gcc/config/tilepro/tilepro.c @@ -3556,9 +3556,8 @@ tilepro_expand_prologue (void) { /* Copy the old stack pointer aside so we can save it later. */ sp_copy_regno = next_scratch_regno--; - insn = FRP (emit_move_insn (gen_rtx_REG (Pmode, sp_copy_regno), - stack_pointer_rtx)); - add_reg_note (insn, REG_CFA_REGISTER, NULL_RTX); + emit_move_insn (gen_rtx_REG (Pmode, sp_copy_regno), + stack_pointer_rtx); } if (tilepro_current_function_is_leaf ()) @@ -3600,8 +3599,8 @@ tilepro_expand_prologue (void) } /* Save our frame pointer for backtrace chaining. */ - FRP (frame_emit_store (sp_copy_regno, STACK_POINTER_REGNUM, - chain_addr, cfa, cfa_offset)); + emit_insn (gen_movsi (gen_frame_mem (SImode, chain_addr), + gen_rtx_REG (SImode, sp_copy_regno))); } /* Compute where to start storing registers we need to save. */ @@ -3742,16 +3741,7 @@ tilepro_expand_epilogue (bool sibcall_p) emit_insn (gen_blockage ()); - if (crtl->calls_eh_return) - { - rtx r = compute_frame_addr (-total_size + UNITS_PER_WORD, - &next_scratch_regno); - insn = emit_move_insn (gen_rtx_REG (Pmode, STACK_POINTER_REGNUM), - gen_frame_mem (Pmode, r)); - RTX_FRAME_RELATED_P (insn) = 1; - REG_NOTES (insn) = cfa_restores; - } - else if (frame_pointer_needed) + if (frame_pointer_needed) { /* Restore the old stack pointer by copying from the frame pointer. */ @@ -3767,6 +3757,10 @@ tilepro_expand_epilogue (bool sibcall_p) cfa_restores); } + if (crtl->calls_eh_return) + emit_insn (gen_sp_adjust (stack_pointer_rtx, stack_pointer_rtx, + EH_RETURN_STACKADJ_RTX)); + /* Restore the old frame pointer. */ if (frame_pointer_needed) { |