aboutsummaryrefslogtreecommitdiff
path: root/binutils
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 /binutils
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
Diffstat (limited to 'binutils')
-rw-r--r--binutils/gas/config/tc-riscv.c45
1 files changed, 42 insertions, 3 deletions
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