/* RISC-V spec version controlling 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 *); extern bool riscv_elf_is_mapping_symbols (const char *);