Message ID | 20201120083357.118470-1-kito.cheng@sifive.com |
---|---|
State | New |
Headers | show |
Series | RISC-V: Always define MULTILIB_DEFAULTS | expand |
On Fri, Nov 20, 2020 at 12:34 AM Kito Cheng <kito.cheng@sifive.com> wrote: > - Define MULTILIB_DEFAULTS can reduce the total number of multilib if > the default arch and ABI are listed in the multilib config. > It looks like a good idea, but it doesn't seem to work. A toolchain configured without specifying arch/abi gives me rohan:2149$ riscv64-unknown-elf-gcc --print-multi-lib .; rv32i/ilp32;@march=rv32i@mabi=ilp32 rv32im/ilp32;@march=rv32im@mabi=ilp32 rv32iac/ilp32;@march=rv32iac@mabi=ilp32 rv32imac/ilp32;@march=rv32imac@mabi=ilp32 rv32imafc/ilp32f;@march=rv32imafc@mabi=ilp32f rv64imac/lp64;@march=rv64imac@mabi=lp64 rv64imafdc/lp64d;@march=rv64imafdc@mabi=lp64d The rv64imafdc/lp64d is actually built twice, as it is the default and is built explicitly. But otherwise the list is correct. If I configure a toolchain with the patch using --with-arch=rv32i --with-abi=ilp32 --enable-multilib then I get rohan:2151$ ./xgcc -B./ --print-multi-lib .; rv32imafc/ilp32f;@march=rv32imafc@mabi=ilp32f rv64imac/lp64;@march=rv64imac@mabi=lp64 rv64imafdc/lp64d;@march=rv64imafdc@mabi=lp64d and notice that 3 multilibs have mysteriously disappeared. We have four multilibs with -mabi=ilp32. The rv32i/ilp32 multilib is gone as it is now the default, but the other 3 should still be there. The gcc/multilib.h file in the gcc build dir looks correct. I think that there is something wrong with the processing of the default args against the multilib list. if you have just one default arg, and an entry matches then obviously you don't build it. But if you have two default args, then both must match before you choose to not build it, and I think the code has never supported this case. This works for the --with-multilib-list case because we currently only support one arch/abi with this configure option, so there can be no confusion with matching multiple default arguments. Jim
On Sat, Nov 21, 2020 at 6:12 AM Jim Wilson <jimw@sifive.com> wrote: > > On Fri, Nov 20, 2020 at 12:34 AM Kito Cheng <kito.cheng@sifive.com> wrote: > > > - Define MULTILIB_DEFAULTS can reduce the total number of multilib if > > the default arch and ABI are listed in the multilib config. > > > > It looks like a good idea, but it doesn't seem to work. A toolchain > configured without specifying arch/abi gives me > > rohan:2149$ riscv64-unknown-elf-gcc --print-multi-lib > .; > rv32i/ilp32;@march=rv32i@mabi=ilp32 > rv32im/ilp32;@march=rv32im@mabi=ilp32 > rv32iac/ilp32;@march=rv32iac@mabi=ilp32 > rv32imac/ilp32;@march=rv32imac@mabi=ilp32 > rv32imafc/ilp32f;@march=rv32imafc@mabi=ilp32f > rv64imac/lp64;@march=rv64imac@mabi=lp64 > rv64imafdc/lp64d;@march=rv64imafdc@mabi=lp64d > > The rv64imafdc/lp64d is actually built twice, as it is the default and is > built explicitly. But otherwise the list is correct. > > If I configure a toolchain with the patch using --with-arch=rv32i > --with-abi=ilp32 --enable-multilib then I get > > rohan:2151$ ./xgcc -B./ --print-multi-lib > .; > rv32imafc/ilp32f;@march=rv32imafc@mabi=ilp32f > rv64imac/lp64;@march=rv64imac@mabi=lp64 > rv64imafdc/lp64d;@march=rv64imafdc@mabi=lp64d > > and notice that 3 multilibs have mysteriously disappeared. We have four > multilibs with -mabi=ilp32. The rv32i/ilp32 multilib is gone as it is now > the default, but the other 3 should still be there. > > The gcc/multilib.h file in the gcc build dir looks correct. I think that > there is something wrong with the processing of the default args against > the multilib list. if you have just one default arg, and an entry matches > then obviously you don't build it. But if you have two default args, then > both must match before you choose to not build it, and I think the code has > never supported this case. Hmmm, thanks for catching this, this is really weird, I verified with -print-multi-directory seems to work correctly but the output of --print-multi-lib does not work as expected, let me investigate what happened... [kitoc@hsinchu02 t-build]$ ./install/bin/riscv64-elf-gcc --print-multi-lib .; rv32imafc/ilp32f;@march=rv32imafc@mabi=ilp32f rv64imac/lp64;@march=rv64imac@mabi=lp64 rv64imafdc/lp64d;@march=rv64imafdc@mabi=lp64d [kitoc@hsinchu02 t-build]$ ./install/bin/riscv64-elf-gcc -print-multi-directory -march=rv32iac -mabi=ilp32 rv32iac/ilp32 [kitoc@hsinchu02 t-build]$ ./install/bin/riscv64-elf-gcc -print-multi-directory -march=rv32i -mabi=ilp32 rv32i/ilp32 [kitoc@hsinchu02 t-build]$ ./install/bin/riscv64-elf-gcc -print-multi-directory -march=rv32im -mabi=ilp32 rv32im/ilp32 > This works for the --with-multilib-list case because we currently only > support one arch/abi with this configure option, so there can be no > confusion with matching multiple default arguments. > > Jim
On Fri, Nov 20, 2020 at 10:38 PM Kito Cheng <kito.cheng@gmail.com> wrote: > On Sat, Nov 21, 2020 at 6:12 AM Jim Wilson <jimw@sifive.com> wrote: > > On Fri, Nov 20, 2020 at 12:34 AM Kito Cheng <kito.cheng@sifive.com> > wrote: > > > > > - Define MULTILIB_DEFAULTS can reduce the total number of multilib if > > > the default arch and ABI are listed in the multilib config. > > > > It looks like a good idea, but it doesn't seem to work. A toolchain > > configured without specifying arch/abi gives me > > Hmmm, thanks for catching this, this is really weird, I verified with > -print-multi-directory seems to work correctly but the output of > --print-multi-lib does not work as expected, let me investigate what > happened... > With your fix for --print-multi-lib this MULTILIB_DEFAULTS patch now looks OK to me. Jim
Committed to trunk :) On Sat, Nov 28, 2020 at 7:49 AM Jim Wilson <jimw@sifive.com> wrote: > > On Fri, Nov 20, 2020 at 10:38 PM Kito Cheng <kito.cheng@gmail.com> wrote: > > > On Sat, Nov 21, 2020 at 6:12 AM Jim Wilson <jimw@sifive.com> wrote: > > > On Fri, Nov 20, 2020 at 12:34 AM Kito Cheng <kito.cheng@sifive.com> > > wrote: > > > > > > > - Define MULTILIB_DEFAULTS can reduce the total number of multilib if > > > > the default arch and ABI are listed in the multilib config. > > > > > > It looks like a good idea, but it doesn't seem to work. A toolchain > > > configured without specifying arch/abi gives me > > > > Hmmm, thanks for catching this, this is really weird, I verified with > > -print-multi-directory seems to work correctly but the output of > > --print-multi-lib does not work as expected, let me investigate what > > happened... > > > > With your fix for --print-multi-lib this MULTILIB_DEFAULTS patch now looks > OK to me. > > Jim
Hello Kito, On 20/11/2020 09:33, Kito Cheng wrote: > - Define MULTILIB_DEFAULTS can reduce the total number of multilib if > the default arch and ABI are listed in the multilib config. > > - This also simplify the implementation of --with-multilib-list. > > gcc/ChangeLog: > > * config.gcc (riscv*-*-*): Add TARGET_RISCV_DEFAULT_ABI and > TARGET_RISCV_DEFAULT_ARCH to tm_defines. > Remove including riscv/withmultilib.h for --with-multilib-list. > * config/riscv/riscv.h (STRINGIZING): New. > (__STRINGIZING): Ditto. > (MULTILIB_DEFAULTS): Ditto. > * config/riscv/withmultilib.h: Remove. I think this change broke the multilib generation for RTEMS (git bisect). I had to apply this local patch to build a5ad5d5c478ee7bebf057161bb8715ee7d286875: diff --git a/gcc/config.gcc b/gcc/config.gcc index 6f1ee62f7fd..7449c470265 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -4612,7 +4612,6 @@ case "${target}" in exit 1 ;; esac - with_arch=`${srcdir}/config/riscv/arch-canonicalize ${with_arch}` tm_defines="${tm_defines} TARGET_RISCV_DEFAULT_ARCH=${with_arch}" # Make sure --with-abi is valid. If it was not specified, With this commit we have: ./gcc/xgcc -print-multi-lib .; rv32i/ilp32;@march=rv32i@mabi=ilp32 rv32im/ilp32;@march=rv32im@mabi=ilp32 rv32iac/ilp32;@march=rv32iac@mabi=ilp32 rv32imac/ilp32;@march=rv32imac@mabi=ilp32 rv32imafc/ilp32f;@march=rv32imafc@mabi=ilp32f rv64imafd/lp64d;@march=rv64imafd@mabi=lp64d rv64imafd/lp64d/medany;@march=rv64imafd@mabi=lp64d@mcmodel=medany rv64imac/lp64;@march=rv64imac@mabi=lp64 rv64imac/lp64/medany;@march=rv64imac@mabi=lp64@mcmodel=medany rv64imafdc/lp64d;@march=rv64imafdc@mabi=lp64d rv64imafdc/lp64d/medany;@march=rv64imafdc@mabi=lp64d@mcmodel=medany ./gcc/xgcc -print-multi-directory -march=rv32imafd -mabi=ilp32d rv32imafd/ilp32d So for this option set it prints a multilib directory which is not listed. Also GCC seems to use this directory for the search paths and cannot find multilib specific C++ header files for example. In the commit before (3a5d8ed231a0329822b7c032ba0834991732d2a0) we have: ./gcc/xgcc -print-multi-lib .; rv32i/ilp32;@march=rv32i@mabi=ilp32 rv32im/ilp32;@march=rv32im@mabi=ilp32 rv32imafd/ilp32d;@march=rv32imafd@mabi=ilp32d <-- HERE rv32iac/ilp32;@march=rv32iac@mabi=ilp32 rv32imac/ilp32;@march=rv32imac@mabi=ilp32 rv32imafc/ilp32f;@march=rv32imafc@mabi=ilp32f rv64imafd/lp64d;@march=rv64imafd@mabi=lp64d rv64imafd/lp64d/medany;@march=rv64imafd@mabi=lp64d@mcmodel=medany rv64imac/lp64;@march=rv64imac@mabi=lp64 rv64imac/lp64/medany;@march=rv64imac@mabi=lp64@mcmodel=medany rv64imafdc/lp64d;@march=rv64imafdc@mabi=lp64d rv64imafdc/lp64d/medany;@march=rv64imafdc@mabi=lp64d@mcmodel=medany ./gcc/xgcc -print-multi-directory -march=rv32imafd -mabi=ilp32d rv32imafd/ilp32d I was not able to figure out what prevents the generation of the rv32imafd/ilp32d multilib in commit a5ad5d5c478ee7bebf057161bb8715ee7d286875. The gcc/tm.h contains this: gcc/tm.h:#ifndef TARGET_RISCV_DEFAULT_ARCH gcc/tm.h:# define TARGET_RISCV_DEFAULT_ARCH rv32gc gcc/tm.h:#ifndef TARGET_RISCV_DEFAULT_ABI gcc/tm.h:# define TARGET_RISCV_DEFAULT_ABI ilp32d
Hi Sebastian: Thank for report this issue, I can reproduce that, I'll investigate what happened today :) Sebastian Huber <sebastian.huber@embedded-brains.de> 於 2021年1月26日 週二 14:13 寫道: > Hello Kito, > > On 20/11/2020 09:33, Kito Cheng wrote: > > - Define MULTILIB_DEFAULTS can reduce the total number of multilib if > > the default arch and ABI are listed in the multilib config. > > > > - This also simplify the implementation of --with-multilib-list. > > > > gcc/ChangeLog: > > > > * config.gcc (riscv*-*-*): Add TARGET_RISCV_DEFAULT_ABI and > > TARGET_RISCV_DEFAULT_ARCH to tm_defines. > > Remove including riscv/withmultilib.h for --with-multilib-list. > > * config/riscv/riscv.h (STRINGIZING): New. > > (__STRINGIZING): Ditto. > > (MULTILIB_DEFAULTS): Ditto. > > * config/riscv/withmultilib.h: Remove. > > I think this change broke the multilib generation for RTEMS (git > bisect). I had to apply this local patch to build > a5ad5d5c478ee7bebf057161bb8715ee7d286875: > > diff --git a/gcc/config.gcc b/gcc/config.gcc > index 6f1ee62f7fd..7449c470265 100644 > --- a/gcc/config.gcc > +++ b/gcc/config.gcc > @@ -4612,7 +4612,6 @@ case "${target}" in > exit 1 > ;; > esac > - with_arch=`${srcdir}/config/riscv/arch-canonicalize ${with_arch}` > tm_defines="${tm_defines} > TARGET_RISCV_DEFAULT_ARCH=${with_arch}" > > # Make sure --with-abi is valid. If it was not specified, > > With this commit we have: > > ./gcc/xgcc -print-multi-lib > .; > rv32i/ilp32;@march=rv32i@mabi=ilp32 > rv32im/ilp32;@march=rv32im@mabi=ilp32 > rv32iac/ilp32;@march=rv32iac@mabi=ilp32 > rv32imac/ilp32;@march=rv32imac@mabi=ilp32 > rv32imafc/ilp32f;@march=rv32imafc@mabi=ilp32f > rv64imafd/lp64d;@march=rv64imafd@mabi=lp64d > rv64imafd/lp64d/medany;@march=rv64imafd@mabi=lp64d@mcmodel=medany > rv64imac/lp64;@march=rv64imac@mabi=lp64 > rv64imac/lp64/medany;@march=rv64imac@mabi=lp64@mcmodel=medany > rv64imafdc/lp64d;@march=rv64imafdc@mabi=lp64d > rv64imafdc/lp64d/medany;@march=rv64imafdc@mabi=lp64d@mcmodel=medany > > ./gcc/xgcc -print-multi-directory -march=rv32imafd -mabi=ilp32d > rv32imafd/ilp32d > > So for this option set it prints a multilib directory which is not > listed. Also GCC seems to use this directory for the search paths and > cannot find multilib specific C++ header files for example. > > In the commit before (3a5d8ed231a0329822b7c032ba0834991732d2a0) we have: > > ./gcc/xgcc -print-multi-lib > .; > rv32i/ilp32;@march=rv32i@mabi=ilp32 > rv32im/ilp32;@march=rv32im@mabi=ilp32 > rv32imafd/ilp32d;@march=rv32imafd@mabi=ilp32d <-- HERE > rv32iac/ilp32;@march=rv32iac@mabi=ilp32 > rv32imac/ilp32;@march=rv32imac@mabi=ilp32 > rv32imafc/ilp32f;@march=rv32imafc@mabi=ilp32f > rv64imafd/lp64d;@march=rv64imafd@mabi=lp64d > rv64imafd/lp64d/medany;@march=rv64imafd@mabi=lp64d@mcmodel=medany > rv64imac/lp64;@march=rv64imac@mabi=lp64 > rv64imac/lp64/medany;@march=rv64imac@mabi=lp64@mcmodel=medany > rv64imafdc/lp64d;@march=rv64imafdc@mabi=lp64d > rv64imafdc/lp64d/medany;@march=rv64imafdc@mabi=lp64d@mcmodel=medany > > ./gcc/xgcc -print-multi-directory -march=rv32imafd -mabi=ilp32d > rv32imafd/ilp32d > > I was not able to figure out what prevents the generation of the > rv32imafd/ilp32d multilib in commit > a5ad5d5c478ee7bebf057161bb8715ee7d286875. The gcc/tm.h contains this: > > gcc/tm.h:#ifndef TARGET_RISCV_DEFAULT_ARCH > gcc/tm.h:# define TARGET_RISCV_DEFAULT_ARCH rv32gc > gcc/tm.h:#ifndef TARGET_RISCV_DEFAULT_ABI > gcc/tm.h:# define TARGET_RISCV_DEFAULT_ABI ilp32d > > -- > embedded brains GmbH > Herr Sebastian HUBER > Dornierstr. 4 > 82178 Puchheim > Germany > email: sebastian.huber@embedded-brains.de > phone: +49-89-18 94 741 - 16 > fax: +49-89-18 94 741 - 08 > > Registergericht: Amtsgericht München > Registernummer: HRB 157899 > Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler > Unsere Datenschutzerklärung finden Sie hier: > https://embedded-brains.de/datenschutzerklaerung/ > >
diff --git a/gcc/config.gcc b/gcc/config.gcc index 0ae58482657..b12cf9b0f9d 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -4610,6 +4610,7 @@ case "${target}" in exit 1 ;; esac + tm_defines="${tm_defines} TARGET_RISCV_DEFAULT_ARCH=${with_arch}" # Make sure --with-abi is valid. If it was not specified, # pick a default based on the ISA, preferring soft-float @@ -4631,6 +4632,7 @@ case "${target}" in exit 1 ;; esac + tm_defines="${tm_defines} TARGET_RISCV_DEFAULT_ABI=${with_abi}" # Make sure ABI and ISA are compatible. case "${with_abi},${with_arch}" in @@ -4673,7 +4675,6 @@ case "${target}" in # 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 @@ -4685,42 +4686,6 @@ case "${target}" in 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 ;; diff --git a/gcc/config/riscv/riscv.h b/gcc/config/riscv/riscv.h index e71fbf31279..df3003fbaa0 100644 --- a/gcc/config/riscv/riscv.h +++ b/gcc/config/riscv/riscv.h @@ -76,6 +76,15 @@ extern const char *riscv_default_mtune (int argc, const char **argv); #define ASM_MISA_SPEC "" #endif +/* Reference: + https://gcc.gnu.org/onlinedocs/cpp/Stringizing.html#Stringizing */ +#define STRINGIZING(s) __STRINGIZING(s) +#define __STRINGIZING(s) #s + +#define MULTILIB_DEFAULTS \ + {"march=" STRINGIZING (TARGET_RISCV_DEFAULT_ARCH), \ + "mabi=" STRINGIZING (TARGET_RISCV_DEFAULT_ABI) } + #undef ASM_SPEC #define ASM_SPEC "\ %(subtarget_asm_debugging_spec) \ diff --git a/gcc/config/riscv/withmultilib.h b/gcc/config/riscv/withmultilib.h deleted file mode 100644 index d022716d3b8..00000000000 --- a/gcc/config/riscv/withmultilib.h +++ /dev/null @@ -1,51 +0,0 @@ -/* MULTILIB_DEFAULTS definitions for --with-multilib-list. - Copyright (C) 2018-2020 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