Home | History | Annotate | Line # | Download | only in bfd
elfxx-loongarch.c revision 1.1
      1 /* LoongArch-specific support for ELF.
      2    Copyright (C) 2021-2022 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)(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 (reloc_howto_type *howto, bfd_vma *val);
     56 static bool
     57 reloc_bits_b16 (reloc_howto_type *howto, bfd_vma *fix_val);
     58 static bool
     59 reloc_bits_b21 (reloc_howto_type *howto, bfd_vma *fix_val);
     60 static bool
     61 reloc_bits_b26 (reloc_howto_type *howto, bfd_vma *val);
     62 
     63 /* This does not include any relocation information, but should be
     64    good enough for GDB or objdump to read the file.  */
     65 static loongarch_reloc_howto_type loongarch_howto_table[] =
     66 {
     67   /* No relocation.  */
     68     LOONGARCH_HOWTO (R_LARCH_NONE,	  /* type (0).  */
     69 	 0,				  /* rightshift */
     70 	 0,				  /* size */
     71 	 0,				  /* bitsize */
     72 	 false,				  /* pc_relative */
     73 	 0,				  /* bitpos */
     74 	 complain_overflow_dont,	  /* complain_on_overflow */
     75 	 bfd_elf_generic_reloc,		  /* special_function */
     76 	 "R_LARCH_NONE",		  /* name */
     77 	 false,				  /* partial_inplace */
     78 	 0,				  /* src_mask */
     79 	 0,				  /* dst_mask */
     80 	 false,				  /* pcrel_offset */
     81 	 BFD_RELOC_NONE,		  /* bfd_reloc_code_real_type */
     82 	 NULL,				  /* adjust_reloc_bits */
     83 	 NULL),				  /* larch_reloc_type_name */
     84 
     85   /* 32 bit relocation.  */
     86   LOONGARCH_HOWTO (R_LARCH_32,		  /* type (1).  */
     87 	 0,				  /* rightshift */
     88 	 4,				  /* size */
     89 	 32,				  /* bitsize */
     90 	 false,				  /* pc_relative */
     91 	 0,				  /* bitpos */
     92 	 complain_overflow_dont,	  /* complain_on_overflow */
     93 	 bfd_elf_generic_reloc,		  /* special_function */
     94 	 "R_LARCH_32",			  /* name */
     95 	 false,				  /* partial_inplace */
     96 	 0,				  /* src_mask */
     97 	 ALL_ONES,			  /* dst_mask */
     98 	 false,				  /* pcrel_offset */
     99 	 BFD_RELOC_32,			  /* bfd_reloc_code_real_type */
    100 	 NULL,				  /* adjust_reloc_bits */
    101 	 NULL),				  /* larch_reloc_type_name */
    102 
    103   /* 64 bit relocation.  */
    104   LOONGARCH_HOWTO (R_LARCH_64,		  /* type (2).  */
    105 	 0,				  /* rightshift */
    106 	 8,				  /* size */
    107 	 64,				  /* bitsize */
    108 	 false,				  /* pc_relative */
    109 	 0,				  /* bitpos */
    110 	 complain_overflow_dont,	  /* complain_on_overflow */
    111 	 bfd_elf_generic_reloc,		  /* special_function */
    112 	 "R_LARCH_64",			  /* name */
    113 	 false,				  /* partial_inplace */
    114 	 0,				  /* src_mask */
    115 	 ALL_ONES,			  /* dst_mask */
    116 	 false,				  /* pcrel_offset */
    117 	 BFD_RELOC_64,			  /* bfd_reloc_code_real_type */
    118 	 NULL,				  /* adjust_reloc_bits */
    119 	 NULL),				  /* larch_reloc_type_name */
    120 
    121   LOONGARCH_HOWTO (R_LARCH_RELATIVE,	  /* type (3).  */
    122 	 0,				  /* rightshift */
    123 	 4,				  /* size */
    124 	 32,				  /* bitsize */
    125 	 false,				  /* pc_relative */
    126 	 0,				  /* bitpos */
    127 	 complain_overflow_dont,	  /* complain_on_overflow */
    128 	 bfd_elf_generic_reloc,		  /* special_function */
    129 	 "R_LARCH_RELATIVE",		  /* name */
    130 	 false,				  /* partial_inplace */
    131 	 0,				  /* src_mask */
    132 	 ALL_ONES,			  /* dst_mask */
    133 	 false,				  /* pcrel_offset */
    134 	 BFD_RELOC_NONE,		  /* undefined?  */
    135 	 NULL,				  /* adjust_reloc_bits */
    136 	 NULL),				  /* larch_reloc_type_name */
    137 
    138   LOONGARCH_HOWTO (R_LARCH_COPY,	  /* type (4).  */
    139 	 0,				  /* rightshift */
    140 	 0,				  /* this one is variable size */
    141 	 0,				  /* bitsize */
    142 	 false,				  /* pc_relative */
    143 	 0,				  /* bitpos */
    144 	 complain_overflow_bitfield,	  /* complain_on_overflow */
    145 	 bfd_elf_generic_reloc,		  /* special_function */
    146 	 "R_LARCH_COPY",		  /* name */
    147 	 false,				  /* partial_inplace */
    148 	 0,				  /* src_mask */
    149 	 0,				  /* dst_mask */
    150 	 false,				  /* pcrel_offset */
    151 	 BFD_RELOC_NONE,		  /* undefined?  */
    152 	 NULL,				  /* adjust_reloc_bits */
    153 	 NULL),				  /* larch_reloc_type_name */
    154 
    155   LOONGARCH_HOWTO (R_LARCH_JUMP_SLOT,	  /* type (5).  */
    156 	 0,				  /* rightshift */
    157 	 8,				  /* size */
    158 	 64,				  /* bitsize */
    159 	 false,				  /* pc_relative */
    160 	 0,				  /* bitpos */
    161 	 complain_overflow_bitfield,	  /* complain_on_overflow */
    162 	 bfd_elf_generic_reloc,		  /* special_function */
    163 	 "R_LARCH_JUMP_SLOT",		  /* name */
    164 	 false,				  /* partial_inplace */
    165 	 0,				  /* src_mask */
    166 	 0,				  /* dst_mask */
    167 	 false,				  /* pcrel_offset */
    168 	 BFD_RELOC_NONE,		  /* undefined?  */
    169 	 NULL,				  /* adjust_reloc_bits */
    170 	 NULL),				  /* larch_reloc_type_name */
    171 
    172   /* Dynamic TLS relocations.  */
    173   LOONGARCH_HOWTO (R_LARCH_TLS_DTPMOD32,  /* type (6).  */
    174 	 0,				  /* rightshift */
    175 	 4,				  /* size */
    176 	 32,				  /* bitsize */
    177 	 false,				  /* pc_relative */
    178 	 0,				  /* bitpos */
    179 	 complain_overflow_dont,	  /* complain_on_overflow */
    180 	 bfd_elf_generic_reloc,		  /* special_function */
    181 	 "R_LARCH_TLS_DTPMOD32",	  /* name */
    182 	 false,				  /* partial_inplace */
    183 	 0,				  /* src_mask */
    184 	 ALL_ONES,			  /* dst_mask */
    185 	 false,				  /* pcrel_offset */
    186 	 BFD_RELOC_LARCH_TLS_DTPMOD32,	  /* bfd_reloc_code_real_type */
    187 	 NULL,				  /* adjust_reloc_bits */
    188 	 NULL),				  /* larch_reloc_type_name */
    189 
    190   LOONGARCH_HOWTO (R_LARCH_TLS_DTPMOD64,  /* type (7).  */
    191 	 0,				  /* rightshift */
    192 	 8,				  /* size */
    193 	 64,				  /* bitsize */
    194 	 false,				  /* pc_relative */
    195 	 0,				  /* bitpos */
    196 	 complain_overflow_dont,	  /* complain_on_overflow */
    197 	 bfd_elf_generic_reloc,		  /* special_function */
    198 	 "R_LARCH_TLS_DTPMOD64",	  /* name */
    199 	 false,				  /* partial_inplace */
    200 	 0,				  /* src_mask */
    201 	 ALL_ONES,			  /* dst_mask */
    202 	 false,				  /* pcrel_offset */
    203 	 BFD_RELOC_LARCH_TLS_DTPMOD64,	  /* bfd_reloc_code_real_type */
    204 	 NULL,				  /* adjust_reloc_bits */
    205 	 NULL),				  /* larch_reloc_type_name */
    206 
    207   LOONGARCH_HOWTO (R_LARCH_TLS_DTPREL32,  /* type (8). */
    208 	 0,				  /* rightshift */
    209 	 4,				  /* size */
    210 	 32,				  /* bitsize */
    211 	 false,				  /* pc_relative */
    212 	 0,				  /* bitpos */
    213 	 complain_overflow_dont,	  /* complain_on_overflow */
    214 	 bfd_elf_generic_reloc,		  /* special_function */
    215 	 "R_LARCH_TLS_DTPREL32",	  /* name */
    216 	 true,				  /* partial_inplace */
    217 	 0,				  /* src_mask */
    218 	 ALL_ONES,			  /* dst_mask */
    219 	 false,				  /* pcrel_offset */
    220 	 BFD_RELOC_LARCH_TLS_DTPREL32,	  /* bfd_reloc_code_real_type */
    221 	 NULL,				  /* adjust_reloc_bits */
    222 	 NULL),				  /* larch_reloc_type_name */
    223 
    224   LOONGARCH_HOWTO (R_LARCH_TLS_DTPREL64,  /* type (9).  */
    225 	 0,				  /* rightshift */
    226 	 8,				  /* size */
    227 	 64,				  /* bitsize */
    228 	 false,				  /* pc_relative */
    229 	 0,				  /* bitpos */
    230 	 complain_overflow_dont,	  /* complain_on_overflow */
    231 	 bfd_elf_generic_reloc,		  /* special_function */
    232 	 "R_LARCH_TLS_DTPREL64",	  /* name */
    233 	 true,				  /* partial_inplace */
    234 	 0,				  /* src_mask */
    235 	 ALL_ONES,			  /* dst_mask */
    236 	 false,				  /* pcrel_offset */
    237 	 BFD_RELOC_LARCH_TLS_DTPREL64,	  /* bfd_reloc_code_real_type */
    238 	 NULL,				  /* adjust_reloc_bits */
    239 	 NULL),				  /* larch_reloc_type_name */
    240 
    241   LOONGARCH_HOWTO (R_LARCH_TLS_TPREL32,	  /* type (10).  */
    242 	 0,				  /* rightshift */
    243 	 4,				  /* size */
    244 	 32,				  /* bitsize */
    245 	 false,				  /* pc_relative */
    246 	 0,				  /* bitpos */
    247 	 complain_overflow_dont,	  /* complain_on_overflow */
    248 	 bfd_elf_generic_reloc,		  /* special_function */
    249 	 "R_LARCH_TLS_TPREL32",		  /* name */
    250 	 false,				  /* partial_inplace */
    251 	 0,				  /* src_mask */
    252 	 ALL_ONES,			  /* dst_mask */
    253 	 false,				  /* pcrel_offset */
    254 	 BFD_RELOC_LARCH_TLS_TPREL32,	  /* bfd_reloc_code_real_type */
    255 	 NULL,				  /* adjust_reloc_bits */
    256 	 NULL),				  /* larch_reloc_type_name */
    257 
    258   LOONGARCH_HOWTO (R_LARCH_TLS_TPREL64,	  /* type (11).  */
    259 	 0,				  /* rightshift */
    260 	 8,				  /* size */
    261 	 64,				  /* bitsize */
    262 	 false,				  /* pc_relative */
    263 	 0,				  /* bitpos */
    264 	 complain_overflow_dont,	  /* complain_on_overflow */
    265 	 bfd_elf_generic_reloc,		  /* special_function */
    266 	 "R_LARCH_TLS_TPREL64",		  /* name */
    267 	 false,				  /* partial_inplace */
    268 	 0,				  /* src_mask */
    269 	 ALL_ONES,			  /* dst_mask */
    270 	 false,				  /* pcrel_offset */
    271 	 BFD_RELOC_LARCH_TLS_TPREL64,	  /* bfd_reloc_code_real_type */
    272 	 NULL,				  /* adjust_reloc_bits */
    273 	 NULL),				  /* larch_reloc_type_name */
    274 
    275   LOONGARCH_HOWTO (R_LARCH_IRELATIVE,	  /* type (12).  */
    276 	 0,				  /* rightshift */
    277 	 4,				  /* size */
    278 	 32,				  /* bitsize */
    279 	 false,				  /* pc_relative */
    280 	 0,				  /* bitpos */
    281 	 complain_overflow_dont,	  /* complain_on_overflow */
    282 	 bfd_elf_generic_reloc,		  /* special_function */
    283 	 "R_LARCH_IRELATIVE",		  /* name */
    284 	 false,				  /* partial_inplace */
    285 	 0,				  /* src_mask */
    286 	 ALL_ONES,			  /* dst_mask */
    287 	 false,				  /* pcrel_offset */
    288 	 BFD_RELOC_NONE,		  /* undefined?  */
    289 	 NULL,				  /* adjust_reloc_bits */
    290 	 NULL),				  /* larch_reloc_type_name */
    291 
    292   LOONGARCH_EMPTY_HOWTO (13),
    293   LOONGARCH_EMPTY_HOWTO (14),
    294   LOONGARCH_EMPTY_HOWTO (15),
    295   LOONGARCH_EMPTY_HOWTO (16),
    296   LOONGARCH_EMPTY_HOWTO (17),
    297   LOONGARCH_EMPTY_HOWTO (18),
    298   LOONGARCH_EMPTY_HOWTO (19),
    299 
    300   LOONGARCH_HOWTO (R_LARCH_MARK_LA,		/* type (20).  */
    301 	 0,					/* rightshift.  */
    302 	 0,					/* size.  */
    303 	 0,					/* bitsize.  */
    304 	 false,					/* pc_relative.  */
    305 	 0,					/* bitpos.  */
    306 	 complain_overflow_signed,		/* complain_on_overflow.  */
    307 	 bfd_elf_generic_reloc,			/* special_function.  */
    308 	 "R_LARCH_MARK_LA",			/* name.  */
    309 	 false,					/* partial_inplace.  */
    310 	 0,					/* src_mask.  */
    311 	 0,					/* dst_mask.  */
    312 	 false,					/* pcrel_offset */
    313 	 BFD_RELOC_LARCH_MARK_LA,		/* bfd_reloc_code_real_type */
    314 	 NULL,					/* adjust_reloc_bits */
    315 	 NULL),					/* larch_reloc_type_name */
    316 
    317   LOONGARCH_HOWTO (R_LARCH_MARK_PCREL,		/* type (21).  */
    318 	 0,					/* rightshift.  */
    319 	 0,					/* size.  */
    320 	 0,					/* bitsize.  */
    321 	 false,					/* pc_relative.  */
    322 	 0,					/* bitpos.  */
    323 	 complain_overflow_signed,		/* complain_on_overflow.  */
    324 	 bfd_elf_generic_reloc,			/* special_function.  */
    325 	 "R_LARCH_MARK_PCREL",			/* name.  */
    326 	 false,					/* partial_inplace.  */
    327 	 0,					/* src_mask.  */
    328 	 0,					/* dst_mask.  */
    329 	 false,					/* pcrel_offset */
    330 	 BFD_RELOC_LARCH_MARK_PCREL,		/* bfd_reloc_code_real_type */
    331 	 NULL,					/* adjust_reloc_bits */
    332 	 NULL),					/* larch_reloc_type_name */
    333 
    334   LOONGARCH_HOWTO (R_LARCH_SOP_PUSH_PCREL,	/* type (22).  */
    335 	 2,					/* rightshift.  */
    336 	 4,					/* size.  */
    337 	 32,					/* bitsize.  */
    338 	 true /* FIXME: somewhat use this.  */,	/* pc_relative.  */
    339 	 0,					/* bitpos.  */
    340 	 complain_overflow_signed,		/* complain_on_overflow.  */
    341 	 bfd_elf_generic_reloc,			/* special_function.  */
    342 	 "R_LARCH_SOP_PUSH_PCREL",		/* name.  */
    343 	 false,					/* partial_inplace.  */
    344 	 0x03ffffff,				/* src_mask.  */
    345 	 0x03ffffff,				/* dst_mask.  */
    346 	 false,					/* pcrel_offset */
    347 	 BFD_RELOC_LARCH_SOP_PUSH_PCREL,	/* bfd_reloc_code_real_type */
    348 	 NULL,					/* adjust_reloc_bits */
    349 	 NULL),					/* larch_reloc_type_name */
    350 
    351   /* type 23-37.  */
    352   LOONGARCH_DEFAULT_HOWTO (SOP_PUSH_ABSOLUTE),
    353   LOONGARCH_DEFAULT_HOWTO (SOP_PUSH_DUP),
    354   LOONGARCH_DEFAULT_HOWTO (SOP_PUSH_GPREL),
    355   LOONGARCH_DEFAULT_HOWTO (SOP_PUSH_TLS_TPREL),
    356   LOONGARCH_DEFAULT_HOWTO (SOP_PUSH_TLS_GOT),
    357   LOONGARCH_DEFAULT_HOWTO (SOP_PUSH_TLS_GD),
    358   LOONGARCH_DEFAULT_HOWTO (SOP_PUSH_PLT_PCREL),
    359   LOONGARCH_DEFAULT_HOWTO (SOP_ASSERT),
    360   LOONGARCH_DEFAULT_HOWTO (SOP_NOT),
    361   LOONGARCH_DEFAULT_HOWTO (SOP_SUB),
    362   LOONGARCH_DEFAULT_HOWTO (SOP_SL),
    363   LOONGARCH_DEFAULT_HOWTO (SOP_SR),
    364   LOONGARCH_DEFAULT_HOWTO (SOP_ADD),
    365   LOONGARCH_DEFAULT_HOWTO (SOP_AND),
    366   LOONGARCH_DEFAULT_HOWTO (SOP_IF_ELSE),
    367 
    368   LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_10_5,	  /* type (38).  */
    369 	 0,					  /* rightshift.  */
    370 	 4,					  /* size.  */
    371 	 5,					  /* bitsize.  */
    372 	 false,					  /* pc_relative.  */
    373 	 10,					  /* bitpos.  */
    374 	 complain_overflow_signed,		  /* complain_on_overflow.  */
    375 	 bfd_elf_generic_reloc,			  /* special_function.  */
    376 	 "R_LARCH_SOP_POP_32_S_10_5",		  /* name.  */
    377 	 false,					  /* partial_inplace.  */
    378 	 0,					  /* src_mask */
    379 	 0x7c00,				  /* dst_mask */
    380 	 false,					  /* pcrel_offset */
    381 	 BFD_RELOC_LARCH_SOP_POP_32_S_10_5,	  /* bfd_reloc_code_real_type */
    382 	 reloc_bits,				  /* adjust_reloc_bits */
    383 	 NULL),					  /* larch_reloc_type_name */
    384 
    385   LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_U_10_12,	  /* type (39).  */
    386 	 0,					  /* rightshift.  */
    387 	 4,					  /* size.  */
    388 	 12,					  /* bitsize.  */
    389 	 false,					  /* pc_relative.  */
    390 	 10,					  /* bitpos.  */
    391 	 complain_overflow_unsigned,		  /* complain_on_overflow.  */
    392 	 bfd_elf_generic_reloc,			  /* special_function.  */
    393 	 "R_LARCH_SOP_POP_32_U_10_12",		  /* name.  */
    394 	 false,					  /* partial_inplace.  */
    395 	 0,					  /* src_mask */
    396 	 0x3ffc00,				  /* dst_mask */
    397 	 false,					  /* pcrel_offset */
    398 	 BFD_RELOC_LARCH_SOP_POP_32_U_10_12,	  /* bfd_reloc_code_real_type */
    399 	 reloc_bits,				  /* adjust_reloc_bits */
    400 	 NULL),					  /* larch_reloc_type_name */
    401 
    402   LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_10_12,	  /* type (40).  */
    403 	 0,					  /* rightshift.  */
    404 	 4,					  /* size.  */
    405 	 12,					  /* bitsize.  */
    406 	 false,					  /* pc_relative.  */
    407 	 10,					  /* bitpos.  */
    408 	 complain_overflow_signed,		  /* complain_on_overflow.  */
    409 	 bfd_elf_generic_reloc,			  /* special_function.  */
    410 	 "R_LARCH_SOP_POP_32_S_10_12",		  /* name.  */
    411 	 false,					  /* partial_inplace.  */
    412 	 0,					  /* src_mask */
    413 	 0x3ffc00,				  /* dst_mask */
    414 	 false,					  /* pcrel_offset */
    415 	 BFD_RELOC_LARCH_SOP_POP_32_S_10_12,	  /* bfd_reloc_code_real_type */
    416 	 reloc_bits,				  /* adjust_reloc_bits */
    417 	 NULL),					  /* larch_reloc_type_name */
    418 
    419   LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_10_16,	  /* type (41).  */
    420 	 0,					  /* rightshift.  */
    421 	 4,					  /* size.  */
    422 	 16,					  /* bitsize.  */
    423 	 false,					  /* pc_relative.  */
    424 	 10,					  /* bitpos.  */
    425 	 complain_overflow_signed,		  /* complain_on_overflow.  */
    426 	 bfd_elf_generic_reloc,			  /* special_function.  */
    427 	 "R_LARCH_SOP_POP_32_S_10_16",		  /* name.  */
    428 	 false,					  /* partial_inplace.  */
    429 	 0,					  /* src_mask */
    430 	 0x3fffc00,				  /* dst_mask */
    431 	 false,					  /* pcrel_offset */
    432 	 BFD_RELOC_LARCH_SOP_POP_32_S_10_16,	  /* bfd_reloc_code_real_type */
    433 	 reloc_bits,				  /* adjust_reloc_bits */
    434 	 NULL),					  /* larch_reloc_type_name */
    435 
    436   LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_10_16_S2, /* type (42).  */
    437 	 2,					  /* rightshift.  */
    438 	 4,					  /* size.  */
    439 	 16,					  /* bitsize.  */
    440 	 false,					  /* pc_relative.  */
    441 	 10,					  /* bitpos.  */
    442 	 complain_overflow_signed,		  /* complain_on_overflow.  */
    443 	 bfd_elf_generic_reloc,			  /* special_function.  */
    444 	 "R_LARCH_SOP_POP_32_S_10_16_S2",	  /* name.  */
    445 	 false,					  /* partial_inplace.  */
    446 	 0,					  /* src_mask */
    447 	 0x3fffc00,				  /* dst_mask */
    448 	 false,					  /* pcrel_offset */
    449 	 BFD_RELOC_LARCH_SOP_POP_32_S_10_16_S2,	  /* bfd_reloc_code_real_type */
    450 	 reloc_bits_b16,			  /* adjust_reloc_bits */
    451 	 NULL),					  /* larch_reloc_type_name */
    452 
    453   LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_5_20,	  /* type (43).  */
    454 	 0,					  /* rightshift.  */
    455 	 4,					  /* size.  */
    456 	 20,					  /* bitsize.  */
    457 	 false,					  /* pc_relative.  */
    458 	 5,					  /* bitpos.  */
    459 	 complain_overflow_signed,		  /* complain_on_overflow.  */
    460 	 bfd_elf_generic_reloc,			  /* special_function.  */
    461 	 "R_LARCH_SOP_POP_32_S_5_20",		  /* name.  */
    462 	 false,					  /* partial_inplace.  */
    463 	 0,					  /* src_mask */
    464 	 0x1ffffe0,				  /* dst_mask */
    465 	 false,					  /* pcrel_offset */
    466 	 BFD_RELOC_LARCH_SOP_POP_32_S_5_20,	  /* bfd_reloc_code_real_type */
    467 	 reloc_bits,				  /* adjust_reloc_bits */
    468 	 NULL),					  /* larch_reloc_type_name */
    469 
    470   LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_0_5_10_16_S2,
    471 						  /* type (44).  */
    472 	 2,					  /* rightshift.  */
    473 	 4,					  /* size.  */
    474 	 21,					  /* bitsize.  */
    475 	 false,					  /* pc_relative.  */
    476 	 0,					  /* bitpos.  */
    477 	 complain_overflow_signed,		  /* complain_on_overflow.  */
    478 	 bfd_elf_generic_reloc,			  /* special_function.  */
    479 	 "R_LARCH_SOP_POP_32_S_0_5_10_16_S2",	  /* name.  */
    480 	 false,					  /* partial_inplace.  */
    481 	 0xfc0003e0,				  /* src_mask */
    482 	 0xfc0003e0,				  /* dst_mask */
    483 	 false,					  /* pcrel_offset */
    484 	 BFD_RELOC_LARCH_SOP_POP_32_S_0_5_10_16_S2,
    485 						  /* bfd_reloc_code_real_type */
    486 	 reloc_bits_b21,			  /* adjust_reloc_bits */
    487 	 NULL),					  /* larch_reloc_type_name */
    488 
    489   LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_S_0_10_10_16_S2,	/* type (45).  */
    490 	 2,					/* rightshift.  */
    491 	 4,					/* size.  */
    492 	 26,					/* bitsize.  */
    493 	 false,					/* pc_relative.  */
    494 	 0,					/* bitpos.  */
    495 	 complain_overflow_signed,		/* complain_on_overflow.  */
    496 	 bfd_elf_generic_reloc,			/* special_function.  */
    497 	 "R_LARCH_SOP_POP_32_S_0_10_10_16_S2",	/* name.  */
    498 	 false,					/* partial_inplace.  */
    499 	 0,					/* src_mask */
    500 	 0x03ffffff,				/* dst_mask */
    501 	 false,					/* pcrel_offset */
    502 	 BFD_RELOC_LARCH_SOP_POP_32_S_0_10_10_16_S2,
    503 						/* bfd_reloc_code_real_type */
    504 	 reloc_bits_b26,			/* adjust_reloc_bits */
    505 	 NULL),					/* larch_reloc_type_name */
    506 
    507   LOONGARCH_HOWTO (R_LARCH_SOP_POP_32_U,	/* type (46).  */
    508 	 0,					/* rightshift.  */
    509 	 4,					/* size.  */
    510 	 32,					/* bitsize.  */
    511 	 false,					/* pc_relative.  */
    512 	 0,					/* bitpos.  */
    513 	 complain_overflow_unsigned,		/* complain_on_overflow.  */
    514 	 bfd_elf_generic_reloc,			/* special_function.  */
    515 	 "R_LARCH_SOP_POP_32_S_U",		/* name.  */
    516 	 false,					/* partial_inplace.  */
    517 	 0xffffffff00000000,			/* src_mask */
    518 	 0x00000000ffffffff,			/* dst_mask */
    519 	 false,					/* pcrel_offset */
    520 	 BFD_RELOC_LARCH_SOP_POP_32_U,		/* bfd_reloc_code_real_type */
    521 	 reloc_bits,				/* adjust_reloc_bits */
    522 	 NULL),					/* larch_reloc_type_name */
    523 
    524   LOONGARCH_HOWTO (R_LARCH_ADD8,		/* type (47).  */
    525 	 0,					/* rightshift.  */
    526 	 4,					/* size.  */
    527 	 8,					/* bitsize.  */
    528 	 false,					/* pc_relative.  */
    529 	 0,					/* bitpos.  */
    530 	 complain_overflow_signed,		/* complain_on_overflow.  */
    531 	 bfd_elf_generic_reloc,			/* special_function.  */
    532 	 "R_LARCH_ADD8",			/* name.  */
    533 	 false,					/* partial_inplace.  */
    534 	 0,					/* src_mask */
    535 	 ALL_ONES,				/* dst_mask */
    536 	 false,					/* pcrel_offset */
    537 	 BFD_RELOC_LARCH_ADD8,			/* bfd_reloc_code_real_type */
    538 	 NULL,					/* adjust_reloc_bits */
    539 	 NULL),					/* larch_reloc_type_name */
    540 
    541   LOONGARCH_HOWTO (R_LARCH_ADD16,		/* type (48).  */
    542 	 0,					/* rightshift.  */
    543 	 4,					/* size.  */
    544 	 16,					/* bitsize.  */
    545 	 false,					/* pc_relative.  */
    546 	 0,					/* bitpos.  */
    547 	 complain_overflow_signed,		/* complain_on_overflow.  */
    548 	 bfd_elf_generic_reloc,			/* special_function.  */
    549 	 "R_LARCH_ADD16",			/* name.  */
    550 	 false,					/* partial_inplace.  */
    551 	 0,					/* src_mask */
    552 	 ALL_ONES,				/* dst_mask */
    553 	 false,					/* pcrel_offset */
    554 	 BFD_RELOC_LARCH_ADD16,			/* bfd_reloc_code_real_type */
    555 	 NULL,					/* adjust_reloc_bits */
    556 	 NULL),					/* larch_reloc_type_name */
    557 
    558   LOONGARCH_HOWTO (R_LARCH_ADD24,		/* type (49).  */
    559 	 0,					/* rightshift.  */
    560 	 4,					/* size.  */
    561 	 24,					/* bitsize.  */
    562 	 false,					/* pc_relative.  */
    563 	 0,					/* bitpos.  */
    564 	 complain_overflow_signed,		/* complain_on_overflow.  */
    565 	 bfd_elf_generic_reloc,			/* special_function.  */
    566 	 "R_LARCH_ADD24",			/* name.  */
    567 	 false,					/* partial_inplace.  */
    568 	 0,					/* src_mask */
    569 	 ALL_ONES,				/* dst_mask */
    570 	 false,					/* pcrel_offset */
    571 	 BFD_RELOC_LARCH_ADD24,			/* bfd_reloc_code_real_type */
    572 	 NULL,					/* adjust_reloc_bits */
    573 	 NULL),					/* larch_reloc_type_name */
    574 
    575   LOONGARCH_HOWTO (R_LARCH_ADD32,		/* type (50).  */
    576 	 0,					/* rightshift.  */
    577 	 4,					/* size.  */
    578 	 32,					/* bitsize.  */
    579 	 false,					/* pc_relative.  */
    580 	 0,					/* bitpos.  */
    581 	 complain_overflow_signed,		/* complain_on_overflow.  */
    582 	 bfd_elf_generic_reloc,			/* special_function.  */
    583 	 "R_LARCH_ADD32",			/* name.  */
    584 	 false,					/* partial_inplace.  */
    585 	 0,					/* src_mask */
    586 	 ALL_ONES,				/* dst_mask */
    587 	 false,					/* pcrel_offset */
    588 	 BFD_RELOC_LARCH_ADD32,			/* bfd_reloc_code_real_type */
    589 	 NULL,					/* adjust_reloc_bits */
    590 	 NULL),					/* larch_reloc_type_name */
    591 
    592   LOONGARCH_HOWTO (R_LARCH_ADD64,		/* type (51).  */
    593 	 0,					/* rightshift.  */
    594 	 8,					/* size.  */
    595 	 64,					/* bitsize.  */
    596 	 false,					/* pc_relative.  */
    597 	 0,					/* bitpos.  */
    598 	 complain_overflow_signed,		/* complain_on_overflow.  */
    599 	 bfd_elf_generic_reloc,			/* special_function.  */
    600 	 "R_LARCH_ADD64",			/* name.  */
    601 	 false,					/* partial_inplace.  */
    602 	 0,					/* src_mask */
    603 	 ALL_ONES,				/* dst_mask */
    604 	 false,					/* pcrel_offset */
    605 	 BFD_RELOC_LARCH_ADD64,			/* bfd_reloc_code_real_type */
    606 	 NULL,					/* adjust_reloc_bits */
    607 	 NULL),					/* larch_reloc_type_name */
    608 
    609   LOONGARCH_HOWTO (R_LARCH_SUB8,		/* type (52).  */
    610 	 0,					/* rightshift.  */
    611 	 4,					/* size.  */
    612 	 8,					/* bitsize.  */
    613 	 false,					/* pc_relative.  */
    614 	 0,					/* bitpos.  */
    615 	 complain_overflow_signed,		/* complain_on_overflow.  */
    616 	 bfd_elf_generic_reloc,			/* special_function.  */
    617 	 "R_LARCH_SUB8",			/* name.  */
    618 	 false,					/* partial_inplace.  */
    619 	 0,					/* src_mask */
    620 	 ALL_ONES,				/* dst_mask */
    621 	 false,					/* pcrel_offset */
    622 	 BFD_RELOC_LARCH_SUB8,			/* bfd_reloc_code_real_type */
    623 	 NULL,					/* adjust_reloc_bits */
    624 	 NULL),					/* larch_reloc_type_name */
    625 
    626   LOONGARCH_HOWTO (R_LARCH_SUB16,		/* type (53).  */
    627 	 0,					/* rightshift.  */
    628 	 4,					/* size.  */
    629 	 16,					/* bitsize.  */
    630 	 false,					/* pc_relative.  */
    631 	 0,					/* bitpos.  */
    632 	 complain_overflow_signed,		/* complain_on_overflow.  */
    633 	 bfd_elf_generic_reloc,			/* special_function.  */
    634 	 "R_LARCH_SUB16",			/* name.  */
    635 	 false,					/* partial_inplace.  */
    636 	 0,					/* src_mask */
    637 	 ALL_ONES,				/* dst_mask */
    638 	 false,					/* pcrel_offset */
    639 	 BFD_RELOC_LARCH_SUB16,			/* bfd_reloc_code_real_type */
    640 	 NULL,					/* adjust_reloc_bits */
    641 	 NULL),					/* larch_reloc_type_name */
    642 
    643   LOONGARCH_HOWTO (R_LARCH_SUB24,		/* type (54).  */
    644 	 0,					/* rightshift.  */
    645 	 4,					/* size.  */
    646 	 24,					/* bitsize.  */
    647 	 false,					/* pc_relative.  */
    648 	 0,					/* bitpos.  */
    649 	 complain_overflow_signed,		/* complain_on_overflow.  */
    650 	 bfd_elf_generic_reloc,			/* special_function.  */
    651 	 "R_LARCH_SUB24",			/* name.  */
    652 	 false,					/* partial_inplace.  */
    653 	 0,					/* src_mask */
    654 	 ALL_ONES,				/* dst_mask */
    655 	 false,					/* pcrel_offset */
    656 	 BFD_RELOC_LARCH_SUB24,			/* bfd_reloc_code_real_type */
    657 	 NULL,					/* adjust_reloc_bits */
    658 	 NULL),					/* larch_reloc_type_name */
    659 
    660   LOONGARCH_HOWTO (R_LARCH_SUB32,		/* type (55).  */
    661 	 0,					/* rightshift.  */
    662 	 4,					/* size.  */
    663 	 32,					/* bitsize.  */
    664 	 false,					/* pc_relative.  */
    665 	 0,					/* bitpos.  */
    666 	 complain_overflow_signed,		/* complain_on_overflow.  */
    667 	 bfd_elf_generic_reloc,			/* special_function.  */
    668 	 "R_LARCH_SUB32",			/* name.  */
    669 	 false,					/* partial_inplace.  */
    670 	 0,					/* src_mask */
    671 	 ALL_ONES,				/* dst_mask */
    672 	 false,					/* pcrel_offset */
    673 	 BFD_RELOC_LARCH_SUB32,			/* bfd_reloc_code_real_type */
    674 	 NULL,					/* adjust_reloc_bits */
    675 	 NULL),					/* larch_reloc_type_name */
    676 
    677   LOONGARCH_HOWTO (R_LARCH_SUB64,		/* type (56).  */
    678 	 0,					/* rightshift.  */
    679 	 8,					/* size.  */
    680 	 64,					/* bitsize.  */
    681 	 false,					/* pc_relative.  */
    682 	 0,					/* bitpos.  */
    683 	 complain_overflow_signed,		/* complain_on_overflow.  */
    684 	 bfd_elf_generic_reloc,			/* special_function.  */
    685 	 "R_LARCH_SUB64",			/* name.  */
    686 	 false,					/* partial_inplace.  */
    687 	 0,					/* src_mask */
    688 	 ALL_ONES,				/* dst_mask */
    689 	 false,					/* pcrel_offset */
    690 	 BFD_RELOC_LARCH_SUB64,			/* bfd_reloc_code_real_type */
    691 	 NULL,					/* adjust_reloc_bits */
    692 	 NULL),					/* larch_reloc_type_name */
    693 
    694   LOONGARCH_HOWTO (R_LARCH_GNU_VTINHERIT,	/* type (57).  */
    695 	 0,					/* rightshift.  */
    696 	 0,					/* size.  */
    697 	 0,					/* bitsize.  */
    698 	 false,					/* pc_relative.  */
    699 	 0,					/* bitpos.  */
    700 	 complain_overflow_signed,		/* complain_on_overflow.  */
    701 	 bfd_elf_generic_reloc,			/* special_function.  */
    702 	 "R_LARCH_GNU_VTINHERIT",		/* name.  */
    703 	 false,					/* partial_inplace.  */
    704 	 0,					/* src_mask */
    705 	 0,					/* dst_mask */
    706 	 false,					/* pcrel_offset */
    707 	 BFD_RELOC_NONE,			/* bfd_reloc_code_real_type */
    708 	 NULL,					/* adjust_reloc_bits */
    709 	 NULL),					/* larch_reloc_type_name */
    710 
    711   LOONGARCH_HOWTO (R_LARCH_GNU_VTENTRY,		/* type (58).  */
    712 	 0,					/* rightshift.  */
    713 	 0,					/* size.  */
    714 	 0,					/* bitsize.  */
    715 	 false,					/* pc_relative.  */
    716 	 0,					/* bitpos.  */
    717 	 complain_overflow_signed,		/* complain_on_overflow.  */
    718 	 NULL,					/* special_function.  */
    719 	 "R_LARCH_GNU_VTENTRY",			/* name.  */
    720 	 false,					/* partial_inplace.  */
    721 	 0,					/* src_mask */
    722 	 0,					/* dst_mask */
    723 	 false,					/* pcrel_offset */
    724 	 BFD_RELOC_NONE,			/* bfd_reloc_code_real_type */
    725 	 NULL,					/* adjust_reloc_bits */
    726 	 NULL),					/* larch_reloc_type_name */
    727 
    728   LOONGARCH_EMPTY_HOWTO (59),
    729   LOONGARCH_EMPTY_HOWTO (60),
    730   LOONGARCH_EMPTY_HOWTO (61),
    731   LOONGARCH_EMPTY_HOWTO (62),
    732   LOONGARCH_EMPTY_HOWTO (63),
    733 
    734   /* New reloc types.  */
    735   LOONGARCH_HOWTO (R_LARCH_B16,			/* type (64).  */
    736 	 2,					/* rightshift.  */
    737 	 4,					/* size.  */
    738 	 16,					/* bitsize.  */
    739 	 false,					/* pc_relative.  */
    740 	 10,					/* bitpos.  */
    741 	 complain_overflow_signed,		/* complain_on_overflow.  */
    742 	 bfd_elf_generic_reloc,			/* special_function.  */
    743 	 "R_LARCH_B16",				/* name.  */
    744 	 false,					/* partial_inplace.  */
    745 	 0x3fffc00,				/* src_mask */
    746 	 0x3fffc00,				/* dst_mask */
    747 	 false,					/* pcrel_offset */
    748 	 BFD_RELOC_LARCH_B16,			/* bfd_reloc_code_real_type */
    749 	 reloc_bits_b16,			/* adjust_reloc_bits */
    750 	 "b16"),				/* larch_reloc_type_name */
    751 
    752   LOONGARCH_HOWTO (R_LARCH_B21,			/* type (65).  */
    753 	 2,					/* rightshift.  */
    754 	 4,					/* size.  */
    755 	 21,					/* bitsize.  */
    756 	 false,					/* pc_relative.  */
    757 	 0,					/* bitpos.  */
    758 	 complain_overflow_signed,		/* complain_on_overflow.  */
    759 	 bfd_elf_generic_reloc,			/* special_function.  */
    760 	 "R_LARCH_B21",				/* name.  */
    761 	 false,					/* partial_inplace.  */
    762 	 0xfc0003e0,				/* src_mask */
    763 	 0xfc0003e0,				/* dst_mask */
    764 	 false,					/* pcrel_offset */
    765 	 BFD_RELOC_LARCH_B21,			/* bfd_reloc_code_real_type */
    766 	 reloc_bits_b21,			/* adjust_reloc_bits */
    767 	 "b21"),				/* larch_reloc_type_name */
    768 
    769   LOONGARCH_HOWTO (R_LARCH_B26,			/* type (66).  */
    770 	 2,					/* rightshift.  */
    771 	 4,					/* size.  */
    772 	 26,					/* bitsize.  */
    773 	 false,					/* pc_relative.  */
    774 	 0,					/* bitpos.  */
    775 	 complain_overflow_signed,		/* complain_on_overflow.  */
    776 	 bfd_elf_generic_reloc,			/* special_function.  */
    777 	 "R_LARCH_B26",				/* name.  */
    778 	 false,					/* partial_inplace.  */
    779 	 0,					/* src_mask */
    780 	 0x03ffffff,				/* dst_mask */
    781 	 false,					/* pcrel_offset */
    782 	 BFD_RELOC_LARCH_B26,			/* bfd_reloc_code_real_type */
    783 	 reloc_bits_b26,			/* adjust_reloc_bits */
    784 	 "b26"),				/* larch_reloc_type_name */
    785 
    786   LOONGARCH_HOWTO (R_LARCH_ABS_HI20,		/* type (67).  */
    787 	 12,					/* rightshift.  */
    788 	 4,					/* size.  */
    789 	 20,					/* bitsize.  */
    790 	 false,					/* pc_relative.  */
    791 	 5,					/* bitpos.  */
    792 	 complain_overflow_signed,		/* complain_on_overflow.  */
    793 	 bfd_elf_generic_reloc,			/* special_function.  */
    794 	 "R_LARCH_ABS_HI20",			/* name.  */
    795 	 false,					/* partial_inplace.  */
    796 	 0,					/* src_mask */
    797 	 0x1ffffe0,				/* dst_mask */
    798 	 false,					/* pcrel_offset */
    799 	 BFD_RELOC_LARCH_ABS_HI20,		/* bfd_reloc_code_real_type */
    800 	 reloc_bits,				/* adjust_reloc_bits */
    801 	 "abs_hi20"),				/* larch_reloc_type_name */
    802 
    803   LOONGARCH_HOWTO (R_LARCH_ABS_LO12,		/* type (68).  */
    804 	 0,					/* rightshift.  */
    805 	 4,					/* size.  */
    806 	 12,					/* bitsize.  */
    807 	 false,					/* pc_relative.  */
    808 	 10,					/* bitpos.  */
    809 	 complain_overflow_unsigned,		/* complain_on_overflow.  */
    810 	 bfd_elf_generic_reloc,			/* special_function.  */
    811 	 "R_LARCH_ABS_LO12",			/* name.  */
    812 	 false,					/* partial_inplace.  */
    813 	 0,					/* src_mask */
    814 	 0x3ffc00,				/* dst_mask */
    815 	 false,					/* pcrel_offset */
    816 	 BFD_RELOC_LARCH_ABS_LO12,		/* bfd_reloc_code_real_type */
    817 	 reloc_bits,				/* adjust_reloc_bits */
    818 	 "abs_lo12"),				/* larch_reloc_type_name */
    819 
    820   LOONGARCH_HOWTO (R_LARCH_ABS64_LO20,		/* type (69).  */
    821 	 32,					/* rightshift.  */
    822 	 4,					/* size.  */
    823 	 20,					/* bitsize.  */
    824 	 false,					/* pc_relative.  */
    825 	 5,					/* bitpos.  */
    826 	 complain_overflow_signed,		/* complain_on_overflow.  */
    827 	 bfd_elf_generic_reloc,			/* special_function.  */
    828 	 "R_LARCH_ABS64_LO20",			/* name.  */
    829 	 false,					/* partial_inplace.  */
    830 	 0,					/* src_mask */
    831 	 0x1ffffe0,				/* dst_mask */
    832 	 false,					/* pcrel_offset */
    833 	 BFD_RELOC_LARCH_ABS64_LO20,		/* bfd_reloc_code_real_type */
    834 	 reloc_bits,				/* adjust_reloc_bits */
    835 	 "abs64_lo20"),				/* larch_reloc_type_name */
    836 
    837   LOONGARCH_HOWTO (R_LARCH_ABS64_HI12,		/* type (70).  */
    838 	 52,					/* rightshift.  */
    839 	 4,					/* size.  */
    840 	 12,					/* bitsize.  */
    841 	 false,					/* pc_relative.  */
    842 	 10,					/* bitpos.  */
    843 	 complain_overflow_signed,		/* complain_on_overflow.  */
    844 	 bfd_elf_generic_reloc,			/* special_function.  */
    845 	 "R_LARCH_ABS64_HI12",			/* name.  */
    846 	 false,					/* partial_inplace.  */
    847 	 0,					/* src_mask */
    848 	 0x3ffc00,				/* dst_mask */
    849 	 false,					/* pcrel_offset */
    850 	 BFD_RELOC_LARCH_ABS64_HI12,		/* bfd_reloc_code_real_type */
    851 	 reloc_bits,				/* adjust_reloc_bits */
    852 	 "abs64_hi12"),				/* larch_reloc_type_name */
    853 
    854   LOONGARCH_HOWTO (R_LARCH_PCALA_HI20,		/* type (71).  */
    855 	 12,					/* rightshift.  */
    856 	 4,					/* size.  */
    857 	 20,					/* bitsize.  */
    858 	 false,					/* pc_relative.  */
    859 	 5,					/* bitpos.  */
    860 	 complain_overflow_signed,		/* complain_on_overflow.  */
    861 	 bfd_elf_generic_reloc,			/* special_function.  */
    862 	 "R_LARCH_PCALA_HI20",			/* name.  */
    863 	 false,					/* partial_inplace.  */
    864 	 0,					/* src_mask */
    865 	 0x1ffffe0,				/* dst_mask */
    866 	 false,					/* pcrel_offset */
    867 	 BFD_RELOC_LARCH_PCALA_HI20,		/* bfd_reloc_code_real_type */
    868 	 reloc_bits,				/* adjust_reloc_bits */
    869 	 "pc_hi20"),				/* larch_reloc_type_name */
    870 
    871   LOONGARCH_HOWTO (R_LARCH_PCALA_LO12,		/* type (72).  */
    872 	 0,					/* rightshift.  */
    873 	 4,					/* size.  */
    874 	 12,					/* bitsize.  */
    875 	 false,					/* pc_relative.  */
    876 	 10,					/* bitpos.  */
    877 	 complain_overflow_signed,		/* complain_on_overflow.  */
    878 	 bfd_elf_generic_reloc,			/* special_function.  */
    879 	 "R_LARCH_PCALA_LO12",			/* name.  */
    880 	 false,					/* partial_inplace.  */
    881 	 0,					/* src_mask */
    882 	 0x3ffc00,				/* dst_mask */
    883 	 false,					/* pcrel_offset */
    884 	 BFD_RELOC_LARCH_PCALA_LO12,		/* bfd_reloc_code_real_type */
    885 	 reloc_bits,				/* adjust_reloc_bits */
    886 	 "pc_lo12"),				/* larch_reloc_type_name */
    887 
    888   LOONGARCH_HOWTO (R_LARCH_PCALA64_LO20,	/* type (73).  */
    889 	 32,					/* rightshift.  */
    890 	 4,					/* size.  */
    891 	 20,					/* bitsize.  */
    892 	 false,					/* pc_relative.  */
    893 	 5,					/* bitpos.  */
    894 	 complain_overflow_signed,		/* complain_on_overflow.  */
    895 	 bfd_elf_generic_reloc,			/* special_function.  */
    896 	 "R_LARCH_PCALA64_LO20",		/* name.  */
    897 	 false,					/* partial_inplace.  */
    898 	 0,					/* src_mask */
    899 	 0x1ffffe0,				/* dst_mask */
    900 	 false,					/* pcrel_offset */
    901 	 BFD_RELOC_LARCH_PCALA64_LO20,		/* bfd_reloc_code_real_type */
    902 	 reloc_bits,				/* adjust_reloc_bits */
    903 	 "pc64_lo20"),				/* larch_reloc_type_name */
    904 
    905   LOONGARCH_HOWTO (R_LARCH_PCALA64_HI12,	/* type (74).  */
    906 	 52,					/* rightshift.  */
    907 	 4,					/* size.  */
    908 	 12,					/* bitsize.  */
    909 	 false,					/* pc_relative.  */
    910 	 10,					/* bitpos.  */
    911 	 complain_overflow_signed,		/* complain_on_overflow.  */
    912 	 bfd_elf_generic_reloc,			/* special_function.  */
    913 	 "R_LARCH_PCALA64_HI12",		/* name.  */
    914 	 false,					/* partial_inplace.  */
    915 	 0,					/* src_mask */
    916 	 0x3ffc00,				/* dst_mask */
    917 	 false,					/* pcrel_offset */
    918 	 BFD_RELOC_LARCH_PCALA64_HI12,		/* bfd_reloc_code_real_type */
    919 	 reloc_bits,				/* adjust_reloc_bits */
    920 	 "pc64_hi12"),				/* larch_reloc_type_name */
    921 
    922   LOONGARCH_HOWTO (R_LARCH_GOT_PC_HI20,		/* type (75).  */
    923 	 12,					/* rightshift.  */
    924 	 4,					/* size.  */
    925 	 20,					/* bitsize.  */
    926 	 false,					/* pc_relative.  */
    927 	 5,					/* bitpos.  */
    928 	 complain_overflow_signed,		/* complain_on_overflow.  */
    929 	 bfd_elf_generic_reloc,			/* special_function.  */
    930 	 "R_LARCH_GOT_PC_HI20",			/* name.  */
    931 	 false,					/* partial_inplace.  */
    932 	 0,					/* src_mask */
    933 	 0x1ffffe0,				/* dst_mask */
    934 	 false,					/* pcrel_offset */
    935 	 BFD_RELOC_LARCH_GOT_PC_HI20,		/* bfd_reloc_code_real_type */
    936 	 reloc_bits,				/* adjust_reloc_bits */
    937 	 "got_pc_hi20"),			/* larch_reloc_type_name */
    938 
    939   LOONGARCH_HOWTO (R_LARCH_GOT_PC_LO12,		/* type (76).  */
    940 	 0,					/* rightshift.  */
    941 	 4,					/* size.  */
    942 	 12,					/* bitsize.  */
    943 	 false,					/* pc_relative.  */
    944 	 10,					/* bitpos.  */
    945 	 complain_overflow_signed,		/* complain_on_overflow.  */
    946 	 bfd_elf_generic_reloc,			/* special_function.  */
    947 	 "R_LARCH_GOT_PC_LO12",			/* name.  */
    948 	 false,					/* partial_inplace.  */
    949 	 0,					/* src_mask */
    950 	 0x3ffc00,				/* dst_mask */
    951 	 false,					/* pcrel_offset */
    952 	 BFD_RELOC_LARCH_GOT_PC_LO12,		/* bfd_reloc_code_real_type */
    953 	 reloc_bits,				/* adjust_reloc_bits */
    954 	 "got_pc_lo12"),			/* larch_reloc_type_name */
    955 
    956   LOONGARCH_HOWTO (R_LARCH_GOT64_PC_LO20,	/* type (77).  */
    957 	 32,					/* rightshift.  */
    958 	 4,					/* size.  */
    959 	 20,					/* bitsize.  */
    960 	 false,					/* pc_relative.  */
    961 	 5,					/* bitpos.  */
    962 	 complain_overflow_signed,		/* complain_on_overflow.  */
    963 	 bfd_elf_generic_reloc,			/* special_function.  */
    964 	 "R_LARCH_GOT64_PC_LO20",		/* name.  */
    965 	 false,					/* partial_inplace.  */
    966 	 0,					/* src_mask */
    967 	 0x1ffffe0,				/* dst_mask */
    968 	 false,					/* pcrel_offset */
    969 	 BFD_RELOC_LARCH_GOT64_PC_LO20,		/* bfd_reloc_code_real_type */
    970 	 reloc_bits,				/* adjust_reloc_bits */
    971 	 "got64_pc_lo20"),			/* larch_reloc_type_name */
    972 
    973   LOONGARCH_HOWTO (R_LARCH_GOT64_PC_HI12,	/* type (78).  */
    974 	 52,					/* rightshift.  */
    975 	 4,					/* size.  */
    976 	 12,					/* bitsize.  */
    977 	 false,					/* pc_relative.  */
    978 	 10,					/* bitpos.  */
    979 	 complain_overflow_signed,		/* complain_on_overflow.  */
    980 	 bfd_elf_generic_reloc,			/* special_function.  */
    981 	 "R_LARCH_GOT64_PC_HI12",		/* name.  */
    982 	 false,					/* partial_inplace.  */
    983 	 0,					/* src_mask */
    984 	 0x3ffc00,				/* dst_mask */
    985 	 false,					/* pcrel_offset */
    986 	 BFD_RELOC_LARCH_GOT64_PC_HI12,		/* bfd_reloc_code_real_type */
    987 	 reloc_bits,				/* adjust_reloc_bits */
    988 	 "got64_pc_hi12"),			/* larch_reloc_type_name */
    989 
    990   LOONGARCH_HOWTO (R_LARCH_GOT_HI20,		/* type (79).  */
    991 	 12,					/* rightshift.  */
    992 	 4,					/* size.  */
    993 	 20,					/* bitsize.  */
    994 	 false,					/* pc_relative.  */
    995 	 5,					/* bitpos.  */
    996 	 complain_overflow_signed,		/* complain_on_overflow.  */
    997 	 bfd_elf_generic_reloc,			/* special_function.  */
    998 	 "R_LARCH_GOT_HI20",			/* name.  */
    999 	 false,					/* partial_inplace.  */
   1000 	 0,					/* src_mask */
   1001 	 0x1ffffe0,				/* dst_mask */
   1002 	 false,					/* pcrel_offset */
   1003 	 BFD_RELOC_LARCH_GOT_HI20,		/* bfd_reloc_code_real_type */
   1004 	 reloc_bits,				/* adjust_reloc_bits */
   1005 	 "got_hi20"),				/* larch_reloc_type_name */
   1006 
   1007   LOONGARCH_HOWTO (R_LARCH_GOT_LO12,		/* type (80).  */
   1008 	 0,					/* rightshift.  */
   1009 	 4,					/* size.  */
   1010 	 12,					/* bitsize.  */
   1011 	 false,					/* pc_relative.  */
   1012 	 10,					/* bitpos.  */
   1013 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1014 	 bfd_elf_generic_reloc,			/* special_function.  */
   1015 	 "R_LARCH_GOT_LO12",			/* name.  */
   1016 	 false,					/* partial_inplace.  */
   1017 	 0,					/* src_mask */
   1018 	 0x3ffc00,				/* dst_mask */
   1019 	 false,					/* pcrel_offset */
   1020 	 BFD_RELOC_LARCH_GOT_LO12,		/* bfd_reloc_code_real_type */
   1021 	 reloc_bits,				/* adjust_reloc_bits */
   1022 	 "got_lo12"),				/* larch_reloc_type_name */
   1023 
   1024   LOONGARCH_HOWTO (R_LARCH_GOT64_LO20,		/* type (81).  */
   1025 	 32,					/* rightshift.  */
   1026 	 4,					/* size.  */
   1027 	 20,					/* bitsize.  */
   1028 	 false,					/* pc_relative.  */
   1029 	 5,					/* bitpos.  */
   1030 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1031 	 bfd_elf_generic_reloc,			/* special_function.  */
   1032 	 "R_LARCH_GOT64_LO20",			/* name.  */
   1033 	 false,					/* partial_inplace.  */
   1034 	 0,					/* src_mask */
   1035 	 0x1ffffe0,				/* dst_mask */
   1036 	 false,					/* pcrel_offset */
   1037 	 BFD_RELOC_LARCH_GOT64_LO20,		/* bfd_reloc_code_real_type */
   1038 	 reloc_bits,				/* adjust_reloc_bits */
   1039 	 "got64_lo20"),				/* larch_reloc_type_name */
   1040 
   1041   LOONGARCH_HOWTO (R_LARCH_GOT64_HI12,		/* type (82).  */
   1042 	 52,					/* rightshift.  */
   1043 	 4,					/* size.  */
   1044 	 12,					/* bitsize.  */
   1045 	 false,					/* pc_relative.  */
   1046 	 10,					/* bitpos.  */
   1047 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1048 	 bfd_elf_generic_reloc,			/* special_function.  */
   1049 	 "R_LARCH_GOT64_HI12",			/* name.  */
   1050 	 false,					/* partial_inplace.  */
   1051 	 0,					/* src_mask */
   1052 	 0x3ffc00,				/* dst_mask */
   1053 	 false,					/* pcrel_offset */
   1054 	 BFD_RELOC_LARCH_GOT64_HI12,		/* bfd_reloc_code_real_type */
   1055 	 reloc_bits,				/* adjust_reloc_bits */
   1056 	 "got64_hi12"),				/* larch_reloc_type_name */
   1057 
   1058   LOONGARCH_HOWTO (R_LARCH_TLS_LE_HI20,		/* type (83).  */
   1059 	 12,					/* rightshift.  */
   1060 	 4,					/* size.  */
   1061 	 20,					/* bitsize.  */
   1062 	 false,					/* pc_relative.  */
   1063 	 5,					/* bitpos.  */
   1064 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1065 	 bfd_elf_generic_reloc,			/* special_function.  */
   1066 	 "R_LARCH_TLS_LE_HI20",			/* name.  */
   1067 	 false,					/* partial_inplace.  */
   1068 	 0,					/* src_mask */
   1069 	 0x1ffffe0,				/* dst_mask */
   1070 	 false,					/* pcrel_offset */
   1071 	 BFD_RELOC_LARCH_TLS_LE_HI20,		/* bfd_reloc_code_real_type */
   1072 	 reloc_bits,				/* adjust_reloc_bits */
   1073 	 "le_hi20"),				/* larch_reloc_type_name */
   1074 
   1075   LOONGARCH_HOWTO (R_LARCH_TLS_LE_LO12,		/* type (84).  */
   1076 	 0,					/* rightshift.  */
   1077 	 4,					/* size.  */
   1078 	 12,					/* bitsize.  */
   1079 	 false,					/* pc_relative.  */
   1080 	 10,					/* bitpos.  */
   1081 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1082 	 bfd_elf_generic_reloc,			/* special_function.  */
   1083 	 "R_LARCH_TLS_LE_LO12",			/* name.  */
   1084 	 false,					/* partial_inplace.  */
   1085 	 0,					/* src_mask */
   1086 	 0x3ffc00,				/* dst_mask */
   1087 	 false,					/* pcrel_offset */
   1088 	 BFD_RELOC_LARCH_TLS_LE_LO12,		/* bfd_reloc_code_real_type */
   1089 	 reloc_bits,				/* adjust_reloc_bits */
   1090 	 "le_lo12"),				/* larch_reloc_type_name */
   1091 
   1092   LOONGARCH_HOWTO (R_LARCH_TLS_LE64_LO20,	/* type (85).  */
   1093 	 32,					/* rightshift.  */
   1094 	 4,					/* size.  */
   1095 	 20,					/* bitsize.  */
   1096 	 false,					/* pc_relative.  */
   1097 	 5,					/* bitpos.  */
   1098 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1099 	 bfd_elf_generic_reloc,			/* special_function.  */
   1100 	 "R_LARCH_TLS_LE64_LO20",		/* name.  */
   1101 	 false,					/* partial_inplace.  */
   1102 	 0,					/* src_mask */
   1103 	 0x1ffffe0,				/* dst_mask */
   1104 	 false,					/* pcrel_offset */
   1105 	 BFD_RELOC_LARCH_TLS_LE64_LO20,		/* bfd_reloc_code_real_type */
   1106 	 reloc_bits,				/* adjust_reloc_bits */
   1107 	 "le64_lo20"),				/* larch_reloc_type_name */
   1108 
   1109   LOONGARCH_HOWTO (R_LARCH_TLS_LE64_HI12,	/* type (86).  */
   1110 	 52,					/* rightshift.  */
   1111 	 4,					/* size.  */
   1112 	 12,					/* bitsize.  */
   1113 	 false,					/* pc_relative.  */
   1114 	 10,					/* bitpos.  */
   1115 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1116 	 bfd_elf_generic_reloc,			/* special_function.  */
   1117 	 "R_LARCH_TLS_LE64_HI12",		/* name.  */
   1118 	 false,					/* partial_inplace.  */
   1119 	 0,					/* src_mask */
   1120 	 0x3ffc00,				/* dst_mask */
   1121 	 false,					/* pcrel_offset */
   1122 	 BFD_RELOC_LARCH_TLS_LE64_HI12,		/* bfd_reloc_code_real_type */
   1123 	 reloc_bits,				/* adjust_reloc_bits */
   1124 	 "le64_hi12"),				/* larch_reloc_type_name */
   1125 
   1126   LOONGARCH_HOWTO (R_LARCH_TLS_IE_PC_HI20,	/* type (87).  */
   1127 	 12,					/* rightshift.  */
   1128 	 4,					/* size.  */
   1129 	 20,					/* bitsize.  */
   1130 	 false,					/* pc_relative.  */
   1131 	 5,					/* bitpos.  */
   1132 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1133 	 bfd_elf_generic_reloc,			/* special_function.  */
   1134 	 "R_LARCH_TLS_IE_PC_HI20",		/* name.  */
   1135 	 false,					/* partial_inplace.  */
   1136 	 0,					/* src_mask */
   1137 	 0x1ffffe0,				/* dst_mask */
   1138 	 false,					/* pcrel_offset */
   1139 	 BFD_RELOC_LARCH_TLS_IE_PC_HI20,	/* bfd_reloc_code_real_type */
   1140 	 reloc_bits,				/* adjust_reloc_bits */
   1141 	 "ie_pc_hi20"),				/* larch_reloc_type_name */
   1142 
   1143   LOONGARCH_HOWTO (R_LARCH_TLS_IE_PC_LO12,	/* type (88).  */
   1144 	 0,					/* rightshift.  */
   1145 	 4,					/* size.  */
   1146 	 12,					/* bitsize.  */
   1147 	 false,					/* pc_relative.  */
   1148 	 10,					/* bitpos.  */
   1149 	 complain_overflow_unsigned,		/* complain_on_overflow.  */
   1150 	 bfd_elf_generic_reloc,			/* special_function.  */
   1151 	 "R_LARCH_TLS_IE_PC_LO12",		/* name.  */
   1152 	 false,					/* partial_inplace.  */
   1153 	 0,					/* src_mask */
   1154 	 0x3ffc00,				/* dst_mask */
   1155 	 false,					/* pcrel_offset */
   1156 	 BFD_RELOC_LARCH_TLS_IE_PC_LO12,	/* bfd_reloc_code_real_type */
   1157 	 reloc_bits,				/* adjust_reloc_bits */
   1158 	 "ie_pc_lo12"),				/* larch_reloc_type_name */
   1159 
   1160   LOONGARCH_HOWTO (R_LARCH_TLS_IE64_PC_LO20,	/* type (89).  */
   1161 	 32,					/* rightshift.  */
   1162 	 4,					/* size.  */
   1163 	 20,					/* bitsize.  */
   1164 	 false,					/* pc_relative.  */
   1165 	 5,					/* bitpos.  */
   1166 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1167 	 bfd_elf_generic_reloc,			/* special_function.  */
   1168 	 "R_LARCH_TLS_IE64_PC_LO20",		/* name.  */
   1169 	 false,					/* partial_inplace.  */
   1170 	 0,					/* src_mask */
   1171 	 0x1ffffe0,				/* dst_mask */
   1172 	 false,					/* pcrel_offset */
   1173 	 BFD_RELOC_LARCH_TLS_IE64_PC_LO20,	/* bfd_reloc_code_real_type */
   1174 	 reloc_bits,				/* adjust_reloc_bits */
   1175 	 "ie64_pc_lo20"),			/* larch_reloc_type_name */
   1176 
   1177   LOONGARCH_HOWTO (R_LARCH_TLS_IE64_PC_HI12,	/* type (90).  */
   1178 	 52,					/* rightshift.  */
   1179 	 4,					/* size.  */
   1180 	 12,					/* bitsize.  */
   1181 	 false,					/* pc_relative.  */
   1182 	 10,					/* bitpos.  */
   1183 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1184 	 bfd_elf_generic_reloc,			/* special_function.  */
   1185 	 "R_LARCH_TLS_IE64_PC_HI12",		/* name.  */
   1186 	 false,					/* partial_inplace.  */
   1187 	 0,					/* src_mask */
   1188 	 0x3ffc00,				/* dst_mask */
   1189 	 false,					/* pcrel_offset */
   1190 	 BFD_RELOC_LARCH_TLS_IE64_PC_HI12,	/* bfd_reloc_code_real_type */
   1191 	 reloc_bits,				/* adjust_reloc_bits */
   1192 	 "ie64_pc_hi12"),			/* larch_reloc_type_name */
   1193 
   1194   LOONGARCH_HOWTO (R_LARCH_TLS_IE_HI20,	/* type (91).  */
   1195 	 12,					/* rightshift.  */
   1196 	 4,					/* size.  */
   1197 	 20,					/* bitsize.  */
   1198 	 false,					/* pc_relative.  */
   1199 	 5,					/* bitpos.  */
   1200 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1201 	 bfd_elf_generic_reloc,			/* special_function.  */
   1202 	 "R_LARCH_TLS_IE_HI20",			/* name.  */
   1203 	 false,					/* partial_inplace.  */
   1204 	 0,					/* src_mask */
   1205 	 0x1ffffe0,				/* dst_mask */
   1206 	 false,					/* pcrel_offset */
   1207 	 BFD_RELOC_LARCH_TLS_IE_HI20,		/* bfd_reloc_code_real_type */
   1208 	 reloc_bits,				/* adjust_reloc_bits */
   1209 	 "ie_hi20"),				/* larch_reloc_type_name */
   1210 
   1211   LOONGARCH_HOWTO (R_LARCH_TLS_IE_LO12,		/* type (92).  */
   1212 	 0,					/* rightshift.  */
   1213 	 4,					/* size.  */
   1214 	 12,					/* bitsize.  */
   1215 	 false,					/* pc_relative.  */
   1216 	 10,					/* bitpos.  */
   1217 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1218 	 bfd_elf_generic_reloc,			/* special_function.  */
   1219 	 "R_LARCH_TLS_IE_LO12",			/* name.  */
   1220 	 false,					/* partial_inplace.  */
   1221 	 0,					/* src_mask */
   1222 	 0x3ffc00,				/* dst_mask */
   1223 	 false,					/* pcrel_offset */
   1224 	 BFD_RELOC_LARCH_TLS_IE_LO12,		/* bfd_reloc_code_real_type */
   1225 	 reloc_bits,				/* adjust_reloc_bits */
   1226 	 "ie_lo12"),				/* larch_reloc_type_name */
   1227 
   1228   LOONGARCH_HOWTO (R_LARCH_TLS_IE64_LO20,	/* type (93).  */
   1229 	 32,					/* rightshift.  */
   1230 	 4,					/* size.  */
   1231 	 20,					/* bitsize.  */
   1232 	 false,					/* pc_relative.  */
   1233 	 5,					/* bitpos.  */
   1234 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1235 	 bfd_elf_generic_reloc,			/* special_function.  */
   1236 	 "R_LARCH_TLS_IE64_LO20",		/* name.  */
   1237 	 false,					/* partial_inplace.  */
   1238 	 0,					/* src_mask */
   1239 	 0x1ffffe0,				/* dst_mask */
   1240 	 false,					/* pcrel_offset */
   1241 	 BFD_RELOC_LARCH_TLS_IE64_LO20,		/* bfd_reloc_code_real_type */
   1242 	 reloc_bits,				/* adjust_reloc_bits */
   1243 	 "ie64_lo20"),				/* larch_reloc_type_name */
   1244 
   1245   LOONGARCH_HOWTO (R_LARCH_TLS_IE64_HI12,	/* type (94).  */
   1246 	 52,					/* rightshift.  */
   1247 	 4,					/* size.  */
   1248 	 12,					/* bitsize.  */
   1249 	 false,					/* pc_relative.  */
   1250 	 10,					/* bitpos.  */
   1251 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1252 	 bfd_elf_generic_reloc,			/* special_function.  */
   1253 	 "R_LARCH_TLS_IE64_HI12",		/* name.  */
   1254 	 false,					/* partial_inplace.  */
   1255 	 0,					/* src_mask */
   1256 	 0x3ffc00,				/* dst_mask */
   1257 	 false,					/* pcrel_offset */
   1258 	 BFD_RELOC_LARCH_TLS_IE64_HI12,		/* bfd_reloc_code_real_type */
   1259 	 reloc_bits,				/* adjust_reloc_bits */
   1260 	 "ie64_hi12"),				/* larch_reloc_type_name */
   1261 
   1262   LOONGARCH_HOWTO (R_LARCH_TLS_LD_PC_HI20,	/* type (95).  */
   1263 	 12,					/* rightshift.  */
   1264 	 4,					/* size.  */
   1265 	 20,					/* bitsize.  */
   1266 	 false,					/* pc_relative.  */
   1267 	 5,					/* bitpos.  */
   1268 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1269 	 bfd_elf_generic_reloc,			/* special_function.  */
   1270 	 "R_LARCH_TLS_LD_PC_HI20",		/* name.  */
   1271 	 false,					/* partial_inplace.  */
   1272 	 0,					/* src_mask */
   1273 	 0x1ffffe0,				/* dst_mask */
   1274 	 false,					/* pcrel_offset */
   1275 	 BFD_RELOC_LARCH_TLS_LD_PC_HI20,	/* bfd_reloc_code_real_type */
   1276 	 reloc_bits,				/* adjust_reloc_bits */
   1277 	 "ld_pc_hi20"),				/* larch_reloc_type_name */
   1278 
   1279   LOONGARCH_HOWTO (R_LARCH_TLS_LD_HI20,		/* type (96).  */
   1280 	 12,					/* rightshift.  */
   1281 	 4,					/* size.  */
   1282 	 20,					/* bitsize.  */
   1283 	 false,					/* pc_relative.  */
   1284 	 5,					/* bitpos.  */
   1285 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1286 	 bfd_elf_generic_reloc,			/* special_function.  */
   1287 	 "R_LARCH_TLS_LD_HI20",			/* name.  */
   1288 	 false,					/* partial_inplace.  */
   1289 	 0,					/* src_mask */
   1290 	 0x1ffffe0,				/* dst_mask */
   1291 	 false,					/* pcrel_offset */
   1292 	 BFD_RELOC_LARCH_TLS_LD_HI20,		/* bfd_reloc_code_real_type */
   1293 	 reloc_bits,				/* adjust_reloc_bits */
   1294 	 "ld_hi20"),				/* larch_reloc_type_name */
   1295 
   1296   LOONGARCH_HOWTO (R_LARCH_TLS_GD_PC_HI20,	/* type (97).  */
   1297 	 12,					/* rightshift.  */
   1298 	 4,					/* size.  */
   1299 	 20,					/* bitsize.  */
   1300 	 false,					/* pc_relative.  */
   1301 	 5,					/* bitpos.  */
   1302 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1303 	 bfd_elf_generic_reloc,			/* special_function.  */
   1304 	 "R_LARCH_TLS_GD_PC_HI20",		/* name.  */
   1305 	 false,					/* partial_inplace.  */
   1306 	 0,					/* src_mask */
   1307 	 0x1ffffe0,				/* dst_mask */
   1308 	 false,					/* pcrel_offset */
   1309 	 BFD_RELOC_LARCH_TLS_GD_PC_HI20,	/* bfd_reloc_code_real_type */
   1310 	 reloc_bits,				/* adjust_reloc_bits */
   1311 	 "gd_pc_hi20"),				/* larch_reloc_type_name */
   1312 
   1313   LOONGARCH_HOWTO (R_LARCH_TLS_GD_HI20,		/* type (98).  */
   1314 	 12,					/* rightshift.  */
   1315 	 4,					/* size.  */
   1316 	 20,					/* bitsize.  */
   1317 	 false,					/* pc_relative.  */
   1318 	 5,					/* bitpos.  */
   1319 	 complain_overflow_signed,		/* complain_on_overflow.  */
   1320 	 bfd_elf_generic_reloc,			/* special_function.  */
   1321 	 "R_LARCH_TLS_GD_HI20",			/* name.  */
   1322 	 false,					/* partial_inplace.  */
   1323 	 0,					/* src_mask */
   1324 	 0x1ffffe0,				/* dst_mask */
   1325 	 false,					/* pcrel_offset */
   1326 	 BFD_RELOC_LARCH_TLS_GD_HI20,		/* bfd_reloc_code_real_type */
   1327 	 reloc_bits,				/* adjust_reloc_bits */
   1328 	 "gd_hi20"),				/* larch_reloc_type_name */
   1329 
   1330   LOONGARCH_HOWTO (R_LARCH_32_PCREL,		/* type (99).  */
   1331 	 0,					/* rightshift.  */
   1332 	 4,					/* size.  */
   1333 	 32,					/* bitsize.  */
   1334 	 true,					/* pc_relative.  */
   1335 	 0,					/* bitpos.  */
   1336 	 complain_overflow_dont,		/* complain_on_overflow.  */
   1337 	 bfd_elf_generic_reloc,			/* special_function.  */
   1338 	 "R_LARCH_32_PCREL",			/* name.  */
   1339 	 false,					/* partial_inplace.  */
   1340 	 0,					/* src_mask */
   1341 	 0xffffffff,				/* dst_mask */
   1342 	 false,					/* pcrel_offset */
   1343 	 BFD_RELOC_LARCH_32_PCREL,		/* bfd_reloc_code_real_type */
   1344 	 NULL,					/* adjust_reloc_bits */
   1345 	 NULL),					/* larch_reloc_type_name */
   1346 
   1347   LOONGARCH_HOWTO (R_LARCH_RELAX,		/* type (100).  */
   1348 	 0,					/* rightshift */
   1349 	 1,					/* size */
   1350 	 0,					/* bitsize */
   1351 	 false,					/* pc_relative */
   1352 	 0,					/* bitpos */
   1353 	 complain_overflow_dont,		/* complain_on_overflow */
   1354 	 bfd_elf_generic_reloc,			/* special_function */
   1355 	 "R_LARCH_RELAX",			/* name */
   1356 	 false,					/* partial_inplace */
   1357 	 0,					/* src_mask */
   1358 	 0,					/* dst_mask */
   1359 	 false,					/* pcrel_offset */
   1360 	 BFD_RELOC_LARCH_RELAX,			/* bfd_reloc_code_real_type */
   1361 	 NULL,					/* adjust_reloc_bits */
   1362 	 NULL),					/* larch_reloc_type_name */
   1363 
   1364 };
   1365 
   1366 reloc_howto_type *
   1367 loongarch_elf_rtype_to_howto (bfd *abfd, unsigned int r_type)
   1368 {
   1369   if(r_type < R_LARCH_count)
   1370     {
   1371       /* For search table fast.  */
   1372       BFD_ASSERT (ARRAY_SIZE (loongarch_howto_table) == R_LARCH_count);
   1373 
   1374       if (loongarch_howto_table[r_type].howto.type == r_type)
   1375 	return (reloc_howto_type *)&loongarch_howto_table[r_type];
   1376 
   1377       for (size_t i = 0; i < ARRAY_SIZE (loongarch_howto_table); i++)
   1378 	if (loongarch_howto_table[i].howto.type == r_type)
   1379 	  return (reloc_howto_type *)&loongarch_howto_table[i];
   1380     }
   1381 
   1382   (*_bfd_error_handler) (_("%pB: unsupported relocation type %#x"),
   1383 			 abfd, r_type);
   1384   bfd_set_error (bfd_error_bad_value);
   1385   return NULL;
   1386 }
   1387 
   1388 reloc_howto_type *
   1389 loongarch_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name)
   1390 {
   1391   BFD_ASSERT (ARRAY_SIZE (loongarch_howto_table) == R_LARCH_count);
   1392 
   1393   for (size_t i = 0; i < ARRAY_SIZE (loongarch_howto_table); i++)
   1394     if (loongarch_howto_table[i].howto.name
   1395 	&& strcasecmp (loongarch_howto_table[i].howto.name, r_name) == 0)
   1396       return (reloc_howto_type *)&loongarch_howto_table[i];
   1397 
   1398   (*_bfd_error_handler) (_("%pB: unsupported relocation type %s"),
   1399 			 abfd, r_name);
   1400   bfd_set_error (bfd_error_bad_value);
   1401 
   1402   return NULL;
   1403 }
   1404 
   1405 /* Cost so much.  */
   1406 reloc_howto_type *
   1407 loongarch_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   1408 			     bfd_reloc_code_real_type code)
   1409 {
   1410   BFD_ASSERT (ARRAY_SIZE (loongarch_howto_table) == R_LARCH_count);
   1411 
   1412   /* Fast search for new reloc types.  */
   1413   if (BFD_RELOC_LARCH_B16 <= code && code < BFD_RELOC_LARCH_RELAX)
   1414     {
   1415       BFD_ASSERT (BFD_RELOC_LARCH_RELAX - BFD_RELOC_LARCH_B16
   1416 		  == R_LARCH_RELAX - R_LARCH_B16);
   1417       loongarch_reloc_howto_type *ht = NULL;
   1418       ht = &loongarch_howto_table[code - BFD_RELOC_LARCH_B16 + R_LARCH_B16];
   1419       BFD_ASSERT (ht->bfd_type == code);
   1420       return (reloc_howto_type *)ht;
   1421     }
   1422 
   1423   for (size_t i = 0; i < ARRAY_SIZE (loongarch_howto_table); i++)
   1424     if (loongarch_howto_table[i].bfd_type == code)
   1425       return (reloc_howto_type *)&loongarch_howto_table[i];
   1426 
   1427   (*_bfd_error_handler) (_("%pB: unsupported bfd relocation type %#x"),
   1428 			 abfd, code);
   1429   bfd_set_error (bfd_error_bad_value);
   1430 
   1431   return NULL;
   1432 }
   1433 
   1434 bfd_reloc_code_real_type
   1435 loongarch_larch_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
   1436 				   const char *l_r_name)
   1437 {
   1438   for (size_t i = 0; i < ARRAY_SIZE (loongarch_howto_table); i++)
   1439     {
   1440       loongarch_reloc_howto_type *lht = &loongarch_howto_table[i];
   1441       if ((NULL != lht->larch_reloc_type_name)
   1442 	  && (0 == strcmp (lht->larch_reloc_type_name, l_r_name)))
   1443 	return lht->bfd_type;
   1444     }
   1445 
   1446   (*_bfd_error_handler) (_("%pB: unsupported relocation type name %s"),
   1447 			 abfd, l_r_name);
   1448   bfd_set_error (bfd_error_bad_value);
   1449   return BFD_RELOC_NONE;
   1450 }
   1451 
   1452 
   1453 /* Functions for reloc bits field.
   1454    1.  Signed extend *fix_val.
   1455    2.  Return false if overflow.  */
   1456 
   1457 #define LARCH_RELOC_BFD_VMA_BIT_MASK(bitsize) \
   1458   (~((((bfd_vma)0x1) << (bitsize)) - 1))
   1459 
   1460 /* Adjust val to perform insn
   1461    BFD_RELOC_LARCH_SOP_POP_32_S_10_5
   1462    BFD_RELOC_LARCH_SOP_POP_32_S_10_12
   1463    BFD_RELOC_LARCH_SOP_POP_32_U_10_12
   1464    BFD_RELOC_LARCH_SOP_POP_32_S_10_16
   1465    BFD_RELOC_LARCH_SOP_POP_32_S_5_20
   1466    BFD_RELOC_LARCH_SOP_POP_32_U.  */
   1467 static bool
   1468 reloc_bits (reloc_howto_type *howto, bfd_vma *fix_val)
   1469 {
   1470   bfd_signed_vma val = ((bfd_signed_vma)(*fix_val)) >> howto->rightshift;
   1471 
   1472   /* Perform insn bits field.  */
   1473   val = val & (((bfd_vma)0x1 << howto->bitsize) - 1);
   1474   val <<= howto->bitpos;
   1475 
   1476   *fix_val = (bfd_vma)val;
   1477 
   1478   return true;
   1479 }
   1480 
   1481 /* Adjust val to perform insn
   1482    R_LARCH_SOP_POP_32_S_10_16_S2
   1483    R_LARCH_B16.  */
   1484 static bool
   1485 reloc_bits_b16 (reloc_howto_type *howto, bfd_vma *fix_val)
   1486 {
   1487   if (howto->complain_on_overflow != complain_overflow_signed)
   1488     return false;
   1489 
   1490   bfd_signed_vma val = *fix_val;
   1491 
   1492   /* Judge whether 4 bytes align.  */
   1493   if (val & ((0x1UL << howto->rightshift) - 1))
   1494     return false;
   1495 
   1496   int bitsize = howto->bitsize + howto->rightshift;
   1497   bfd_signed_vma sig_bit = (val >> (bitsize - 1)) & 0x1;
   1498 
   1499   /* If val < 0, sign bit is 1.  */
   1500   if (sig_bit)
   1501     {
   1502       /* Signed bits is 1.  */
   1503       if ((LARCH_RELOC_BFD_VMA_BIT_MASK (bitsize - 1) & val)
   1504 	  != LARCH_RELOC_BFD_VMA_BIT_MASK (bitsize - 1))
   1505 	return false;
   1506     }
   1507   else
   1508     {
   1509       /* Signed bits is 0.  */
   1510       if (LARCH_RELOC_BFD_VMA_BIT_MASK (bitsize) & val)
   1511 	return false;
   1512     }
   1513 
   1514   /* Perform insn bits field.  */
   1515   val >>= howto->rightshift;
   1516   val = val & (((bfd_vma)0x1 << howto->bitsize) - 1);
   1517   val <<= howto->bitpos;
   1518 
   1519   *fix_val = val;
   1520 
   1521   return true;
   1522 }
   1523 
   1524 /* Reloc type :
   1525    R_LARCH_SOP_POP_32_S_0_5_10_16_S2
   1526    R_LARCH_B21.  */
   1527 static bool
   1528 reloc_bits_b21 (reloc_howto_type *howto,
   1529 		bfd_vma *fix_val)
   1530 {
   1531   if (howto->complain_on_overflow != complain_overflow_signed)
   1532     return false;
   1533 
   1534   bfd_signed_vma val = *fix_val;
   1535 
   1536   if (val & ((0x1UL << howto->rightshift) - 1))
   1537     return false;
   1538 
   1539   int bitsize = howto->bitsize + howto->rightshift;
   1540   bfd_signed_vma sig_bit = (val >> (bitsize - 1)) & 0x1;
   1541 
   1542   /* If val < 0.  */
   1543   if (sig_bit)
   1544     {
   1545       if ((LARCH_RELOC_BFD_VMA_BIT_MASK (bitsize - 1) & val)
   1546 	  != LARCH_RELOC_BFD_VMA_BIT_MASK (bitsize - 1))
   1547 	return false;
   1548     }
   1549   else
   1550     {
   1551       if (LARCH_RELOC_BFD_VMA_BIT_MASK (bitsize) & val)
   1552 	return false;
   1553     }
   1554 
   1555   /* Perform insn bits field.  */
   1556   val >>= howto->rightshift;
   1557   val = val & (((bfd_vma)0x1 << howto->bitsize) - 1);
   1558 
   1559   /* Perform insn bits field.  15:0<<10, 20:16>>16.  */
   1560   val = ((val & 0xffff) << 10) | ((val >> 16) & 0x1f);
   1561 
   1562   *fix_val = val;
   1563 
   1564   return true;
   1565 }
   1566 
   1567 /* Reloc type:
   1568    R_LARCH_SOP_POP_32_S_0_10_10_16_S2
   1569    R_LARCH_B26.  */
   1570 static bool
   1571 reloc_bits_b26 (reloc_howto_type *howto,
   1572 		bfd_vma *fix_val)
   1573 {
   1574   /* Return false if overflow.  */
   1575   if (howto->complain_on_overflow != complain_overflow_signed)
   1576     return false;
   1577 
   1578   bfd_signed_vma val = *fix_val;
   1579 
   1580   if (val & ((0x1UL << howto->rightshift) - 1))
   1581     return false;
   1582 
   1583   int bitsize = howto->bitsize + howto->rightshift;
   1584   bfd_signed_vma sig_bit = (val >> (bitsize - 1)) & 0x1;
   1585 
   1586   /* If val < 0.  */
   1587   if (sig_bit)
   1588     {
   1589       if ((LARCH_RELOC_BFD_VMA_BIT_MASK (bitsize - 1) & val)
   1590 	  != LARCH_RELOC_BFD_VMA_BIT_MASK (bitsize - 1))
   1591 	return false;
   1592     }
   1593   else
   1594     {
   1595       if (LARCH_RELOC_BFD_VMA_BIT_MASK (bitsize) & val)
   1596 	return false;
   1597     }
   1598 
   1599   /* Perform insn bits field.  */
   1600   val >>= howto->rightshift;
   1601   val = val & (((bfd_vma)0x1 << howto->bitsize) - 1);
   1602 
   1603   /* Perform insn bits field.  25:16>>16, 15:0<<10.  */
   1604   val = ((val & 0xffff) << 10) | ((val >> 16) & 0x3ff);
   1605 
   1606   *fix_val = val;
   1607 
   1608   return true;
   1609 }
   1610 
   1611 bool
   1612 loongarch_adjust_reloc_bitsfield (reloc_howto_type *howto,
   1613 				  bfd_vma *fix_val)
   1614 {
   1615   BFD_ASSERT (((loongarch_reloc_howto_type *)howto)->adjust_reloc_bits);
   1616   return ((loongarch_reloc_howto_type *)
   1617 	  howto)->adjust_reloc_bits(howto, fix_val);
   1618 }
   1619