xtensa: fix xtensa_fallback_frame_state for call0 ABI
authorMax Filippov <jcmvbkbc@gmail.com>
Tue, 15 Sep 2015 19:30:32 +0000 (19:30 +0000)
committerMax Filippov <jcmvbkbc@gcc.gnu.org>
Tue, 15 Sep 2015 19:30:32 +0000 (19:30 +0000)
2015-09-15  Max Filippov  <jcmvbkbc@gmail.com>
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.

From-SVN: r227809

gcc/ChangeLog
gcc/config/xtensa/xtensa.h
libgcc/ChangeLog
libgcc/config/xtensa/linux-unwind.h

index bb317cf7fac16e8c9aaaf371c288df4587efc81a..6805c03973bd993d0351e3a6697846a974d76c00 100644 (file)
@@ -1,3 +1,10 @@
+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.
+
 2015-09-15  Max Filippov  <jcmvbkbc@gmail.com>
 
        * config/xtensa/xtensa.c (xtensa_call_tls_desc): Use a10 or a2
index ebc8792f90a5648f3a84bb21602da9a32ec24ed8..01d93e98b6c50731066a9b0519824f188ac6752a 100644 (file)
@@ -813,7 +813,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                                                            \
index 10fd462fd29a4ae934de897ff82ca2395d0eeac1..472dd78c2c6a560e27cc4d61ccd14e6521ede1ce 100644 (file)
@@ -1,3 +1,8 @@
+2015-09-15  Max Filippov  <jcmvbkbc@gmail.com>
+
+       * config/xtensa/linux-unwind.h (xtensa_fallback_frame_state):
+       Add support for call0 ABI.
+
 2015-09-13  John David Anglin  <danglin@gcc.gnu.org>
 
        * config/pa/fptr.c (SIGN_EXTEND): Cast -1 to unsigned.
index 9daf738ff57a96dde0d2e64dcf8909901e2f2088..9a67b5d2b4614e9a09d4802f4111a2c148d59d20 100644 (file)
@@ -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  */