mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-04-24 14:53:34 +08:00
RISC-V: Clarify the behavior of .option arch directive.
* To be consistent with -march option, removed the "=" operator when user want to reset the whole architecture string. So the formats are, .option arch, +<extension><version>, ... .option arch, -<extension> .option arch, <ISA string> * Don't allow to add or remove the base extensions in the .option arch directive. Instead, users should reset the whole architecture string while they want to change the base extension. * The operator "+" won't update the version of extension, if the extension is already in the subset list. bfd/ * elfxx-riscv.c (riscv_add_subset): Don't update the version if the extension is already in the subset list. (riscv_update_subset): To be consistent with -march option, removed the "=" operator when user want to reset the whole architecture string. Besides, Don't allow to add or remove the base extensions in the .option arch directive. gas/ * testsuite/gas/riscv/option-arch-01.s: Updated since we cannot add or remove the base extensions in the .option arch directive. * testsuite/gas/riscv/option-arch-02.s: Likewise. * testsuite/gas/riscv/option-arch-fail.l: Likewise. * testsuite/gas/riscv/option-arch-fail.s: Likewise. * testsuite/gas/riscv/option-arch-01a.d: Set -misa-spec=2.2. * testsuite/gas/riscv/option-arch-01b.d: Likewise. * testsuite/gas/riscv/option-arch-02.d: Updated since the .option arch, + won't change the version of extension, if the extension is already in the subset list. * testsuite/gas/riscv/option-arch-03.s: Removed the "=" operator when resetting the whole architecture string.
This commit is contained in:
parent
de8a2781a5
commit
de3a913df6
@ -1468,15 +1468,7 @@ riscv_add_subset (riscv_subset_list_t *subset_list,
|
||||
riscv_subset_t *current, *new;
|
||||
|
||||
if (riscv_lookup_subset (subset_list, subset, ¤t))
|
||||
{
|
||||
if (major != RISCV_UNKNOWN_VERSION
|
||||
&& minor != RISCV_UNKNOWN_VERSION)
|
||||
{
|
||||
current->major_version = major;
|
||||
current->minor_version = minor;
|
||||
}
|
||||
return;
|
||||
}
|
||||
return;
|
||||
|
||||
new = xmalloc (sizeof *new);
|
||||
new->name = xstrdup (subset);
|
||||
@ -2217,18 +2209,15 @@ riscv_update_subset (riscv_parse_subset_t *rps,
|
||||
int minor_version = RISCV_UNKNOWN_VERSION;
|
||||
|
||||
bool removed = false;
|
||||
switch (*p++)
|
||||
switch (*p)
|
||||
{
|
||||
case '+': removed = false; break;
|
||||
case '-': removed = true; break;
|
||||
case '=':
|
||||
default:
|
||||
riscv_release_subset_list (rps->subset_list);
|
||||
return riscv_parse_subset (rps, p);
|
||||
default:
|
||||
rps->error_handler
|
||||
(_("extensions must begin with +/-/= in .option arch `%s'"), str);
|
||||
return false;
|
||||
}
|
||||
++p;
|
||||
|
||||
char *subset = xstrdup (p);
|
||||
char *q = subset;
|
||||
@ -2293,17 +2282,19 @@ riscv_update_subset (riscv_parse_subset_t *rps,
|
||||
return false;
|
||||
}
|
||||
|
||||
if (removed)
|
||||
if (strcmp (subset, "i") == 0
|
||||
|| strcmp (subset, "e") == 0
|
||||
|| strcmp (subset, "g") == 0)
|
||||
{
|
||||
if (strcmp (subset, "i") == 0)
|
||||
{
|
||||
rps->error_handler
|
||||
(_("cannot remove extension `i' in .option arch `%s'"), str);
|
||||
free (subset);
|
||||
return false;
|
||||
}
|
||||
riscv_remove_subset (rps->subset_list, subset);
|
||||
rps->error_handler
|
||||
(_("cannot + or - base extension `%s' in .option "
|
||||
"arch `%s'"), subset, str);
|
||||
free (subset);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (removed)
|
||||
riscv_remove_subset (rps->subset_list, subset);
|
||||
else
|
||||
riscv_parse_add_subset (rps, subset, major_version, minor_version, true);
|
||||
p += end_of_version - subset;
|
||||
|
@ -5,6 +5,6 @@ add a0, a0, a1
|
||||
add a0, a0, a1
|
||||
frcsr a0 # Should add mapping symbol with ISA here, and then dump it to frcsr.
|
||||
.option push
|
||||
.option arch, +i3p0, +m3p0, +d3p0
|
||||
.option arch, +m3p0, +d3p0
|
||||
.option pop
|
||||
.option pop
|
||||
|
@ -1,4 +1,4 @@
|
||||
#as:
|
||||
#as: -misa-spec=2.2
|
||||
#source: option-arch-01.s
|
||||
#objdump: -d
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
#as:
|
||||
#as: -misa-spec=2.2
|
||||
#readelf: -A
|
||||
#source: option-arch-01.s
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
#as:
|
||||
#as: -misa-spec=2.2
|
||||
#readelf: -A
|
||||
#source: option-arch-02.s
|
||||
|
||||
Attribute Section: riscv
|
||||
File Attributes
|
||||
Tag_RISCV_arch: "rv64i3p0_m3p0_f2p0_d3p0_c2p0_xvendor32x3p0"
|
||||
Tag_RISCV_arch: "rv64i2p0_m3p0_f2p0_d3p0_c2p0_xvendor32x3p0"
|
||||
#...
|
||||
|
@ -5,4 +5,4 @@ add a0, a0, a1
|
||||
add a0, a0, a1
|
||||
frcsr a0
|
||||
.option pop
|
||||
.option arch, +i3p0, +m3p0, +d3p0, +xvendor32x3p0
|
||||
.option arch, +m3p0, +d3p0, +xvendor32x3p0
|
||||
|
@ -1,3 +1,3 @@
|
||||
.attribute arch, "rv64ic"
|
||||
.option arch, +d2p0, -c
|
||||
.option arch, =rv32ic
|
||||
.option arch, rv32ic
|
||||
|
@ -1,6 +1,8 @@
|
||||
.*Assembler messages:
|
||||
.*Error: extensions must begin with \+/\-/\= in .option arch `m2p0'
|
||||
.*Error: cannot remove extension `i' in .option arch `\-i'
|
||||
.*Error: m2p0: ISA string must begin with rv32 or rv64
|
||||
.*Error: cannot \+ or \- base extension `i' in .option arch `\-i'
|
||||
.*Error: cannot \+ or \- base extension `e' in .option arch `\+e'
|
||||
.*Error: cannot \+ or \- base extension `g' in .option arch `\-g'
|
||||
.*Error: unknown ISA extension `zsubset' in .option arch `\+zsubset2p0'
|
||||
.*Error: unknown ISA extension `f2p0_d' in .option arch `\+f2p0_d2p0'
|
||||
.*Error: unknown ISA extension `' in .option arch `\+'
|
||||
|
@ -2,6 +2,8 @@
|
||||
.option push
|
||||
.option arch, m2p0
|
||||
.option arch, -i
|
||||
.option arch, +e
|
||||
.option arch, -g
|
||||
.option arch, +zsubset2p0
|
||||
.option arch, +f2p0_d2p0
|
||||
.option arch, +
|
||||
|
Loading…
x
Reference in New Issue
Block a user