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