1 /* RISC-V ELF specific backend routines. 2 Copyright (C) 2011-2022 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 #include "cpu-riscv.h" 27 28 #define RISCV_UNKNOWN_VERSION -1 29 30 extern reloc_howto_type * 31 riscv_reloc_name_lookup (bfd *, const char *); 32 33 extern reloc_howto_type * 34 riscv_reloc_type_lookup (bfd *, bfd_reloc_code_real_type); 35 36 extern reloc_howto_type * 37 riscv_elf_rtype_to_howto (bfd *, unsigned int r_type); 38 39 /* The information of architecture attribute. */ 40 struct riscv_subset_t 41 { 42 const char *name; 43 int major_version; 44 int minor_version; 45 struct riscv_subset_t *next; 46 }; 47 48 typedef struct riscv_subset_t riscv_subset_t; 49 50 typedef struct 51 { 52 riscv_subset_t *head; 53 riscv_subset_t *tail; 54 } riscv_subset_list_t; 55 56 extern void 57 riscv_release_subset_list (riscv_subset_list_t *); 58 59 extern void 60 riscv_add_subset (riscv_subset_list_t *, 61 const char *, 62 int, int); 63 64 extern bool 65 riscv_lookup_subset (const riscv_subset_list_t *, 66 const char *, 67 riscv_subset_t **); 68 69 typedef struct 70 { 71 riscv_subset_list_t *subset_list; 72 void (*error_handler) (const char *, 73 ...) ATTRIBUTE_PRINTF_1; 74 unsigned *xlen; 75 enum riscv_spec_class *isa_spec; 76 bool check_unknown_prefixed_ext; 77 } riscv_parse_subset_t; 78 79 extern bool 80 riscv_parse_subset (riscv_parse_subset_t *, 81 const char *); 82 83 extern void 84 riscv_release_subset_list (riscv_subset_list_t *); 85 86 extern char * 87 riscv_arch_str (unsigned, const riscv_subset_list_t *); 88 89 extern size_t 90 riscv_estimate_digit (unsigned); 91 92 extern int 93 riscv_compare_subsets (const char *, const char *); 94 95 extern riscv_subset_list_t * 96 riscv_copy_subset_list (riscv_subset_list_t *); 97 98 extern bool 99 riscv_update_subset (riscv_parse_subset_t *, const char *); 100 101 extern bool 102 riscv_subset_supports (riscv_parse_subset_t *, const char *); 103 104 extern bool 105 riscv_multi_subset_supports (riscv_parse_subset_t *, enum riscv_insn_class); 106 107 extern const char * 108 riscv_multi_subset_supports_ext (riscv_parse_subset_t *, enum riscv_insn_class); 109 110 extern void 111 bfd_elf32_riscv_set_data_segment_info (struct bfd_link_info *, int *); 112 extern void 113 bfd_elf64_riscv_set_data_segment_info (struct bfd_link_info *, int *); 114