summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjcmvbkbc <jcmvbkbc@138bc75d-0d04-0410-961f-82ee72b054a4>2017-05-30 23:38:45 +0000
committerjcmvbkbc <jcmvbkbc@138bc75d-0d04-0410-961f-82ee72b054a4>2017-05-30 23:38:45 +0000
commit1d58668f6232c9664c7c0c4c0376b62f2c765817 (patch)
treec4d857fb2727212674c57c6f987ce888287f2b3f
parent371c64883757db7254860ccb43171f67feaf5a4f (diff)
downloadgcc-1d58668f6232c9664c7c0c4c0376b62f2c765817.tar.gz
xtensa: fix xtensa_fallback_frame_state for call0 ABI
2017-05-30 Max Filippov <jcmvbkbc@gmail.com> gcc/ Backport from mainline 2015-09-15 Max Filippov <jcmvbkbc@gmail.com> * config/xtensa/xtensa.h (DWARF_ALT_FRAME_RETURN_COLUMN): New definition. (DWARF_FRAME_REGISTERS): Reserve space for one extra register in call0 ABI. libgcc/ Backport from mainline 2015-09-15 Max Filippov <jcmvbkbc@gmail.com> * config/xtensa/linux-unwind.h (xtensa_fallback_frame_state): Add support for call0 ABI. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-5-branch@248705 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/xtensa/xtensa.h4
-rw-r--r--libgcc/ChangeLog8
-rw-r--r--libgcc/config/xtensa/linux-unwind.h30
4 files changed, 49 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4e53b9fd656..a342215ce17 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -3,6 +3,16 @@
Backport from mainline
2015-09-15 Max Filippov <jcmvbkbc@gmail.com>
+ * config/xtensa/xtensa.h (DWARF_ALT_FRAME_RETURN_COLUMN): New
+ definition.
+ (DWARF_FRAME_REGISTERS): Reserve space for one extra register in
+ call0 ABI.
+
+2017-05-30 Max Filippov <jcmvbkbc@gmail.com>
+
+ Backport from mainline
+ 2015-09-15 Max Filippov <jcmvbkbc@gmail.com>
+
* config/xtensa/xtensa.c (xtensa_call_tls_desc): Use a10 or a2
to pass TLS call argument, according to current ABI.
* config/xtensa/xtensa.md (tls_call pattern): Use callx8 or
diff --git a/gcc/config/xtensa/xtensa.h b/gcc/config/xtensa/xtensa.h
index 011411c09bf..4970acdaa7a 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/ChangeLog b/libgcc/ChangeLog
index c9b698f3799..3fa9da8d16e 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,6 +1,14 @@
2017-05-30 Max Filippov <jcmvbkbc@gmail.com>
Backport from mainline
+ 2015-09-15 Max Filippov <jcmvbkbc@gmail.com>
+
+ * config/xtensa/linux-unwind.h (xtensa_fallback_frame_state):
+ Add support for call0 ABI.
+
+2017-05-30 Max Filippov <jcmvbkbc@gmail.com>
+
+ Backport from mainline
2015-08-18 Max Filippov <jcmvbkbc@gmail.com>
* config/xtensa/unwind-dw2-xtensa.c (_Unwind_GetCFA): Return
diff --git a/libgcc/config/xtensa/linux-unwind.h b/libgcc/config/xtensa/linux-unwind.h
index 9daf738ff57..9a67b5d2b46 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 */