diff options
author | Palmer Dabbelt <palmer@dabbelt.com> | 2016-04-06 12:51:40 -0700 |
---|---|---|
committer | Palmer Dabbelt <palmer@dabbelt.com> | 2016-04-06 12:51:40 -0700 |
commit | 3134bf43d81720863c8b8bc8fd4acd1017bca3fc (patch) | |
tree | eec7533a9c577e03102a89c326c86f3408e4017a | |
parent | acfa4804d96c8d7a30e53b01e5da9ab08244ecc7 (diff) | |
parent | 14b89981ad296b474f51dfb3b540078e97f85799 (diff) | |
download | riscv-gnu-toolchain-3134bf43d81720863c8b8bc8fd4acd1017bca3fc.zip riscv-gnu-toolchain-3134bf43d81720863c8b8bc8fd4acd1017bca3fc.tar.gz riscv-gnu-toolchain-3134bf43d81720863c8b8bc8fd4acd1017bca3fc.tar.bz2 |
Merge pull request #133 from riscv/pass-soft-float
soft/hard float argument fixes
-rw-r--r-- | Makefile.in | 31 | ||||
-rw-r--r-- | binutils/gas/config/tc-riscv.c | 45 | ||||
-rwxr-xr-x | configure | 12 | ||||
-rw-r--r-- | configure.ac | 10 |
4 files changed, 79 insertions, 19 deletions
diff --git a/Makefile.in b/Makefile.in index 6a5cfdd..19efe08 100644 --- a/Makefile.in +++ b/Makefile.in @@ -41,7 +41,9 @@ MULTILIB_FLAGS := @multilib_flags@ ATOMIC_CFLAGS := @atomic_cflags@ FLOAT_CFLAGS := @float_cflags@ FLOAT_ASFLAGS := @float_asflags@ -GLIBC_CONFIGURE_FLAGS := @glibc_configure_flags@ +BINUTILS_FLOAT_FLAGS := @binutils_float_flags@ +GCC_FLOAT_FLAGS := @gcc_float_flags@ +GLIBC_FLOAT_FLAGS := @glibc_float_flags@ CFLAGS_FOR_TARGET := $(CFLAGS_FOR_TARGET_EXTRA) $(ATOMIC_CFLAGS) $(FLOAT_CFLAGS) ASFLAGS_FOR_TARGET := $(ASFLAGS_FOR_TARGET_EXTRA) $(FLOAT_ASFLAGS) @@ -57,17 +59,17 @@ linux: $(MAKE) stamps/build-gcc-linux-stage1 XLEN=64 $(MAKE) stamps/build-glibc-linux64 XLEN=64 $(MAKE) stamps/build-glibc-linux64-soft-float XLEN=64 MULTILIB=-soft-float \ - GLIBC_CONFIGURE_FLAGS="--without-fp --libdir=/usr/lib/soft-float libc_cv_slibdir=/lib/soft-float" + GLIBC_FLOAT_FLAGS="--without-fp --libdir=/usr/lib/soft-float libc_cv_slibdir=/lib/soft-float" $(MAKE) stamps/build-glibc-linux64-no-atomic XLEN=64 MULTILIB=-no-atomic \ CC="riscv64-unknown-linux-gnu-gcc -mno-atomic" \ CFLAGS_FOR_TARGET_EXTRA="-mno-atomic" \ ASFLAGS_FOR_TARGET_EXTRA="-mno-atomic" \ - GLIBC_CONFIGURE_FLAGS="--libdir=/usr/lib/no-atomic libc_cv_slibdir=/lib/no-atomic" + GLIBC_FLOAT_FLAGS="--libdir=/usr/lib/no-atomic libc_cv_slibdir=/lib/no-atomic" $(MAKE) stamps/build-glibc-linux64-soft-float-no-atomic XLEN=64 MULTILIB=-soft-float-no-atomic \ CC="riscv64-unknown-linux-gnu-gcc -mno-atomic" \ CFLAGS_FOR_TARGET_EXTRA="-mno-atomic" \ ASFLAGS_FOR_TARGET_EXTRA="-mno-atomic" \ - GLIBC_CONFIGURE_FLAGS="--without-fp --libdir=/usr/lib/soft-float/no-atomic libc_cv_slibdir=/lib/soft-float/no-atomic" + GLIBC_FLOAT_FLAGS="--without-fp --libdir=/usr/lib/soft-float/no-atomic libc_cv_slibdir=/lib/soft-float/no-atomic" $(MAKE) stamps/build-glibc-linux32 XLEN=32 \ CC="riscv64-unknown-linux-gnu-gcc -m32" \ READELF=riscv64-unknown-linux-gnu-readelf \ @@ -78,19 +80,19 @@ linux: READELF=riscv64-unknown-linux-gnu-readelf \ CFLAGS_FOR_TARGET_EXTRA="-m32" \ ASFLAGS_FOR_TARGET_EXTRA="-m32" \ - GLIBC_CONFIGURE_FLAGS="--without-fp --libdir=/usr/lib32/soft-float libc_cv_slibdir=/lib32/soft-float" + GLIBC_FLOAT_FLAGS="--without-fp --libdir=/usr/lib32/soft-float libc_cv_slibdir=/lib32/soft-float" $(MAKE) stamps/build-glibc-linux32-no-atomic XLEN=32 MULTILIB=-no-atomic \ CC="riscv64-unknown-linux-gnu-gcc -m32 -mno-atomic" \ READELF=riscv64-unknown-linux-gnu-readelf \ CFLAGS_FOR_TARGET_EXTRA="-m32 -mno-atomic" \ ASFLAGS_FOR_TARGET_EXTRA="-m32 -mno-atomic" \ - GLIBC_CONFIGURE_FLAGS="--libdir=/usr/lib32/no-atomic libc_cv_slibdir=/lib32/no-atomic" + GLIBC_FLOAT_FLAGS="--libdir=/usr/lib32/no-atomic libc_cv_slibdir=/lib32/no-atomic" $(MAKE) stamps/build-glibc-linux32-soft-float-no-atomic XLEN=32 MULTILIB=-soft-float-no-atomic \ CC="riscv64-unknown-linux-gnu-gcc -m32 -mno-atomic" \ READELF=riscv64-unknown-linux-gnu-readelf \ CFLAGS_FOR_TARGET_EXTRA="-m32 -mno-atomic" \ ASFLAGS_FOR_TARGET_EXTRA="-m32 -mno-atomic" \ - GLIBC_CONFIGURE_FLAGS="--without-fp --libdir=/usr/lib32/soft-float/no-atomic libc_cv_slibdir=/lib32/soft-float/no-atomic" + GLIBC_FLOAT_FLAGS="--without-fp --libdir=/usr/lib32/soft-float/no-atomic libc_cv_slibdir=/lib32/soft-float/no-atomic" $(MAKE) stamps/build-gcc-linux-stage2 XLEN=64 endif @@ -123,6 +125,7 @@ stamps/build-binutils-linux: src/binutils --target=riscv$(XLEN)-unknown-linux-gnu \ --prefix=$(INSTALL_DIR) \ --with-sysroot=$(SYSROOT) \ + $(BINUTILS_FLOAT_FLAGS) \ $(MULTILIB_FLAGS) \ --disable-nls $(MAKE) -C $(notdir $@) @@ -140,14 +143,14 @@ stamps/build-glibc-linux-headers: src/glibc stamps/build-gcc-linux-stage1 mkdir -p $(SYSROOT)/usr/lib $(SYSROOT)/lib cd $(notdir $@) && CC= CXX= $(CURDIR)/$</configure \ --host=riscv$(XLEN)-unknown-linux-gnu \ - --prefix=/usr \ + --prefix=$(SYSROOT)/usr \ libc_cv_forced_unwind=yes \ libc_cv_c_cleanup=yes \ --enable-shared \ --enable-__thread \ --disable-multilib \ --enable-kernel=2.6.32 - $(MAKE) -C $(notdir $@) install-headers install_root=$(SYSROOT) + $(MAKE) -C $(notdir $@) install-headers mkdir -p $(dir $@) && touch $@ stamps/build-glibc-linux$(XLEN)$(MULTILIB): src/glibc stamps/build-gcc-linux-stage1 @@ -165,7 +168,7 @@ stamps/build-glibc-linux$(XLEN)$(MULTILIB): src/glibc stamps/build-gcc-linux-sta --enable-__thread \ $(MULTILIB_FLAGS) \ --enable-kernel=2.6.32 \ - $(GLIBC_CONFIGURE_FLAGS) + $(GLIBC_FLOAT_FLAGS) $(MAKE) -C $(notdir $@) $(MAKE) -C $(notdir $@) install install_root=$(SYSROOT) mkdir -p $(dir $@) && touch $@ @@ -191,6 +194,7 @@ stamps/build-gcc-linux-stage1: src/gcc stamps/build-binutils-linux \ --disable-libgomp \ --disable-nls \ --disable-bootstrap \ + $(GCC_FLOAT_FLAGS) \ $(MULTILIB_FLAGS) \ $(WITH_ARCH) $(MAKE) -C $(notdir $@) inhibit-libc=true all-gcc @@ -214,8 +218,9 @@ stamps/build-gcc-linux-stage2: src/gcc stamps/build-glibc-linux$(XLEN) \ --disable-libssp \ --disable-libquadmath \ --disable-nls \ - $(MULTILIB_FLAGS) \ --disable-bootstrap \ + $(GCC_FLOAT_FLAGS) \ + $(MULTILIB_FLAGS) \ $(WITH_ARCH) $(MAKE) -C $(notdir $@) $(MAKE) -C $(notdir $@) install @@ -228,7 +233,8 @@ stamps/build-binutils-newlib: src/binutils --target=riscv$(XLEN)-unknown-elf \ --prefix=$(INSTALL_DIR) \ --enable-tls \ - --disable-werror + --disable-werror \ + $(BINUTILS_FLOAT_FLAGS) $(MAKE) -C $(notdir $@) $(MAKE) -C $(notdir $@) install mkdir -p $(dir $@) && touch $@ @@ -257,6 +263,7 @@ stamps/build-gcc-newlib: src/newlib-gcc stamps/build-binutils-newlib --disable-libquadmath \ --disable-libgomp \ --disable-nls \ + $(GCC_FLOAT_FLAGS) \ $(MULTILIB_FLAGS) \ $(WITH_ARCH) $(MAKE) -C $(notdir $@) inhibit-libc=true diff --git a/binutils/gas/config/tc-riscv.c b/binutils/gas/config/tc-riscv.c index 90d3c4b..6e60c37 100644 --- a/binutils/gas/config/tc-riscv.c +++ b/binutils/gas/config/tc-riscv.c @@ -125,7 +125,7 @@ riscv_add_subset (const char *subset) { struct riscv_subset *s = xmalloc (sizeof *s); s->name = xstrdup (subset); - s->version_major = 1; + s->version_major = 2; s->version_minor = 0; s->next = riscv_subsets; riscv_subsets = s; @@ -1778,6 +1778,13 @@ struct option md_longopts[] = }; size_t md_longopts_size = sizeof (md_longopts); +enum float_mode { + FLOAT_MODE_DEFAULT, + FLOAT_MODE_SOFT, + FLOAT_MODE_HARD +}; +static enum float_mode marg_float_mode = FLOAT_MODE_DEFAULT; + int md_parse_option (int c, char *arg) { @@ -1792,11 +1799,11 @@ md_parse_option (int c, char *arg) break; case OPTION_MSOFT_FLOAT: - elf_flags |= EF_RISCV_SOFT_FLOAT; + marg_float_mode = FLOAT_MODE_SOFT; break; case OPTION_MHARD_FLOAT: - elf_flags &= ~EF_RISCV_SOFT_FLOAT; + marg_float_mode = FLOAT_MODE_HARD; break; case OPTION_M32: @@ -1829,6 +1836,9 @@ md_parse_option (int c, char *arg) void riscv_after_parse_args (void) { + struct riscv_subset *subset; + enum float_mode isa_float_mode, elf_float_mode; + if (riscv_subsets == NULL) riscv_set_arch ("RVIMAFDXcustom"); @@ -1841,6 +1851,35 @@ riscv_after_parse_args (void) else as_bad ("unknown default architecture `%s'", default_arch); } + + isa_float_mode = FLOAT_MODE_SOFT; + for (subset = riscv_subsets; subset != NULL; subset = subset->next) + { + if (strcasecmp(subset->name, "F") == 0) + isa_float_mode = FLOAT_MODE_HARD; + if (strcasecmp(subset->name, "D") == 0) + isa_float_mode = FLOAT_MODE_HARD; + } + + if (marg_float_mode == FLOAT_MODE_HARD && isa_float_mode == FLOAT_MODE_SOFT) + as_bad ("Architecture doesn't allow hardfloat ABI"); + + elf_float_mode = (marg_float_mode == FLOAT_MODE_DEFAULT) ? isa_float_mode + : marg_float_mode; + + switch (elf_float_mode) { + case FLOAT_MODE_DEFAULT: + as_bad("a specific float mode must be specified for an ELF"); + break; + + case FLOAT_MODE_SOFT: + elf_flags |= EF_RISCV_SOFT_FLOAT; + break; + + case FLOAT_MODE_HARD: + elf_flags &= ~EF_RISCV_SOFT_FLOAT; + break; + } } void @@ -585,7 +585,9 @@ PACKAGE_URL='' ac_subst_vars='LTLIBOBJS LIBOBJS multilib_flags -glibc_configure_flags +glibc_float_flags +gcc_float_flags +binutils_float_flags float_asflags float_cflags atomic_cflags @@ -3184,11 +3186,17 @@ fi if test "x$enable_float" != xno; then : + float_cflags=-mhard-float +float_asflags=-mhard-float +binutils_float_flags=--disable-soft-float +gcc_float_flags="--disable-soft-float --with-float=hard" else float_cflags=-msoft-float float_asflags=-msoft-float -glibc_configure_flags=--without-fp +binutils_float_flags=--enable-soft-float +gcc_float_flags="--enable-soft-float --with-float=soft" +glibc_float_flags=--without-fp fi diff --git a/configure.ac b/configure.ac index 6bec4fe..3baa839 100644 --- a/configure.ac +++ b/configure.ac @@ -82,10 +82,16 @@ AC_ARG_ENABLE(float, ) AS_IF([test "x$enable_float" != xno], - [], + [AC_SUBST(float_cflags,-mhard-float)dnl +AC_SUBST(float_asflags,-mhard-float)dnl +AC_SUBST(binutils_float_flags,--disable-soft-float)dnl +AC_SUBST(gcc_float_flags,"--disable-soft-float --with-float=hard")dnl +AC_SUBST(glibc_float_flags,)], [AC_SUBST(float_cflags,-msoft-float)dnl AC_SUBST(float_asflags,-msoft-float)dnl -AC_SUBST(glibc_configure_flags,--without-fp)]) +AC_SUBST(binutils_float_flags,--enable-soft-float)dnl +AC_SUBST(gcc_float_flags,"--enable-soft-float --with-float=soft")dnl +AC_SUBST(glibc_float_flags,--without-fp)]) AC_ARG_ENABLE(multilib, [AS_HELP_STRING([--enable-multilib], |