RISC-V cross compiler now builds (XCC)
[akaros.git] / tools / compilers / gcc-glibc / binutils-2.21.1-riscv.patch
1 diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/archures.c binutils-2.21.1/bfd/archures.c
2 --- ../binutils-2.21.1-orig/bfd/archures.c      2010-07-23 07:52:46.000000000 -0700
3 +++ binutils-2.21.1/bfd/archures.c      2011-10-22 18:46:17.000000000 -0700
4 @@ -515,6 +515,7 @@
5  extern const bfd_arch_info_type bfd_plugin_arch;
6  extern const bfd_arch_info_type bfd_powerpc_archs[];
7  #define bfd_powerpc_arch bfd_powerpc_archs[0]
8 +extern const bfd_arch_info_type bfd_riscv_arch;
9  extern const bfd_arch_info_type bfd_rs6000_arch;
10  extern const bfd_arch_info_type bfd_rx_arch;
11  extern const bfd_arch_info_type bfd_s390_arch;
12 @@ -589,6 +590,7 @@
13      &bfd_or32_arch,
14      &bfd_pdp11_arch,
15      &bfd_powerpc_arch,
16 +    &bfd_riscv_arch,
17      &bfd_rs6000_arch,
18      &bfd_rx_arch,
19      &bfd_s390_arch,
20 diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/bfd-in2.h binutils-2.21.1/bfd/bfd-in2.h
21 --- ../binutils-2.21.1-orig/bfd/bfd-in2.h       2011-06-27 00:39:01.000000000 -0700
22 +++ binutils-2.21.1/bfd/bfd-in2.h       2011-10-22 18:46:17.000000000 -0700
23 @@ -1919,6 +1919,9 @@
24  #define bfd_mach_ppc_e500mc    5001
25  #define bfd_mach_ppc_e500mc64  5005
26  #define bfd_mach_ppc_titan     83
27 +  bfd_arch_riscv, /* RISC-V */
28 +#define bfd_mach_riscv_rocket32 132
29 +#define bfd_mach_riscv_rocket64 164
30    bfd_arch_rs6000,    /* IBM RS/6000 */
31  #define bfd_mach_rs6k          6000
32  #define bfd_mach_rs6k_rs1      6001
33 @@ -4761,6 +4764,14 @@
34  value in a word.  The relocation is relative offset from  */
35    BFD_RELOC_MICROBLAZE_32_GOTOFF,
36  
37 +  /* RISC-V relocations */
38 +  BFD_RELOC_RISCV_TLS_GOT_HI16,
39 +  BFD_RELOC_RISCV_TLS_GOT_LO16,
40 +  BFD_RELOC_RISCV_TLS_GD_HI16,
41 +  BFD_RELOC_RISCV_TLS_GD_LO16,
42 +  BFD_RELOC_RISCV_TLS_LDM_HI16,
43 +  BFD_RELOC_RISCV_TLS_LDM_LO16,
44 +
45  /* This is used to tell the dynamic linker to copy the value out of
46  the dynamic object into the runtime process image.  */
47    BFD_RELOC_MICROBLAZE_COPY,
48 diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/config.bfd binutils-2.21.1/bfd/config.bfd
49 --- ../binutils-2.21.1-orig/bfd/config.bfd      2011-04-01 05:02:42.000000000 -0700
50 +++ binutils-2.21.1/bfd/config.bfd      2011-10-22 18:46:17.000000000 -0700
51 @@ -96,6 +96,7 @@
52  pdp11*)                 targ_archs=bfd_pdp11_arch ;;
53  pj*)            targ_archs="bfd_pj_arch bfd_i386_arch";;
54  powerpc*)       targ_archs="bfd_rs6000_arch bfd_powerpc_arch" ;;
55 +riscv*)                 targ_archs=bfd_riscv_arch ;;
56  rs6000)                 targ_archs="bfd_rs6000_arch bfd_powerpc_arch" ;;
57  s390*)          targ_archs=bfd_s390_arch ;;
58  sh*)            targ_archs=bfd_sh_arch ;;
59 @@ -1193,6 +1194,14 @@
60      targ_selvecs="bfd_powerpcle_pei_vec bfd_powerpc_pei_vec bfd_powerpcle_pe_vec bfd_powerpc_pe_vec"
61      ;;
62  
63 +#ifdef BFD64
64 +  riscv*-*-linux*)
65 +    targ_defvec=bfd_elf64_littleriscv_vec
66 +    targ_selvecs="bfd_elf32_littleriscv_vec bfd_elf64_littleriscv_vec"
67 +    want64=true
68 +    ;;
69 +#endif
70 +
71    rx-*-elf)
72      targ_defvec=bfd_elf32_rx_le_vec
73      targ_selvecs="bfd_elf32_rx_be_vec bfd_elf32_rx_le_vec"
74 diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/configure binutils-2.21.1/bfd/configure
75 --- ../binutils-2.21.1-orig/bfd/configure       2011-06-27 01:57:12.000000000 -0700
76 +++ binutils-2.21.1/bfd/configure       2011-10-22 18:47:51.000000000 -0700
77 @@ -15239,6 +15239,7 @@
78      bfd_elf32_littlemips_vec)  tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;;
79      bfd_elf32_littlemips_vxworks_vec)
80                                 tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;;
81 +    bfd_elf32_littleriscv_vec)         tb="$tb elf32-riscv.lo elfxx-riscv.lo elf32.lo $elf ecofflink.lo" ;;
82      bfd_elf32_m32c_vec)         tb="$tb elf32-m32c.lo elf32.lo $elf" ;;
83      bfd_elf32_m32r_vec)                tb="$tb elf32-m32r.lo elf32.lo $elf" ;;
84      bfd_elf32_m32rle_vec)       tb="$tb elf32-m32r.lo elf32.lo $elf" ;;
85 @@ -15320,6 +15321,7 @@
86      bfd_elf64_ia64_vms_vec)    tb="$tb elf64-ia64.lo elf64.lo vms-lib.lo vms-misc.lo $elf"; target_size=64 ;;
87      bfd_elf64_little_generic_vec) tb="$tb elf64-gen.lo elf64.lo $elf"; target_size=64 ;;
88      bfd_elf64_littlemips_vec)  tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
89 +    bfd_elf64_littleriscv_vec)         tb="$tb elf64-riscv.lo elf64.lo elfxx-riscv.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
90      bfd_elf64_mmix_vec)        tb="$tb elf64-mmix.lo elf64.lo $elf" target_size=64 ;;
91      bfd_elf64_powerpc_vec)     tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf"; target_size=64 ;;
92      bfd_elf64_powerpcle_vec)   tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf" target_size=64 ;;
93 diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/configure.in binutils-2.21.1/bfd/configure.in
94 --- ../binutils-2.21.1-orig/bfd/configure.in    2011-06-27 01:57:10.000000000 -0700
95 +++ binutils-2.21.1/bfd/configure.in    2011-10-22 18:46:17.000000000 -0700
96 @@ -730,6 +730,7 @@
97      bfd_elf32_littlemips_vec)  tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;;
98      bfd_elf32_littlemips_vxworks_vec)
99                                 tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;;
100 +    bfd_elf32_littleriscv_vec)         tb="$tb elf32-riscv.lo elfxx-riscv.lo elf32.lo $elf ecofflink.lo" ;;
101      bfd_elf32_m32c_vec)         tb="$tb elf32-m32c.lo elf32.lo $elf" ;;
102      bfd_elf32_m32r_vec)                tb="$tb elf32-m32r.lo elf32.lo $elf" ;;
103      bfd_elf32_m32rle_vec)       tb="$tb elf32-m32r.lo elf32.lo $elf" ;;
104 @@ -811,6 +812,7 @@
105      bfd_elf64_ia64_vms_vec)    tb="$tb elf64-ia64.lo elf64.lo vms-lib.lo vms-misc.lo $elf"; target_size=64 ;;
106      bfd_elf64_little_generic_vec) tb="$tb elf64-gen.lo elf64.lo $elf"; target_size=64 ;;
107      bfd_elf64_littlemips_vec)  tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
108 +    bfd_elf64_littleriscv_vec)         tb="$tb elf64-riscv.lo elf64.lo elfxx-riscv.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
109      bfd_elf64_mmix_vec)        tb="$tb elf64-mmix.lo elf64.lo $elf" target_size=64 ;;
110      bfd_elf64_powerpc_vec)     tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf"; target_size=64 ;;
111      bfd_elf64_powerpcle_vec)   tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf" target_size=64 ;;
112 diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/cpu-riscv.c binutils-2.21.1/bfd/cpu-riscv.c
113 --- ../binutils-2.21.1-orig/bfd/cpu-riscv.c     1969-12-31 16:00:00.000000000 -0800
114 +++ binutils-2.21.1/bfd/cpu-riscv.c     2011-10-22 18:50:03.000000000 -0700
115 @@ -0,0 +1,78 @@
116 +/* bfd back-end for mips support
117 +   Copyright 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 2000, 2001,
118 +   2002, 2003, 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
119 +   Written by Steve Chamberlain of Cygnus Support.
120 +
121 +   This file is part of BFD, the Binary File Descriptor library.
122 +
123 +   This program is free software; you can redistribute it and/or modify
124 +   it under the terms of the GNU General Public License as published by
125 +   the Free Software Foundation; either version 3 of the License, or
126 +   (at your option) any later version.
127 +
128 +   This program is distributed in the hope that it will be useful,
129 +   but WITHOUT ANY WARRANTY; without even the implied warranty of
130 +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
131 +   GNU General Public License for more details.
132 +
133 +   You should have received a copy of the GNU General Public License
134 +   along with this program; if not, write to the Free Software
135 +   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
136 +   MA 02110-1301, USA.  */
137 +
138 +#include "sysdep.h"
139 +#include "bfd.h"
140 +#include "libbfd.h"
141 +
142 +static const bfd_arch_info_type *mips_compatible
143 +  (const bfd_arch_info_type *, const bfd_arch_info_type *);
144 +
145 +/* The default routine tests bits_per_word, which is wrong on mips as
146 +   mips word size doesn't correlate with reloc size.  */
147 +
148 +static const bfd_arch_info_type *
149 +mips_compatible (const bfd_arch_info_type *a, const bfd_arch_info_type *b)
150 +{
151 +  if (a->arch != b->arch)
152 +    return NULL;
153 +
154 +  /* Machine compatibility is checked in
155 +     _bfd_mips_elf_merge_private_bfd_data.  */
156 +
157 +  return a;
158 +}
159 +
160 +#define N(BITS_WORD, BITS_ADDR, NUMBER, PRINT, DEFAULT, NEXT)          \
161 +  {                                                    \
162 +    BITS_WORD, /*  bits in a word */                   \
163 +    BITS_ADDR, /* bits in an address */                        \
164 +    8, /* 8 bits in a byte */                          \
165 +    bfd_arch_riscv,                                    \
166 +    NUMBER,                                            \
167 +    "riscv",                                           \
168 +    PRINT,                                             \
169 +    3,                                                 \
170 +    DEFAULT,                                           \
171 +    mips_compatible,                                   \
172 +    bfd_default_scan,                                  \
173 +    NEXT,                                              \
174 +  }
175 +
176 +enum
177 +{
178 +  I_riscv_rocket64,
179 +  I_riscv_rocket32
180 +};
181 +
182 +#define NN(index) (&arch_info_struct[(index) + 1])
183 +
184 +static const bfd_arch_info_type arch_info_struct[] =
185 +{
186 +  N (64, 64, bfd_mach_riscv_rocket64, "riscv:rocket64", FALSE, NN(I_riscv_rocket64)),
187 +  N (32, 32, bfd_mach_riscv_rocket32, "riscv:rocket32", FALSE, 0)
188 +};
189 +
190 +/* The default architecture is riscv:rocket64. */
191 +
192 +const bfd_arch_info_type bfd_riscv_arch =
193 +N (64, 64, 0, "riscv", TRUE, &arch_info_struct[0]);
194 diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elf32-riscv.c binutils-2.21.1/bfd/elf32-riscv.c
195 --- ../binutils-2.21.1-orig/bfd/elf32-riscv.c   1969-12-31 16:00:00.000000000 -0800
196 +++ binutils-2.21.1/bfd/elf32-riscv.c   2011-10-22 18:50:03.000000000 -0700
197 @@ -0,0 +1,2300 @@
198 +/* MIPS-specific support for 32-bit ELF
199 +   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
200 +   2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
201 +
202 +   Most of the information added by Ian Lance Taylor, Cygnus Support,
203 +   <ian@cygnus.com>.
204 +   N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
205 +   <mark@codesourcery.com>
206 +   Traditional MIPS targets support added by Koundinya.K, Dansk Data
207 +   Elektronik & Operations Research Group. <kk@ddeorg.soft.net>
208 +
209 +   This file is part of BFD, the Binary File Descriptor library.
210 +
211 +   This program is free software; you can redistribute it and/or modify
212 +   it under the terms of the GNU General Public License as published by
213 +   the Free Software Foundation; either version 3 of the License, or
214 +   (at your option) any later version.
215 +
216 +   This program is distributed in the hope that it will be useful,
217 +   but WITHOUT ANY WARRANTY; without even the implied warranty of
218 +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
219 +   GNU General Public License for more details.
220 +
221 +   You should have received a copy of the GNU General Public License
222 +   along with this program; if not, write to the Free Software
223 +   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
224 +   MA 02110-1301, USA.  */
225 +
226 +
227 +/* This file handles MIPS ELF targets.  SGI Irix 5 uses a slightly
228 +   different MIPS ELF from other targets.  This matters when linking.
229 +   This file supports both, switching at runtime.  */
230 +
231 +#include "sysdep.h"
232 +#include "bfd.h"
233 +#include "libbfd.h"
234 +#include "bfdlink.h"
235 +#include "genlink.h"
236 +#include "elf-bfd.h"
237 +#include "elfxx-riscv.h"
238 +#include "elf/riscv.h"
239 +#include "opcode/riscv.h"
240 +
241 +/* Get the ECOFF swapping routines.  */
242 +#include "coff/sym.h"
243 +#include "coff/symconst.h"
244 +#include "coff/internal.h"
245 +#include "coff/ecoff.h"
246 +#include "coff/mips.h"
247 +#define ECOFF_SIGNED_32
248 +#include "ecoffswap.h"
249 +
250 +#include "opcode/riscv.h"
251 +
252 +static bfd_boolean mips_elf_assign_gp
253 +  (bfd *, bfd_vma *);
254 +static bfd_reloc_status_type mips_elf_final_gp
255 +  (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
256 +static bfd_reloc_status_type mips_elf_gprel16_reloc
257 +  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
258 +static bfd_reloc_status_type mips_elf_literal_reloc
259 +  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
260 +static bfd_reloc_status_type mips_elf_gprel32_reloc
261 +  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
262 +static bfd_reloc_status_type gprel32_with_gp
263 +  (bfd *, asymbol *, arelent *, asection *, bfd_boolean, void *, bfd_vma);
264 +static bfd_reloc_status_type mips16_gprel_reloc
265 +  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
266 +static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
267 +  (bfd *, bfd_reloc_code_real_type);
268 +static reloc_howto_type *mips_elf_n32_rtype_to_howto
269 +  (unsigned int, bfd_boolean);
270 +static void mips_info_to_howto_rel
271 +  (bfd *, arelent *, Elf_Internal_Rela *);
272 +static void mips_info_to_howto_rela
273 +  (bfd *, arelent *, Elf_Internal_Rela *);
274 +static bfd_boolean mips_elf_sym_is_global
275 +  (bfd *, asymbol *);
276 +static bfd_boolean mips_elf_n32_object_p
277 +  (bfd *);
278 +static bfd_boolean elf32_mips_grok_prstatus
279 +  (bfd *, Elf_Internal_Note *);
280 +static bfd_boolean elf32_mips_grok_psinfo
281 +  (bfd *, Elf_Internal_Note *);
282 +
283 +extern const bfd_target bfd_elf32_nbigmips_vec;
284 +extern const bfd_target bfd_elf32_nlittlemips_vec;
285 +
286 +/* Nonzero if ABFD is using the N32 ABI.  */
287 +#define ABI_N32_P(abfd) \
288 +  ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
289 +
290 +/* The number of local .got entries we reserve.  */
291 +#define MIPS_RESERVED_GOTNO (2)
292 +
293 +/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
294 +   from smaller values.  Start with zero, widen, *then* decrement.  */
295 +#define MINUS_ONE      (((bfd_vma)0) - 1)
296 +
297 +/* The relocation table used for SHT_REL sections.  */
298 +
299 +static reloc_howto_type elf_mips_howto_table_rel[] =
300 +{
301 +  /* No relocation.  */
302 +  HOWTO (R_RISCV_NONE,         /* type */
303 +        0,                     /* rightshift */
304 +        0,                     /* size (0 = byte, 1 = short, 2 = long) */
305 +        0,                     /* bitsize */
306 +        FALSE,                 /* pc_relative */
307 +        0,                     /* bitpos */
308 +        complain_overflow_dont, /* complain_on_overflow */
309 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
310 +        "R_RISCV_NONE",                /* name */
311 +        FALSE,                 /* partial_inplace */
312 +        0,                     /* src_mask */
313 +        0,                     /* dst_mask */
314 +        FALSE),                /* pcrel_offset */
315 +
316 +  EMPTY_HOWTO (1),
317 +
318 +  /* 32 bit relocation.  */
319 +  HOWTO (R_RISCV_32,           /* type */
320 +        0,                     /* rightshift */
321 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
322 +        32,                    /* bitsize */
323 +        FALSE,                 /* pc_relative */
324 +        0,                     /* bitpos */
325 +        complain_overflow_dont, /* complain_on_overflow */
326 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
327 +        "R_RISCV_32",          /* name */
328 +        TRUE,                  /* partial_inplace */
329 +        0xffffffff,            /* src_mask */
330 +        0xffffffff,            /* dst_mask */
331 +        FALSE),                /* pcrel_offset */
332 +
333 +  /* 32 bit symbol relative relocation.  */
334 +  HOWTO (R_RISCV_REL32,                /* type */
335 +        0,                     /* rightshift */
336 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
337 +        32,                    /* bitsize */
338 +        FALSE,                 /* pc_relative */
339 +        0,                     /* bitpos */
340 +        complain_overflow_dont, /* complain_on_overflow */
341 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
342 +        "R_RISCV_REL32",       /* name */
343 +        TRUE,                  /* partial_inplace */
344 +        0xffffffff,            /* src_mask */
345 +        0xffffffff,            /* dst_mask */
346 +        FALSE),                /* pcrel_offset */
347 +
348 +  /* 26 bit jump address.  */
349 +  HOWTO (R_RISCV_26,           /* type */
350 +        RISCV_JUMP_ALIGN_BITS,                 /* rightshift */
351 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
352 +        RISCV_JUMP_BITS,                       /* bitsize */
353 +        TRUE,                  /* pc_relative */
354 +        OP_SH_TARGET,                  /* bitpos */
355 +        complain_overflow_dont, /* complain_on_overflow */
356 +                               /* This needs complex overflow
357 +                                  detection, because the upper 36
358 +                                  bits must match the PC + 4.  */
359 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
360 +        "R_RISCV_26",          /* name */
361 +        TRUE,                  /* partial_inplace */
362 +        ((1<<RISCV_JUMP_BITS)-1) << OP_SH_TARGET,              /* src_mask */
363 +        ((1<<RISCV_JUMP_BITS)-1) << OP_SH_TARGET,              /* dst_mask */
364 +        TRUE),         /* pcrel_offset */
365 +
366 +  /* R_RISCV_HI16 and R_RISCV_LO16 are unsupported for NewABI REL.
367 +     However, the native IRIX6 tools use them, so we try our best. */
368 +
369 +  /* High 16 bits of symbol value.  */
370 +  HOWTO (R_RISCV_HI16,         /* type */
371 +        RISCV_IMM_BITS,                        /* rightshift */
372 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
373 +        32-RISCV_IMM_BITS,                     /* bitsize */
374 +        FALSE,                 /* pc_relative */
375 +        OP_SH_BIGIMMEDIATE,                    /* bitpos */
376 +        complain_overflow_dont, /* complain_on_overflow */
377 +        _bfd_riscv_elf_hi16_reloc, /* special_function */
378 +        "R_RISCV_HI16",                /* name */
379 +        TRUE,                  /* partial_inplace */
380 +        ((1<<(32-RISCV_IMM_BITS))-1) << OP_SH_BIGIMMEDIATE,            /* src_mask */
381 +        ((1<<(32-RISCV_IMM_BITS))-1) << OP_SH_BIGIMMEDIATE,            /* dst_mask */
382 +        FALSE),                /* pcrel_offset */
383 +
384 +  /* Low 16 bits of symbol value.  */
385 +  HOWTO (R_RISCV_LO16,         /* type */
386 +        0,                     /* rightshift */
387 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
388 +        RISCV_IMM_BITS,                        /* bitsize */
389 +        FALSE,                 /* pc_relative */
390 +        OP_SH_IMMEDIATE,                       /* bitpos */
391 +        complain_overflow_dont, /* complain_on_overflow */
392 +        _bfd_riscv_elf_lo16_reloc, /* special_function */
393 +        "R_RISCV_LO16",                /* name */
394 +        TRUE,                  /* partial_inplace */
395 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,                /* src_mask */
396 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,                /* dst_mask */
397 +        FALSE),                /* pcrel_offset */
398 +
399 +  /* GP relative reference.  */
400 +  HOWTO (R_RISCV_GPREL16,      /* type */
401 +        0,                     /* rightshift */
402 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
403 +        RISCV_IMM_BITS,                        /* bitsize */
404 +        FALSE,                 /* pc_relative */
405 +        0,                     /* bitpos */
406 +        complain_overflow_signed, /* complain_on_overflow */
407 +        mips_elf_gprel16_reloc, /* special_function */
408 +        "R_RISCV_GPREL16",     /* name */
409 +        TRUE,                  /* partial_inplace */
410 +        RISCV_IMM_REACH-1,             /* src_mask */
411 +        RISCV_IMM_REACH-1,             /* dst_mask */
412 +        FALSE),                /* pcrel_offset */
413 +
414 +  /* Reference to literal section.  */
415 +  HOWTO (R_RISCV_LITERAL,      /* type */
416 +        0,                     /* rightshift */
417 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
418 +        RISCV_IMM_BITS,                        /* bitsize */
419 +        FALSE,                 /* pc_relative */
420 +        0,                     /* bitpos */
421 +        complain_overflow_signed, /* complain_on_overflow */
422 +        mips_elf_literal_reloc, /* special_function */
423 +        "R_RISCV_LITERAL",     /* name */
424 +        TRUE,                  /* partial_inplace */
425 +        RISCV_IMM_REACH-1,             /* src_mask */
426 +        RISCV_IMM_REACH-1,             /* dst_mask */
427 +        FALSE),                /* pcrel_offset */
428 +
429 +  /* Reference to global offset table.  */
430 +  HOWTO (R_RISCV_GOT16,                /* type */
431 +        0,                     /* rightshift */
432 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
433 +        RISCV_IMM_BITS,                        /* bitsize */
434 +        FALSE,                 /* pc_relative */
435 +        0,                     /* bitpos */
436 +        complain_overflow_signed, /* complain_on_overflow */
437 +        _bfd_riscv_elf_got16_reloc, /* special_function */
438 +        "R_RISCV_GOT16",       /* name */
439 +        TRUE,                  /* partial_inplace */
440 +        RISCV_IMM_REACH-1,             /* src_mask */
441 +        RISCV_IMM_REACH-1,             /* dst_mask */
442 +        FALSE),                /* pcrel_offset */
443 +
444 +  /* 16 bit PC relative reference.  Note that the ABI document has a typo
445 +     and claims R_RISCV_PC16 to be not rightshifted, rendering it useless.
446 +     We do the right thing here.  */
447 +  HOWTO (R_RISCV_PC16,         /* type */
448 +        RISCV_BRANCH_ALIGN_BITS,                       /* rightshift */
449 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
450 +        RISCV_IMM_BITS,                        /* bitsize */
451 +        TRUE,                  /* pc_relative */
452 +        0,                     /* bitpos */
453 +        complain_overflow_signed, /* complain_on_overflow */
454 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
455 +        "R_RISCV_PC16",                /* name */
456 +        TRUE,                  /* partial_inplace */
457 +        RISCV_IMM_REACH-1,             /* src_mask */
458 +        RISCV_IMM_REACH-1,             /* dst_mask */
459 +        TRUE),                 /* pcrel_offset */
460 +
461 +  /* 16 bit call through global offset table.  */
462 +  HOWTO (R_RISCV_CALL16,               /* type */
463 +        0,                     /* rightshift */
464 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
465 +        RISCV_IMM_BITS,                        /* bitsize */
466 +        FALSE,                 /* pc_relative */
467 +        0,                     /* bitpos */
468 +        complain_overflow_signed, /* complain_on_overflow */
469 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
470 +        "R_RISCV_CALL16",      /* name */
471 +        TRUE,                  /* partial_inplace */
472 +        RISCV_IMM_REACH-1,             /* src_mask */
473 +        RISCV_IMM_REACH-1,             /* dst_mask */
474 +        FALSE),                /* pcrel_offset */
475 +
476 +  /* 32 bit GP relative reference.  */
477 +  HOWTO (R_RISCV_GPREL32,      /* type */
478 +        0,                     /* rightshift */
479 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
480 +        32,                    /* bitsize */
481 +        FALSE,                 /* pc_relative */
482 +        0,                     /* bitpos */
483 +        complain_overflow_dont, /* complain_on_overflow */
484 +        mips_elf_gprel32_reloc, /* special_function */
485 +        "R_RISCV_GPREL32",     /* name */
486 +        TRUE,                  /* partial_inplace */
487 +        0xffffffff,            /* src_mask */
488 +        0xffffffff,            /* dst_mask */
489 +        FALSE),                /* pcrel_offset */
490 +
491 +  EMPTY_HOWTO (13),
492 +  EMPTY_HOWTO (14),
493 +  EMPTY_HOWTO (15),
494 +  EMPTY_HOWTO (16),
495 +  EMPTY_HOWTO (17),
496 +
497 +  /* 64 bit relocation.  */
498 +  HOWTO (R_RISCV_64,           /* type */
499 +        0,                     /* rightshift */
500 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
501 +        64,                    /* bitsize */
502 +        FALSE,                 /* pc_relative */
503 +        0,                     /* bitpos */
504 +        complain_overflow_dont, /* complain_on_overflow */
505 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
506 +        "R_RISCV_64",          /* name */
507 +        TRUE,                  /* partial_inplace */
508 +        MINUS_ONE,             /* src_mask */
509 +        MINUS_ONE,             /* dst_mask */
510 +        FALSE),                /* pcrel_offset */
511 +
512 +  /* Displacement in the global offset table.  */
513 +  HOWTO (R_RISCV_GOT_DISP,     /* type */
514 +        0,                     /* rightshift */
515 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
516 +        RISCV_IMM_BITS,                        /* bitsize */
517 +        FALSE,                 /* pc_relative */
518 +        0,                     /* bitpos */
519 +        complain_overflow_signed, /* complain_on_overflow */
520 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
521 +        "R_RISCV_GOT_DISP",    /* name */
522 +        TRUE,                  /* partial_inplace */
523 +        RISCV_IMM_REACH-1,             /* src_mask */
524 +        RISCV_IMM_REACH-1,             /* dst_mask */
525 +        FALSE),                /* pcrel_offset */
526 +
527 +  EMPTY_HOWTO (20),
528 +  EMPTY_HOWTO (21),
529 +
530 +  /* High 16 bits of displacement in global offset table.  */
531 +  HOWTO (R_RISCV_GOT_HI16,     /* type */
532 +        0,                     /* rightshift */
533 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
534 +        32-RISCV_IMM_BITS,                     /* bitsize */
535 +        FALSE,                 /* pc_relative */
536 +        0,                     /* bitpos */
537 +        complain_overflow_dont, /* complain_on_overflow */
538 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
539 +        "R_RISCV_GOT_HI16",    /* name */
540 +        TRUE,                  /* partial_inplace */
541 +        (1<<(RISCV_IMM_BITS))-1,               /* src_mask */
542 +        (1<<(RISCV_IMM_BITS))-1,               /* dst_mask */
543 +        FALSE),                /* pcrel_offset */
544 +
545 +  /* Low 16 bits of displacement in global offset table.  */
546 +  HOWTO (R_RISCV_GOT_LO16,     /* type */
547 +        0,                     /* rightshift */
548 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
549 +        RISCV_IMM_BITS,                        /* bitsize */
550 +        FALSE,                 /* pc_relative */
551 +        0,                     /* bitpos */
552 +        complain_overflow_dont, /* complain_on_overflow */
553 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
554 +        "R_RISCV_GOT_LO16",    /* name */
555 +        TRUE,                  /* partial_inplace */
556 +        RISCV_IMM_REACH-1,             /* src_mask */
557 +        RISCV_IMM_REACH-1,             /* dst_mask */
558 +        FALSE),                /* pcrel_offset */
559 +
560 +  /* 64 bit subtraction.  */
561 +  HOWTO (R_RISCV_SUB,          /* type */
562 +        0,                     /* rightshift */
563 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
564 +        64,                    /* bitsize */
565 +        FALSE,                 /* pc_relative */
566 +        0,                     /* bitpos */
567 +        complain_overflow_dont, /* complain_on_overflow */
568 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
569 +        "R_RISCV_SUB",         /* name */
570 +        TRUE,                  /* partial_inplace */
571 +        MINUS_ONE,             /* src_mask */
572 +        MINUS_ONE,             /* dst_mask */
573 +        FALSE),                /* pcrel_offset */
574 +
575 +  /* Insert the addend as an instruction.  */
576 +  /* FIXME: Not handled correctly.  */
577 +  HOWTO (R_RISCV_INSERT_A,     /* type */
578 +        0,                     /* rightshift */
579 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
580 +        32,                    /* bitsize */
581 +        FALSE,                 /* pc_relative */
582 +        0,                     /* bitpos */
583 +        complain_overflow_dont, /* complain_on_overflow */
584 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
585 +        "R_RISCV_INSERT_A",    /* name */
586 +        TRUE,                  /* partial_inplace */
587 +        0xffffffff,            /* src_mask */
588 +        0xffffffff,            /* dst_mask */
589 +        FALSE),                /* pcrel_offset */
590 +
591 +  /* Insert the addend as an instruction, and change all relocations
592 +     to refer to the old instruction at the address.  */
593 +  /* FIXME: Not handled correctly.  */
594 +  HOWTO (R_RISCV_INSERT_B,     /* type */
595 +        0,                     /* rightshift */
596 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
597 +        32,                    /* bitsize */
598 +        FALSE,                 /* pc_relative */
599 +        0,                     /* bitpos */
600 +        complain_overflow_dont, /* complain_on_overflow */
601 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
602 +        "R_RISCV_INSERT_B",    /* name */
603 +        TRUE,                  /* partial_inplace */
604 +        0xffffffff,            /* src_mask */
605 +        0xffffffff,            /* dst_mask */
606 +        FALSE),                /* pcrel_offset */
607 +
608 +  /* Delete a 32 bit instruction.  */
609 +  /* FIXME: Not handled correctly.  */
610 +  HOWTO (R_RISCV_DELETE,               /* type */
611 +        0,                     /* rightshift */
612 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
613 +        32,                    /* bitsize */
614 +        FALSE,                 /* pc_relative */
615 +        0,                     /* bitpos */
616 +        complain_overflow_dont, /* complain_on_overflow */
617 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
618 +        "R_RISCV_DELETE",      /* name */
619 +        TRUE,                  /* partial_inplace */
620 +        0xffffffff,            /* src_mask */
621 +        0xffffffff,            /* dst_mask */
622 +        FALSE),                /* pcrel_offset */
623 +
624 +  EMPTY_HOWTO (28),
625 +  EMPTY_HOWTO (29),
626 +
627 +  /* High 16 bits of displacement in global offset table.  */
628 +  HOWTO (R_RISCV_CALL_HI16,    /* type */
629 +        0,                     /* rightshift */
630 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
631 +        32-RISCV_IMM_BITS,                     /* bitsize */
632 +        FALSE,                 /* pc_relative */
633 +        0,                     /* bitpos */
634 +        complain_overflow_dont, /* complain_on_overflow */
635 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
636 +        "R_RISCV_CALL_HI16",   /* name */
637 +        TRUE,                  /* partial_inplace */
638 +        (1<<(32-RISCV_IMM_BITS))-1,            /* src_mask */
639 +        (1<<(32-RISCV_IMM_BITS))-1,            /* dst_mask */
640 +        FALSE),                /* pcrel_offset */
641 +
642 +  /* Low 16 bits of displacement in global offset table.  */
643 +  HOWTO (R_RISCV_CALL_LO16,    /* type */
644 +        0,                     /* rightshift */
645 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
646 +        RISCV_IMM_BITS,                        /* bitsize */
647 +        FALSE,                 /* pc_relative */
648 +        0,                     /* bitpos */
649 +        complain_overflow_dont, /* complain_on_overflow */
650 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
651 +        "R_RISCV_CALL_LO16",   /* name */
652 +        TRUE,                  /* partial_inplace */
653 +        RISCV_IMM_REACH-1,             /* src_mask */
654 +        RISCV_IMM_REACH-1,             /* dst_mask */
655 +        FALSE),                /* pcrel_offset */
656 +
657 +  /* Section displacement, used by an associated event location section.  */
658 +  HOWTO (R_RISCV_SCN_DISP,     /* type */
659 +        0,                     /* rightshift */
660 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
661 +        32,                    /* bitsize */
662 +        FALSE,                 /* pc_relative */
663 +        0,                     /* bitpos */
664 +        complain_overflow_dont, /* complain_on_overflow */
665 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
666 +        "R_RISCV_SCN_DISP",    /* name */
667 +        TRUE,                  /* partial_inplace */
668 +        0xffffffff,            /* src_mask */
669 +        0xffffffff,            /* dst_mask */
670 +        FALSE),                /* pcrel_offset */
671 +
672 +  HOWTO (R_RISCV_REL16,                /* type */
673 +        0,                     /* rightshift */
674 +        1,                     /* size (0 = byte, 1 = short, 2 = long) */
675 +        RISCV_IMM_BITS,                        /* bitsize */
676 +        FALSE,                 /* pc_relative */
677 +        0,                     /* bitpos */
678 +        complain_overflow_signed, /* complain_on_overflow */
679 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
680 +        "R_RISCV_REL16",       /* name */
681 +        TRUE,                  /* partial_inplace */
682 +        RISCV_IMM_REACH-1,             /* src_mask */
683 +        RISCV_IMM_REACH-1,             /* dst_mask */
684 +        FALSE),                /* pcrel_offset */
685 +
686 +  /* These two are obsolete.  */
687 +  EMPTY_HOWTO (R_RISCV_ADD_IMMEDIATE),
688 +  EMPTY_HOWTO (R_RISCV_PJUMP),
689 +
690 +  /* Similiar to R_RISCV_REL32, but used for relocations in a GOT section.
691 +     It must be used for multigot GOT's (and only there).  */
692 +  HOWTO (R_RISCV_RELGOT,               /* type */
693 +        0,                     /* rightshift */
694 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
695 +        32,                    /* bitsize */
696 +        FALSE,                 /* pc_relative */
697 +        0,                     /* bitpos */
698 +        complain_overflow_dont, /* complain_on_overflow */
699 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
700 +        "R_RISCV_RELGOT",      /* name */
701 +        TRUE,                  /* partial_inplace */
702 +        0xffffffff,            /* src_mask */
703 +        0xffffffff,            /* dst_mask */
704 +        FALSE),                /* pcrel_offset */
705 +
706 +  /* Protected jump conversion.  This is an optimization hint.  No
707 +     relocation is required for correctness.  */
708 +  HOWTO (R_RISCV_JALR,         /* type */
709 +        0,                     /* rightshift */
710 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
711 +        32,                    /* bitsize */
712 +        FALSE,                 /* pc_relative */
713 +        0,                     /* bitpos */
714 +        complain_overflow_dont, /* complain_on_overflow */
715 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
716 +        "R_RISCV_JALR",                /* name */
717 +        FALSE,                 /* partial_inplace */
718 +        0,                     /* src_mask */
719 +        0x00000000,            /* dst_mask */
720 +        FALSE),                /* pcrel_offset */
721 +
722 +  /* TLS relocations.  */
723 +  EMPTY_HOWTO (R_RISCV_TLS_DTPMOD32),
724 +  EMPTY_HOWTO (R_RISCV_TLS_DTPREL32),
725 +
726 +  HOWTO (R_RISCV_TLS_DTPMOD64, /* type */
727 +        0,                     /* rightshift */
728 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
729 +        64,                    /* bitsize */
730 +        FALSE,                 /* pc_relative */
731 +        0,                     /* bitpos */
732 +        complain_overflow_dont, /* complain_on_overflow */
733 +        _bfd_riscv_elf_generic_reloc, /* special_function */
734 +        "R_RISCV_TLS_DTPMOD64",        /* name */
735 +        TRUE,                  /* partial_inplace */
736 +        MINUS_ONE,             /* src_mask */
737 +        MINUS_ONE,             /* dst_mask */
738 +        FALSE),                /* pcrel_offset */
739 +
740 +  HOWTO (R_RISCV_TLS_DTPREL64, /* type */
741 +        0,                     /* rightshift */
742 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
743 +        64,                    /* bitsize */
744 +        FALSE,                 /* pc_relative */
745 +        0,                     /* bitpos */
746 +        complain_overflow_dont, /* complain_on_overflow */
747 +        _bfd_riscv_elf_generic_reloc, /* special_function */
748 +        "R_RISCV_TLS_DTPREL64",        /* name */
749 +        TRUE,                  /* partial_inplace */
750 +        MINUS_ONE,             /* src_mask */
751 +        MINUS_ONE,             /* dst_mask */
752 +        FALSE),                /* pcrel_offset */
753 +
754 +  /* TLS general dynamic variable reference.  */
755 +  HOWTO (R_RISCV_TLS_GD,               /* type */
756 +        0,                     /* rightshift */
757 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
758 +        RISCV_IMM_BITS,                        /* bitsize */
759 +        FALSE,                 /* pc_relative */
760 +        0,                     /* bitpos */
761 +        complain_overflow_signed, /* complain_on_overflow */
762 +        _bfd_riscv_elf_generic_reloc, /* special_function */
763 +        "R_RISCV_TLS_GD",      /* name */
764 +        TRUE,                  /* partial_inplace */
765 +        RISCV_IMM_REACH-1,             /* src_mask */
766 +        RISCV_IMM_REACH-1,             /* dst_mask */
767 +        FALSE),                /* pcrel_offset */
768 +
769 +  /* TLS local dynamic variable reference.  */
770 +  HOWTO (R_RISCV_TLS_LDM,      /* type */
771 +        0,                     /* rightshift */
772 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
773 +        RISCV_IMM_BITS,                        /* bitsize */
774 +        FALSE,                 /* pc_relative */
775 +        0,                     /* bitpos */
776 +        complain_overflow_signed, /* complain_on_overflow */
777 +        _bfd_riscv_elf_generic_reloc, /* special_function */
778 +        "R_RISCV_TLS_LDM",     /* name */
779 +        TRUE,                  /* partial_inplace */
780 +        RISCV_IMM_REACH-1,             /* src_mask */
781 +        RISCV_IMM_REACH-1,             /* dst_mask */
782 +        FALSE),                /* pcrel_offset */
783 +
784 +  /* TLS local dynamic offset.  */
785 +  HOWTO (R_RISCV_TLS_DTPREL_HI16,      /* type */
786 +        0,                     /* rightshift */
787 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
788 +        32-RISCV_IMM_BITS,                     /* bitsize */
789 +        FALSE,                 /* pc_relative */
790 +        0,                     /* bitpos */
791 +        complain_overflow_signed, /* complain_on_overflow */
792 +        _bfd_riscv_elf_generic_reloc, /* special_function */
793 +        "R_RISCV_TLS_DTPREL_HI16",     /* name */
794 +        TRUE,                  /* partial_inplace */
795 +        (1<<(32-RISCV_IMM_BITS))-1,            /* src_mask */
796 +        (1<<(32-RISCV_IMM_BITS))-1,            /* dst_mask */
797 +        FALSE),                /* pcrel_offset */
798 +
799 +  /* TLS local dynamic offset.  */
800 +  HOWTO (R_RISCV_TLS_DTPREL_LO16,      /* type */
801 +        0,                     /* rightshift */
802 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
803 +        RISCV_IMM_BITS,                        /* bitsize */
804 +        FALSE,                 /* pc_relative */
805 +        0,                     /* bitpos */
806 +        complain_overflow_signed, /* complain_on_overflow */
807 +        _bfd_riscv_elf_generic_reloc, /* special_function */
808 +        "R_RISCV_TLS_DTPREL_LO16",     /* name */
809 +        TRUE,                  /* partial_inplace */
810 +        RISCV_IMM_REACH-1,             /* src_mask */
811 +        RISCV_IMM_REACH-1,             /* dst_mask */
812 +        FALSE),                /* pcrel_offset */
813 +
814 +  /* TLS thread pointer offset.  */
815 +  HOWTO (R_RISCV_TLS_GOTTPREL, /* type */
816 +        0,                     /* rightshift */
817 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
818 +        RISCV_IMM_BITS,                        /* bitsize */
819 +        FALSE,                 /* pc_relative */
820 +        0,                     /* bitpos */
821 +        complain_overflow_signed, /* complain_on_overflow */
822 +        _bfd_riscv_elf_generic_reloc, /* special_function */
823 +        "R_RISCV_TLS_GOTTPREL",        /* name */
824 +        TRUE,                  /* partial_inplace */
825 +        RISCV_IMM_REACH-1,             /* src_mask */
826 +        RISCV_IMM_REACH-1,             /* dst_mask */
827 +        FALSE),                /* pcrel_offset */
828 +
829 +  /* TLS IE dynamic relocations.  */
830 +  EMPTY_HOWTO (R_RISCV_TLS_TPREL32),
831 +
832 +  HOWTO (R_RISCV_TLS_TPREL64,  /* type */
833 +        0,                     /* rightshift */
834 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
835 +        64,                    /* bitsize */
836 +        FALSE,                 /* pc_relative */
837 +        0,                     /* bitpos */
838 +        complain_overflow_dont, /* complain_on_overflow */
839 +        _bfd_riscv_elf_generic_reloc, /* special_function */
840 +        "R_RISCV_TLS_TPREL64", /* name */
841 +        TRUE,                  /* partial_inplace */
842 +        MINUS_ONE,             /* src_mask */
843 +        MINUS_ONE,             /* dst_mask */
844 +        FALSE),                /* pcrel_offset */
845 +
846 +  /* TLS thread pointer offset.  */
847 +  HOWTO (R_RISCV_TLS_TPREL_HI16,       /* type */
848 +        0,                     /* rightshift */
849 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
850 +        32-RISCV_IMM_BITS,                     /* bitsize */
851 +        FALSE,                 /* pc_relative */
852 +        0,                     /* bitpos */
853 +        complain_overflow_signed, /* complain_on_overflow */
854 +        _bfd_riscv_elf_generic_reloc, /* special_function */
855 +        "R_RISCV_TLS_TPREL_HI16", /* name */
856 +        TRUE,                  /* partial_inplace */
857 +        (1<<(32-RISCV_IMM_BITS))-1,            /* src_mask */
858 +        (1<<(32-RISCV_IMM_BITS))-1,            /* dst_mask */
859 +        FALSE),                /* pcrel_offset */
860 +
861 +  /* TLS thread pointer offset.  */
862 +  HOWTO (R_RISCV_TLS_TPREL_LO16,       /* type */
863 +        0,                     /* rightshift */
864 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
865 +        RISCV_IMM_BITS,                        /* bitsize */
866 +        FALSE,                 /* pc_relative */
867 +        0,                     /* bitpos */
868 +        complain_overflow_signed, /* complain_on_overflow */
869 +        _bfd_riscv_elf_generic_reloc, /* special_function */
870 +        "R_RISCV_TLS_TPREL_LO16", /* name */
871 +        TRUE,                  /* partial_inplace */
872 +        RISCV_IMM_REACH-1,             /* src_mask */
873 +        RISCV_IMM_REACH-1,             /* dst_mask */
874 +        FALSE),                /* pcrel_offset */
875 +
876 +  /* 32 bit relocation with no addend.  */
877 +  HOWTO (R_RISCV_GLOB_DAT,     /* type */
878 +        0,                     /* rightshift */
879 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
880 +        32,                    /* bitsize */
881 +        FALSE,                 /* pc_relative */
882 +        0,                     /* bitpos */
883 +        complain_overflow_dont, /* complain_on_overflow */
884 +        _bfd_riscv_elf_generic_reloc, /* special_function */
885 +        "R_RISCV_GLOB_DAT",    /* name */
886 +        FALSE,                 /* partial_inplace */
887 +        0x0,                   /* src_mask */
888 +        0xffffffff,            /* dst_mask */
889 +        FALSE),                /* pcrel_offset */
890 +};
891 +
892 +/* The relocation table used for SHT_RELA sections.  */
893 +
894 +static reloc_howto_type elf_mips_howto_table_rela[] =
895 +{
896 +  /* No relocation.  */
897 +  HOWTO (R_RISCV_NONE,         /* type */
898 +        0,                     /* rightshift */
899 +        0,                     /* size (0 = byte, 1 = short, 2 = long) */
900 +        0,                     /* bitsize */
901 +        FALSE,                 /* pc_relative */
902 +        0,                     /* bitpos */
903 +        complain_overflow_dont, /* complain_on_overflow */
904 +        _bfd_riscv_elf_generic_reloc, /* special_function */
905 +        "R_RISCV_NONE",                /* name */
906 +        FALSE,                 /* partial_inplace */
907 +        0,                     /* src_mask */
908 +        0,                     /* dst_mask */
909 +        FALSE),                /* pcrel_offset */
910 +
911 +  EMPTY_HOWTO (1),
912 +
913 +  /* 32 bit relocation.  */
914 +  HOWTO (R_RISCV_32,           /* type */
915 +        0,                     /* rightshift */
916 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
917 +        32,                    /* bitsize */
918 +        FALSE,                 /* pc_relative */
919 +        0,                     /* bitpos */
920 +        complain_overflow_dont, /* complain_on_overflow */
921 +        _bfd_riscv_elf_generic_reloc, /* special_function */
922 +        "R_RISCV_32",          /* name */
923 +        FALSE,                 /* partial_inplace */
924 +        0,                     /* src_mask */
925 +        0xffffffff,            /* dst_mask */
926 +        FALSE),                /* pcrel_offset */
927 +
928 +  /* 32 bit symbol relative relocation.  */
929 +  HOWTO (R_RISCV_REL32,                /* type */
930 +        0,                     /* rightshift */
931 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
932 +        32,                    /* bitsize */
933 +        FALSE,                 /* pc_relative */
934 +        0,                     /* bitpos */
935 +        complain_overflow_dont, /* complain_on_overflow */
936 +        _bfd_riscv_elf_generic_reloc, /* special_function */
937 +        "R_RISCV_REL32",       /* name */
938 +        FALSE,                 /* partial_inplace */
939 +        0,                     /* src_mask */
940 +        0xffffffff,            /* dst_mask */
941 +        FALSE),                /* pcrel_offset */
942 +
943 +  /* 26 bit jump address.  */
944 +  HOWTO (R_RISCV_26,           /* type */
945 +        2,                     /* rightshift */
946 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
947 +        26,                    /* bitsize */
948 +        FALSE,                 /* pc_relative */
949 +        0,                     /* bitpos */
950 +        complain_overflow_dont, /* complain_on_overflow */
951 +                               /* This needs complex overflow
952 +                                  detection, because the upper 36
953 +                                  bits must match the PC + 4.  */
954 +        _bfd_riscv_elf_generic_reloc, /* special_function */
955 +        "R_RISCV_26",          /* name */
956 +        FALSE,                 /* partial_inplace */
957 +        0,                     /* src_mask */
958 +        0x03ffffff,            /* dst_mask */
959 +        FALSE),                /* pcrel_offset */
960 +
961 +  /* High 16 bits of symbol value.  */
962 +  HOWTO (R_RISCV_HI16,         /* type */
963 +        0,                     /* rightshift */
964 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
965 +        16,                    /* bitsize */
966 +        FALSE,                 /* pc_relative */
967 +        0,                     /* bitpos */
968 +        complain_overflow_dont, /* complain_on_overflow */
969 +        _bfd_riscv_elf_generic_reloc, /* special_function */
970 +        "R_RISCV_HI16",                /* name */
971 +        FALSE,                 /* partial_inplace */
972 +        0,                     /* src_mask */
973 +        0x0000ffff,            /* dst_mask */
974 +        FALSE),                /* pcrel_offset */
975 +
976 +  /* Low 16 bits of symbol value.  */
977 +  HOWTO (R_RISCV_LO16,         /* type */
978 +        0,                     /* rightshift */
979 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
980 +        16,                    /* bitsize */
981 +        FALSE,                 /* pc_relative */
982 +        0,                     /* bitpos */
983 +        complain_overflow_dont, /* complain_on_overflow */
984 +        _bfd_riscv_elf_generic_reloc, /* special_function */
985 +        "R_RISCV_LO16",                /* name */
986 +        FALSE,                 /* partial_inplace */
987 +        0,                     /* src_mask */
988 +        0x0000ffff,            /* dst_mask */
989 +        FALSE),                /* pcrel_offset */
990 +
991 +  /* GP relative reference.  */
992 +  HOWTO (R_RISCV_GPREL16,      /* type */
993 +        0,                     /* rightshift */
994 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
995 +        16,                    /* bitsize */
996 +        FALSE,                 /* pc_relative */
997 +        0,                     /* bitpos */
998 +        complain_overflow_signed, /* complain_on_overflow */
999 +        mips_elf_gprel16_reloc, /* special_function */
1000 +        "R_RISCV_GPREL16",     /* name */
1001 +        FALSE,                 /* partial_inplace */
1002 +        0,                     /* src_mask */
1003 +        0x0000ffff,            /* dst_mask */
1004 +        FALSE),                /* pcrel_offset */
1005 +
1006 +  /* Reference to literal section.  */
1007 +  HOWTO (R_RISCV_LITERAL,      /* type */
1008 +        0,                     /* rightshift */
1009 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1010 +        16,                    /* bitsize */
1011 +        FALSE,                 /* pc_relative */
1012 +        0,                     /* bitpos */
1013 +        complain_overflow_signed, /* complain_on_overflow */
1014 +        mips_elf_literal_reloc, /* special_function */
1015 +        "R_RISCV_LITERAL",     /* name */
1016 +        FALSE,                 /* partial_inplace */
1017 +        0,                     /* src_mask */
1018 +        0x0000ffff,            /* dst_mask */
1019 +        FALSE),                /* pcrel_offset */
1020 +
1021 +  /* Reference to global offset table.  */
1022 +  HOWTO (R_RISCV_GOT16,                /* type */
1023 +        0,                     /* rightshift */
1024 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1025 +        16,                    /* bitsize */
1026 +        FALSE,                 /* pc_relative */
1027 +        0,                     /* bitpos */
1028 +        complain_overflow_signed, /* complain_on_overflow */
1029 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1030 +        "R_RISCV_GOT16",       /* name */
1031 +        FALSE,                 /* partial_inplace */
1032 +        0,                     /* src_mask */
1033 +        0x0000ffff,            /* dst_mask */
1034 +        FALSE),                /* pcrel_offset */
1035 +
1036 +  /* 16 bit PC relative reference.  Note that the ABI document has a typo
1037 +     and claims R_RISCV_PC16 to be not rightshifted, rendering it useless.
1038 +     We do the right thing here.  */
1039 +  HOWTO (R_RISCV_PC16,         /* type */
1040 +        2,                     /* rightshift */
1041 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1042 +        16,                    /* bitsize */
1043 +        TRUE,                  /* pc_relative */
1044 +        0,                     /* bitpos */
1045 +        complain_overflow_signed, /* complain_on_overflow */
1046 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1047 +        "R_RISCV_PC16",                /* name */
1048 +        FALSE,                 /* partial_inplace */
1049 +        0,                     /* src_mask */
1050 +        0x0000ffff,            /* dst_mask */
1051 +        TRUE),                 /* pcrel_offset */
1052 +
1053 +  /* 16 bit call through global offset table.  */
1054 +  HOWTO (R_RISCV_CALL16,               /* type */
1055 +        0,                     /* rightshift */
1056 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1057 +        16,                    /* bitsize */
1058 +        FALSE,                 /* pc_relative */
1059 +        0,                     /* bitpos */
1060 +        complain_overflow_signed, /* complain_on_overflow */
1061 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1062 +        "R_RISCV_CALL16",      /* name */
1063 +        FALSE,                 /* partial_inplace */
1064 +        0,                     /* src_mask */
1065 +        0x0000ffff,            /* dst_mask */
1066 +        FALSE),                /* pcrel_offset */
1067 +
1068 +  /* 32 bit GP relative reference.  */
1069 +  HOWTO (R_RISCV_GPREL32,      /* type */
1070 +        0,                     /* rightshift */
1071 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1072 +        32,                    /* bitsize */
1073 +        FALSE,                 /* pc_relative */
1074 +        0,                     /* bitpos */
1075 +        complain_overflow_dont, /* complain_on_overflow */
1076 +        mips_elf_gprel32_reloc, /* special_function */
1077 +        "R_RISCV_GPREL32",     /* name */
1078 +        FALSE,                 /* partial_inplace */
1079 +        0,                     /* src_mask */
1080 +        0xffffffff,            /* dst_mask */
1081 +        FALSE),                /* pcrel_offset */
1082 +
1083 +  EMPTY_HOWTO (13),
1084 +  EMPTY_HOWTO (14),
1085 +  EMPTY_HOWTO (15),
1086 +  EMPTY_HOWTO (16),
1087 +  EMPTY_HOWTO (17),
1088 +
1089 +  /* 64 bit relocation.  */
1090 +  HOWTO (R_RISCV_64,           /* type */
1091 +        0,                     /* rightshift */
1092 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
1093 +        64,                    /* bitsize */
1094 +        FALSE,                 /* pc_relative */
1095 +        0,                     /* bitpos */
1096 +        complain_overflow_dont, /* complain_on_overflow */
1097 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1098 +        "R_RISCV_64",          /* name */
1099 +        FALSE,                 /* partial_inplace */
1100 +        0,                     /* src_mask */
1101 +        MINUS_ONE,             /* dst_mask */
1102 +        FALSE),                /* pcrel_offset */
1103 +
1104 +  /* Displacement in the global offset table.  */
1105 +  HOWTO (R_RISCV_GOT_DISP,     /* type */
1106 +        0,                     /* rightshift */
1107 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1108 +        16,                    /* bitsize */
1109 +        FALSE,                 /* pc_relative */
1110 +        0,                     /* bitpos */
1111 +        complain_overflow_signed, /* complain_on_overflow */
1112 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1113 +        "R_RISCV_GOT_DISP",    /* name */
1114 +        FALSE,                 /* partial_inplace */
1115 +        0,                     /* src_mask */
1116 +        0x0000ffff,            /* dst_mask */
1117 +        FALSE),                /* pcrel_offset */
1118 +
1119 +  EMPTY_HOWTO (20),
1120 +  EMPTY_HOWTO (21),
1121 +
1122 +  /* High 16 bits of displacement in global offset table.  */
1123 +  HOWTO (R_RISCV_GOT_HI16,     /* type */
1124 +        0,                     /* rightshift */
1125 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1126 +        16,                    /* bitsize */
1127 +        FALSE,                 /* pc_relative */
1128 +        0,                     /* bitpos */
1129 +        complain_overflow_dont, /* complain_on_overflow */
1130 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1131 +        "R_RISCV_GOT_HI16",    /* name */
1132 +        FALSE,                 /* partial_inplace */
1133 +        0,                     /* src_mask */
1134 +        0x0000ffff,            /* dst_mask */
1135 +        FALSE),                /* pcrel_offset */
1136 +
1137 +  /* Low 16 bits of displacement in global offset table.  */
1138 +  HOWTO (R_RISCV_GOT_LO16,     /* type */
1139 +        0,                     /* rightshift */
1140 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1141 +        16,                    /* bitsize */
1142 +        FALSE,                 /* pc_relative */
1143 +        0,                     /* bitpos */
1144 +        complain_overflow_dont, /* complain_on_overflow */
1145 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1146 +        "R_RISCV_GOT_LO16",    /* name */
1147 +        FALSE,                 /* partial_inplace */
1148 +        0,                     /* src_mask */
1149 +        0x0000ffff,            /* dst_mask */
1150 +        FALSE),                /* pcrel_offset */
1151 +
1152 +  /* 64 bit subtraction.  */
1153 +  HOWTO (R_RISCV_SUB,          /* type */
1154 +        0,                     /* rightshift */
1155 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
1156 +        64,                    /* bitsize */
1157 +        FALSE,                 /* pc_relative */
1158 +        0,                     /* bitpos */
1159 +        complain_overflow_dont, /* complain_on_overflow */
1160 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1161 +        "R_RISCV_SUB",         /* name */
1162 +        FALSE,                 /* partial_inplace */
1163 +        0,                     /* src_mask */
1164 +        MINUS_ONE,             /* dst_mask */
1165 +        FALSE),                /* pcrel_offset */
1166 +
1167 +  /* Insert the addend as an instruction.  */
1168 +  /* FIXME: Not handled correctly.  */
1169 +  HOWTO (R_RISCV_INSERT_A,     /* type */
1170 +        0,                     /* rightshift */
1171 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1172 +        32,                    /* bitsize */
1173 +        FALSE,                 /* pc_relative */
1174 +        0,                     /* bitpos */
1175 +        complain_overflow_dont, /* complain_on_overflow */
1176 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1177 +        "R_RISCV_INSERT_A",    /* name */
1178 +        FALSE,                 /* partial_inplace */
1179 +        0,                     /* src_mask */
1180 +        0xffffffff,            /* dst_mask */
1181 +        FALSE),                /* pcrel_offset */
1182 +
1183 +  /* Insert the addend as an instruction, and change all relocations
1184 +     to refer to the old instruction at the address.  */
1185 +  /* FIXME: Not handled correctly.  */
1186 +  HOWTO (R_RISCV_INSERT_B,     /* type */
1187 +        0,                     /* rightshift */
1188 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1189 +        32,                    /* bitsize */
1190 +        FALSE,                 /* pc_relative */
1191 +        0,                     /* bitpos */
1192 +        complain_overflow_dont, /* complain_on_overflow */
1193 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1194 +        "R_RISCV_INSERT_B",    /* name */
1195 +        FALSE,                 /* partial_inplace */
1196 +        0,                     /* src_mask */
1197 +        0xffffffff,            /* dst_mask */
1198 +        FALSE),                /* pcrel_offset */
1199 +
1200 +  /* Delete a 32 bit instruction.  */
1201 +  /* FIXME: Not handled correctly.  */
1202 +  HOWTO (R_RISCV_DELETE,               /* type */
1203 +        0,                     /* rightshift */
1204 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1205 +        32,                    /* bitsize */
1206 +        FALSE,                 /* pc_relative */
1207 +        0,                     /* bitpos */
1208 +        complain_overflow_dont, /* complain_on_overflow */
1209 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1210 +        "R_RISCV_DELETE",      /* name */
1211 +        FALSE,                 /* partial_inplace */
1212 +        0,                     /* src_mask */
1213 +        0xffffffff,            /* dst_mask */
1214 +        FALSE),                /* pcrel_offset */
1215 +
1216 +  EMPTY_HOWTO (28),
1217 +  EMPTY_HOWTO (29),
1218 +
1219 +  /* High 16 bits of displacement in global offset table.  */
1220 +  HOWTO (R_RISCV_CALL_HI16,    /* type */
1221 +        0,                     /* rightshift */
1222 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1223 +        16,                    /* bitsize */
1224 +        FALSE,                 /* pc_relative */
1225 +        0,                     /* bitpos */
1226 +        complain_overflow_dont, /* complain_on_overflow */
1227 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1228 +        "R_RISCV_CALL_HI16",   /* name */
1229 +        FALSE,                 /* partial_inplace */
1230 +        0,                     /* src_mask */
1231 +        0x0000ffff,            /* dst_mask */
1232 +        FALSE),                /* pcrel_offset */
1233 +
1234 +  /* Low 16 bits of displacement in global offset table.  */
1235 +  HOWTO (R_RISCV_CALL_LO16,    /* type */
1236 +        0,                     /* rightshift */
1237 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1238 +        16,                    /* bitsize */
1239 +        FALSE,                 /* pc_relative */
1240 +        0,                     /* bitpos */
1241 +        complain_overflow_dont, /* complain_on_overflow */
1242 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1243 +        "R_RISCV_CALL_LO16",   /* name */
1244 +        FALSE,                 /* partial_inplace */
1245 +        0,                     /* src_mask */
1246 +        0x0000ffff,            /* dst_mask */
1247 +        FALSE),                /* pcrel_offset */
1248 +
1249 +  /* Section displacement, used by an associated event location section.  */
1250 +  HOWTO (R_RISCV_SCN_DISP,     /* type */
1251 +        0,                     /* rightshift */
1252 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1253 +        32,                    /* bitsize */
1254 +        FALSE,                 /* pc_relative */
1255 +        0,                     /* bitpos */
1256 +        complain_overflow_dont, /* complain_on_overflow */
1257 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1258 +        "R_RISCV_SCN_DISP",    /* name */
1259 +        FALSE,                 /* partial_inplace */
1260 +        0,                     /* src_mask */
1261 +        0xffffffff,            /* dst_mask */
1262 +        FALSE),                /* pcrel_offset */
1263 +
1264 +  /* 16 bit relocation.  */
1265 +  HOWTO (R_RISCV_REL16,                /* type */
1266 +        0,                     /* rightshift */
1267 +        1,                     /* size (0 = byte, 1 = short, 2 = long) */
1268 +        16,                    /* bitsize */
1269 +        FALSE,                 /* pc_relative */
1270 +        0,                     /* bitpos */
1271 +        complain_overflow_signed, /* complain_on_overflow */
1272 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1273 +        "R_RISCV_REL16",       /* name */
1274 +        FALSE,                 /* partial_inplace */
1275 +        0,                     /* src_mask */
1276 +        0xffff,                /* dst_mask */
1277 +        FALSE),                /* pcrel_offset */
1278 +
1279 +  /* These two are obsolete.  */
1280 +  EMPTY_HOWTO (R_RISCV_ADD_IMMEDIATE),
1281 +  EMPTY_HOWTO (R_RISCV_PJUMP),
1282 +
1283 +  /* Similiar to R_RISCV_REL32, but used for relocations in a GOT section.
1284 +     It must be used for multigot GOT's (and only there).  */
1285 +  HOWTO (R_RISCV_RELGOT,               /* type */
1286 +        0,                     /* rightshift */
1287 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1288 +        32,                    /* bitsize */
1289 +        FALSE,                 /* pc_relative */
1290 +        0,                     /* bitpos */
1291 +        complain_overflow_dont, /* complain_on_overflow */
1292 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1293 +        "R_RISCV_RELGOT",      /* name */
1294 +        FALSE,                 /* partial_inplace */
1295 +        0,                     /* src_mask */
1296 +        0xffffffff,            /* dst_mask */
1297 +        FALSE),                /* pcrel_offset */
1298 +
1299 +  /* Protected jump conversion.  This is an optimization hint.  No
1300 +     relocation is required for correctness.  */
1301 +  HOWTO (R_RISCV_JALR,         /* type */
1302 +        0,                     /* rightshift */
1303 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1304 +        32,                    /* bitsize */
1305 +        FALSE,                 /* pc_relative */
1306 +        0,                     /* bitpos */
1307 +        complain_overflow_dont, /* complain_on_overflow */
1308 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1309 +        "R_RISCV_JALR",                /* name */
1310 +        FALSE,                 /* partial_inplace */
1311 +        0,                     /* src_mask */
1312 +        0,                     /* dst_mask */
1313 +        FALSE),                /* pcrel_offset */
1314 +
1315 +  /* TLS GD/LD dynamic relocations.  */
1316 +  HOWTO (R_RISCV_TLS_DTPMOD32, /* type */
1317 +        0,                     /* rightshift */
1318 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1319 +        32,                    /* bitsize */
1320 +        FALSE,                 /* pc_relative */
1321 +        0,                     /* bitpos */
1322 +        complain_overflow_dont, /* complain_on_overflow */
1323 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1324 +        "R_RISCV_TLS_DTPMOD32",        /* name */
1325 +        FALSE,                 /* partial_inplace */
1326 +        0xffffffff,            /* src_mask */
1327 +        0xffffffff,            /* dst_mask */
1328 +        FALSE),                /* pcrel_offset */
1329 +
1330 +  HOWTO (R_RISCV_TLS_DTPREL32, /* type */
1331 +        0,                     /* rightshift */
1332 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1333 +        32,                    /* bitsize */
1334 +        FALSE,                 /* pc_relative */
1335 +        0,                     /* bitpos */
1336 +        complain_overflow_dont, /* complain_on_overflow */
1337 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1338 +        "R_RISCV_TLS_DTPREL32",        /* name */
1339 +        FALSE,                 /* partial_inplace */
1340 +        0xffffffff,            /* src_mask */
1341 +        0xffffffff,            /* dst_mask */
1342 +        FALSE),                /* pcrel_offset */
1343 +
1344 +  EMPTY_HOWTO (R_RISCV_TLS_DTPMOD64),
1345 +  EMPTY_HOWTO (R_RISCV_TLS_DTPREL64),
1346 +
1347 +  /* TLS general dynamic variable reference.  */
1348 +  HOWTO (R_RISCV_TLS_GD,               /* type */
1349 +        0,                     /* rightshift */
1350 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1351 +        16,                    /* bitsize */
1352 +        FALSE,                 /* pc_relative */
1353 +        0,                     /* bitpos */
1354 +        complain_overflow_signed, /* complain_on_overflow */
1355 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1356 +        "R_RISCV_TLS_GD",      /* name */
1357 +        FALSE,                 /* partial_inplace */
1358 +        0x0000ffff,            /* src_mask */
1359 +        0x0000ffff,            /* dst_mask */
1360 +        FALSE),                /* pcrel_offset */
1361 +
1362 +  /* TLS local dynamic variable reference.  */
1363 +  HOWTO (R_RISCV_TLS_LDM,      /* type */
1364 +        0,                     /* rightshift */
1365 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1366 +        16,                    /* bitsize */
1367 +        FALSE,                 /* pc_relative */
1368 +        0,                     /* bitpos */
1369 +        complain_overflow_signed, /* complain_on_overflow */
1370 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1371 +        "R_RISCV_TLS_LDM",     /* name */
1372 +        FALSE,                 /* partial_inplace */
1373 +        0x0000ffff,            /* src_mask */
1374 +        0x0000ffff,            /* dst_mask */
1375 +        FALSE),                /* pcrel_offset */
1376 +
1377 +  /* TLS local dynamic offset.  */
1378 +  HOWTO (R_RISCV_TLS_DTPREL_HI16,      /* type */
1379 +        0,                     /* rightshift */
1380 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1381 +        16,                    /* bitsize */
1382 +        FALSE,                 /* pc_relative */
1383 +        0,                     /* bitpos */
1384 +        complain_overflow_signed, /* complain_on_overflow */
1385 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1386 +        "R_RISCV_TLS_DTPREL_HI16",     /* name */
1387 +        FALSE,                 /* partial_inplace */
1388 +        0x0000ffff,            /* src_mask */
1389 +        0x0000ffff,            /* dst_mask */
1390 +        FALSE),                /* pcrel_offset */
1391 +
1392 +  /* TLS local dynamic offset.  */
1393 +  HOWTO (R_RISCV_TLS_DTPREL_LO16,      /* type */
1394 +        0,                     /* rightshift */
1395 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1396 +        16,                    /* bitsize */
1397 +        FALSE,                 /* pc_relative */
1398 +        0,                     /* bitpos */
1399 +        complain_overflow_signed, /* complain_on_overflow */
1400 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1401 +        "R_RISCV_TLS_DTPREL_LO16",     /* name */
1402 +        FALSE,                 /* partial_inplace */
1403 +        0x0000ffff,            /* src_mask */
1404 +        0x0000ffff,            /* dst_mask */
1405 +        FALSE),                /* pcrel_offset */
1406 +
1407 +  /* TLS thread pointer offset.  */
1408 +  HOWTO (R_RISCV_TLS_GOTTPREL, /* type */
1409 +        0,                     /* rightshift */
1410 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1411 +        16,                    /* bitsize */
1412 +        FALSE,                 /* pc_relative */
1413 +        0,                     /* bitpos */
1414 +        complain_overflow_signed, /* complain_on_overflow */
1415 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1416 +        "R_RISCV_TLS_GOTTPREL",        /* name */
1417 +        FALSE,                 /* partial_inplace */
1418 +        0x0000ffff,            /* src_mask */
1419 +        0x0000ffff,            /* dst_mask */
1420 +        FALSE),                /* pcrel_offset */
1421 +
1422 +  /* TLS IE dynamic relocations.  */
1423 +  HOWTO (R_RISCV_TLS_TPREL32,  /* type */
1424 +        0,                     /* rightshift */
1425 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1426 +        32,                    /* bitsize */
1427 +        FALSE,                 /* pc_relative */
1428 +        0,                     /* bitpos */
1429 +        complain_overflow_dont, /* complain_on_overflow */
1430 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1431 +        "R_RISCV_TLS_TPREL32", /* name */
1432 +        FALSE,                 /* partial_inplace */
1433 +        0xffffffff,            /* src_mask */
1434 +        0xffffffff,            /* dst_mask */
1435 +        FALSE),                /* pcrel_offset */
1436 +
1437 +  EMPTY_HOWTO (R_RISCV_TLS_TPREL64),
1438 +
1439 +  /* TLS thread pointer offset.  */
1440 +  HOWTO (R_RISCV_TLS_TPREL_HI16,       /* type */
1441 +        0,                     /* rightshift */
1442 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1443 +        16,                    /* bitsize */
1444 +        FALSE,                 /* pc_relative */
1445 +        0,                     /* bitpos */
1446 +        complain_overflow_signed, /* complain_on_overflow */
1447 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1448 +        "R_RISCV_TLS_TPREL_HI16", /* name */
1449 +        FALSE,                 /* partial_inplace */
1450 +        0x0000ffff,            /* src_mask */
1451 +        0x0000ffff,            /* dst_mask */
1452 +        FALSE),                /* pcrel_offset */
1453 +
1454 +  /* TLS thread pointer offset.  */
1455 +  HOWTO (R_RISCV_TLS_TPREL_LO16,       /* type */
1456 +        0,                     /* rightshift */
1457 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1458 +        16,                    /* bitsize */
1459 +        FALSE,                 /* pc_relative */
1460 +        0,                     /* bitpos */
1461 +        complain_overflow_signed, /* complain_on_overflow */
1462 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1463 +        "R_RISCV_TLS_TPREL_LO16", /* name */
1464 +        FALSE,                 /* partial_inplace */
1465 +        0x0000ffff,            /* src_mask */
1466 +        0x0000ffff,            /* dst_mask */
1467 +        FALSE),                /* pcrel_offset */
1468 +
1469 +  /* 32 bit relocation with no addend.  */
1470 +  HOWTO (R_RISCV_GLOB_DAT,     /* type */
1471 +        0,                     /* rightshift */
1472 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1473 +        32,                    /* bitsize */
1474 +        FALSE,                 /* pc_relative */
1475 +        0,                     /* bitpos */
1476 +        complain_overflow_dont, /* complain_on_overflow */
1477 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1478 +        "R_RISCV_GLOB_DAT",    /* name */
1479 +        FALSE,                 /* partial_inplace */
1480 +        0x0,                   /* src_mask */
1481 +        0xffffffff,            /* dst_mask */
1482 +        FALSE),                /* pcrel_offset */
1483 +};
1484 +
1485 +static reloc_howto_type elf_mips16_howto_table_rel[] =
1486 +{
1487 +  /* The reloc used for the mips16 jump instruction.  */
1488 +  HOWTO (R_MIPS16_26,          /* type */
1489 +        2,                     /* rightshift */
1490 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1491 +        26,                    /* bitsize */
1492 +        FALSE,                 /* pc_relative */
1493 +        0,                     /* bitpos */
1494 +        complain_overflow_dont, /* complain_on_overflow */
1495 +                               /* This needs complex overflow
1496 +                                  detection, because the upper four
1497 +                                  bits must match the PC.  */
1498 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1499 +        "R_MIPS16_26",         /* name */
1500 +        TRUE,                  /* partial_inplace */
1501 +        0x3ffffff,             /* src_mask */
1502 +        0x3ffffff,             /* dst_mask */
1503 +        FALSE),                /* pcrel_offset */
1504 +
1505 +  /* The reloc used for the mips16 gprel instruction.  */
1506 +  HOWTO (R_MIPS16_GPREL,       /* type */
1507 +        0,                     /* rightshift */
1508 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1509 +        16,                    /* bitsize */
1510 +        FALSE,                 /* pc_relative */
1511 +        0,                     /* bitpos */
1512 +        complain_overflow_signed, /* complain_on_overflow */
1513 +        mips16_gprel_reloc,    /* special_function */
1514 +        "R_MIPS16_GPREL",      /* name */
1515 +        TRUE,                  /* partial_inplace */
1516 +        0x0000ffff,            /* src_mask */
1517 +        0x0000ffff,            /* dst_mask */
1518 +        FALSE),                /* pcrel_offset */
1519 +
1520 +  /* A MIPS16 reference to the global offset table.  */
1521 +  HOWTO (R_MIPS16_GOT16,       /* type */
1522 +        0,                     /* rightshift */
1523 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1524 +        16,                    /* bitsize */
1525 +        FALSE,                 /* pc_relative */
1526 +        0,                     /* bitpos */
1527 +        complain_overflow_dont, /* complain_on_overflow */
1528 +        _bfd_riscv_elf_got16_reloc, /* special_function */
1529 +        "R_MIPS16_GOT16",      /* name */
1530 +        TRUE,                  /* partial_inplace */
1531 +        0x0000ffff,            /* src_mask */
1532 +        0x0000ffff,            /* dst_mask */
1533 +        FALSE),                /* pcrel_offset */
1534 +
1535 +  /* A MIPS16 call through the global offset table.  */
1536 +  HOWTO (R_MIPS16_CALL16,      /* type */
1537 +        0,                     /* rightshift */
1538 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1539 +        16,                    /* bitsize */
1540 +        FALSE,                 /* pc_relative */
1541 +        0,                     /* bitpos */
1542 +        complain_overflow_dont, /* complain_on_overflow */
1543 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1544 +        "R_MIPS16_CALL16",     /* name */
1545 +        TRUE,                  /* partial_inplace */
1546 +        0x0000ffff,            /* src_mask */
1547 +        0x0000ffff,            /* dst_mask */
1548 +        FALSE),                /* pcrel_offset */
1549 +
1550 +  /* MIPS16 high 16 bits of symbol value.  */
1551 +  HOWTO (R_MIPS16_HI16,                /* type */
1552 +        16,                    /* rightshift */
1553 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1554 +        16,                    /* bitsize */
1555 +        FALSE,                 /* pc_relative */
1556 +        0,                     /* bitpos */
1557 +        complain_overflow_dont, /* complain_on_overflow */
1558 +        _bfd_riscv_elf_hi16_reloc, /* special_function */
1559 +        "R_MIPS16_HI16",       /* name */
1560 +        TRUE,                  /* partial_inplace */
1561 +        0x0000ffff,            /* src_mask */
1562 +        0x0000ffff,            /* dst_mask */
1563 +        FALSE),                /* pcrel_offset */
1564 +
1565 +  /* MIPS16 low 16 bits of symbol value.  */
1566 +  HOWTO (R_MIPS16_LO16,                /* type */
1567 +        0,                     /* rightshift */
1568 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1569 +        16,                    /* bitsize */
1570 +        FALSE,                 /* pc_relative */
1571 +        0,                     /* bitpos */
1572 +        complain_overflow_dont, /* complain_on_overflow */
1573 +        _bfd_riscv_elf_lo16_reloc, /* special_function */
1574 +        "R_MIPS16_LO16",       /* name */
1575 +        TRUE,                  /* partial_inplace */
1576 +        0x0000ffff,            /* src_mask */
1577 +        0x0000ffff,            /* dst_mask */
1578 +        FALSE),                /* pcrel_offset */
1579 +};
1580 +
1581 +static reloc_howto_type elf_mips16_howto_table_rela[] =
1582 +{
1583 +  /* The reloc used for the mips16 jump instruction.  */
1584 +  HOWTO (R_MIPS16_26,          /* type */
1585 +        2,                     /* rightshift */
1586 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1587 +        26,                    /* bitsize */
1588 +        FALSE,                 /* pc_relative */
1589 +        0,                     /* bitpos */
1590 +        complain_overflow_dont, /* complain_on_overflow */
1591 +                               /* This needs complex overflow
1592 +                                  detection, because the upper four
1593 +                                  bits must match the PC.  */
1594 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1595 +        "R_MIPS16_26",         /* name */
1596 +        FALSE,                 /* partial_inplace */
1597 +        0x3ffffff,             /* src_mask */
1598 +        0x3ffffff,             /* dst_mask */
1599 +        FALSE),                /* pcrel_offset */
1600 +
1601 +  /* The reloc used for the mips16 gprel instruction.  */
1602 +  HOWTO (R_MIPS16_GPREL,       /* type */
1603 +        0,                     /* rightshift */
1604 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1605 +        16,                    /* bitsize */
1606 +        FALSE,                 /* pc_relative */
1607 +        0,                     /* bitpos */
1608 +        complain_overflow_signed, /* complain_on_overflow */
1609 +        mips16_gprel_reloc,    /* special_function */
1610 +        "R_MIPS16_GPREL",      /* name */
1611 +        FALSE,                 /* partial_inplace */
1612 +        0x0000ffff,            /* src_mask */
1613 +        0x0000ffff,            /* dst_mask */
1614 +        FALSE),                /* pcrel_offset */
1615 +
1616 +  /* A MIPS16 reference to the global offset table.  */
1617 +  HOWTO (R_MIPS16_GOT16,       /* type */
1618 +        0,                     /* rightshift */
1619 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1620 +        16,                    /* bitsize */
1621 +        FALSE,                 /* pc_relative */
1622 +        0,                     /* bitpos */
1623 +        complain_overflow_dont, /* complain_on_overflow */
1624 +        _bfd_riscv_elf_got16_reloc, /* special_function */
1625 +        "R_MIPS16_GOT16",      /* name */
1626 +        FALSE,                 /* partial_inplace */
1627 +        0x0000ffff,            /* src_mask */
1628 +        0x0000ffff,            /* dst_mask */
1629 +        FALSE),                /* pcrel_offset */
1630 +
1631 +  /* A MIPS16 call through the global offset table.  */
1632 +  HOWTO (R_MIPS16_CALL16,      /* type */
1633 +        0,                     /* rightshift */
1634 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1635 +        16,                    /* bitsize */
1636 +        FALSE,                 /* pc_relative */
1637 +        0,                     /* bitpos */
1638 +        complain_overflow_dont, /* complain_on_overflow */
1639 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1640 +        "R_MIPS16_CALL16",     /* name */
1641 +        FALSE,                 /* partial_inplace */
1642 +        0x0000ffff,            /* src_mask */
1643 +        0x0000ffff,            /* dst_mask */
1644 +        FALSE),                /* pcrel_offset */
1645 +
1646 +  /* MIPS16 high 16 bits of symbol value.  */
1647 +  HOWTO (R_MIPS16_HI16,                /* type */
1648 +        16,                    /* rightshift */
1649 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1650 +        16,                    /* bitsize */
1651 +        FALSE,                 /* pc_relative */
1652 +        0,                     /* bitpos */
1653 +        complain_overflow_dont, /* complain_on_overflow */
1654 +        _bfd_riscv_elf_hi16_reloc, /* special_function */
1655 +        "R_MIPS16_HI16",       /* name */
1656 +        FALSE,                 /* partial_inplace */
1657 +        0x0000ffff,            /* src_mask */
1658 +        0x0000ffff,            /* dst_mask */
1659 +        FALSE),                /* pcrel_offset */
1660 +
1661 +  /* MIPS16 low 16 bits of symbol value.  */
1662 +  HOWTO (R_MIPS16_LO16,                /* type */
1663 +        0,                     /* rightshift */
1664 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1665 +        16,                    /* bitsize */
1666 +        FALSE,                 /* pc_relative */
1667 +        0,                     /* bitpos */
1668 +        complain_overflow_dont, /* complain_on_overflow */
1669 +        _bfd_riscv_elf_lo16_reloc, /* special_function */
1670 +        "R_MIPS16_LO16",       /* name */
1671 +        FALSE,                 /* partial_inplace */
1672 +        0x0000ffff,            /* src_mask */
1673 +        0x0000ffff,            /* dst_mask */
1674 +        FALSE),                /* pcrel_offset */
1675 +};
1676 +
1677 +/* GNU extension to record C++ vtable hierarchy */
1678 +static reloc_howto_type elf_mips_gnu_vtinherit_howto =
1679 +  HOWTO (R_RISCV_GNU_VTINHERIT,        /* type */
1680 +        0,                     /* rightshift */
1681 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1682 +        0,                     /* bitsize */
1683 +        FALSE,                 /* pc_relative */
1684 +        0,                     /* bitpos */
1685 +        complain_overflow_dont, /* complain_on_overflow */
1686 +        NULL,                  /* special_function */
1687 +        "R_RISCV_GNU_VTINHERIT", /* name */
1688 +        FALSE,                 /* partial_inplace */
1689 +        0,                     /* src_mask */
1690 +        0,                     /* dst_mask */
1691 +        FALSE);                /* pcrel_offset */
1692 +
1693 +/* GNU extension to record C++ vtable member usage */
1694 +static reloc_howto_type elf_mips_gnu_vtentry_howto =
1695 +  HOWTO (R_RISCV_GNU_VTENTRY,  /* type */
1696 +        0,                     /* rightshift */
1697 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1698 +        0,                     /* bitsize */
1699 +        FALSE,                 /* pc_relative */
1700 +        0,                     /* bitpos */
1701 +        complain_overflow_dont, /* complain_on_overflow */
1702 +        _bfd_elf_rel_vtable_reloc_fn, /* special_function */
1703 +        "R_RISCV_GNU_VTENTRY", /* name */
1704 +        FALSE,                 /* partial_inplace */
1705 +        0,                     /* src_mask */
1706 +        0,                     /* dst_mask */
1707 +        FALSE);                /* pcrel_offset */
1708 +\f
1709 +/* 16 bit offset for pc-relative branches.  */
1710 +static reloc_howto_type elf_mips_gnu_rel16_s2 =
1711 +  HOWTO (R_RISCV_GNU_REL16_S2, /* type */
1712 +        2,                     /* rightshift */
1713 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1714 +        16,                    /* bitsize */
1715 +        TRUE,                  /* pc_relative */
1716 +        0,                     /* bitpos */
1717 +        complain_overflow_signed, /* complain_on_overflow */
1718 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1719 +        "R_RISCV_GNU_REL16_S2",        /* name */
1720 +        TRUE,                  /* partial_inplace */
1721 +        0x0000ffff,            /* src_mask */
1722 +        0x0000ffff,            /* dst_mask */
1723 +        TRUE);                 /* pcrel_offset */
1724 +
1725 +/* 16 bit offset for pc-relative branches.  */
1726 +static reloc_howto_type elf_mips_gnu_rela16_s2 =
1727 +  HOWTO (R_RISCV_GNU_REL16_S2, /* type */
1728 +        2,                     /* rightshift */
1729 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1730 +        16,                    /* bitsize */
1731 +        TRUE,                  /* pc_relative */
1732 +        0,                     /* bitpos */
1733 +        complain_overflow_signed, /* complain_on_overflow */
1734 +        _bfd_riscv_elf_generic_reloc, /* special_function */
1735 +        "R_RISCV_GNU_REL16_S2",        /* name */
1736 +        FALSE,                 /* partial_inplace */
1737 +        0,                     /* src_mask */
1738 +        0x0000ffff,            /* dst_mask */
1739 +        TRUE);                 /* pcrel_offset */
1740 +\f
1741 +/* Originally a VxWorks extension, but now used for other systems too.  */
1742 +static reloc_howto_type elf_mips_copy_howto =
1743 +  HOWTO (R_RISCV_COPY,         /* type */
1744 +        0,                     /* rightshift */
1745 +        0,                     /* this one is variable size */
1746 +        0,                     /* bitsize */
1747 +        FALSE,                 /* pc_relative */
1748 +        0,                     /* bitpos */
1749 +        complain_overflow_bitfield, /* complain_on_overflow */
1750 +        bfd_elf_generic_reloc, /* special_function */
1751 +        "R_RISCV_COPY",                /* name */
1752 +        FALSE,                 /* partial_inplace */
1753 +        0x0,                   /* src_mask */
1754 +        0x0,                   /* dst_mask */
1755 +        FALSE);                /* pcrel_offset */
1756 +
1757 +/* Originally a VxWorks extension, but now used for other systems too.  */
1758 +static reloc_howto_type elf_mips_jump_slot_howto =
1759 +  HOWTO (R_RISCV_JUMP_SLOT,    /* type */
1760 +        0,                     /* rightshift */
1761 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
1762 +        32,                    /* bitsize */
1763 +        FALSE,                 /* pc_relative */
1764 +        0,                     /* bitpos */
1765 +        complain_overflow_bitfield, /* complain_on_overflow */
1766 +        bfd_elf_generic_reloc, /* special_function */
1767 +        "R_RISCV_JUMP_SLOT",   /* name */
1768 +        FALSE,                 /* partial_inplace */
1769 +        0x0,                   /* src_mask */
1770 +        0x0,                   /* dst_mask */
1771 +        FALSE);                /* pcrel_offset */
1772 +\f
1773 +/* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
1774 +   dangerous relocation.  */
1775 +
1776 +static bfd_boolean
1777 +mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
1778 +{
1779 +  unsigned int count;
1780 +  asymbol **sym;
1781 +  unsigned int i;
1782 +
1783 +  /* If we've already figured out what GP will be, just return it.  */
1784 +  *pgp = _bfd_get_gp_value (output_bfd);
1785 +  if (*pgp)
1786 +    return TRUE;
1787 +
1788 +  count = bfd_get_symcount (output_bfd);
1789 +  sym = bfd_get_outsymbols (output_bfd);
1790 +
1791 +  /* The linker script will have created a symbol named `_gp' with the
1792 +     appropriate value.  */
1793 +  if (sym == NULL)
1794 +    i = count;
1795 +  else
1796 +    {
1797 +      for (i = 0; i < count; i++, sym++)
1798 +       {
1799 +         register const char *name;
1800 +
1801 +         name = bfd_asymbol_name (*sym);
1802 +         if (*name == '_' && strcmp (name, "_gp") == 0)
1803 +           {
1804 +             *pgp = bfd_asymbol_value (*sym);
1805 +             _bfd_set_gp_value (output_bfd, *pgp);
1806 +             break;
1807 +           }
1808 +       }
1809 +    }
1810 +
1811 +  if (i >= count)
1812 +    {
1813 +      /* Only get the error once.  */
1814 +      *pgp = 4;
1815 +      _bfd_set_gp_value (output_bfd, *pgp);
1816 +      return FALSE;
1817 +    }
1818 +
1819 +  return TRUE;
1820 +}
1821 +
1822 +/* We have to figure out the gp value, so that we can adjust the
1823 +   symbol value correctly.  We look up the symbol _gp in the output
1824 +   BFD.  If we can't find it, we're stuck.  We cache it in the ELF
1825 +   target data.  We don't need to adjust the symbol value for an
1826 +   external symbol if we are producing relocatable output.  */
1827 +
1828 +static bfd_reloc_status_type
1829 +mips_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
1830 +                  char **error_message, bfd_vma *pgp)
1831 +{
1832 +  if (bfd_is_und_section (symbol->section)
1833 +      && ! relocatable)
1834 +    {
1835 +      *pgp = 0;
1836 +      return bfd_reloc_undefined;
1837 +    }
1838 +
1839 +  *pgp = _bfd_get_gp_value (output_bfd);
1840 +  if (*pgp == 0
1841 +      && (! relocatable
1842 +         || (symbol->flags & BSF_SECTION_SYM) != 0))
1843 +    {
1844 +      if (relocatable)
1845 +       {
1846 +         /* Make up a value.  */
1847 +         *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
1848 +         _bfd_set_gp_value (output_bfd, *pgp);
1849 +       }
1850 +      else if (!mips_elf_assign_gp (output_bfd, pgp))
1851 +       {
1852 +         *error_message =
1853 +           (char *) _("GP relative relocation when _gp not defined");
1854 +         return bfd_reloc_dangerous;
1855 +       }
1856 +    }
1857 +
1858 +  return bfd_reloc_ok;
1859 +}
1860 +
1861 +/* Do a R_RISCV_GPREL16 relocation.  This is a 16 bit value which must
1862 +   become the offset from the gp register.  */
1863 +
1864 +static bfd_reloc_status_type
1865 +mips_elf_gprel16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
1866 +                       asymbol *symbol, void *data ATTRIBUTE_UNUSED,
1867 +                       asection *input_section, bfd *output_bfd,
1868 +                       char **error_message ATTRIBUTE_UNUSED)
1869 +{
1870 +  bfd_boolean relocatable;
1871 +  bfd_reloc_status_type ret;
1872 +  bfd_vma gp;
1873 +
1874 +  if (output_bfd != NULL)
1875 +    relocatable = TRUE;
1876 +  else
1877 +    {
1878 +      relocatable = FALSE;
1879 +      output_bfd = symbol->section->output_section->owner;
1880 +    }
1881 +
1882 +  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
1883 +                          &gp);
1884 +  if (ret != bfd_reloc_ok)
1885 +    return ret;
1886 +
1887 +  return _bfd_riscv_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1888 +                                       input_section, relocatable,
1889 +                                       data, gp);
1890 +}
1891 +
1892 +/* Do a R_RISCV_LITERAL relocation.  */
1893 +
1894 +static bfd_reloc_status_type
1895 +mips_elf_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1896 +                       void *data, asection *input_section, bfd *output_bfd,
1897 +                       char **error_message)
1898 +{
1899 +  bfd_boolean relocatable;
1900 +  bfd_reloc_status_type ret;
1901 +  bfd_vma gp;
1902 +
1903 +  /* R_RISCV_LITERAL relocations are defined for local symbols only.  */
1904 +  if (output_bfd != NULL
1905 +      && (symbol->flags & BSF_SECTION_SYM) == 0
1906 +      && (symbol->flags & BSF_LOCAL) != 0)
1907 +    {
1908 +      *error_message = (char *)
1909 +       _("literal relocation occurs for an external symbol");
1910 +      return bfd_reloc_outofrange;
1911 +    }
1912 +
1913 +  /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
1914 +  if (output_bfd != NULL)
1915 +    relocatable = TRUE;
1916 +  else
1917 +    {
1918 +      relocatable = FALSE;
1919 +      output_bfd = symbol->section->output_section->owner;
1920 +    }
1921 +
1922 +  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
1923 +                          &gp);
1924 +  if (ret != bfd_reloc_ok)
1925 +    return ret;
1926 +
1927 +  return _bfd_riscv_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1928 +                                       input_section, relocatable,
1929 +                                       data, gp);
1930 +}
1931 +
1932 +/* Do a R_RISCV_GPREL32 relocation.  This is a 32 bit value which must
1933 +   become the offset from the gp register.  */
1934 +
1935 +static bfd_reloc_status_type
1936 +mips_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1937 +                       void *data, asection *input_section, bfd *output_bfd,
1938 +                       char **error_message)
1939 +{
1940 +  bfd_boolean relocatable;
1941 +  bfd_reloc_status_type ret;
1942 +  bfd_vma gp;
1943 +
1944 +  /* R_RISCV_GPREL32 relocations are defined for local symbols only.  */
1945 +  if (output_bfd != NULL
1946 +      && (symbol->flags & BSF_SECTION_SYM) == 0
1947 +      && (symbol->flags & BSF_LOCAL) != 0)
1948 +    {
1949 +      *error_message = (char *)
1950 +       _("32bits gp relative relocation occurs for an external symbol");
1951 +      return bfd_reloc_outofrange;
1952 +    }
1953 +
1954 +  if (output_bfd != NULL)
1955 +    {
1956 +      relocatable = TRUE;
1957 +      gp = _bfd_get_gp_value (output_bfd);
1958 +    }
1959 +  else
1960 +    {
1961 +      relocatable = FALSE;
1962 +      output_bfd = symbol->section->output_section->owner;
1963 +
1964 +      ret = mips_elf_final_gp (output_bfd, symbol, relocatable,
1965 +                              error_message, &gp);
1966 +      if (ret != bfd_reloc_ok)
1967 +       return ret;
1968 +    }
1969 +
1970 +  return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
1971 +                         relocatable, data, gp);
1972 +}
1973 +
1974 +static bfd_reloc_status_type
1975 +gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry,
1976 +                asection *input_section, bfd_boolean relocatable,
1977 +                void *data, bfd_vma gp)
1978 +{
1979 +  bfd_vma relocation;
1980 +  unsigned long val;
1981 +
1982 +  if (bfd_is_com_section (symbol->section))
1983 +    relocation = 0;
1984 +  else
1985 +    relocation = symbol->value;
1986 +
1987 +  relocation += symbol->section->output_section->vma;
1988 +  relocation += symbol->section->output_offset;
1989 +
1990 +  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1991 +    return bfd_reloc_outofrange;
1992 +
1993 +  if (reloc_entry->howto->src_mask == 0)
1994 +    val = 0;
1995 +  else
1996 +    val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
1997 +
1998 +  /* Set val to the offset into the section or symbol.  */
1999 +  val += reloc_entry->addend;
2000 +
2001 +  /* Adjust val for the final section location and GP value.  If we
2002 +     are producing relocatable output, we don't want to do this for
2003 +     an external symbol.  */
2004 +  if (! relocatable
2005 +      || (symbol->flags & BSF_SECTION_SYM) != 0)
2006 +    val += relocation - gp;
2007 +
2008 +  bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
2009 +
2010 +  if (relocatable)
2011 +    reloc_entry->address += input_section->output_offset;
2012 +
2013 +  return bfd_reloc_ok;
2014 +}
2015 +
2016 +/* Handle a mips16 GP relative reloc.  */
2017 +
2018 +static bfd_reloc_status_type
2019 +mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2020 +                   void *data, asection *input_section, bfd *output_bfd,
2021 +                   char **error_message)
2022 +{
2023 +  bfd_boolean relocatable;
2024 +  bfd_reloc_status_type ret;
2025 +  bfd_byte *location;
2026 +  bfd_vma gp;
2027 +
2028 +  /* If we're relocating, and this is an external symbol, we don't want
2029 +     to change anything.  */
2030 +  if (output_bfd != NULL
2031 +      && (symbol->flags & BSF_SECTION_SYM) == 0
2032 +      && (symbol->flags & BSF_LOCAL) != 0)
2033 +    {
2034 +      reloc_entry->address += input_section->output_offset;
2035 +      return bfd_reloc_ok;
2036 +    }
2037 +
2038 +  if (output_bfd != NULL)
2039 +    relocatable = TRUE;
2040 +  else
2041 +    {
2042 +      relocatable = FALSE;
2043 +      output_bfd = symbol->section->output_section->owner;
2044 +    }
2045 +
2046 +  ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
2047 +                          &gp);
2048 +  if (ret != bfd_reloc_ok)
2049 +    return ret;
2050 +
2051 +  location = (bfd_byte *) data + reloc_entry->address;
2052 +  ret = _bfd_riscv_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2053 +                                      input_section, relocatable,
2054 +                                      data, gp);
2055 +
2056 +  return ret;
2057 +}
2058 +\f
2059 +/* A mapping from BFD reloc types to MIPS ELF reloc types.  */
2060 +
2061 +struct elf_reloc_map {
2062 +  bfd_reloc_code_real_type bfd_val;
2063 +  enum elf_riscv_reloc_type elf_val;
2064 +};
2065 +
2066 +static const struct elf_reloc_map mips_reloc_map[] =
2067 +{
2068 +  { BFD_RELOC_NONE, R_RISCV_NONE },
2069 +  { BFD_RELOC_32, R_RISCV_32 },
2070 +  /* There is no BFD reloc for R_RISCV_REL32.  */
2071 +  { BFD_RELOC_CTOR, R_RISCV_32 },
2072 +  { BFD_RELOC_64, R_RISCV_64 },
2073 +  { BFD_RELOC_16_PCREL_S2, R_RISCV_PC16 },
2074 +  { BFD_RELOC_HI16_S, R_RISCV_HI16 },
2075 +  { BFD_RELOC_LO16, R_RISCV_LO16 },
2076 +  { BFD_RELOC_GPREL16, R_RISCV_GPREL16 },
2077 +  { BFD_RELOC_GPREL32, R_RISCV_GPREL32 },
2078 +  { BFD_RELOC_MIPS_JMP, R_RISCV_26 },
2079 +  { BFD_RELOC_MIPS_LITERAL, R_RISCV_LITERAL },
2080 +  { BFD_RELOC_MIPS_GOT16, R_RISCV_GOT16 },
2081 +  { BFD_RELOC_MIPS_CALL16, R_RISCV_CALL16 },
2082 +  { BFD_RELOC_MIPS_GOT_DISP, R_RISCV_GOT_DISP },
2083 +  { BFD_RELOC_MIPS_GOT_HI16, R_RISCV_GOT_HI16 },
2084 +  { BFD_RELOC_MIPS_GOT_LO16, R_RISCV_GOT_LO16 },
2085 +  { BFD_RELOC_MIPS_SUB, R_RISCV_SUB },
2086 +  { BFD_RELOC_MIPS_INSERT_A, R_RISCV_INSERT_A },
2087 +  { BFD_RELOC_MIPS_INSERT_B, R_RISCV_INSERT_B },
2088 +  { BFD_RELOC_MIPS_DELETE, R_RISCV_DELETE },
2089 +  { BFD_RELOC_MIPS_CALL_HI16, R_RISCV_CALL_HI16 },
2090 +  { BFD_RELOC_MIPS_CALL_LO16, R_RISCV_CALL_LO16 },
2091 +  { BFD_RELOC_MIPS_SCN_DISP, R_RISCV_SCN_DISP },
2092 +  { BFD_RELOC_MIPS_REL16, R_RISCV_REL16 },
2093 +  /* Use of R_RISCV_ADD_IMMEDIATE and R_RISCV_PJUMP is deprecated.  */
2094 +  { BFD_RELOC_MIPS_RELGOT, R_RISCV_RELGOT },
2095 +  { BFD_RELOC_MIPS_JALR, R_RISCV_JALR },
2096 +  { BFD_RELOC_MIPS_TLS_DTPMOD32, R_RISCV_TLS_DTPMOD32 },
2097 +  { BFD_RELOC_MIPS_TLS_DTPREL32, R_RISCV_TLS_DTPREL32 },
2098 +  { BFD_RELOC_MIPS_TLS_DTPMOD64, R_RISCV_TLS_DTPMOD64 },
2099 +  { BFD_RELOC_MIPS_TLS_DTPREL64, R_RISCV_TLS_DTPREL64 },
2100 +  { BFD_RELOC_MIPS_TLS_GD, R_RISCV_TLS_GD },
2101 +  { BFD_RELOC_MIPS_TLS_LDM, R_RISCV_TLS_LDM },
2102 +  { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_RISCV_TLS_DTPREL_HI16 },
2103 +  { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_RISCV_TLS_DTPREL_LO16 },
2104 +  { BFD_RELOC_MIPS_TLS_GOTTPREL, R_RISCV_TLS_GOTTPREL },
2105 +  { BFD_RELOC_MIPS_TLS_TPREL32, R_RISCV_TLS_TPREL32 },
2106 +  { BFD_RELOC_MIPS_TLS_TPREL64, R_RISCV_TLS_TPREL64 },
2107 +  { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_RISCV_TLS_TPREL_HI16 },
2108 +  { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_RISCV_TLS_TPREL_LO16 }
2109 +};
2110 +
2111 +static const struct elf_reloc_map mips16_reloc_map[] =
2112 +{
2113 +  { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
2114 +  { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
2115 +  { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
2116 +  { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
2117 +  { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
2118 +  { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
2119 +};
2120 +
2121 +/* Given a BFD reloc type, return a howto structure.  */
2122 +
2123 +static reloc_howto_type *
2124 +bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2125 +                                bfd_reloc_code_real_type code)
2126 +{
2127 +  unsigned int i;
2128 +  /* FIXME: We default to RELA here instead of choosing the right
2129 +     relocation variant.  */
2130 +  reloc_howto_type *howto_table = elf_mips_howto_table_rela;
2131 +  reloc_howto_type *howto16_table = elf_mips16_howto_table_rela;
2132 +
2133 +  for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
2134 +       i++)
2135 +    {
2136 +      if (mips_reloc_map[i].bfd_val == code)
2137 +       return &howto_table[(int) mips_reloc_map[i].elf_val];
2138 +    }
2139 +
2140 +  for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
2141 +       i++)
2142 +    {
2143 +      if (mips16_reloc_map[i].bfd_val == code)
2144 +       return &howto16_table[(int) mips16_reloc_map[i].elf_val];
2145 +    }
2146 +
2147 +  switch (code)
2148 +    {
2149 +    case BFD_RELOC_VTABLE_INHERIT:
2150 +      return &elf_mips_gnu_vtinherit_howto;
2151 +    case BFD_RELOC_VTABLE_ENTRY:
2152 +      return &elf_mips_gnu_vtentry_howto;
2153 +    case BFD_RELOC_MIPS_COPY:
2154 +      return &elf_mips_copy_howto;
2155 +    case BFD_RELOC_MIPS_JUMP_SLOT:
2156 +      return &elf_mips_jump_slot_howto;
2157 +    default:
2158 +      bfd_set_error (bfd_error_bad_value);
2159 +      return NULL;
2160 +    }
2161 +}
2162 +
2163 +static reloc_howto_type *
2164 +bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2165 +                                const char *r_name)
2166 +{
2167 +  unsigned int i;
2168 +
2169 +  for (i = 0;
2170 +       i < (sizeof (elf_mips_howto_table_rela)
2171 +           / sizeof (elf_mips_howto_table_rela[0]));
2172 +       i++)
2173 +    if (elf_mips_howto_table_rela[i].name != NULL
2174 +       && strcasecmp (elf_mips_howto_table_rela[i].name, r_name) == 0)
2175 +      return &elf_mips_howto_table_rela[i];
2176 +
2177 +  for (i = 0;
2178 +       i < (sizeof (elf_mips16_howto_table_rela)
2179 +           / sizeof (elf_mips16_howto_table_rela[0]));
2180 +       i++)
2181 +    if (elf_mips16_howto_table_rela[i].name != NULL
2182 +       && strcasecmp (elf_mips16_howto_table_rela[i].name, r_name) == 0)
2183 +      return &elf_mips16_howto_table_rela[i];
2184 +
2185 +  if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
2186 +    return &elf_mips_gnu_vtinherit_howto;
2187 +  if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
2188 +    return &elf_mips_gnu_vtentry_howto;
2189 +  if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
2190 +    return &elf_mips_gnu_rel16_s2;
2191 +  if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
2192 +    return &elf_mips_gnu_rela16_s2;
2193 +  if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
2194 +    return &elf_mips_copy_howto;
2195 +  if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
2196 +    return &elf_mips_jump_slot_howto;
2197 +
2198 +  return NULL;
2199 +}
2200 +
2201 +/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
2202 +
2203 +static reloc_howto_type *
2204 +mips_elf_n32_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
2205 +{
2206 +  switch (r_type)
2207 +    {
2208 +    case R_RISCV_GNU_VTINHERIT:
2209 +      return &elf_mips_gnu_vtinherit_howto;
2210 +    case R_RISCV_GNU_VTENTRY:
2211 +      return &elf_mips_gnu_vtentry_howto;
2212 +    case R_RISCV_GNU_REL16_S2:
2213 +      if (rela_p)
2214 +       return &elf_mips_gnu_rela16_s2;
2215 +      else
2216 +       return &elf_mips_gnu_rel16_s2;
2217 +    case R_RISCV_COPY:
2218 +      return &elf_mips_copy_howto;
2219 +    case R_RISCV_JUMP_SLOT:
2220 +      return &elf_mips_jump_slot_howto;
2221 +    default:
2222 +      if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
2223 +       {
2224 +         if (rela_p)
2225 +           return &elf_mips16_howto_table_rela[r_type - R_MIPS16_min];
2226 +         else
2227 +           return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
2228 +       }
2229 +      BFD_ASSERT (r_type < (unsigned int) R_RISCV_max);
2230 +      if (rela_p)
2231 +       return &elf_mips_howto_table_rela[r_type];
2232 +      else
2233 +       return &elf_mips_howto_table_rel[r_type];
2234 +      break;
2235 +    }
2236 +}
2237 +
2238 +/* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
2239 +
2240 +static void
2241 +mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
2242 +{
2243 +  unsigned int r_type;
2244 +
2245 +  r_type = ELF32_R_TYPE (dst->r_info);
2246 +  cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, FALSE);
2247 +
2248 +  /* The addend for a GPREL16 or LITERAL relocation comes from the GP
2249 +     value for the object file.  We get the addend now, rather than
2250 +     when we do the relocation, because the symbol manipulations done
2251 +     by the linker may cause us to lose track of the input BFD.  */
2252 +  if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
2253 +      && (r_type == R_RISCV_GPREL16 || r_type == (unsigned int) R_RISCV_LITERAL))
2254 +    cache_ptr->addend = elf_gp (abfd);
2255 +}
2256 +
2257 +/* Given a MIPS Elf_Internal_Rela, fill in an arelent structure.  */
2258 +
2259 +static void
2260 +mips_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
2261 +                        arelent *cache_ptr, Elf_Internal_Rela *dst)
2262 +{
2263 +  unsigned int r_type;
2264 +
2265 +  r_type = ELF32_R_TYPE (dst->r_info);
2266 +  cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, TRUE);
2267 +  cache_ptr->addend = dst->r_addend;
2268 +}
2269 +\f
2270 +/* Determine whether a symbol is global for the purposes of splitting
2271 +   the symbol table into global symbols and local symbols.  At least
2272 +   on Irix 5, this split must be between section symbols and all other
2273 +   symbols.  On most ELF targets the split is between static symbols
2274 +   and externally visible symbols.  */
2275 +
2276 +static bfd_boolean
2277 +mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
2278 +{
2279 +  return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
2280 +         || bfd_is_und_section (bfd_get_section (sym))
2281 +         || bfd_is_com_section (bfd_get_section (sym)));
2282 +}
2283 +\f
2284 +/* Set the right machine number for a MIPS ELF file.  */
2285 +
2286 +static bfd_boolean
2287 +mips_elf_n32_object_p (bfd *abfd)
2288 +{
2289 +  unsigned long mach;
2290 +
2291 +  mach = _bfd_elf_riscv_mach (elf_elfheader (abfd)->e_flags);
2292 +  bfd_default_set_arch_mach (abfd, bfd_arch_riscv, mach);
2293 +
2294 +  if (! ABI_N32_P(abfd))
2295 +    return FALSE;
2296 +
2297 +  return TRUE;
2298 +}
2299 +\f
2300 +/* Support for core dump NOTE sections.  */
2301 +static bfd_boolean
2302 +elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2303 +{
2304 +  int offset;
2305 +  unsigned int size;
2306 +
2307 +  switch (note->descsz)
2308 +    {
2309 +      default:
2310 +       return FALSE;
2311 +
2312 +      case 440:                /* Linux/MIPS N32 */
2313 +       /* pr_cursig */
2314 +       elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2315 +
2316 +       /* pr_pid */
2317 +       elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 24);
2318 +
2319 +       /* pr_reg */
2320 +       offset = 72;
2321 +       size = 360;
2322 +
2323 +       break;
2324 +    }
2325 +
2326 +  /* Make a ".reg/999" section.  */
2327 +  return _bfd_elfcore_make_pseudosection (abfd, ".reg", size,
2328 +                                         note->descpos + offset);
2329 +}
2330 +
2331 +static bfd_boolean
2332 +elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2333 +{
2334 +  switch (note->descsz)
2335 +    {
2336 +      default:
2337 +       return FALSE;
2338 +
2339 +      case 128:                /* Linux/MIPS elf_prpsinfo */
2340 +       elf_tdata (abfd)->core_program
2341 +        = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
2342 +       elf_tdata (abfd)->core_command
2343 +        = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
2344 +    }
2345 +
2346 +  /* Note that for some reason, a spurious space is tacked
2347 +     onto the end of the args in some (at least one anyway)
2348 +     implementations, so strip it off if it exists.  */
2349 +
2350 +  {
2351 +    char *command = elf_tdata (abfd)->core_command;
2352 +    int n = strlen (command);
2353 +
2354 +    if (0 < n && command[n - 1] == ' ')
2355 +      command[n - 1] = '\0';
2356 +  }
2357 +
2358 +  return TRUE;
2359 +}
2360 +
2361 +/* ECOFF swapping routines.  These are used when dealing with the
2362 +   .mdebug section, which is in the ECOFF debugging format.  */
2363 +static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
2364 +  /* Symbol table magic number.  */
2365 +  magicSym,
2366 +  /* Alignment of debugging information.  E.g., 4.  */
2367 +  4,
2368 +  /* Sizes of external symbolic information.  */
2369 +  sizeof (struct hdr_ext),
2370 +  sizeof (struct dnr_ext),
2371 +  sizeof (struct pdr_ext),
2372 +  sizeof (struct sym_ext),
2373 +  sizeof (struct opt_ext),
2374 +  sizeof (struct fdr_ext),
2375 +  sizeof (struct rfd_ext),
2376 +  sizeof (struct ext_ext),
2377 +  /* Functions to swap in external symbolic data.  */
2378 +  ecoff_swap_hdr_in,
2379 +  ecoff_swap_dnr_in,
2380 +  ecoff_swap_pdr_in,
2381 +  ecoff_swap_sym_in,
2382 +  ecoff_swap_opt_in,
2383 +  ecoff_swap_fdr_in,
2384 +  ecoff_swap_rfd_in,
2385 +  ecoff_swap_ext_in,
2386 +  _bfd_ecoff_swap_tir_in,
2387 +  _bfd_ecoff_swap_rndx_in,
2388 +  /* Functions to swap out external symbolic data.  */
2389 +  ecoff_swap_hdr_out,
2390 +  ecoff_swap_dnr_out,
2391 +  ecoff_swap_pdr_out,
2392 +  ecoff_swap_sym_out,
2393 +  ecoff_swap_opt_out,
2394 +  ecoff_swap_fdr_out,
2395 +  ecoff_swap_rfd_out,
2396 +  ecoff_swap_ext_out,
2397 +  _bfd_ecoff_swap_tir_out,
2398 +  _bfd_ecoff_swap_rndx_out,
2399 +  /* Function to read in symbolic data.  */
2400 +  _bfd_riscv_elf_read_ecoff_info
2401 +};
2402 +\f
2403 +#define ELF_ARCH                       bfd_arch_riscv
2404 +#define ELF_TARGET_ID                  MIPS_ELF_DATA
2405 +#define ELF_MACHINE_CODE               EM_RISCV
2406 +
2407 +#define elf_backend_collect            TRUE
2408 +#define elf_backend_type_change_ok     TRUE
2409 +#define elf_backend_can_gc_sections    TRUE
2410 +#define elf_info_to_howto              mips_info_to_howto_rela
2411 +#define elf_info_to_howto_rel          mips_info_to_howto_rel
2412 +#define elf_backend_sym_is_global      mips_elf_sym_is_global
2413 +#define elf_backend_object_p           mips_elf_n32_object_p
2414 +#define elf_backend_symbol_processing  _bfd_riscv_elf_symbol_processing
2415 +#define elf_backend_section_processing _bfd_riscv_elf_section_processing
2416 +#define elf_backend_section_from_shdr  _bfd_riscv_elf_section_from_shdr
2417 +#define elf_backend_fake_sections      _bfd_riscv_elf_fake_sections
2418 +#define elf_backend_section_from_bfd_section \
2419 +                                       _bfd_riscv_elf_section_from_bfd_section
2420 +#define elf_backend_add_symbol_hook    _bfd_riscv_elf_add_symbol_hook
2421 +#define elf_backend_link_output_symbol_hook \
2422 +                                       _bfd_riscv_elf_link_output_symbol_hook
2423 +#define elf_backend_create_dynamic_sections \
2424 +                                       _bfd_riscv_elf_create_dynamic_sections
2425 +#define elf_backend_check_relocs       _bfd_riscv_elf_check_relocs
2426 +#define elf_backend_merge_symbol_attribute \
2427 +                                       _bfd_riscv_elf_merge_symbol_attribute
2428 +#define elf_backend_get_target_dtag    _bfd_riscv_elf_get_target_dtag
2429 +#define elf_backend_adjust_dynamic_symbol \
2430 +                                       _bfd_riscv_elf_adjust_dynamic_symbol
2431 +#define elf_backend_always_size_sections \
2432 +                                       _bfd_riscv_elf_always_size_sections
2433 +#define elf_backend_size_dynamic_sections \
2434 +                                       _bfd_riscv_elf_size_dynamic_sections
2435 +#define elf_backend_init_index_section _bfd_elf_init_1_index_section
2436 +#define elf_backend_relocate_section   _bfd_riscv_elf_relocate_section
2437 +#define elf_backend_finish_dynamic_symbol \
2438 +                                       _bfd_riscv_elf_finish_dynamic_symbol
2439 +#define elf_backend_finish_dynamic_sections \
2440 +                                       _bfd_riscv_elf_finish_dynamic_sections
2441 +#define elf_backend_final_write_processing \
2442 +                                       _bfd_riscv_elf_final_write_processing
2443 +#define elf_backend_additional_program_headers \
2444 +                                       _bfd_riscv_elf_additional_program_headers
2445 +#define elf_backend_modify_segment_map _bfd_riscv_elf_modify_segment_map
2446 +#define elf_backend_gc_mark_hook       _bfd_riscv_elf_gc_mark_hook
2447 +#define elf_backend_gc_sweep_hook      _bfd_riscv_elf_gc_sweep_hook
2448 +#define elf_backend_copy_indirect_symbol \
2449 +                                       _bfd_riscv_elf_copy_indirect_symbol
2450 +#define elf_backend_grok_prstatus      elf32_mips_grok_prstatus
2451 +#define elf_backend_grok_psinfo                elf32_mips_grok_psinfo
2452 +#define elf_backend_ecoff_debug_swap   &mips_elf32_ecoff_debug_swap
2453 +
2454 +#define elf_backend_got_header_size    (4 * MIPS_RESERVED_GOTNO)
2455 +
2456 +/* MIPS n32 ELF can use a mixture of REL and RELA, but some Relocations
2457 +   work better/work only in RELA, so we default to this.  */
2458 +#define elf_backend_may_use_rel_p      1
2459 +#define elf_backend_may_use_rela_p     1
2460 +#define elf_backend_default_use_rela_p 1
2461 +#define elf_backend_rela_plts_and_copies_p 0
2462 +#define elf_backend_sign_extend_vma    TRUE
2463 +#define elf_backend_plt_readonly       1
2464 +#define elf_backend_plt_sym_val                _bfd_riscv_elf_plt_sym_val
2465 +
2466 +#define elf_backend_discard_info       _bfd_riscv_elf_discard_info
2467 +#define elf_backend_ignore_discarded_relocs \
2468 +                                       _bfd_riscv_elf_ignore_discarded_relocs
2469 +#define elf_backend_write_section      _bfd_riscv_elf_write_section
2470 +#define elf_backend_mips_rtype_to_howto        mips_elf_n32_rtype_to_howto
2471 +#define bfd_elf32_find_nearest_line    _bfd_riscv_elf_find_nearest_line
2472 +#define bfd_elf32_find_inliner_info    _bfd_riscv_elf_find_inliner_info
2473 +#define bfd_elf32_new_section_hook     _bfd_riscv_elf_new_section_hook
2474 +#define bfd_elf32_set_section_contents _bfd_riscv_elf_set_section_contents
2475 +#define bfd_elf32_bfd_get_relocated_section_contents \
2476 +                               _bfd_elf_riscv_get_relocated_section_contents
2477 +#define bfd_elf32_bfd_link_hash_table_create \
2478 +                                       _bfd_riscv_elf_link_hash_table_create
2479 +#define bfd_elf32_bfd_final_link       _bfd_riscv_elf_final_link
2480 +#define bfd_elf32_bfd_merge_private_bfd_data \
2481 +                                       _bfd_riscv_elf_merge_private_bfd_data
2482 +#define bfd_elf32_bfd_set_private_flags        _bfd_riscv_elf_set_private_flags
2483 +#define bfd_elf32_bfd_print_private_bfd_data \
2484 +                                       _bfd_riscv_elf_print_private_bfd_data
2485 +#define bfd_elf32_bfd_relax_section     _bfd_riscv_relax_section
2486 +
2487 +/* Support for SGI-ish mips targets using n32 ABI.  */
2488 +
2489 +#define TARGET_LITTLE_SYM               bfd_elf32_littleriscv_vec
2490 +#define TARGET_LITTLE_NAME              "elf32-littleriscv"
2491 +#define TARGET_BIG_SYM                  bfd_elf32_bigriscv_vec
2492 +#define TARGET_BIG_NAME                 "elf32-bigriscv"
2493 +
2494 +#define ELF_MAXPAGESIZE                        0x10000
2495 +#define ELF_COMMONPAGESIZE             0x1000
2496 +
2497 +#include "elf32-target.h"
2498 diff -x autom4te.cache -ruN ../binutils-2.21.1-orig/bfd/elf64-riscv.c binutils-2.21.1/bfd/elf64-riscv.c
2499 --- ../binutils-2.21.1-orig/bfd/elf64-riscv.c   1969-12-31 16:00:00.000000000 -0800
2500 +++ binutils-2.21.1/bfd/elf64-riscv.c   2011-10-22 18:50:03.000000000 -0700
2501 @@ -0,0 +1,3298 @@
2502 +/* MIPS-specific support for 64-bit ELF
2503 +   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2504 +   2006, 2007, 2008, 2009, 2010
2505 +   Free Software Foundation, Inc.
2506 +   Ian Lance Taylor, Cygnus Support
2507 +   Linker support added by Mark Mitchell, CodeSourcery, LLC.
2508 +   <mark@codesourcery.com>
2509 +
2510 +   This file is part of BFD, the Binary File Descriptor library.
2511 +
2512 +   This program is free software; you can redistribute it and/or modify
2513 +   it under the terms of the GNU General Public License as published by
2514 +   the Free Software Foundation; either version 3 of the License, or
2515 +   (at your option) any later version.
2516 +
2517 +   This program is distributed in the hope that it will be useful,
2518 +   but WITHOUT ANY WARRANTY; without even the implied warranty of
2519 +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2520 +   GNU General Public License for more details.
2521 +
2522 +   You should have received a copy of the GNU General Public License
2523 +   along with this program; if not, write to the Free Software
2524 +   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
2525 +   MA 02110-1301, USA.  */
2526 +
2527 +
2528 +/* This file supports the 64-bit MIPS ELF ABI.
2529 +
2530 +   The MIPS 64-bit ELF ABI uses an unusual reloc format.  This file
2531 +   overrides the usual ELF reloc handling, and handles reading and
2532 +   writing the relocations here.  */
2533 +
2534 +/* TODO: Many things are unsupported, even if there is some code for it
2535 + .       (which was mostly stolen from elf32-mips.c and slightly adapted).
2536 + .
2537 + .   - Relocation handling for REL relocs is wrong in many cases and
2538 + .     generally untested.
2539 + .   - Relocation handling for RELA relocs related to GOT support are
2540 + .     also likely to be wrong.
2541 + .   - Support for MIPS16 is untested.
2542 + .   - Combined relocs with RSS_* entries are unsupported.
2543 + .   - The whole GOT handling for NewABI is missing, some parts of
2544 + .     the OldABI version is still lying around and should be removed.
2545 + */
2546 +
2547 +#include "sysdep.h"
2548 +#include "bfd.h"
2549 +#include "libbfd.h"
2550 +#include "aout/ar.h"
2551 +#include "bfdlink.h"
2552 +#include "genlink.h"
2553 +#include "elf-bfd.h"
2554 +#include "elfxx-riscv.h"
2555 +#include "elf/riscv.h"
2556 +#include "opcode/riscv.h"
2557 +
2558 +/* Get the ECOFF swapping routines.  The 64-bit ABI is not supposed to
2559 +   use ECOFF.  However, we support it anyhow for an easier changeover.  */
2560 +#include "coff/sym.h"
2561 +#include "coff/symconst.h"
2562 +#include "coff/internal.h"
2563 +#include "coff/ecoff.h"
2564 +/* The 64 bit versions of the mdebug data structures are in alpha.h.  */
2565 +#include "coff/alpha.h"
2566 +#define ECOFF_SIGNED_64
2567 +#include "ecoffswap.h"
2568 +
2569 +#include "opcode/riscv.h"
2570 +
2571 +static void mips_elf64_swap_reloc_in
2572 +  (bfd *, const Elf64_Mips_External_Rel *, Elf64_Mips_Internal_Rela *);
2573 +static void mips_elf64_swap_reloca_in
2574 +  (bfd *, const Elf64_Mips_External_Rela *, Elf64_Mips_Internal_Rela *);
2575 +static void mips_elf64_swap_reloc_out
2576 +  (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rel *);
2577 +static void mips_elf64_swap_reloca_out
2578 +  (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rela *);
2579 +static void mips_elf64_be_swap_reloc_in
2580 +  (bfd *, const bfd_byte *, Elf_Internal_Rela *);
2581 +static void mips_elf64_be_swap_reloc_out
2582 +  (bfd *, const Elf_Internal_Rela *, bfd_byte *);
2583 +static void mips_elf64_be_swap_reloca_in
2584 +  (bfd *, const bfd_byte *, Elf_Internal_Rela *);
2585 +static void mips_elf64_be_swap_reloca_out
2586 +  (bfd *, const Elf_Internal_Rela *, bfd_byte *);
2587 +static reloc_howto_type *bfd_elf64_bfd_reloc_type_lookup
2588 +  (bfd *, bfd_reloc_code_real_type);
2589 +static reloc_howto_type *mips_elf64_rtype_to_howto
2590 +  (unsigned int, bfd_boolean);
2591 +static void mips_elf64_info_to_howto_rel
2592 +  (bfd *, arelent *, Elf_Internal_Rela *);
2593 +static void mips_elf64_info_to_howto_rela
2594 +  (bfd *, arelent *, Elf_Internal_Rela *);
2595 +static long mips_elf64_get_reloc_upper_bound
2596 +  (bfd *, asection *);
2597 +static long mips_elf64_canonicalize_reloc
2598 +  (bfd *, asection *, arelent **, asymbol **);
2599 +static long mips_elf64_get_dynamic_reloc_upper_bound
2600 +  (bfd *);
2601 +static long mips_elf64_canonicalize_dynamic_reloc
2602 +  (bfd *, arelent **, asymbol **);
2603 +static bfd_boolean mips_elf64_slurp_one_reloc_table
2604 +  (bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type, arelent *,
2605 +   asymbol **, bfd_boolean);
2606 +static bfd_boolean mips_elf64_slurp_reloc_table
2607 +  (bfd *, asection *, asymbol **, bfd_boolean);
2608 +static void mips_elf64_write_relocs
2609 +  (bfd *, asection *, void *);
2610 +static void mips_elf64_write_rel
2611 +  (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
2612 +static void mips_elf64_write_rela
2613 +  (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
2614 +static bfd_reloc_status_type mips_elf64_gprel16_reloc
2615 +  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2616 +static bfd_reloc_status_type mips_elf64_literal_reloc
2617 +  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2618 +static bfd_reloc_status_type mips_elf64_gprel32_reloc
2619 +  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2620 +static bfd_reloc_status_type mips16_gprel_reloc
2621 +  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2622 +static bfd_boolean mips_elf64_assign_gp
2623 +  (bfd *, bfd_vma *);
2624 +static bfd_reloc_status_type mips_elf64_final_gp
2625 +  (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
2626 +static bfd_boolean mips_elf64_object_p
2627 +  (bfd *);
2628 +static bfd_boolean elf64_mips_grok_prstatus
2629 +  (bfd *, Elf_Internal_Note *);
2630 +static bfd_boolean elf64_mips_grok_psinfo
2631 +  (bfd *, Elf_Internal_Note *);
2632 +
2633 +/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
2634 +   from smaller values.  Start with zero, widen, *then* decrement.  */
2635 +#define MINUS_ONE      (((bfd_vma)0) - 1)
2636 +
2637 +/* The number of local .got entries we reserve.  */
2638 +#define MIPS_RESERVED_GOTNO (2)
2639 +\f
2640 +/* The relocation table used for SHT_REL sections.  */
2641 +
2642 +static reloc_howto_type mips_elf64_howto_table_rel[] =
2643 +{
2644 +  /* No relocation.  */
2645 +  HOWTO (R_RISCV_NONE,         /* type */
2646 +        0,                     /* rightshift */
2647 +        0,                     /* size (0 = byte, 1 = short, 2 = long) */
2648 +        0,                     /* bitsize */
2649 +        FALSE,                 /* pc_relative */
2650 +        0,                     /* bitpos */
2651 +        complain_overflow_dont, /* complain_on_overflow */
2652 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2653 +        "R_RISCV_NONE",                /* name */
2654 +        FALSE,                 /* partial_inplace */
2655 +        0,                     /* src_mask */
2656 +        0,                     /* dst_mask */
2657 +        FALSE),                /* pcrel_offset */
2658 +
2659 +  EMPTY_HOWTO (1),
2660 +
2661 +  /* 32 bit relocation.  */
2662 +  HOWTO (R_RISCV_32,           /* type */
2663 +        0,                     /* rightshift */
2664 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2665 +        32,                    /* bitsize */
2666 +        FALSE,                 /* pc_relative */
2667 +        0,                     /* bitpos */
2668 +        complain_overflow_dont, /* complain_on_overflow */
2669 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2670 +        "R_RISCV_32",          /* name */
2671 +        TRUE,                  /* partial_inplace */
2672 +        0xffffffff,            /* src_mask */
2673 +        0xffffffff,            /* dst_mask */
2674 +        FALSE),                /* pcrel_offset */
2675 +
2676 +  /* 32 bit symbol relative relocation.  */
2677 +  HOWTO (R_RISCV_REL32,                /* type */
2678 +        0,                     /* rightshift */
2679 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2680 +        32,                    /* bitsize */
2681 +        FALSE,                 /* pc_relative */
2682 +        0,                     /* bitpos */
2683 +        complain_overflow_dont, /* complain_on_overflow */
2684 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2685 +        "R_RISCV_REL32",       /* name */
2686 +        TRUE,                  /* partial_inplace */
2687 +        0xffffffff,            /* src_mask */
2688 +        0xffffffff,            /* dst_mask */
2689 +        FALSE),                /* pcrel_offset */
2690 +
2691 +  /* 26 bit jump address.  */
2692 +  HOWTO (R_RISCV_26,           /* type */
2693 +        RISCV_JUMP_ALIGN_BITS,                 /* rightshift */
2694 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2695 +        RISCV_JUMP_BITS,                       /* bitsize */
2696 +        TRUE,                  /* pc_relative */
2697 +        OP_SH_TARGET,                  /* bitpos */
2698 +        complain_overflow_dont, /* complain_on_overflow */
2699 +                               /* This needs complex overflow
2700 +                                  detection, because the upper 36
2701 +                                  bits must match the PC + 4.  */
2702 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2703 +        "R_RISCV_26",          /* name */
2704 +        TRUE,                  /* partial_inplace */
2705 +        ((1<<RISCV_JUMP_BITS)-1) << OP_SH_TARGET,              /* src_mask */
2706 +        ((1<<RISCV_JUMP_BITS)-1) << OP_SH_TARGET,              /* dst_mask */
2707 +        TRUE),         /* pcrel_offset */
2708 +
2709 +  /* R_RISCV_HI16 and R_RISCV_LO16 are unsupported for NewABI REL.
2710 +     However, the native IRIX6 tools use them, so we try our best. */
2711 +
2712 +  /* High 16 bits of symbol value.  */
2713 +  HOWTO (R_RISCV_HI16,         /* type */
2714 +        RISCV_IMM_BITS,                        /* rightshift */
2715 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2716 +        RISCV_BIGIMM_BITS,                     /* bitsize */
2717 +        FALSE,                 /* pc_relative */
2718 +        OP_SH_BIGIMMEDIATE,                    /* bitpos */
2719 +        complain_overflow_dont, /* complain_on_overflow */
2720 +        _bfd_riscv_elf_hi16_reloc, /* special_function */
2721 +        "R_RISCV_HI16",                /* name */
2722 +        TRUE,                  /* partial_inplace */
2723 +        ((1<<RISCV_BIGIMM_BITS)-1) << OP_SH_BIGIMMEDIATE,              /* src_mask */
2724 +        ((1<<RISCV_BIGIMM_BITS)-1) << OP_SH_BIGIMMEDIATE,              /* dst_mask */
2725 +        FALSE),                /* pcrel_offset */
2726 +
2727 +  /* Low 16 bits of symbol value.  */
2728 +  HOWTO (R_RISCV_LO16,         /* type */
2729 +        0,                     /* rightshift */
2730 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2731 +        RISCV_IMM_BITS,                        /* bitsize */
2732 +        FALSE,                 /* pc_relative */
2733 +        OP_SH_IMMEDIATE,                       /* bitpos */
2734 +        complain_overflow_dont, /* complain_on_overflow */
2735 +        _bfd_riscv_elf_lo16_reloc, /* special_function */
2736 +        "R_RISCV_LO16",                /* name */
2737 +        TRUE,                  /* partial_inplace */
2738 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,                /* src_mask */
2739 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,                /* dst_mask */
2740 +        FALSE),                /* pcrel_offset */
2741 +
2742 +  /* GP relative reference.  */
2743 +  HOWTO (R_RISCV_GPREL16,      /* type */
2744 +        0,                     /* rightshift */
2745 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2746 +        RISCV_IMM_BITS,                        /* bitsize */
2747 +        FALSE,                 /* pc_relative */
2748 +        OP_SH_IMMEDIATE,       /* bitpos */
2749 +        complain_overflow_signed, /* complain_on_overflow */
2750 +        mips_elf64_gprel16_reloc, /* special_function */
2751 +        "R_RISCV_GPREL16",     /* name */
2752 +        TRUE,                  /* partial_inplace */
2753 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
2754 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
2755 +        FALSE),                /* pcrel_offset */
2756 +
2757 +  /* Reference to literal section.  */
2758 +  HOWTO (R_RISCV_LITERAL,      /* type */
2759 +        0,                     /* rightshift */
2760 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2761 +        RISCV_IMM_BITS,                        /* bitsize */
2762 +        FALSE,                 /* pc_relative */
2763 +        OP_SH_IMMEDIATE,       /* bitpos */
2764 +        complain_overflow_signed, /* complain_on_overflow */
2765 +        mips_elf64_literal_reloc, /* special_function */
2766 +        "R_RISCV_LITERAL",     /* name */
2767 +        TRUE,                  /* partial_inplace */
2768 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
2769 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
2770 +        FALSE),                /* pcrel_offset */
2771 +
2772 +  /* Reference to global offset table.  */
2773 +  HOWTO (R_RISCV_GOT16,                /* type */
2774 +        0,                     /* rightshift */
2775 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2776 +        RISCV_IMM_BITS,        /* bitsize */
2777 +        FALSE,                 /* pc_relative */
2778 +        OP_SH_IMMEDIATE,       /* bitpos */
2779 +        complain_overflow_signed, /* complain_on_overflow */
2780 +        _bfd_riscv_elf_got16_reloc, /* special_function */
2781 +        "R_RISCV_GOT16",       /* name */
2782 +        TRUE,                  /* partial_inplace */
2783 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,                /* src_mask */
2784 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,                /* dst_mask */
2785 +        FALSE),                /* pcrel_offset */
2786 +
2787 +  /* 16 bit PC relative reference.  Note that the ABI document has a typo
2788 +     and claims R_RISCV_PC16 to be not rightshifted, rendering it useless.
2789 +     We do the right thing here.  */
2790 +  HOWTO (R_RISCV_PC16,         /* type */
2791 +        RISCV_BRANCH_ALIGN_BITS,                       /* rightshift */
2792 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2793 +        RISCV_IMM_BITS,                        /* bitsize */
2794 +        TRUE,                  /* pc_relative */
2795 +        OP_SH_IMMEDIATE,       /* bitpos */
2796 +        complain_overflow_signed, /* complain_on_overflow */
2797 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2798 +        "R_RISCV_PC16",                /* name */
2799 +        TRUE,                  /* partial_inplace */
2800 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
2801 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
2802 +        TRUE),                 /* pcrel_offset */
2803 +
2804 +  /* 16 bit call through global offset table.  */
2805 +  HOWTO (R_RISCV_CALL16,               /* type */
2806 +        0,                     /* rightshift */
2807 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2808 +        RISCV_IMM_BITS,                        /* bitsize */
2809 +        FALSE,                 /* pc_relative */
2810 +        OP_SH_IMMEDIATE,       /* bitpos */
2811 +        complain_overflow_signed, /* complain_on_overflow */
2812 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2813 +        "R_RISCV_CALL16",      /* name */
2814 +        TRUE,                  /* partial_inplace */
2815 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
2816 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
2817 +        FALSE),                /* pcrel_offset */
2818 +
2819 +  /* 32 bit GP relative reference.  */
2820 +  HOWTO (R_RISCV_GPREL32,      /* type */
2821 +        0,                     /* rightshift */
2822 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2823 +        32,                    /* bitsize */
2824 +        FALSE,                 /* pc_relative */
2825 +        0,                     /* bitpos */
2826 +        complain_overflow_dont, /* complain_on_overflow */
2827 +        mips_elf64_gprel32_reloc, /* special_function */
2828 +        "R_RISCV_GPREL32",     /* name */
2829 +        TRUE,                  /* partial_inplace */
2830 +        0xffffffff,            /* src_mask */
2831 +        0xffffffff,            /* dst_mask */
2832 +        FALSE),                /* pcrel_offset */
2833 +
2834 +  EMPTY_HOWTO (13),
2835 +  EMPTY_HOWTO (14),
2836 +  EMPTY_HOWTO (15),
2837 +  EMPTY_HOWTO (16),
2838 +  EMPTY_HOWTO (17),
2839 +
2840 +  /* 64 bit relocation.  */
2841 +  HOWTO (R_RISCV_64,           /* type */
2842 +        0,                     /* rightshift */
2843 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
2844 +        64,                    /* bitsize */
2845 +        FALSE,                 /* pc_relative */
2846 +        0,                     /* bitpos */
2847 +        complain_overflow_dont, /* complain_on_overflow */
2848 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2849 +        "R_RISCV_64",          /* name */
2850 +        TRUE,                  /* partial_inplace */
2851 +        MINUS_ONE,             /* src_mask */
2852 +        MINUS_ONE,             /* dst_mask */
2853 +        FALSE),                /* pcrel_offset */
2854 +
2855 +  /* Displacement in the global offset table.  */
2856 +  HOWTO (R_RISCV_GOT_DISP,     /* type */
2857 +        0,                     /* rightshift */
2858 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2859 +        RISCV_IMM_BITS,                        /* bitsize */
2860 +        FALSE,                 /* pc_relative */
2861 +        OP_SH_IMMEDIATE,                       /* bitpos */
2862 +        complain_overflow_signed, /* complain_on_overflow */
2863 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2864 +        "R_RISCV_GOT_DISP",    /* name */
2865 +        TRUE,                  /* partial_inplace */
2866 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,                /* src_mask */
2867 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,                /* dst_mask */
2868 +        FALSE),                /* pcrel_offset */
2869 +
2870 +  EMPTY_HOWTO (20),
2871 +  EMPTY_HOWTO (21),
2872 +
2873 +  /* High 16 bits of displacement in global offset table.  */
2874 +  HOWTO (R_RISCV_GOT_HI16,     /* type */
2875 +        0,                     /* rightshift */
2876 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2877 +        RISCV_BIGIMM_BITS,     /* bitsize */
2878 +        FALSE,                 /* pc_relative */
2879 +        OP_SH_BIGIMMEDIATE,    /* bitpos */
2880 +        complain_overflow_dont, /* complain_on_overflow */
2881 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2882 +        "R_RISCV_GOT_HI16",    /* name */
2883 +        TRUE,                  /* partial_inplace */
2884 +        ((1<<RISCV_BIGIMM_BITS)-1) << OP_SH_BIGIMMEDIATE,              /* src_mask */
2885 +        ((1<<RISCV_BIGIMM_BITS)-1) << OP_SH_BIGIMMEDIATE,              /* dst_mask */
2886 +        FALSE),                /* pcrel_offset */
2887 +
2888 +  /* Low 16 bits of displacement in global offset table.  */
2889 +  HOWTO (R_RISCV_GOT_LO16,     /* type */
2890 +        0,                     /* rightshift */
2891 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2892 +        RISCV_IMM_BITS,                        /* bitsize */
2893 +        FALSE,                 /* pc_relative */
2894 +        OP_SH_IMMEDIATE,       /* bitpos */
2895 +        complain_overflow_dont, /* complain_on_overflow */
2896 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2897 +        "R_RISCV_GOT_LO16",    /* name */
2898 +        TRUE,                  /* partial_inplace */
2899 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,                /* src_mask */
2900 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,                /* dst_mask */
2901 +        FALSE),                /* pcrel_offset */
2902 +
2903 +  /* 64 bit subtraction.  */
2904 +  HOWTO (R_RISCV_SUB,          /* type */
2905 +        0,                     /* rightshift */
2906 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
2907 +        64,                    /* bitsize */
2908 +        FALSE,                 /* pc_relative */
2909 +        0,                     /* bitpos */
2910 +        complain_overflow_dont, /* complain_on_overflow */
2911 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2912 +        "R_RISCV_SUB",         /* name */
2913 +        TRUE,                  /* partial_inplace */
2914 +        MINUS_ONE,             /* src_mask */
2915 +        MINUS_ONE,             /* dst_mask */
2916 +        FALSE),                /* pcrel_offset */
2917 +
2918 +  /* Insert the addend as an instruction.  */
2919 +  /* FIXME: Not handled correctly.  */
2920 +  HOWTO (R_RISCV_INSERT_A,     /* type */
2921 +        0,                     /* rightshift */
2922 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2923 +        32,                    /* bitsize */
2924 +        FALSE,                 /* pc_relative */
2925 +        0,                     /* bitpos */
2926 +        complain_overflow_dont, /* complain_on_overflow */
2927 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2928 +        "R_RISCV_INSERT_A",    /* name */
2929 +        TRUE,                  /* partial_inplace */
2930 +        0xffffffff,            /* src_mask */
2931 +        0xffffffff,            /* dst_mask */
2932 +        FALSE),                /* pcrel_offset */
2933 +
2934 +  /* Insert the addend as an instruction, and change all relocations
2935 +     to refer to the old instruction at the address.  */
2936 +  /* FIXME: Not handled correctly.  */
2937 +  HOWTO (R_RISCV_INSERT_B,     /* type */
2938 +        0,                     /* rightshift */
2939 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2940 +        32,                    /* bitsize */
2941 +        FALSE,                 /* pc_relative */
2942 +        0,                     /* bitpos */
2943 +        complain_overflow_dont, /* complain_on_overflow */
2944 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2945 +        "R_RISCV_INSERT_B",    /* name */
2946 +        TRUE,                  /* partial_inplace */
2947 +        0xffffffff,            /* src_mask */
2948 +        0xffffffff,            /* dst_mask */
2949 +        FALSE),                /* pcrel_offset */
2950 +
2951 +  /* Delete a 32 bit instruction.  */
2952 +  /* FIXME: Not handled correctly.  */
2953 +  HOWTO (R_RISCV_DELETE,               /* type */
2954 +        0,                     /* rightshift */
2955 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2956 +        32,                    /* bitsize */
2957 +        FALSE,                 /* pc_relative */
2958 +        0,                     /* bitpos */
2959 +        complain_overflow_dont, /* complain_on_overflow */
2960 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2961 +        "R_RISCV_DELETE",      /* name */
2962 +        TRUE,                  /* partial_inplace */
2963 +        0xffffffff,            /* src_mask */
2964 +        0xffffffff,            /* dst_mask */
2965 +        FALSE),                /* pcrel_offset */
2966 +
2967 +  EMPTY_HOWTO (28),
2968 +  EMPTY_HOWTO (29),
2969 +
2970 +  /* High 16 bits of displacement in global offset table.  */
2971 +  HOWTO (R_RISCV_CALL_HI16,    /* type */
2972 +        0,                     /* rightshift */
2973 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2974 +        RISCV_BIGIMM_BITS,                     /* bitsize */
2975 +        FALSE,                 /* pc_relative */
2976 +        OP_SH_BIGIMMEDIATE,    /* bitpos */
2977 +        complain_overflow_dont, /* complain_on_overflow */
2978 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2979 +        "R_RISCV_CALL_HI16",   /* name */
2980 +        TRUE,                  /* partial_inplace */
2981 +        ((1<<RISCV_BIGIMM_BITS)-1) << OP_SH_BIGIMMEDIATE,      /* src_mask */
2982 +        ((1<<RISCV_BIGIMM_BITS)-1) << OP_SH_BIGIMMEDIATE,      /* dst_mask */
2983 +        FALSE),                /* pcrel_offset */
2984 +
2985 +  /* Low 16 bits of displacement in global offset table.  */
2986 +  HOWTO (R_RISCV_CALL_LO16,    /* type */
2987 +        0,                     /* rightshift */
2988 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
2989 +        RISCV_IMM_BITS,                        /* bitsize */
2990 +        FALSE,                 /* pc_relative */
2991 +        OP_SH_IMMEDIATE,       /* bitpos */
2992 +        complain_overflow_dont, /* complain_on_overflow */
2993 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
2994 +        "R_RISCV_CALL_LO16",   /* name */
2995 +        TRUE,                  /* partial_inplace */
2996 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
2997 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
2998 +        FALSE),                /* pcrel_offset */
2999 +
3000 +  /* Section displacement, used by an associated event location section.  */
3001 +  HOWTO (R_RISCV_SCN_DISP,     /* type */
3002 +        0,                     /* rightshift */
3003 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
3004 +        32,                    /* bitsize */
3005 +        FALSE,                 /* pc_relative */
3006 +        0,                     /* bitpos */
3007 +        complain_overflow_dont, /* complain_on_overflow */
3008 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
3009 +        "R_RISCV_SCN_DISP",    /* name */
3010 +        TRUE,                  /* partial_inplace */
3011 +        0xffffffff,            /* src_mask */
3012 +        0xffffffff,            /* dst_mask */
3013 +        FALSE),                /* pcrel_offset */
3014 +
3015 +  HOWTO (R_RISCV_REL16,                /* type */
3016 +        0,                     /* rightshift */
3017 +        1,                     /* size (0 = byte, 1 = short, 2 = long) */
3018 +        RISCV_IMM_BITS,                        /* bitsize */
3019 +        FALSE,                 /* pc_relative */
3020 +        OP_SH_IMMEDIATE,       /* bitpos */
3021 +        complain_overflow_signed, /* complain_on_overflow */
3022 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
3023 +        "R_RISCV_REL16",       /* name */
3024 +        TRUE,                  /* partial_inplace */
3025 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
3026 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
3027 +        FALSE),                /* pcrel_offset */
3028 +
3029 +  /* These two are obsolete.  */
3030 +  EMPTY_HOWTO (R_RISCV_ADD_IMMEDIATE),
3031 +  EMPTY_HOWTO (R_RISCV_PJUMP),
3032 +
3033 +  /* Similiar to R_RISCV_REL32, but used for relocations in a GOT section.
3034 +     It must be used for multigot GOT's (and only there).  */
3035 +  HOWTO (R_RISCV_RELGOT,               /* type */
3036 +        0,                     /* rightshift */
3037 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
3038 +        32,                    /* bitsize */
3039 +        FALSE,                 /* pc_relative */
3040 +        0,                     /* bitpos */
3041 +        complain_overflow_dont, /* complain_on_overflow */
3042 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
3043 +        "R_RISCV_RELGOT",      /* name */
3044 +        TRUE,                  /* partial_inplace */
3045 +        0xffffffff,            /* src_mask */
3046 +        0xffffffff,            /* dst_mask */
3047 +        FALSE),                /* pcrel_offset */
3048 +
3049 +  /* Protected jump conversion.  This is an optimization hint.  No
3050 +     relocation is required for correctness.  */
3051 +  HOWTO (R_RISCV_JALR,         /* type */
3052 +        0,                     /* rightshift */
3053 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
3054 +        32,                    /* bitsize */
3055 +        FALSE,                 /* pc_relative */
3056 +        0,                     /* bitpos */
3057 +        complain_overflow_dont, /* complain_on_overflow */
3058 +        _bfd_riscv_elf_generic_reloc,  /* special_function */
3059 +        "R_RISCV_JALR",                /* name */
3060 +        FALSE,                 /* partial_inplace */
3061 +        0,                     /* src_mask */
3062 +        0x00000000,            /* dst_mask */
3063 +        FALSE),                /* pcrel_offset */
3064 +
3065 +  /* TLS relocations.  */
3066 +  EMPTY_HOWTO (R_RISCV_TLS_DTPMOD32),
3067 +  EMPTY_HOWTO (R_RISCV_TLS_DTPREL32),
3068 +
3069 +  HOWTO (R_RISCV_TLS_DTPMOD64, /* type */
3070 +        0,                     /* rightshift */
3071 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
3072 +        64,                    /* bitsize */
3073 +        FALSE,                 /* pc_relative */
3074 +        0,                     /* bitpos */
3075 +        complain_overflow_dont, /* complain_on_overflow */
3076 +        _bfd_riscv_elf_generic_reloc, /* special_function */
3077 +        "R_RISCV_TLS_DTPMOD64",        /* name */
3078 +        TRUE,                  /* partial_inplace */
3079 +        MINUS_ONE,             /* src_mask */
3080 +        MINUS_ONE,             /* dst_mask */
3081 +        FALSE),                /* pcrel_offset */
3082 +
3083 +  HOWTO (R_RISCV_TLS_DTPREL64, /* type */
3084 +        0,                     /* rightshift */
3085 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
3086 +        64,                    /* bitsize */
3087 +        FALSE,                 /* pc_relative */
3088 +        0,                     /* bitpos */
3089 +        complain_overflow_dont, /* complain_on_overflow */
3090 +        _bfd_riscv_elf_generic_reloc, /* special_function */
3091 +        "R_RISCV_TLS_DTPREL64",        /* name */
3092 +        TRUE,                  /* partial_inplace */
3093 +        MINUS_ONE,             /* src_mask */
3094 +        MINUS_ONE,             /* dst_mask */
3095 +        FALSE),                /* pcrel_offset */
3096 +
3097 +  /* TLS general dynamic variable reference.  */
3098 +  HOWTO (R_RISCV_TLS_GD,               /* type */
3099 +        0,                     /* rightshift */
3100 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
3101 +        RISCV_IMM_BITS,                        /* bitsize */
3102 +        FALSE,                 /* pc_relative */
3103 +        OP_SH_IMMEDIATE,       /* bitpos */
3104 +        complain_overflow_signed, /* complain_on_overflow */
3105 +        _bfd_riscv_elf_generic_reloc, /* special_function */
3106 +        "R_RISCV_TLS_GD",      /* name */
3107 +        TRUE,                  /* partial_inplace */
3108 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
3109 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
3110 +        FALSE),                /* pcrel_offset */
3111 +
3112 +  /* TLS local dynamic variable reference.  */
3113 +  HOWTO (R_RISCV_TLS_LDM,      /* type */
3114 +        0,                     /* rightshift */
3115 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
3116 +        RISCV_IMM_BITS,                        /* bitsize */
3117 +        FALSE,                 /* pc_relative */
3118 +        OP_SH_IMMEDIATE,       /* bitpos */
3119 +        complain_overflow_signed, /* complain_on_overflow */
3120 +        _bfd_riscv_elf_generic_reloc, /* special_function */
3121 +        "R_RISCV_TLS_LDM",     /* name */
3122 +        TRUE,                  /* partial_inplace */
3123 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
3124 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
3125 +        FALSE),                /* pcrel_offset */
3126 +
3127 +  /* TLS local dynamic offset.  */
3128 +  HOWTO (R_RISCV_TLS_DTPREL_HI16,      /* type */
3129 +        0,                     /* rightshift */
3130 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
3131 +        RISCV_BIGIMM_BITS,                     /* bitsize */
3132 +        FALSE,                 /* pc_relative */
3133 +        OP_SH_BIGIMMEDIATE,    /* bitpos */
3134 +        complain_overflow_signed, /* complain_on_overflow */
3135 +        _bfd_riscv_elf_generic_reloc, /* special_function */
3136 +        "R_RISCV_TLS_DTPREL_HI16",     /* name */
3137 +        TRUE,                  /* partial_inplace */
3138 +        ((1<<RISCV_BIGIMM_BITS)-1) << OP_SH_BIGIMMEDIATE,      /* src_mask */
3139 +        ((1<<RISCV_BIGIMM_BITS)-1) << OP_SH_BIGIMMEDIATE,      /* dst_mask */
3140 +        FALSE),                /* pcrel_offset */
3141 +
3142 +  /* TLS local dynamic offset.  */
3143 +  HOWTO (R_RISCV_TLS_DTPREL_LO16,      /* type */
3144 +        0,                     /* rightshift */
3145 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
3146 +        RISCV_IMM_BITS,                        /* bitsize */
3147 +        FALSE,                 /* pc_relative */
3148 +        OP_SH_IMMEDIATE,       /* bitpos */
3149 +        complain_overflow_signed, /* complain_on_overflow */
3150 +        _bfd_riscv_elf_generic_reloc, /* special_function */
3151 +        "R_RISCV_TLS_DTPREL_LO16",     /* name */
3152 +        TRUE,                  /* partial_inplace */
3153 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
3154 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
3155 +        FALSE),                /* pcrel_offset */
3156 +
3157 +  /* TLS thread pointer offset.  */
3158 +  HOWTO (R_RISCV_TLS_GOTTPREL, /* type */
3159 +        0,                     /* rightshift */
3160 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */
3161 +        RISCV_IMM_BITS,                        /* bitsize */
3162 +        FALSE,                 /* pc_relative */
3163 +        OP_SH_IMMEDIATE,       /* bitpos */
3164 +        complain_overflow_signed, /* complain_on_overflow */
3165 +        _bfd_riscv_elf_generic_reloc, /* special_function */
3166 +        "R_RISCV_TLS_GOTTPREL",        /* name */
3167 +        TRUE,                  /* partial_inplace */
3168 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* src_mask */
3169 +        (RISCV_IMM_REACH-1) << OP_SH_IMMEDIATE,        /* dst_mask */
3170 +        FALSE),                /* pcrel_offset */
3171 +
3172 +  /* TLS IE dynamic relocations.  */
3173 +  EMPTY_HOWTO (R_RISCV_TLS_TPREL32),
3174 +
3175 +  HOWTO (R_RISCV_TLS_TPREL64,  /* type */
3176 +        0,                     /* rightshift */
3177 +        4,                     /* size (0 = byte, 1 = short, 2 = long) */
3178 +        64,                    /* bitsize */
3179 +        FALSE,                 /* pc_relative */
3180 +        0,                     /* bitpos */
3181 +        complain_overflow_dont, /* complain_on_overflow */
3182 +        _bfd_riscv_elf_generic_reloc, /* special_function */
3183 +        "R_RISCV_TLS_TPREL64", /* name */
3184 +        TRUE,                  /* partial_inplace */
3185 +        MINUS_ONE,             /* src_mask */
3186 +        MINUS_ONE,             /* dst_mask */
3187 +        FALSE),                /* pcrel_offset */
3188 +
3189 +  /* TLS thread pointer offset.  */
3190 +  HOWTO (R_RISCV_TLS_TPREL_HI16,       /* type */
3191 +        0,                     /* rightshift */
3192 +        2,                     /* size (0 = byte, 1 = short, 2 = long) */