diff options
author | jcmvbkbc <jcmvbkbc@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-03-03 17:44:01 +0000 |
---|---|---|
committer | jcmvbkbc <jcmvbkbc@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-03-03 17:44:01 +0000 |
commit | b89c671bd31c5800b0ed31099ef80da93b583597 (patch) | |
tree | 9be5f05236a1e486da98109a8e4cd76a6753f556 /libgcc | |
parent | 814fa41b6edef713653d4b946602253be4204968 (diff) | |
download | gcc-b89c671bd31c5800b0ed31099ef80da93b583597.tar.gz |
Implement call0 ABI for xtensa
call0 is an ABI that doesn't use register windows.
2015-03-03 Max Filippov <jcmvbkbc@gmail.com>
gcc/
* config/xtensa/constraints.md ("a" constraint): Include stack
pointer in case of call0 ABI.
("q" constraint): Make empty in case of call0 ABI.
("D" constraint): Include stack pointer in case of call0 ABI.
* config/xtensa/xtensa-protos.h (xtensa_set_return_address,
xtensa_expand_epilogue, xtensa_regno_to_class): Add new function
prototypes.
* config/xtensa/xtensa.c (xtensa_callee_save_size): New
variable.
(xtensa_regno_to_class): Make it a local variable in the
function xtensa_regno_to_class.
(xtensa_function_epilogue, TARGET_ASM_FUNCTION_EPILOGUE): Remove
macro, function prototype and implementation.
(reg_nonleaf_alloc_order): Make it a local variable in the
function order_regs_for_local_alloc.
(xtensa_conditional_register_usage): New function.
(TARGET_CONDITIONAL_REGISTER_USAGE): Define macro.
(xtensa_valid_move): Allow direct moves to stack pointer
register in call0 ABI.
(xtensa_setup_frame_addresses): Only spill register windows in
windowed ABI.
(xtensa_emit_call): Emit call(x)8 or call(x)0 in windowed and
call0 ABI respectively.
(xtensa_function_arg_1): Only mark a7 register for copying in
windowed ABI.
(xtensa_call_save_reg): New function.
(compute_frame_size): Add space for callee saved register
storage to the frame size in call0 ABI.
(xtensa_expand_prologue): Generate code to set up stack frame
and save callee-saved registers in call0 ABI.
(xtensa_expand_epilogue): New function.
(xtensa_set_return_address): New function.
(xtensa_return_addr): Calculate return address in call0 ABI.
(xtensa_builtin_saveregs): Only mark a7 register for copying and
emit copying code in windowed ABI.
(order_regs_for_local_alloc): Add preferred register allocation
order for non-leaf function in call0 ABI.
(xtensa_static_chain): Add atatic chain passing for call0 ABI.
(xtensa_asm_trampoline_template): Add trampoline generation for
call0 ABI.
(xtensa_trampoline_init): Add trampoline initialization for
call0 ABI.
(xtensa_conditional_register_usage, xtensa_regno_to_class): New
functions.
* config/xtensa/xtensa.h (TARGET_WINDOWED_ABI): New macro.
(TARGET_CPU_CPP_BUILTINS): Add built-in define for call0 ABI.
(CALL_USED_REGISTERS): Modify to encode both windowed and call0
ABI call-used registers.
(HARD_FRAME_POINTER_REGNUM): Add frame pointer for call0 ABI.
(INCOMING_REGNO, OUTGOING_REGNO): Use argument unchanged in
call0 ABI.
(REG_CLASS_CONTENTS): Include all registers into the preferred
reload registers set, adjust the set in the
xtensa_conditional_register_usage.
(xtensa_regno_to_class): Drop variable declaration.
(REGNO_REG_CLASS): Redefine to use xtensa_regno_to_class
function.
(WINDOW_SIZE): Define as 8 or 0 for windowed and call0 ABI
respectively.
(FUNCTION_PROFILER): Add _mcount call for call0 ABI.
(TRAMPOLINE_SIZE): Define trampoline size for call0 ABI.
(RETURN_ADDR_IN_PREVIOUS_FRAME): Define to 0 in call0 ABI.
(ASM_OUTPUT_POOL_PROLOGUE): Always generate literal pool
location in call0 ABI.
(EH_RETURN_STACKADJ_RTX): New definition, use a10 for passing
stack adjustment size when handling exception.
(CRT_CALL_STATIC_FUNCTION): Add definition for call0 ABI.
* config/xtensa/xtensa.md (A9_REG, UNSPECV_BLOCKAGE): New
definitions.
("return" pattern): Generate ret.n/ret in call0 ABI.
("epilogue" pattern): Expand epilogue.
("nonlocal_goto" pattern): Use default in call0 ABI.
("eh_return" pattern): Move implementation to eh_set_a0_windowed,
emit eh_set_a0_* depending on ABI.
("eh_set_a0_windowed" pattern): Former eh_return pattern.
("eh_set_a0_call0", "blockage"): New patterns.
libgcc/
* config/xtensa/lib2funcs.S (__xtensa_libgcc_window_spill,
__xtensa_nonlocal_goto): Don't compile for call0 ABI.
(__xtensa_sync_caches): Only use entry and retw in windowed ABI,
use ret in call0 ABI.
* config/xtensa/t-windowed: New file.
* libgcc/config/xtensa/t-xtensa (LIB2ADDEH): Move to t-windowed.
* libgcc/configure: Regenerated.
* libgcc/configure.ac: Check if xtensa target is configured for
windowed ABI and thus needs to use custom unwind code.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@221158 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgcc')
-rw-r--r-- | libgcc/ChangeLog | 13 | ||||
-rw-r--r-- | libgcc/config/xtensa/lib2funcs.S | 10 | ||||
-rw-r--r-- | libgcc/config/xtensa/linux-unwind.h | 3 | ||||
-rw-r--r-- | libgcc/config/xtensa/t-windowed | 2 | ||||
-rw-r--r-- | libgcc/config/xtensa/t-xtensa | 3 | ||||
-rw-r--r-- | libgcc/configure | 21 | ||||
-rw-r--r-- | libgcc/configure.ac | 16 |
7 files changed, 65 insertions, 3 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 35e8f858f9b..49eee7a24a4 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,16 @@ +2015-03-03 Max Filippov <jcmvbkbc@gmail.com> + + Implement call0 ABI for xtensa + * config/xtensa/lib2funcs.S (__xtensa_libgcc_window_spill, + __xtensa_nonlocal_goto): Don't compile for call0 ABI. + (__xtensa_sync_caches): Only use entry and retw in windowed ABI, + use ret in call0 ABI. + * config/xtensa/t-windowed: New file. + * libgcc/config/xtensa/t-xtensa (LIB2ADDEH): Move to t-windowed. + * libgcc/configure: Regenerated. + * libgcc/configure.ac: Check if xtensa target is configured for + windowed ABI and thus needs to use custom unwind code. + 2015-02-12 Jonathan Wakely <jwakely@redhat.com> PR libgcc/64885 diff --git a/libgcc/config/xtensa/lib2funcs.S b/libgcc/config/xtensa/lib2funcs.S index 1014a19732a..4d451c8c71c 100644 --- a/libgcc/config/xtensa/lib2funcs.S +++ b/libgcc/config/xtensa/lib2funcs.S @@ -29,6 +29,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see current register window. This is used to set up the stack so that arbitrary frames can be accessed. */ +#if XCHAL_HAVE_WINDOWED && !__XTENSA_CALL0_ABI__ .align 4 .global __xtensa_libgcc_window_spill .type __xtensa_libgcc_window_spill,@function @@ -38,6 +39,7 @@ __xtensa_libgcc_window_spill: syscall retw .size __xtensa_libgcc_window_spill, .-__xtensa_libgcc_window_spill +#endif /* __xtensa_nonlocal_goto: This code does all the hard work of a @@ -51,6 +53,7 @@ __xtensa_libgcc_window_spill: This function never returns to its caller but instead goes directly to the address of the specified goto handler. */ +#if XCHAL_HAVE_WINDOWED && !__XTENSA_CALL0_ABI__ .align 4 .global __xtensa_nonlocal_goto .type __xtensa_nonlocal_goto,@function @@ -128,6 +131,7 @@ __xtensa_nonlocal_goto: retw .size __xtensa_nonlocal_goto, .-__xtensa_nonlocal_goto +#endif /* __xtensa_sync_caches: This function is called after writing a trampoline @@ -154,7 +158,9 @@ __xtensa_nonlocal_goto: .global __xtensa_sync_caches .type __xtensa_sync_caches,@function __xtensa_sync_caches: +#if XCHAL_HAVE_WINDOWED && !__XTENSA_CALL0_ABI__ entry sp, 32 +#endif #if XCHAL_DCACHE_SIZE > 0 /* Flush the trampoline from the data cache. */ extui a4, a2, 0, XCHAL_DCACHE_LINEWIDTH @@ -182,5 +188,9 @@ __xtensa_sync_caches: bnez a4, .Licache_loop #endif isync +#if XCHAL_HAVE_WINDOWED && !__XTENSA_CALL0_ABI__ retw +#else + ret +#endif .size __xtensa_sync_caches, .-__xtensa_sync_caches diff --git a/libgcc/config/xtensa/linux-unwind.h b/libgcc/config/xtensa/linux-unwind.h index eed3be5cdce..9daf738ff57 100644 --- a/libgcc/config/xtensa/linux-unwind.h +++ b/libgcc/config/xtensa/linux-unwind.h @@ -52,6 +52,7 @@ 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 @@ -94,4 +95,6 @@ xtensa_fallback_frame_state (struct _Unwind_Context *context, return _URC_NO_REASON; } +#endif /* __XTENSA_WINDOWED_ABI__ */ + #endif /* ifdef inhibit_libc */ diff --git a/libgcc/config/xtensa/t-windowed b/libgcc/config/xtensa/t-windowed new file mode 100644 index 00000000000..7d9e9db0487 --- /dev/null +++ b/libgcc/config/xtensa/t-windowed @@ -0,0 +1,2 @@ +LIB2ADDEH = $(srcdir)/config/xtensa/unwind-dw2-xtensa.c \ + $(srcdir)/unwind-dw2-fde.c $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c diff --git a/libgcc/config/xtensa/t-xtensa b/libgcc/config/xtensa/t-xtensa index 27399e67fa0..ed3eb84a71b 100644 --- a/libgcc/config/xtensa/t-xtensa +++ b/libgcc/config/xtensa/t-xtensa @@ -11,6 +11,3 @@ LIB1ASMFUNCS = _mulsi3 _divsi3 _modsi3 _udivsi3 _umodsi3 \ _truncdfsf2 _extendsfdf2 LIB2ADD = $(srcdir)/config/xtensa/lib2funcs.S - -LIB2ADDEH = $(srcdir)/config/xtensa/unwind-dw2-xtensa.c \ - $(srcdir)/unwind-dw2-fde.c $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c diff --git a/libgcc/configure b/libgcc/configure index a88259da325..9d567f9d48c 100644 --- a/libgcc/configure +++ b/libgcc/configure @@ -4810,6 +4810,27 @@ EOF ;; esac +# Check if xtensa target is configured for windowed ABI and thus needs to use +# custom unwind code. +# This is after config.host so we can augment tmake_file. +case ${host} in +xtensa*-*) + cat > conftest.c <<EOF + #ifdef __XTENSA_CALL0_ABI__ + #error + #endif +EOF + if { ac_try='${CC-cc} -E -o conftest.i conftest.c 1>&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + tmake_file="${tmake_file} xtensa/t-windowed" + fi + ;; +esac + # Check for visibility support. This is after config.host so that # we can check for asm_hidden_op. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__((visibility(\"hidden\")))" >&5 diff --git a/libgcc/configure.ac b/libgcc/configure.ac index 5edcbde69dd..1c405e8dfe5 100644 --- a/libgcc/configure.ac +++ b/libgcc/configure.ac @@ -436,6 +436,22 @@ EOF ;; esac +# Check if xtensa target is configured for windowed ABI and thus needs to use +# custom unwind code. +# This is after config.host so we can augment tmake_file. +case ${host} in +xtensa*-*) + cat > conftest.c <<EOF + #ifdef __XTENSA_CALL0_ABI__ + #error + #endif +EOF + if AC_TRY_COMMAND(${CC-cc} -E -o conftest.i conftest.c 1>&AS_MESSAGE_LOG_FD); then + tmake_file="${tmake_file} xtensa/t-windowed" + fi + ;; +esac + # Check for visibility support. This is after config.host so that # we can check for asm_hidden_op. AC_CACHE_CHECK([for __attribute__((visibility("hidden")))], |