RISC-V: Improve the version parsing for arch string.
authorNelson Chu <nelson.chu@sifive.com>
Fri, 20 Nov 2020 09:26:04 +0000 (17:26 +0800)
committerNelson Chu <nelson.chu@sifive.com>
Tue, 1 Dec 2020 07:16:25 +0000 (15:16 +0800)
Keep the riscv_add_subset to do the same thing, and use a new
function, riscv_parse_add_subset, to cover most of the things
when parsing, including find the default versions for extensions,
and check whether the versions are valid.  The version 0p0 should
be an invalid version, that is the mistake I made before.  This
patch clarify the version rules as follows,

* We accept any version of extensions set by users, except 0p0.
* The non-standard x extensions must be set with versions in arch string.
* If user don't set the versions, or set 0p0 for the extensions, then try
  to find the supported versions according to the chosen ISA spec.
  Otherwise, report errors rather than output 0p0 for them.

Besides, we use as_bad rather than as_fatal to report more errors
for assembler.

bfd/
* elfxx-riscv.c (riscv_lookup_subset): Moved to front.
(riscv_add_subset): Likewise.
(riscv_release_subset_list): Likewise.
(riscv_parse_add_subset): New function.  Find and check the
versions before adding them by riscv_add_subset.
(riscv_parsing_subset_version): Remove use_default_version
and change the version type from unsigned to int.  Set the
versions to RISCV_UNKNOWN_VERSION if we can not find them
in the arch string.
(riscv_parse_std_ext): Updated.
(riscv_parse_prefixed_ext): Updated.  Since we use as_bad
rather than as_fatal to report more errors, return NULL
string if the parsed end_of_version is NULL, too.
(riscv_parse_subset): Use a new boolean, no_conflict, to
report more errors when we have more than one ISA conflicts.

* elfxx-riscv.h (RISCV_DONT_CARE_VERSION): Changed to
RISCV_UNKNOWN_VERSION.
(riscv_lookup_subset_version): Removed.
(riscv_parse_subset_t): Updated.

gas/
* config/tc-riscv.c (riscv_get_default_ext_version):
Change the version type from unsigned to int.
(riscv_set_arch): Use as_bad rather than as_fatal to
report more errors.

* testsuite/gas/riscv/attribute-02.d: Updated since x must be
set with versions.
* testsuite/gas/riscv/attribute-03.d: Likewise.
* testsuite/gas/riscv/march-ok-two-nse.d: Likewise.
* testsuite/gas/riscv/attribute-09.d: zicsr wasn't supported
in the spec 2.2, so choose the newer spec.
* testsuite/gas/riscv/march-fail-base-01.l: Updated since as_bad.
* testsuite/gas/riscv/march-fail-base-02.l: Likewise.
* testsuite/gas/riscv/march-fail-order-std.l: Likewise.
* testsuite/gas/riscv/march-fail-order-x.l: Likewise.
* testsuite/gas/riscv/march-fail-order-z.l: Likewise.
* testsuite/gas/riscv/march-fail-porder.l: Likewise.
* testsuite/gas/riscv/march-fail-rv32ef.l: Likewise.
* testsuite/gas/riscv/march-fail-rv32id.l: Likewise.
* testsuite/gas/riscv/march-fail-rv32iq.l: Likewise.
* testsuite/gas/riscv/march-fail-rv64iq.l: Likewise.
* testsuite/gas/riscv/march-fail-single-char.l: Likewise.
* testsuite/gas/riscv/march-fail-unknown-std.l: Likewise.
* testsuite/gas/riscv/march-fail-unknown.l: Likewise.
* testsuite/gas/riscv/march-fail-uppercase.l: Likewise.
* testsuite/gas/riscv/march-fail-version.l: Likewise.
* testsuite/gas/riscv/march-fail-isa-spec.d: Likewise.
* testsuite/gas/riscv/march-fail-isa-spec.l: Likewise.

include/
* opcode/riscv.h (riscv_ext_version):
Change the version type from unsigned to int.

