Coverage Report

Created: 2023-06-29 07:13

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