gcc: xtensa: add -mabi option for call0/windowed ABI

2020-06-15  Max Filippov  <jcmvbkbc@gmail.com>
gcc/
	* config/xtensa/elf.h (ASM_SPEC, LINK_SPEC): Pass ABI switch to
	assembler/linker.
	* config/xtensa/linux.h (ASM_SPEC, LINK_SPEC): Ditto.
	* config/xtensa/uclinux.h (ASM_SPEC, LINK_SPEC): Ditto.
	* config/xtensa/xtensa.c (xtensa_option_override): Initialize
	xtensa_windowed_abi if needed.
	* config/xtensa/xtensa.h (TARGET_WINDOWED_ABI_DEFAULT): New
	macro.
	(TARGET_WINDOWED_ABI): Redefine to xtensa_windowed_abi.
	* config/xtensa/xtensa.opt (xtensa_windowed_abi): New target
	option variable.
	(mabi=call0, mabi=windowed): New options.
	* doc/invoke.texi: Document new -mabi= Xtensa-specific options.

gcc/testsuite/
	* gcc.target/xtensa/mabi-call0.c: New test.
	* gcc.target/xtensa/mabi-windowed.c: New test.

libgcc/
	* configure: Regenerate.
	* configure.ac: Use AC_COMPILE_IFELSE instead of manual
	preprocessor invocation to check for __XTENSA_CALL0_ABI__.
This commit is contained in:
Max Filippov 2020-04-12 23:53:32 -07:00
parent f50c32fa7a
commit 8c8eb94914
11 changed files with 103 additions and 29 deletions

View File

