From f2410266a00a3ebd6db07007aa82333b4f6ee6c2 Mon Sep 17 00:00:00 2001 From: Jim Wilson Date: Wed, 9 May 2018 21:17:14 +0000 Subject: [PATCH] RISC-V: Add with-multilib-list support. 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 | 8 +++++ gcc/config.gcc | 52 +++++++++++++++++++++++++++++++++ gcc/config/riscv/t-withmultilib | 6 ++++ gcc/config/riscv/withmultilib.h | 51 ++++++++++++++++++++++++++++++++ gcc/doc/install.texi | 11 +++++-- 5 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 gcc/config/riscv/t-withmultilib create mode 100644 gcc/config/riscv/withmultilib.h diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 50eaef9a2c5..02d66d8b33e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2018-05-09 Jim Wilson + + 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 * tree-vect-slp.c (vect_bb_slp_scalar_cost): Fill a cost diff --git a/gcc/config.gcc b/gcc/config.gcc index 7f5ba50d4b2..96bdd5c5427 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -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 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 + . */ + +#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 -- 2.30.2