28 files changed:
bfd/ChangeLog
bfd/elfxx-riscv.c
bfd/elfxx-riscv.h
gas/ChangeLog
gas/config/tc-riscv.c
gas/testsuite/gas/riscv/attribute-02.d
gas/testsuite/gas/riscv/attribute-03.d
gas/testsuite/gas/riscv/attribute-09.d
gas/testsuite/gas/riscv/march-fail-base-01.l
gas/testsuite/gas/riscv/march-fail-base-02.l
gas/testsuite/gas/riscv/march-fail-isa-spec.d [new file with mode: 0644]
gas/testsuite/gas/riscv/march-fail-isa-spec.l [new file with mode: 0644]
gas/testsuite/gas/riscv/march-fail-order-std.l
gas/testsuite/gas/riscv/march-fail-order-x.l
gas/testsuite/gas/riscv/march-fail-order-z.l
gas/testsuite/gas/riscv/march-fail-porder.l
gas/testsuite/gas/riscv/march-fail-rv32ef.l
gas/testsuite/gas/riscv/march-fail-rv32id.l
gas/testsuite/gas/riscv/march-fail-rv32iq.l
gas/testsuite/gas/riscv/march-fail-rv64iq.l
gas/testsuite/gas/riscv/march-fail-single-char.l
gas/testsuite/gas/riscv/march-fail-unknown-std.l
gas/testsuite/gas/riscv/march-fail-unknown.l
gas/testsuite/gas/riscv/march-fail-uppercase.l
gas/testsuite/gas/riscv/march-fail-version.l
gas/testsuite/gas/riscv/march-ok-two-nse.d
include/ChangeLog
include/opcode/riscv.h

index 726a377f74d2bd9f4db1d9da1fa0eb709c941cab..807e0046177f0c9392cded23075ef7146765f99c 100644 (file)
@@ -1,3 +1,25 @@
+2020-12-01  Nelson Chu  <nelson.chu@sifive.com>
+
+       * elfxx-riscv.c (riscv_lookup_subset): Moved to front.
+       (riscv_add_subset): Likewise.
+       (riscv_release_subset_list): Likewise.
+       (riscv_parse_add_subset): New function.  Find and check the
+       versions before adding them by riscv_add_subset.
+       (riscv_parsing_subset_version): Remove use_default_version
+       and change the version type from unsigned to int.  Set the
+       versions to RISCV_UNKNOWN_VERSION if we can not find them
+       in the arch string.
+       (riscv_parse_std_ext): Updated.
+       (riscv_parse_prefixed_ext): Updated.  Since we use as_bad
+       rather than as_fatal to report more errors, return NULL
+       string if the parsed end_of_version is NULL, too.
+       (riscv_parse_subset): Use a new boolean, no_conflict, to
+       report more errors when we have more than one ISA conflicts.
+       * elfxx-riscv.h (RISCV_DONT_CARE_VERSION): Changed to
+       RISCV_UNKNOWN_VERSION.
+       (riscv_lookup_subset_version): Removed.
+       (riscv_parse_subset_t): Updated.
+
 2020-12-01  Nelson Chu  <nelson.chu@sifive.com>
 
        * elfxx-riscv.c (riscv_parse_std_ext): Stop parsing standard
index 24eafcd25415431b957026fbd7a7be6d7c04333c..4ec429ddc9a825b53c9b08615d961cc6356fb6c9 100644 (file)
@@ -1025,6 +1025,96 @@ riscv_elf_add_sub_reloc (bfd *abfd,
   return bfd_reloc_ok;
 }
 