@ -47,7 +47,9 @@ along with GCC; see the file COPYING3. If not see
%{mlongcalls:--longcalls} \ %{mlongcalls:--longcalls} \
%{mno-longcalls:--no-longcalls} \ %{mno-longcalls:--no-longcalls} \
%{mauto-litpools:--auto-litpools} \ %{mauto-litpools:--auto-litpools} \
%{mno-auto-litpools:--no-auto-litpools}" %{mno-auto-litpools:--no-auto-litpools} \
%{mabi=windowed:--abi-windowed} \
%{mabi=call0:--abi-call0}"
#undef LIB_SPEC #undef LIB_SPEC
#define LIB_SPEC "-lc -lsim -lc -lhandlers-sim -lhal" #define LIB_SPEC "-lc -lsim -lc -lhandlers-sim -lhal"
@ -65,7 +67,9 @@ along with GCC; see the file COPYING3. If not see
%{!shared: \ %{!shared: \
%{!static: \ %{!static: \
%{rdynamic:-export-dynamic} \ %{rdynamic:-export-dynamic} \
%{static:-static}}}" %{static:-static}}} \
%{mabi=windowed:--abi-windowed} \
%{mabi=call0:--abi-call0}"
#undef LOCAL_LABEL_PREFIX #undef LOCAL_LABEL_PREFIX
#define LOCAL_LABEL_PREFIX "." #define LOCAL_LABEL_PREFIX "."

View File

@ -44,7 +44,9 @@ along with GCC; see the file COPYING3. If not see
%{mlongcalls:--longcalls} \ %{mlongcalls:--longcalls} \
%{mno-longcalls:--no-longcalls} \ %{mno-longcalls:--no-longcalls} \
%{mauto-litpools:--auto-litpools} \ %{mauto-litpools:--auto-litpools} \
%{mno-auto-litpools:--no-auto-litpools}" %{mno-auto-litpools:--no-auto-litpools} \
%{mabi=windowed:--abi-windowed} \
%{mabi=call0:--abi-call0}"
#define GLIBC_DYNAMIC_LINKER "/lib/ld.so.1" #define GLIBC_DYNAMIC_LINKER "/lib/ld.so.1"
@ -55,7 +57,9 @@ along with GCC; see the file COPYING3. If not see
%{!static: \ %{!static: \
%{rdynamic:-export-dynamic} \ %{rdynamic:-export-dynamic} \
-dynamic-linker " GNU_USER_DYNAMIC_LINKER "} \ -dynamic-linker " GNU_USER_DYNAMIC_LINKER "} \
%{static:-static}}" %{static:-static}} \
%{mabi=windowed:--abi-windowed} \
%{mabi=call0:--abi-call0}"
#undef LOCAL_LABEL_PREFIX #undef LOCAL_LABEL_PREFIX
#define LOCAL_LABEL_PREFIX "." #define LOCAL_LABEL_PREFIX "."

View File

@ -51,10 +51,15 @@ along with GCC; see the file COPYING3. If not see
%{mlongcalls:--longcalls} \ %{mlongcalls:--longcalls} \
%{mno-longcalls:--no-longcalls} \ %{mno-longcalls:--no-longcalls} \
%{mauto-litpools:--auto-litpools} \ %{mauto-litpools:--auto-litpools} \
%{mno-auto-litpools:--no-auto-litpools}" %{mno-auto-litpools:--no-auto-litpools} \
%{mabi=windowed:--abi-windowed} \
%{mabi=call0:--abi-call0}"
#undef LINK_SPEC #undef LINK_SPEC
#define LINK_SPEC "%{!no-elf2flt:%{!elf2flt*:-elf2flt}}" #define LINK_SPEC \
"%{!no-elf2flt:%{!elf2flt*:-elf2flt}} \
%{mabi=windowed:--abi-windowed} \
%{mabi=call0:--abi-call0}"
#undef LOCAL_LABEL_PREFIX #undef LOCAL_LABEL_PREFIX
#define LOCAL_LABEL_PREFIX "." #define LOCAL_LABEL_PREFIX "."

View File

@ -2219,6 +2219,9 @@ xtensa_option_override (void)
int regno; int regno;
machine_mode mode; machine_mode mode;
if (xtensa_windowed_abi == -1)
xtensa_windowed_abi = TARGET_WINDOWED_ABI_DEFAULT;
/* Use CONST16 in the absence of L32R. /* Use CONST16 in the absence of L32R.
Set it in the TARGET_OPTION_OVERRIDE to avoid dependency on xtensa Set it in the TARGET_OPTION_OVERRIDE to avoid dependency on xtensa
configuration in the xtensa-common.c */ configuration in the xtensa-common.c */

View File

@ -64,7 +64,8 @@ along with GCC; see the file COPYING3. If not see
#define TARGET_ABSOLUTE_LITERALS XSHAL_USE_ABSOLUTE_LITERALS #define TARGET_ABSOLUTE_LITERALS XSHAL_USE_ABSOLUTE_LITERALS
#define TARGET_THREADPTR XCHAL_HAVE_THREADPTR #define TARGET_THREADPTR XCHAL_HAVE_THREADPTR
#define TARGET_LOOPS XCHAL_HAVE_LOOPS #define TARGET_LOOPS XCHAL_HAVE_LOOPS
#define TARGET_WINDOWED_ABI (XSHAL_ABI == XTHAL_ABI_WINDOWED) #define TARGET_WINDOWED_ABI_DEFAULT (XSHAL_ABI == XTHAL_ABI_WINDOWED)
#define TARGET_WINDOWED_ABI xtensa_windowed_abi
#define TARGET_DEBUG XCHAL_HAVE_DEBUG #define TARGET_DEBUG XCHAL_HAVE_DEBUG
#define TARGET_L32R XCHAL_HAVE_L32R #define TARGET_L32R XCHAL_HAVE_L32R

View File

@ -45,3 +45,14 @@ Relax literals in assembler and place them automatically in the text section.
mserialize-volatile mserialize-volatile
Target Report Mask(SERIALIZE_VOLATILE) Target Report Mask(SERIALIZE_VOLATILE)
-mno-serialize-volatile Do not serialize volatile memory references with MEMW instructions. -mno-serialize-volatile Do not serialize volatile memory references with MEMW instructions.
TargetVariable
int xtensa_windowed_abi = -1
mabi=call0
Target Report RejectNegative Var(xtensa_windowed_abi, 0)
Use call0 ABI.
mabi=windowed
Target Report RejectNegative Var(xtensa_windowed_abi, 1)
Use windowed registers ABI.

View File

@ -1386,7 +1386,8 @@ See RS/6000 and PowerPC Options.
-mtext-section-literals -mno-text-section-literals @gol -mtext-section-literals -mno-text-section-literals @gol
-mauto-litpools -mno-auto-litpools @gol -mauto-litpools -mno-auto-litpools @gol
-mtarget-align -mno-target-align @gol -mtarget-align -mno-target-align @gol
-mlongcalls -mno-longcalls} -mlongcalls -mno-longcalls @gol
-mabi=@var{abi-type}}
@emph{zSeries Options} @emph{zSeries Options}
See S/390 and zSeries Options. See S/390 and zSeries Options.
@ -30780,6 +30781,29 @@ assembly code generated by GCC still shows direct call
instructions---look at the disassembled object code to see the actual instructions---look at the disassembled object code to see the actual
instructions. Note that the assembler uses an indirect call for instructions. Note that the assembler uses an indirect call for
every cross-file call, not just those that really are out of range. every cross-file call, not just those that really are out of range.
@item -mabi=@var{name}
@opindex mabi
Generate code for the specified ABI@. Permissible values are: @samp{call0},
@samp{windowed}. Default ABI is chosen by the Xtensa core configuration.
@item -mabi=call0
@opindex mabi=call0
When this option is enabled function parameters are passed in registers
@code{a2} through @code{a7}, registers @code{a12} through @code{a15} are
caller-saved, and register @code{a15} may be used as a frame pointer.
When this version of the ABI is enabled the C preprocessor symbol
@code{__XTENSA_CALL0_ABI__} is defined.
@item -mabi=windowed
@opindex mabi=windowed
When this option is enabled function parameters are passed in registers
@code{a10} through @code{a15}, and called function rotates register window
by 8 registers on entry so that its arguments are found in registers
@code{a2} through @code{a7}. Register @code{a7} may be used as a frame
pointer. Register window is rotated 8 registers back upon return.
When this version of the ABI is enabled the C preprocessor symbol
@code{__XTENSA_WINDOWED_ABI__} is defined.
@end table @end table
@node zSeries Options @node zSeries Options

