aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMax Filippov <jcmvbkbc@gmail.com>2020-04-12 23:53:32 -0700
committerMax Filippov <jcmvbkbc@gmail.com>2020-06-15 03:35:50 -0700
commit8c8eb94914c1afcac014e33def43ce329dfa314e (patch)
tree247b0573a9dc63fa160111995e68501bc19b9986 /gcc
parentf50c32fa7ab4d3bb8b8091c6d38186799b81093b (diff)
downloadgcc-8c8eb94914c1afcac014e33def43ce329dfa314e.zip
gcc-8c8eb94914c1afcac014e33def43ce329dfa314e.tar.gz
gcc-8c8eb94914c1afcac014e33def43ce329dfa314e.tar.bz2
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__.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/xtensa/elf.h8
-rw-r--r--gcc/config/xtensa/linux.h8
-rw-r--r--gcc/config/xtensa/uclinux.h9
-rw-r--r--gcc/config/xtensa/xtensa.c3
-rw-r--r--gcc/config/xtensa/xtensa.h3
-rw-r--r--gcc/config/xtensa/xtensa.opt11
-rw-r--r--gcc/doc/invoke.texi26
-rw-r--r--gcc/testsuite/gcc.target/xtensa/mabi-call0.c13
-rw-r--r--gcc/testsuite/gcc.target/xtensa/mabi-windowed.c13
9 files changed, 86 insertions, 8 deletions
diff --git a/gcc/config/xtensa/elf.h b/gcc/config/xtensa/elf.h
index 6fd589f..48e2590 100644
--- a/gcc/config/xtensa/elf.h
+++ b/gcc/config/xtensa/elf.h
@@ -47,7 +47,9 @@ along with GCC; see the file COPYING3. If not see
%{mlongcalls:--longcalls} \
%{mno-longcalls:--no-longcalls} \
%{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
#define LIB_SPEC "-lc -lsim -lc -lhandlers-sim -lhal"
@@ -65,7 +67,9 @@ along with GCC; see the file COPYING3. If not see
%{!shared: \
%{!static: \
%{rdynamic:-export-dynamic} \
- %{static:-static}}}"
+ %{static:-static}}} \
+ %{mabi=windowed:--abi-windowed} \
+ %{mabi=call0:--abi-call0}"
#undef LOCAL_LABEL_PREFIX
#define LOCAL_LABEL_PREFIX "."
diff --git a/gcc/config/xtensa/linux.h b/gcc/config/xtensa/linux.h
index 62a33a9..bd20595 100644
--- a/gcc/config/xtensa/linux.h
+++ b/gcc/config/xtensa/linux.h
@@ -44,7 +44,9 @@ along with GCC; see the file COPYING3. If not see
%{mlongcalls:--longcalls} \
%{mno-longcalls:--no-longcalls} \
%{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"
@@ -55,7 +57,9 @@ along with GCC; see the file COPYING3. If not see
%{!static: \
%{rdynamic:-export-dynamic} \
-dynamic-linker " GNU_USER_DYNAMIC_LINKER "} \
- %{static:-static}}"
+ %{static:-static}} \
+ %{mabi=windowed:--abi-windowed} \
+ %{mabi=call0:--abi-call0}"
#undef LOCAL_LABEL_PREFIX
#define LOCAL_LABEL_PREFIX "."
diff --git a/gcc/config/xtensa/uclinux.h b/gcc/config/xtensa/uclinux.h
index 64ba26f..374d2947 100644
--- a/gcc/config/xtensa/uclinux.h
+++ b/gcc/config/xtensa/uclinux.h
@@ -51,10 +51,15 @@ along with GCC; see the file COPYING3. If not see
%{mlongcalls:--longcalls} \
%{mno-longcalls:--no-longcalls} \
%{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
-#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
#define LOCAL_LABEL_PREFIX "."
diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c
index e3afb70..e370aa4 100644
--- a/gcc/config/xtensa/xtensa.c
+++ b/gcc/config/xtensa/xtensa.c
@@ -2219,6 +2219,9 @@ xtensa_option_override (void)
int regno;
machine_mode mode;
+ if (xtensa_windowed_abi == -1)
+ xtensa_windowed_abi = TARGET_WINDOWED_ABI_DEFAULT;
+
/* Use CONST16 in the absence of L32R.
Set it in the TARGET_OPTION_OVERRIDE to avoid dependency on xtensa
configuration in the xtensa-common.c */
diff --git a/gcc/config/xtensa/xtensa.h b/gcc/config/xtensa/xtensa.h
index fb5aee8..33bfe45 100644
--- a/gcc/config/xtensa/xtensa.h
+++ b/gcc/config/xtensa/xtensa.h
@@ -64,7 +64,8 @@ along with GCC; see the file COPYING3. If not see
#define TARGET_ABSOLUTE_LITERALS XSHAL_USE_ABSOLUTE_LITERALS
#define TARGET_THREADPTR XCHAL_HAVE_THREADPTR
#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_L32R XCHAL_HAVE_L32R
diff --git a/gcc/config/xtensa/xtensa.opt b/gcc/config/xtensa/xtensa.opt
index dd7aba4..0c4aa92 100644
--- a/gcc/config/xtensa/xtensa.opt
+++ b/gcc/config/xtensa/xtensa.opt
@@ -45,3 +45,14 @@ Relax literals in assembler and place them automatically in the text section.
mserialize-volatile
Target Report Mask(SERIALIZE_VOLATILE)
-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.
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 06a04e3..74ab149 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -1386,7 +1386,8 @@ See RS/6000 and PowerPC Options.
-mtext-section-literals -mno-text-section-literals @gol
-mauto-litpools -mno-auto-litpools @gol
-mtarget-align -mno-target-align @gol
--mlongcalls -mno-longcalls}
+-mlongcalls -mno-longcalls @gol
+-mabi=@var{abi-type}}
@emph{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. Note that the assembler uses an indirect call for
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
@node zSeries Options
diff --git a/gcc/testsuite/gcc.target/xtensa/mabi-call0.c b/gcc/testsuite/gcc.target/xtensa/mabi-call0.c
new file mode 100644
index 0000000..65d7295
--- /dev/null
+++ b/gcc/testsuite/gcc.target/xtensa/mabi-call0.c
@@ -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" } } */
diff --git a/gcc/testsuite/gcc.target/xtensa/mabi-windowed.c b/gcc/testsuite/gcc.target/xtensa/mabi-windowed.c
new file mode 100644
index 0000000..aaddf41
--- /dev/null
+++ b/gcc/testsuite/gcc.target/xtensa/mabi-windowed.c
@@ -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" } } */