+/* Find subset in list, return NULL if not found.  */
+
+riscv_subset_t *
+riscv_lookup_subset (const riscv_subset_list_t *subset_list,
+                    const char *subset)
+{
+  riscv_subset_t *s;
+
+  for (s = subset_list->head; s != NULL; s = s->next)
+    if (strcasecmp (s->name, subset) == 0)
+      return s;
+
+  return NULL;
+}
+
+/* Add extension to the subset list.  */
+
+void
+riscv_add_subset (riscv_subset_list_t *subset_list,
+                 const char *subset,
+                 int major,
+                 int minor)
+{
+  riscv_subset_t *s = xmalloc (sizeof *s);
+
+  if (subset_list->head == NULL)
+    subset_list->head = s;
+
+  s->name = xstrdup (subset);
+  s->major_version = major;
+  s->minor_version = minor;
+  s->next = NULL;
+
+  if (subset_list->tail != NULL)
+    subset_list->tail->next = s;
+  subset_list->tail = s;
+}
+
+/* Find the default versions for the extension before adding them to
+   the subset list, if their versions are RISCV_UNKNOWN_VERSION.
+   Afterwards, report errors if we can not find their default versions.  */
+
+static void
+riscv_parse_add_subset (riscv_parse_subset_t *rps,
+                       const char *subset,
+                       int major,
+                       int minor)
+{
+  int major_version = major;
+  int minor_version = minor;
+
+  if ((major_version == RISCV_UNKNOWN_VERSION
+       || minor_version == RISCV_UNKNOWN_VERSION)
+      && rps->get_default_version != NULL)
+    rps->get_default_version (subset, &major_version, &minor_version);
+
+  if (major_version == RISCV_UNKNOWN_VERSION
+      || minor_version == RISCV_UNKNOWN_VERSION)
+    {
+      if (subset[0] == 'x')
+       rps->error_handler
+         (_("x ISA extension `%s' must be set with the versions"),
+          subset);
+      else
+       rps->error_handler
+         (_("cannot find default versions of the ISA extension `%s'"),
+          subset);
+      return;
+    }
+
+  riscv_add_subset (rps->subset_list, subset,
+                   major_version, minor_version);
+}
+
+/* Release subset list.  */
+
+void
+riscv_release_subset_list (riscv_subset_list_t *subset_list)
+{
+   while (subset_list->head != NULL)
+    {
+      riscv_subset_t *next = subset_list->head->next;
+      free ((void *)subset_list->head->name);
+      free (subset_list->head);
+      subset_list->head = next;
+    }
+
+  subset_list->tail = NULL;
+}
+
 /* Parsing extension version.
 
    Return Value:
@@ -1034,25 +1124,20 @@ riscv_elf_add_sub_reloc (bfd *abfd,
      `rps`: Hooks and status for parsing extensions.
      `march`: Full arch string.
      `p`: Curent parsing position.
-     `major_version`: Parsing result of major version, using
-      default_major_version if version is not present in arch string.
-     `minor_version`: Parsing result of minor version, set to 0 if version is
-     not present in arch string, but set to `default_minor_version` if
-     `major_version` using default_major_version.
-     `std_ext_p`: True if parsing std extension.
-     `use_default_version`: Set it to True if we need the default version.  */
+     `major_version`: Parsed major version.
+     `minor_version`: Parsed minor version.
+     `std_ext_p`: True if parsing standard extension.  */
 
 static const char *
 riscv_parsing_subset_version (riscv_parse_subset_t *rps,
                              const char *march,
                              const char *p,
-                             unsigned *major_version,
-                             unsigned *minor_version,
-                             bfd_boolean std_ext_p,
-                             bfd_boolean *use_default_version)
+                             int *major_version,
+                             int *minor_version,
+                             bfd_boolean std_ext_p)
 {
   bfd_boolean major_p = TRUE;
-  unsigned version = 0;
+  int version = 0;
   char np;
 
   *major_version = 0;
@@ -1096,11 +1181,13 @@ riscv_parsing_subset_version (riscv_parse_subset_t *rps,
   else
     *minor_version = version;
 
-  /* We can not find any version in string, need to parse default version.  */
-  if (use_default_version != NULL
-      && *major_version == 0
-      && *minor_version == 0)
-    *use_default_version = TRUE;
+  /* We can not find any version in string.  */
+  if (*major_version == 0 && *minor_version == 0)
+    {
+      *major_version = RISCV_UNKNOWN_VERSION;
+      *minor_version = RISCV_UNKNOWN_VERSION;
+    }
+
   return p;
 }
 
@@ -1130,9 +1217,8 @@ riscv_parse_std_ext (riscv_parse_subset_t *rps,
 {
   const char *all_std_exts = riscv_supported_std_ext ();
   const char *std_exts = all_std_exts;
-  unsigned major_version = 0;
-  unsigned minor_version = 0;
-  bfd_boolean use_default_version = FALSE;
+  int major_version;
+  int minor_version;
   char subset[2] = {0, 0};
 
   /* First letter must start with i, e or g.  */
@@ -1141,42 +1227,23 @@ riscv_parse_std_ext (riscv_parse_subset_t *rps,
       case 'i':
        p = riscv_parsing_subset_version (rps, march, ++p,
                                          &major_version,
-                                         &minor_version, TRUE,
-                                         &use_default_version);
-       /* Find the default version if needed.  */
-       if (use_default_version
-           && rps->get_default_version != NULL)
-         rps->get_default_version ("i",
-                                   &major_version,
-                                   &minor_version);
-       riscv_add_subset (rps->subset_list, "i",
-                         major_version,
-                         minor_version);
+                                         &minor_version, TRUE);
+       riscv_parse_add_subset (rps, "i",
+                               major_version,
+                               minor_version);
        break;
 
       case 'e':
        p = riscv_parsing_subset_version (rps, march, ++p,
                                          &major_version,
-                                         &minor_version, TRUE,
-                                         &use_default_version);
-       /* Find the default version if needed.  */
-       if (use_default_version
-           && rps->get_default_version != NULL)
-         rps->get_default_version ("e",
-                                   &major_version,
-                                   &minor_version);
-       riscv_add_subset (rps->subset_list, "e",
-                         major_version,
-                         minor_version);
-
+                                         &minor_version, TRUE);
+       riscv_parse_add_subset (rps, "e",
+                               major_version,
+                               minor_version);
        /* i-ext must be enabled.  */
-       if (rps->get_default_version != NULL)
-         rps->get_default_version ("i",
-                                   &major_version,
-                                   &minor_version);
-       riscv_add_subset (rps->subset_list, "i",
-                         major_version,
-                         minor_version);
+       riscv_parse_add_subset (rps, "i",
+                               RISCV_UNKNOWN_VERSION,
+                               RISCV_UNKNOWN_VERSION);
 
        if (*rps->xlen > 32)
          {
@@ -1192,27 +1259,17 @@ riscv_parse_std_ext (riscv_parse_subset_t *rps,
           skip the setting if user set a version to it.  */
        p = riscv_parsing_subset_version (rps, march, ++p,
                                          &major_version,
-                                         &minor_version, TRUE,
-                                         &use_default_version);
+                                         &minor_version, TRUE);
        /* i-ext must be enabled.  */
-       if (rps->get_default_version != NULL)
-         rps->get_default_version ("i",
-                                   &major_version,
-                                   &minor_version);
-       riscv_add_subset (rps->subset_list, "i",
-                         major_version,
-                         minor_version);
-
+       riscv_parse_add_subset (rps, "i",
+                               RISCV_UNKNOWN_VERSION,
+                               RISCV_UNKNOWN_VERSION);
        for ( ; *std_exts != 'q'; std_exts++)
          {
            subset[0] = *std_exts;
-           if (rps->get_default_version != NULL)
-             rps->get_default_version (subset,
-                                       &major_version,
-                                       &minor_version);
-           riscv_add_subset (rps->subset_list, subset,
-                             major_version,
-                             minor_version);
+           riscv_parse_add_subset (rps, subset,
+                                   RISCV_UNKNOWN_VERSION,
+                                   RISCV_UNKNOWN_VERSION);
          }
        break;
 
@@ -1253,21 +1310,13 @@ riscv_parse_std_ext (riscv_parse_subset_t *rps,
        }
 
       std_exts++;
-      use_default_version = FALSE;
       subset[0] = std_ext;
       p = riscv_parsing_subset_version (rps, march, ++p,
                                        &major_version,
-                                       &minor_version, TRUE,
-                                       &use_default_version);
-      /* Find the default version if needed.  */
-      if (use_default_version
-         && rps->get_default_version != NULL)
-       rps->get_default_version (subset,
-                                 &major_version,
-                                 &minor_version);
-      riscv_add_subset (rps->subset_list, subset,
-                       major_version,
-                       minor_version);
+                                       &minor_version, TRUE);
+      riscv_parse_add_subset (rps, subset,
+                             major_version,
+                             minor_version);
     }
 
   return p;
@@ -1324,11 +1373,10 @@ riscv_parse_prefixed_ext (riscv_parse_subset_t *rps,
                          const char *p,
                          const riscv_parse_config_t *config)
 {
-  unsigned major_version = 0;
-  unsigned minor_version = 0;
+  int major_version;
+  int minor_version;
   const char *last_name;
   riscv_isa_ext_class_t class;
-  bfd_boolean use_default_version;
 
   while (*p)
     {
@@ -1352,14 +1400,18 @@ riscv_parse_prefixed_ext (riscv_parse_subset_t *rps,
       while (*++q != '\0' && *q != '_' && !ISDIGIT (*q))
        ;
 
-      use_default_version = FALSE;
       end_of_version =
        riscv_parsing_subset_version (rps, march, q,
                                      &major_version,
-                                     &minor_version, FALSE,
-                                     &use_default_version);
+                                     &minor_version, FALSE);
       *q = '\0';
 
+      if (end_of_version == NULL)
+       {
+         free (subset);
+         return NULL;
+       }
+
       /* Check that the prefix extension is known.
         For 'x', anything goes but it cannot simply be 'x'.
         For 's', it must be known from a list and cannot simply be 's'.
@@ -1399,16 +1451,9 @@ riscv_parse_prefixed_ext (riscv_parse_subset_t *rps,
          return NULL;
        }
 
-      /* Find the default version if needed.  */
-      if (use_default_version
-         && rps->get_default_version != NULL)
-       rps->get_default_version (subset,
-                                 &major_version,
-                                 &minor_version);
-      riscv_add_subset (rps->subset_list, subset,
-                       major_version,
-                       minor_version);
-
+      riscv_parse_add_subset (rps, subset,
+                             major_version,
+                             minor_version);
       free (subset);
       p += end_of_version - subset;
 
@@ -1529,6 +1574,7 @@ riscv_parse_subset (riscv_parse_subset_t *rps,
 {
   const char *p;
   size_t i;
+  bfd_boolean no_conflict = TRUE;
 
   for (p = arch; *p != '\0'; p++)
     {
@@ -1595,7 +1641,7 @@ riscv_parse_subset (riscv_parse_subset_t *rps,
       rps->error_handler
        (_("-march=%s: rv32e does not support the `f' extension"),
         arch);
-      return FALSE;
+      no_conflict = FALSE;
     }
 
   if (riscv_lookup_subset (rps->subset_list, "q") && *rps->xlen < 64)
@@ -1603,7 +1649,7 @@ riscv_parse_subset (riscv_parse_subset_t *rps,
       rps->error_handler
        (_("-march=%s: rv32 does not support the `q' extension"),
         arch);
-      return FALSE;
+      no_conflict = FALSE;
     }
 
   if (riscv_lookup_subset (rps->subset_list, "d")
@@ -1612,7 +1658,7 @@ riscv_parse_subset (riscv_parse_subset_t *rps,
       rps->error_handler
        (_("-march=%s: `d' extension requires `f' extension"),
         arch);
-      return FALSE;
+      no_conflict = FALSE;
     }
 
   if (riscv_lookup_subset (rps->subset_list, "q")
@@ -1621,88 +1667,10 @@ riscv_parse_subset (riscv_parse_subset_t *rps,
       rps->error_handler
        (_("-march=%s: `q' extension requires `d' extension"),
         arch);
-      return FALSE;
-    }
-
-  return TRUE;
-}
-
-/* Add new subset to list.  */
-
-void
-riscv_add_subset (riscv_subset_list_t *subset_list,
-                 const char *subset,
-                 int major,
-                 int minor)
-{
-  riscv_subset_t *s = xmalloc (sizeof *s);
-
-  if (subset_list->head == NULL)
-    subset_list->head = s;
-
-  s->name = xstrdup (subset);
-  s->major_version = major;
-  s->minor_version = minor;
-  s->next = NULL;
-
-  if (subset_list->tail != NULL)
-    subset_list->tail->next = s;
-
-  subset_list->tail = s;
-}
-
-/* Find subset in list without version checking, return NULL if not found.  */
-
-riscv_subset_t *
-riscv_lookup_subset (const riscv_subset_list_t *subset_list,
-                    const char *subset)
-{
-  return riscv_lookup_subset_version
-    (subset_list, subset,
-     RISCV_DONT_CARE_VERSION,
-     RISCV_DONT_CARE_VERSION);
-}
-
-/* Find subset in list with version checking, return NULL if not found.  */
-
-riscv_subset_t *
-riscv_lookup_subset_version (const riscv_subset_list_t *subset_list,
-                            const char *subset,
-                            int major, int minor)
-{
-  riscv_subset_t *s;
-
-  for (s = subset_list->head; s != NULL; s = s->next)
-    if (strcasecmp (s->name, subset) == 0)
-      {
-       if ((major != RISCV_DONT_CARE_VERSION)
-           && (s->major_version != major))
-         return NULL;
-
-       if ((minor != RISCV_DONT_CARE_VERSION)
-           && (s->minor_version != minor))
-         return NULL;
-
-       return s;
-      }
-
-  return NULL;
-}
-
-/* Release subset list.  */
-
-void
-riscv_release_subset_list (riscv_subset_list_t *subset_list)
-{
-   while (subset_list->head != NULL)
-    {
-      riscv_subset_t *next = subset_list->head->next;
-      free ((void *)subset_list->head->name);
-      free (subset_list->head);
-      subset_list->head = next;
+      no_conflict = FALSE;
     }
 
-  subset_list->tail = NULL;
+  return no_conflict;
 }
 
 /* Return the number of digits for the input.  */
index 6b7cc5b0bf99d2e0a802c2216ffef6d9b9d397d3..45705ce31c24fc581facdeb9613b7a2a86f1792b 100644 (file)
@@ -33,7 +33,7 @@ riscv_reloc_type_lookup (bfd *, bfd_reloc_code_real_type);
 extern reloc_howto_type *
 riscv_elf_rtype_to_howto (bfd *, unsigned int r_type);
 
-#define RISCV_DONT_CARE_VERSION -1
+#define RISCV_UNKNOWN_VERSION -1
 
 /* The information of architecture attribute.  */
 struct riscv_subset_t
@@ -64,11 +64,6 @@ extern riscv_subset_t *
 riscv_lookup_subset (const riscv_subset_list_t *,
                     const char *);
 
-extern riscv_subset_t *
-riscv_lookup_subset_version (const riscv_subset_list_t *,
-                            const char *,
-                            int, int);
-
 typedef struct
 {
   riscv_subset_list_t *subset_list;
@@ -76,8 +71,8 @@ typedef struct
                         ...) ATTRIBUTE_PRINTF_1;
   unsigned *xlen;
   void (*get_default_version) (const char *,
-                              unsigned int *,
-                              unsigned int *);
+                              int *,
+                              int *);
 } riscv_parse_subset_t;
 
 extern bfd_boolean
index 64d2fa7ff1487eaf3ad7a02587185f0e28d43d4a..2b4550976bacd71e1e6448bacfdafbc4cdf7b1db 100644 (file)
@@ -1,3 +1,33 @@
+2020-12-01  Nelson Chu  <nelson.chu@sifive.com>
+
+       * config/tc-riscv.c (riscv_get_default_ext_version):
+       Change the version type from unsigned to int.
+       (riscv_set_arch): Use as_bad rather than as_fatal to
+       report more errors.
+       * testsuite/gas/riscv/attribute-02.d: Updated since x must be
+       set with versions.
+       * testsuite/gas/riscv/attribute-03.d: Likewise.
+       * testsuite/gas/riscv/march-ok-two-nse.d: Likewise.
+       * testsuite/gas/riscv/attribute-09.d: zicsr wasn't supported
+       in the spec 2.2, so choose the newer spec.
+       * testsuite/gas/riscv/march-fail-base-01.l: Updated since as_bad.
+       * testsuite/gas/riscv/march-fail-base-02.l: Likewise.
+       * testsuite/gas/riscv/march-fail-order-std.l: Likewise.
+       * testsuite/gas/riscv/march-fail-order-x.l: Likewise.
+       * testsuite/gas/riscv/march-fail-order-z.l: Likewise.
+       * testsuite/gas/riscv/march-fail-porder.l: Likewise.
+       * testsuite/gas/riscv/march-fail-rv32ef.l: Likewise.
+       * testsuite/gas/riscv/march-fail-rv32id.l: Likewise.
+       * testsuite/gas/riscv/march-fail-rv32iq.l: Likewise.
+       * testsuite/gas/riscv/march-fail-rv64iq.l: Likewise.
+       * testsuite/gas/riscv/march-fail-single-char.l: Likewise.
+       * testsuite/gas/riscv/march-fail-unknown-std.l: Likewise.
+       * testsuite/gas/riscv/march-fail-unknown.l: Likewise.
+       * testsuite/gas/riscv/march-fail-uppercase.l: Likewise.
+       * testsuite/gas/riscv/march-fail-version.l: Likewise.
+       * testsuite/gas/riscv/march-fail-isa-spec.d: Likewise.
+       * testsuite/gas/riscv/march-fail-isa-spec.l: Likewise.
+
 2020-12-01  Nelson Chu  <nelson.chu@sifive.com>
 
        * testsuite/gas/riscv/march-fail-order-z.d: New testcase, check
index 2340ff57e4cb9aa84c9fed743fe506121e270d08..236a85847ed92c1847fb222defc1d53946669198 100644 (file)
@@ -275,28 +275,25 @@ init_ext_version_hash (const struct riscv_ext_version *table)
 
 static void
 riscv_get_default_ext_version (const char *name,
-                              unsigned int *major_version,
-                              unsigned int *minor_version)
+                              int *major_version,
+                              int *minor_version)
 {
   struct riscv_ext_version *ext;
 
-  *major_version = 0;
-  *minor_version = 0;
-
   if (name == NULL || default_isa_spec == ISA_SPEC_CLASS_NONE)
     return;
 
   ext = (struct riscv_ext_version *) str_hash_find (ext_version_hash, name);
   while (ext
-        && ext->name
-        && strcmp (ext->name, name) == 0)
+        && ext->name
+        && strcmp (ext->name, name) == 0)
     {
       if (ext->isa_spec_class == default_isa_spec)
-       {
-         *major_version = ext->major_version;
-         *minor_version = ext->minor_version;
-         return;
-       }
+       {
+         *major_version = ext->major_version;
+         *minor_version = ext->minor_version;
+         return;
+       }
       ext++;
     }
 }
@@ -308,7 +305,7 @@ riscv_set_arch (const char *s)
 {
   riscv_parse_subset_t rps;
   rps.subset_list = &riscv_subsets;
-  rps.error_handler = as_fatal;
+  rps.error_handler = as_bad;
   rps.xlen = &xlen;
   rps.get_default_version = riscv_get_default_ext_version;
 
index ae0195e9a2ca69fd6b2031b118b4234125a13960..45b89f2d62d095067996b13648cf2875612a760b 100644 (file)
@@ -1,6 +1,6 @@
-#as: -march=rv32gxargle -march-attr -misa-spec=2.2
+#as: -march=rv32gxargle2p0 -march-attr -misa-spec=2.2
 #readelf: -A
 #source: empty.s
 Attribute Section: riscv
 File Attributes
-  Tag_RISCV_arch: "rv32i2p0_m2p0_a2p0_f2p0_d2p0_xargle0p0"
+  Tag_RISCV_arch: "rv32i2p0_m2p0_a2p0_f2p0_d2p0_xargle2p0"
index 9916ff6e927a3773aea8be7c247dfc1dd23d09b6..11416d63d2548834859bb62227d6e59c42a0f276 100644 (file)
@@ -1,6 +1,6 @@
-#as: -march=rv32gxargle_xfoo -march-attr -misa-spec=2.2
+#as: -march=rv32gxargle2p0_xfoo3p0 -march-attr -misa-spec=2.2
 #readelf: -A
 #source: empty.s
 Attribute Section: riscv
 File Attributes
-  Tag_RISCV_arch: "rv32i2p0_m2p0_a2p0_f2p0_d2p0_xargle0p0_xfoo0p0"
+  Tag_RISCV_arch: "rv32i2p0_m2p0_a2p0_f2p0_d2p0_xargle2p0_xfoo3p0"
index cad1713b0a0af579236346a350455b83d5a55755..fc87f82c5544fc6063545b622c7e212ebdf21499 100644 (file)
@@ -1,6 +1,6 @@
-#as: -march-attr -march=rv32i2p1m_zicsr -misa-spec=2.2
+#as: -march-attr -march=rv32i2p2m_zicsr -misa-spec=20191213
 #readelf: -A
 #source: empty.s
 Attribute Section: riscv
 File Attributes
-  Tag_RISCV_arch: "rv32i2p1_m2p0_zicsr0p0"
+  Tag_RISCV_arch: "rv32i2p2_m2p0_zicsr2p0"
index 9fa071f5b00bee6b01272b86d6c03f581683433a..45d5c9ad98c0f7a217751cdb0596c38e6f8323c0 100644 (file)
@@ -1,2 +1,2 @@
 .*Assembler messages:
-.*Fatal error: .*first ISA extension must be `e', `i' or `g'
+.*Error: .*first ISA extension must be `e', `i' or `g'
index 6fc4dfa7ba1b783083806c3ec3e97d22d1c6b531..f6a3c1dc51cb8d7b54cd47cb793001edbce0d0e3 100644 (file)
@@ -1,2 +1,2 @@
 .*Assembler messages:
-.*Fatal error: .*rv64e is not a valid base ISA
+.*Error: .*rv64e is not a valid base ISA
diff --git a/gas/testsuite/gas/riscv/march-fail-isa-spec.d b/gas/testsuite/gas/riscv/march-fail-isa-spec.d
new file mode 100644 (file)
index 0000000..af707e2
--- /dev/null
@@ -0,0 +1,3 @@
+#as: -march=rv32iln_zicsr_xargle_xbargle -misa-spec=20191213
+#source: empty.s
+#error_output: march-fail-isa-spec.l
diff --git a/gas/testsuite/gas/riscv/march-fail-isa-spec.l b/gas/testsuite/gas/riscv/march-fail-isa-spec.l
new file mode 100644 (file)
index 0000000..e714ddf
--- /dev/null
@@ -0,0 +1,5 @@
+.*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
index 666a8c0d2c574a3861fb7db4a0509b84c5fce0e7..9e3ce5e8d913b48994c3b75716fc3a2ab1b7ac14 100644 (file)
@@ -1,2 +1,2 @@
 .*Assembler messages:
-.*Fatal error: .*standard ISA extension `m' is not in canonical order
+.*Error: .*standard ISA extension `m' is not in canonical order
index f7b383d855c667b6a834d6f734e71f365f9d7ad7..025db146867e504993b7a70f56c8a106ddc649c9 100644 (file)
@@ -1,2 +1,2 @@
 .*Assembler messages:
-.*Fatal error: .*x ISA extension `xargle' is not in alphabetical order.  It must come before `xbargle'
+.*Error: .*x ISA extension `xargle' is not in alphabetical order.  It must come before `xbargle'
index 1129219f2b5622353a7699c5ead5ebe865ec68b4..a98c53a279de0acd6f770604cb3262a373f2e405 100644 (file)
@@ -1,2 +1,2 @@
 .*Assembler messages:
-.*Fatal error: .*z ISA extension `zicsr' is not in alphabetical order.  It must come before `zifencei'
+.*Error: .*z ISA extension `zicsr' is not in alphabetical order.  It must come before `zifencei'
index a06d5865805c007c1d502197b15ad5ba735a84b2..c5496eab4995b9f4c4b6b4ab57acab010fd152ce 100644 (file)
@@ -1,2 +1,2 @@
 .*Assembler messages:
-.*Fatal error: .*unexpected ISA string at end:.*
+.*Error: .*unexpected ISA string at end:.*
index d2d915d872cd1ccde8982ceb74f75dd88dff9bb8..e6d93f28fa545254c50e321ba7c66a8b5cd56ce3 100644 (file)
@@ -1,2 +1,2 @@
 .*Assembler messages:
-.*Fatal error: .*rv32e does not support the `f' extension
+.*Error: .*rv32e does not support the `f' extension
index 29b2717ef7c9149ed2d7cfdfa8540fa781e5fa0f..c5f990cd73584ed2ba2d6f48065a31b42a5e2611 100644 (file)
@@ -1,2 +1,2 @@
 .*Assembler messages:
-.*Fatal error: .*`d' extension requires `f' extension
+.*Error: .*`d' extension requires `f' extension
index 361c381b86738d8cdea6dd9ff7a3c8291f76fe0b..8143dd441d5f1b3bed4a11ee8e804b5aa73c6d70 100644 (file)
@@ -1,2 +1,3 @@
 .*Assembler messages:
-.*Fatal error: .*rv32 does not support the `q' extension
+.*Error: .*rv32 does not support the `q' extension
+.*Error: .*`q' extension requires `d' extension
index 76a41043e38dc39fb89d9178f1dfe23775de2118..787f46d1ed8b5f9a52fec377c92d8d37d20caacf 100644 (file)
@@ -1,2 +1,2 @@
 .*Assembler messages:
-.*Fatal error: .*`q' extension requires `d' extension
+.*Error: .*`q' extension requires `d' extension
index 6466e164ff8fefd2f7b0954e4ccec20f5da8a609..435d0b23a4fbc2a9f5d12f2c6861ddbf2900edd7 100644 (file)
@@ -1,2 +1,2 @@
 .*Assembler messages:
-.*Fatal error: .*unknown (s|h|z|x) ISA extension `(s|h|z|x)'
+.*Error: .*unknown (s|h|z|x) ISA extension `(s|h|z|x)'
index cb856377b3cd698932325d421d115927907d0fdf..75cdda38942241c216c7772725d3478021d44f49 100644 (file)
@@ -1,2 +1,2 @@
 .*Assembler messages:
-.*Fatal error: .*unknown standard ISA extension `[^eimafdqiglcbjtpvn]'
+.*Error: .*unknown standard ISA extension `[^eimafdqiglcbjtpvn]'
index 28a864dbb71de3e0d46ba8d13dbbd4c3a0f640f8..874b8d461ba9808bb221a1327a017112dcb0f00b 100644 (file)
@@ -1,2 +1,2 @@
 .*Assembler messages:
-.*Fatal error: .*unknown (s|h|z) ISA extension `(s|h|z)foo'
+.*Error: .*unknown (s|h|z) ISA extension `(s|h|z)foo'
index 292c18adcc6499e839e1e36d2c82fe20de6af218..14f03d6954afff511a0e5e7c6862daa998ee710b 100644 (file)
@@ -1,2 +1,2 @@
 .*Assembler messages:
-.*Fatal error: .*ISA string cannot contain uppercase letters
+.*Error: .*ISA string cannot contain uppercase letters
index b5d0b913504b6bb0e838114a1538a28847d06d8a..c7f8a4d5487ce89e126d14a39f253682dda3e405 100644 (file)
@@ -1,2 +1,3 @@
 .*Assembler messages:
-.*Fatal error: .*expect number after `2p'
+.*Error: cannot find default versions of the ISA extension `p'
+.*Error: .*expect number after `2p'
index 0fe503793bdde372012df77be626935a4c43c19a..e78cf9dd09bed2a968430b4e7084c36158df236f 100644 (file)
@@ -1,4 +1,4 @@
-#as: -march=rv32imafd_xargle_xbargle
+#as: -march=rv32imafd_xargle2p0_xbargle3p0
 #objdump: -dr
 #source: empty.s
 
index 281612918804c5ca0611ebda55120fb3625a7ddd..7cda51860c07b9d7000233a8f9104d044ab012d7 100644 (file)
@@ -1,3 +1,8 @@
+2020-12-01  Nelson Chu  <nelson.chu@sifive.com>
+
+       * opcode/riscv.h (riscv_ext_version):
+       Change the version type from unsigned to int.
+
 2020-11-23  Nick Alcock  <nick.alcock@oracle.com>
 
        * ctf-api.h: Style nit: remove () on function names in comments.
index 2f1bc793e5ca409f4de6403748b5d5fdd7f89364..94a13803d90f17bead26bb9c7f276ad5cafc9a03 100644 (file)
@@ -360,8 +360,8 @@ struct riscv_ext_version
 {
   const char *name;
   enum riscv_isa_spec_class isa_spec_class;
-  unsigned int major_version;
-  unsigned int minor_version;
+  int major_version;
+  int minor_version;
 };
 
 /* All RISC-V CSR belong to one of these classes.  */