RISC-V: Clarify the behavior of .option arch directive.
authorNelson Chu <nelson.chu@sifive.com>
Thu, 9 Dec 2021 03:52:16 +0000 (11:52 +0800)
committerNelson Chu <nelson.chu@sifive.com>
Thu, 9 Dec 2021 07:55:04 +0000 (15:55 +0800)
* 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.

bfd/elfxx-riscv.c
gas/testsuite/gas/riscv/option-arch-01.s
gas/testsuite/gas/riscv/option-arch-01a.d
gas/testsuite/gas/riscv/option-arch-01b.d
gas/testsuite/gas/riscv/option-arch-02.d
gas/testsuite/gas/riscv/option-arch-02.s
gas/testsuite/gas/riscv/option-arch-03.s
gas/testsuite/gas/riscv/option-arch-fail.l
gas/testsuite/gas/riscv/option-arch-fail.s

index 3bd41ff2b551df9d769f884ef151d7b9bf7e4f38..8c44c4a36bcda707056dc207e1bf84ba9af8d50e 100644 (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;
index 201f9b3702351b14844ed456b84342582cbfa60f..50285fc8c735e5a31c7cbd4fdb0102e4d096b7ee 100644 (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
index 59bc1d29664a48a508a80cb3954b2e71f18b4fac..aed4ca8e4d90fb82b6e17f4276bc86adcb076706 100644 (file)
@@ -1,4 +1,4 @@
-#as:
+#as: -misa-spec=2.2
 #source: option-arch-01.s
 #objdump: -d
 
index 9a6c2c528ca6ccb380d90e7d5f309b7e83efb218..8f4284d5f15ba108475a72d4d19f5b32c5a66d7e 100644 (file)
@@ -1,4 +1,4 @@
-#as:
+#as: -misa-spec=2.2
 #readelf: -A
 #source: option-arch-01.s
 
index 0fe89ecaecbdc0d7a2d78db9b20e091d51866e7f..9ca013e507ef12175688c0cee82741f7e78882b3 100644 (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"
 #...
index f4ceee8426ae0fcdc1eea27d643348604e9d7aeb..e0f5de321d67264795ee016b99ae3ed217204919 100644 (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
index 7183140b028ac01b6406fe744bf4a9494fe0f056..d982a0b09858619eb4593c3b1151c1b7e5b9b9e9 100644 (file)
@@ -1,3 +1,3 @@
 .attribute arch, "rv64ic"
 .option arch, +d2p0, -c
-.option arch, =rv32ic
+.option arch, rv32ic
index 3e0599e8e0e582b1cedc983791c8ba1cf77192a1..b9979a4261805d5c8268da07e164534dc5f0b0f3 100644 (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 `\+'
index a0b1bdef3228a7e8cfbe737d49aa32d7afba38e1..101587aee16ead486a1070e7a297eaf388285b65 100644 (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, +