xref: /netbsd-src/external/gpl3/gdb/dist/bfd/elfxx-riscv.h (revision 2718af68c3efc72c9769069b5c7f9ed36f6b9def)
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