RISC-V: Add with-multilib-list support.

Message ID 20180501185228.5298-1-jimw@sifive.com
State New
Headers show
Series
  • RISC-V: Add with-multilib-list support.
Related show

Commit Message

Jim Wilson May 1, 2018, 6:52 p.m.
This is an attempt to solve a packaging problem for linux distros.  If the
RISC-V port is built with --disable-multilib, libraries get installed into /lib
which violates the ABI.  If it is built with --enable-multilib, 32 versions
of libraries are built which is useful for embedded linux cross compiler
testing, but not useful for a native linux compiler.  This adds support for
the --with-multilib-list configure option to bridge the gap, to allow one
to build a compiler with multilibs enabled, but without building all 32
default multilibs.

Unfortunately, the RISC-V port is complicated in that ABI selection depends on
two options, -march and -mabi, instead of one as usual.  We also have a lot of
different arch and abi options, some of which are aliases of others.  This
complicates the implementation, so for the moment, I'm only allowing one ABI
in the list, and a few arch choices.  This can be expanded later as necessary.

I posting this before committing it in case anyone wants to comment on it.
I've tested it with cross compiler build and make check, and a native build,
and it appears to work correctly for me.  But I'm not a distro person, so I
can't easily verify that it fixes the problem that the distro people are
having.

Jim

	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.
---
 gcc/config.gcc                  | 52 +++++++++++++++++++++++++++++++++++++++++
 gcc/config/riscv/t-withmultilib |  6 +++++
 gcc/config/riscv/withmultilib.h | 51 ++++++++++++++++++++++++++++++++++++++++
 gcc/doc/install.texi            | 11 +++++++--
 4 files changed, 118 insertions(+), 2 deletions(-)
 create mode 100644 gcc/config/riscv/t-withmultilib
 create mode 100644 gcc/config/riscv/withmultilib.h

-- 
2.14.1

Comments

Jim Wilson May 9, 2018, 9:18 p.m. | #1
On Tue, May 1, 2018 at 11:52 AM, Jim Wilson <jimw@sifive.com> wrote:
>         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.


Committed, after some additional testing.

Jim

Patch

diff --git a/gcc/config.gcc b/gcc/config.gcc
index a5defb0f005..1700ef002a5 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 00000000000..bcd0845b448
--- /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 00000000000..d703147fa64
--- /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 ec20fd26685..7c5cdc762d3 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