aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog22
-rw-r--r--bfd/elfxx-riscv.c324
-rw-r--r--bfd/elfxx-riscv.h11
-rw-r--r--gas/ChangeLog30
-rw-r--r--gas/config/tc-riscv.c23
-rw-r--r--gas/testsuite/gas/riscv/attribute-02.d4
-rw-r--r--gas/testsuite/gas/riscv/attribute-03.d4
-rw-r--r--gas/testsuite/gas/riscv/attribute-09.d4
-rw-r--r--gas/testsuite/gas/riscv/march-fail-base-01.l2
-rw-r--r--gas/testsuite/gas/riscv/march-fail-base-02.l2
-rw-r--r--gas/testsuite/gas/riscv/march-fail-isa-spec.d3
-rw-r--r--gas/testsuite/gas/riscv/march-fail-isa-spec.l5
-rw-r--r--gas/testsuite/gas/riscv/march-fail-order-std.l2
-rw-r--r--gas/testsuite/gas/riscv/march-fail-order-x.l2
-rw-r--r--gas/testsuite/gas/riscv/march-fail-order-z.l2
-rw-r--r--gas/testsuite/gas/riscv/march-fail-porder.l2
-rw-r--r--gas/testsuite/gas/riscv/march-fail-rv32ef.l2
-rw-r--r--gas/testsuite/gas/riscv/march-fail-rv32id.l2
-rw-r--r--gas/testsuite/gas/riscv/march-fail-rv32iq.l3
-rw-r--r--gas/testsuite/gas/riscv/march-fail-rv64iq.l2
-rw-r--r--gas/testsuite/gas/riscv/march-fail-single-char.l2
-rw-r--r--gas/testsuite/gas/riscv/march-fail-unknown-std.l2
-rw-r--r--gas/testsuite/gas/riscv/march-fail-unknown.l2
-rw-r--r--gas/testsuite/gas/riscv/march-fail-uppercase.l2
-rw-r--r--gas/testsuite/gas/riscv/march-fail-version.l3
-rw-r--r--gas/testsuite/gas/riscv/march-ok-two-nse.d2
-rw-r--r--include/ChangeLog5
-rw-r--r--include/opcode/riscv.h4
28 files changed, 250 insertions, 223 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 726a377..807e004 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,27 @@
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
extensions when parsed h keyword.
(riscv_get_prefix_class): Support prefixed h class.
diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
index 24eafcd..4ec429d 100644
--- a/bfd/elfxx-riscv.c
+++ b/bfd/elfxx-riscv.c
@@ -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. */
diff --git a/bfd/elfxx-riscv.h b/bfd/elfxx-riscv.h
index 6b7cc5b..45705ce 100644
--- a/bfd/elfxx-riscv.h
+++ b/bfd/elfxx-riscv.h
@@ -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
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 64d2fa7..2b45509 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,35 @@
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
orders of prefixed z extensions.
* testsuite/gas/riscv/march-fail-order-z.l: Likewise.
diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
index 2340ff5..236a858 100644
--- a/gas/config/tc-riscv.c
+++ b/gas/config/tc-riscv.c
@@ -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;
diff --git a/gas/testsuite/gas/riscv/attribute-02.d b/gas/testsuite/gas/riscv/attribute-02.d
index ae0195e..45b89f2 100644
--- a/gas/testsuite/gas/riscv/attribute-02.d
+++ b/gas/testsuite/gas/riscv/attribute-02.d
@@ -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"
diff --git a/gas/testsuite/gas/riscv/attribute-03.d b/gas/testsuite/gas/riscv/attribute-03.d
index 9916ff6..11416d6 100644
--- a/gas/testsuite/gas/riscv/attribute-03.d
+++ b/gas/testsuite/gas/riscv/attribute-03.d
@@ -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"
diff --git a/gas/testsuite/gas/riscv/attribute-09.d b/gas/testsuite/gas/riscv/attribute-09.d
index cad1713..fc87f82 100644
--- a/gas/testsuite/gas/riscv/attribute-09.d
+++ b/gas/testsuite/gas/riscv/attribute-09.d
@@ -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"
diff --git a/gas/testsuite/gas/riscv/march-fail-base-01.l b/gas/testsuite/gas/riscv/march-fail-base-01.l
index 9fa071f..45d5c9a 100644
--- a/gas/testsuite/gas/riscv/march-fail-base-01.l
+++ b/gas/testsuite/gas/riscv/march-fail-base-01.l
@@ -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'
diff --git a/gas/testsuite/gas/riscv/march-fail-base-02.l b/gas/testsuite/gas/riscv/march-fail-base-02.l
index 6fc4dfa..f6a3c1d 100644
--- a/gas/testsuite/gas/riscv/march-fail-base-02.l
+++ b/gas/testsuite/gas/riscv/march-fail-base-02.l
@@ -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
index 0000000..af707e2
--- /dev/null
+++ b/gas/testsuite/gas/riscv/march-fail-isa-spec.d
@@ -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
index 0000000..e714ddf
--- /dev/null
+++ b/gas/testsuite/gas/riscv/march-fail-isa-spec.l
@@ -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
diff --git a/gas/testsuite/gas/riscv/march-fail-order-std.l b/gas/testsuite/gas/riscv/march-fail-order-std.l
index 666a8c0..9e3ce5e 100644
--- a/gas/testsuite/gas/riscv/march-fail-order-std.l
+++ b/gas/testsuite/gas/riscv/march-fail-order-std.l
@@ -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
diff --git a/gas/testsuite/gas/riscv/march-fail-order-x.l b/gas/testsuite/gas/riscv/march-fail-order-x.l
index f7b383d..025db14 100644
--- a/gas/testsuite/gas/riscv/march-fail-order-x.l
+++ b/gas/testsuite/gas/riscv/march-fail-order-x.l
@@ -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'
diff --git a/gas/testsuite/gas/riscv/march-fail-order-z.l b/gas/testsuite/gas/riscv/march-fail-order-z.l
index 1129219..a98c53a 100644
--- a/gas/testsuite/gas/riscv/march-fail-order-z.l
+++ b/gas/testsuite/gas/riscv/march-fail-order-z.l
@@ -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'
diff --git a/gas/testsuite/gas/riscv/march-fail-porder.l b/gas/testsuite/gas/riscv/march-fail-porder.l
index a06d586..c5496ea 100644
--- a/gas/testsuite/gas/riscv/march-fail-porder.l
+++ b/gas/testsuite/gas/riscv/march-fail-porder.l
@@ -1,2 +1,2 @@
.*Assembler messages:
-.*Fatal error: .*unexpected ISA string at end:.*
+.*Error: .*unexpected ISA string at end:.*
diff --git a/gas/testsuite/gas/riscv/march-fail-rv32ef.l b/gas/testsuite/gas/riscv/march-fail-rv32ef.l
index d2d915d..e6d93f2 100644
--- a/gas/testsuite/gas/riscv/march-fail-rv32ef.l
+++ b/gas/testsuite/gas/riscv/march-fail-rv32ef.l
@@ -1,2 +1,2 @@
.*Assembler messages:
-.*Fatal error: .*rv32e does not support the `f' extension
+.*Error: .*rv32e does not support the `f' extension
diff --git a/gas/testsuite/gas/riscv/march-fail-rv32id.l b/gas/testsuite/gas/riscv/march-fail-rv32id.l
index 29b2717..c5f990c 100644
--- a/gas/testsuite/gas/riscv/march-fail-rv32id.l
+++ b/gas/testsuite/gas/riscv/march-fail-rv32id.l
@@ -1,2 +1,2 @@
.*Assembler messages:
-.*Fatal error: .*`d' extension requires `f' extension
+.*Error: .*`d' extension requires `f' extension
diff --git a/gas/testsuite/gas/riscv/march-fail-rv32iq.l b/gas/testsuite/gas/riscv/march-fail-rv32iq.l
index 361c381..8143dd4 100644
--- a/gas/testsuite/gas/riscv/march-fail-rv32iq.l
+++ b/gas/testsuite/gas/riscv/march-fail-rv32iq.l
@@ -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
diff --git a/gas/testsuite/gas/riscv/march-fail-rv64iq.l b/gas/testsuite/gas/riscv/march-fail-rv64iq.l
index 76a4104..787f46d 100644
--- a/gas/testsuite/gas/riscv/march-fail-rv64iq.l
+++ b/gas/testsuite/gas/riscv/march-fail-rv64iq.l
@@ -1,2 +1,2 @@
.*Assembler messages:
-.*Fatal error: .*`q' extension requires `d' extension
+.*Error: .*`q' extension requires `d' extension
diff --git a/gas/testsuite/gas/riscv/march-fail-single-char.l b/gas/testsuite/gas/riscv/march-fail-single-char.l
index 6466e16..435d0b2 100644
--- a/gas/testsuite/gas/riscv/march-fail-single-char.l
+++ b/gas/testsuite/gas/riscv/march-fail-single-char.l
@@ -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)'
diff --git a/gas/testsuite/gas/riscv/march-fail-unknown-std.l b/gas/testsuite/gas/riscv/march-fail-unknown-std.l
index cb85637..75cdda3 100644
--- a/gas/testsuite/gas/riscv/march-fail-unknown-std.l
+++ b/gas/testsuite/gas/riscv/march-fail-unknown-std.l
@@ -1,2 +1,2 @@
.*Assembler messages:
-.*Fatal error: .*unknown standard ISA extension `[^eimafdqiglcbjtpvn]'
+.*Error: .*unknown standard ISA extension `[^eimafdqiglcbjtpvn]'
diff --git a/gas/testsuite/gas/riscv/march-fail-unknown.l b/gas/testsuite/gas/riscv/march-fail-unknown.l
index 28a864d..874b8d4 100644
--- a/gas/testsuite/gas/riscv/march-fail-unknown.l
+++ b/gas/testsuite/gas/riscv/march-fail-unknown.l
@@ -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'
diff --git a/gas/testsuite/gas/riscv/march-fail-uppercase.l b/gas/testsuite/gas/riscv/march-fail-uppercase.l
index 292c18a..14f03d6 100644
--- a/gas/testsuite/gas/riscv/march-fail-uppercase.l
+++ b/gas/testsuite/gas/riscv/march-fail-uppercase.l
@@ -1,2 +1,2 @@
.*Assembler messages:
-.*Fatal error: .*ISA string cannot contain uppercase letters
+.*Error: .*ISA string cannot contain uppercase letters
diff --git a/gas/testsuite/gas/riscv/march-fail-version.l b/gas/testsuite/gas/riscv/march-fail-version.l
index b5d0b91..c7f8a4d 100644
--- a/gas/testsuite/gas/riscv/march-fail-version.l
+++ b/gas/testsuite/gas/riscv/march-fail-version.l
@@ -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'
diff --git a/gas/testsuite/gas/riscv/march-ok-two-nse.d b/gas/testsuite/gas/riscv/march-ok-two-nse.d
index 0fe5037..e78cf9d 100644
--- a/gas/testsuite/gas/riscv/march-ok-two-nse.d
+++ b/gas/testsuite/gas/riscv/march-ok-two-nse.d
@@ -1,4 +1,4 @@
-#as: -march=rv32imafd_xargle_xbargle
+#as: -march=rv32imafd_xargle2p0_xbargle3p0
#objdump: -dr
#source: empty.s
diff --git a/include/ChangeLog b/include/ChangeLog
index 2816129..7cda518 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -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.
diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h
index 2f1bc79..94a1380 100644
--- a/include/opcode/riscv.h
+++ b/include/opcode/riscv.h
@@ -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. */