1 /* RISC-V ELF specific backend routines. 2 Copyright (C) 2011-2024 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 struct riscv_elf_params 31 { 32 /* Whether to relax code sequences to GP-relative addressing. */ 33 bool relax_gp; 34 /* Whether to check if SUB_ULEB128 relocation has non-zero addend. */ 35 bool check_uleb128; 36 }; 37 38 extern void riscv_elf32_set_options (struct bfd_link_info *, 39 struct riscv_elf_params *); 40 extern void riscv_elf64_set_options (struct bfd_link_info *, 41 struct riscv_elf_params *); 42 43 extern reloc_howto_type * 44 riscv_reloc_name_lookup (bfd *, const char *); 45 46 extern reloc_howto_type * 47 riscv_reloc_type_lookup (bfd *, bfd_reloc_code_real_type); 48 49 extern reloc_howto_type * 50 riscv_elf_rtype_to_howto (bfd *, unsigned int r_type); 51 52 /* The information of architecture attribute. */ 53 struct riscv_subset_t 54 { 55 const char *name; 56 int major_version; 57 int minor_version; 58 struct riscv_subset_t *next; 59 }; 60 61 typedef struct riscv_subset_t riscv_subset_t; 62 63 typedef struct 64 { 65 riscv_subset_t *head; 66 riscv_subset_t *tail; 67 const char *arch_str; 68 } riscv_subset_list_t; 69 70 extern void 71 riscv_release_subset_list (riscv_subset_list_t *); 72 73 extern void 74 riscv_add_subset (riscv_subset_list_t *, 75 const char *, 76 int, int); 77 78 extern bool 79 riscv_lookup_subset (const riscv_subset_list_t *, 80 const char *, 81 riscv_subset_t **); 82 83 typedef struct 84 { 85 riscv_subset_list_t *subset_list; 86 void (*error_handler) (const char *, 87 ...) ATTRIBUTE_PRINTF_1; 88 unsigned *xlen; 89 enum riscv_spec_class *isa_spec; 90 bool check_unknown_prefixed_ext; 91 } riscv_parse_subset_t; 92 93 extern bool 94 riscv_parse_subset (riscv_parse_subset_t *, 95 const char *); 96 97 extern void 98 riscv_release_subset_list (riscv_subset_list_t *); 99 100 extern char * 101 riscv_arch_str (unsigned, const riscv_subset_list_t *); 102 103 extern size_t 104 riscv_estimate_digit (unsigned); 105 106 extern int 107 riscv_compare_subsets (const char *, const char *); 108 109 extern riscv_subset_list_t * 110 riscv_copy_subset_list (riscv_subset_list_t *); 111 112 extern bool 113 riscv_update_subset (riscv_parse_subset_t *, const char *); 114 115 extern bool 116 riscv_subset_supports (riscv_parse_subset_t *, const char *); 117 118 extern bool 119 riscv_multi_subset_supports (riscv_parse_subset_t *, enum riscv_insn_class); 120 121 extern const char * 122 riscv_multi_subset_supports_ext (riscv_parse_subset_t *, enum riscv_insn_class); 123 124 extern void 125 riscv_print_extensions (void); 126 127 extern void 128 bfd_elf32_riscv_set_data_segment_info (struct bfd_link_info *, int *); 129 extern void 130 bfd_elf64_riscv_set_data_segment_info (struct bfd_link_info *, int *); 131