aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPalmer Dabbelt <palmer@dabbelt.com>2016-04-06 12:51:40 -0700
committerPalmer Dabbelt <palmer@dabbelt.com>2016-04-06 12:51:40 -0700
commit3134bf43d81720863c8b8bc8fd4acd1017bca3fc (patch)
treeeec7533a9c577e03102a89c326c86f3408e4017a
parentacfa4804d96c8d7a30e53b01e5da9ab08244ecc7 (diff)
parent14b89981ad296b474f51dfb3b540078e97f85799 (diff)
downloadriscv-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.in31
-rw-r--r--binutils/gas/config/tc-riscv.c45
-rwxr-xr-xconfigure12
-rw-r--r--configure.ac10
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
diff --git a/configure b/configure
index c323c3a..3eb5490 100755
--- a/configure
+++ b/configure
@@ -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],