]>
Commit | Line | Data |
---|---|---|
d87bef3a | 1 | /* Copyright (C) 2021-2023 Free Software Foundation, Inc. |
e214f8db | 2 | Contributed by Loongson Ltd. |
3 | ||
4 | This file is part of GNU Binutils. | |
5 | ||
6 | This program is free software; you can redistribute it and/or modify | |
7 | it under the terms of the GNU General Public License as published by | |
8 | the Free Software Foundation; either version 3 of the license, or | |
9 | (at your option) any later version. | |
10 | ||
11 | This program is distributed in the hope that it will be useful, | |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | GNU General Public License for more details. | |
15 | ||
16 | You should have received a copy of the GNU General Public License | |
17 | along with this program; see the file COPYING3. If not, | |
18 | see <http://www.gnu.org/licenses/>. */ | |
19 | ||
20 | #ifndef _ELF_LOONGARCH_H | |
21 | #define _ELF_LOONGARCH_H | |
22 | ||
23 | #include "elf/reloc-macros.h" | |
24 | #include "libiberty.h" | |
25 | ||
26 | START_RELOC_NUMBERS (elf_loongarch_reloc_type) | |
27 | /* Used by the dynamic linker. */ | |
28 | RELOC_NUMBER (R_LARCH_NONE, 0) | |
29 | RELOC_NUMBER (R_LARCH_32, 1) | |
30 | RELOC_NUMBER (R_LARCH_64, 2) | |
31 | RELOC_NUMBER (R_LARCH_RELATIVE, 3) | |
32 | RELOC_NUMBER (R_LARCH_COPY, 4) | |
33 | RELOC_NUMBER (R_LARCH_JUMP_SLOT, 5) | |
34 | RELOC_NUMBER (R_LARCH_TLS_DTPMOD32, 6) | |
35 | RELOC_NUMBER (R_LARCH_TLS_DTPMOD64, 7) | |
36 | RELOC_NUMBER (R_LARCH_TLS_DTPREL32, 8) | |
37 | RELOC_NUMBER (R_LARCH_TLS_DTPREL64, 9) | |
38 | RELOC_NUMBER (R_LARCH_TLS_TPREL32, 10) | |
39 | RELOC_NUMBER (R_LARCH_TLS_TPREL64, 11) | |
40 | RELOC_NUMBER (R_LARCH_IRELATIVE, 12) | |
41 | ||
42 | /* Reserved for future relocs that the dynamic linker must understand. */ | |
43 | ||
44 | /* Used by the static linker for relocating .text. */ | |
45 | RELOC_NUMBER (R_LARCH_MARK_LA, 20) | |
46 | RELOC_NUMBER (R_LARCH_MARK_PCREL, 21) | |
47 | ||
48 | RELOC_NUMBER (R_LARCH_SOP_PUSH_PCREL, 22) | |
49 | ||
50 | RELOC_NUMBER (R_LARCH_SOP_PUSH_ABSOLUTE, 23) | |
51 | ||
52 | RELOC_NUMBER (R_LARCH_SOP_PUSH_DUP, 24) | |
53 | RELOC_NUMBER (R_LARCH_SOP_PUSH_GPREL, 25) | |
54 | RELOC_NUMBER (R_LARCH_SOP_PUSH_TLS_TPREL, 26) | |
55 | RELOC_NUMBER (R_LARCH_SOP_PUSH_TLS_GOT, 27) | |
56 | RELOC_NUMBER (R_LARCH_SOP_PUSH_TLS_GD, 28) | |
57 | RELOC_NUMBER (R_LARCH_SOP_PUSH_PLT_PCREL, 29) | |
58 | ||
59 | RELOC_NUMBER (R_LARCH_SOP_ASSERT, 30) | |
60 | RELOC_NUMBER (R_LARCH_SOP_NOT, 31) | |
61 | RELOC_NUMBER (R_LARCH_SOP_SUB, 32) | |
62 | RELOC_NUMBER (R_LARCH_SOP_SL, 33) | |
63 | RELOC_NUMBER (R_LARCH_SOP_SR, 34) | |
64 | RELOC_NUMBER (R_LARCH_SOP_ADD, 35) | |
65 | RELOC_NUMBER (R_LARCH_SOP_AND, 36) | |
66 | RELOC_NUMBER (R_LARCH_SOP_IF_ELSE, 37) | |
67 | RELOC_NUMBER (R_LARCH_SOP_POP_32_S_10_5, 38) | |
68 | RELOC_NUMBER (R_LARCH_SOP_POP_32_U_10_12, 39) | |
69 | RELOC_NUMBER (R_LARCH_SOP_POP_32_S_10_12, 40) | |
70 | RELOC_NUMBER (R_LARCH_SOP_POP_32_S_10_16, 41) | |
71 | RELOC_NUMBER (R_LARCH_SOP_POP_32_S_10_16_S2, 42) | |
72 | RELOC_NUMBER (R_LARCH_SOP_POP_32_S_5_20, 43) | |
73 | RELOC_NUMBER (R_LARCH_SOP_POP_32_S_0_5_10_16_S2, 44) | |
74 | RELOC_NUMBER (R_LARCH_SOP_POP_32_S_0_10_10_16_S2, 45) | |
75 | RELOC_NUMBER (R_LARCH_SOP_POP_32_U, 46) | |
76 | ||
77 | /* Used by the static linker for relocating non .text. */ | |
78 | RELOC_NUMBER (R_LARCH_ADD8, 47) | |
79 | RELOC_NUMBER (R_LARCH_ADD16, 48) | |
80 | RELOC_NUMBER (R_LARCH_ADD24, 49) | |
81 | RELOC_NUMBER (R_LARCH_ADD32, 50) | |
82 | RELOC_NUMBER (R_LARCH_ADD64, 51) | |
83 | RELOC_NUMBER (R_LARCH_SUB8, 52) | |
84 | RELOC_NUMBER (R_LARCH_SUB16, 53) | |
85 | RELOC_NUMBER (R_LARCH_SUB24, 54) | |
86 | RELOC_NUMBER (R_LARCH_SUB32, 55) | |
87 | RELOC_NUMBER (R_LARCH_SUB64, 56) | |
88 | ||
89 | /* I don't know what it is. Existing in almost all other arch. */ | |
90 | RELOC_NUMBER (R_LARCH_GNU_VTINHERIT, 57) | |
91 | RELOC_NUMBER (R_LARCH_GNU_VTENTRY, 58) | |
92 | ||
6d13722a | 93 | |
94 | /* B16: | |
95 | beq/bne/blt/bge/bltu/bgeu/jirl | |
96 | %b16 (sym). */ | |
97 | RELOC_NUMBER (R_LARCH_B16, 64) | |
98 | /* B21: | |
99 | beqz/bnez | |
100 | %b16 (sym). */ | |
101 | RELOC_NUMBER (R_LARCH_B21, 65) | |
102 | /* B26: | |
103 | b/bl | |
104 | %b26 (sym) or %plt (sym). */ | |
105 | RELOC_NUMBER (R_LARCH_B26, 66) | |
106 | ||
107 | /* ABS: 32/64 | |
108 | lu12i.w | |
109 | %abs_hi20 (sym). */ | |
110 | RELOC_NUMBER (R_LARCH_ABS_HI20, 67) | |
111 | /* ABS: 32/64 | |
112 | ori | |
113 | %abs_lo12 (sym). */ | |
114 | RELOC_NUMBER (R_LARCH_ABS_LO12, 68) | |
115 | ||
116 | /* ABS: 64 | |
117 | lu32i.d | |
118 | %abs64_lo20 (sym). */ | |
119 | RELOC_NUMBER (R_LARCH_ABS64_LO20, 69) | |
120 | /* ABS: 64 | |
121 | lu52i.d | |
122 | %abs64_hi12 (sym). */ | |
123 | RELOC_NUMBER (R_LARCH_ABS64_HI12, 70) | |
124 | ||
125 | /* PCREL: 32/64 | |
126 | pcalau12i | |
127 | %pc_hi20 (sym). */ | |
128 | RELOC_NUMBER (R_LARCH_PCALA_HI20, 71) | |
129 | /* PCREL: 32/64 | |
130 | addi.w/addi.d | |
131 | %pc_lo12 (sym). */ | |
132 | RELOC_NUMBER (R_LARCH_PCALA_LO12, 72) | |
133 | /* PCREL: 64 | |
134 | lu32i.d | |
135 | %pc64_lo20 (sym). */ | |
136 | RELOC_NUMBER (R_LARCH_PCALA64_LO20, 73) | |
137 | /* PCREL: 64 | |
138 | lu52i.d | |
139 | %pc64_hi12 (sym). */ | |
140 | RELOC_NUMBER (R_LARCH_PCALA64_HI12, 74) | |
141 | ||
142 | /* GOT: 32/64 | |
143 | pcalau12i | |
144 | %got_pc_hi20 (got). */ | |
145 | RELOC_NUMBER (R_LARCH_GOT_PC_HI20, 75) | |
146 | /* GOT: 32/64 | |
147 | ld.w/ld.d | |
148 | %got_pc_lo12 (got). */ | |
149 | RELOC_NUMBER (R_LARCH_GOT_PC_LO12, 76) | |
150 | /* GOT: 32/64 | |
151 | lu32i.d | |
152 | %got_pc_lo12 (got). */ | |
153 | RELOC_NUMBER (R_LARCH_GOT64_PC_LO20, 77) | |
154 | /* GOT64: PCREL | |
155 | lu52i.d | |
156 | %got64_pc_hi12 (got). */ | |
157 | RELOC_NUMBER (R_LARCH_GOT64_PC_HI12, 78) | |
158 | /* GOT32/64: ABS | |
159 | lu12i.w | |
160 | %got_hi20 (got). */ | |
161 | RELOC_NUMBER (R_LARCH_GOT_HI20, 79) | |
162 | /* GOT: 32/64: ABS | |
163 | ori | |
164 | %got_lo12 (got). */ | |
165 | RELOC_NUMBER (R_LARCH_GOT_LO12, 80) | |
166 | /* GOT64: ABS | |
167 | lu32i.d | |
168 | %got64_lo20 (got). */ | |
169 | RELOC_NUMBER (R_LARCH_GOT64_LO20, 81) | |
170 | /* GOT64: ABS | |
171 | lu52i.d | |
172 | %got64_hi12 (got). */ | |
173 | RELOC_NUMBER (R_LARCH_GOT64_HI12, 82) | |
174 | ||
175 | /* TLS-LE: 32/64 | |
176 | lu12i.w | |
177 | %le_hi20 (sym). */ | |
178 | RELOC_NUMBER (R_LARCH_TLS_LE_HI20, 83) | |
179 | /* TLS-LE: 32/64 | |
180 | ori | |
181 | %le_lo12 (sym). */ | |
182 | RELOC_NUMBER (R_LARCH_TLS_LE_LO12, 84) | |
183 | /* TLS-LE: 64 | |
184 | lu32i.d | |
185 | %le64_lo20 (sym). */ | |
186 | RELOC_NUMBER (R_LARCH_TLS_LE64_LO20, 85) | |
187 | /* TLS-LE: 64 | |
188 | lu52i.d | |
189 | %le64_hi12 (sym). */ | |
190 | RELOC_NUMBER (R_LARCH_TLS_LE64_HI12, 86) | |
191 | ||
192 | /* TLS-IE: 32/64 | |
193 | pcalau12i | |
194 | %ie_pc_hi20 (sym). */ | |
195 | RELOC_NUMBER (R_LARCH_TLS_IE_PC_HI20, 87) | |
196 | RELOC_NUMBER (R_LARCH_TLS_IE_PC_LO12, 88) | |
197 | RELOC_NUMBER (R_LARCH_TLS_IE64_PC_LO20, 89) | |
198 | RELOC_NUMBER (R_LARCH_TLS_IE64_PC_HI12, 90) | |
199 | ||
200 | /* TLS-IE: 32/64: ABS | |
201 | lu12i.w | |
202 | %ie_hi20 (sym). */ | |
203 | RELOC_NUMBER (R_LARCH_TLS_IE_HI20, 91) | |
204 | RELOC_NUMBER (R_LARCH_TLS_IE_LO12, 92) | |
205 | RELOC_NUMBER (R_LARCH_TLS_IE64_LO20, 93) | |
206 | RELOC_NUMBER (R_LARCH_TLS_IE64_HI12, 94) | |
207 | ||
208 | /* TLS-LD: 32/64 | |
209 | pcalau12i | |
210 | %ld_pc_hi20 (sym). */ | |
211 | RELOC_NUMBER (R_LARCH_TLS_LD_PC_HI20, 95) | |
212 | /* TLS-LD: 32/64: ABS | |
213 | lu12i.w | |
214 | %ld_hi20 (sym). */ | |
215 | RELOC_NUMBER (R_LARCH_TLS_LD_HI20, 96) | |
216 | ||
217 | /* TLS-GD: 32/64 | |
218 | pcalau12i | |
219 | %gd_pc_hi20 (sym). */ | |
220 | RELOC_NUMBER (R_LARCH_TLS_GD_PC_HI20, 97) | |
221 | /* TLS-GD: 32/64: ABS | |
222 | lu12i.w | |
223 | %gd_hi20 (sym). */ | |
224 | RELOC_NUMBER (R_LARCH_TLS_GD_HI20, 98) | |
225 | ||
98011207 | 226 | /* For eh_frame and debug info. */ |
227 | RELOC_NUMBER (R_LARCH_32_PCREL, 99) | |
228 | ||
6d13722a | 229 | /* RELAX. */ |
98011207 | 230 | RELOC_NUMBER (R_LARCH_RELAX, 100) |
6d13722a | 231 | |
e214f8db | 232 | END_RELOC_NUMBERS (R_LARCH_count) |
233 | ||
234 | /* Processor specific flags for the ELF header e_flags field. */ | |
c4a7e6b5 | 235 | /* Base ABI modifier, 3bits. */ |
236 | #define EF_LOONGARCH_ABI_SOFT_FLOAT 0x1 | |
237 | #define EF_LOONGARCH_ABI_SINGLE_FLOAT 0x2 | |
238 | #define EF_LOONGARCH_ABI_DOUBLE_FLOAT 0x3 | |
239 | #define EF_LOONGARCH_ABI_MODIFIER_MASK 0x7 | |
ccbaaa36 | 240 | |
c4a7e6b5 | 241 | #define EF_LOONGARCH_OBJABI_V1 0x40 |
242 | #define EF_LOONGARCH_OBJABI_MASK 0xC0 | |
3b14682a | 243 | |
c4a7e6b5 | 244 | #define EF_LOONGARCH_ABI_MASK \ |
245 | (EF_LOONGARCH_OBJABI_MASK | EF_LOONGARCH_ABI_MODIFIER_MASK) | |
3b14682a | 246 | |
c4a7e6b5 | 247 | #define EF_LOONGARCH_ABI_MODIFIER(abi) \ |
248 | (EF_LOONGARCH_ABI_MODIFIER_MASK & (abi)) | |
249 | #define EF_LOONGARCH_OBJABI(abi) \ | |
250 | (EF_LOONGARCH_OBJABI_MASK & (abi)) | |
e214f8db | 251 | |
c4a7e6b5 | 252 | #define EF_LOONGARCH_ABI(abi) ((abi) & EF_LOONGARCH_ABI_MASK) |
e214f8db | 253 | |
254 | #define EF_LOONGARCH_IS_SOFT_FLOAT(abi) \ | |
c4a7e6b5 | 255 | (EF_LOONGARCH_ABI_MODIFIER (abi) == EF_LOONGARCH_ABI_SOFT_FLOAT) |
e214f8db | 256 | #define EF_LOONGARCH_IS_SINGLE_FLOAT(abi) \ |
c4a7e6b5 | 257 | (EF_LOONGARCH_ABI_MODIFIER (abi) == EF_LOONGARCH_ABI_SINGLE_FLOAT) |
3b14682a | 258 | #define EF_LOONGARCH_IS_DOUBLE_FLOAT(abi) \ |
c4a7e6b5 | 259 | (EF_LOONGARCH_ABI_MODIFIER (abi) == EF_LOONGARCH_ABI_DOUBLE_FLOAT) |
260 | ||
261 | #define EF_LOONGARCH_IS_OBJ_V0(abi) (!EF_LOONGARCH_OBJABI (abi)) | |
262 | #define EF_LOONGARCH_IS_OBJ_V1(abi) \ | |
263 | (EF_LOONGARCH_OBJABI (abi) == EF_LOONGARCH_OBJABI_V1) | |
e214f8db | 264 | |
265 | #endif /* _ELF_LOONGARCH_H */ |