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 27 extern reloc_howto_type * 28 riscv_reloc_name_lookup (bfd *, const char *); 29 30 extern reloc_howto_type * 31 riscv_reloc_type_lookup (bfd *, bfd_reloc_code_real_type); 32 33 extern reloc_howto_type * 34 riscv_elf_rtype_to_howto (bfd *, unsigned int r_type); 35 36 #define RISCV_DONT_CARE_VERSION -1 37 38 /* The information of architecture attribute. */ 39 struct riscv_subset_t 40 { 41 const char *name; 42 int major_version; 43 int minor_version; 44 struct riscv_subset_t *next; 45 }; 46 47 typedef struct riscv_subset_t riscv_subset_t; 48 49 typedef struct { 50 riscv_subset_t *head; 51 riscv_subset_t *tail; 52 } riscv_subset_list_t; 53 54 extern void 55 riscv_release_subset_list (riscv_subset_list_t *); 56 57 extern void 58 riscv_add_subset (riscv_subset_list_t *, 59 const char *, 60 int, int); 61 62 extern riscv_subset_t * 63 riscv_lookup_subset (const riscv_subset_list_t *, 64 const char *); 65 66 extern riscv_subset_t * 67 riscv_lookup_subset_version (const riscv_subset_list_t *, 68 const char *, 69 int, int); 70 71 typedef 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 81 extern bfd_boolean 82 riscv_parse_subset (riscv_parse_subset_t *, 83 const char *); 84 85 extern const char * 86 riscv_supported_std_ext (void); 87 88 extern void 89 riscv_release_subset_list (riscv_subset_list_t *); 90 91 extern char * 92 riscv_arch_str (unsigned, const riscv_subset_list_t *); 93 94 extern size_t 95 riscv_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 101 typedef 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 111 riscv_isa_ext_class_t 112 riscv_get_prefix_class (const char *); 113 114 extern int 115 riscv_get_priv_spec_class (const char *, enum riscv_priv_spec_class *); 116 117 extern int 118 riscv_get_priv_spec_class_from_numbers (unsigned int, 119 unsigned int, 120 unsigned int, 121 enum riscv_priv_spec_class *); 122 123 extern const char * 124 riscv_get_priv_spec_name (enum riscv_priv_spec_class); 125