1/* RISC-V ELF specific backend routines. 2 Copyright (C) 2011-2020 Free Software Foundation, Inc. 3 4 Contributed by Andrew Waterman (andrew@sifive.com). 5 Based on MIPS target. 6 7 This file is part of BFD, the Binary File Descriptor library. 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 3 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program; see the file COPYING3. If not, 21 see <http://www.gnu.org/licenses/>. */ 22 23#include "elf/common.h" 24#include "elf/internal.h" 25#include "opcode/riscv.h" 26 27extern reloc_howto_type * 28riscv_reloc_name_lookup (bfd *, const char *); 29 30extern reloc_howto_type * 31riscv_reloc_type_lookup (bfd *, bfd_reloc_code_real_type); 32 33extern reloc_howto_type * 34riscv_elf_rtype_to_howto (bfd *, unsigned int r_type); 35 36#define RISCV_DONT_CARE_VERSION -1 37 38/* The information of architecture attribute. */ 39struct riscv_subset_t 40{ 41 const char *name; 42 int major_version; 43 int minor_version; 44 struct riscv_subset_t *next; 45}; 46 47typedef struct riscv_subset_t riscv_subset_t; 48 49typedef struct { 50 riscv_subset_t *head; 51 riscv_subset_t *tail; 52} riscv_subset_list_t; 53 54extern void 55riscv_release_subset_list (riscv_subset_list_t *); 56 57extern void 58riscv_add_subset (riscv_subset_list_t *, 59 const char *, 60 int, int); 61 62extern riscv_subset_t * 63riscv_lookup_subset (const riscv_subset_list_t *, 64 const char *); 65 66extern riscv_subset_t * 67riscv_lookup_subset_version (const riscv_subset_list_t *, 68 const char *, 69 int, int); 70 71typedef struct { 72 riscv_subset_list_t *subset_list; 73 void (*error_handler) (const char *, 74 ...) ATTRIBUTE_PRINTF_1; 75 unsigned *xlen; 76 void (*get_default_version) (const char *, 77 unsigned int *, 78 unsigned int *); 79} riscv_parse_subset_t; 80 81extern bfd_boolean 82riscv_parse_subset (riscv_parse_subset_t *, 83 const char *); 84 85extern const char * 86riscv_supported_std_ext (void); 87 88extern void 89riscv_release_subset_list (riscv_subset_list_t *); 90 91extern char * 92riscv_arch_str (unsigned, const riscv_subset_list_t *); 93 94extern size_t 95riscv_estimate_digit (unsigned); 96 97/* ISA extension name class. E.g. "zbb" corresponds to RV_ISA_CLASS_Z, 98 "xargs" corresponds to RV_ISA_CLASS_X, etc. Order is important 99 here. */ 100 101typedef enum riscv_isa_ext_class 102 { 103 RV_ISA_CLASS_S, 104 RV_ISA_CLASS_Z, 105 RV_ISA_CLASS_X, 106 RV_ISA_CLASS_UNKNOWN 107 } riscv_isa_ext_class_t; 108 109/* Classify the argument 'ext' into one of riscv_isa_ext_class_t. */ 110 111riscv_isa_ext_class_t 112riscv_get_prefix_class (const char *); 113 114extern int 115riscv_get_priv_spec_class (const char *, enum riscv_priv_spec_class *); 116 117extern int 118riscv_get_priv_spec_class_from_numbers (unsigned int, 119 unsigned int, 120 unsigned int, 121 enum riscv_priv_spec_class *); 122 123extern const char * 124riscv_get_priv_spec_name (enum riscv_priv_spec_class); 125