[Integration 1/6] RISC-V/extended: Add extended extension hooks when parsing architecture string.

Nelson Chu nelson.chu@sifive.com
Tue Mar 30 09:36:52 GMT 2021


All known non-standard extensions will be defined in riscv_vendor_ext_strtab
of bfd/elfxx-riscv-vendor.c.  Report warning messages when the non-standard
extensions are unrecognized.  But as before, they won’t break assemble and
link time, we still need to encode them into the output architecture string.

bfd/
    * elfnn-riscv.c (riscv_merge_arch_attr_info): Set warning_handler when
    parsing architecture string.  Linker use _bfd_error_handler to report
    warnings.
    * elfxx-riscv.c (riscv_parse_add_subset): Message updated.
    (riscv_parse_prefixed_ext): Report warnings when the non-standard
    extensions are unrecognized.  Others as usual.
    (riscv_std_draft_ext_strtab): New array of string for draft extensions.
    (riscv_vendor_ext_strtab): New array of string for supported vendor
    extensions.
    (riscv_ext_x_valid_p): Check if the x vendor extensions are supported
    according to the riscv_vendor_ext_strtab.
    (riscv_ext_z_valid_p): Check if the z draft extensions are supported
    according to the riscv_std_draft_ext_strtab.
    * elfxx-riscv.h (riscv_parse_subset_t): Added warning_handler.
gas/
    * config/tc-riscv.c (riscv_set_arch): Set as_warn to warning_handler.
    * testsuite/gas/riscv/attribute-02.d: Updated.
    * testsuite/gas/riscv/attribute-02.l: Likewise.
    * testsuite/gas/riscv/attribute-03.d: Likewise.
    * testsuite/gas/riscv/attribute-03.l: Likewise.
    * testsuite/gas/riscv/march-fail-isa-spec.l: Likewise.
    * testsuite/gas/riscv/march-fail-order-x.l: Likewise.
    * testsuite/gas/riscv/march-fail-porder.l: Likewise.
    * testsuite/gas/riscv/march-ok-nse-with-version.d: Likewise.
    * testsuite/gas/riscv/march-ok-nse-with-version.l: Likewise.
    * testsuite/gas/riscv/march-ok-two-nse.d: Likewise.
    * testsuite/gas/riscv/march-ok-two-nse.l: Likewise.
ld/
    * testsuite/ld-riscv-elf/attr-merge-arch-03.d: Likewise.
    * testsuite/ld-riscv-elf/attr-merge-arch-03.l: Likewise.
---
 bfd/elfnn-riscv.c                                  |  2 +
 bfd/elfxx-riscv.c                                  | 48 ++++++++++++++++------
 bfd/elfxx-riscv.h                                  |  2 +
 gas/config/tc-riscv.c                              |  1 +
 gas/testsuite/gas/riscv/attribute-02.d             |  4 +-
 gas/testsuite/gas/riscv/attribute-02.l             |  2 +
 gas/testsuite/gas/riscv/attribute-03.d             |  4 +-
 gas/testsuite/gas/riscv/attribute-03.l             |  3 ++
 gas/testsuite/gas/riscv/march-fail-isa-spec.l      |  6 ++-
 gas/testsuite/gas/riscv/march-fail-order-x.l       |  2 +
 gas/testsuite/gas/riscv/march-fail-porder.l        |  1 +
 .../gas/riscv/march-ok-nse-with-version.d          |  3 +-
 .../gas/riscv/march-ok-nse-with-version.l          |  2 +
 gas/testsuite/gas/riscv/march-ok-two-nse.d         |  3 +-
 gas/testsuite/gas/riscv/march-ok-two-nse.l         |  3 ++
 ld/testsuite/ld-riscv-elf/attr-merge-arch-03.d     |  1 +
 ld/testsuite/ld-riscv-elf/attr-merge-arch-03.l     |  3 ++
 17 files changed, 72 insertions(+), 18 deletions(-)
 create mode 100644 gas/testsuite/gas/riscv/attribute-02.l
 create mode 100644 gas/testsuite/gas/riscv/attribute-03.l
 create mode 100644 gas/testsuite/gas/riscv/march-ok-nse-with-version.l
 create mode 100644 gas/testsuite/gas/riscv/march-ok-two-nse.l
 create mode 100644 ld/testsuite/ld-riscv-elf/attr-merge-arch-03.l

diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
index 391846a..a42cd18 100644
--- a/bfd/elfnn-riscv.c
+++ b/bfd/elfnn-riscv.c
@@ -3538,11 +3538,13 @@ riscv_merge_arch_attr_info (bfd *ibfd, char *in_arch, char *out_arch)
      the rpe_in.get_default_version and rpe_out.get_default_version to NULL.  */
   rpe_in.subset_list = &in_subsets;
   rpe_in.error_handler = _bfd_error_handler;
+  rpe_in.warning_handler = _bfd_error_handler;
   rpe_in.xlen = &xlen_in;
   rpe_in.get_default_version = NULL;
 
   rpe_out.subset_list = &out_subsets;
   rpe_out.error_handler = _bfd_error_handler;
+  rpe_out.warning_handler = _bfd_error_handler;
   rpe_out.xlen = &xlen_out;
   rpe_out.get_default_version = NULL;
 
diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
index 966e142..1ce85e0 100644
--- a/bfd/elfxx-riscv.c
+++ b/bfd/elfxx-riscv.c
@@ -1200,7 +1200,7 @@ riscv_parse_add_subset (riscv_parse_subset_t *rps,
 
       if (subset[0] == 'x')
 	rps->error_handler
-	  (_("x ISA extension `%s' must be set with the versions"),
+	  (_("unknown x ISA extension `%s' must be set with the versions"),
 	   subset);
       else
 	rps->error_handler
@@ -1541,11 +1541,20 @@ riscv_parse_prefixed_ext (riscv_parse_subset_t *rps,
       /* Check that the extension name is well-formed.  */
       if (!config->ext_valid_p (subset))
 	{
-	  rps->error_handler
-	    (_("-march=%s: unknown %s ISA extension `%s'"),
-	     march, config->prefix, subset);
-	  free (subset);
-	  return NULL;
+	  /* Single x is invalid.  */
+	  if (config->class == RV_ISA_CLASS_X
+	      && strcmp (subset, "x") != 0)
+	    rps->warning_handler
+		(_("-march=%s: unknown x ISA extension `%s'"),
+		 march, subset);
+	  else
+	    {
+	      rps->error_handler
+		(_("-march=%s: unknown %s ISA extension `%s'"),
+		 march, config->prefix, subset);
+	      free (subset);
+	      return NULL;
+	    }
 	}
 
       /* Check that the extension isn't duplicate.  */
@@ -1611,6 +1620,16 @@ static const char * const riscv_std_h_ext_strtab[] =
   NULL
 };
 
+static const char * const riscv_std_draft_ext_strtab[] =
+{
+  NULL
+};
+
+static const char ** const riscv_vendor_ext_strtab[] =
+{
+  NULL
+};
+
 /* For the extension `ext`, search through the list of known extensions
    `known_exts` for a match, and return TRUE if found.  */
 
@@ -1627,16 +1646,20 @@ riscv_multi_letter_ext_valid_p (const char *ext,
   return FALSE;
 }
 
-/* Predicator function for x-prefixed extensions.
-   Anything goes, except the literal 'x'.  */
+/* Predicator function for x-prefixed vendor extensions.
+   Anything goes, but report warning when the vendor extensions
+   are unknown.  */
 
 static bfd_boolean
 riscv_ext_x_valid_p (const char *arg)
 {
-  if (!strcasecmp (arg, "x"))
-    return FALSE;
+  unsigned int i;
 
-  return TRUE;
+  for (i = 0; riscv_vendor_ext_strtab[i] != NULL; i++)
+    if (riscv_multi_letter_ext_valid_p (arg, riscv_vendor_ext_strtab[i]))
+      return TRUE;
+
+  return FALSE;
 }
 
 /* Predicator functions for z-prefixed extensions.
@@ -1645,7 +1668,8 @@ riscv_ext_x_valid_p (const char *arg)
 static bfd_boolean
 riscv_ext_z_valid_p (const char *arg)
 {
-  return riscv_multi_letter_ext_valid_p (arg, riscv_std_z_ext_strtab);
+  return (riscv_multi_letter_ext_valid_p (arg, riscv_std_z_ext_strtab)
+	  || riscv_multi_letter_ext_valid_p (arg, riscv_std_draft_ext_strtab));
 }
 
 /* Predicator function for 's' prefixed extensions.
diff --git a/bfd/elfxx-riscv.h b/bfd/elfxx-riscv.h
index a676d5c..a26869d 100644
--- a/bfd/elfxx-riscv.h
+++ b/bfd/elfxx-riscv.h
@@ -68,6 +68,8 @@ typedef struct
   riscv_subset_list_t *subset_list;
   void (*error_handler) (const char *,
 			 ...) ATTRIBUTE_PRINTF_1;
+  void (*warning_handler) (const char *,
+			   ...) ATTRIBUTE_PRINTF_1;
   unsigned *xlen;
   void (*get_default_version) (const char *,
 			       int *,
diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
index 429732f..83cf157 100644
--- a/gas/config/tc-riscv.c
+++ b/gas/config/tc-riscv.c
@@ -408,6 +408,7 @@ riscv_set_arch (const char *s)
   riscv_parse_subset_t rps;
   rps.subset_list = &riscv_subsets;
   rps.error_handler = as_bad;
+  rps.warning_handler = as_warn;
   rps.xlen = &xlen;
   rps.get_default_version = riscv_get_default_ext_version;
 
diff --git a/gas/testsuite/gas/riscv/attribute-02.d b/gas/testsuite/gas/riscv/attribute-02.d
index 45b89f2..17c4ba5 100644
--- a/gas/testsuite/gas/riscv/attribute-02.d
+++ b/gas/testsuite/gas/riscv/attribute-02.d
@@ -1,6 +1,8 @@
 #as: -march=rv32gxargle2p0 -march-attr -misa-spec=2.2
-#readelf: -A
 #source: empty.s
+#warning_output: attribute-02.l
+#readelf: -A
+
 Attribute Section: riscv
 File Attributes
   Tag_RISCV_arch: "rv32i2p0_m2p0_a2p0_f2p0_d2p0_xargle2p0"
diff --git a/gas/testsuite/gas/riscv/attribute-02.l b/gas/testsuite/gas/riscv/attribute-02.l
new file mode 100644
index 0000000..cf22fd0
--- /dev/null
+++ b/gas/testsuite/gas/riscv/attribute-02.l
@@ -0,0 +1,2 @@
+.*Assembler messages:
+.*Warning: -march=rv32gxargle2p0: unknown x ISA extension `xargle'
diff --git a/gas/testsuite/gas/riscv/attribute-03.d b/gas/testsuite/gas/riscv/attribute-03.d
index 11416d6..2eaeb0c 100644
--- a/gas/testsuite/gas/riscv/attribute-03.d
+++ b/gas/testsuite/gas/riscv/attribute-03.d
@@ -1,6 +1,8 @@
 #as: -march=rv32gxargle2p0_xfoo3p0 -march-attr -misa-spec=2.2
-#readelf: -A
 #source: empty.s
+#warning_output: attribute-03.l
+#readelf: -A
+
 Attribute Section: riscv
 File Attributes
   Tag_RISCV_arch: "rv32i2p0_m2p0_a2p0_f2p0_d2p0_xargle2p0_xfoo3p0"
diff --git a/gas/testsuite/gas/riscv/attribute-03.l b/gas/testsuite/gas/riscv/attribute-03.l
new file mode 100644
index 0000000..8bb9bbf
--- /dev/null
+++ b/gas/testsuite/gas/riscv/attribute-03.l
@@ -0,0 +1,3 @@
+.*Assembler messages:
+.*Warning: -march=rv32gxargle2p0_xfoo3p0: unknown x ISA extension `xargle'
+.*Warning: -march=rv32gxargle2p0_xfoo3p0: unknown x ISA extension `xfoo'
diff --git a/gas/testsuite/gas/riscv/march-fail-isa-spec.l b/gas/testsuite/gas/riscv/march-fail-isa-spec.l
index e714ddf..ddc91ff 100644
--- a/gas/testsuite/gas/riscv/march-fail-isa-spec.l
+++ b/gas/testsuite/gas/riscv/march-fail-isa-spec.l
@@ -1,5 +1,7 @@
 .*Assembler messages:
 .*Error: cannot find default versions of the ISA extension `l'
 .*Error: cannot find default versions of the ISA extension `n'
-.*Error: x ISA extension `xargle' must be set with the versions
-.*Error: x ISA extension `xbargle' must be set with the versions
+.*Warning: -march=rv32iln_zicsr_xargle_xbargle: unknown x ISA extension `xargle'
+.*Error: unknown x ISA extension `xargle' must be set with the versions
+.*Warning: -march=rv32iln_zicsr_xargle_xbargle: unknown x ISA extension `xbargle'
+.*Error: unknown x ISA extension `xbargle' must be set with the versions
diff --git a/gas/testsuite/gas/riscv/march-fail-order-x.l b/gas/testsuite/gas/riscv/march-fail-order-x.l
index 025db14..6bc8cf4 100644
--- a/gas/testsuite/gas/riscv/march-fail-order-x.l
+++ b/gas/testsuite/gas/riscv/march-fail-order-x.l
@@ -1,2 +1,4 @@
 .*Assembler messages:
+.*Warning: -march=rv32i_xbargle2p0_xargle2p0: unknown x ISA extension `xbargle'
+.*Warning: -march=rv32i_xbargle2p0_xargle2p0: unknown x ISA extension `xargle'
 .*Error: .*x ISA extension `xargle' is not in alphabetical order.  It must come before `xbargle'
diff --git a/gas/testsuite/gas/riscv/march-fail-porder.l b/gas/testsuite/gas/riscv/march-fail-porder.l
index c5496ea..cc40db0 100644
--- a/gas/testsuite/gas/riscv/march-fail-porder.l
+++ b/gas/testsuite/gas/riscv/march-fail-porder.l
@@ -1,2 +1,3 @@
 .*Assembler messages:
+#...
 .*Error: .*unexpected ISA string at end:.*
diff --git a/gas/testsuite/gas/riscv/march-ok-nse-with-version.d b/gas/testsuite/gas/riscv/march-ok-nse-with-version.d
index 8e2110c..23b6314 100644
--- a/gas/testsuite/gas/riscv/march-ok-nse-with-version.d
+++ b/gas/testsuite/gas/riscv/march-ok-nse-with-version.d
@@ -1,5 +1,6 @@
 #as: -march=rv32imafd_xargle2p0
-#objdump: -dr
 #source: empty.s
+#warning_output: march-ok-nse-with-version.l
+#objdump: -dr
 
 .*:     file format elf32-(little|big)riscv
diff --git a/gas/testsuite/gas/riscv/march-ok-nse-with-version.l b/gas/testsuite/gas/riscv/march-ok-nse-with-version.l
new file mode 100644
index 0000000..363ed47
--- /dev/null
+++ b/gas/testsuite/gas/riscv/march-ok-nse-with-version.l
@@ -0,0 +1,2 @@
+.*Assembler messages:
+.*Warning: -march=rv32imafd_xargle2p0: unknown x ISA extension `xargle'
diff --git a/gas/testsuite/gas/riscv/march-ok-two-nse.d b/gas/testsuite/gas/riscv/march-ok-two-nse.d
index 8cdf316..ad7d09d 100644
--- a/gas/testsuite/gas/riscv/march-ok-two-nse.d
+++ b/gas/testsuite/gas/riscv/march-ok-two-nse.d
@@ -1,5 +1,6 @@
 #as: -march=rv32imafd_xargle2p0_xbargle3p0
-#objdump: -dr
 #source: empty.s
+#warning_output: march-ok-two-nse.l
+#objdump: -dr
 
 .*:     file format elf32-(little|big)riscv
diff --git a/gas/testsuite/gas/riscv/march-ok-two-nse.l b/gas/testsuite/gas/riscv/march-ok-two-nse.l
new file mode 100644
index 0000000..9a6f63d
--- /dev/null
+++ b/gas/testsuite/gas/riscv/march-ok-two-nse.l
@@ -0,0 +1,3 @@
+.*Assembler messages:
+.*Warning: -march=rv32imafd_xargle2p0_xbargle3p0: unknown x ISA extension `xargle'
+.*Warning: -march=rv32imafd_xargle2p0_xbargle3p0: unknown x ISA extension `xbargle'
diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-arch-03.d b/ld/testsuite/ld-riscv-elf/attr-merge-arch-03.d
index 374a043..330c7db 100644
--- a/ld/testsuite/ld-riscv-elf/attr-merge-arch-03.d
+++ b/ld/testsuite/ld-riscv-elf/attr-merge-arch-03.d
@@ -2,6 +2,7 @@
 #source: attr-merge-arch-03b.s
 #as:
 #ld: -r -m[riscv_choose_ilp32_emul]
+#warning_output: attr-merge-arch-03.l
 #readelf: -A
 
 Attribute Section: riscv
diff --git a/ld/testsuite/ld-riscv-elf/attr-merge-arch-03.l b/ld/testsuite/ld-riscv-elf/attr-merge-arch-03.l
new file mode 100644
index 0000000..83ddd24
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/attr-merge-arch-03.l
@@ -0,0 +1,3 @@
+#...
+.*unknown x ISA extension `(xfoo|xbar)'
+#...
-- 
2.7.4



More information about the Binutils mailing list