View File

@ -0,0 +1,13 @@
/* { dg-do compile } */
/* { dg-options "-mabi=call0" } */
#ifndef __XTENSA_CALL0_ABI__
#error
#endif
void foo(void)
{
}
/* { dg-final { scan-assembler-not "entry" } } */
/* { dg-final { scan-assembler-not "retw" } } */

View File

@ -0,0 +1,13 @@
/* { dg-do compile } */
/* { dg-options "-mabi=windowed" } */
#ifndef __XTENSA_WINDOWED_ABI__
#error
#endif
void foo(void)
{
}
/* { dg-final { scan-assembler "entry" } } */
/* { dg-final { scan-assembler "retw" } } */

24
libgcc/configure vendored
View File

@ -5330,19 +5330,17 @@ esac
# This is after config.host so we can augment tmake_file. # This is after config.host so we can augment tmake_file.
case ${host} in case ${host} in
xtensa*-*) xtensa*-*)
cat > conftest.c <<EOF cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#ifdef __XTENSA_CALL0_ABI__ /* end confdefs.h. */
#error #ifdef __XTENSA_CALL0_ABI__
#endif #error
EOF #endif
if { ac_try='${CC-cc} -E -o conftest.i conftest.c 1>&5'
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 _ACEOF
(eval $ac_try) 2>&5 if ac_fn_c_try_compile "$LINENO"; then :
ac_status=$? tmake_file="${tmake_file} xtensa/t-windowed"
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 fi
test $ac_status = 0; }; }; then rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
tmake_file="${tmake_file} xtensa/t-windowed"
fi
;; ;;
esac esac

View File

@ -515,14 +515,12 @@ AC_SUBST(solaris_ld_v2_maps)
# This is after config.host so we can augment tmake_file. # This is after config.host so we can augment tmake_file.
case ${host} in case ${host} in
xtensa*-*) xtensa*-*)
cat > conftest.c <<EOF AC_COMPILE_IFELSE([AC_LANG_SOURCE(
#ifdef __XTENSA_CALL0_ABI__ [#ifdef __XTENSA_CALL0_ABI__
#error #error
#endif #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"])
tmake_file="${tmake_file} xtensa/t-windowed"
fi
;; ;;
esac esac