@@ -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;
@@ -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.
@@ -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 *,
@@ -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;
@@ -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"
new file mode 100644
@@ -0,0 +1,2 @@
+.*Assembler messages:
+.*Warning: -march=rv32gxargle2p0: unknown x ISA extension `xargle'
@@ -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"
new file mode 100644
@@ -0,0 +1,3 @@
+.*Assembler messages:
+.*Warning: -march=rv32gxargle2p0_xfoo3p0: unknown x ISA extension `xargle'
+.*Warning: -march=rv32gxargle2p0_xfoo3p0: unknown x ISA extension `xfoo'
@@ -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
@@ -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'
@@ -1,2 +1,3 @@
.*Assembler messages:
+#...
.*Error: .*unexpected ISA string at end:.*
@@ -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
new file mode 100644
@@ -0,0 +1,2 @@
+.*Assembler messages:
+.*Warning: -march=rv32imafd_xargle2p0: unknown x ISA extension `xargle'
@@ -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
new file mode 100644
@@ -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'
@@ -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
new file mode 100644
@@ -0,0 +1,3 @@
+#...
+.*unknown x ISA extension `(xfoo|xbar)'
+#...