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

Reply via email to