RISC-V: Add with-multilib-list support.
authorJim Wilson <jimw@sifive.com>
Wed, 9 May 2018 21:17:14 +0000 (21:17 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Wed, 9 May 2018 21:17:14 +0000 (14:17 -0700)
gcc/
PR target/84797
* config.gcc (riscv*-*-*): Handle --with-multilib-list.
* config/riscv/t-withmultilib: New.
* config/riscv/withmultilib.h: New.
* doc/install.texi: Document RISC-V --with-multilib-list support.

From-SVN: r260096

gcc/ChangeLog
gcc/config.gcc
gcc/config/riscv/t-withmultilib [new file with mode: 0644]
gcc/config/riscv/withmultilib.h [new file with mode: 0644]
gcc/doc/install.texi

index 50eaef9a2c5ed3e4772b6fe223af09ba7a7824e6..02d66d8b33eaba28630f0fe6f9ec05d637eaa384 100644 (file)
@@ -1,3 +1,11 @@
+2018-05-09  Jim Wilson  <jimw@sifive.com>
+
+       PR target/84797
+       * config.gcc (riscv*-*-*): Handle --with-multilib-list.
+       * config/riscv/t-withmultilib: New.
+       * config/riscv/withmultilib.h: New.
+       * doc/install.texi: Document RISC-V --with-multilib-list support.
+
 2018-05-09  Richard Biener  <rguenther@suse.de>
 
        * tree-vect-slp.c (vect_bb_slp_scalar_cost): Fill a cost
index 7f5ba50d4b2e949c8e145804eeb091fea98f9b11..96bdd5c542779f84f131299922b985a8246299b5 100644 (file)
@@ -4121,6 +4121,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 (file)
index 0000000..bcd0845
--- /dev/null
@@ -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 (file)
index 0000000..d703147
--- /dev/null
@@ -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
index ec20fd266859ef823b340e9e99d51ed2742dc3f6..7c5cdc762d3ecca2b37c1ebc8caf99d22ff351b9 100644 (file)
@@ -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