From patchwork Wed Mar 7 18:01:34 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Walter Lee X-Patchwork-Id: 145322 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 98104B6EF1 for ; Thu, 8 Mar 2012 05:01:55 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1331748117; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Date:Message-Id:From:To:Subject:Reply-to:Mailing-List:Precedence: List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender: Delivered-To; bh=Yy/2musrLd0tfCpIOElI16K0Vd0=; b=rhUzAH4DBFz8mL4 1ZqRe0wuM6Yh8GJ3pUcJvAMtJt4Oj4mnMehRfc+moCq8GBTRamb1VB4RObHIqu7+ jWqGlnL/YQ2pBRfaEwVgS5Q9NmpdenMe4dxWb1FURYfoVr22rAKzFfd8J1dZckvp Ri7v80bfViUAexjWizSjSVWVCIrw= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:Date:Message-Id:From:To:Subject:Reply-to:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=kY+m70C6rNaiRfv10gdGKcknwOlV57uBXhklqBG/57jqAJMTXtioxoFu5viJqm TEk3BQ0VyJAsSDNGgwcDW4OhNckCuh5J4ScQnPHgDKBrnJUmL1zMtuzCXb3ujFtU lDsmk0DkLglSOT5PUyXSu+P8EUaxphZVTX1+BZ+5Bie0Y=; Received: (qmail 5178 invoked by alias); 7 Mar 2012 18:01:51 -0000 Received: (qmail 5168 invoked by uid 22791); 7 Mar 2012 18:01:49 -0000 X-SWARE-Spam-Status: No, hits=-0.9 required=5.0 tests=AWL, BAYES_00, KHOP_DYNAMIC, RDNS_DYNAMIC, TVD_RCVD_IP X-Spam-Check-By: sourceware.org Received: from 206.83.70.73.ptr.us.xo.net (HELO king.tilera.com) (206.83.70.73) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 07 Mar 2012 18:01:35 +0000 Received: from farm-0039.internal.tilera.com ([10.2.0.69]) by king.tilera.com over TLS secured channel with Microsoft SMTPSVC(6.0.3790.3959); Wed, 7 Mar 2012 13:01:34 -0500 Received: (from walt@localhost) by farm-0039.internal.tilera.com (8.13.8/8.12.11/Submit) id q27I1YWm017484; Wed, 7 Mar 2012 13:01:34 -0500 Date: Wed, 7 Mar 2012 13:01:34 -0500 Message-Id: <201203071801.q27I1YWm017484@farm-0039.internal.tilera.com> From: Walter Lee To: gcc-patches@gcc.gnu.org Subject: [committed] TILE-Gx/TILEPro: unwind fix for dynamic frames Reply-to: Walter Lee Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org This patch fixes an unwinding bug for functions with dynamic stack frames. We stop generating REG_CFA_* notes for stack pointer, and at the end of unwinding we restore the stack pointer by adjusting it by EH_RETURN_STACKADJ_RTX. Walter 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) {