gcc/gcc8-add-riscv64-multilib-l...

162 lines
6.5 KiB
Diff

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 005301338..382788734 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -4129,6 +4129,58 @@ case "${target}" in
exit 1
;;
esac
+
+ # Handle --with-multilib-list.
+ if test "x${with_multilib_list}" != xdefault; then
+ tm_file="${tm_file} riscv/withmultilib.h"
+ tmake_file="${tmake_file} riscv/t-withmultilib"
+
+ case ${with_multilib_list} in
+ ilp32 | ilp32f | ilp32d \
+ | lp64 | lp64f | lp64d )
+ TM_MULTILIB_CONFIG="${with_arch},${with_multilib_list}"
+ ;;
+ *)
+ echo "--with-multilib-list=${with_multilib_list} not supported."
+ exit 1
+ esac
+
+ # Define macros to select the default multilib.
+ case ${with_arch} in
+ rv32gc)
+ tm_defines="${tm_defines} TARGET_MLIB_ARCH=1"
+ ;;
+ rv64gc)
+ tm_defines="${tm_defines} TARGET_MLIB_ARCH=2"
+ ;;
+ *)
+ echo "unsupported --with-arch for --with-multilib-list"
+ exit 1
+ esac
+ case ${with_abi} in
+ ilp32)
+ tm_defines="${tm_defines} TARGET_MLIB_ABI=1"
+ ;;
+ ilp32f)
+ tm_defines="${tm_defines} TARGET_MLIB_ABI=2"
+ ;;
+ ilp32d)
+ tm_defines="${tm_defines} TARGET_MLIB_ABI=3"
+ ;;
+ lp64)
+ tm_defines="${tm_defines} TARGET_MLIB_ABI=4"
+ ;;
+ lp64f)
+ tm_defines="${tm_defines} TARGET_MLIB_ABI=5"
+ ;;
+ lp64d)
+ tm_defines="${tm_defines} TARGET_MLIB_ABI=6"
+ ;;
+ *)
+ echo "unsupported --with-abi for --with-multilib"
+ exit 1
+ esac
+ fi
;;
mips*-*-*)
diff --git a/gcc/config/riscv/t-withmultilib b/gcc/config/riscv/t-withmultilib
new file mode 100644
index 000000000..bcd0845b4
--- /dev/null
+++ b/gcc/config/riscv/t-withmultilib
@@ -0,0 +1,6 @@
+comma=,
+MULTILIB_OPTIONS = $(subst lp64,mabi=lp64,$(subst ilp32,mabi=ilp32,$(subst rv,march=rv,$(subst $(comma), ,$(TM_MULTILIB_CONFIG)))))
+MULTILIB_DIRNAMES = $(patsubst rv32%,lib32,$(patsubst rv64%,lib64,$(subst $(comma), ,$(TM_MULTILIB_CONFIG))))
+MULTILIB_OSDIRNAMES = $(subst lib,../lib,$(MULTILIB_DIRNAMES))
+MULTILIB_REQUIRED = $(subst lp64,mabi=lp64,$(subst ilp32,mabi=ilp32,$(subst rv,march=rv,$(subst $(comma),/,$(TM_MULTILIB_CONFIG)))))
+MULTILIB_REUSE =
diff --git a/gcc/config/riscv/withmultilib.h b/gcc/config/riscv/withmultilib.h
new file mode 100644
index 000000000..d703147fa
--- /dev/null
+++ b/gcc/config/riscv/withmultilib.h
@@ -0,0 +1,51 @@
+/* MULTILIB_DEFAULTS definitions for --with-multilib-list.
+ Copyright (C) 2018 Free Software Foundation, Inc.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GCC is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ License for more details.
+
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+#if TARGET_MLIB_ARCH == 1
+
+# if TARGET_MLIB_ABI == 1
+# define MULTILIB_DEFAULTS {"march=rv32gc", "mabi=ilp32" }
+# elif TARGET_MLIB_ABI == 2
+# define MULTILIB_DEFAULTS {"march=rv32gc", "mabi=ilp32f" }
+# elif TARGET_MLIB_ABI == 3
+# define MULTILIB_DEFAULTS {"march=rv32gc", "mabi=ilp32d" }
+# else
+# error "unsupported TARGET_MLIB_ABI value for rv32gc"
+# endif
+
+#elif TARGET_MLIB_ARCH == 2
+
+# if TARGET_MLIB_ABI == 4
+# define MULTILIB_DEFAULTS {"march=rv64gc", "mabi=lp64" }
+# elif TARGET_MLIB_ABI == 5
+# define MULTILIB_DEFAULTS {"march=rv64gc", "mabi=lp64f" }
+# elif TARGET_MLIB_ABI == 6
+# define MULTILIB_DEFAULTS {"march=rv64gc", "mabi=lp64d" }
+# else
+# error "unsupported TARGET_MLIB_ABI value for rv64gc"
+# endif
+
+#else
+# error "unsupported TARGET_MLIB_ARCH value"
+#endif
diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi
index ec20fd266..7c5cdc762 100644
--- a/gcc/doc/install.texi
+++ b/gcc/doc/install.texi
@@ -1072,8 +1072,8 @@ sysv, aix.
@itemx --without-multilib-list
Specify what multilibs to build. @var{list} is a comma separated list of
values, possibly consisting of a single value. Currently only implemented
-for arm*-*-*, sh*-*-* and x86-64-*-linux*. The accepted values and meaning
-for each target is given below.
+for arm*-*-*, riscv*-*-*, sh*-*-* and x86-64-*-linux*. The accepted
+values and meaning for each target is given below.
@table @code
@item arm*-*-*
@@ -1128,6 +1128,13 @@ and @code{rmprofile}.
@code{-mfloat-abi=hard}
@end multitable
+@item riscv*-*-*
+@var{list} is a single ABI name. The target architecture must be either
+@code{rv32gc} or @code{rv64gc}. This will build a single multilib for the
+specified architecture and ABI pair. If @code{--with-multilib-list} is not
+given, then a default set of multilibs is selected based on the value of
+@option{--target}. This is usually a large set of multilibs.
+
@item sh*-*-*
@var{list} is a comma separated list of CPU names. These must be of the
form @code{sh*} or @code{m*} (in which case they match the compiler option