elfxx-loongarch.c revision 1.1.1.2 1 1.1 christos /* LoongArch-specific support for ELF.
2 1.1.1.2 christos Copyright (C) 2021-2024 Free Software Foundation, Inc.
3 1.1 christos Contributed by Loongson Ltd.
4 1.1 christos
5 1.1 christos Based on RISC-V target.
6 1.1 christos
7 1.1 christos This file is part of BFD, the Binary File Descriptor library.
8 1.1 christos
9 1.1 christos This program is free software; you can redistribute it and/or modify
10 1.1 christos it under the terms of the GNU General Public License as published by
11 1.1 christos the Free Software Foundation; either version 3 of the License, or
12 1.1 christos (at your option) any later version.
13 1.1 christos
14 1.1 christos This program is distributed in the hope that it will be useful,
15 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
16 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 1.1 christos GNU General Public License for more details.
18 1.1 christos
19 1.1 christos You should have received a copy of the GNU General Public License
20 1.1 christos along with this program; see the file COPYING3. If not,
21 1.1 christos see <http://www.gnu.org/licenses/>. */
22 1.1 christos
23 1.1 christos #include "sysdep.h"
24 1.1 christos #include "bfd.h"
25 1.1 christos #include "libbfd.h"
26 1.1 christos #include "elf-bfd.h"
27 1.1 christos #include "elf/loongarch.h"
28 1.1 christos #include "elfxx-loongarch.h"
29 1.1 christos
30 1.1 christos #define ALL_ONES (~ (bfd_vma) 0)
31 1.1 christos
32 1.1 christos typedef struct loongarch_reloc_howto_type_struct
33 1.1 christos {
34 1.1 christos /* The first must be reloc_howto_type! */
35 1.1 christos reloc_howto_type howto;
36 1.1 christos bfd_reloc_code_real_type bfd_type;
37 1.1.1.2 christos bool (*adjust_reloc_bits)(bfd *, reloc_howto_type *, bfd_vma *);
38 1.1 christos const char *larch_reloc_type_name;
39 1.1 christos } loongarch_reloc_howto_type;
40 1.1 christos
41 1.1 christos #define LOONGARCH_DEFAULT_HOWTO(r_name) \
42 1.1 christos { HOWTO (R_LARCH_##r_name, 0, 4, 32, false, 0, complain_overflow_signed, \
43 1.1 christos bfd_elf_generic_reloc, "R_LARCH_" #r_name, false, 0, ALL_ONES, \
44 1.1 christos false), BFD_RELOC_LARCH_##r_name, NULL, NULL }
45 1.1 christos
46 1.1 christos #define LOONGARCH_HOWTO(type, right, size, bits, pcrel, left, ovf, func, \
47 1.1 christos name, inplace, src_mask, dst_mask, pcrel_off, btype, afunc,lname) \
48 1.1 christos { HOWTO(type, right, size, bits, pcrel, left, ovf, func, name, \
49 1.1 christos inplace, src_mask, dst_mask, pcrel_off), btype, afunc, lname }
50 1.1 christos
51 1.1 christos #define LOONGARCH_EMPTY_HOWTO(C) \
52 1.1 christos { EMPTY_HOWTO (C), BFD_RELOC_NONE, NULL, NULL }
53 1.1 christos
54 1.1 christos static bool
55 1.1.1.2 christos reloc_bits (bfd *abfd, reloc_howto_type *howto, bfd_vma *val);
56 1.1 christos static bool
57 1.1.1.2 christos reloc_sign_bits (bfd *abfd, reloc_howto_type *howto, bfd_vma *fix_val);
58 1.1 christos static bool
59 1.1.1.2 christos reloc_unsign_bits (bfd *abfd, reloc_howto_type *howto, bfd_vma *fix_val);
60 1.1.1.2 christos
61 1.1.1.2 christos static bfd_reloc_status_type
62 1.1.1.2 christos loongarch_elf_add_sub_reloc (bfd *, arelent *, asymbol *, void *,
63 1.1.1.2 christos asection *, bfd *, char **);
64 1.1.1.2 christos
65 1.1.1.2 christos static bfd_reloc_status_type
66 1.1.1.2 christos loongarch_elf_add_sub_reloc_uleb128 (bfd *, arelent *, asymbol *, void *,
67 1.1.1.2 christos asection *, bfd *, char **);
68 1.1 christos
69 1.1 christos /* This does not include any relocation information, but should be
70 1.1 christos good enough for GDB or objdump to read the file. */
71 1.1 christos static loongarch_reloc_howto_type loongarch_howto_table[] =
72 1.1 christos {
73 1.1 christos /* No relocation. */
74 1.1 christos LOONGARCH_HOWTO (R_LARCH_NONE, /* type (0). */
75 1.1 christos 0, /* rightshift */
76 1.1 christos 0, /* size */
77 1.1 christos 0, /* bitsize */
78 1.1 christos false, /* pc_relative */
79 1.1 christos 0, /* bitpos */
80 1.1 christos complain_overflow_dont, /* complain_on_overflow */
81 1.1 christos bfd_elf_generic_reloc, /* special_function */
82 1.1 christos "R_LARCH_NONE", /* name */
83 1.1 christos false, /* partial_inplace */
84 1.1 christos 0, /* src_mask */
85 1.1 christos 0, /* dst_mask */
86 1.1 christos false, /* pcrel_offset */
87 1.1 christos BFD_RELOC_NONE, /* bfd_reloc_code_real_type */
88 1.1 christos NULL, /* adjust_reloc_bits */
89 1.1 christos NULL), /* larch_reloc_type_name */
90 1.1 christos
91 1.1 christos /* 32 bit relocation. */
92 1.1 christos LOONGARCH_HOWTO (R_LARCH_32, /* type (1). */
93 1.1 christos 0, /* rightshift */
94 1.1 christos 4, /* size */
95 1.1 christos 32, /* bitsize */
96 1.1 christos false, /* pc_relative */
97 1.1 christos 0, /* bitpos */
98 1.1 christos complain_overflow_dont, /* complain_on_overflow */
99 1.1 christos bfd_elf_generic_reloc, /* special_function */
100 1.1 christos "R_LARCH_32", /* name */
101 1.1 christos false, /* partial_inplace */
102 1.1 christos 0, /* src_mask */
103 1.1 christos ALL_ONES, /* dst_mask */
104 1.1 christos false, /* pcrel_offset */
105 1.1 christos BFD_RELOC_32, /* bfd_reloc_code_real_type */
106 1.1 christos NULL, /* adjust_reloc_bits */
107 1.1 christos NULL), /* larch_reloc_type_name */
108 1.1 christos
109 1.1 christos /* 64 bit relocation. */
110 1.1 christos LOONGARCH_HOWTO (R_LARCH_64, /* type (2). */
111 1.1 christos 0, /* rightshift */
112 1.1 christos 8, /* size */
113 1.1 christos 64, /* bitsize */
114 1.1 christos false, /* pc_relative */
115 1.1 christos 0, /* bitpos */
116 1.1 christos complain_overflow_dont, /* complain_on_overflow */
117 1.1 christos bfd_elf_generic_reloc, /* special_function */
118 1.1 christos "R_LARCH_64", /* name */
119 1.1 christos false, /* partial_inplace */
120 1.1 christos 0, /* src_mask */
121 1.1 christos ALL_ONES, /* dst_mask */
122 1.1 christos false, /* pcrel_offset */
123 1.1 christos BFD_RELOC_64, /* bfd_reloc_code_real_type */
124 1.1 christos NULL, /* adjust_reloc_bits */
125 1.1 christos NULL), /* larch_reloc_type_name */
126 1.1 christos
127 1.1 christos LOONGARCH_HOWTO (R_LARCH_RELATIVE, /* type (3). */
128 1.1 christos 0, /* rightshift */
129 1.1 christos 4, /* size */
130 1.1 christos 32, /* bitsize */
131 1.1 christos false, /* pc_relative */
132 1.1 christos 0, /* bitpos */
133 1.1 christos complain_overflow_dont, /* complain_on_overflow */
134 1.1 christos bfd_elf_generic_reloc, /* special_function */
135 1.1 christos "R_LARCH_RELATIVE", /* name */
136 1.1 christos false, /* partial_inplace */
137 1.1 christos 0, /* src_mask */
138 1.1 christos ALL_ONES, /* dst_mask */
139 1.1 christos false, /* pcrel_offset */
140 1.1 christos BFD_RELOC_NONE, /* undefined? */
141 1.1 christos NULL, /* adjust_reloc_bits */
142 1.1 christos NULL), /* larch_reloc_type_name */
143 1.1 christos
144 1.1 christos LOONGARCH_HOWTO (R_LARCH_COPY, /* type (4). */
145 1.1 christos 0, /* rightshift */
146 1.1 christos 0, /* this one is variable size */
147 1.1 christos 0, /* bitsize */
148 1.1 christos false, /* pc_relative */
149 1.1 christos 0, /* bitpos */
150 1.1 christos complain_overflow_bitfield, /* complain_on_overflow */
151 1.1 christos bfd_elf_generic_reloc, /* special_function */
152 1.1 christos "R_LARCH_COPY", /* name */
153 1.1 christos false, /* partial_inplace */
154 1.1 christos 0, /* src_mask */
155 1.1 christos 0, /* dst_mask */
156 1.1 christos false, /* pcrel_offset */
157 1.1 christos BFD_RELOC_NONE, /* undefined? */
158 1.1 christos NULL, /* adjust_reloc_bits */
159 1.1 christos NULL), /* larch_reloc_type_name */
160 1.1 christos
161 1.1 christos LOONGARCH_HOWTO (R_LARCH_JUMP_SLOT, /* type (5). */
162 1.1 christos 0, /* rightshift */
163 1.1 christos 8, /* size */
164 1.1 christos 64, /* bitsize */
165 1.1 christos false, /* pc_relative */
166 1.1 christos 0, /* bitpos */
167 1.1 christos complain_overflow_bitfield, /* complain_on_overflow */
168 1.1 christos bfd_elf_generic_reloc, /* special_function */
169 1.1 christos "R_LARCH_JUMP_SLOT", /* name */
170 1.1 christos false, /* partial_inplace */
171 1.1 christos 0, /* src_mask */
172 1.1 christos 0, /* dst_mask */
173 1.1 christos false, /* pcrel_offset */
174 1.1 christos BFD_RELOC_NONE, /* undefined? */
175 1.1 christos NULL, /* adjust_reloc_bits */
176 1.1 christos NULL), /* larch_reloc_type_name */
177 1.1 christos
178 1.1 christos /* Dynamic TLS relocations. */
179 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_DTPMOD32, /* type (6). */
180 1.1 christos 0, /* rightshift */
181 1.1 christos 4, /* size */
182 1.1 christos 32, /* bitsize */
183 1.1 christos false, /* pc_relative */
184 1.1 christos 0, /* bitpos */
185 1.1 christos complain_overflow_dont, /* complain_on_overflow */
186 1.1 christos bfd_elf_generic_reloc, /* special_function */
187 1.1 christos "R_LARCH_TLS_DTPMOD32", /* name */
188 1.1 christos false, /* partial_inplace */
189 1.1 christos 0, /* src_mask */
190 1.1 christos ALL_ONES, /* dst_mask */
191 1.1 christos false, /* pcrel_offset */
192 1.1 christos BFD_RELOC_LARCH_TLS_DTPMOD32, /* bfd_reloc_code_real_type */
193 1.1 christos NULL, /* adjust_reloc_bits */
194 1.1 christos NULL), /* larch_reloc_type_name */
195 1.1 christos
196 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_DTPMOD64, /* type (7). */
197 1.1 christos 0, /* rightshift */
198 1.1 christos 8, /* size */
199 1.1 christos 64, /* bitsize */
200 1.1 christos false, /* pc_relative */
201 1.1 christos 0, /* bitpos */
202 1.1 christos complain_overflow_dont, /* complain_on_overflow */
203 1.1 christos bfd_elf_generic_reloc, /* special_function */
204 1.1 christos "R_LARCH_TLS_DTPMOD64", /* name */
205 1.1 christos false, /* partial_inplace */
206 1.1 christos 0, /* src_mask */
207 1.1 christos ALL_ONES, /* dst_mask */
208 1.1 christos false, /* pcrel_offset */
209 1.1 christos BFD_RELOC_LARCH_TLS_DTPMOD64, /* bfd_reloc_code_real_type */
210 1.1 christos NULL, /* adjust_reloc_bits */
211 1.1 christos NULL), /* larch_reloc_type_name */
212 1.1 christos
213 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_DTPREL32, /* type (8). */
214 1.1 christos 0, /* rightshift */
215 1.1 christos 4, /* size */
216 1.1 christos 32, /* bitsize */
217 1.1 christos false, /* pc_relative */
218 1.1 christos 0, /* bitpos */
219 1.1 christos complain_overflow_dont, /* complain_on_overflow */
220 1.1 christos bfd_elf_generic_reloc, /* special_function */
221 1.1 christos "R_LARCH_TLS_DTPREL32", /* name */
222 1.1 christos true, /* partial_inplace */
223 1.1 christos 0, /* src_mask */
224 1.1 christos ALL_ONES, /* dst_mask */
225 1.1 christos false, /* pcrel_offset */
226 1.1 christos BFD_RELOC_LARCH_TLS_DTPREL32, /* bfd_reloc_code_real_type */
227 1.1 christos NULL, /* adjust_reloc_bits */
228 1.1 christos NULL), /* larch_reloc_type_name */
229 1.1 christos
230 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_DTPREL64, /* type (9). */
231 1.1 christos 0, /* rightshift */
232 1.1 christos 8, /* size */
233 1.1 christos 64, /* bitsize */
234 1.1 christos false, /* pc_relative */
235 1.1 christos 0, /* bitpos */
236 1.1 christos complain_overflow_dont, /* complain_on_overflow */
237 1.1 christos bfd_elf_generic_reloc, /* special_function */
238 1.1 christos "R_LARCH_TLS_DTPREL64", /* name */
239 1.1 christos true, /* partial_inplace */
240 1.1 christos 0, /* src_mask */
241 1.1 christos ALL_ONES, /* dst_mask */
242 1.1 christos false, /* pcrel_offset */
243 1.1 christos BFD_RELOC_LARCH_TLS_DTPREL64, /* bfd_reloc_code_real_type */
244 1.1 christos NULL, /* adjust_reloc_bits */
245 1.1 christos NULL), /* larch_reloc_type_name */
246 1.1 christos
247 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_TPREL32, /* type (10). */
248 1.1 christos 0, /* rightshift */
249 1.1 christos 4, /* size */
250 1.1 christos 32, /* bitsize */
251 1.1 christos false, /* pc_relative */
252 1.1 christos 0, /* bitpos */
253 1.1 christos complain_overflow_dont, /* complain_on_overflow */
254 1.1 christos bfd_elf_generic_reloc, /* special_function */
255 1.1 christos "R_LARCH_TLS_TPREL32", /* name */
256 1.1 christos false, /* partial_inplace */
257 1.1 christos 0, /* src_mask */
258 1.1 christos ALL_ONES, /* dst_mask */
259 1.1 christos false, /* pcrel_offset */
260 1.1 christos BFD_RELOC_LARCH_TLS_TPREL32, /* bfd_reloc_code_real_type */
261 1.1 christos NULL, /* adjust_reloc_bits */
262 1.1 christos NULL), /* larch_reloc_type_name */
263 1.1 christos
264 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_TPREL64, /* type (11). */
265 1.1 christos 0, /* rightshift */
266 1.1 christos 8, /* size */
267 1.1 christos 64, /* bitsize */
268 1.1 christos false, /* pc_relative */
269 1.1 christos 0, /* bitpos */
270 1.1 christos complain_overflow_dont, /* complain_on_overflow */
271 1.1 christos bfd_elf_generic_reloc, /* special_function */
272 1.1 christos "R_LARCH_TLS_TPREL64", /* name */
273 1.1 christos false, /* partial_inplace */
274 1.1 christos 0, /* src_mask */
275 1.1 christos ALL_ONES, /* dst_mask */
276 1.1 christos false, /* pcrel_offset */
277 1.1 christos BFD_RELOC_LARCH_TLS_TPREL64, /* bfd_reloc_code_real_type */
278 1.1 christos NULL, /* adjust_reloc_bits */
279 1.1 christos NULL), /* larch_reloc_type_name */
280 1.1 christos
281 1.1 christos LOONGARCH_HOWTO (R_LARCH_IRELATIVE, /* type (12). */
282 1.1 christos 0, /* rightshift */
283 1.1.1.2 christos 8, /* size */
284 1.1.1.2 christos 64, /* bitsize */
285 1.1 christos false, /* pc_relative */
286 1.1 christos 0, /* bitpos */
287 1.1 christos complain_overflow_dont, /* complain_on_overflow */
288 1.1 christos bfd_elf_generic_reloc, /* special_function */
289 1.1 christos "R_LARCH_IRELATIVE", /* name */
290 1.1 christos false, /* partial_inplace */
291 1.1 christos 0, /* src_mask */
292 1.1 christos ALL_ONES, /* dst_mask */
293 1.1 christos false, /* pcrel_offset */
294 1.1 christos BFD_RELOC_NONE, /* undefined? */
295 1.1 christos NULL, /* adjust_reloc_bits */
296 1.1 christos NULL), /* larch_reloc_type_name */
297 1.1 christos
298 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_DESC32, /* type (13). */
299 1.1.1.2 christos 0, /* rightshift. */
300 1.1.1.2 christos 4, /* size. */
301 1.1.1.2 christos 32, /* bitsize. */
302 1.1.1.2 christos false, /* pc_relative. */
303 1.1.1.2 christos 0, /* bitpos. */
304 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
305 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
306 1.1.1.2 christos "R_LARCH_TLS_DESC32", /* name. */
307 1.1.1.2 christos false, /* partial_inplace. */
308 1.1.1.2 christos 0, /* src_mask. */
309 1.1.1.2 christos ALL_ONES, /* dst_mask. */
310 1.1.1.2 christos false, /* pcrel_offset. */
311 1.1.1.2 christos BFD_RELOC_LARCH_TLS_DESC32, /* bfd_reloc_code_real_type. */
312 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
313 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
314 1.1.1.2 christos
315 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_DESC64, /* type (14). */
316 1.1.1.2 christos 0, /* rightshift. */
317 1.1.1.2 christos 8, /* size. */
318 1.1.1.2 christos 64, /* bitsize. */
319 1.1.1.2 christos false, /* pc_relative. */
320 1.1.1.2 christos 0, /* bitpos. */
321 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
322 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
323 1.1.1.2 christos "R_LARCH_TLS_DESC64", /* name. */
324 1.1.1.2 christos false, /* partial_inplace. */
325 1.1.1.2 christos 0, /* src_mask. */
326 1.1.1.2 christos ALL_ONES, /* dst_mask. */
327 1.1.1.2 christos false, /* pcrel_offset. */
328 1.1.1.2 christos BFD_RELOC_LARCH_TLS_DESC64, /* bfd_reloc_code_real_type. */
329 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
330 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
331 1.1.1.2 christos
332 1.1 christos LOONGARCH_EMPTY_HOWTO (15),
333 1.1 christos LOONGARCH_EMPTY_HOWTO (16),
334 1.1 christos LOONGARCH_EMPTY_HOWTO (17),
335 1.1 christos LOONGARCH_EMPTY_HOWTO (18),
336 1.1 christos LOONGARCH_EMPTY_HOWTO (19),
337 1.1 christos
338 1.1 christos LOONGARCH_HOWTO (R_LARCH_MARK_LA, /* type (20). */
339 1.1 christos 0, /* rightshift. */
340 1.1 christos 0, /* size. */
341 1.1 christos 0, /* bitsize. */
342 1.1 christos false, /* pc_relative. */
343 1.1 christos 0, /* bitpos. */
344 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
345 1.1 christos bfd_elf_generic_reloc, /* special_function. */
346 1.1 christos "R_LARCH_MARK_LA", /* name. */
347 1.1 christos false, /* partial_inplace. */
348 1.1 christos 0, /* src_mask. */
349 1.1 christos 0, /* dst_mask. */
350 1.1 christos false, /* pcrel_offset */
351 1.1 christos BFD_RELOC_LARCH_MARK_LA, /* bfd_reloc_code_real_type */
352 1.1 christos NULL, /* adjust_reloc_bits */
353 1.1 christos NULL), /* larch_reloc_type_name */
354 1.1 christos
355 1.1 christos LOONGARCH_HOWTO (R_LARCH_MARK_PCREL, /* type (21). */
356 1.1 christos 0, /* rightshift. */
357 1.1 christos 0, /* size. */
358 1.1 christos 0, /* bitsize. */
359 1.1 christos false, /* pc_relative. */
360 1.1 christos 0, /* bitpos. */
361 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
362 1.1 christos bfd_elf_generic_reloc, /* special_function. */
363 1.1 christos "R_LARCH_MARK_PCREL", /* name. */
364 1.1 christos false, /* partial_inplace. */
365 1.1 christos 0, /* src_mask. */
366 1.1 christos 0, /* dst_mask. */
367 1.1 christos false, /* pcrel_offset */
368 1.1 christos BFD_RELOC_LARCH_MARK_PCREL, /* bfd_reloc_code_real_type */
369 1.1 christos NULL, /* adjust_reloc_bits */
370 1.1 christos NULL), /* larch_reloc_type_name */
371 1.1 christos
372 1.1 christos LOONGARCH_HOWTO (R_LARCH_SOP_PUSH_PCREL, /* type (22). */
373 1.1 christos 2, /* rightshift. */
374 1.1 christos 4, /* size. */
375 1.1 christos 32, /* bitsize. */
376 1.1 christos true /* FIXME: somewhat use this. */, /* pc_relative. */
377 1.1 christos 0, /* bitpos. */
378 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
379 1.1 christos bfd_elf_generic_reloc, /* special_function. */
380 1.1 christos "R_LARCH_SOP_PUSH_PCREL", /* name. */
381 1.1 christos false, /* partial_inplace. */
382 1.1 christos 0x03ffffff, /* src_mask. */
383 1.1 christos 0x03ffffff, /* dst_mask. */
384 1.1 christos false, /* pcrel_offset */
385 1.1 christos BFD_RELOC_LARCH_SOP_PUSH_PCREL, /* bfd_reloc_code_real_type */
386 1.1 christos NULL, /* adjust_reloc_bits */
387 1.1 christos NULL), /* larch_reloc_type_name */
388 1.1 christos
389 1.1 christos /* type 23-37. */
390 1.1 christos LOONGARCH_DEFAULT_HOWTO (SOP_PUSH_ABSOLUTE),
391 1.1 christos LOONGARCH_DEFAULT_HOWTO (SOP_PUSH_DUP),
392 1.1 christos LOONGARCH_DEFAULT_HOWTO (SOP_PUSH_GPREL),
393 1.1 christos LOONGARCH_DEFAULT_HOWTO (SOP_PUSH_TLS_TPREL),
394 1.1 christos LOONGARCH_DEFAULT_HOWTO (SOP_PUSH_TLS_GOT),
395 1.1 christos LOONGARCH_DEFAULT_HOWTO (SOP_PUSH_TLS_GD),
396 1.1 christos LOONGARCH_DEFAULT_HOWTO (SOP_PUSH_PLT_PCREL),
397 1.1 christos LOONGARCH_DEFAULT_HOWTO (SOP_ASSERT),
398 1.1 christos LOONGARCH_DEFAULT_HOWTO (SOP_NOT),
399 1.1 christos LOONGARCH_DEFAULT_HOWTO (SOP_SUB),
400 1.1 christos LOONGARCH_DEFAULT_HOWTO (SOP_SL),
401 1.1 christos LOONGARCH_DEFAULT_HOWTO (SOP_SR),
402 1.1 christos LOONGARCH_DEFAULT_HOWTO (SOP_ADD),
403 1.1 christos LOONGARCH_DEFAULT_HOWTO (SOP_AND),
404 1.1 christos LOONGARCH_DEFAULT_HOWTO (SOP_IF_ELSE),
405 1.1 christos
406 1.1 christos LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_10_5, /* type (38). */
407 1.1 christos 0, /* rightshift. */
408 1.1 christos 4, /* size. */
409 1.1 christos 5, /* bitsize. */
410 1.1 christos false, /* pc_relative. */
411 1.1 christos 10, /* bitpos. */
412 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
413 1.1 christos bfd_elf_generic_reloc, /* special_function. */
414 1.1 christos "R_LARCH_SOP_POP_32_S_10_5", /* name. */
415 1.1 christos false, /* partial_inplace. */
416 1.1 christos 0, /* src_mask */
417 1.1 christos 0x7c00, /* dst_mask */
418 1.1 christos false, /* pcrel_offset */
419 1.1 christos BFD_RELOC_LARCH_SOP_POP_32_S_10_5, /* bfd_reloc_code_real_type */
420 1.1.1.2 christos reloc_sign_bits, /* adjust_reloc_bits */
421 1.1 christos NULL), /* larch_reloc_type_name */
422 1.1 christos
423 1.1 christos LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_U_10_12, /* type (39). */
424 1.1 christos 0, /* rightshift. */
425 1.1 christos 4, /* size. */
426 1.1 christos 12, /* bitsize. */
427 1.1 christos false, /* pc_relative. */
428 1.1 christos 10, /* bitpos. */
429 1.1 christos complain_overflow_unsigned, /* complain_on_overflow. */
430 1.1 christos bfd_elf_generic_reloc, /* special_function. */
431 1.1 christos "R_LARCH_SOP_POP_32_U_10_12", /* name. */
432 1.1 christos false, /* partial_inplace. */
433 1.1 christos 0, /* src_mask */
434 1.1 christos 0x3ffc00, /* dst_mask */
435 1.1 christos false, /* pcrel_offset */
436 1.1 christos BFD_RELOC_LARCH_SOP_POP_32_U_10_12, /* bfd_reloc_code_real_type */
437 1.1.1.2 christos reloc_unsign_bits, /* adjust_reloc_bits */
438 1.1 christos NULL), /* larch_reloc_type_name */
439 1.1 christos
440 1.1 christos LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_10_12, /* type (40). */
441 1.1 christos 0, /* rightshift. */
442 1.1 christos 4, /* size. */
443 1.1 christos 12, /* bitsize. */
444 1.1 christos false, /* pc_relative. */
445 1.1 christos 10, /* bitpos. */
446 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
447 1.1 christos bfd_elf_generic_reloc, /* special_function. */
448 1.1 christos "R_LARCH_SOP_POP_32_S_10_12", /* name. */
449 1.1 christos false, /* partial_inplace. */
450 1.1 christos 0, /* src_mask */
451 1.1 christos 0x3ffc00, /* dst_mask */
452 1.1 christos false, /* pcrel_offset */
453 1.1 christos BFD_RELOC_LARCH_SOP_POP_32_S_10_12, /* bfd_reloc_code_real_type */
454 1.1.1.2 christos reloc_sign_bits, /* adjust_reloc_bits */
455 1.1 christos NULL), /* larch_reloc_type_name */
456 1.1 christos
457 1.1 christos LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_10_16, /* type (41). */
458 1.1 christos 0, /* rightshift. */
459 1.1 christos 4, /* size. */
460 1.1 christos 16, /* bitsize. */
461 1.1 christos false, /* pc_relative. */
462 1.1 christos 10, /* bitpos. */
463 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
464 1.1 christos bfd_elf_generic_reloc, /* special_function. */
465 1.1 christos "R_LARCH_SOP_POP_32_S_10_16", /* name. */
466 1.1 christos false, /* partial_inplace. */
467 1.1 christos 0, /* src_mask */
468 1.1 christos 0x3fffc00, /* dst_mask */
469 1.1 christos false, /* pcrel_offset */
470 1.1 christos BFD_RELOC_LARCH_SOP_POP_32_S_10_16, /* bfd_reloc_code_real_type */
471 1.1.1.2 christos reloc_sign_bits, /* adjust_reloc_bits */
472 1.1 christos NULL), /* larch_reloc_type_name */
473 1.1 christos
474 1.1 christos LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_10_16_S2, /* type (42). */
475 1.1 christos 2, /* rightshift. */
476 1.1 christos 4, /* size. */
477 1.1 christos 16, /* bitsize. */
478 1.1 christos false, /* pc_relative. */
479 1.1 christos 10, /* bitpos. */
480 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
481 1.1 christos bfd_elf_generic_reloc, /* special_function. */
482 1.1 christos "R_LARCH_SOP_POP_32_S_10_16_S2", /* name. */
483 1.1 christos false, /* partial_inplace. */
484 1.1 christos 0, /* src_mask */
485 1.1 christos 0x3fffc00, /* dst_mask */
486 1.1 christos false, /* pcrel_offset */
487 1.1 christos BFD_RELOC_LARCH_SOP_POP_32_S_10_16_S2, /* bfd_reloc_code_real_type */
488 1.1.1.2 christos reloc_sign_bits, /* adjust_reloc_bits */
489 1.1 christos NULL), /* larch_reloc_type_name */
490 1.1 christos
491 1.1 christos LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_5_20, /* type (43). */
492 1.1 christos 0, /* rightshift. */
493 1.1 christos 4, /* size. */
494 1.1 christos 20, /* bitsize. */
495 1.1 christos false, /* pc_relative. */
496 1.1 christos 5, /* bitpos. */
497 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
498 1.1 christos bfd_elf_generic_reloc, /* special_function. */
499 1.1 christos "R_LARCH_SOP_POP_32_S_5_20", /* name. */
500 1.1 christos false, /* partial_inplace. */
501 1.1 christos 0, /* src_mask */
502 1.1 christos 0x1ffffe0, /* dst_mask */
503 1.1 christos false, /* pcrel_offset */
504 1.1 christos BFD_RELOC_LARCH_SOP_POP_32_S_5_20, /* bfd_reloc_code_real_type */
505 1.1.1.2 christos reloc_sign_bits, /* adjust_reloc_bits */
506 1.1 christos NULL), /* larch_reloc_type_name */
507 1.1 christos
508 1.1 christos LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_0_5_10_16_S2,
509 1.1 christos /* type (44). */
510 1.1 christos 2, /* rightshift. */
511 1.1 christos 4, /* size. */
512 1.1 christos 21, /* bitsize. */
513 1.1 christos false, /* pc_relative. */
514 1.1 christos 0, /* bitpos. */
515 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
516 1.1 christos bfd_elf_generic_reloc, /* special_function. */
517 1.1 christos "R_LARCH_SOP_POP_32_S_0_5_10_16_S2", /* name. */
518 1.1 christos false, /* partial_inplace. */
519 1.1.1.2 christos 0x0, /* src_mask */
520 1.1.1.2 christos 0x03fffc1f, /* dst_mask */
521 1.1 christos false, /* pcrel_offset */
522 1.1 christos BFD_RELOC_LARCH_SOP_POP_32_S_0_5_10_16_S2,
523 1.1 christos /* bfd_reloc_code_real_type */
524 1.1.1.2 christos reloc_sign_bits, /* adjust_reloc_bits */
525 1.1 christos NULL), /* larch_reloc_type_name */
526 1.1 christos
527 1.1 christos LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_0_10_10_16_S2, /* type (45). */
528 1.1 christos 2, /* rightshift. */
529 1.1 christos 4, /* size. */
530 1.1 christos 26, /* bitsize. */
531 1.1 christos false, /* pc_relative. */
532 1.1 christos 0, /* bitpos. */
533 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
534 1.1 christos bfd_elf_generic_reloc, /* special_function. */
535 1.1 christos "R_LARCH_SOP_POP_32_S_0_10_10_16_S2", /* name. */
536 1.1 christos false, /* partial_inplace. */
537 1.1 christos 0, /* src_mask */
538 1.1 christos 0x03ffffff, /* dst_mask */
539 1.1 christos false, /* pcrel_offset */
540 1.1 christos BFD_RELOC_LARCH_SOP_POP_32_S_0_10_10_16_S2,
541 1.1 christos /* bfd_reloc_code_real_type */
542 1.1.1.2 christos reloc_sign_bits, /* adjust_reloc_bits */
543 1.1 christos NULL), /* larch_reloc_type_name */
544 1.1 christos
545 1.1 christos LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_U, /* type (46). */
546 1.1 christos 0, /* rightshift. */
547 1.1 christos 4, /* size. */
548 1.1 christos 32, /* bitsize. */
549 1.1 christos false, /* pc_relative. */
550 1.1 christos 0, /* bitpos. */
551 1.1 christos complain_overflow_unsigned, /* complain_on_overflow. */
552 1.1 christos bfd_elf_generic_reloc, /* special_function. */
553 1.1.1.2 christos "R_LARCH_SOP_POP_32_U", /* name. */
554 1.1 christos false, /* partial_inplace. */
555 1.1 christos 0xffffffff00000000, /* src_mask */
556 1.1 christos 0x00000000ffffffff, /* dst_mask */
557 1.1 christos false, /* pcrel_offset */
558 1.1 christos BFD_RELOC_LARCH_SOP_POP_32_U, /* bfd_reloc_code_real_type */
559 1.1.1.2 christos reloc_unsign_bits, /* adjust_reloc_bits */
560 1.1 christos NULL), /* larch_reloc_type_name */
561 1.1 christos
562 1.1.1.2 christos /* 8-bit in-place addition, for local label subtraction. */
563 1.1 christos LOONGARCH_HOWTO (R_LARCH_ADD8, /* type (47). */
564 1.1 christos 0, /* rightshift. */
565 1.1.1.2 christos 1, /* size. */
566 1.1 christos 8, /* bitsize. */
567 1.1 christos false, /* pc_relative. */
568 1.1 christos 0, /* bitpos. */
569 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
570 1.1.1.2 christos loongarch_elf_add_sub_reloc, /* special_function. */
571 1.1 christos "R_LARCH_ADD8", /* name. */
572 1.1 christos false, /* partial_inplace. */
573 1.1.1.2 christos 0, /* src_mask. */
574 1.1.1.2 christos 0xff, /* dst_mask. */
575 1.1.1.2 christos false, /* pcrel_offset. */
576 1.1.1.2 christos BFD_RELOC_LARCH_ADD8, /* bfd_reloc_code_real_type. */
577 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
578 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
579 1.1 christos
580 1.1.1.2 christos /* 16-bit in-place addition, for local label subtraction. */
581 1.1 christos LOONGARCH_HOWTO (R_LARCH_ADD16, /* type (48). */
582 1.1 christos 0, /* rightshift. */
583 1.1.1.2 christos 2, /* size. */
584 1.1 christos 16, /* bitsize. */
585 1.1 christos false, /* pc_relative. */
586 1.1 christos 0, /* bitpos. */
587 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
588 1.1.1.2 christos loongarch_elf_add_sub_reloc, /* special_function. */
589 1.1 christos "R_LARCH_ADD16", /* name. */
590 1.1 christos false, /* partial_inplace. */
591 1.1.1.2 christos 0, /* src_mask. */
592 1.1.1.2 christos 0xffff, /* dst_mask. */
593 1.1.1.2 christos false, /* pcrel_offset. */
594 1.1.1.2 christos BFD_RELOC_LARCH_ADD16, /* bfd_reloc_code_real_type. */
595 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
596 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
597 1.1 christos
598 1.1.1.2 christos /* 24-bit in-place addition, for local label subtraction. */
599 1.1 christos LOONGARCH_HOWTO (R_LARCH_ADD24, /* type (49). */
600 1.1 christos 0, /* rightshift. */
601 1.1.1.2 christos 3, /* size. */
602 1.1 christos 24, /* bitsize. */
603 1.1 christos false, /* pc_relative. */
604 1.1 christos 0, /* bitpos. */
605 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
606 1.1.1.2 christos loongarch_elf_add_sub_reloc, /* special_function. */
607 1.1 christos "R_LARCH_ADD24", /* name. */
608 1.1 christos false, /* partial_inplace. */
609 1.1.1.2 christos 0, /* src_mask. */
610 1.1.1.2 christos 0xffffff, /* dst_mask. */
611 1.1.1.2 christos false, /* pcrel_offset. */
612 1.1.1.2 christos BFD_RELOC_LARCH_ADD24, /* bfd_reloc_code_real_type. */
613 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
614 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
615 1.1 christos
616 1.1.1.2 christos /* 32-bit in-place addition, for local label subtraction. */
617 1.1 christos LOONGARCH_HOWTO (R_LARCH_ADD32, /* type (50). */
618 1.1 christos 0, /* rightshift. */
619 1.1 christos 4, /* size. */
620 1.1 christos 32, /* bitsize. */
621 1.1 christos false, /* pc_relative. */
622 1.1 christos 0, /* bitpos. */
623 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
624 1.1.1.2 christos loongarch_elf_add_sub_reloc, /* special_function. */
625 1.1 christos "R_LARCH_ADD32", /* name. */
626 1.1 christos false, /* partial_inplace. */
627 1.1.1.2 christos 0, /* src_mask. */
628 1.1.1.2 christos 0xffffffff, /* dst_mask. */
629 1.1.1.2 christos false, /* pcrel_offset. */
630 1.1.1.2 christos BFD_RELOC_LARCH_ADD32, /* bfd_reloc_code_real_type. */
631 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
632 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
633 1.1 christos
634 1.1.1.2 christos /* 64-bit in-place addition, for local label subtraction. */
635 1.1 christos LOONGARCH_HOWTO (R_LARCH_ADD64, /* type (51). */
636 1.1 christos 0, /* rightshift. */
637 1.1 christos 8, /* size. */
638 1.1 christos 64, /* bitsize. */
639 1.1 christos false, /* pc_relative. */
640 1.1 christos 0, /* bitpos. */
641 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
642 1.1.1.2 christos loongarch_elf_add_sub_reloc, /* special_function. */
643 1.1 christos "R_LARCH_ADD64", /* name. */
644 1.1 christos false, /* partial_inplace. */
645 1.1.1.2 christos 0, /* src_mask. */
646 1.1.1.2 christos ALL_ONES, /* dst_mask. */
647 1.1.1.2 christos false, /* pcrel_offset. */
648 1.1.1.2 christos BFD_RELOC_LARCH_ADD64, /* bfd_reloc_code_real_type. */
649 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
650 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
651 1.1 christos
652 1.1.1.2 christos /* 8-bit in-place subtraction, for local label subtraction. */
653 1.1 christos LOONGARCH_HOWTO (R_LARCH_SUB8, /* type (52). */
654 1.1 christos 0, /* rightshift. */
655 1.1.1.2 christos 1, /* size. */
656 1.1 christos 8, /* bitsize. */
657 1.1 christos false, /* pc_relative. */
658 1.1 christos 0, /* bitpos. */
659 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
660 1.1.1.2 christos loongarch_elf_add_sub_reloc, /* special_function. */
661 1.1 christos "R_LARCH_SUB8", /* name. */
662 1.1 christos false, /* partial_inplace. */
663 1.1.1.2 christos 0, /* src_mask. */
664 1.1.1.2 christos 0xff, /* dst_mask. */
665 1.1.1.2 christos false, /* pcrel_offset. */
666 1.1.1.2 christos BFD_RELOC_LARCH_SUB8, /* bfd_reloc_code_real_type. */
667 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
668 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
669 1.1 christos
670 1.1.1.2 christos /* 16-bit in-place subtraction, for local label subtraction. */
671 1.1 christos LOONGARCH_HOWTO (R_LARCH_SUB16, /* type (53). */
672 1.1 christos 0, /* rightshift. */
673 1.1.1.2 christos 2, /* size. */
674 1.1 christos 16, /* bitsize. */
675 1.1 christos false, /* pc_relative. */
676 1.1 christos 0, /* bitpos. */
677 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
678 1.1.1.2 christos loongarch_elf_add_sub_reloc, /* special_function. */
679 1.1 christos "R_LARCH_SUB16", /* name. */
680 1.1 christos false, /* partial_inplace. */
681 1.1.1.2 christos 0, /* src_mask. */
682 1.1.1.2 christos 0xffff, /* dst_mask. */
683 1.1.1.2 christos false, /* pcrel_offset. */
684 1.1.1.2 christos BFD_RELOC_LARCH_SUB16, /* bfd_reloc_code_real_type. */
685 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
686 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
687 1.1 christos
688 1.1.1.2 christos /* 24-bit in-place subtraction, for local label subtraction. */
689 1.1 christos LOONGARCH_HOWTO (R_LARCH_SUB24, /* type (54). */
690 1.1 christos 0, /* rightshift. */
691 1.1.1.2 christos 3, /* size. */
692 1.1 christos 24, /* bitsize. */
693 1.1 christos false, /* pc_relative. */
694 1.1 christos 0, /* bitpos. */
695 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
696 1.1.1.2 christos loongarch_elf_add_sub_reloc, /* special_function. */
697 1.1 christos "R_LARCH_SUB24", /* name. */
698 1.1 christos false, /* partial_inplace. */
699 1.1.1.2 christos 0, /* src_mask. */
700 1.1.1.2 christos 0xffffff, /* dst_mask. */
701 1.1.1.2 christos false, /* pcrel_offset. */
702 1.1.1.2 christos BFD_RELOC_LARCH_SUB24, /* bfd_reloc_code_real_type. */
703 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
704 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
705 1.1 christos
706 1.1.1.2 christos /* 32-bit in-place subtraction, for local label subtraction. */
707 1.1 christos LOONGARCH_HOWTO (R_LARCH_SUB32, /* type (55). */
708 1.1 christos 0, /* rightshift. */
709 1.1 christos 4, /* size. */
710 1.1 christos 32, /* bitsize. */
711 1.1 christos false, /* pc_relative. */
712 1.1 christos 0, /* bitpos. */
713 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
714 1.1.1.2 christos loongarch_elf_add_sub_reloc, /* special_function. */
715 1.1 christos "R_LARCH_SUB32", /* name. */
716 1.1 christos false, /* partial_inplace. */
717 1.1.1.2 christos 0, /* src_mask. */
718 1.1.1.2 christos 0xffffffff, /* dst_mask. */
719 1.1.1.2 christos false, /* pcrel_offset. */
720 1.1.1.2 christos BFD_RELOC_LARCH_SUB32, /* bfd_reloc_code_real_type. */
721 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
722 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
723 1.1 christos
724 1.1.1.2 christos /* 64-bit in-place subtraction, for local label subtraction. */
725 1.1 christos LOONGARCH_HOWTO (R_LARCH_SUB64, /* type (56). */
726 1.1 christos 0, /* rightshift. */
727 1.1 christos 8, /* size. */
728 1.1 christos 64, /* bitsize. */
729 1.1 christos false, /* pc_relative. */
730 1.1 christos 0, /* bitpos. */
731 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
732 1.1.1.2 christos loongarch_elf_add_sub_reloc, /* special_function. */
733 1.1 christos "R_LARCH_SUB64", /* name. */
734 1.1 christos false, /* partial_inplace. */
735 1.1.1.2 christos 0, /* src_mask. */
736 1.1.1.2 christos ALL_ONES, /* dst_mask. */
737 1.1.1.2 christos false, /* pcrel_offset. */
738 1.1.1.2 christos BFD_RELOC_LARCH_SUB64, /* bfd_reloc_code_real_type. */
739 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
740 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
741 1.1 christos
742 1.1 christos LOONGARCH_HOWTO (R_LARCH_GNU_VTINHERIT, /* type (57). */
743 1.1 christos 0, /* rightshift. */
744 1.1 christos 0, /* size. */
745 1.1 christos 0, /* bitsize. */
746 1.1 christos false, /* pc_relative. */
747 1.1 christos 0, /* bitpos. */
748 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
749 1.1 christos bfd_elf_generic_reloc, /* special_function. */
750 1.1 christos "R_LARCH_GNU_VTINHERIT", /* name. */
751 1.1 christos false, /* partial_inplace. */
752 1.1 christos 0, /* src_mask */
753 1.1 christos 0, /* dst_mask */
754 1.1 christos false, /* pcrel_offset */
755 1.1 christos BFD_RELOC_NONE, /* bfd_reloc_code_real_type */
756 1.1 christos NULL, /* adjust_reloc_bits */
757 1.1 christos NULL), /* larch_reloc_type_name */
758 1.1 christos
759 1.1 christos LOONGARCH_HOWTO (R_LARCH_GNU_VTENTRY, /* type (58). */
760 1.1 christos 0, /* rightshift. */
761 1.1 christos 0, /* size. */
762 1.1 christos 0, /* bitsize. */
763 1.1 christos false, /* pc_relative. */
764 1.1 christos 0, /* bitpos. */
765 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
766 1.1 christos NULL, /* special_function. */
767 1.1 christos "R_LARCH_GNU_VTENTRY", /* name. */
768 1.1 christos false, /* partial_inplace. */
769 1.1 christos 0, /* src_mask */
770 1.1 christos 0, /* dst_mask */
771 1.1 christos false, /* pcrel_offset */
772 1.1 christos BFD_RELOC_NONE, /* bfd_reloc_code_real_type */
773 1.1 christos NULL, /* adjust_reloc_bits */
774 1.1 christos NULL), /* larch_reloc_type_name */
775 1.1 christos
776 1.1 christos LOONGARCH_EMPTY_HOWTO (59),
777 1.1 christos LOONGARCH_EMPTY_HOWTO (60),
778 1.1 christos LOONGARCH_EMPTY_HOWTO (61),
779 1.1 christos LOONGARCH_EMPTY_HOWTO (62),
780 1.1 christos LOONGARCH_EMPTY_HOWTO (63),
781 1.1 christos
782 1.1 christos /* New reloc types. */
783 1.1 christos LOONGARCH_HOWTO (R_LARCH_B16, /* type (64). */
784 1.1 christos 2, /* rightshift. */
785 1.1 christos 4, /* size. */
786 1.1 christos 16, /* bitsize. */
787 1.1 christos false, /* pc_relative. */
788 1.1 christos 10, /* bitpos. */
789 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
790 1.1 christos bfd_elf_generic_reloc, /* special_function. */
791 1.1 christos "R_LARCH_B16", /* name. */
792 1.1 christos false, /* partial_inplace. */
793 1.1.1.2 christos 0, /* src_mask. */
794 1.1.1.2 christos 0x3fffc00, /* dst_mask. */
795 1.1.1.2 christos false, /* pcrel_offset. */
796 1.1.1.2 christos BFD_RELOC_LARCH_B16, /* bfd_reloc_code_real_type. */
797 1.1.1.2 christos reloc_sign_bits, /* adjust_reloc_bits. */
798 1.1.1.2 christos "b16"), /* larch_reloc_type_name. */
799 1.1 christos
800 1.1 christos LOONGARCH_HOWTO (R_LARCH_B21, /* type (65). */
801 1.1 christos 2, /* rightshift. */
802 1.1 christos 4, /* size. */
803 1.1 christos 21, /* bitsize. */
804 1.1 christos false, /* pc_relative. */
805 1.1 christos 0, /* bitpos. */
806 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
807 1.1 christos bfd_elf_generic_reloc, /* special_function. */
808 1.1 christos "R_LARCH_B21", /* name. */
809 1.1 christos false, /* partial_inplace. */
810 1.1.1.2 christos 0, /* src_mask. */
811 1.1.1.2 christos 0x3fffc1f, /* dst_mask. */
812 1.1.1.2 christos false, /* pcrel_offset. */
813 1.1.1.2 christos BFD_RELOC_LARCH_B21, /* bfd_reloc_code_real_type. */
814 1.1.1.2 christos reloc_sign_bits, /* adjust_reloc_bits. */
815 1.1.1.2 christos "b21"), /* larch_reloc_type_name. */
816 1.1 christos
817 1.1 christos LOONGARCH_HOWTO (R_LARCH_B26, /* type (66). */
818 1.1 christos 2, /* rightshift. */
819 1.1 christos 4, /* size. */
820 1.1 christos 26, /* bitsize. */
821 1.1 christos false, /* pc_relative. */
822 1.1 christos 0, /* bitpos. */
823 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
824 1.1 christos bfd_elf_generic_reloc, /* special_function. */
825 1.1 christos "R_LARCH_B26", /* name. */
826 1.1 christos false, /* partial_inplace. */
827 1.1.1.2 christos 0, /* src_mask. */
828 1.1.1.2 christos 0x03ffffff, /* dst_mask. */
829 1.1.1.2 christos false, /* pcrel_offset. */
830 1.1.1.2 christos BFD_RELOC_LARCH_B26, /* bfd_reloc_code_real_type. */
831 1.1.1.2 christos reloc_sign_bits, /* adjust_reloc_bits. */
832 1.1.1.2 christos "b26"), /* larch_reloc_type_name. */
833 1.1 christos
834 1.1 christos LOONGARCH_HOWTO (R_LARCH_ABS_HI20, /* type (67). */
835 1.1 christos 12, /* rightshift. */
836 1.1 christos 4, /* size. */
837 1.1 christos 20, /* bitsize. */
838 1.1 christos false, /* pc_relative. */
839 1.1 christos 5, /* bitpos. */
840 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
841 1.1 christos bfd_elf_generic_reloc, /* special_function. */
842 1.1 christos "R_LARCH_ABS_HI20", /* name. */
843 1.1 christos false, /* partial_inplace. */
844 1.1 christos 0, /* src_mask */
845 1.1 christos 0x1ffffe0, /* dst_mask */
846 1.1 christos false, /* pcrel_offset */
847 1.1 christos BFD_RELOC_LARCH_ABS_HI20, /* bfd_reloc_code_real_type */
848 1.1 christos reloc_bits, /* adjust_reloc_bits */
849 1.1 christos "abs_hi20"), /* larch_reloc_type_name */
850 1.1 christos
851 1.1 christos LOONGARCH_HOWTO (R_LARCH_ABS_LO12, /* type (68). */
852 1.1 christos 0, /* rightshift. */
853 1.1 christos 4, /* size. */
854 1.1 christos 12, /* bitsize. */
855 1.1 christos false, /* pc_relative. */
856 1.1 christos 10, /* bitpos. */
857 1.1 christos complain_overflow_unsigned, /* complain_on_overflow. */
858 1.1 christos bfd_elf_generic_reloc, /* special_function. */
859 1.1 christos "R_LARCH_ABS_LO12", /* name. */
860 1.1 christos false, /* partial_inplace. */
861 1.1 christos 0, /* src_mask */
862 1.1 christos 0x3ffc00, /* dst_mask */
863 1.1 christos false, /* pcrel_offset */
864 1.1 christos BFD_RELOC_LARCH_ABS_LO12, /* bfd_reloc_code_real_type */
865 1.1 christos reloc_bits, /* adjust_reloc_bits */
866 1.1 christos "abs_lo12"), /* larch_reloc_type_name */
867 1.1 christos
868 1.1 christos LOONGARCH_HOWTO (R_LARCH_ABS64_LO20, /* type (69). */
869 1.1 christos 32, /* rightshift. */
870 1.1 christos 4, /* size. */
871 1.1 christos 20, /* bitsize. */
872 1.1 christos false, /* pc_relative. */
873 1.1 christos 5, /* bitpos. */
874 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
875 1.1 christos bfd_elf_generic_reloc, /* special_function. */
876 1.1 christos "R_LARCH_ABS64_LO20", /* name. */
877 1.1 christos false, /* partial_inplace. */
878 1.1 christos 0, /* src_mask */
879 1.1 christos 0x1ffffe0, /* dst_mask */
880 1.1 christos false, /* pcrel_offset */
881 1.1 christos BFD_RELOC_LARCH_ABS64_LO20, /* bfd_reloc_code_real_type */
882 1.1 christos reloc_bits, /* adjust_reloc_bits */
883 1.1 christos "abs64_lo20"), /* larch_reloc_type_name */
884 1.1 christos
885 1.1 christos LOONGARCH_HOWTO (R_LARCH_ABS64_HI12, /* type (70). */
886 1.1 christos 52, /* rightshift. */
887 1.1 christos 4, /* size. */
888 1.1 christos 12, /* bitsize. */
889 1.1 christos false, /* pc_relative. */
890 1.1 christos 10, /* bitpos. */
891 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
892 1.1 christos bfd_elf_generic_reloc, /* special_function. */
893 1.1 christos "R_LARCH_ABS64_HI12", /* name. */
894 1.1 christos false, /* partial_inplace. */
895 1.1 christos 0, /* src_mask */
896 1.1 christos 0x3ffc00, /* dst_mask */
897 1.1 christos false, /* pcrel_offset */
898 1.1 christos BFD_RELOC_LARCH_ABS64_HI12, /* bfd_reloc_code_real_type */
899 1.1 christos reloc_bits, /* adjust_reloc_bits */
900 1.1 christos "abs64_hi12"), /* larch_reloc_type_name */
901 1.1 christos
902 1.1 christos LOONGARCH_HOWTO (R_LARCH_PCALA_HI20, /* type (71). */
903 1.1 christos 12, /* rightshift. */
904 1.1 christos 4, /* size. */
905 1.1 christos 20, /* bitsize. */
906 1.1 christos false, /* pc_relative. */
907 1.1 christos 5, /* bitpos. */
908 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
909 1.1 christos bfd_elf_generic_reloc, /* special_function. */
910 1.1 christos "R_LARCH_PCALA_HI20", /* name. */
911 1.1 christos false, /* partial_inplace. */
912 1.1 christos 0, /* src_mask */
913 1.1 christos 0x1ffffe0, /* dst_mask */
914 1.1 christos false, /* pcrel_offset */
915 1.1 christos BFD_RELOC_LARCH_PCALA_HI20, /* bfd_reloc_code_real_type */
916 1.1 christos reloc_bits, /* adjust_reloc_bits */
917 1.1 christos "pc_hi20"), /* larch_reloc_type_name */
918 1.1 christos
919 1.1 christos LOONGARCH_HOWTO (R_LARCH_PCALA_LO12, /* type (72). */
920 1.1 christos 0, /* rightshift. */
921 1.1 christos 4, /* size. */
922 1.1 christos 12, /* bitsize. */
923 1.1 christos false, /* pc_relative. */
924 1.1 christos 10, /* bitpos. */
925 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
926 1.1 christos bfd_elf_generic_reloc, /* special_function. */
927 1.1 christos "R_LARCH_PCALA_LO12", /* name. */
928 1.1 christos false, /* partial_inplace. */
929 1.1 christos 0, /* src_mask */
930 1.1 christos 0x3ffc00, /* dst_mask */
931 1.1 christos false, /* pcrel_offset */
932 1.1 christos BFD_RELOC_LARCH_PCALA_LO12, /* bfd_reloc_code_real_type */
933 1.1 christos reloc_bits, /* adjust_reloc_bits */
934 1.1 christos "pc_lo12"), /* larch_reloc_type_name */
935 1.1 christos
936 1.1 christos LOONGARCH_HOWTO (R_LARCH_PCALA64_LO20, /* type (73). */
937 1.1 christos 32, /* rightshift. */
938 1.1 christos 4, /* size. */
939 1.1 christos 20, /* bitsize. */
940 1.1 christos false, /* pc_relative. */
941 1.1 christos 5, /* bitpos. */
942 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
943 1.1 christos bfd_elf_generic_reloc, /* special_function. */
944 1.1 christos "R_LARCH_PCALA64_LO20", /* name. */
945 1.1 christos false, /* partial_inplace. */
946 1.1 christos 0, /* src_mask */
947 1.1 christos 0x1ffffe0, /* dst_mask */
948 1.1 christos false, /* pcrel_offset */
949 1.1 christos BFD_RELOC_LARCH_PCALA64_LO20, /* bfd_reloc_code_real_type */
950 1.1 christos reloc_bits, /* adjust_reloc_bits */
951 1.1 christos "pc64_lo20"), /* larch_reloc_type_name */
952 1.1 christos
953 1.1 christos LOONGARCH_HOWTO (R_LARCH_PCALA64_HI12, /* type (74). */
954 1.1 christos 52, /* rightshift. */
955 1.1 christos 4, /* size. */
956 1.1 christos 12, /* bitsize. */
957 1.1 christos false, /* pc_relative. */
958 1.1 christos 10, /* bitpos. */
959 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
960 1.1 christos bfd_elf_generic_reloc, /* special_function. */
961 1.1 christos "R_LARCH_PCALA64_HI12", /* name. */
962 1.1 christos false, /* partial_inplace. */
963 1.1 christos 0, /* src_mask */
964 1.1 christos 0x3ffc00, /* dst_mask */
965 1.1 christos false, /* pcrel_offset */
966 1.1 christos BFD_RELOC_LARCH_PCALA64_HI12, /* bfd_reloc_code_real_type */
967 1.1 christos reloc_bits, /* adjust_reloc_bits */
968 1.1 christos "pc64_hi12"), /* larch_reloc_type_name */
969 1.1 christos
970 1.1 christos LOONGARCH_HOWTO (R_LARCH_GOT_PC_HI20, /* type (75). */
971 1.1 christos 12, /* rightshift. */
972 1.1 christos 4, /* size. */
973 1.1 christos 20, /* bitsize. */
974 1.1 christos false, /* pc_relative. */
975 1.1 christos 5, /* bitpos. */
976 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
977 1.1 christos bfd_elf_generic_reloc, /* special_function. */
978 1.1 christos "R_LARCH_GOT_PC_HI20", /* name. */
979 1.1 christos false, /* partial_inplace. */
980 1.1 christos 0, /* src_mask */
981 1.1 christos 0x1ffffe0, /* dst_mask */
982 1.1 christos false, /* pcrel_offset */
983 1.1 christos BFD_RELOC_LARCH_GOT_PC_HI20, /* bfd_reloc_code_real_type */
984 1.1 christos reloc_bits, /* adjust_reloc_bits */
985 1.1 christos "got_pc_hi20"), /* larch_reloc_type_name */
986 1.1 christos
987 1.1 christos LOONGARCH_HOWTO (R_LARCH_GOT_PC_LO12, /* type (76). */
988 1.1 christos 0, /* rightshift. */
989 1.1 christos 4, /* size. */
990 1.1 christos 12, /* bitsize. */
991 1.1 christos false, /* pc_relative. */
992 1.1 christos 10, /* bitpos. */
993 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
994 1.1 christos bfd_elf_generic_reloc, /* special_function. */
995 1.1 christos "R_LARCH_GOT_PC_LO12", /* name. */
996 1.1 christos false, /* partial_inplace. */
997 1.1 christos 0, /* src_mask */
998 1.1 christos 0x3ffc00, /* dst_mask */
999 1.1 christos false, /* pcrel_offset */
1000 1.1 christos BFD_RELOC_LARCH_GOT_PC_LO12, /* bfd_reloc_code_real_type */
1001 1.1 christos reloc_bits, /* adjust_reloc_bits */
1002 1.1 christos "got_pc_lo12"), /* larch_reloc_type_name */
1003 1.1 christos
1004 1.1 christos LOONGARCH_HOWTO (R_LARCH_GOT64_PC_LO20, /* type (77). */
1005 1.1 christos 32, /* rightshift. */
1006 1.1 christos 4, /* size. */
1007 1.1 christos 20, /* bitsize. */
1008 1.1 christos false, /* pc_relative. */
1009 1.1 christos 5, /* bitpos. */
1010 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1011 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1012 1.1 christos "R_LARCH_GOT64_PC_LO20", /* name. */
1013 1.1 christos false, /* partial_inplace. */
1014 1.1 christos 0, /* src_mask */
1015 1.1 christos 0x1ffffe0, /* dst_mask */
1016 1.1 christos false, /* pcrel_offset */
1017 1.1 christos BFD_RELOC_LARCH_GOT64_PC_LO20, /* bfd_reloc_code_real_type */
1018 1.1 christos reloc_bits, /* adjust_reloc_bits */
1019 1.1 christos "got64_pc_lo20"), /* larch_reloc_type_name */
1020 1.1 christos
1021 1.1 christos LOONGARCH_HOWTO (R_LARCH_GOT64_PC_HI12, /* type (78). */
1022 1.1 christos 52, /* rightshift. */
1023 1.1 christos 4, /* size. */
1024 1.1 christos 12, /* bitsize. */
1025 1.1 christos false, /* pc_relative. */
1026 1.1 christos 10, /* bitpos. */
1027 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1028 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1029 1.1 christos "R_LARCH_GOT64_PC_HI12", /* name. */
1030 1.1 christos false, /* partial_inplace. */
1031 1.1 christos 0, /* src_mask */
1032 1.1 christos 0x3ffc00, /* dst_mask */
1033 1.1 christos false, /* pcrel_offset */
1034 1.1 christos BFD_RELOC_LARCH_GOT64_PC_HI12, /* bfd_reloc_code_real_type */
1035 1.1 christos reloc_bits, /* adjust_reloc_bits */
1036 1.1 christos "got64_pc_hi12"), /* larch_reloc_type_name */
1037 1.1 christos
1038 1.1 christos LOONGARCH_HOWTO (R_LARCH_GOT_HI20, /* type (79). */
1039 1.1 christos 12, /* rightshift. */
1040 1.1 christos 4, /* size. */
1041 1.1 christos 20, /* bitsize. */
1042 1.1 christos false, /* pc_relative. */
1043 1.1 christos 5, /* bitpos. */
1044 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1045 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1046 1.1 christos "R_LARCH_GOT_HI20", /* name. */
1047 1.1 christos false, /* partial_inplace. */
1048 1.1 christos 0, /* src_mask */
1049 1.1 christos 0x1ffffe0, /* dst_mask */
1050 1.1 christos false, /* pcrel_offset */
1051 1.1 christos BFD_RELOC_LARCH_GOT_HI20, /* bfd_reloc_code_real_type */
1052 1.1 christos reloc_bits, /* adjust_reloc_bits */
1053 1.1 christos "got_hi20"), /* larch_reloc_type_name */
1054 1.1 christos
1055 1.1 christos LOONGARCH_HOWTO (R_LARCH_GOT_LO12, /* type (80). */
1056 1.1 christos 0, /* rightshift. */
1057 1.1 christos 4, /* size. */
1058 1.1 christos 12, /* bitsize. */
1059 1.1 christos false, /* pc_relative. */
1060 1.1 christos 10, /* bitpos. */
1061 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1062 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1063 1.1 christos "R_LARCH_GOT_LO12", /* name. */
1064 1.1 christos false, /* partial_inplace. */
1065 1.1 christos 0, /* src_mask */
1066 1.1 christos 0x3ffc00, /* dst_mask */
1067 1.1 christos false, /* pcrel_offset */
1068 1.1 christos BFD_RELOC_LARCH_GOT_LO12, /* bfd_reloc_code_real_type */
1069 1.1 christos reloc_bits, /* adjust_reloc_bits */
1070 1.1 christos "got_lo12"), /* larch_reloc_type_name */
1071 1.1 christos
1072 1.1 christos LOONGARCH_HOWTO (R_LARCH_GOT64_LO20, /* type (81). */
1073 1.1 christos 32, /* rightshift. */
1074 1.1 christos 4, /* size. */
1075 1.1 christos 20, /* bitsize. */
1076 1.1 christos false, /* pc_relative. */
1077 1.1 christos 5, /* bitpos. */
1078 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1079 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1080 1.1 christos "R_LARCH_GOT64_LO20", /* name. */
1081 1.1 christos false, /* partial_inplace. */
1082 1.1 christos 0, /* src_mask */
1083 1.1 christos 0x1ffffe0, /* dst_mask */
1084 1.1 christos false, /* pcrel_offset */
1085 1.1 christos BFD_RELOC_LARCH_GOT64_LO20, /* bfd_reloc_code_real_type */
1086 1.1 christos reloc_bits, /* adjust_reloc_bits */
1087 1.1 christos "got64_lo20"), /* larch_reloc_type_name */
1088 1.1 christos
1089 1.1 christos LOONGARCH_HOWTO (R_LARCH_GOT64_HI12, /* type (82). */
1090 1.1 christos 52, /* rightshift. */
1091 1.1 christos 4, /* size. */
1092 1.1 christos 12, /* bitsize. */
1093 1.1 christos false, /* pc_relative. */
1094 1.1 christos 10, /* bitpos. */
1095 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1096 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1097 1.1 christos "R_LARCH_GOT64_HI12", /* name. */
1098 1.1 christos false, /* partial_inplace. */
1099 1.1 christos 0, /* src_mask */
1100 1.1 christos 0x3ffc00, /* dst_mask */
1101 1.1 christos false, /* pcrel_offset */
1102 1.1 christos BFD_RELOC_LARCH_GOT64_HI12, /* bfd_reloc_code_real_type */
1103 1.1 christos reloc_bits, /* adjust_reloc_bits */
1104 1.1 christos "got64_hi12"), /* larch_reloc_type_name */
1105 1.1 christos
1106 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_LE_HI20, /* type (83). */
1107 1.1 christos 12, /* rightshift. */
1108 1.1 christos 4, /* size. */
1109 1.1 christos 20, /* bitsize. */
1110 1.1 christos false, /* pc_relative. */
1111 1.1 christos 5, /* bitpos. */
1112 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1113 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1114 1.1 christos "R_LARCH_TLS_LE_HI20", /* name. */
1115 1.1 christos false, /* partial_inplace. */
1116 1.1 christos 0, /* src_mask */
1117 1.1 christos 0x1ffffe0, /* dst_mask */
1118 1.1 christos false, /* pcrel_offset */
1119 1.1 christos BFD_RELOC_LARCH_TLS_LE_HI20, /* bfd_reloc_code_real_type */
1120 1.1 christos reloc_bits, /* adjust_reloc_bits */
1121 1.1 christos "le_hi20"), /* larch_reloc_type_name */
1122 1.1 christos
1123 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_LE_LO12, /* type (84). */
1124 1.1 christos 0, /* rightshift. */
1125 1.1 christos 4, /* size. */
1126 1.1 christos 12, /* bitsize. */
1127 1.1 christos false, /* pc_relative. */
1128 1.1 christos 10, /* bitpos. */
1129 1.1.1.2 christos complain_overflow_unsigned, /* complain_on_overflow. */
1130 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1131 1.1 christos "R_LARCH_TLS_LE_LO12", /* name. */
1132 1.1 christos false, /* partial_inplace. */
1133 1.1 christos 0, /* src_mask */
1134 1.1 christos 0x3ffc00, /* dst_mask */
1135 1.1 christos false, /* pcrel_offset */
1136 1.1 christos BFD_RELOC_LARCH_TLS_LE_LO12, /* bfd_reloc_code_real_type */
1137 1.1 christos reloc_bits, /* adjust_reloc_bits */
1138 1.1 christos "le_lo12"), /* larch_reloc_type_name */
1139 1.1 christos
1140 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_LE64_LO20, /* type (85). */
1141 1.1 christos 32, /* rightshift. */
1142 1.1 christos 4, /* size. */
1143 1.1 christos 20, /* bitsize. */
1144 1.1 christos false, /* pc_relative. */
1145 1.1 christos 5, /* bitpos. */
1146 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1147 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1148 1.1 christos "R_LARCH_TLS_LE64_LO20", /* name. */
1149 1.1 christos false, /* partial_inplace. */
1150 1.1 christos 0, /* src_mask */
1151 1.1 christos 0x1ffffe0, /* dst_mask */
1152 1.1 christos false, /* pcrel_offset */
1153 1.1 christos BFD_RELOC_LARCH_TLS_LE64_LO20, /* bfd_reloc_code_real_type */
1154 1.1 christos reloc_bits, /* adjust_reloc_bits */
1155 1.1 christos "le64_lo20"), /* larch_reloc_type_name */
1156 1.1 christos
1157 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_LE64_HI12, /* type (86). */
1158 1.1 christos 52, /* rightshift. */
1159 1.1 christos 4, /* size. */
1160 1.1 christos 12, /* bitsize. */
1161 1.1 christos false, /* pc_relative. */
1162 1.1 christos 10, /* bitpos. */
1163 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1164 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1165 1.1 christos "R_LARCH_TLS_LE64_HI12", /* name. */
1166 1.1 christos false, /* partial_inplace. */
1167 1.1 christos 0, /* src_mask */
1168 1.1 christos 0x3ffc00, /* dst_mask */
1169 1.1 christos false, /* pcrel_offset */
1170 1.1 christos BFD_RELOC_LARCH_TLS_LE64_HI12, /* bfd_reloc_code_real_type */
1171 1.1 christos reloc_bits, /* adjust_reloc_bits */
1172 1.1 christos "le64_hi12"), /* larch_reloc_type_name */
1173 1.1 christos
1174 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_IE_PC_HI20, /* type (87). */
1175 1.1 christos 12, /* rightshift. */
1176 1.1 christos 4, /* size. */
1177 1.1 christos 20, /* bitsize. */
1178 1.1 christos false, /* pc_relative. */
1179 1.1 christos 5, /* bitpos. */
1180 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1181 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1182 1.1 christos "R_LARCH_TLS_IE_PC_HI20", /* name. */
1183 1.1 christos false, /* partial_inplace. */
1184 1.1 christos 0, /* src_mask */
1185 1.1 christos 0x1ffffe0, /* dst_mask */
1186 1.1 christos false, /* pcrel_offset */
1187 1.1 christos BFD_RELOC_LARCH_TLS_IE_PC_HI20, /* bfd_reloc_code_real_type */
1188 1.1 christos reloc_bits, /* adjust_reloc_bits */
1189 1.1 christos "ie_pc_hi20"), /* larch_reloc_type_name */
1190 1.1 christos
1191 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_IE_PC_LO12, /* type (88). */
1192 1.1 christos 0, /* rightshift. */
1193 1.1 christos 4, /* size. */
1194 1.1 christos 12, /* bitsize. */
1195 1.1 christos false, /* pc_relative. */
1196 1.1 christos 10, /* bitpos. */
1197 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1198 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1199 1.1 christos "R_LARCH_TLS_IE_PC_LO12", /* name. */
1200 1.1 christos false, /* partial_inplace. */
1201 1.1 christos 0, /* src_mask */
1202 1.1 christos 0x3ffc00, /* dst_mask */
1203 1.1 christos false, /* pcrel_offset */
1204 1.1 christos BFD_RELOC_LARCH_TLS_IE_PC_LO12, /* bfd_reloc_code_real_type */
1205 1.1 christos reloc_bits, /* adjust_reloc_bits */
1206 1.1 christos "ie_pc_lo12"), /* larch_reloc_type_name */
1207 1.1 christos
1208 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_IE64_PC_LO20, /* type (89). */
1209 1.1 christos 32, /* rightshift. */
1210 1.1 christos 4, /* size. */
1211 1.1 christos 20, /* bitsize. */
1212 1.1 christos false, /* pc_relative. */
1213 1.1 christos 5, /* bitpos. */
1214 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1215 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1216 1.1 christos "R_LARCH_TLS_IE64_PC_LO20", /* name. */
1217 1.1 christos false, /* partial_inplace. */
1218 1.1 christos 0, /* src_mask */
1219 1.1 christos 0x1ffffe0, /* dst_mask */
1220 1.1 christos false, /* pcrel_offset */
1221 1.1 christos BFD_RELOC_LARCH_TLS_IE64_PC_LO20, /* bfd_reloc_code_real_type */
1222 1.1 christos reloc_bits, /* adjust_reloc_bits */
1223 1.1 christos "ie64_pc_lo20"), /* larch_reloc_type_name */
1224 1.1 christos
1225 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_IE64_PC_HI12, /* type (90). */
1226 1.1 christos 52, /* rightshift. */
1227 1.1 christos 4, /* size. */
1228 1.1 christos 12, /* bitsize. */
1229 1.1 christos false, /* pc_relative. */
1230 1.1 christos 10, /* bitpos. */
1231 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1232 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1233 1.1 christos "R_LARCH_TLS_IE64_PC_HI12", /* name. */
1234 1.1 christos false, /* partial_inplace. */
1235 1.1 christos 0, /* src_mask */
1236 1.1 christos 0x3ffc00, /* dst_mask */
1237 1.1 christos false, /* pcrel_offset */
1238 1.1 christos BFD_RELOC_LARCH_TLS_IE64_PC_HI12, /* bfd_reloc_code_real_type */
1239 1.1 christos reloc_bits, /* adjust_reloc_bits */
1240 1.1 christos "ie64_pc_hi12"), /* larch_reloc_type_name */
1241 1.1 christos
1242 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_IE_HI20, /* type (91). */
1243 1.1 christos 12, /* rightshift. */
1244 1.1 christos 4, /* size. */
1245 1.1 christos 20, /* bitsize. */
1246 1.1 christos false, /* pc_relative. */
1247 1.1 christos 5, /* bitpos. */
1248 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1249 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1250 1.1 christos "R_LARCH_TLS_IE_HI20", /* name. */
1251 1.1 christos false, /* partial_inplace. */
1252 1.1 christos 0, /* src_mask */
1253 1.1 christos 0x1ffffe0, /* dst_mask */
1254 1.1 christos false, /* pcrel_offset */
1255 1.1 christos BFD_RELOC_LARCH_TLS_IE_HI20, /* bfd_reloc_code_real_type */
1256 1.1 christos reloc_bits, /* adjust_reloc_bits */
1257 1.1 christos "ie_hi20"), /* larch_reloc_type_name */
1258 1.1 christos
1259 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_IE_LO12, /* type (92). */
1260 1.1 christos 0, /* rightshift. */
1261 1.1 christos 4, /* size. */
1262 1.1 christos 12, /* bitsize. */
1263 1.1 christos false, /* pc_relative. */
1264 1.1 christos 10, /* bitpos. */
1265 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1266 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1267 1.1 christos "R_LARCH_TLS_IE_LO12", /* name. */
1268 1.1 christos false, /* partial_inplace. */
1269 1.1 christos 0, /* src_mask */
1270 1.1 christos 0x3ffc00, /* dst_mask */
1271 1.1 christos false, /* pcrel_offset */
1272 1.1 christos BFD_RELOC_LARCH_TLS_IE_LO12, /* bfd_reloc_code_real_type */
1273 1.1 christos reloc_bits, /* adjust_reloc_bits */
1274 1.1 christos "ie_lo12"), /* larch_reloc_type_name */
1275 1.1 christos
1276 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_IE64_LO20, /* type (93). */
1277 1.1 christos 32, /* rightshift. */
1278 1.1 christos 4, /* size. */
1279 1.1 christos 20, /* bitsize. */
1280 1.1 christos false, /* pc_relative. */
1281 1.1 christos 5, /* bitpos. */
1282 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1283 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1284 1.1 christos "R_LARCH_TLS_IE64_LO20", /* name. */
1285 1.1 christos false, /* partial_inplace. */
1286 1.1 christos 0, /* src_mask */
1287 1.1 christos 0x1ffffe0, /* dst_mask */
1288 1.1 christos false, /* pcrel_offset */
1289 1.1 christos BFD_RELOC_LARCH_TLS_IE64_LO20, /* bfd_reloc_code_real_type */
1290 1.1 christos reloc_bits, /* adjust_reloc_bits */
1291 1.1 christos "ie64_lo20"), /* larch_reloc_type_name */
1292 1.1 christos
1293 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_IE64_HI12, /* type (94). */
1294 1.1 christos 52, /* rightshift. */
1295 1.1 christos 4, /* size. */
1296 1.1 christos 12, /* bitsize. */
1297 1.1 christos false, /* pc_relative. */
1298 1.1 christos 10, /* bitpos. */
1299 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1300 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1301 1.1 christos "R_LARCH_TLS_IE64_HI12", /* name. */
1302 1.1 christos false, /* partial_inplace. */
1303 1.1 christos 0, /* src_mask */
1304 1.1 christos 0x3ffc00, /* dst_mask */
1305 1.1 christos false, /* pcrel_offset */
1306 1.1 christos BFD_RELOC_LARCH_TLS_IE64_HI12, /* bfd_reloc_code_real_type */
1307 1.1 christos reloc_bits, /* adjust_reloc_bits */
1308 1.1 christos "ie64_hi12"), /* larch_reloc_type_name */
1309 1.1 christos
1310 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_LD_PC_HI20, /* type (95). */
1311 1.1 christos 12, /* rightshift. */
1312 1.1 christos 4, /* size. */
1313 1.1 christos 20, /* bitsize. */
1314 1.1 christos false, /* pc_relative. */
1315 1.1 christos 5, /* bitpos. */
1316 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1317 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1318 1.1 christos "R_LARCH_TLS_LD_PC_HI20", /* name. */
1319 1.1 christos false, /* partial_inplace. */
1320 1.1 christos 0, /* src_mask */
1321 1.1 christos 0x1ffffe0, /* dst_mask */
1322 1.1 christos false, /* pcrel_offset */
1323 1.1 christos BFD_RELOC_LARCH_TLS_LD_PC_HI20, /* bfd_reloc_code_real_type */
1324 1.1 christos reloc_bits, /* adjust_reloc_bits */
1325 1.1 christos "ld_pc_hi20"), /* larch_reloc_type_name */
1326 1.1 christos
1327 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_LD_HI20, /* type (96). */
1328 1.1 christos 12, /* rightshift. */
1329 1.1 christos 4, /* size. */
1330 1.1 christos 20, /* bitsize. */
1331 1.1 christos false, /* pc_relative. */
1332 1.1 christos 5, /* bitpos. */
1333 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1334 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1335 1.1 christos "R_LARCH_TLS_LD_HI20", /* name. */
1336 1.1 christos false, /* partial_inplace. */
1337 1.1 christos 0, /* src_mask */
1338 1.1 christos 0x1ffffe0, /* dst_mask */
1339 1.1 christos false, /* pcrel_offset */
1340 1.1 christos BFD_RELOC_LARCH_TLS_LD_HI20, /* bfd_reloc_code_real_type */
1341 1.1 christos reloc_bits, /* adjust_reloc_bits */
1342 1.1 christos "ld_hi20"), /* larch_reloc_type_name */
1343 1.1 christos
1344 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_GD_PC_HI20, /* type (97). */
1345 1.1 christos 12, /* rightshift. */
1346 1.1 christos 4, /* size. */
1347 1.1 christos 20, /* bitsize. */
1348 1.1 christos false, /* pc_relative. */
1349 1.1 christos 5, /* bitpos. */
1350 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1351 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1352 1.1 christos "R_LARCH_TLS_GD_PC_HI20", /* name. */
1353 1.1 christos false, /* partial_inplace. */
1354 1.1 christos 0, /* src_mask */
1355 1.1 christos 0x1ffffe0, /* dst_mask */
1356 1.1 christos false, /* pcrel_offset */
1357 1.1 christos BFD_RELOC_LARCH_TLS_GD_PC_HI20, /* bfd_reloc_code_real_type */
1358 1.1 christos reloc_bits, /* adjust_reloc_bits */
1359 1.1 christos "gd_pc_hi20"), /* larch_reloc_type_name */
1360 1.1 christos
1361 1.1 christos LOONGARCH_HOWTO (R_LARCH_TLS_GD_HI20, /* type (98). */
1362 1.1 christos 12, /* rightshift. */
1363 1.1 christos 4, /* size. */
1364 1.1 christos 20, /* bitsize. */
1365 1.1 christos false, /* pc_relative. */
1366 1.1 christos 5, /* bitpos. */
1367 1.1 christos complain_overflow_signed, /* complain_on_overflow. */
1368 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1369 1.1 christos "R_LARCH_TLS_GD_HI20", /* name. */
1370 1.1 christos false, /* partial_inplace. */
1371 1.1 christos 0, /* src_mask */
1372 1.1 christos 0x1ffffe0, /* dst_mask */
1373 1.1 christos false, /* pcrel_offset */
1374 1.1 christos BFD_RELOC_LARCH_TLS_GD_HI20, /* bfd_reloc_code_real_type */
1375 1.1 christos reloc_bits, /* adjust_reloc_bits */
1376 1.1 christos "gd_hi20"), /* larch_reloc_type_name */
1377 1.1 christos
1378 1.1.1.2 christos /* 32-bit PC relative. */
1379 1.1 christos LOONGARCH_HOWTO (R_LARCH_32_PCREL, /* type (99). */
1380 1.1 christos 0, /* rightshift. */
1381 1.1 christos 4, /* size. */
1382 1.1 christos 32, /* bitsize. */
1383 1.1 christos true, /* pc_relative. */
1384 1.1 christos 0, /* bitpos. */
1385 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1386 1.1 christos bfd_elf_generic_reloc, /* special_function. */
1387 1.1 christos "R_LARCH_32_PCREL", /* name. */
1388 1.1 christos false, /* partial_inplace. */
1389 1.1 christos 0, /* src_mask */
1390 1.1 christos 0xffffffff, /* dst_mask */
1391 1.1 christos false, /* pcrel_offset */
1392 1.1 christos BFD_RELOC_LARCH_32_PCREL, /* bfd_reloc_code_real_type */
1393 1.1 christos NULL, /* adjust_reloc_bits */
1394 1.1 christos NULL), /* larch_reloc_type_name */
1395 1.1 christos
1396 1.1.1.2 christos /* The paired relocation may be relaxed. */
1397 1.1 christos LOONGARCH_HOWTO (R_LARCH_RELAX, /* type (100). */
1398 1.1 christos 0, /* rightshift */
1399 1.1 christos 1, /* size */
1400 1.1 christos 0, /* bitsize */
1401 1.1 christos false, /* pc_relative */
1402 1.1 christos 0, /* bitpos */
1403 1.1 christos complain_overflow_dont, /* complain_on_overflow */
1404 1.1 christos bfd_elf_generic_reloc, /* special_function */
1405 1.1 christos "R_LARCH_RELAX", /* name */
1406 1.1 christos false, /* partial_inplace */
1407 1.1 christos 0, /* src_mask */
1408 1.1 christos 0, /* dst_mask */
1409 1.1 christos false, /* pcrel_offset */
1410 1.1 christos BFD_RELOC_LARCH_RELAX, /* bfd_reloc_code_real_type */
1411 1.1 christos NULL, /* adjust_reloc_bits */
1412 1.1 christos NULL), /* larch_reloc_type_name */
1413 1.1 christos
1414 1.1.1.2 christos /* Delete relaxed instruction. */
1415 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_DELETE, /* type (101). */
1416 1.1.1.2 christos 0, /* rightshift. */
1417 1.1.1.2 christos 0, /* size. */
1418 1.1.1.2 christos 0, /* bitsize. */
1419 1.1.1.2 christos false, /* pc_relative. */
1420 1.1.1.2 christos 0, /* bitpos. */
1421 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
1422 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1423 1.1.1.2 christos "R_LARCH_DELETE", /* name. */
1424 1.1.1.2 christos false, /* partial_inplace. */
1425 1.1.1.2 christos 0, /* src_mask. */
1426 1.1.1.2 christos 0, /* dst_mask. */
1427 1.1.1.2 christos false, /* pcrel_offset. */
1428 1.1.1.2 christos BFD_RELOC_LARCH_DELETE, /* bfd_reloc_code_real_type. */
1429 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
1430 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
1431 1.1.1.2 christos
1432 1.1.1.2 christos /* Indicates an alignment statement. f the symbol index is 0,
1433 1.1.1.2 christos the addend indicates the number of bytes occupied by nop instructions
1434 1.1.1.2 christos at the relocation offset. The alignment boundary is specified by the
1435 1.1.1.2 christos addend rounded up to the next power of two.
1436 1.1.1.2 christos If the symbol index is not 0, the addend indicates the first and third
1437 1.1.1.2 christos expressions of .align. The lowest 8 bits are used to represent the first
1438 1.1.1.2 christos expression, other bits are used to represent the third expression. */
1439 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_ALIGN, /* type (102). */
1440 1.1.1.2 christos 0, /* rightshift. */
1441 1.1.1.2 christos 0, /* size. */
1442 1.1.1.2 christos 0, /* bitsize. */
1443 1.1.1.2 christos false, /* pc_relative. */
1444 1.1.1.2 christos 0, /* bitpos. */
1445 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
1446 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1447 1.1.1.2 christos "R_LARCH_ALIGN", /* name. */
1448 1.1.1.2 christos false, /* partial_inplace. */
1449 1.1.1.2 christos 0, /* src_mask. */
1450 1.1.1.2 christos 0, /* dst_mask. */
1451 1.1.1.2 christos false, /* pcrel_offset. */
1452 1.1.1.2 christos BFD_RELOC_LARCH_ALIGN, /* bfd_reloc_code_real_type. */
1453 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
1454 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
1455 1.1.1.2 christos
1456 1.1.1.2 christos /* For pcaddi and pcala_hi20 + pcala_lo12 can relax to pcrel_20. */
1457 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_PCREL20_S2, /* type (103). */
1458 1.1.1.2 christos 2, /* rightshift. */
1459 1.1.1.2 christos 4, /* size. */
1460 1.1.1.2 christos 20, /* bitsize. */
1461 1.1.1.2 christos false, /* pc_relative. */
1462 1.1.1.2 christos 5, /* bitpos. */
1463 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1464 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1465 1.1.1.2 christos "R_LARCH_PCREL20_S2", /* name. */
1466 1.1.1.2 christos false, /* partial_inplace. */
1467 1.1.1.2 christos 0, /* src_mask. */
1468 1.1.1.2 christos 0x1ffffe0, /* dst_mask. */
1469 1.1.1.2 christos false, /* pcrel_offset. */
1470 1.1.1.2 christos BFD_RELOC_LARCH_PCREL20_S2, /* bfd_reloc_code_real_type. */
1471 1.1.1.2 christos reloc_sign_bits, /* adjust_reloc_bits. */
1472 1.1.1.2 christos "pcrel_20"), /* larch_reloc_type_name. */
1473 1.1.1.2 christos
1474 1.1.1.2 christos /* Canonical Frame Address. */
1475 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_CFA, /* type (104). */
1476 1.1.1.2 christos 0, /* rightshift. */
1477 1.1.1.2 christos 0, /* size. */
1478 1.1.1.2 christos 0, /* bitsize. */
1479 1.1.1.2 christos false, /* pc_relative. */
1480 1.1.1.2 christos 0, /* bitpos. */
1481 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
1482 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1483 1.1.1.2 christos "R_LARCH_CFA", /* name. */
1484 1.1.1.2 christos false, /* partial_inplace. */
1485 1.1.1.2 christos 0, /* src_mask. */
1486 1.1.1.2 christos 0, /* dst_mask. */
1487 1.1.1.2 christos false, /* pcrel_offset. */
1488 1.1.1.2 christos BFD_RELOC_LARCH_CFA, /* bfd_reloc_code_real_type. */
1489 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
1490 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
1491 1.1.1.2 christos
1492 1.1.1.2 christos /* 6-bit in-place addition, for local label subtraction
1493 1.1.1.2 christos to calculate DW_CFA_advance_loc. */
1494 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_ADD6, /* type (105). */
1495 1.1.1.2 christos 0, /* rightshift. */
1496 1.1.1.2 christos 1, /* size. */
1497 1.1.1.2 christos 8, /* bitsize. */
1498 1.1.1.2 christos false, /* pc_relative. */
1499 1.1.1.2 christos 0, /* bitpos. */
1500 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
1501 1.1.1.2 christos loongarch_elf_add_sub_reloc, /* special_function. */
1502 1.1.1.2 christos "R_LARCH_ADD6", /* name. */
1503 1.1.1.2 christos false, /* partial_inplace. */
1504 1.1.1.2 christos 0, /* src_mask. */
1505 1.1.1.2 christos 0x3f, /* dst_mask. */
1506 1.1.1.2 christos false, /* pcrel_offset. */
1507 1.1.1.2 christos BFD_RELOC_LARCH_ADD6, /* bfd_reloc_code_real_type. */
1508 1.1.1.2 christos reloc_bits, /* adjust_reloc_bits. */
1509 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
1510 1.1.1.2 christos
1511 1.1.1.2 christos /* 6-bit in-place subtraction, for local label subtraction
1512 1.1.1.2 christos to calculate DW_CFA_advance_loc. */
1513 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_SUB6, /* type (106). */
1514 1.1.1.2 christos 0, /* rightshift. */
1515 1.1.1.2 christos 1, /* size. */
1516 1.1.1.2 christos 8, /* bitsize. */
1517 1.1.1.2 christos false, /* pc_relative. */
1518 1.1.1.2 christos 0, /* bitpos. */
1519 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
1520 1.1.1.2 christos loongarch_elf_add_sub_reloc, /* special_function. */
1521 1.1.1.2 christos "R_LARCH_SUB6", /* name. */
1522 1.1.1.2 christos false, /* partial_inplace. */
1523 1.1.1.2 christos 0, /* src_mask. */
1524 1.1.1.2 christos 0x3f, /* dst_mask. */
1525 1.1.1.2 christos false, /* pcrel_offset. */
1526 1.1.1.2 christos BFD_RELOC_LARCH_SUB6, /* bfd_reloc_code_real_type. */
1527 1.1.1.2 christos reloc_bits, /* adjust_reloc_bits. */
1528 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
1529 1.1.1.2 christos
1530 1.1.1.2 christos /* The length of unsigned-leb128 is variable, just assume the
1531 1.1.1.2 christos size is one byte here.
1532 1.1.1.2 christos uleb128 in-place addition, for local label subtraction. */
1533 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_ADD_ULEB128, /* type (107). */
1534 1.1.1.2 christos 0, /* rightshift. */
1535 1.1.1.2 christos 1, /* size. */
1536 1.1.1.2 christos 0, /* bitsize. */
1537 1.1.1.2 christos false, /* pc_relative. */
1538 1.1.1.2 christos 0, /* bitpos. */
1539 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
1540 1.1.1.2 christos loongarch_elf_add_sub_reloc_uleb128, /* special_function. */
1541 1.1.1.2 christos "R_LARCH_ADD_ULEB128", /* name. */
1542 1.1.1.2 christos false, /* partial_inplace. */
1543 1.1.1.2 christos 0, /* src_mask. */
1544 1.1.1.2 christos 0, /* dst_mask. */
1545 1.1.1.2 christos false, /* pcrel_offset. */
1546 1.1.1.2 christos BFD_RELOC_LARCH_ADD_ULEB128, /* bfd_reloc_code_real_type. */
1547 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
1548 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
1549 1.1.1.2 christos
1550 1.1.1.2 christos /* The length of unsigned-leb128 is variable, just assume the
1551 1.1.1.2 christos size is one byte here.
1552 1.1.1.2 christos uleb128 in-place subtraction, for local label subtraction. */
1553 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_SUB_ULEB128, /* type (108). */
1554 1.1.1.2 christos 0, /* rightshift. */
1555 1.1.1.2 christos 1, /* size. */
1556 1.1.1.2 christos 0, /* bitsize. */
1557 1.1.1.2 christos false, /* pc_relative. */
1558 1.1.1.2 christos 0, /* bitpos. */
1559 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
1560 1.1.1.2 christos loongarch_elf_add_sub_reloc_uleb128, /* special_function. */
1561 1.1.1.2 christos "R_LARCH_SUB_ULEB128", /* name. */
1562 1.1.1.2 christos false, /* partial_inplace. */
1563 1.1.1.2 christos 0, /* src_mask. */
1564 1.1.1.2 christos 0, /* dst_mask. */
1565 1.1.1.2 christos false, /* pcrel_offset. */
1566 1.1.1.2 christos BFD_RELOC_LARCH_SUB_ULEB128, /* bfd_reloc_code_real_type. */
1567 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
1568 1.1.1.2 christos NULL), /* larch_reloc_type_name. */
1569 1.1.1.2 christos
1570 1.1.1.2 christos /* 64-bit PC relative. */
1571 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_64_PCREL, /* type (109). */
1572 1.1.1.2 christos 0, /* rightshift. */
1573 1.1.1.2 christos 8, /* size. */
1574 1.1.1.2 christos 64, /* bitsize. */
1575 1.1.1.2 christos true, /* pc_relative. */
1576 1.1.1.2 christos 0, /* bitpos. */
1577 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1578 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1579 1.1.1.2 christos "R_LARCH_64_PCREL", /* name. */
1580 1.1.1.2 christos false, /* partial_inplace. */
1581 1.1.1.2 christos 0, /* src_mask */
1582 1.1.1.2 christos 0xffffffffffffffff, /* dst_mask */
1583 1.1.1.2 christos false, /* pcrel_offset */
1584 1.1.1.2 christos BFD_RELOC_LARCH_64_PCREL, /* bfd_reloc_code_real_type */
1585 1.1.1.2 christos NULL, /* adjust_reloc_bits */
1586 1.1.1.2 christos NULL), /* larch_reloc_type_name */
1587 1.1.1.2 christos
1588 1.1.1.2 christos /* Used for medium code model function call pcaddu18i+jirl,
1589 1.1.1.2 christos these two instructions must adjacent. */
1590 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_CALL36, /* type (110). */
1591 1.1.1.2 christos 2, /* rightshift. */
1592 1.1.1.2 christos 8, /* size. */
1593 1.1.1.2 christos 36, /* bitsize. */
1594 1.1.1.2 christos true, /* pc_relative. */
1595 1.1.1.2 christos 0, /* bitpos. */
1596 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1597 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1598 1.1.1.2 christos "R_LARCH_CALL36", /* name. */
1599 1.1.1.2 christos false, /* partial_inplace. */
1600 1.1.1.2 christos 0, /* src_mask. */
1601 1.1.1.2 christos 0x03fffc0001ffffe0, /* dst_mask. */
1602 1.1.1.2 christos false, /* pcrel_offset. */
1603 1.1.1.2 christos BFD_RELOC_LARCH_CALL36, /* bfd_reloc_code_real_type. */
1604 1.1.1.2 christos reloc_sign_bits, /* adjust_reloc_bits. */
1605 1.1.1.2 christos "call36"), /* larch_reloc_type_name. */
1606 1.1.1.2 christos
1607 1.1.1.2 christos /* TLS_DESC PCREL. */
1608 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_DESC_PC_HI20, /* type (111). */
1609 1.1.1.2 christos 12, /* rightshift. */
1610 1.1.1.2 christos 4, /* size. */
1611 1.1.1.2 christos 20, /* bitsize. */
1612 1.1.1.2 christos true, /* pc_relative. */
1613 1.1.1.2 christos 5, /* bitpos. */
1614 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1615 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1616 1.1.1.2 christos "R_LARCH_TLS_DESC_PC_HI20", /* name. */
1617 1.1.1.2 christos false, /* partial_inplace. */
1618 1.1.1.2 christos 0, /* src_mask. */
1619 1.1.1.2 christos 0x1ffffe0, /* dst_mask. */
1620 1.1.1.2 christos false, /* pcrel_offset. */
1621 1.1.1.2 christos BFD_RELOC_LARCH_TLS_DESC_PC_HI20, /* bfd_reloc_code_real_type. */
1622 1.1.1.2 christos reloc_bits, /* adjust_reloc_bits. */
1623 1.1.1.2 christos "desc_pc_hi20"), /* larch_reloc_type_name. */
1624 1.1.1.2 christos
1625 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_DESC_PC_LO12, /* type (112). */
1626 1.1.1.2 christos 0, /* rightshift. */
1627 1.1.1.2 christos 4, /* size. */
1628 1.1.1.2 christos 12, /* bitsize. */
1629 1.1.1.2 christos true, /* pc_relative. */
1630 1.1.1.2 christos 10, /* bitpos. */
1631 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1632 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1633 1.1.1.2 christos "R_LARCH_TLS_DESC_PC_LO12", /* name. */
1634 1.1.1.2 christos false, /* partial_inplace. */
1635 1.1.1.2 christos 0, /* src_mask. */
1636 1.1.1.2 christos 0x3ffc00, /* dst_mask. */
1637 1.1.1.2 christos false, /* pcrel_offset. */
1638 1.1.1.2 christos BFD_RELOC_LARCH_TLS_DESC_PC_LO12, /* bfd_reloc_code_real_type. */
1639 1.1.1.2 christos reloc_bits, /* adjust_reloc_bits. */
1640 1.1.1.2 christos "desc_pc_lo12"), /* larch_reloc_type_name. */
1641 1.1.1.2 christos
1642 1.1.1.2 christos /* TLS_DESC64 LARGE PCREL. */
1643 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_DESC64_PC_LO20, /* type (113). */
1644 1.1.1.2 christos 32, /* rightshift. */
1645 1.1.1.2 christos 8, /* size. */
1646 1.1.1.2 christos 20, /* bitsize. */
1647 1.1.1.2 christos true, /* pc_relative. */
1648 1.1.1.2 christos 5, /* bitpos. */
1649 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1650 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1651 1.1.1.2 christos "R_LARCH_TLS_DESC64_PC_LO20", /* name. */
1652 1.1.1.2 christos false, /* partial_inplace. */
1653 1.1.1.2 christos 0, /* src_mask. */
1654 1.1.1.2 christos 0x1ffffe0, /* dst_mask. */
1655 1.1.1.2 christos false, /* pcrel_offset. */
1656 1.1.1.2 christos BFD_RELOC_LARCH_TLS_DESC64_PC_LO20, /* bfd_reloc_code_real_type. */
1657 1.1.1.2 christos reloc_bits, /* adjust_reloc_bits. */
1658 1.1.1.2 christos "desc64_pc_lo20"), /* larch_reloc_type_name. */
1659 1.1.1.2 christos
1660 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_DESC64_PC_HI12, /* type (114). */
1661 1.1.1.2 christos 52, /* rightshift. */
1662 1.1.1.2 christos 8, /* size. */
1663 1.1.1.2 christos 12, /* bitsize. */
1664 1.1.1.2 christos true, /* pc_relative. */
1665 1.1.1.2 christos 10, /* bitpos. */
1666 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1667 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1668 1.1.1.2 christos "R_LARCH_TLS_DESC64_PC_HI12", /* name. */
1669 1.1.1.2 christos false, /* partial_inplace. */
1670 1.1.1.2 christos 0, /* src_mask. */
1671 1.1.1.2 christos 0x3ffc00, /* dst_mask. */
1672 1.1.1.2 christos false, /* pcrel_offset. */
1673 1.1.1.2 christos BFD_RELOC_LARCH_TLS_DESC64_PC_HI12, /* bfd_reloc_code_real_type. */
1674 1.1.1.2 christos reloc_bits, /* adjust_reloc_bits. */
1675 1.1.1.2 christos "desc64_pc_hi12"), /* larch_reloc_type_name. */
1676 1.1.1.2 christos
1677 1.1.1.2 christos /* TLS_DESC ABS. */
1678 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_DESC_HI20, /* type (115). */
1679 1.1.1.2 christos 12, /* rightshift. */
1680 1.1.1.2 christos 4, /* size. */
1681 1.1.1.2 christos 20, /* bitsize. */
1682 1.1.1.2 christos false, /* pc_relative. */
1683 1.1.1.2 christos 5, /* bitpos. */
1684 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1685 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1686 1.1.1.2 christos "R_LARCH_TLS_DESC_HI20", /* name. */
1687 1.1.1.2 christos false, /* partial_inplace. */
1688 1.1.1.2 christos 0, /* src_mask. */
1689 1.1.1.2 christos 0x1ffffe0, /* dst_mask. */
1690 1.1.1.2 christos false, /* pcrel_offset. */
1691 1.1.1.2 christos BFD_RELOC_LARCH_TLS_DESC_HI20, /* bfd_reloc_code_real_type. */
1692 1.1.1.2 christos reloc_bits, /* adjust_reloc_bits. */
1693 1.1.1.2 christos "desc_hi20"), /* larch_reloc_type_name. */
1694 1.1.1.2 christos
1695 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_DESC_LO12, /* type (116). */
1696 1.1.1.2 christos 0, /* rightshift. */
1697 1.1.1.2 christos 4, /* size. */
1698 1.1.1.2 christos 12, /* bitsize. */
1699 1.1.1.2 christos false, /* pc_relative. */
1700 1.1.1.2 christos 10, /* bitpos. */
1701 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1702 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1703 1.1.1.2 christos "R_LARCH_TLS_DESC_LO12", /* name. */
1704 1.1.1.2 christos false, /* partial_inplace. */
1705 1.1.1.2 christos 0, /* src_mask. */
1706 1.1.1.2 christos 0x3ffc00, /* dst_mask. */
1707 1.1.1.2 christos false, /* pcrel_offset. */
1708 1.1.1.2 christos BFD_RELOC_LARCH_TLS_DESC_LO12, /* bfd_reloc_code_real_type. */
1709 1.1.1.2 christos reloc_bits, /* adjust_reloc_bits. */
1710 1.1.1.2 christos "desc_lo12"), /* larch_reloc_type_name. */
1711 1.1.1.2 christos
1712 1.1.1.2 christos /* TLS_DESC64 LARGE ABS. */
1713 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_DESC64_LO20, /* type (117). */
1714 1.1.1.2 christos 32, /* rightshift. */
1715 1.1.1.2 christos 8, /* size. */
1716 1.1.1.2 christos 20, /* bitsize. */
1717 1.1.1.2 christos false, /* pc_relative. */
1718 1.1.1.2 christos 5, /* bitpos. */
1719 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1720 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1721 1.1.1.2 christos "R_LARCH_TLS_DESC64_LO20", /* name. */
1722 1.1.1.2 christos false, /* partial_inplace. */
1723 1.1.1.2 christos 0, /* src_mask. */
1724 1.1.1.2 christos 0x1ffffe0, /* dst_mask. */
1725 1.1.1.2 christos false, /* pcrel_offset. */
1726 1.1.1.2 christos BFD_RELOC_LARCH_TLS_DESC64_LO20, /* bfd_reloc_code_real_type. */
1727 1.1.1.2 christos reloc_bits, /* adjust_reloc_bits. */
1728 1.1.1.2 christos "desc64_lo20"), /* larch_reloc_type_name. */
1729 1.1.1.2 christos
1730 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_DESC64_HI12, /* type (118). */
1731 1.1.1.2 christos 52, /* rightshift. */
1732 1.1.1.2 christos 8, /* size. */
1733 1.1.1.2 christos 12, /* bitsize. */
1734 1.1.1.2 christos false, /* pc_relative. */
1735 1.1.1.2 christos 10, /* bitpos. */
1736 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1737 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1738 1.1.1.2 christos "R_LARCH_TLS_DESC64_HI12", /* name. */
1739 1.1.1.2 christos false, /* partial_inplace. */
1740 1.1.1.2 christos 0, /* src_mask. */
1741 1.1.1.2 christos 0x3ffc00, /* dst_mask. */
1742 1.1.1.2 christos false, /* pcrel_offset. */
1743 1.1.1.2 christos BFD_RELOC_LARCH_TLS_DESC64_HI12, /* bfd_reloc_code_real_type. */
1744 1.1.1.2 christos reloc_bits, /* adjust_reloc_bits. */
1745 1.1.1.2 christos "desc64_hi12"), /* larch_reloc_type_name. */
1746 1.1.1.2 christos
1747 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_DESC_LD, /* type (119). */
1748 1.1.1.2 christos 0, /* rightshift. */
1749 1.1.1.2 christos 4, /* size. */
1750 1.1.1.2 christos 0, /* bitsize. */
1751 1.1.1.2 christos true, /* pc_relative. */
1752 1.1.1.2 christos 0, /* bitpos. */
1753 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1754 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1755 1.1.1.2 christos "R_LARCH_TLS_DESC_LD", /* name. */
1756 1.1.1.2 christos false, /* partial_inplace. */
1757 1.1.1.2 christos 0, /* src_mask. */
1758 1.1.1.2 christos 0, /* dst_mask. */
1759 1.1.1.2 christos false, /* pcrel_offset. */
1760 1.1.1.2 christos BFD_RELOC_LARCH_TLS_DESC_LD, /* bfd_reloc_code_real_type. */
1761 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
1762 1.1.1.2 christos "desc_ld"), /* larch_reloc_type_name. */
1763 1.1.1.2 christos
1764 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_DESC_CALL, /* type (120). */
1765 1.1.1.2 christos 0, /* rightshift. */
1766 1.1.1.2 christos 4, /* size. */
1767 1.1.1.2 christos 0, /* bitsize. */
1768 1.1.1.2 christos false, /* pc_relative. */
1769 1.1.1.2 christos 0, /* bitpos. */
1770 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
1771 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1772 1.1.1.2 christos "R_LARCH_TLS_DESC_CALL", /* name. */
1773 1.1.1.2 christos false, /* partial_inplace. */
1774 1.1.1.2 christos 0, /* src_mask. */
1775 1.1.1.2 christos 0, /* dst_mask. */
1776 1.1.1.2 christos false, /* pcrel_offset. */
1777 1.1.1.2 christos BFD_RELOC_LARCH_TLS_DESC_CALL, /* bfd_reloc_code_real_type. */
1778 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
1779 1.1.1.2 christos "desc_call"), /* larch_reloc_type_name. */
1780 1.1.1.2 christos
1781 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_LE_HI20_R, /* type (121). */
1782 1.1.1.2 christos 12, /* rightshift. */
1783 1.1.1.2 christos 4, /* size. */
1784 1.1.1.2 christos 20, /* bitsize. */
1785 1.1.1.2 christos false, /* pc_relative. */
1786 1.1.1.2 christos 5, /* bitpos. */
1787 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1788 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1789 1.1.1.2 christos "R_LARCH_TLS_LE_HI20_R", /* name. */
1790 1.1.1.2 christos false, /* partial_inplace. */
1791 1.1.1.2 christos 0, /* src_mask. */
1792 1.1.1.2 christos 0x1ffffe0, /* dst_mask. */
1793 1.1.1.2 christos false, /* pcrel_offset. */
1794 1.1.1.2 christos BFD_RELOC_LARCH_TLS_LE_HI20_R, /* bfd_reloc_code_real_type. */
1795 1.1.1.2 christos reloc_bits, /* adjust_reloc_bits. */
1796 1.1.1.2 christos "le_hi20_r"), /* larch_reloc_type_name. */
1797 1.1.1.2 christos
1798 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_LE_ADD_R, /* type (122). */
1799 1.1.1.2 christos 0, /* rightshift. */
1800 1.1.1.2 christos 0, /* size. */
1801 1.1.1.2 christos 0, /* bitsize. */
1802 1.1.1.2 christos false, /* pc_relative. */
1803 1.1.1.2 christos 0, /* bitpos. */
1804 1.1.1.2 christos complain_overflow_dont, /* complain_on_overflow. */
1805 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1806 1.1.1.2 christos "R_LARCH_TLS_LE_ADD_R", /* name. */
1807 1.1.1.2 christos false, /* partial_inplace. */
1808 1.1.1.2 christos 0, /* src_mask. */
1809 1.1.1.2 christos 0, /* dst_mask. */
1810 1.1.1.2 christos false, /* pcrel_offset. */
1811 1.1.1.2 christos BFD_RELOC_LARCH_TLS_LE_ADD_R, /* bfd_reloc_code_real_type. */
1812 1.1.1.2 christos NULL, /* adjust_reloc_bits. */
1813 1.1.1.2 christos "le_add_r"), /* larch_reloc_type_name. */
1814 1.1.1.2 christos
1815 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_LE_LO12_R, /* type (123). */
1816 1.1.1.2 christos 0, /* rightshift. */
1817 1.1.1.2 christos 4, /* size. */
1818 1.1.1.2 christos 12, /* bitsize. */
1819 1.1.1.2 christos false, /* pc_relative. */
1820 1.1.1.2 christos 10, /* bitpos. */
1821 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1822 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1823 1.1.1.2 christos "R_LARCH_TLS_LE_LO12_R", /* name. */
1824 1.1.1.2 christos false, /* partial_inplace. */
1825 1.1.1.2 christos 0, /* src_mask. */
1826 1.1.1.2 christos 0x3ffc00, /* dst_mask. */
1827 1.1.1.2 christos false, /* pcrel_offset. */
1828 1.1.1.2 christos BFD_RELOC_LARCH_TLS_LE_LO12_R, /* bfd_reloc_code_real_type. */
1829 1.1.1.2 christos reloc_bits, /* adjust_reloc_bits. */
1830 1.1.1.2 christos "le_lo12_r"), /* larch_reloc_type_name. */
1831 1.1.1.2 christos
1832 1.1.1.2 christos /* For pcaddi, ld_pc_hi20 + ld_pc_lo12 can relax to ld_pcrel20_s2. */
1833 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_LD_PCREL20_S2, /* type (124). */
1834 1.1.1.2 christos 2, /* rightshift. */
1835 1.1.1.2 christos 4, /* size. */
1836 1.1.1.2 christos 20, /* bitsize. */
1837 1.1.1.2 christos false, /* pc_relative. */
1838 1.1.1.2 christos 5, /* bitpos. */
1839 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1840 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1841 1.1.1.2 christos "R_LARCH_TLS_LD_PCREL20_S2", /* name. */
1842 1.1.1.2 christos false, /* partial_inplace. */
1843 1.1.1.2 christos 0, /* src_mask. */
1844 1.1.1.2 christos 0x1ffffe0, /* dst_mask. */
1845 1.1.1.2 christos true, /* pcrel_offset. */
1846 1.1.1.2 christos BFD_RELOC_LARCH_TLS_LD_PCREL20_S2, /* bfd_reloc_code_real_type. */
1847 1.1.1.2 christos reloc_sign_bits, /* adjust_reloc_bits. */
1848 1.1.1.2 christos "ld_pcrel_20"), /* larch_reloc_type_name. */
1849 1.1.1.2 christos
1850 1.1.1.2 christos /* For pcaddi, gd_pc_hi20 + gd_pc_lo12 can relax to gd_pcrel20_s2. */
1851 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_GD_PCREL20_S2, /* type (125). */
1852 1.1.1.2 christos 2, /* rightshift. */
1853 1.1.1.2 christos 4, /* size. */
1854 1.1.1.2 christos 20, /* bitsize. */
1855 1.1.1.2 christos false, /* pc_relative. */
1856 1.1.1.2 christos 5, /* bitpos. */
1857 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1858 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1859 1.1.1.2 christos "R_LARCH_TLS_GD_PCREL20_S2", /* name. */
1860 1.1.1.2 christos false, /* partial_inplace. */
1861 1.1.1.2 christos 0, /* src_mask. */
1862 1.1.1.2 christos 0x1ffffe0, /* dst_mask. */
1863 1.1.1.2 christos true, /* pcrel_offset. */
1864 1.1.1.2 christos BFD_RELOC_LARCH_TLS_GD_PCREL20_S2, /* bfd_reloc_code_real_type. */
1865 1.1.1.2 christos reloc_sign_bits, /* adjust_reloc_bits. */
1866 1.1.1.2 christos "gd_pcrel_20"), /* larch_reloc_type_name. */
1867 1.1.1.2 christos
1868 1.1.1.2 christos /* For pcaddi, desc_pc_hi20 + desc_pc_lo12 can relax to desc_pcrel20_s2. */
1869 1.1.1.2 christos LOONGARCH_HOWTO (R_LARCH_TLS_DESC_PCREL20_S2, /* type (126). */
1870 1.1.1.2 christos 2, /* rightshift. */
1871 1.1.1.2 christos 4, /* size. */
1872 1.1.1.2 christos 20, /* bitsize. */
1873 1.1.1.2 christos false, /* pc_relative. */
1874 1.1.1.2 christos 5, /* bitpos. */
1875 1.1.1.2 christos complain_overflow_signed, /* complain_on_overflow. */
1876 1.1.1.2 christos bfd_elf_generic_reloc, /* special_function. */
1877 1.1.1.2 christos "R_LARCH_TLS_DESC_PCREL20_S2", /* name. */
1878 1.1.1.2 christos false, /* partial_inplace. */
1879 1.1.1.2 christos 0, /* src_mask. */
1880 1.1.1.2 christos 0x1ffffe0, /* dst_mask. */
1881 1.1.1.2 christos true, /* pcrel_offset. */
1882 1.1.1.2 christos BFD_RELOC_LARCH_TLS_DESC_PCREL20_S2, /* bfd_reloc_code_real_type. */
1883 1.1.1.2 christos reloc_sign_bits, /* adjust_reloc_bits. */
1884 1.1.1.2 christos "desc_pcrel_20"), /* larch_reloc_type_name. */
1885 1.1 christos };
1886 1.1 christos
1887 1.1 christos reloc_howto_type *
1888 1.1 christos loongarch_elf_rtype_to_howto (bfd *abfd, unsigned int r_type)
1889 1.1 christos {
1890 1.1.1.2 christos if (r_type < R_LARCH_count)
1891 1.1 christos {
1892 1.1 christos BFD_ASSERT (ARRAY_SIZE (loongarch_howto_table) == R_LARCH_count);
1893 1.1.1.2 christos BFD_ASSERT (loongarch_howto_table[r_type].howto.type == r_type);
1894 1.1.1.2 christos return &loongarch_howto_table[r_type].howto;
1895 1.1 christos }
1896 1.1 christos
1897 1.1 christos (*_bfd_error_handler) (_("%pB: unsupported relocation type %#x"),
1898 1.1 christos abfd, r_type);
1899 1.1 christos bfd_set_error (bfd_error_bad_value);
1900 1.1 christos return NULL;
1901 1.1 christos }
1902 1.1 christos
1903 1.1 christos reloc_howto_type *
1904 1.1 christos loongarch_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
1905 1.1 christos {
1906 1.1 christos for (size_t i = 0; i < ARRAY_SIZE (loongarch_howto_table); i++)
1907 1.1 christos if (loongarch_howto_table[i].howto.name
1908 1.1 christos && strcasecmp (loongarch_howto_table[i].howto.name, r_name) == 0)
1909 1.1.1.2 christos return &loongarch_howto_table[i].howto;
1910 1.1 christos
1911 1.1 christos (*_bfd_error_handler) (_("%pB: unsupported relocation type %s"),
1912 1.1 christos abfd, r_name);
1913 1.1 christos bfd_set_error (bfd_error_bad_value);
1914 1.1 christos return NULL;
1915 1.1 christos }
1916 1.1 christos
1917 1.1 christos /* Cost so much. */
1918 1.1 christos reloc_howto_type *
1919 1.1 christos loongarch_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1920 1.1 christos bfd_reloc_code_real_type code)
1921 1.1 christos {
1922 1.1 christos BFD_ASSERT (ARRAY_SIZE (loongarch_howto_table) == R_LARCH_count);
1923 1.1 christos
1924 1.1 christos /* Fast search for new reloc types. */
1925 1.1 christos if (BFD_RELOC_LARCH_B16 <= code && code < BFD_RELOC_LARCH_RELAX)
1926 1.1 christos {
1927 1.1 christos BFD_ASSERT (BFD_RELOC_LARCH_RELAX - BFD_RELOC_LARCH_B16
1928 1.1 christos == R_LARCH_RELAX - R_LARCH_B16);
1929 1.1.1.2 christos loongarch_reloc_howto_type *ht;
1930 1.1 christos ht = &loongarch_howto_table[code - BFD_RELOC_LARCH_B16 + R_LARCH_B16];
1931 1.1 christos BFD_ASSERT (ht->bfd_type == code);
1932 1.1.1.2 christos return &ht->howto;
1933 1.1 christos }
1934 1.1 christos
1935 1.1 christos for (size_t i = 0; i < ARRAY_SIZE (loongarch_howto_table); i++)
1936 1.1 christos if (loongarch_howto_table[i].bfd_type == code)
1937 1.1.1.2 christos return &loongarch_howto_table[i].howto;
1938 1.1 christos
1939 1.1 christos (*_bfd_error_handler) (_("%pB: unsupported bfd relocation type %#x"),
1940 1.1 christos abfd, code);
1941 1.1 christos bfd_set_error (bfd_error_bad_value);
1942 1.1 christos return NULL;
1943 1.1 christos }
1944 1.1 christos
1945 1.1 christos bfd_reloc_code_real_type
1946 1.1 christos loongarch_larch_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1947 1.1 christos const char *l_r_name)
1948 1.1 christos {
1949 1.1 christos for (size_t i = 0; i < ARRAY_SIZE (loongarch_howto_table); i++)
1950 1.1 christos {
1951 1.1 christos loongarch_reloc_howto_type *lht = &loongarch_howto_table[i];
1952 1.1 christos if ((NULL != lht->larch_reloc_type_name)
1953 1.1 christos && (0 == strcmp (lht->larch_reloc_type_name, l_r_name)))
1954 1.1 christos return lht->bfd_type;
1955 1.1 christos }
1956 1.1 christos
1957 1.1 christos return BFD_RELOC_NONE;
1958 1.1 christos }
1959 1.1 christos
1960 1.1 christos
1961 1.1 christos /* Functions for reloc bits field.
1962 1.1 christos 1. Signed extend *fix_val.
1963 1.1 christos 2. Return false if overflow. */
1964 1.1 christos
1965 1.1 christos #define LARCH_RELOC_BFD_VMA_BIT_MASK(bitsize) \
1966 1.1 christos (~((((bfd_vma)0x1) << (bitsize)) - 1))
1967 1.1 christos
1968 1.1 christos /* Adjust val to perform insn
1969 1.1 christos BFD_RELOC_LARCH_SOP_POP_32_S_10_5
1970 1.1 christos BFD_RELOC_LARCH_SOP_POP_32_S_10_12
1971 1.1 christos BFD_RELOC_LARCH_SOP_POP_32_U_10_12
1972 1.1 christos BFD_RELOC_LARCH_SOP_POP_32_S_10_16
1973 1.1 christos BFD_RELOC_LARCH_SOP_POP_32_S_5_20
1974 1.1 christos BFD_RELOC_LARCH_SOP_POP_32_U. */
1975 1.1.1.2 christos
1976 1.1 christos static bool
1977 1.1.1.2 christos reloc_bits (bfd *abfd ATTRIBUTE_UNUSED,
1978 1.1.1.2 christos reloc_howto_type *howto,
1979 1.1.1.2 christos bfd_vma *fix_val)
1980 1.1 christos {
1981 1.1.1.2 christos bfd_signed_vma val = (bfd_signed_vma)(*fix_val);
1982 1.1.1.2 christos bfd_signed_vma mask = ((bfd_signed_vma)0x1 << howto->bitsize) - 1;
1983 1.1.1.2 christos
1984 1.1.1.2 christos val = val >> howto->rightshift;
1985 1.1 christos
1986 1.1 christos /* Perform insn bits field. */
1987 1.1.1.2 christos val = val & mask;
1988 1.1 christos val <<= howto->bitpos;
1989 1.1 christos
1990 1.1 christos *fix_val = (bfd_vma)val;
1991 1.1 christos
1992 1.1 christos return true;
1993 1.1 christos }
1994 1.1 christos
1995 1.1 christos static bool
1996 1.1.1.2 christos reloc_bits_sanity (bfd *abfd, reloc_howto_type *howto, bfd_vma *fix_val,
1997 1.1.1.2 christos unsigned int sign)
1998 1.1 christos {
1999 1.1.1.2 christos if ((sign && howto->complain_on_overflow != complain_overflow_signed)
2000 1.1.1.2 christos || (!sign && howto->complain_on_overflow != complain_overflow_unsigned))
2001 1.1 christos return false;
2002 1.1 christos
2003 1.1.1.2 christos bfd_signed_vma val = (bfd_signed_vma)(*fix_val);
2004 1.1 christos
2005 1.1.1.2 christos /* Check alignment. FIXME: if rightshift is not alingment. */
2006 1.1.1.2 christos if (howto->rightshift
2007 1.1.1.2 christos && (val & ((((bfd_signed_vma) 1) << howto->rightshift) - 1)))
2008 1.1.1.2 christos {
2009 1.1.1.2 christos /* The as passes NULL casued internal error, so it can not use _bfd_error_handler
2010 1.1.1.2 christos output details, ld is not affected. */
2011 1.1.1.2 christos if (abfd != NULL)
2012 1.1.1.2 christos {
2013 1.1.1.2 christos (*_bfd_error_handler) (_("%pB: relocation %s right shift %d error 0x%lx"),
2014 1.1.1.2 christos abfd, howto->name, howto->rightshift, (long) val);
2015 1.1.1.2 christos bfd_set_error (bfd_error_bad_value);
2016 1.1.1.2 christos }
2017 1.1.1.2 christos return false;
2018 1.1.1.2 christos }
2019 1.1 christos
2020 1.1.1.2 christos bfd_signed_vma mask = ((bfd_signed_vma)0x1 << (howto->bitsize
2021 1.1.1.2 christos + howto->rightshift - sign)) - 1;
2022 1.1 christos
2023 1.1.1.2 christos /* Positive number: high part is all 0;
2024 1.1.1.2 christos Negative number: if high part is not all 0, high part must be all 1.
2025 1.1.1.2 christos high part: from sign bit to highest bit. */
2026 1.1.1.2 christos if ((val & ~mask) && ((val & ~mask) != ~mask))
2027 1.1 christos {
2028 1.1.1.2 christos /* The as passes NULL casued internal error, so it can not use _bfd_error_handler
2029 1.1.1.2 christos output details, ld is not affected. */
2030 1.1.1.2 christos if (abfd != NULL)
2031 1.1.1.2 christos {
2032 1.1.1.2 christos (*_bfd_error_handler) (_("%pB: relocation %s overflow 0x%lx"),
2033 1.1.1.2 christos abfd, howto->name, (long) val);
2034 1.1.1.2 christos bfd_set_error (bfd_error_bad_value);
2035 1.1.1.2 christos }
2036 1.1.1.2 christos return false;
2037 1.1 christos }
2038 1.1.1.2 christos
2039 1.1.1.2 christos val = val >> howto->rightshift;
2040 1.1.1.2 christos /* can delete? */
2041 1.1.1.2 christos mask = ((bfd_signed_vma)0x1 << howto->bitsize) - 1;
2042 1.1.1.2 christos val = val & mask;
2043 1.1.1.2 christos
2044 1.1.1.2 christos switch (howto->type)
2045 1.1 christos {
2046 1.1.1.2 christos case R_LARCH_SOP_POP_32_S_0_10_10_16_S2:
2047 1.1.1.2 christos case R_LARCH_B26:
2048 1.1.1.2 christos /* Perform insn bits field. 15:0<<10, 25:16>>16. */
2049 1.1.1.2 christos val = ((val & 0xffff) << 10) | ((val >> 16) & 0x3ff);
2050 1.1.1.2 christos break;
2051 1.1.1.2 christos case R_LARCH_SOP_POP_32_S_0_5_10_16_S2:
2052 1.1.1.2 christos case R_LARCH_B21:
2053 1.1.1.2 christos /* Perform insn bits field. 15:0<<10, 20:16>>16. */
2054 1.1.1.2 christos val = ((val & 0xffff) << 10) | ((val >> 16) & 0x1f);
2055 1.1.1.2 christos break;
2056 1.1.1.2 christos case R_LARCH_CALL36:
2057 1.1.1.2 christos /* 0x8000: If low 16-bit immediate greater than 0x7fff,
2058 1.1.1.2 christos it become to a negative number due to sign-extended,
2059 1.1.1.2 christos so the high part need to add 0x8000. */
2060 1.1.1.2 christos val = (((val + 0x8000) >> 16) << 5) | (((val & 0xffff) << 10) << 32);
2061 1.1.1.2 christos break;
2062 1.1.1.2 christos default:
2063 1.1.1.2 christos val <<= howto->bitpos;
2064 1.1.1.2 christos break;
2065 1.1 christos }
2066 1.1 christos
2067 1.1 christos *fix_val = val;
2068 1.1 christos return true;
2069 1.1 christos }
2070 1.1 christos
2071 1.1 christos static bool
2072 1.1.1.2 christos reloc_sign_bits (bfd *abfd, reloc_howto_type *howto, bfd_vma *fix_val)
2073 1.1 christos {
2074 1.1.1.2 christos return reloc_bits_sanity (abfd, howto, fix_val, 1);
2075 1.1.1.2 christos }
2076 1.1 christos
2077 1.1.1.2 christos static bool
2078 1.1.1.2 christos reloc_unsign_bits (bfd *abfd, reloc_howto_type *howto, bfd_vma *fix_val)
2079 1.1.1.2 christos {
2080 1.1.1.2 christos return reloc_bits_sanity (abfd, howto, fix_val, 0);
2081 1.1.1.2 christos }
2082 1.1 christos
2083 1.1.1.2 christos bool
2084 1.1.1.2 christos loongarch_adjust_reloc_bitsfield (bfd *abfd, reloc_howto_type *howto,
2085 1.1.1.2 christos bfd_vma *fix_val)
2086 1.1.1.2 christos {
2087 1.1.1.2 christos BFD_ASSERT (((loongarch_reloc_howto_type *)howto)->adjust_reloc_bits);
2088 1.1.1.2 christos return ((loongarch_reloc_howto_type *)
2089 1.1.1.2 christos howto)->adjust_reloc_bits (abfd, howto, fix_val);
2090 1.1.1.2 christos }
2091 1.1 christos
2092 1.1.1.2 christos static bfd_reloc_status_type
2093 1.1.1.2 christos loongarch_elf_add_sub_reloc (bfd *abfd,
2094 1.1.1.2 christos arelent *reloc_entry,
2095 1.1.1.2 christos asymbol *symbol,
2096 1.1.1.2 christos void *data,
2097 1.1.1.2 christos asection *input_section,
2098 1.1.1.2 christos bfd *output_bfd,
2099 1.1.1.2 christos char **error_message ATTRIBUTE_UNUSED)
2100 1.1.1.2 christos {
2101 1.1.1.2 christos reloc_howto_type *howto = reloc_entry->howto;
2102 1.1.1.2 christos bfd_vma relocation;
2103 1.1 christos
2104 1.1.1.2 christos if (output_bfd != NULL
2105 1.1.1.2 christos && (symbol->flags & BSF_SECTION_SYM) == 0
2106 1.1.1.2 christos && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2107 1.1 christos {
2108 1.1.1.2 christos reloc_entry->address += input_section->output_offset;
2109 1.1.1.2 christos return bfd_reloc_ok;
2110 1.1 christos }
2111 1.1 christos
2112 1.1.1.2 christos if (output_bfd != NULL)
2113 1.1.1.2 christos return bfd_reloc_continue;
2114 1.1 christos
2115 1.1.1.2 christos relocation = symbol->value + symbol->section->output_section->vma
2116 1.1.1.2 christos + symbol->section->output_offset + reloc_entry->addend;
2117 1.1 christos
2118 1.1.1.2 christos bfd_size_type octets = reloc_entry->address
2119 1.1.1.2 christos * bfd_octets_per_byte (abfd, input_section);
2120 1.1.1.2 christos if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd,
2121 1.1.1.2 christos input_section, octets))
2122 1.1.1.2 christos return bfd_reloc_outofrange;
2123 1.1 christos
2124 1.1.1.2 christos bfd_vma old_value = bfd_get (howto->bitsize, abfd,
2125 1.1.1.2 christos data + reloc_entry->address);
2126 1.1 christos
2127 1.1.1.2 christos switch (howto->type)
2128 1.1.1.2 christos {
2129 1.1.1.2 christos case R_LARCH_ADD6:
2130 1.1.1.2 christos case R_LARCH_ADD8:
2131 1.1.1.2 christos case R_LARCH_ADD16:
2132 1.1.1.2 christos case R_LARCH_ADD32:
2133 1.1.1.2 christos case R_LARCH_ADD64:
2134 1.1.1.2 christos relocation = old_value + relocation;
2135 1.1.1.2 christos break;
2136 1.1.1.2 christos
2137 1.1.1.2 christos case R_LARCH_SUB6:
2138 1.1.1.2 christos case R_LARCH_SUB8:
2139 1.1.1.2 christos case R_LARCH_SUB16:
2140 1.1.1.2 christos case R_LARCH_SUB32:
2141 1.1.1.2 christos case R_LARCH_SUB64:
2142 1.1.1.2 christos relocation = old_value - relocation;
2143 1.1.1.2 christos break;
2144 1.1.1.2 christos }
2145 1.1 christos
2146 1.1.1.2 christos bfd_put (howto->bitsize, abfd, relocation, data + reloc_entry->address);
2147 1.1 christos
2148 1.1.1.2 christos return bfd_reloc_ok;
2149 1.1.1.2 christos }
2150 1.1 christos
2151 1.1.1.2 christos static bfd_reloc_status_type
2152 1.1.1.2 christos loongarch_elf_add_sub_reloc_uleb128 (bfd *abfd,
2153 1.1.1.2 christos arelent *reloc_entry,
2154 1.1.1.2 christos asymbol *symbol,
2155 1.1.1.2 christos void *data,
2156 1.1.1.2 christos asection *input_section,
2157 1.1.1.2 christos bfd *output_bfd,
2158 1.1.1.2 christos char **error_message ATTRIBUTE_UNUSED)
2159 1.1.1.2 christos {
2160 1.1.1.2 christos reloc_howto_type *howto = reloc_entry->howto;
2161 1.1.1.2 christos bfd_vma relocation;
2162 1.1 christos
2163 1.1.1.2 christos if (output_bfd != NULL
2164 1.1.1.2 christos && (symbol->flags & BSF_SECTION_SYM) == 0
2165 1.1.1.2 christos && (!reloc_entry->howto->partial_inplace || reloc_entry->addend == 0))
2166 1.1.1.2 christos {
2167 1.1.1.2 christos reloc_entry->address += input_section->output_offset;
2168 1.1.1.2 christos return bfd_reloc_ok;
2169 1.1.1.2 christos }
2170 1.1.1.2 christos
2171 1.1.1.2 christos if (output_bfd != NULL)
2172 1.1.1.2 christos return bfd_reloc_continue;
2173 1.1.1.2 christos
2174 1.1.1.2 christos relocation = symbol->value + symbol->section->output_section->vma
2175 1.1.1.2 christos + symbol->section->output_offset + reloc_entry->addend;
2176 1.1.1.2 christos
2177 1.1.1.2 christos bfd_size_type octets = reloc_entry->address
2178 1.1.1.2 christos * bfd_octets_per_byte (abfd, input_section);
2179 1.1.1.2 christos if (!bfd_reloc_offset_in_range (reloc_entry->howto, abfd,
2180 1.1.1.2 christos input_section, octets))
2181 1.1.1.2 christos return bfd_reloc_outofrange;
2182 1.1.1.2 christos
2183 1.1.1.2 christos unsigned int len = 0;
2184 1.1.1.2 christos bfd_byte *p = data + reloc_entry->address;
2185 1.1.1.2 christos bfd_vma old_value = _bfd_read_unsigned_leb128 (abfd, p, &len);
2186 1.1.1.2 christos
2187 1.1.1.2 christos switch (howto->type)
2188 1.1 christos {
2189 1.1.1.2 christos case R_LARCH_ADD_ULEB128:
2190 1.1.1.2 christos relocation = old_value + relocation;
2191 1.1.1.2 christos break;
2192 1.1.1.2 christos
2193 1.1.1.2 christos case R_LARCH_SUB_ULEB128:
2194 1.1.1.2 christos relocation = old_value - relocation;
2195 1.1.1.2 christos break;
2196 1.1 christos }
2197 1.1 christos
2198 1.1.1.2 christos bfd_vma mask = (1 << (7 * len)) - 1;
2199 1.1.1.2 christos relocation = relocation & mask;
2200 1.1.1.2 christos loongarch_write_unsigned_leb128 (p, len, relocation);
2201 1.1.1.2 christos return bfd_reloc_ok;
2202 1.1.1.2 christos }
2203 1.1 christos
2204 1.1.1.2 christos /* Write VALUE in uleb128 format to P.
2205 1.1.1.2 christos LEN is the uleb128 value length.
2206 1.1.1.2 christos Return a pointer to the byte following the last byte that was written. */
2207 1.1.1.2 christos bfd_byte *
2208 1.1.1.2 christos loongarch_write_unsigned_leb128 (bfd_byte *p, unsigned int len, bfd_vma value)
2209 1.1.1.2 christos {
2210 1.1.1.2 christos bfd_byte c;
2211 1.1.1.2 christos do
2212 1.1.1.2 christos {
2213 1.1.1.2 christos c = value & 0x7f;
2214 1.1.1.2 christos if (len > 1)
2215 1.1.1.2 christos c |= 0x80;
2216 1.1.1.2 christos *(p++) = c;
2217 1.1.1.2 christos value >>= 7;
2218 1.1.1.2 christos len--;
2219 1.1.1.2 christos }
2220 1.1.1.2 christos while (len);
2221 1.1.1.2 christos return p;
2222 1.1 christos }
2223 1.1 christos
2224 1.1.1.2 christos int loongarch_get_uleb128_length (bfd_byte *buf)
2225 1.1 christos {
2226 1.1.1.2 christos unsigned int len = 0;
2227 1.1.1.2 christos _bfd_read_unsigned_leb128 (NULL, buf, &len);
2228 1.1.1.2 christos return len;
2229 1.1 christos }
2230