Home | History | Annotate | Line # | Download | only in bfd
      1 /* RISC-V ELF specific backend routines.
      2    Copyright (C) 2011-2024 Free Software Foundation, Inc.
      3 
      4    Contributed by Andrew Waterman (andrew (at) 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