[PATCH] RISC-V: Add bfd/cpu-riscv.h to support all spec versions controling.
Nelson Chu
nelson.chu@sifive.com
Wed Feb 17 02:05:45 GMT 2021
Hi Guys,
Ping! Since I add the new file bfd/cpu-riscv.h to support all spec
versions controlling, this should require approval.
Thanks
Nelson
On Thu, Jan 28, 2021 at 12:46 PM Nelson Chu <nelson.chu@sifive.com> wrote:
>
> Make the opcode/riscv-opc.c and include/opcode/riscv.h tidy, move the
> spec versions stuff to bfd/cpu-riscv.h. Also move the csr stuff and
> ext_version_table to gas/config/tc-riscv.c for internal use. To avoid
> too many repeated code, define general RISCV_GET_SPEC_NAME/SPEC_CLASS
> macros. Therefore, assembler/dis-assembler/linker/gdb can get all spec
> versions related stuff from cpu-riscv.h and cpu-riscv.c, since the stuff
> are defined there uniformly..
>
> bfd/
> * Makefile.am: Added cpu-riscv.h.
> * Makefile.in: Regenerated.
> * doc/Makefile.in: Regenerated.
> * po/SRC-POTFILES.in: Regenerated.
> * cpu-riscv.h: Added to support spec versions controling. Also added
> extern arrays and functions for cpu-riscv.c.
> (enum riscv_spec_class): Define all spec classes here uniformly.
> (struct riscv_spec): Added for all specs.
> (RISCV_GET_SPEC_CLASS): Added to reduce repeated code.
> (RISCV_GET_SPEC_NAME): Likewise.
> (RISCV_GET_ISA_SPEC_CLASS): Added to get ISA spec class.
> (RISCV_GET_PRIV_SPEC_CLASS): Added to get privileged spec class.
> (RISCV_GET_PRIV_SPEC_NAME): Added to get privileged spec name.
> * cpu-riscv.c (struct priv_spec_t): Replaced with struct riscv_spec.
> (riscv_get_priv_spec_class): Replaced with RISCV_GET_PRIV_SPEC_CLASS.
> (riscv_get_priv_spec_name): Replaced with RISCV_GET_PRIV_SPEC_NAME.
> (riscv_priv_specs): Moved below.
> (riscv_get_priv_spec_class_from_numbers): Likewise, updated.
> (riscv_isa_specs): Moved from include/opcode/riscv.h.
> * elfnn-riscv.c: Included cpu-riscv.h.
> (riscv_merge_attributes): Initialize in_priv_spec and out_priv_spec.
> * elfxx-riscv.c: Included cpu-riscv.h and opcode/riscv.h.
> (RISCV_UNKNOWN_VERSION): Moved from include/opcode/riscv.h.
> * elfxx-riscv.h: Removed extern functions to cpu-riscv.h.
> gas/
> * config/tc-riscv.c: Included cpu-riscv.h.
> (enum riscv_csr_clas): Moved from include/opcode/riscv.h.
> (struct riscv_csr_extra): Likewise.
> (struct riscv_ext_version): Likewise.
> (ext_version_table): Moved from opcodes/riscv-opc.c.
> (default_isa_spec): Updated type to riscv_spec_class.
> (default_priv_spec): Likewise.
> (riscv_set_default_isa_spec): Updated.
> (init_ext_version_hash): Likewise.
> (riscv_init_csr_hash): Likewise, also fixed indent.
> include/
> * opcode/riscv.h: Moved stuff and make the file tidy.
> opcodes/
> * riscv-dis.c: Included cpu-riscv.h, and removed elfxx-riscv.h.
> (default_priv_spec): Updated type to riscv_spec_class.
> (parse_riscv_dis_option): Updated.
> * riscv-opc.c: Moved stuff and make the file tidy.
> ---
> bfd/Makefile.am | 2 +-
> bfd/Makefile.in | 3 +-
> bfd/cpu-riscv.c | 123 ++++++++++++++----------------------------
> bfd/cpu-riscv.h | 81 ++++++++++++++++++++++++++++
> bfd/doc/Makefile.in | 1 +
> bfd/elfnn-riscv.c | 5 +-
> bfd/elfxx-riscv.c | 5 +-
> bfd/elfxx-riscv.h | 12 -----
> bfd/po/SRC-POTFILES.in | 1 +
> gas/config/tc-riscv.c | 141 ++++++++++++++++++++++++++++++++++++++++---------
> include/opcode/riscv.h | 69 ------------------------
> opcodes/riscv-dis.c | 21 +++++---
> opcodes/riscv-opc.c | 91 -------------------------------
> 13 files changed, 262 insertions(+), 293 deletions(-)
> create mode 100644 bfd/cpu-riscv.h
>
> diff --git a/bfd/Makefile.am b/bfd/Makefile.am
> index 9908249..3f143dc 100644
> --- a/bfd/Makefile.am
> +++ b/bfd/Makefile.am
> @@ -675,7 +675,7 @@ CFILES = $(SOURCE_CFILES) $(BUILD_CFILES)
> SOURCE_HFILES = \
> aout-target.h aoutx.h arc-got.h arc-plt.h \
> coff-arm.h coff-bfd.h coffcode.h coffswap.h \
> - cpu-aarch64.h cpu-arm.h cpu-h8300.h cpu-m68k.h \
> + cpu-aarch64.h cpu-arm.h cpu-h8300.h cpu-m68k.h cpu-riscv.h \
> ecoff-bfd.h ecoffswap.h \
> elf32-arm.h elf32-avr.h elf32-bfin.h elf32-cr16.h elf32-csky.h \
> elf32-dlx.h elf32-hppa.h elf32-m68hc1x.h elf32-m68k.h \
> diff --git a/bfd/Makefile.in b/bfd/Makefile.in
> index a5d1f8e..3c98317 100644
> --- a/bfd/Makefile.in
> +++ b/bfd/Makefile.in
> @@ -440,6 +440,7 @@ pdfdir = @pdfdir@
> prefix = @prefix@
> program_transform_name = @program_transform_name@
> psdir = @psdir@
> +runstatedir = @runstatedir@
> sbindir = @sbindir@
> sharedstatedir = @sharedstatedir@
> srcdir = @srcdir@
> @@ -1099,7 +1100,7 @@ CFILES = $(SOURCE_CFILES) $(BUILD_CFILES)
> SOURCE_HFILES = \
> aout-target.h aoutx.h arc-got.h arc-plt.h \
> coff-arm.h coff-bfd.h coffcode.h coffswap.h \
> - cpu-aarch64.h cpu-arm.h cpu-h8300.h cpu-m68k.h \
> + cpu-aarch64.h cpu-arm.h cpu-h8300.h cpu-m68k.h cpu-riscv.h \
> ecoff-bfd.h ecoffswap.h \
> elf32-arm.h elf32-avr.h elf32-bfin.h elf32-cr16.h elf32-csky.h \
> elf32-dlx.h elf32-hppa.h elf32-m68hc1x.h elf32-m68k.h \
> diff --git a/bfd/cpu-riscv.c b/bfd/cpu-riscv.c
> index eec61b4..ce87ccf 100644
> --- a/bfd/cpu-riscv.c
> +++ b/bfd/cpu-riscv.c
> @@ -23,89 +23,7 @@
> #include "sysdep.h"
> #include "bfd.h"
> #include "libbfd.h"
> -#include "elfxx-riscv.h"
> -
> -/* Record the priv spec version string and the corresponding class. */
> -
> -struct priv_spec_t
> -{
> - const char *name;
> - enum riscv_priv_spec_class class;
> -};
> -
> -/* List for all supported privilege versions. */
> -
> -static const struct priv_spec_t priv_specs[] =
> -{
> - {"1.9.1", PRIV_SPEC_CLASS_1P9P1},
> - {"1.10", PRIV_SPEC_CLASS_1P10},
> - {"1.11", PRIV_SPEC_CLASS_1P11},
> -
> -/* Terminate the list. */
> - {NULL, 0}
> -};
> -
> -/* Get the corresponding CSR version class by giving a privilege
> - version string. */
> -
> -int
> -riscv_get_priv_spec_class (const char *s,
> - enum riscv_priv_spec_class *class)
> -{
> - const struct priv_spec_t *version;
> -
> - if (s == NULL)
> - return 0;
> -
> - for (version = &priv_specs[0]; version->name != NULL; ++version)
> - if (strcmp (version->name, s) == 0)
> - {
> - *class = version->class;
> - return 1;
> - }
> -
> - /* Can not find the supported privilege version. */
> - return 0;
> -}
> -
> -/* Get the corresponding CSR version class by giving privilege
> - version numbers. It is usually used to convert the priv
> - attribute numbers into the corresponding class. */
> -
> -int
> -riscv_get_priv_spec_class_from_numbers (unsigned int major,
> - unsigned int minor,
> - unsigned int revision,
> - enum riscv_priv_spec_class *class)
> -{
> - char buf[36];
> -
> - if (major == 0 && minor == 0 && revision == 0)
> - {
> - *class = PRIV_SPEC_CLASS_NONE;
> - return 1;
> - }
> -
> - if (revision != 0)
> - snprintf (buf, sizeof (buf), "%u.%u.%u", major, minor, revision);
> - else
> - snprintf (buf, sizeof (buf), "%u.%u", major, minor);
> -
> - return riscv_get_priv_spec_class (buf, class);
> -}
> -
> -/* Get the corresponding privilege version string by giving a CSR
> - version class. */
> -
> -const char *
> -riscv_get_priv_spec_name (enum riscv_priv_spec_class class)
> -{
> - /* The first enum is PRIV_SPEC_CLASS_NONE. */
> - return priv_specs[class - 1].name;
> -}
> -
> -/* This routine is provided two arch_infos and returns an arch_info
> - that is compatible with both, or NULL if none exists. */
> +#include "cpu-riscv.h"
>
> static const bfd_arch_info_type *
> riscv_compatible (const bfd_arch_info_type *a, const bfd_arch_info_type *b)
> @@ -182,6 +100,43 @@ static const bfd_arch_info_type arch_info_struct[] =
> };
>
> /* The default architecture is riscv:rv64. */
> -
> const bfd_arch_info_type bfd_riscv_arch =
> N (64, 0, "riscv", TRUE, &arch_info_struct[0]);
> +
> +/* List for all supported ISA spec versions. */
> +const struct riscv_spec riscv_isa_specs[] =
> +{
> + {"2.2", ISA_SPEC_CLASS_2P2},
> + {"20190608", ISA_SPEC_CLASS_20190608},
> + {"20191213", ISA_SPEC_CLASS_20191213},
> +};
> +
> +/* List for all supported privileged spec versions. */
> +const struct riscv_spec riscv_priv_specs[] =
> +{
> + {"1.9.1", PRIV_SPEC_CLASS_1P9P1},
> + {"1.10", PRIV_SPEC_CLASS_1P10},
> + {"1.11", PRIV_SPEC_CLASS_1P11},
> +};
> +
> +/* Get the corresponding CSR version class by giving privilege
> + version numbers. It is usually used to convert the priv
> + attribute numbers into the corresponding class. */
> +
> +void
> +riscv_get_priv_spec_class_from_numbers (unsigned int major,
> + unsigned int minor,
> + unsigned int revision,
> + enum riscv_spec_class *class)
> +{
> + enum riscv_spec_class class_t = *class;
> + char buf[36];
> +
> + if (revision != 0)
> + snprintf (buf, sizeof (buf), "%u.%u.%u", major, minor, revision);
> + else
> + snprintf (buf, sizeof (buf), "%u.%u", major, minor);
> +
> + RISCV_GET_PRIV_SPEC_CLASS (buf, class_t);
> + *class = class_t;
> +}
> diff --git a/bfd/cpu-riscv.h b/bfd/cpu-riscv.h
> new file mode 100644
> index 0000000..aff0fcf
> --- /dev/null
> +++ b/bfd/cpu-riscv.h
> @@ -0,0 +1,81 @@
> +/* RISC-V spec version controling support.
> + Copyright (C) 2019-2020 Free Software Foundation, Inc.
> +
> + This file is part of BFD, the Binary File Descriptor library.
> +
> + This program is free software; you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> + the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + This program is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + GNU General Public License for more details.
> +
> + You should have received a copy of the GNU General Public License
> + along with this program; if not, write to the Free Software
> + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
> + MA 02110-1301, USA. */
> +
> +enum riscv_spec_class
> +{
> + /* ISA spec. */
> + ISA_SPEC_CLASS_NONE = 0,
> + ISA_SPEC_CLASS_2P2,
> + ISA_SPEC_CLASS_20190608,
> + ISA_SPEC_CLASS_20191213,
> + ISA_SPEC_CLASS_DRAFT,
> +
> + /* Privileged spec. */
> + PRIV_SPEC_CLASS_NONE,
> + PRIV_SPEC_CLASS_1P9P1,
> + PRIV_SPEC_CLASS_1P10,
> + PRIV_SPEC_CLASS_1P11,
> + PRIV_SPEC_CLASS_DRAFT,
> +};
> +
> +struct riscv_spec
> +{
> + const char *name;
> + enum riscv_spec_class spec_class;
> +};
> +
> +extern const struct riscv_spec riscv_isa_specs[];
> +extern const struct riscv_spec riscv_priv_specs[];
> +
> +#define RISCV_GET_SPEC_CLASS(UTYPE, LTYPE, NAME, CLASS) \
> + do \
> + { \
> + if (NAME == NULL) \
> + break; \
> + \
> + int i_spec = UTYPE##_SPEC_CLASS_NONE + 1; \
> + for (; i_spec < UTYPE##_SPEC_CLASS_DRAFT; i_spec++) \
> + { \
> + int j_spec = i_spec - UTYPE##_SPEC_CLASS_NONE -1; \
> + if (riscv_##LTYPE##_specs[j_spec].name \
> + && strcmp (riscv_##LTYPE##_specs[j_spec].name, NAME) == 0)\
> + { \
> + CLASS = riscv_##LTYPE##_specs[j_spec].spec_class; \
> + break; \
> + } \
> + } \
> + } \
> + while (0)
> +
> +#define RISCV_GET_SPEC_NAME(UTYPE, LTYPE, NAME, CLASS) \
> + (NAME) = riscv_##LTYPE##_specs[(CLASS) - UTYPE##_SPEC_CLASS_NONE - 1].name
> +
> +#define RISCV_GET_ISA_SPEC_CLASS(NAME, CLASS) \
> + RISCV_GET_SPEC_CLASS(ISA, isa, NAME, CLASS)
> +#define RISCV_GET_PRIV_SPEC_CLASS(NAME, CLASS) \
> + RISCV_GET_SPEC_CLASS(PRIV, priv, NAME, CLASS)
> +#define RISCV_GET_PRIV_SPEC_NAME(NAME, CLASS) \
> + RISCV_GET_SPEC_NAME(PRIV, priv, NAME, CLASS)
> +
> +extern void
> +riscv_get_priv_spec_class_from_numbers (unsigned int,
> + unsigned int,
> + unsigned int,
> + enum riscv_spec_class *);
> diff --git a/bfd/doc/Makefile.in b/bfd/doc/Makefile.in
> index 1902697..129cadc 100644
> --- a/bfd/doc/Makefile.in
> +++ b/bfd/doc/Makefile.in
> @@ -377,6 +377,7 @@ pdfdir = @pdfdir@
> prefix = @prefix@
> program_transform_name = @program_transform_name@
> psdir = @psdir@
> +runstatedir = @runstatedir@
> sbindir = @sbindir@
> sharedstatedir = @sharedstatedir@
> srcdir = @srcdir@
> diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
> index d7ffb8f..9152f93 100644
> --- a/bfd/elfnn-riscv.c
> +++ b/bfd/elfnn-riscv.c
> @@ -32,6 +32,7 @@
> #include "elf/riscv.h"
> #include "opcode/riscv.h"
> #include "objalloc.h"
> +#include "cpu-riscv.h"
>
> #ifdef HAVE_LIMITS_H
> #include <limits.h>
> @@ -3679,8 +3680,8 @@ riscv_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
> unsigned int Tag_a = Tag_RISCV_priv_spec;
> unsigned int Tag_b = Tag_RISCV_priv_spec_minor;
> unsigned int Tag_c = Tag_RISCV_priv_spec_revision;
> - enum riscv_priv_spec_class in_priv_spec;
> - enum riscv_priv_spec_class out_priv_spec;
> + enum riscv_spec_class in_priv_spec = PRIV_SPEC_CLASS_NONE;
> + enum riscv_spec_class out_priv_spec = PRIV_SPEC_CLASS_NONE;
>
> /* Get the privileged spec class from elf attributes. */
> riscv_get_priv_spec_class_from_numbers (in_attr[Tag_a].i,
> diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
> index 152e382..25ac679 100644
> --- a/bfd/elfxx-riscv.c
> +++ b/bfd/elfxx-riscv.c
> @@ -25,9 +25,11 @@
> #include "libbfd.h"
> #include "elf-bfd.h"
> #include "elf/riscv.h"
> +#include "opcode/riscv.h"
> #include "libiberty.h"
> #include "elfxx-riscv.h"
> #include "safe-ctype.h"
> +#include "cpu-riscv.h"
>
> #define MINUS_ONE ((bfd_vma)0 - 1)
>
> @@ -1024,12 +1026,13 @@ riscv_elf_add_sub_reloc (bfd *abfd,
> return bfd_reloc_ok;
> }
>
> +#define RISCV_UNKNOWN_VERSION -1
> +
> /* Array is used to compare the orders of all extensions quickly.
>
> Zero value: Preserved keyword.
> Negative value: Prefixed keyword (s, h, x, z).
> Positive value: Standard extension. */
> -
> static int riscv_ext_order[26] = {0};
>
> /* Similar to the strcmp. It returns an integer less than, equal to,
> diff --git a/bfd/elfxx-riscv.h b/bfd/elfxx-riscv.h
> index 87ebaf4..a7d348c 100644
> --- a/bfd/elfxx-riscv.h
> +++ b/bfd/elfxx-riscv.h
> @@ -104,16 +104,4 @@ riscv_isa_ext_class_t
> riscv_get_prefix_class (const char *);
>
> extern int
> -riscv_get_priv_spec_class (const char *, enum riscv_priv_spec_class *);
> -
> -extern int
> -riscv_get_priv_spec_class_from_numbers (unsigned int,
> - unsigned int,
> - unsigned int,
> - enum riscv_priv_spec_class *);
> -
> -extern const char *
> -riscv_get_priv_spec_name (enum riscv_priv_spec_class);
> -
> -extern int
> riscv_compare_subsets (const char *, const char *);
> diff --git a/bfd/po/SRC-POTFILES.in b/bfd/po/SRC-POTFILES.in
> index 83530b2..c83b86c 100644
> --- a/bfd/po/SRC-POTFILES.in
> +++ b/bfd/po/SRC-POTFILES.in
> @@ -101,6 +101,7 @@ cpu-pj.c
> cpu-powerpc.c
> cpu-pru.c
> cpu-riscv.c
> +cpu-riscv.h
> cpu-rl78.c
> cpu-rs6000.c
> cpu-rx.c
> diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
> index db8520a..978cd74 100644
> --- a/gas/config/tc-riscv.c
> +++ b/gas/config/tc-riscv.c
> @@ -29,6 +29,7 @@
> #include "dwarf2dbg.h"
> #include "dw2gencfi.h"
>
> +#include "bfd/cpu-riscv.h"
> #include "bfd/elfxx-riscv.h"
> #include "elf/riscv.h"
> #include "opcode/riscv.h"
> @@ -55,6 +56,97 @@ struct riscv_cl_insn
> fixS *fixp;
> };
>
> +/* All RISC-V CSR belong to one of these classes. */
> +enum riscv_csr_class
> +{
> + CSR_CLASS_NONE,
> +
> + CSR_CLASS_I,
> + CSR_CLASS_I_32, /* rv32 only */
> + CSR_CLASS_F, /* f-ext only */
> + CSR_CLASS_DEBUG /* debug CSR */
> +};
> +
> +/* This structure holds all restricted conditions for a CSR. */
> +struct riscv_csr_extra
> +{
> + /* Class to which this CSR belongs. Used to decide whether or
> + not this CSR is legal in the current -march context. */
> + enum riscv_csr_class csr_class;
> +
> + /* CSR may have differnet numbers in the previous priv spec. */
> + unsigned address;
> +
> + /* Record the CSR is defined/valid in which versions. */
> + enum riscv_spec_class define_version;
> +
> + /* Record the CSR is aborted/invalid from which versions. If it isn't
> + aborted in the current version, then it should be CSR_CLASS_VDRAFT. */
> + enum riscv_spec_class abort_version;
> +
> + /* The CSR may have more than one setting. */
> + 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},
> +
> + {"zba", ISA_SPEC_CLASS_DRAFT, 0, 93},
> + {"zbb", 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
> @@ -79,8 +171,8 @@ struct riscv_cl_insn
>
> static const char default_arch[] = DEFAULT_ARCH;
> static const char *default_arch_with_ext = DEFAULT_RISCV_ARCH_WITH_EXT;
> -static enum riscv_isa_spec_class default_isa_spec = ISA_SPEC_CLASS_NONE;
> -static enum riscv_priv_spec_class default_priv_spec = PRIV_SPEC_CLASS_NONE;
> +static enum riscv_spec_class default_isa_spec = ISA_SPEC_CLASS_NONE;
> +static enum riscv_spec_class default_priv_spec = PRIV_SPEC_CLASS_NONE;
>
> static unsigned xlen = 0; /* The width of an x-register. */
> static unsigned abi_xlen = 0; /* The width of a pointer in the ABI. */
> @@ -106,8 +198,9 @@ static unsigned elf_flags = 0;
> static int
> riscv_set_default_isa_spec (const char *s)
> {
> - enum riscv_isa_spec_class class;
> - if (!riscv_get_isa_spec_class (s, &class))
> + enum riscv_spec_class class = ISA_SPEC_CLASS_NONE;
> + RISCV_GET_ISA_SPEC_CLASS (s, class);
> + if (class == ISA_SPEC_CLASS_NONE)
> {
> as_bad ("unknown default ISA spec `%s' set by "
> "-misa-spec or --with-isa-spec", s);
> @@ -125,11 +218,12 @@ riscv_set_default_isa_spec (const char *s)
> static int
> riscv_set_default_priv_spec (const char *s)
> {
> - enum riscv_priv_spec_class class;
> + enum riscv_spec_class class = PRIV_SPEC_CLASS_NONE;
> unsigned major, minor, revision;
> obj_attribute *attr;
>
> - if (riscv_get_priv_spec_class (s, &class))
> + RISCV_GET_PRIV_SPEC_CLASS (s, class);
> + if (class != PRIV_SPEC_CLASS_NONE)
> {
> default_priv_spec = class;
> return 1;
> @@ -147,15 +241,13 @@ riscv_set_default_priv_spec (const char *s)
> major = (unsigned) attr[Tag_RISCV_priv_spec].i;
> minor = (unsigned) attr[Tag_RISCV_priv_spec_minor].i;
> revision = (unsigned) attr[Tag_RISCV_priv_spec_revision].i;
> - if (riscv_get_priv_spec_class_from_numbers (major,
> - minor,
> - revision,
> - &class))
> - {
> - /* 0.0.0 is meaningless. */
> - if (class == PRIV_SPEC_CLASS_NONE)
> - return 1;
> + /* Version 0.0.0 is the default value and meaningless. */
> + if (major == 0 && minor == 0 && revision == 0)
> + return 1;
>
> + riscv_get_priv_spec_class_from_numbers (major, minor, revision, &class);
> + if (class != PRIV_SPEC_CLASS_NONE)
> + {
> default_priv_spec = class;
> return 1;
> }
> @@ -262,10 +354,11 @@ riscv_multi_subset_supports (enum riscv_insn_class insn_class)
> static htab_t ext_version_hash = NULL;
>
> static htab_t
> -init_ext_version_hash (const struct riscv_ext_version *table)
> +init_ext_version_hash (void)
> {
> - int i = 0;
> + const struct riscv_ext_version *table = ext_version_table;
> htab_t hash = str_htab_create ();
> + int i = 0;
>
> while (table[i].name)
> {
> @@ -697,10 +790,10 @@ hash_reg_names (enum reg_class class, const char * const names[], unsigned n)
>
> static void
> riscv_init_csr_hash (const char *name,
> - unsigned address,
> - enum riscv_csr_class class,
> - enum riscv_priv_spec_class define_version,
> - enum riscv_priv_spec_class abort_version)
> + unsigned address,
> + enum riscv_csr_class class,
> + enum riscv_spec_class define_version,
> + enum riscv_spec_class abort_version)
> {
> struct riscv_csr_extra *entry, *pre_entry;
> bfd_boolean need_enrty = TRUE;
> @@ -792,8 +885,8 @@ riscv_csr_address (const char *csr_name,
> so use the newly defined value. */
> if (riscv_opts.csr_check)
> {
> - const char *priv_name = riscv_get_priv_spec_name (default_priv_spec);
> -
> + const char *priv_name = NULL;
> + RISCV_GET_PRIV_SPEC_NAME (priv_name, default_priv_spec);
> if (priv_name != NULL)
> as_warn (_("invalid CSR `%s' for the privileged spec `%s'"),
> csr_name, priv_name);
> @@ -2825,7 +2918,7 @@ riscv_after_parse_args (void)
> default_arch_with_ext = xlen == 64 ? "rv64g" : "rv32g";
>
> /* Initialize the hash table for extensions with default version. */
> - ext_version_hash = init_ext_version_hash (riscv_ext_version_table);
> + ext_version_hash = init_ext_version_hash ();
>
> /* Set default specs. */
> if (default_isa_spec == ISA_SPEC_CLASS_NONE)
> @@ -3661,7 +3754,7 @@ riscv_write_out_attrs (void)
> if (!explicit_priv_attr)
> return;
>
> - priv_str = riscv_get_priv_spec_name (default_priv_spec);
> + RISCV_GET_PRIV_SPEC_NAME (priv_str, default_priv_spec);
> p = priv_str;
> for (i = 0; *p; ++p)
> {
> diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h
> index 04d23a7..08aa5dc 100644
> --- a/include/opcode/riscv.h
> +++ b/include/opcode/riscv.h
> @@ -362,71 +362,6 @@ struct riscv_opcode
> unsigned long pinfo;
> };
>
> -/* The current supported ISA spec versions. */
> -enum riscv_isa_spec_class
> -{
> - ISA_SPEC_CLASS_NONE,
> -
> - ISA_SPEC_CLASS_2P2,
> - ISA_SPEC_CLASS_20190608,
> - ISA_SPEC_CLASS_20191213,
> - ISA_SPEC_CLASS_DRAFT
> -};
> -
> -#define RISCV_UNKNOWN_VERSION -1
> -
> -/* This structure holds version information for specific ISA. */
> -struct riscv_ext_version
> -{
> - const char *name;
> - enum riscv_isa_spec_class isa_spec_class;
> - int major_version;
> - int minor_version;
> -};
> -
> -/* All RISC-V CSR belong to one of these classes. */
> -enum riscv_csr_class
> -{
> - CSR_CLASS_NONE,
> -
> - CSR_CLASS_I,
> - CSR_CLASS_I_32, /* RV32 only. */
> - CSR_CLASS_F, /* F extension only. */
> - CSR_CLASS_DEBUG /* Debug CSR. */
> -};
> -
> -/* The current supported privilege spec versions. */
> -enum riscv_priv_spec_class
> -{
> - PRIV_SPEC_CLASS_NONE,
> -
> - PRIV_SPEC_CLASS_1P9P1,
> - PRIV_SPEC_CLASS_1P10,
> - PRIV_SPEC_CLASS_1P11,
> - PRIV_SPEC_CLASS_DRAFT
> -};
> -
> -/* This structure holds all restricted conditions for a CSR. */
> -struct riscv_csr_extra
> -{
> - /* Class to which this CSR belongs. Used to decide whether or
> - not this CSR is legal in the current -march context. */
> - enum riscv_csr_class csr_class;
> -
> - /* CSR may have differnet numbers in the previous priv spec. */
> - unsigned address;
> -
> - /* Record the CSR is defined/valid in which versions. */
> - enum riscv_priv_spec_class define_version;
> -
> - /* Record the CSR is aborted/invalid from which versions. If it isn't
> - aborted in the current version, then it should be CSR_CLASS_VDRAFT. */
> - enum riscv_priv_spec_class abort_version;
> -
> - /* The CSR may have more than one setting. */
> - struct riscv_csr_extra *next;
> -};
> -
> /* Instruction is a simple alias (e.g. "mv" for "addi"). */
> #define INSN_ALIAS 0x00000001
>
> @@ -501,9 +436,5 @@ extern const char * const riscv_fpr_names_abi[NFPR];
>
> extern const struct riscv_opcode riscv_opcodes[];
> extern const struct riscv_opcode riscv_insn_types[];
> -extern const struct riscv_ext_version riscv_ext_version_table[];
> -
> -extern int
> -riscv_get_isa_spec_class (const char *, enum riscv_isa_spec_class *);
>
> #endif /* _RISCV_H_ */
> diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c
> index a6a78ba..cc80d90 100644
> --- a/opcodes/riscv-dis.c
> +++ b/opcodes/riscv-dis.c
> @@ -27,12 +27,12 @@
> #include "opintl.h"
> #include "elf-bfd.h"
> #include "elf/riscv.h"
> -#include "elfxx-riscv.h"
> +#include "cpu-riscv.h"
>
> #include "bfd_stdint.h"
> #include <ctype.h>
>
> -static enum riscv_priv_spec_class default_priv_spec = PRIV_SPEC_CLASS_NONE;
> +static enum riscv_spec_class default_priv_spec = PRIV_SPEC_CLASS_NONE;
>
> struct riscv_private_data
> {
> @@ -99,17 +99,22 @@ parse_riscv_dis_option (const char *option)
> value = equal + 1;
> if (strcmp (option, "priv-spec") == 0)
> {
> - enum riscv_priv_spec_class priv_spec = PRIV_SPEC_CLASS_NONE;
> - if (!riscv_get_priv_spec_class (value, &priv_spec))
> + enum riscv_spec_class priv_spec = PRIV_SPEC_CLASS_NONE;
> + const char *name = NULL;
> +
> + RISCV_GET_PRIV_SPEC_CLASS (value, priv_spec);
> + if (priv_spec == PRIV_SPEC_CLASS_NONE)
> opcodes_error_handler (_("unknown privileged spec set by %s=%s"),
> option, value);
> else if (default_priv_spec == PRIV_SPEC_CLASS_NONE)
> default_priv_spec = priv_spec;
> else if (default_priv_spec != priv_spec)
> - opcodes_error_handler (_("mis-matched privilege spec set by %s=%s, "
> - "the elf privilege attribute is %s"),
> - option, value,
> - riscv_get_priv_spec_name (default_priv_spec));
> + {
> + RISCV_GET_PRIV_SPEC_NAME (name, default_priv_spec);
> + opcodes_error_handler (_("mis-matched privilege spec set by %s=%s, "
> + "the elf privilege attribute is %s"),
> + option, value, name);
> + }
> }
> else
> {
> diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c
> index 9e73e75..3b4523b 100644
> --- a/opcodes/riscv-opc.c
> +++ b/opcodes/riscv-opc.c
> @@ -941,94 +941,3 @@ const struct riscv_opcode riscv_insn_types[] =
> /* Terminate the list. */
> {0, 0, INSN_CLASS_NONE, 0, 0, 0, 0, 0}
> };
> -
> -/* All standard extensions defined in all supported ISA spec. */
> -const struct riscv_ext_version riscv_ext_version_table[] =
> -{
> -/* name, ISA spec, major version, minor version. */
> -{"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},
> -
> -{"zba", ISA_SPEC_CLASS_DRAFT, 0, 93},
> -{"zbb", ISA_SPEC_CLASS_DRAFT, 0, 93},
> -{"zbc", ISA_SPEC_CLASS_DRAFT, 0, 93},
> -
> -/* Terminate the list. */
> -{NULL, 0, 0, 0}
> -};
> -
> -struct isa_spec_t
> -{
> - const char *name;
> - enum riscv_isa_spec_class class;
> -};
> -
> -/* List for all supported ISA spec versions. */
> -static const struct isa_spec_t isa_specs[] =
> -{
> - {"2.2", ISA_SPEC_CLASS_2P2},
> - {"20190608", ISA_SPEC_CLASS_20190608},
> - {"20191213", ISA_SPEC_CLASS_20191213},
> -
> - /* Terminate the list. */
> - {NULL, 0}
> -};
> -
> -/* Get the corresponding ISA spec class by giving a ISA spec string. */
> -
> -int
> -riscv_get_isa_spec_class (const char *s,
> - enum riscv_isa_spec_class *class)
> -{
> - const struct isa_spec_t *version;
> -
> - if (s == NULL)
> - return 0;
> -
> - for (version = &isa_specs[0]; version->name != NULL; ++version)
> - if (strcmp (version->name, s) == 0)
> - {
> - *class = version->class;
> - return 1;
> - }
> -
> - /* Can not find the supported ISA spec. */
> - return 0;
> -}
> --
> 2.7.4
>
More information about the Binutils
mailing list