diff options
author | Nelson Chu <nelson.chu@sifive.com> | 2021-09-16 14:36:54 +0800 |
---|---|---|
committer | Nelson Chu <nelson.chu@sifive.com> | 2021-09-17 16:33:54 +0800 |
commit | c9f279910113d6a10cb64d81aba2c1af9f3c228c (patch) | |
tree | f6c97bc6b142ac2025b70fba59dd491251509310 /gas | |
parent | 648d5dc4e6032c66f76638604cd577c529f84bc5 (diff) | |
download | fsf-binutils-gdb-c9f279910113d6a10cb64d81aba2c1af9f3c228c.zip fsf-binutils-gdb-c9f279910113d6a10cb64d81aba2c1af9f3c228c.tar.gz fsf-binutils-gdb-c9f279910113d6a10cb64d81aba2c1af9f3c228c.tar.bz2 |
RISC-V: Merged extension string tables and their version tables into one.
There are two main reasons for this patch,
* In the past we had two extension tables, one is used to record all
supported extensions in bfd/elfxx-riscv.c, another is used to get the
default extension versions in gas/config/tc-riscv.c. It is hard to
maintain lots of tables in different files, but in fact we can merge
them into just one table. Therefore, we now define many riscv_supported_std*
tables, which record names and versions for all supported extensions.
We not only use these tables to initialize the riscv_ext_order, but
also use them to get the default versions of extensions, and decide if
the extensions should be enbaled by default.
* We add a new filed `default_enable' for the riscv_supported_std* tables,
to decide if the extension should be enabled by default. For now if the
`default_enable' field of the extension is set to EXT_DEFAULT, then we
should enable the extension when the -march and elf architecture attributes
are not set. In the future, I suppose the `default_enable' can be set
to lots of EXT_<VENDOR>, each vendor can decide to open which extensions,
when the target triple of vendor is chosen.
The elf/linux regression tests of riscv-gnu-toolchain are passed.
bfd/
* elfnn-riscv.c (cpu-riscv.h): Removed sine it is included in
bfd/elfxx-riscv.h.
(riscv_merge_std_ext): Updated since the field of rpe is changed.
* elfxx-riscv.c (cpu-riscv.h): Removed.
(riscv_implicit_subsets): Added implicit extensions for g.
(struct riscv_supported_ext): Used to be riscv_ext_version. Moved
from gas/config/tc-riscv.c, and added new field `default_enable' to
decide if the extension should be enabled by default.
(EXT_DEFAULT): Defined for `default_enable' field.
(riscv_supported_std_ext): It used to return the supported standard
architecture string, but now we move ext_version_table from
gas/config/tc-riscv.c to here, and rename it to riscv_supported_std_ext.
Currently we not only use the table to initialize riscv_ext_order, but
also get the default versions of extensions, and decide if the extensions
should be enbaled by default.
(riscv_supported_std_z_ext): Likewise, but is used for z* extensions.
(riscv_supported_std_s_ext): Likewise, but is used for s* extensions.
(riscv_supported_std_h_ext): Likewise, but is used for h* extensions.
(riscv_supported_std_zxm_ext): Likewise, but is used for zxm* extensions.
(riscv_all_supported_ext): Includes all supported extension tables.
(riscv_known_prefixed_ext): Updated.
(riscv_valid_prefixed_ext): Updated.
(riscv_init_ext_order): Init the riscv_ext_order table according to
riscv_supported_std_ext.
(riscv_get_default_ext_version): Moved from gas/config/tc-riscv.c.
Get the versions of extensions from riscv_supported_std* tables.
(riscv_parse_add_subset): Updated.
(riscv_parse_std_ext): Updated.
(riscv_set_default_arch): Set the default subset list according to
the default_enable field of riscv_supported_*ext tables.
(riscv_parse_subset): If the input ARCH is NULL, then we call
riscv_set_default_arch to set the default subset list.
* elfxx-riscv.h (cpu-riscv.h): Included.
(riscv_parse_subset_t): Removed get_default_version field, and added
isa_spec field to replace it.
(extern riscv_supported_std_ext): Removed.
gas/
* (bfd/cpu-riscv.h): Removed.
(struct riscv_ext_version): Renamed and moved to bfd/elfxx-riscv.c.
(ext_version_table): Likewise.
(riscv_get_default_ext_version): Likewise.
(ext_version_hash): Removed.
(init_ext_version_hash): Removed.
(riscv_set_arch): Updated since the field of rps is changed. Besides,
report error when the architecture string is empty.
(riscv_after_parse_args): Updated.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/config/tc-riscv.c | 126 |
1 files changed, 7 insertions, 119 deletions
diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index 1dbc4d8..e7b733a 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -29,7 +29,6 @@ #include "dwarf2dbg.h" #include "dw2gencfi.h" -#include "bfd/cpu-riscv.h" #include "bfd/elfxx-riscv.h" #include "elf/riscv.h" #include "opcode/riscv.h" @@ -88,65 +87,6 @@ struct riscv_csr_extra struct riscv_csr_extra *next; }; -/* All standard/Z* extensions defined in all supported ISA spec. */ -struct riscv_ext_version -{ - const char *name; - enum riscv_spec_class isa_spec_class; - int major_version; - int minor_version; -}; - -static const struct riscv_ext_version ext_version_table[] = -{ - {"e", ISA_SPEC_CLASS_20191213, 1, 9}, - {"e", ISA_SPEC_CLASS_20190608, 1, 9}, - {"e", ISA_SPEC_CLASS_2P2, 1, 9}, - - {"i", ISA_SPEC_CLASS_20191213, 2, 1}, - {"i", ISA_SPEC_CLASS_20190608, 2, 1}, - {"i", ISA_SPEC_CLASS_2P2, 2, 0}, - - {"m", ISA_SPEC_CLASS_20191213, 2, 0}, - {"m", ISA_SPEC_CLASS_20190608, 2, 0}, - {"m", ISA_SPEC_CLASS_2P2, 2, 0}, - - {"a", ISA_SPEC_CLASS_20191213, 2, 1}, - {"a", ISA_SPEC_CLASS_20190608, 2, 0}, - {"a", ISA_SPEC_CLASS_2P2, 2, 0}, - - {"f", ISA_SPEC_CLASS_20191213, 2, 2}, - {"f", ISA_SPEC_CLASS_20190608, 2, 2}, - {"f", ISA_SPEC_CLASS_2P2, 2, 0}, - - {"d", ISA_SPEC_CLASS_20191213, 2, 2}, - {"d", ISA_SPEC_CLASS_20190608, 2, 2}, - {"d", ISA_SPEC_CLASS_2P2, 2, 0}, - - {"q", ISA_SPEC_CLASS_20191213, 2, 2}, - {"q", ISA_SPEC_CLASS_20190608, 2, 2}, - {"q", ISA_SPEC_CLASS_2P2, 2, 0}, - - {"c", ISA_SPEC_CLASS_20191213, 2, 0}, - {"c", ISA_SPEC_CLASS_20190608, 2, 0}, - {"c", ISA_SPEC_CLASS_2P2, 2, 0}, - - {"zicsr", ISA_SPEC_CLASS_20191213, 2, 0}, - {"zicsr", ISA_SPEC_CLASS_20190608, 2, 0}, - - {"zifencei", ISA_SPEC_CLASS_20191213, 2, 0}, - {"zifencei", ISA_SPEC_CLASS_20190608, 2, 0}, - - {"zihintpause", ISA_SPEC_CLASS_DRAFT, 1, 0}, - - {"zbb", ISA_SPEC_CLASS_DRAFT, 0, 93}, - {"zba", ISA_SPEC_CLASS_DRAFT, 0, 93}, - {"zbc", ISA_SPEC_CLASS_DRAFT, 0, 93}, - - /* Terminate the list. */ - {NULL, 0, 0, 0} -}; - #ifndef DEFAULT_ARCH #define DEFAULT_ARCH "riscv64" #endif @@ -349,57 +289,6 @@ riscv_multi_subset_supports (enum riscv_insn_class insn_class) } } -/* Handle of the extension with version hash table. */ -static htab_t ext_version_hash = NULL; - -static htab_t -init_ext_version_hash (void) -{ - const struct riscv_ext_version *table = ext_version_table; - htab_t hash = str_htab_create (); - int i = 0; - - while (table[i].name) - { - const char *name = table[i].name; - if (str_hash_insert (hash, name, &table[i], 0) != NULL) - as_fatal (_("internal: duplicate %s"), name); - - i++; - while (table[i].name - && strcmp (table[i].name, name) == 0) - i++; - } - - return hash; -} - -static void -riscv_get_default_ext_version (const char *name, - int *major_version, - int *minor_version) -{ - struct riscv_ext_version *ext; - - 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) - { - if (ext->isa_spec_class == ISA_SPEC_CLASS_DRAFT - || ext->isa_spec_class == default_isa_spec) - { - *major_version = ext->major_version; - *minor_version = ext->minor_version; - return; - } - ext++; - } -} - /* Set which ISA and extensions are available. */ static void @@ -409,11 +298,15 @@ riscv_set_arch (const char *s) rps.subset_list = &riscv_subsets; rps.error_handler = as_bad; rps.xlen = &xlen; - rps.get_default_version = riscv_get_default_ext_version; + rps.isa_spec = default_isa_spec; rps.check_unknown_prefixed_ext = true; - if (s == NULL) - return; + if (s != NULL && strcmp (s, "") == 0) + { + as_bad (_("the architecture string of -march and elf architecture " + "attributes cannot be empty")); + return; + } riscv_release_subset_list (&riscv_subsets); riscv_parse_subset (&rps, s); @@ -3137,11 +3030,6 @@ riscv_after_parse_args (void) else as_bad ("unknown default architecture `%s'", default_arch); } - if (default_arch_with_ext == NULL) - default_arch_with_ext = xlen == 64 ? "rv64g" : "rv32g"; - - /* Initialize the hash table for extensions with default version. */ - ext_version_hash = init_ext_version_hash (); /* Set default specs. */ if (default_isa_spec == ISA_SPEC_CLASS_NONE) |