diff options
author | jcmvbkbc <jcmvbkbc@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-05-30 23:38:45 +0000 |
---|---|---|
committer | jcmvbkbc <jcmvbkbc@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-05-30 23:38:45 +0000 |
commit | 1d58668f6232c9664c7c0c4c0376b62f2c765817 (patch) | |
tree | c4d857fb2727212674c57c6f987ce888287f2b3f | |
parent | 371c64883757db7254860ccb43171f67feaf5a4f (diff) | |
download | gcc-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/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/config/xtensa/xtensa.h | 4 | ||||
-rw-r--r-- | libgcc/ChangeLog | 8 | ||||
-rw-r--r-- | libgcc/config/xtensa/linux-unwind.h | 30 |
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 */ |