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