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 /binutils | |
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
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/gas/config/tc-riscv.c | 45 |
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 |