Coverage Report

Created: 2025-06-24 06:45

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