We've been telling people that "riscv32-*" and "riscv64-*" are exactly the same toolchain aside from defaults for "-march" and "-mabi", but it appears we were lying. As far as I can tell, binutils doesn't support 64-bit targets when it has been configured for a 32-bit target. This seems to be an upstream limitation that we can't fix in the RISC-V port. This means that building the toolchain with "--with-arch=rv32i --enable-multilib" will fail when building the 64-bit multilibs.
This patch adds two new multilib target fragments that don't add the 64-bit multilibs. This fixes the build, but has the disadvantage of making our 32-bit and 64-bit toolchains very different. gcc/ChanegLog: 2017-04-28 Palmer Dabbelt <pal...@dabbelt.com> * config/riscv/t-elf-multilib32: New file. * config/riscv/t-linux-multilib32: Likewise * config.gcc: Select between the 32-bit and 64-bit multilib configurations based on the target XLEN. --- gcc/ChangeLog | 7 +++++++ gcc/config.gcc | 12 +++++++++-- gcc/config/riscv/t-elf-multilib32 | 22 ++++++++++++++++++++ .../riscv/{t-elf-multilib => t-elf-multilib64} | 0 gcc/config/riscv/t-linux-multilib32 | 24 ++++++++++++++++++++++ .../riscv/{t-linux-multilib => t-linux-multilib64} | 0 6 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 gcc/config/riscv/t-elf-multilib32 rename gcc/config/riscv/{t-elf-multilib => t-elf-multilib64} (100%) create mode 100644 gcc/config/riscv/t-linux-multilib32 rename gcc/config/riscv/{t-linux-multilib => t-linux-multilib64} (100%) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 977517e..2ad14ae 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-04-28 Palmer Dabbelt <pal...@dabbelt.com> + + * config/riscv/t-elf-multilib32: New file. + * config/riscv/t-linux-multilib32: Likewise + * config.gcc: Select between the 32-bit and 64-bit multilib + configurations based on the target XLEN. + 2017-04-28 Jan Hubicka <hubi...@ucw.cz> * ipa-cp.c (perform_estimation_of_a_value): Turn time to sreal. diff --git a/gcc/config.gcc b/gcc/config.gcc index b8bb4d6..4d142b4 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -2018,10 +2018,14 @@ microblaze*-*-elf) tmake_file="${tmake_file} microblaze/t-microblaze" ;; riscv*-*-linux*) + case "${target}" in + riscv32-*) riscv_xlen=32 ;; + riscv64-*) riscv_xlen=64 ;; + esac tm_file="elfos.h gnu-user.h linux.h glibc-stdint.h ${tm_file} riscv/linux.h" case "x${enable_multilib}" in xno) ;; - xyes) tmake_file="${tmake_file} riscv/t-linux-multilib" ;; + xyes) tmake_file="${tmake_file} riscv/t-linux-multilib${riscv_xlen}" ;; *) echo "Unknown value for enable_multilib"; exit 1 esac tmake_file="${tmake_file} riscv/t-riscv riscv/t-linux" @@ -2032,10 +2036,14 @@ riscv*-*-linux*) gcc_cv_initfini_array=yes ;; riscv*-*-elf*) + case "${target}" in + riscv32-*) riscv_xlen=32 ;; + riscv64-*) riscv_xlen=64 ;; + esac tm_file="elfos.h newlib-stdint.h ${tm_file} riscv/elf.h" case "x${enable_multilib}" in xno) ;; - xyes) tmake_file="${tmake_file} riscv/t-elf-multilib" ;; + xyes) tmake_file="${tmake_file} riscv/t-elf-multilib${riscv_xlen}" ;; *) echo "Unknown value for enable_multilib"; exit 1 esac tmake_file="${tmake_file} riscv/t-riscv" diff --git a/gcc/config/riscv/t-elf-multilib32 b/gcc/config/riscv/t-elf-multilib32 new file mode 100644 index 0000000..1f2928c --- /dev/null +++ b/gcc/config/riscv/t-elf-multilib32 @@ -0,0 +1,22 @@ +# This file was generated by multilib-generator with the command: +# ./multilib-generator rv32i-ilp32--c rv32im-ilp32--c rv32iac-ilp32-- rv32imac-ilp32-- rv32imafc-ilp32f-rv32imafdc- +MULTILIB_OPTIONS = march=rv32i/march=rv32ic/march=rv32im/march=rv32imc/march=rv32iac/march=rv32imac/march=rv32imafc/march=rv32imafdc/march=rv32gc mabi=ilp32/mabi=ilp32f +MULTILIB_DIRNAMES = rv32i \ +rv32ic \ +rv32im \ +rv32imc \ +rv32iac \ +rv32imac \ +rv32imafc \ +rv32imafdc \ +rv32gc ilp32 \ +ilp32f +MULTILIB_REQUIRED = march=rv32i/mabi=ilp32 \ +march=rv32im/mabi=ilp32 \ +march=rv32iac/mabi=ilp32 \ +march=rv32imac/mabi=ilp32 \ +march=rv32imafc/mabi=ilp32f +MULTILIB_REUSE = march.rv32i/mabi.ilp32=march.rv32ic/mabi.ilp32 \ +march.rv32im/mabi.ilp32=march.rv32imc/mabi.ilp32 \ +march.rv32imafc/mabi.ilp32f=march.rv32imafdc/mabi.ilp32f \ +march.rv32imafc/mabi.ilp32f=march.rv32gc/mabi.ilp32f diff --git a/gcc/config/riscv/t-elf-multilib b/gcc/config/riscv/t-elf-multilib64 similarity index 100% rename from gcc/config/riscv/t-elf-multilib rename to gcc/config/riscv/t-elf-multilib64 diff --git a/gcc/config/riscv/t-linux-multilib32 b/gcc/config/riscv/t-linux-multilib32 new file mode 100644 index 0000000..7b130c0 --- /dev/null +++ b/gcc/config/riscv/t-linux-multilib32 @@ -0,0 +1,24 @@ +# This file was generated by multilib-generator with the command: +# ./multilib-generator rv32imac-ilp32-rv32ima,rv32imaf,rv32imafd,rv32imafc,rv32imafdc- rv32imafdc-ilp32d-rv32imafd- +MULTILIB_OPTIONS = march=rv32imac/march=rv32ima/march=rv32imaf/march=rv32imafd/march=rv32imafc/march=rv32imafdc/march=rv32g/march=rv32gc mabi=ilp32/mabi=ilp32d +MULTILIB_DIRNAMES = rv32imac \ +rv32ima \ +rv32imaf \ +rv32imafd \ +rv32imafc \ +rv32imafdc \ +rv32g \ +rv32gc ilp32 \ +ilp32d +MULTILIB_REQUIRED = march=rv32imac/mabi=ilp32 \ +march=rv32imafdc/mabi=ilp32d +MULTILIB_REUSE = march.rv32imac/mabi.ilp32=march.rv32ima/mabi.ilp32 \ +march.rv32imac/mabi.ilp32=march.rv32imaf/mabi.ilp32 \ +march.rv32imac/mabi.ilp32=march.rv32imafd/mabi.ilp32 \ +march.rv32imac/mabi.ilp32=march.rv32imafc/mabi.ilp32 \ +march.rv32imac/mabi.ilp32=march.rv32imafdc/mabi.ilp32 \ +march.rv32imac/mabi.ilp32=march.rv32g/mabi.ilp32 \ +march.rv32imac/mabi.ilp32=march.rv32gc/mabi.ilp32 \ +march.rv32imafdc/mabi.ilp32d=march.rv32imafd/mabi.ilp32d \ +march.rv32imafdc/mabi.ilp32d=march.rv32gc/mabi.ilp32d \ +march.rv32imafdc/mabi.ilp32d=march.rv32g/mabi.ilp32d diff --git a/gcc/config/riscv/t-linux-multilib b/gcc/config/riscv/t-linux-multilib64 similarity index 100% rename from gcc/config/riscv/t-linux-multilib rename to gcc/config/riscv/t-linux-multilib64 -- 2.10.2