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:
Nelson Chu 2021-12-09 11:52:16 +08:00
parent de8a2781a5
commit de3a913df6
9 changed files with 28 additions and 33 deletions

View File

@ -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, &current))
{
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;

View File

@ -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

View File

@ -1,4 +1,4 @@
#as:
#as: -misa-spec=2.2
#source: option-arch-01.s
#objdump: -d

View File

@ -1,4 +1,4 @@
#as:
#as: -misa-spec=2.2
#readelf: -A
#source: option-arch-01.s

View File

@ -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"
#...

View File

@ -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

View File

@ -1,3 +1,3 @@
.attribute arch, "rv64ic"
.option arch, +d2p0, -c
.option arch, =rv32ic
.option arch, rv32ic

View File

@ -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 `\+'

View File

@ -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, +