From patchwork Tue Sep 15 10:00:51 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Max Filippov X-Patchwork-Id: 517785 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 9F0E71401AD for ; Tue, 15 Sep 2015 20:02:09 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=CJKSB44T; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:in-reply-to:references; q=dns; s= default; b=F71rV1dgpTMI6BbDVVDlM6T6DppkYR46AcznaGHImFDPkC9jJRWDE wMJ+/ScxP1TE+P53XvDig6z9sbfjymAswC6db9D5n32QvN7gcyCGHI9j59QwSNjx tG7B5D750DpegrSrEvxcKnFPXNxkpPizvVG8oflywmKpLhLRNKVwPM= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:in-reply-to:references; s= default; bh=FB0KqLswU17+/p5US9YANtSn4o8=; b=CJKSB44TeZPHBhFLv3fr dhz/h6mj/t2XTpCmeCBGSUQX1UZ07VD3guUWcVJoOMA3ibAg4f5AUpriND9b3Qt+ lyoTelLL9Js2OIOEpMKCprUptpvtjE0ROLJzGd27Nxr0NvbG19VHWCFHtGb70AEv Jz5CWcQJc2EFIVh0LcTo5B4= Received: (qmail 8849 invoked by alias); 15 Sep 2015 10:01:42 -0000 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 Received: (qmail 8721 invoked by uid 89); 15 Sep 2015 10:01:42 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.7 required=5.0 tests=AWL, BAYES_50, FREEMAIL_FROM, FROM_LOCAL_NOVOWEL, HK_RANDOM_ENVFROM, HK_RANDOM_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=no version=3.3.2 X-HELO: mail-lb0-f174.google.com Received: from mail-lb0-f174.google.com (HELO mail-lb0-f174.google.com) (209.85.217.174) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Tue, 15 Sep 2015 10:01:25 +0000 Received: by lbbmp1 with SMTP id mp1so81866595lbb.1 for ; Tue, 15 Sep 2015 03:01:21 -0700 (PDT) X-Received: by 10.112.83.136 with SMTP id q8mr19486599lby.93.1442311281719; Tue, 15 Sep 2015 03:01:21 -0700 (PDT) Received: from octofox.metropolis ([5.19.183.212]) by smtp.gmail.com with ESMTPSA id h5sm3156376lab.32.2015.09.15.03.01.20 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 15 Sep 2015 03:01:21 -0700 (PDT) From: Max Filippov To: gcc-patches@gcc.gnu.org Cc: linux-xtensa@linux-xtensa.org, Sterling Augustine , Max Filippov Subject: [PATCH 2/2] xtensa: fix xtensa_fallback_frame_state for call0 ABI Date: Tue, 15 Sep 2015 13:00:51 +0300 Message-Id: <1442311251-28016-3-git-send-email-jcmvbkbc@gmail.com> In-Reply-To: <1442311251-28016-1-git-send-email-jcmvbkbc@gmail.com> References: <1442311251-28016-1-git-send-email-jcmvbkbc@gmail.com> X-IsSubscribed: yes 2015-09-15 Max Filippov gcc/ * config/xtensa/xtensa.h (DWARF_ALT_FRAME_RETURN_COLUMN): New definition. (DWARF_FRAME_REGISTERS): Reserve space for one extra register in call0 ABI. libgcc/ * config/xtensa/linux-unwind.h (xtensa_fallback_frame_state): Add support for call0 ABI. --- gcc/config/xtensa/xtensa.h | 4 +++- libgcc/config/xtensa/linux-unwind.h | 30 ++++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/gcc/config/xtensa/xtensa.h b/gcc/config/xtensa/xtensa.h index 011411c..4970acd 100644 --- a/gcc/config/xtensa/xtensa.h +++ b/gcc/config/xtensa/xtensa.h @@ -812,7 +812,9 @@ typedef struct xtensa_args for debugging. */ #define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, 0) #define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (0) -#define DWARF_FRAME_REGISTERS 16 +#define DWARF_ALT_FRAME_RETURN_COLUMN 16 +#define DWARF_FRAME_REGISTERS (DWARF_ALT_FRAME_RETURN_COLUMN \ + + (TARGET_WINDOWED_ABI ? 0 : 1)) #define EH_RETURN_DATA_REGNO(N) ((N) < 2 ? (N) + 2 : INVALID_REGNUM) #define ASM_PREFERRED_EH_DATA_FORMAT(CODE, GLOBAL) \ (flag_pic \ diff --git a/libgcc/config/xtensa/linux-unwind.h b/libgcc/config/xtensa/linux-unwind.h index 9daf738..9a67b5d 100644 --- a/libgcc/config/xtensa/linux-unwind.h +++ b/libgcc/config/xtensa/linux-unwind.h @@ -52,7 +52,6 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define ENTRY_BYTE 0x36 #endif -#ifdef __XTENSA_WINDOWED_ABI__ #define MD_FALLBACK_FRAME_STATE_FOR xtensa_fallback_frame_state static _Unwind_Reason_Code @@ -61,6 +60,10 @@ xtensa_fallback_frame_state (struct _Unwind_Context *context, { unsigned char *pc = context->ra; struct sigcontext *sc; +#if defined(__XTENSA_CALL0_ABI__) + _Unwind_Ptr new_cfa; + int i; +#endif struct rt_sigframe { siginfo_t info; @@ -76,6 +79,7 @@ xtensa_fallback_frame_state (struct _Unwind_Context *context, || pc[5] != SYSC_BYTE2) return _URC_END_OF_STACK; +#if defined(__XTENSA_WINDOWED_ABI__) rt_ = context->sp; sc = &rt_->uc.uc_mcontext; fs->signal_regs = (_Unwind_Word *) sc->sc_a; @@ -90,11 +94,33 @@ xtensa_fallback_frame_state (struct _Unwind_Context *context, } else fs->signal_ra = sc->sc_pc; +#elif defined(__XTENSA_CALL0_ABI__) + rt_ = context->cfa; + sc = &rt_->uc.uc_mcontext; + + new_cfa = (_Unwind_Ptr) sc; + fs->regs.cfa_how = CFA_REG_OFFSET; + fs->regs.cfa_reg = __LIBGCC_STACK_POINTER_REGNUM__; + fs->regs.cfa_offset = new_cfa - (_Unwind_Ptr) context->cfa; + + for (i = 0; i < 16; i++) + { + fs->regs.reg[i].how = REG_SAVED_OFFSET; + fs->regs.reg[i].loc.offset = (_Unwind_Ptr) &(sc->sc_a[i]) - new_cfa; + } + + fs->regs.reg[__LIBGCC_DWARF_ALT_FRAME_RETURN_COLUMN__].how = + REG_SAVED_VAL_OFFSET; + fs->regs.reg[__LIBGCC_DWARF_ALT_FRAME_RETURN_COLUMN__].loc.offset = + (_Unwind_Ptr) (sc->sc_pc) - new_cfa; + fs->retaddr_column = __LIBGCC_DWARF_ALT_FRAME_RETURN_COLUMN__; +#else +#error Unsupported Xtensa ABI +#endif fs->signal_frame = 1; return _URC_NO_REASON; } -#endif /* __XTENSA_WINDOWED_ABI__ */ #endif /* ifdef inhibit_libc */