From de3a913df6e0af6d6d88ecd308407971a44eae9e Mon Sep 17 00:00:00 2001 From: Nelson Chu Date: Thu, 9 Dec 2021 11:52:16 +0800 Subject: [PATCH] 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, +, ... .option arch, - .option arch, * 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. --- bfd/elfxx-riscv.c | 39 +++++++++------------- gas/testsuite/gas/riscv/option-arch-01.s | 2 +- gas/testsuite/gas/riscv/option-arch-01a.d | 2 +- gas/testsuite/gas/riscv/option-arch-01b.d | 2 +- gas/testsuite/gas/riscv/option-arch-02.d | 4 +-- gas/testsuite/gas/riscv/option-arch-02.s | 2 +- gas/testsuite/gas/riscv/option-arch-03.s | 2 +- gas/testsuite/gas/riscv/option-arch-fail.l | 6 ++-- gas/testsuite/gas/riscv/option-arch-fail.s | 2 ++ 9 files changed, 28 insertions(+), 33 deletions(-) diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c index 3bd41ff2b55..8c44c4a36bc 100644 --- a/bfd/elfxx-riscv.c +++ b/bfd/elfxx-riscv.c @@ -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; diff --git a/gas/testsuite/gas/riscv/option-arch-01.s b/gas/testsuite/gas/riscv/option-arch-01.s index 201f9b37023..50285fc8c73 100644 --- a/gas/testsuite/gas/riscv/option-arch-01.s +++ b/gas/testsuite/gas/riscv/option-arch-01.s @@ -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 diff --git a/gas/testsuite/gas/riscv/option-arch-01a.d b/gas/testsuite/gas/riscv/option-arch-01a.d index 59bc1d29664..aed4ca8e4d9 100644 --- a/gas/testsuite/gas/riscv/option-arch-01a.d +++ b/gas/testsuite/gas/riscv/option-arch-01a.d @@ -1,4 +1,4 @@ -#as: +#as: -misa-spec=2.2 #source: option-arch-01.s #objdump: -d diff --git a/gas/testsuite/gas/riscv/option-arch-01b.d b/gas/testsuite/gas/riscv/option-arch-01b.d index 9a6c2c528ca..8f4284d5f15 100644 --- a/gas/testsuite/gas/riscv/option-arch-01b.d +++ b/gas/testsuite/gas/riscv/option-arch-01b.d @@ -1,4 +1,4 @@ -#as: +#as: -misa-spec=2.2 #readelf: -A #source: option-arch-01.s diff --git a/gas/testsuite/gas/riscv/option-arch-02.d b/gas/testsuite/gas/riscv/option-arch-02.d index 0fe89ecaecb..9ca013e507e 100644 --- a/gas/testsuite/gas/riscv/option-arch-02.d +++ b/gas/testsuite/gas/riscv/option-arch-02.d @@ -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" #... diff --git a/gas/testsuite/gas/riscv/option-arch-02.s b/gas/testsuite/gas/riscv/option-arch-02.s index f4ceee8426a..e0f5de321d6 100644 --- a/gas/testsuite/gas/riscv/option-arch-02.s +++ b/gas/testsuite/gas/riscv/option-arch-02.s @@ -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 diff --git a/gas/testsuite/gas/riscv/option-arch-03.s b/gas/testsuite/gas/riscv/option-arch-03.s index 7183140b028..d982a0b0985 100644 --- a/gas/testsuite/gas/riscv/option-arch-03.s +++ b/gas/testsuite/gas/riscv/option-arch-03.s @@ -1,3 +1,3 @@ .attribute arch, "rv64ic" .option arch, +d2p0, -c -.option arch, =rv32ic +.option arch, rv32ic diff --git a/gas/testsuite/gas/riscv/option-arch-fail.l b/gas/testsuite/gas/riscv/option-arch-fail.l index 3e0599e8e0e..b9979a42618 100644 --- a/gas/testsuite/gas/riscv/option-arch-fail.l +++ b/gas/testsuite/gas/riscv/option-arch-fail.l @@ -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 `\+' diff --git a/gas/testsuite/gas/riscv/option-arch-fail.s b/gas/testsuite/gas/riscv/option-arch-fail.s index a0b1bdef322..101587aee16 100644 --- a/gas/testsuite/gas/riscv/option-arch-fail.s +++ b/gas/testsuite/gas/riscv/option-arch-fail.s @@ -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, + -- 2.30.2