xref: /netbsd-src/external/gpl3/binutils.old/dist/bfd/elf64-mips.c (revision d16b7486a53dcb8072b60ec6fcb4373a2d0c27b7)
1 /* MIPS-specific support for 64-bit ELF
2    Copyright (C) 1996-2020 Free Software Foundation, Inc.
3    Ian Lance Taylor, Cygnus Support
4    Linker support added by Mark Mitchell, CodeSourcery, LLC.
5    <mark@codesourcery.com>
6 
7    This file is part of BFD, the Binary File Descriptor library.
8 
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13 
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22    MA 02110-1301, USA.  */
23 
24 
25 /* This file supports the 64-bit MIPS ELF ABI.
26 
27    The MIPS 64-bit ELF ABI uses an unusual reloc format.  This file
28    overrides the usual ELF reloc handling, and handles reading and
29    writing the relocations here.  */
30 
31 /* TODO: Many things are unsupported, even if there is some code for it
32  .       (which was mostly stolen from elf32-mips.c and slightly adapted).
33  .
34  .   - Relocation handling for REL relocs is wrong in many cases and
35  .     generally untested.
36  .   - Relocation handling for RELA relocs related to GOT support are
37  .     also likely to be wrong.
38  .   - Support for MIPS16 is untested.
39  .   - Combined relocs with RSS_* entries are unsupported.
40  .   - The whole GOT handling for NewABI is missing, some parts of
41  .     the OldABI version is still lying around and should be removed.
42  */
43 
44 #include "sysdep.h"
45 #include "bfd.h"
46 #include "libbfd.h"
47 #include "aout/ar.h"
48 #include "bfdlink.h"
49 #include "genlink.h"
50 #include "elf-bfd.h"
51 #include "elfxx-mips.h"
52 #include "elf/mips.h"
53 
54 /* Get the ECOFF swapping routines.  The 64-bit ABI is not supposed to
55    use ECOFF.  However, we support it anyhow for an easier changeover.  */
56 #include "coff/sym.h"
57 #include "coff/symconst.h"
58 #include "coff/internal.h"
59 #include "coff/ecoff.h"
60 /* The 64 bit versions of the mdebug data structures are in alpha.h.  */
61 #include "coff/alpha.h"
62 #define ECOFF_SIGNED_64
63 #include "ecoffswap.h"
64 
65 static void mips_elf64_swap_reloc_in
66   (bfd *, const Elf64_Mips_External_Rel *, Elf64_Mips_Internal_Rela *);
67 static void mips_elf64_swap_reloca_in
68   (bfd *, const Elf64_Mips_External_Rela *, Elf64_Mips_Internal_Rela *);
69 static void mips_elf64_swap_reloc_out
70   (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rel *);
71 static void mips_elf64_swap_reloca_out
72   (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rela *);
73 static void mips_elf64_be_swap_reloc_in
74   (bfd *, const bfd_byte *, Elf_Internal_Rela *);
75 static void mips_elf64_be_swap_reloc_out
76   (bfd *, const Elf_Internal_Rela *, bfd_byte *);
77 static void mips_elf64_be_swap_reloca_in
78   (bfd *, const bfd_byte *, Elf_Internal_Rela *);
79 static void mips_elf64_be_swap_reloca_out
80   (bfd *, const Elf_Internal_Rela *, bfd_byte *);
81 static reloc_howto_type *bfd_elf64_bfd_reloc_type_lookup
82   (bfd *, bfd_reloc_code_real_type);
83 static bfd_boolean mips_elf64_info_to_howto_rela
84   (bfd *, arelent *, Elf_Internal_Rela *);
85 static long mips_elf64_get_dynamic_reloc_upper_bound
86   (bfd *);
87 static bfd_boolean mips_elf64_slurp_one_reloc_table
88   (bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type, arelent *,
89    asymbol **, bfd_boolean);
90 static bfd_boolean mips_elf64_slurp_reloc_table
91   (bfd *, asection *, asymbol **, bfd_boolean);
92 static void mips_elf64_write_relocs
93   (bfd *, asection *, void *);
94 static void mips_elf64_write_rel
95   (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
96 static void mips_elf64_write_rela
97   (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
98 static bfd_reloc_status_type mips_elf64_gprel16_reloc
99   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
100 static bfd_reloc_status_type mips_elf64_literal_reloc
101   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
102 static bfd_reloc_status_type mips_elf64_gprel32_reloc
103   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
104 static bfd_reloc_status_type mips_elf64_shift6_reloc
105   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
106 static bfd_reloc_status_type mips16_gprel_reloc
107   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
108 static bfd_boolean mips_elf64_assign_gp
109   (bfd *, bfd_vma *);
110 static bfd_reloc_status_type mips_elf64_final_gp
111   (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
112 static bfd_boolean mips_elf64_object_p
113   (bfd *);
114 static bfd_boolean mips_elf64_is_local_label_name
115   (bfd *, const char *);
116 static irix_compat_t elf64_mips_irix_compat
117   (bfd *);
118 static bfd_boolean elf64_mips_grok_prstatus
119   (bfd *, Elf_Internal_Note *);
120 static bfd_boolean elf64_mips_grok_psinfo
121   (bfd *, Elf_Internal_Note *);
122 
123 extern const bfd_target mips_elf64_be_vec;
124 extern const bfd_target mips_elf64_le_vec;
125 
126 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
127    from smaller values.  Start with zero, widen, *then* decrement.  */
128 #define MINUS_ONE	(((bfd_vma)0) - 1)
129 
130 /* The number of local .got entries we reserve.  */
131 #define MIPS_RESERVED_GOTNO (2)
132 
133 /* The relocation table used for SHT_REL sections.  */
134 
135 static reloc_howto_type mips_elf64_howto_table_rel[] =
136 {
137   /* No relocation.  */
138   HOWTO (R_MIPS_NONE,		/* type */
139 	 0,			/* rightshift */
140 	 3,			/* size (0 = byte, 1 = short, 2 = long) */
141 	 0,			/* bitsize */
142 	 FALSE,			/* pc_relative */
143 	 0,			/* bitpos */
144 	 complain_overflow_dont, /* complain_on_overflow */
145 	 _bfd_mips_elf_generic_reloc,	/* special_function */
146 	 "R_MIPS_NONE",		/* name */
147 	 FALSE,			/* partial_inplace */
148 	 0,			/* src_mask */
149 	 0,			/* dst_mask */
150 	 FALSE),		/* pcrel_offset */
151 
152   /* 16 bit relocation.  */
153   HOWTO (R_MIPS_16,		/* type */
154 	 0,			/* rightshift */
155 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
156 	 16,			/* bitsize */
157 	 FALSE,			/* pc_relative */
158 	 0,			/* bitpos */
159 	 complain_overflow_signed, /* complain_on_overflow */
160 	 _bfd_mips_elf_generic_reloc,	/* special_function */
161 	 "R_MIPS_16",		/* name */
162 	 TRUE,			/* partial_inplace */
163 	 0x0000ffff,		/* src_mask */
164 	 0x0000ffff,		/* dst_mask */
165 	 FALSE),		/* pcrel_offset */
166 
167   /* 32 bit relocation.  */
168   HOWTO (R_MIPS_32,		/* type */
169 	 0,			/* rightshift */
170 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
171 	 32,			/* bitsize */
172 	 FALSE,			/* pc_relative */
173 	 0,			/* bitpos */
174 	 complain_overflow_dont, /* complain_on_overflow */
175 	 _bfd_mips_elf_generic_reloc,	/* special_function */
176 	 "R_MIPS_32",		/* name */
177 	 TRUE,			/* partial_inplace */
178 	 0xffffffff,		/* src_mask */
179 	 0xffffffff,		/* dst_mask */
180 	 FALSE),		/* pcrel_offset */
181 
182   /* 32 bit symbol relative relocation.  */
183   HOWTO (R_MIPS_REL32,		/* type */
184 	 0,			/* rightshift */
185 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
186 	 32,			/* bitsize */
187 	 FALSE,			/* pc_relative */
188 	 0,			/* bitpos */
189 	 complain_overflow_dont, /* complain_on_overflow */
190 	 _bfd_mips_elf_generic_reloc,	/* special_function */
191 	 "R_MIPS_REL32",	/* name */
192 	 TRUE,			/* partial_inplace */
193 	 0xffffffff,		/* src_mask */
194 	 0xffffffff,		/* dst_mask */
195 	 FALSE),		/* pcrel_offset */
196 
197   /* 26 bit jump address.  */
198   HOWTO (R_MIPS_26,		/* type */
199 	 2,			/* rightshift */
200 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
201 	 26,			/* bitsize */
202 	 FALSE,			/* pc_relative */
203 	 0,			/* bitpos */
204 	 complain_overflow_dont, /* complain_on_overflow */
205 				/* This needs complex overflow
206 				   detection, because the upper 36
207 				   bits must match the PC + 4.  */
208 	 _bfd_mips_elf_generic_reloc,	/* special_function */
209 	 "R_MIPS_26",		/* name */
210 	 TRUE,			/* partial_inplace */
211 	 0x03ffffff,		/* src_mask */
212 	 0x03ffffff,		/* dst_mask */
213 	 FALSE),		/* pcrel_offset */
214 
215   /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL.
216      However, the native IRIX6 tools use them, so we try our best. */
217 
218   /* High 16 bits of symbol value.  */
219   HOWTO (R_MIPS_HI16,		/* type */
220 	 16,			/* rightshift */
221 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
222 	 16,			/* bitsize */
223 	 FALSE,			/* pc_relative */
224 	 0,			/* bitpos */
225 	 complain_overflow_dont, /* complain_on_overflow */
226 	 _bfd_mips_elf_hi16_reloc, /* special_function */
227 	 "R_MIPS_HI16",		/* name */
228 	 TRUE,			/* partial_inplace */
229 	 0x0000ffff,		/* src_mask */
230 	 0x0000ffff,		/* dst_mask */
231 	 FALSE),		/* pcrel_offset */
232 
233   /* Low 16 bits of symbol value.  */
234   HOWTO (R_MIPS_LO16,		/* type */
235 	 0,			/* rightshift */
236 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
237 	 16,			/* bitsize */
238 	 FALSE,			/* pc_relative */
239 	 0,			/* bitpos */
240 	 complain_overflow_dont, /* complain_on_overflow */
241 	 _bfd_mips_elf_lo16_reloc, /* special_function */
242 	 "R_MIPS_LO16",		/* name */
243 	 TRUE,			/* partial_inplace */
244 	 0x0000ffff,		/* src_mask */
245 	 0x0000ffff,		/* dst_mask */
246 	 FALSE),		/* pcrel_offset */
247 
248   /* GP relative reference.  */
249   HOWTO (R_MIPS_GPREL16,	/* type */
250 	 0,			/* rightshift */
251 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
252 	 16,			/* bitsize */
253 	 FALSE,			/* pc_relative */
254 	 0,			/* bitpos */
255 	 complain_overflow_signed, /* complain_on_overflow */
256 	 mips_elf64_gprel16_reloc, /* special_function */
257 	 "R_MIPS_GPREL16",	/* name */
258 	 TRUE,			/* partial_inplace */
259 	 0x0000ffff,		/* src_mask */
260 	 0x0000ffff,		/* dst_mask */
261 	 FALSE),		/* pcrel_offset */
262 
263   /* Reference to literal section.  */
264   HOWTO (R_MIPS_LITERAL,	/* type */
265 	 0,			/* rightshift */
266 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
267 	 16,			/* bitsize */
268 	 FALSE,			/* pc_relative */
269 	 0,			/* bitpos */
270 	 complain_overflow_signed, /* complain_on_overflow */
271 	 mips_elf64_literal_reloc, /* special_function */
272 	 "R_MIPS_LITERAL",	/* name */
273 	 TRUE,			/* partial_inplace */
274 	 0x0000ffff,		/* src_mask */
275 	 0x0000ffff,		/* dst_mask */
276 	 FALSE),		/* pcrel_offset */
277 
278   /* Reference to global offset table.  */
279   HOWTO (R_MIPS_GOT16,		/* type */
280 	 0,			/* rightshift */
281 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
282 	 16,			/* bitsize */
283 	 FALSE,			/* pc_relative */
284 	 0,			/* bitpos */
285 	 complain_overflow_signed, /* complain_on_overflow */
286 	 _bfd_mips_elf_got16_reloc, /* special_function */
287 	 "R_MIPS_GOT16",	/* name */
288 	 TRUE,			/* partial_inplace */
289 	 0x0000ffff,		/* src_mask */
290 	 0x0000ffff,		/* dst_mask */
291 	 FALSE),		/* pcrel_offset */
292 
293   /* 16 bit PC relative reference.  Note that the ABI document has a typo
294      and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
295      We do the right thing here.  */
296   HOWTO (R_MIPS_PC16,		/* type */
297 	 2,			/* rightshift */
298 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
299 	 16,			/* bitsize */
300 	 TRUE,			/* pc_relative */
301 	 0,			/* bitpos */
302 	 complain_overflow_signed, /* complain_on_overflow */
303 	 _bfd_mips_elf_generic_reloc,	/* special_function */
304 	 "R_MIPS_PC16",		/* name */
305 	 TRUE,			/* partial_inplace */
306 	 0x0000ffff,		/* src_mask */
307 	 0x0000ffff,		/* dst_mask */
308 	 TRUE),			/* pcrel_offset */
309 
310   /* 16 bit call through global offset table.  */
311   HOWTO (R_MIPS_CALL16,		/* type */
312 	 0,			/* rightshift */
313 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
314 	 16,			/* bitsize */
315 	 FALSE,			/* pc_relative */
316 	 0,			/* bitpos */
317 	 complain_overflow_signed, /* complain_on_overflow */
318 	 _bfd_mips_elf_generic_reloc,	/* special_function */
319 	 "R_MIPS_CALL16",	/* name */
320 	 TRUE,			/* partial_inplace */
321 	 0x0000ffff,		/* src_mask */
322 	 0x0000ffff,		/* dst_mask */
323 	 FALSE),		/* pcrel_offset */
324 
325   /* 32 bit GP relative reference.  */
326   HOWTO (R_MIPS_GPREL32,	/* type */
327 	 0,			/* rightshift */
328 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
329 	 32,			/* bitsize */
330 	 FALSE,			/* pc_relative */
331 	 0,			/* bitpos */
332 	 complain_overflow_dont, /* complain_on_overflow */
333 	 mips_elf64_gprel32_reloc, /* special_function */
334 	 "R_MIPS_GPREL32",	/* name */
335 	 TRUE,			/* partial_inplace */
336 	 0xffffffff,		/* src_mask */
337 	 0xffffffff,		/* dst_mask */
338 	 FALSE),		/* pcrel_offset */
339 
340   EMPTY_HOWTO (13),
341   EMPTY_HOWTO (14),
342   EMPTY_HOWTO (15),
343 
344   /* A 5 bit shift field.  */
345   HOWTO (R_MIPS_SHIFT5,		/* type */
346 	 0,			/* rightshift */
347 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
348 	 5,			/* bitsize */
349 	 FALSE,			/* pc_relative */
350 	 6,			/* bitpos */
351 	 complain_overflow_bitfield, /* complain_on_overflow */
352 	 _bfd_mips_elf_generic_reloc,	/* special_function */
353 	 "R_MIPS_SHIFT5",	/* name */
354 	 TRUE,			/* partial_inplace */
355 	 0x000007c0,		/* src_mask */
356 	 0x000007c0,		/* dst_mask */
357 	 FALSE),		/* pcrel_offset */
358 
359   /* A 6 bit shift field.  */
360   HOWTO (R_MIPS_SHIFT6,		/* type */
361 	 0,			/* rightshift */
362 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
363 	 6,			/* bitsize */
364 	 FALSE,			/* pc_relative */
365 	 6,			/* bitpos */
366 	 complain_overflow_bitfield, /* complain_on_overflow */
367 	 mips_elf64_shift6_reloc, /* special_function */
368 	 "R_MIPS_SHIFT6",	/* name */
369 	 TRUE,			/* partial_inplace */
370 	 0x000007c4,		/* src_mask */
371 	 0x000007c4,		/* dst_mask */
372 	 FALSE),		/* pcrel_offset */
373 
374   /* 64 bit relocation.  */
375   HOWTO (R_MIPS_64,		/* type */
376 	 0,			/* rightshift */
377 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
378 	 64,			/* bitsize */
379 	 FALSE,			/* pc_relative */
380 	 0,			/* bitpos */
381 	 complain_overflow_dont, /* complain_on_overflow */
382 	 _bfd_mips_elf_generic_reloc,	/* special_function */
383 	 "R_MIPS_64",		/* name */
384 	 TRUE,			/* partial_inplace */
385 	 MINUS_ONE,		/* src_mask */
386 	 MINUS_ONE,		/* dst_mask */
387 	 FALSE),		/* pcrel_offset */
388 
389   /* Displacement in the global offset table.  */
390   HOWTO (R_MIPS_GOT_DISP,	/* type */
391 	 0,			/* rightshift */
392 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
393 	 16,			/* bitsize */
394 	 FALSE,			/* pc_relative */
395 	 0,			/* bitpos */
396 	 complain_overflow_signed, /* complain_on_overflow */
397 	 _bfd_mips_elf_generic_reloc,	/* special_function */
398 	 "R_MIPS_GOT_DISP",	/* name */
399 	 TRUE,			/* partial_inplace */
400 	 0x0000ffff,		/* src_mask */
401 	 0x0000ffff,		/* dst_mask */
402 	 FALSE),		/* pcrel_offset */
403 
404   /* Displacement to page pointer in the global offset table.  */
405   HOWTO (R_MIPS_GOT_PAGE,	/* type */
406 	 0,			/* rightshift */
407 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
408 	 16,			/* bitsize */
409 	 FALSE,			/* pc_relative */
410 	 0,			/* bitpos */
411 	 complain_overflow_signed, /* complain_on_overflow */
412 	 _bfd_mips_elf_generic_reloc,	/* special_function */
413 	 "R_MIPS_GOT_PAGE",	/* name */
414 	 TRUE,			/* partial_inplace */
415 	 0x0000ffff,		/* src_mask */
416 	 0x0000ffff,		/* dst_mask */
417 	 FALSE),		/* pcrel_offset */
418 
419   /* Offset from page pointer in the global offset table.  */
420   HOWTO (R_MIPS_GOT_OFST,	/* type */
421 	 0,			/* rightshift */
422 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
423 	 16,			/* bitsize */
424 	 FALSE,			/* pc_relative */
425 	 0,			/* bitpos */
426 	 complain_overflow_signed, /* complain_on_overflow */
427 	 _bfd_mips_elf_generic_reloc,	/* special_function */
428 	 "R_MIPS_GOT_OFST",	/* name */
429 	 TRUE,			/* partial_inplace */
430 	 0x0000ffff,		/* src_mask */
431 	 0x0000ffff,		/* dst_mask */
432 	 FALSE),		/* pcrel_offset */
433 
434   /* High 16 bits of displacement in global offset table.  */
435   HOWTO (R_MIPS_GOT_HI16,	/* type */
436 	 0,			/* rightshift */
437 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
438 	 16,			/* bitsize */
439 	 FALSE,			/* pc_relative */
440 	 0,			/* bitpos */
441 	 complain_overflow_dont, /* complain_on_overflow */
442 	 _bfd_mips_elf_generic_reloc,	/* special_function */
443 	 "R_MIPS_GOT_HI16",	/* name */
444 	 TRUE,			/* partial_inplace */
445 	 0x0000ffff,		/* src_mask */
446 	 0x0000ffff,		/* dst_mask */
447 	 FALSE),		/* pcrel_offset */
448 
449   /* Low 16 bits of displacement in global offset table.  */
450   HOWTO (R_MIPS_GOT_LO16,	/* type */
451 	 0,			/* rightshift */
452 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
453 	 16,			/* bitsize */
454 	 FALSE,			/* pc_relative */
455 	 0,			/* bitpos */
456 	 complain_overflow_dont, /* complain_on_overflow */
457 	 _bfd_mips_elf_generic_reloc,	/* special_function */
458 	 "R_MIPS_GOT_LO16",	/* name */
459 	 TRUE,			/* partial_inplace */
460 	 0x0000ffff,		/* src_mask */
461 	 0x0000ffff,		/* dst_mask */
462 	 FALSE),		/* pcrel_offset */
463 
464   /* 64 bit subtraction.  */
465   HOWTO (R_MIPS_SUB,		/* type */
466 	 0,			/* rightshift */
467 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
468 	 64,			/* bitsize */
469 	 FALSE,			/* pc_relative */
470 	 0,			/* bitpos */
471 	 complain_overflow_dont, /* complain_on_overflow */
472 	 _bfd_mips_elf_generic_reloc,	/* special_function */
473 	 "R_MIPS_SUB",		/* name */
474 	 TRUE,			/* partial_inplace */
475 	 MINUS_ONE,		/* src_mask */
476 	 MINUS_ONE,		/* dst_mask */
477 	 FALSE),		/* pcrel_offset */
478 
479   /* Insert the addend as an instruction.  */
480   /* FIXME: Not handled correctly.  */
481   HOWTO (R_MIPS_INSERT_A,	/* type */
482 	 0,			/* rightshift */
483 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
484 	 32,			/* bitsize */
485 	 FALSE,			/* pc_relative */
486 	 0,			/* bitpos */
487 	 complain_overflow_dont, /* complain_on_overflow */
488 	 _bfd_mips_elf_generic_reloc,	/* special_function */
489 	 "R_MIPS_INSERT_A",	/* name */
490 	 TRUE,			/* partial_inplace */
491 	 0xffffffff,		/* src_mask */
492 	 0xffffffff,		/* dst_mask */
493 	 FALSE),		/* pcrel_offset */
494 
495   /* Insert the addend as an instruction, and change all relocations
496      to refer to the old instruction at the address.  */
497   /* FIXME: Not handled correctly.  */
498   HOWTO (R_MIPS_INSERT_B,	/* type */
499 	 0,			/* rightshift */
500 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
501 	 32,			/* bitsize */
502 	 FALSE,			/* pc_relative */
503 	 0,			/* bitpos */
504 	 complain_overflow_dont, /* complain_on_overflow */
505 	 _bfd_mips_elf_generic_reloc,	/* special_function */
506 	 "R_MIPS_INSERT_B",	/* name */
507 	 TRUE,			/* partial_inplace */
508 	 0xffffffff,		/* src_mask */
509 	 0xffffffff,		/* dst_mask */
510 	 FALSE),		/* pcrel_offset */
511 
512   /* Delete a 32 bit instruction.  */
513   /* FIXME: Not handled correctly.  */
514   HOWTO (R_MIPS_DELETE,		/* type */
515 	 0,			/* rightshift */
516 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
517 	 32,			/* bitsize */
518 	 FALSE,			/* pc_relative */
519 	 0,			/* bitpos */
520 	 complain_overflow_dont, /* complain_on_overflow */
521 	 _bfd_mips_elf_generic_reloc,	/* special_function */
522 	 "R_MIPS_DELETE",	/* name */
523 	 TRUE,			/* partial_inplace */
524 	 0xffffffff,		/* src_mask */
525 	 0xffffffff,		/* dst_mask */
526 	 FALSE),		/* pcrel_offset */
527 
528   /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
529      We don't, because
530        a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/
531 	  R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using
532 	  fallable heuristics.
533        b) No other NewABI toolchain actually emits such relocations.  */
534   EMPTY_HOWTO (R_MIPS_HIGHER),
535   EMPTY_HOWTO (R_MIPS_HIGHEST),
536 
537   /* High 16 bits of displacement in global offset table.  */
538   HOWTO (R_MIPS_CALL_HI16,	/* type */
539 	 0,			/* rightshift */
540 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
541 	 16,			/* bitsize */
542 	 FALSE,			/* pc_relative */
543 	 0,			/* bitpos */
544 	 complain_overflow_dont, /* complain_on_overflow */
545 	 _bfd_mips_elf_generic_reloc,	/* special_function */
546 	 "R_MIPS_CALL_HI16",	/* name */
547 	 TRUE,			/* partial_inplace */
548 	 0x0000ffff,		/* src_mask */
549 	 0x0000ffff,		/* dst_mask */
550 	 FALSE),		/* pcrel_offset */
551 
552   /* Low 16 bits of displacement in global offset table.  */
553   HOWTO (R_MIPS_CALL_LO16,	/* type */
554 	 0,			/* rightshift */
555 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
556 	 16,			/* bitsize */
557 	 FALSE,			/* pc_relative */
558 	 0,			/* bitpos */
559 	 complain_overflow_dont, /* complain_on_overflow */
560 	 _bfd_mips_elf_generic_reloc,	/* special_function */
561 	 "R_MIPS_CALL_LO16",	/* name */
562 	 TRUE,			/* partial_inplace */
563 	 0x0000ffff,		/* src_mask */
564 	 0x0000ffff,		/* dst_mask */
565 	 FALSE),		/* pcrel_offset */
566 
567   /* Section displacement, used by an associated event location section.  */
568   HOWTO (R_MIPS_SCN_DISP,	/* type */
569 	 0,			/* rightshift */
570 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
571 	 32,			/* bitsize */
572 	 FALSE,			/* pc_relative */
573 	 0,			/* bitpos */
574 	 complain_overflow_dont, /* complain_on_overflow */
575 	 _bfd_mips_elf_generic_reloc,	/* special_function */
576 	 "R_MIPS_SCN_DISP",	/* name */
577 	 TRUE,			/* partial_inplace */
578 	 0xffffffff,		/* src_mask */
579 	 0xffffffff,		/* dst_mask */
580 	 FALSE),		/* pcrel_offset */
581 
582   HOWTO (R_MIPS_REL16,		/* type */
583 	 0,			/* rightshift */
584 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
585 	 16,			/* bitsize */
586 	 FALSE,			/* pc_relative */
587 	 0,			/* bitpos */
588 	 complain_overflow_signed, /* complain_on_overflow */
589 	 _bfd_mips_elf_generic_reloc,	/* special_function */
590 	 "R_MIPS_REL16",	/* name */
591 	 TRUE,			/* partial_inplace */
592 	 0xffff,		/* src_mask */
593 	 0xffff,		/* dst_mask */
594 	 FALSE),		/* pcrel_offset */
595 
596   /* These two are obsolete.  */
597   EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
598   EMPTY_HOWTO (R_MIPS_PJUMP),
599 
600   /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
601      It must be used for multigot GOT's (and only there).  */
602   HOWTO (R_MIPS_RELGOT,		/* type */
603 	 0,			/* rightshift */
604 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
605 	 32,			/* bitsize */
606 	 FALSE,			/* pc_relative */
607 	 0,			/* bitpos */
608 	 complain_overflow_dont, /* complain_on_overflow */
609 	 _bfd_mips_elf_generic_reloc,	/* special_function */
610 	 "R_MIPS_RELGOT",	/* name */
611 	 TRUE,			/* partial_inplace */
612 	 0xffffffff,		/* src_mask */
613 	 0xffffffff,		/* dst_mask */
614 	 FALSE),		/* pcrel_offset */
615 
616   /* Protected jump conversion.  This is an optimization hint.  No
617      relocation is required for correctness.  */
618   HOWTO (R_MIPS_JALR,		/* type */
619 	 0,			/* rightshift */
620 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
621 	 32,			/* bitsize */
622 	 FALSE,			/* pc_relative */
623 	 0,			/* bitpos */
624 	 complain_overflow_dont, /* complain_on_overflow */
625 	 _bfd_mips_elf_generic_reloc,	/* special_function */
626 	 "R_MIPS_JALR",		/* name */
627 	 FALSE,			/* partial_inplace */
628 	 0,			/* src_mask */
629 	 0x00000000,		/* dst_mask */
630 	 FALSE),		/* pcrel_offset */
631 
632   /* TLS relocations.  */
633   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
634   EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
635 
636   HOWTO (R_MIPS_TLS_DTPMOD64,	/* type */
637 	 0,			/* rightshift */
638 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
639 	 64,			/* bitsize */
640 	 FALSE,			/* pc_relative */
641 	 0,			/* bitpos */
642 	 complain_overflow_dont, /* complain_on_overflow */
643 	 _bfd_mips_elf_generic_reloc, /* special_function */
644 	 "R_MIPS_TLS_DTPMOD64",	/* name */
645 	 TRUE,			/* partial_inplace */
646 	 MINUS_ONE,		/* src_mask */
647 	 MINUS_ONE,		/* dst_mask */
648 	 FALSE),		/* pcrel_offset */
649 
650   HOWTO (R_MIPS_TLS_DTPREL64,	/* type */
651 	 0,			/* rightshift */
652 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
653 	 64,			/* bitsize */
654 	 FALSE,			/* pc_relative */
655 	 0,			/* bitpos */
656 	 complain_overflow_dont, /* complain_on_overflow */
657 	 _bfd_mips_elf_generic_reloc, /* special_function */
658 	 "R_MIPS_TLS_DTPREL64",	/* name */
659 	 TRUE,			/* partial_inplace */
660 	 MINUS_ONE,		/* src_mask */
661 	 MINUS_ONE,		/* dst_mask */
662 	 FALSE),		/* pcrel_offset */
663 
664   /* TLS general dynamic variable reference.  */
665   HOWTO (R_MIPS_TLS_GD,		/* type */
666 	 0,			/* rightshift */
667 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
668 	 16,			/* bitsize */
669 	 FALSE,			/* pc_relative */
670 	 0,			/* bitpos */
671 	 complain_overflow_signed, /* complain_on_overflow */
672 	 _bfd_mips_elf_generic_reloc, /* special_function */
673 	 "R_MIPS_TLS_GD",	/* name */
674 	 TRUE,			/* partial_inplace */
675 	 0x0000ffff,		/* src_mask */
676 	 0x0000ffff,		/* dst_mask */
677 	 FALSE),		/* pcrel_offset */
678 
679   /* TLS local dynamic variable reference.  */
680   HOWTO (R_MIPS_TLS_LDM,	/* type */
681 	 0,			/* rightshift */
682 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
683 	 16,			/* bitsize */
684 	 FALSE,			/* pc_relative */
685 	 0,			/* bitpos */
686 	 complain_overflow_signed, /* complain_on_overflow */
687 	 _bfd_mips_elf_generic_reloc, /* special_function */
688 	 "R_MIPS_TLS_LDM",	/* name */
689 	 TRUE,			/* partial_inplace */
690 	 0x0000ffff,		/* src_mask */
691 	 0x0000ffff,		/* dst_mask */
692 	 FALSE),		/* pcrel_offset */
693 
694   /* TLS local dynamic offset.  */
695   HOWTO (R_MIPS_TLS_DTPREL_HI16,	/* type */
696 	 0,			/* rightshift */
697 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
698 	 16,			/* bitsize */
699 	 FALSE,			/* pc_relative */
700 	 0,			/* bitpos */
701 	 complain_overflow_signed, /* complain_on_overflow */
702 	 _bfd_mips_elf_generic_reloc, /* special_function */
703 	 "R_MIPS_TLS_DTPREL_HI16",	/* name */
704 	 TRUE,			/* partial_inplace */
705 	 0x0000ffff,		/* src_mask */
706 	 0x0000ffff,		/* dst_mask */
707 	 FALSE),		/* pcrel_offset */
708 
709   /* TLS local dynamic offset.  */
710   HOWTO (R_MIPS_TLS_DTPREL_LO16,	/* type */
711 	 0,			/* rightshift */
712 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
713 	 16,			/* bitsize */
714 	 FALSE,			/* pc_relative */
715 	 0,			/* bitpos */
716 	 complain_overflow_signed, /* complain_on_overflow */
717 	 _bfd_mips_elf_generic_reloc, /* special_function */
718 	 "R_MIPS_TLS_DTPREL_LO16",	/* name */
719 	 TRUE,			/* partial_inplace */
720 	 0x0000ffff,		/* src_mask */
721 	 0x0000ffff,		/* dst_mask */
722 	 FALSE),		/* pcrel_offset */
723 
724   /* TLS thread pointer offset.  */
725   HOWTO (R_MIPS_TLS_GOTTPREL,	/* type */
726 	 0,			/* rightshift */
727 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
728 	 16,			/* bitsize */
729 	 FALSE,			/* pc_relative */
730 	 0,			/* bitpos */
731 	 complain_overflow_signed, /* complain_on_overflow */
732 	 _bfd_mips_elf_generic_reloc, /* special_function */
733 	 "R_MIPS_TLS_GOTTPREL",	/* name */
734 	 TRUE,			/* partial_inplace */
735 	 0x0000ffff,		/* src_mask */
736 	 0x0000ffff,		/* dst_mask */
737 	 FALSE),		/* pcrel_offset */
738 
739   /* TLS IE dynamic relocations.  */
740   EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
741 
742   HOWTO (R_MIPS_TLS_TPREL64,	/* type */
743 	 0,			/* rightshift */
744 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
745 	 64,			/* bitsize */
746 	 FALSE,			/* pc_relative */
747 	 0,			/* bitpos */
748 	 complain_overflow_dont, /* complain_on_overflow */
749 	 _bfd_mips_elf_generic_reloc, /* special_function */
750 	 "R_MIPS_TLS_TPREL64",	/* name */
751 	 TRUE,			/* partial_inplace */
752 	 MINUS_ONE,		/* src_mask */
753 	 MINUS_ONE,		/* dst_mask */
754 	 FALSE),		/* pcrel_offset */
755 
756   /* TLS thread pointer offset.  */
757   HOWTO (R_MIPS_TLS_TPREL_HI16,	/* type */
758 	 0,			/* rightshift */
759 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
760 	 16,			/* bitsize */
761 	 FALSE,			/* pc_relative */
762 	 0,			/* bitpos */
763 	 complain_overflow_signed, /* complain_on_overflow */
764 	 _bfd_mips_elf_generic_reloc, /* special_function */
765 	 "R_MIPS_TLS_TPREL_HI16", /* name */
766 	 TRUE,			/* partial_inplace */
767 	 0x0000ffff,		/* src_mask */
768 	 0x0000ffff,		/* dst_mask */
769 	 FALSE),		/* pcrel_offset */
770 
771   /* TLS thread pointer offset.  */
772   HOWTO (R_MIPS_TLS_TPREL_LO16,	/* type */
773 	 0,			/* rightshift */
774 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
775 	 16,			/* bitsize */
776 	 FALSE,			/* pc_relative */
777 	 0,			/* bitpos */
778 	 complain_overflow_signed, /* complain_on_overflow */
779 	 _bfd_mips_elf_generic_reloc, /* special_function */
780 	 "R_MIPS_TLS_TPREL_LO16", /* name */
781 	 TRUE,			/* partial_inplace */
782 	 0x0000ffff,		/* src_mask */
783 	 0x0000ffff,		/* dst_mask */
784 	 FALSE),		/* pcrel_offset */
785 
786   /* 32 bit relocation with no addend.  */
787   HOWTO (R_MIPS_GLOB_DAT,	/* type */
788 	 0,			/* rightshift */
789 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
790 	 32,			/* bitsize */
791 	 FALSE,			/* pc_relative */
792 	 0,			/* bitpos */
793 	 complain_overflow_dont, /* complain_on_overflow */
794 	 _bfd_mips_elf_generic_reloc, /* special_function */
795 	 "R_MIPS_GLOB_DAT",	/* name */
796 	 FALSE,			/* partial_inplace */
797 	 0x0,			/* src_mask */
798 	 0xffffffff,		/* dst_mask */
799 	 FALSE),		/* pcrel_offset */
800 
801   EMPTY_HOWTO (52),
802   EMPTY_HOWTO (53),
803   EMPTY_HOWTO (54),
804   EMPTY_HOWTO (55),
805   EMPTY_HOWTO (56),
806   EMPTY_HOWTO (57),
807   EMPTY_HOWTO (58),
808   EMPTY_HOWTO (59),
809 
810   HOWTO (R_MIPS_PC21_S2,	/* type */
811 	 2,			/* rightshift */
812 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
813 	 21,			/* bitsize */
814 	 TRUE,			/* pc_relative */
815 	 0,			/* bitpos */
816 	 complain_overflow_signed, /* complain_on_overflow */
817 	 _bfd_mips_elf_generic_reloc, /* special_function */
818 	 "R_MIPS_PC21_S2",	/* name */
819 	 TRUE,			/* partial_inplace */
820 	 0x001fffff,		/* src_mask */
821 	 0x001fffff,		/* dst_mask */
822 	 TRUE),			/* pcrel_offset */
823 
824   HOWTO (R_MIPS_PC26_S2,	/* type */
825 	 2,			/* rightshift */
826 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
827 	 26,			/* bitsize */
828 	 TRUE,			/* pc_relative */
829 	 0,			/* bitpos */
830 	 complain_overflow_signed, /* complain_on_overflow */
831 	 _bfd_mips_elf_generic_reloc, /* special_function */
832 	 "R_MIPS_PC26_S2",	/* name */
833 	 TRUE,			/* partial_inplace */
834 	 0x03ffffff,		/* src_mask */
835 	 0x03ffffff,		/* dst_mask */
836 	 TRUE),			/* pcrel_offset */
837 
838   HOWTO (R_MIPS_PC18_S3,	/* type */
839 	 3,			/* rightshift */
840 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
841 	 18,			/* bitsize */
842 	 TRUE,			/* pc_relative */
843 	 0,			/* bitpos */
844 	 complain_overflow_signed, /* complain_on_overflow */
845 	 _bfd_mips_elf_generic_reloc,   /* special_function */
846 	 "R_MIPS_PC18_S3",	/* name */
847 	 TRUE,			/* partial_inplace */
848 	 0x0003ffff,		/* src_mask */
849 	 0x0003ffff,		/* dst_mask */
850 	 TRUE),			/* pcrel_offset */
851 
852   HOWTO (R_MIPS_PC19_S2,	/* type */
853 	 2,			/* rightshift */
854 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
855 	 19,			/* bitsize */
856 	 TRUE,			/* pc_relative */
857 	 0,			/* bitpos */
858 	 complain_overflow_signed, /* complain_on_overflow */
859 	 _bfd_mips_elf_generic_reloc,   /* special_function */
860 	 "R_MIPS_PC19_S2",	/* name */
861 	 TRUE,			/* partial_inplace */
862 	 0x0007ffff,		/* src_mask */
863 	 0x0007ffff,		/* dst_mask */
864 	 TRUE),			/* pcrel_offset */
865 
866   HOWTO (R_MIPS_PCHI16,		/* type */
867 	 16,			/* rightshift */
868 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
869 	 16,			/* bitsize */
870 	 TRUE,			/* pc_relative */
871 	 0,			/* bitpos */
872 	 complain_overflow_signed, /* complain_on_overflow */
873 	 _bfd_mips_elf_generic_reloc,   /* special_function */
874 	 "R_MIPS_PCHI16",	/* name */
875 	 TRUE,			/* partial_inplace */
876 	 0x0000ffff,		/* src_mask */
877 	 0x0000ffff,		/* dst_mask */
878 	 TRUE),			/* pcrel_offset */
879 
880   HOWTO (R_MIPS_PCLO16,		/* type */
881 	 0,			/* rightshift */
882 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
883 	 16,			/* bitsize */
884 	 TRUE,			/* pc_relative */
885 	 0,			/* bitpos */
886 	 complain_overflow_dont, /* complain_on_overflow */
887 	 _bfd_mips_elf_generic_reloc,   /* special_function */
888 	 "R_MIPS_PCLO16",	/* name */
889 	 TRUE,			/* partial_inplace */
890 	 0x0000ffff,		/* src_mask */
891 	 0x0000ffff,		/* dst_mask */
892 	 TRUE),			/* pcrel_offset */
893 
894 };
895 
896 /* The relocation table used for SHT_RELA sections.  */
897 
898 static reloc_howto_type mips_elf64_howto_table_rela[] =
899 {
900   /* No relocation.  */
901   HOWTO (R_MIPS_NONE,		/* type */
902 	 0,			/* rightshift */
903 	 3,			/* size (0 = byte, 1 = short, 2 = long) */
904 	 0,			/* bitsize */
905 	 FALSE,			/* pc_relative */
906 	 0,			/* bitpos */
907 	 complain_overflow_dont, /* complain_on_overflow */
908 	 _bfd_mips_elf_generic_reloc,	/* special_function */
909 	 "R_MIPS_NONE",		/* name */
910 	 FALSE,			/* partial_inplace */
911 	 0,			/* src_mask */
912 	 0,			/* dst_mask */
913 	 FALSE),		/* pcrel_offset */
914 
915   /* 16 bit relocation.  */
916   HOWTO (R_MIPS_16,		/* type */
917 	 0,			/* rightshift */
918 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
919 	 16,			/* bitsize */
920 	 FALSE,			/* pc_relative */
921 	 0,			/* bitpos */
922 	 complain_overflow_signed, /* complain_on_overflow */
923 	 _bfd_mips_elf_generic_reloc,	/* special_function */
924 	 "R_MIPS_16",		/* name */
925 	 FALSE,			/* partial_inplace */
926 	 0,			/* src_mask */
927 	 0x0000ffff,		/* dst_mask */
928 	 FALSE),		/* pcrel_offset */
929 
930   /* 32 bit relocation.  */
931   HOWTO (R_MIPS_32,		/* type */
932 	 0,			/* rightshift */
933 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
934 	 32,			/* bitsize */
935 	 FALSE,			/* pc_relative */
936 	 0,			/* bitpos */
937 	 complain_overflow_dont, /* complain_on_overflow */
938 	 _bfd_mips_elf_generic_reloc,	/* special_function */
939 	 "R_MIPS_32",		/* name */
940 	 FALSE,			/* partial_inplace */
941 	 0,			/* src_mask */
942 	 0xffffffff,		/* dst_mask */
943 	 FALSE),		/* pcrel_offset */
944 
945   /* 32 bit symbol relative relocation.  */
946   HOWTO (R_MIPS_REL32,		/* type */
947 	 0,			/* rightshift */
948 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
949 	 32,			/* bitsize */
950 	 FALSE,			/* pc_relative */
951 	 0,			/* bitpos */
952 	 complain_overflow_dont, /* complain_on_overflow */
953 	 _bfd_mips_elf_generic_reloc,	/* special_function */
954 	 "R_MIPS_REL32",	/* name */
955 	 FALSE,			/* partial_inplace */
956 	 0,			/* src_mask */
957 	 0xffffffff,		/* dst_mask */
958 	 FALSE),		/* pcrel_offset */
959 
960   /* 26 bit jump address.  */
961   HOWTO (R_MIPS_26,		/* type */
962 	 2,			/* rightshift */
963 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
964 	 26,			/* bitsize */
965 	 FALSE,			/* pc_relative */
966 	 0,			/* bitpos */
967 	 complain_overflow_dont, /* complain_on_overflow */
968 				/* This needs complex overflow
969 				   detection, because the upper 36
970 				   bits must match the PC + 4.  */
971 	 _bfd_mips_elf_generic_reloc,	/* special_function */
972 	 "R_MIPS_26",		/* name */
973 	 FALSE,			/* partial_inplace */
974 	 0,			/* src_mask */
975 	 0x03ffffff,		/* dst_mask */
976 	 FALSE),		/* pcrel_offset */
977 
978   /* High 16 bits of symbol value.  */
979   HOWTO (R_MIPS_HI16,		/* type */
980 	 0,			/* rightshift */
981 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
982 	 16,			/* bitsize */
983 	 FALSE,			/* pc_relative */
984 	 0,			/* bitpos */
985 	 complain_overflow_dont, /* complain_on_overflow */
986 	 _bfd_mips_elf_generic_reloc,	/* special_function */
987 	 "R_MIPS_HI16",		/* name */
988 	 FALSE,			/* partial_inplace */
989 	 0,			/* src_mask */
990 	 0x0000ffff,		/* dst_mask */
991 	 FALSE),		/* pcrel_offset */
992 
993   /* Low 16 bits of symbol value.  */
994   HOWTO (R_MIPS_LO16,		/* type */
995 	 0,			/* rightshift */
996 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
997 	 16,			/* bitsize */
998 	 FALSE,			/* pc_relative */
999 	 0,			/* bitpos */
1000 	 complain_overflow_dont, /* complain_on_overflow */
1001 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1002 	 "R_MIPS_LO16",		/* name */
1003 	 FALSE,			/* partial_inplace */
1004 	 0,			/* src_mask */
1005 	 0x0000ffff,		/* dst_mask */
1006 	 FALSE),		/* pcrel_offset */
1007 
1008   /* GP relative reference.  */
1009   HOWTO (R_MIPS_GPREL16,	/* type */
1010 	 0,			/* rightshift */
1011 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1012 	 16,			/* bitsize */
1013 	 FALSE,			/* pc_relative */
1014 	 0,			/* bitpos */
1015 	 complain_overflow_signed, /* complain_on_overflow */
1016 	 mips_elf64_gprel16_reloc, /* special_function */
1017 	 "R_MIPS_GPREL16",	/* name */
1018 	 FALSE,			/* partial_inplace */
1019 	 0,			/* src_mask */
1020 	 0x0000ffff,		/* dst_mask */
1021 	 FALSE),		/* pcrel_offset */
1022 
1023   /* Reference to literal section.  */
1024   HOWTO (R_MIPS_LITERAL,	/* type */
1025 	 0,			/* rightshift */
1026 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1027 	 16,			/* bitsize */
1028 	 FALSE,			/* pc_relative */
1029 	 0,			/* bitpos */
1030 	 complain_overflow_signed, /* complain_on_overflow */
1031 	 mips_elf64_literal_reloc, /* special_function */
1032 	 "R_MIPS_LITERAL",	/* name */
1033 	 FALSE,			/* partial_inplace */
1034 	 0,			/* src_mask */
1035 	 0x0000ffff,		/* dst_mask */
1036 	 FALSE),		/* pcrel_offset */
1037 
1038   /* Reference to global offset table.  */
1039   HOWTO (R_MIPS_GOT16,		/* type */
1040 	 0,			/* rightshift */
1041 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1042 	 16,			/* bitsize */
1043 	 FALSE,			/* pc_relative */
1044 	 0,			/* bitpos */
1045 	 complain_overflow_signed, /* complain_on_overflow */
1046 	 _bfd_mips_elf_generic_reloc, /* special_function */
1047 	 "R_MIPS_GOT16",	/* name */
1048 	 FALSE,			/* partial_inplace */
1049 	 0,			/* src_mask */
1050 	 0x0000ffff,		/* dst_mask */
1051 	 FALSE),		/* pcrel_offset */
1052 
1053   /* 16 bit PC relative reference.  Note that the ABI document has a typo
1054      and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
1055      We do the right thing here.  */
1056   HOWTO (R_MIPS_PC16,		/* type */
1057 	 2,			/* rightshift */
1058 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1059 	 16,			/* bitsize */
1060 	 TRUE,			/* pc_relative */
1061 	 0,			/* bitpos */
1062 	 complain_overflow_signed, /* complain_on_overflow */
1063 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1064 	 "R_MIPS_PC16",		/* name */
1065 	 FALSE,			/* partial_inplace */
1066 	 0,			/* src_mask */
1067 	 0x0000ffff,		/* dst_mask */
1068 	 TRUE),			/* pcrel_offset */
1069 
1070   /* 16 bit call through global offset table.  */
1071   HOWTO (R_MIPS_CALL16,		/* type */
1072 	 0,			/* rightshift */
1073 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1074 	 16,			/* bitsize */
1075 	 FALSE,			/* pc_relative */
1076 	 0,			/* bitpos */
1077 	 complain_overflow_signed, /* complain_on_overflow */
1078 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1079 	 "R_MIPS_CALL16",	/* name */
1080 	 FALSE,			/* partial_inplace */
1081 	 0,			/* src_mask */
1082 	 0x0000ffff,		/* dst_mask */
1083 	 FALSE),		/* pcrel_offset */
1084 
1085   /* 32 bit GP relative reference.  */
1086   HOWTO (R_MIPS_GPREL32,	/* type */
1087 	 0,			/* rightshift */
1088 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1089 	 32,			/* bitsize */
1090 	 FALSE,			/* pc_relative */
1091 	 0,			/* bitpos */
1092 	 complain_overflow_dont, /* complain_on_overflow */
1093 	 mips_elf64_gprel32_reloc, /* special_function */
1094 	 "R_MIPS_GPREL32",	/* name */
1095 	 FALSE,			/* partial_inplace */
1096 	 0,			/* src_mask */
1097 	 0xffffffff,		/* dst_mask */
1098 	 FALSE),		/* pcrel_offset */
1099 
1100   EMPTY_HOWTO (13),
1101   EMPTY_HOWTO (14),
1102   EMPTY_HOWTO (15),
1103 
1104   /* A 5 bit shift field.  */
1105   HOWTO (R_MIPS_SHIFT5,		/* type */
1106 	 0,			/* rightshift */
1107 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1108 	 5,			/* bitsize */
1109 	 FALSE,			/* pc_relative */
1110 	 6,			/* bitpos */
1111 	 complain_overflow_bitfield, /* complain_on_overflow */
1112 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1113 	 "R_MIPS_SHIFT5",	/* name */
1114 	 FALSE,			/* partial_inplace */
1115 	 0,			/* src_mask */
1116 	 0x000007c0,		/* dst_mask */
1117 	 FALSE),		/* pcrel_offset */
1118 
1119   /* A 6 bit shift field.  */
1120   HOWTO (R_MIPS_SHIFT6,		/* type */
1121 	 0,			/* rightshift */
1122 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1123 	 6,			/* bitsize */
1124 	 FALSE,			/* pc_relative */
1125 	 6,			/* bitpos */
1126 	 complain_overflow_bitfield, /* complain_on_overflow */
1127 	 mips_elf64_shift6_reloc, /* special_function */
1128 	 "R_MIPS_SHIFT6",	/* name */
1129 	 FALSE,			/* partial_inplace */
1130 	 0,			/* src_mask */
1131 	 0x000007c4,		/* dst_mask */
1132 	 FALSE),		/* pcrel_offset */
1133 
1134   /* 64 bit relocation.  */
1135   HOWTO (R_MIPS_64,		/* type */
1136 	 0,			/* rightshift */
1137 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
1138 	 64,			/* bitsize */
1139 	 FALSE,			/* pc_relative */
1140 	 0,			/* bitpos */
1141 	 complain_overflow_dont, /* complain_on_overflow */
1142 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1143 	 "R_MIPS_64",		/* name */
1144 	 FALSE,			/* partial_inplace */
1145 	 0,			/* src_mask */
1146 	 MINUS_ONE,		/* dst_mask */
1147 	 FALSE),		/* pcrel_offset */
1148 
1149   /* Displacement in the global offset table.  */
1150   HOWTO (R_MIPS_GOT_DISP,	/* type */
1151 	 0,			/* rightshift */
1152 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1153 	 16,			/* bitsize */
1154 	 FALSE,			/* pc_relative */
1155 	 0,			/* bitpos */
1156 	 complain_overflow_signed, /* complain_on_overflow */
1157 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1158 	 "R_MIPS_GOT_DISP",	/* name */
1159 	 FALSE,			/* partial_inplace */
1160 	 0,			/* src_mask */
1161 	 0x0000ffff,		/* dst_mask */
1162 	 FALSE),		/* pcrel_offset */
1163 
1164   /* Displacement to page pointer in the global offset table.  */
1165   HOWTO (R_MIPS_GOT_PAGE,	/* type */
1166 	 0,			/* rightshift */
1167 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1168 	 16,			/* bitsize */
1169 	 FALSE,			/* pc_relative */
1170 	 0,			/* bitpos */
1171 	 complain_overflow_signed, /* complain_on_overflow */
1172 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1173 	 "R_MIPS_GOT_PAGE",	/* name */
1174 	 FALSE,			/* partial_inplace */
1175 	 0,			/* src_mask */
1176 	 0x0000ffff,		/* dst_mask */
1177 	 FALSE),		/* pcrel_offset */
1178 
1179   /* Offset from page pointer in the global offset table.  */
1180   HOWTO (R_MIPS_GOT_OFST,	/* type */
1181 	 0,			/* rightshift */
1182 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1183 	 16,			/* bitsize */
1184 	 FALSE,			/* pc_relative */
1185 	 0,			/* bitpos */
1186 	 complain_overflow_signed, /* complain_on_overflow */
1187 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1188 	 "R_MIPS_GOT_OFST",	/* name */
1189 	 FALSE,			/* partial_inplace */
1190 	 0,			/* src_mask */
1191 	 0x0000ffff,		/* dst_mask */
1192 	 FALSE),		/* pcrel_offset */
1193 
1194   /* High 16 bits of displacement in global offset table.  */
1195   HOWTO (R_MIPS_GOT_HI16,	/* type */
1196 	 0,			/* rightshift */
1197 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1198 	 16,			/* bitsize */
1199 	 FALSE,			/* pc_relative */
1200 	 0,			/* bitpos */
1201 	 complain_overflow_dont, /* complain_on_overflow */
1202 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1203 	 "R_MIPS_GOT_HI16",	/* name */
1204 	 FALSE,			/* partial_inplace */
1205 	 0,			/* src_mask */
1206 	 0x0000ffff,		/* dst_mask */
1207 	 FALSE),		/* pcrel_offset */
1208 
1209   /* Low 16 bits of displacement in global offset table.  */
1210   HOWTO (R_MIPS_GOT_LO16,	/* type */
1211 	 0,			/* rightshift */
1212 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1213 	 16,			/* bitsize */
1214 	 FALSE,			/* pc_relative */
1215 	 0,			/* bitpos */
1216 	 complain_overflow_dont, /* complain_on_overflow */
1217 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1218 	 "R_MIPS_GOT_LO16",	/* name */
1219 	 FALSE,			/* partial_inplace */
1220 	 0,			/* src_mask */
1221 	 0x0000ffff,		/* dst_mask */
1222 	 FALSE),		/* pcrel_offset */
1223 
1224   /* 64 bit subtraction.  */
1225   HOWTO (R_MIPS_SUB,		/* type */
1226 	 0,			/* rightshift */
1227 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
1228 	 64,			/* bitsize */
1229 	 FALSE,			/* pc_relative */
1230 	 0,			/* bitpos */
1231 	 complain_overflow_dont, /* complain_on_overflow */
1232 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1233 	 "R_MIPS_SUB",		/* name */
1234 	 FALSE,			/* partial_inplace */
1235 	 0,			/* src_mask */
1236 	 MINUS_ONE,		/* dst_mask */
1237 	 FALSE),		/* pcrel_offset */
1238 
1239   /* Insert the addend as an instruction.  */
1240   /* FIXME: Not handled correctly.  */
1241   HOWTO (R_MIPS_INSERT_A,	/* type */
1242 	 0,			/* rightshift */
1243 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1244 	 32,			/* bitsize */
1245 	 FALSE,			/* pc_relative */
1246 	 0,			/* bitpos */
1247 	 complain_overflow_dont, /* complain_on_overflow */
1248 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1249 	 "R_MIPS_INSERT_A",	/* name */
1250 	 FALSE,			/* partial_inplace */
1251 	 0,			/* src_mask */
1252 	 0xffffffff,		/* dst_mask */
1253 	 FALSE),		/* pcrel_offset */
1254 
1255   /* Insert the addend as an instruction, and change all relocations
1256      to refer to the old instruction at the address.  */
1257   /* FIXME: Not handled correctly.  */
1258   HOWTO (R_MIPS_INSERT_B,	/* type */
1259 	 0,			/* rightshift */
1260 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1261 	 32,			/* bitsize */
1262 	 FALSE,			/* pc_relative */
1263 	 0,			/* bitpos */
1264 	 complain_overflow_dont, /* complain_on_overflow */
1265 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1266 	 "R_MIPS_INSERT_B",	/* name */
1267 	 FALSE,			/* partial_inplace */
1268 	 0,			/* src_mask */
1269 	 0xffffffff,		/* dst_mask */
1270 	 FALSE),		/* pcrel_offset */
1271 
1272   /* Delete a 32 bit instruction.  */
1273   /* FIXME: Not handled correctly.  */
1274   HOWTO (R_MIPS_DELETE,		/* type */
1275 	 0,			/* rightshift */
1276 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1277 	 32,			/* bitsize */
1278 	 FALSE,			/* pc_relative */
1279 	 0,			/* bitpos */
1280 	 complain_overflow_dont, /* complain_on_overflow */
1281 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1282 	 "R_MIPS_DELETE",	/* name */
1283 	 FALSE,			/* partial_inplace */
1284 	 0,			/* src_mask */
1285 	 0xffffffff,		/* dst_mask */
1286 	 FALSE),		/* pcrel_offset */
1287 
1288   /* Get the higher value of a 64 bit addend.  */
1289   HOWTO (R_MIPS_HIGHER,		/* type */
1290 	 0,			/* rightshift */
1291 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1292 	 16,			/* bitsize */
1293 	 FALSE,			/* pc_relative */
1294 	 0,			/* bitpos */
1295 	 complain_overflow_dont, /* complain_on_overflow */
1296 	 _bfd_mips_elf_generic_reloc, /* special_function */
1297 	 "R_MIPS_HIGHER",	/* name */
1298 	 FALSE,			/* partial_inplace */
1299 	 0,			/* src_mask */
1300 	 0x0000ffff,		/* dst_mask */
1301 	 FALSE),		/* pcrel_offset */
1302 
1303   /* Get the highest value of a 64 bit addend.  */
1304   HOWTO (R_MIPS_HIGHEST,	/* type */
1305 	 0,			/* rightshift */
1306 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1307 	 16,			/* bitsize */
1308 	 FALSE,			/* pc_relative */
1309 	 0,			/* bitpos */
1310 	 complain_overflow_dont, /* complain_on_overflow */
1311 	 _bfd_mips_elf_generic_reloc, /* special_function */
1312 	 "R_MIPS_HIGHEST",	/* name */
1313 	 FALSE,			/* partial_inplace */
1314 	 0,			/* src_mask */
1315 	 0x0000ffff,		/* dst_mask */
1316 	 FALSE),		/* pcrel_offset */
1317 
1318   /* High 16 bits of displacement in global offset table.  */
1319   HOWTO (R_MIPS_CALL_HI16,	/* type */
1320 	 0,			/* rightshift */
1321 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1322 	 16,			/* bitsize */
1323 	 FALSE,			/* pc_relative */
1324 	 0,			/* bitpos */
1325 	 complain_overflow_dont, /* complain_on_overflow */
1326 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1327 	 "R_MIPS_CALL_HI16",	/* name */
1328 	 FALSE,			/* partial_inplace */
1329 	 0,			/* src_mask */
1330 	 0x0000ffff,		/* dst_mask */
1331 	 FALSE),		/* pcrel_offset */
1332 
1333   /* Low 16 bits of displacement in global offset table.  */
1334   HOWTO (R_MIPS_CALL_LO16,	/* type */
1335 	 0,			/* rightshift */
1336 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1337 	 16,			/* bitsize */
1338 	 FALSE,			/* pc_relative */
1339 	 0,			/* bitpos */
1340 	 complain_overflow_dont, /* complain_on_overflow */
1341 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1342 	 "R_MIPS_CALL_LO16",	/* name */
1343 	 FALSE,			/* partial_inplace */
1344 	 0,			/* src_mask */
1345 	 0x0000ffff,		/* dst_mask */
1346 	 FALSE),		/* pcrel_offset */
1347 
1348   /* Section displacement, used by an associated event location section.  */
1349   HOWTO (R_MIPS_SCN_DISP,	/* type */
1350 	 0,			/* rightshift */
1351 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1352 	 32,			/* bitsize */
1353 	 FALSE,			/* pc_relative */
1354 	 0,			/* bitpos */
1355 	 complain_overflow_dont, /* complain_on_overflow */
1356 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1357 	 "R_MIPS_SCN_DISP",	/* name */
1358 	 FALSE,			/* partial_inplace */
1359 	 0,			/* src_mask */
1360 	 0xffffffff,		/* dst_mask */
1361 	 FALSE),		/* pcrel_offset */
1362 
1363   HOWTO (R_MIPS_REL16,		/* type */
1364 	 0,			/* rightshift */
1365 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1366 	 16,			/* bitsize */
1367 	 FALSE,			/* pc_relative */
1368 	 0,			/* bitpos */
1369 	 complain_overflow_signed, /* complain_on_overflow */
1370 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1371 	 "R_MIPS_REL16",	/* name */
1372 	 FALSE,			/* partial_inplace */
1373 	 0,			/* src_mask */
1374 	 0xffff,		/* dst_mask */
1375 	 FALSE),		/* pcrel_offset */
1376 
1377   /* These two are obsolete.  */
1378   EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
1379   EMPTY_HOWTO (R_MIPS_PJUMP),
1380 
1381   /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
1382      It must be used for multigot GOT's (and only there).  */
1383   HOWTO (R_MIPS_RELGOT,		/* type */
1384 	 0,			/* rightshift */
1385 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1386 	 32,			/* bitsize */
1387 	 FALSE,			/* pc_relative */
1388 	 0,			/* bitpos */
1389 	 complain_overflow_dont, /* complain_on_overflow */
1390 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1391 	 "R_MIPS_RELGOT",	/* name */
1392 	 FALSE,			/* partial_inplace */
1393 	 0,			/* src_mask */
1394 	 0xffffffff,		/* dst_mask */
1395 	 FALSE),		/* pcrel_offset */
1396 
1397   /* Protected jump conversion.  This is an optimization hint.  No
1398      relocation is required for correctness.  */
1399   HOWTO (R_MIPS_JALR,		/* type */
1400 	 0,			/* rightshift */
1401 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1402 	 32,			/* bitsize */
1403 	 FALSE,			/* pc_relative */
1404 	 0,			/* bitpos */
1405 	 complain_overflow_dont, /* complain_on_overflow */
1406 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1407 	 "R_MIPS_JALR",		/* name */
1408 	 FALSE,			/* partial_inplace */
1409 	 0,			/* src_mask */
1410 	 0x00000000,		/* dst_mask */
1411 	 FALSE),		/* pcrel_offset */
1412 
1413   /* TLS relocations.  */
1414   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
1415   EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
1416 
1417   HOWTO (R_MIPS_TLS_DTPMOD64,	/* type */
1418 	 0,			/* rightshift */
1419 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
1420 	 64,			/* bitsize */
1421 	 FALSE,			/* pc_relative */
1422 	 0,			/* bitpos */
1423 	 complain_overflow_dont, /* complain_on_overflow */
1424 	 _bfd_mips_elf_generic_reloc, /* special_function */
1425 	 "R_MIPS_TLS_DTPMOD64", /* name */
1426 	 FALSE,			/* partial_inplace */
1427 	 0,			/* src_mask */
1428 	 MINUS_ONE,		/* dst_mask */
1429 	 FALSE),		/* pcrel_offset */
1430 
1431   HOWTO (R_MIPS_TLS_DTPREL64,	/* type */
1432 	 0,			/* rightshift */
1433 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
1434 	 64,			/* bitsize */
1435 	 FALSE,			/* pc_relative */
1436 	 0,			/* bitpos */
1437 	 complain_overflow_dont, /* complain_on_overflow */
1438 	 _bfd_mips_elf_generic_reloc, /* special_function */
1439 	 "R_MIPS_TLS_DTPREL64",	/* name */
1440 	 FALSE,			/* partial_inplace */
1441 	 0,			/* src_mask */
1442 	 MINUS_ONE,		/* dst_mask */
1443 	 FALSE),		/* pcrel_offset */
1444 
1445   /* TLS general dynamic variable reference.  */
1446   HOWTO (R_MIPS_TLS_GD,		/* type */
1447 	 0,			/* rightshift */
1448 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1449 	 16,			/* bitsize */
1450 	 FALSE,			/* pc_relative */
1451 	 0,			/* bitpos */
1452 	 complain_overflow_signed, /* complain_on_overflow */
1453 	 _bfd_mips_elf_generic_reloc, /* special_function */
1454 	 "R_MIPS_TLS_GD",	/* name */
1455 	 FALSE,			/* partial_inplace */
1456 	 0,			/* src_mask */
1457 	 0x0000ffff,		/* dst_mask */
1458 	 FALSE),		/* pcrel_offset */
1459 
1460   /* TLS local dynamic variable reference.  */
1461   HOWTO (R_MIPS_TLS_LDM,	/* type */
1462 	 0,			/* rightshift */
1463 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1464 	 16,			/* bitsize */
1465 	 FALSE,			/* pc_relative */
1466 	 0,			/* bitpos */
1467 	 complain_overflow_signed, /* complain_on_overflow */
1468 	 _bfd_mips_elf_generic_reloc, /* special_function */
1469 	 "R_MIPS_TLS_LDM",	/* name */
1470 	 FALSE,			/* partial_inplace */
1471 	 0,			/* src_mask */
1472 	 0x0000ffff,		/* dst_mask */
1473 	 FALSE),		/* pcrel_offset */
1474 
1475   /* TLS local dynamic offset.  */
1476   HOWTO (R_MIPS_TLS_DTPREL_HI16,	/* type */
1477 	 0,			/* rightshift */
1478 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1479 	 16,			/* bitsize */
1480 	 FALSE,			/* pc_relative */
1481 	 0,			/* bitpos */
1482 	 complain_overflow_signed, /* complain_on_overflow */
1483 	 _bfd_mips_elf_generic_reloc, /* special_function */
1484 	 "R_MIPS_TLS_DTPREL_HI16",	/* name */
1485 	 FALSE,			/* partial_inplace */
1486 	 0,			/* src_mask */
1487 	 0x0000ffff,		/* dst_mask */
1488 	 FALSE),		/* pcrel_offset */
1489 
1490   /* TLS local dynamic offset.  */
1491   HOWTO (R_MIPS_TLS_DTPREL_LO16,	/* type */
1492 	 0,			/* rightshift */
1493 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1494 	 16,			/* bitsize */
1495 	 FALSE,			/* pc_relative */
1496 	 0,			/* bitpos */
1497 	 complain_overflow_signed, /* complain_on_overflow */
1498 	 _bfd_mips_elf_generic_reloc, /* special_function */
1499 	 "R_MIPS_TLS_DTPREL_LO16",	/* name */
1500 	 FALSE,			/* partial_inplace */
1501 	 0,			/* src_mask */
1502 	 0x0000ffff,		/* dst_mask */
1503 	 FALSE),		/* pcrel_offset */
1504 
1505   /* TLS thread pointer offset.  */
1506   HOWTO (R_MIPS_TLS_GOTTPREL,	/* type */
1507 	 0,			/* rightshift */
1508 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1509 	 16,			/* bitsize */
1510 	 FALSE,			/* pc_relative */
1511 	 0,			/* bitpos */
1512 	 complain_overflow_signed, /* complain_on_overflow */
1513 	 _bfd_mips_elf_generic_reloc, /* special_function */
1514 	 "R_MIPS_TLS_GOTTPREL",	/* name */
1515 	 FALSE,			/* partial_inplace */
1516 	 0,			/* src_mask */
1517 	 0x0000ffff,		/* dst_mask */
1518 	 FALSE),		/* pcrel_offset */
1519 
1520   /* TLS IE dynamic relocations.  */
1521   EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
1522 
1523   HOWTO (R_MIPS_TLS_TPREL64,	/* type */
1524 	 0,			/* rightshift */
1525 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
1526 	 64,			/* bitsize */
1527 	 FALSE,			/* pc_relative */
1528 	 0,			/* bitpos */
1529 	 complain_overflow_dont, /* complain_on_overflow */
1530 	 _bfd_mips_elf_generic_reloc, /* special_function */
1531 	 "R_MIPS_TLS_TPREL64",	/* name */
1532 	 FALSE,			/* partial_inplace */
1533 	 0,			/* src_mask */
1534 	 MINUS_ONE,		/* dst_mask */
1535 	 FALSE),		/* pcrel_offset */
1536 
1537   /* TLS thread pointer offset.  */
1538   HOWTO (R_MIPS_TLS_TPREL_HI16,	/* type */
1539 	 0,			/* rightshift */
1540 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1541 	 16,			/* bitsize */
1542 	 FALSE,			/* pc_relative */
1543 	 0,			/* bitpos */
1544 	 complain_overflow_signed, /* complain_on_overflow */
1545 	 _bfd_mips_elf_generic_reloc, /* special_function */
1546 	 "R_MIPS_TLS_TPREL_HI16", /* name */
1547 	 FALSE,			/* partial_inplace */
1548 	 0,			/* src_mask */
1549 	 0x0000ffff,		/* dst_mask */
1550 	 FALSE),		/* pcrel_offset */
1551 
1552   /* TLS thread pointer offset.  */
1553   HOWTO (R_MIPS_TLS_TPREL_LO16,	/* type */
1554 	 0,			/* rightshift */
1555 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1556 	 16,			/* bitsize */
1557 	 FALSE,			/* pc_relative */
1558 	 0,			/* bitpos */
1559 	 complain_overflow_signed, /* complain_on_overflow */
1560 	 _bfd_mips_elf_generic_reloc, /* special_function */
1561 	 "R_MIPS_TLS_TPREL_LO16", /* name */
1562 	 FALSE,			/* partial_inplace */
1563 	 0,			/* src_mask */
1564 	 0x0000ffff,		/* dst_mask */
1565 	 FALSE),		/* pcrel_offset */
1566 
1567   /* 32 bit relocation with no addend.  */
1568   HOWTO (R_MIPS_GLOB_DAT,	/* type */
1569 	 0,			/* rightshift */
1570 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1571 	 32,			/* bitsize */
1572 	 FALSE,			/* pc_relative */
1573 	 0,			/* bitpos */
1574 	 complain_overflow_dont, /* complain_on_overflow */
1575 	 _bfd_mips_elf_generic_reloc, /* special_function */
1576 	 "R_MIPS_GLOB_DAT",	/* name */
1577 	 FALSE,			/* partial_inplace */
1578 	 0x0,			/* src_mask */
1579 	 0xffffffff,		/* dst_mask */
1580 	 FALSE),		/* pcrel_offset */
1581 
1582   EMPTY_HOWTO (52),
1583   EMPTY_HOWTO (53),
1584   EMPTY_HOWTO (54),
1585   EMPTY_HOWTO (55),
1586   EMPTY_HOWTO (56),
1587   EMPTY_HOWTO (57),
1588   EMPTY_HOWTO (58),
1589   EMPTY_HOWTO (59),
1590 
1591   HOWTO (R_MIPS_PC21_S2,	/* type */
1592 	 2,			/* rightshift */
1593 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1594 	 21,			/* bitsize */
1595 	 TRUE,			/* pc_relative */
1596 	 0,			/* bitpos */
1597 	 complain_overflow_signed, /* complain_on_overflow */
1598 	 _bfd_mips_elf_generic_reloc, /* special_function */
1599 	 "R_MIPS_PC21_S2",	/* name */
1600 	 FALSE,			/* partial_inplace */
1601 	 0,			/* src_mask */
1602 	 0x001fffff,		/* dst_mask */
1603 	 TRUE),			/* pcrel_offset */
1604 
1605   HOWTO (R_MIPS_PC26_S2,	/* type */
1606 	 2,			/* rightshift */
1607 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1608 	 26,			/* bitsize */
1609 	 TRUE,			/* pc_relative */
1610 	 0,			/* bitpos */
1611 	 complain_overflow_signed, /* complain_on_overflow */
1612 	 _bfd_mips_elf_generic_reloc, /* special_function */
1613 	 "R_MIPS_PC26_S2",	/* name */
1614 	 FALSE,			/* partial_inplace */
1615 	 0,			/* src_mask */
1616 	 0x03ffffff,		/* dst_mask */
1617 	 TRUE),			/* pcrel_offset */
1618 
1619   HOWTO (R_MIPS_PC18_S3,	/* type */
1620 	 3,			/* rightshift */
1621 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1622 	 18,			/* bitsize */
1623 	 TRUE,			/* pc_relative */
1624 	 0,			/* bitpos */
1625 	 complain_overflow_signed, /* complain_on_overflow */
1626 	 _bfd_mips_elf_generic_reloc,   /* special_function */
1627 	 "R_MIPS_PC18_S3",	/* name */
1628 	 FALSE,			/* partial_inplace */
1629 	 0,			/* src_mask */
1630 	 0x0003ffff,		/* dst_mask */
1631 	 TRUE),			/* pcrel_offset */
1632 
1633   HOWTO (R_MIPS_PC19_S2,	/* type */
1634 	 2,			/* rightshift */
1635 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1636 	 19,			/* bitsize */
1637 	 TRUE,			/* pc_relative */
1638 	 0,			/* bitpos */
1639 	 complain_overflow_signed, /* complain_on_overflow */
1640 	 _bfd_mips_elf_generic_reloc,   /* special_function */
1641 	 "R_MIPS_PC19_S2",	/* name */
1642 	 FALSE,			/* partial_inplace */
1643 	 0,			/* src_mask */
1644 	 0x0007ffff,		/* dst_mask */
1645 	 TRUE),			/* pcrel_offset */
1646 
1647   HOWTO (R_MIPS_PCHI16,		/* type */
1648 	 16,			/* rightshift */
1649 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1650 	 16,			/* bitsize */
1651 	 TRUE,			/* pc_relative */
1652 	 0,			/* bitpos */
1653 	 complain_overflow_signed, /* complain_on_overflow */
1654 	 _bfd_mips_elf_generic_reloc,   /* special_function */
1655 	 "R_MIPS_PCHI16",	/* name */
1656 	 FALSE,			/* partial_inplace */
1657 	 0,			/* src_mask */
1658 	 0x0000ffff,		/* dst_mask */
1659 	 TRUE),			/* pcrel_offset */
1660 
1661   HOWTO (R_MIPS_PCLO16,		/* type */
1662 	 0,			/* rightshift */
1663 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1664 	 16,			/* bitsize */
1665 	 TRUE,			/* pc_relative */
1666 	 0,			/* bitpos */
1667 	 complain_overflow_dont, /* complain_on_overflow */
1668 	 _bfd_mips_elf_generic_reloc,   /* special_function */
1669 	 "R_MIPS_PCLO16",	/* name */
1670 	 FALSE,			/* partial_inplace */
1671 	 0,			/* src_mask */
1672 	 0x0000ffff,		/* dst_mask */
1673 	 TRUE),			/* pcrel_offset */
1674 
1675 };
1676 
1677 static reloc_howto_type mips16_elf64_howto_table_rel[] =
1678 {
1679   /* The reloc used for the mips16 jump instruction.  */
1680   HOWTO (R_MIPS16_26,		/* type */
1681 	 2,			/* rightshift */
1682 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1683 	 26,			/* bitsize */
1684 	 FALSE,			/* pc_relative */
1685 	 0,			/* bitpos */
1686 	 complain_overflow_dont, /* complain_on_overflow */
1687 				/* This needs complex overflow
1688 				   detection, because the upper four
1689 				   bits must match the PC.  */
1690 	 _bfd_mips_elf_generic_reloc, /* special_function */
1691 	 "R_MIPS16_26",		/* name */
1692 	 TRUE,			/* partial_inplace */
1693 	 0x3ffffff,		/* src_mask */
1694 	 0x3ffffff,		/* dst_mask */
1695 	 FALSE),		/* pcrel_offset */
1696 
1697   /* The reloc used for the mips16 gprel instruction.  */
1698   HOWTO (R_MIPS16_GPREL,	/* type */
1699 	 0,			/* rightshift */
1700 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1701 	 16,			/* bitsize */
1702 	 FALSE,			/* pc_relative */
1703 	 0,			/* bitpos */
1704 	 complain_overflow_signed, /* complain_on_overflow */
1705 	 mips16_gprel_reloc,	/* special_function */
1706 	 "R_MIPS16_GPREL",	/* name */
1707 	 TRUE,			/* partial_inplace */
1708 	 0x0000ffff,		/* src_mask */
1709 	 0x0000ffff,		/* dst_mask */
1710 	 FALSE),		/* pcrel_offset */
1711 
1712   /* A MIPS16 reference to the global offset table.  */
1713   HOWTO (R_MIPS16_GOT16,	/* type */
1714 	 0,			/* rightshift */
1715 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1716 	 16,			/* bitsize */
1717 	 FALSE,			/* pc_relative */
1718 	 0,			/* bitpos */
1719 	 complain_overflow_dont, /* complain_on_overflow */
1720 	 _bfd_mips_elf_got16_reloc, /* special_function */
1721 	 "R_MIPS16_GOT16",	/* name */
1722 	 TRUE,			/* partial_inplace */
1723 	 0x0000ffff,		/* src_mask */
1724 	 0x0000ffff,		/* dst_mask */
1725 	 FALSE),		/* pcrel_offset */
1726 
1727   /* A MIPS16 call through the global offset table.  */
1728   HOWTO (R_MIPS16_CALL16,	/* type */
1729 	 0,			/* rightshift */
1730 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1731 	 16,			/* bitsize */
1732 	 FALSE,			/* pc_relative */
1733 	 0,			/* bitpos */
1734 	 complain_overflow_dont, /* complain_on_overflow */
1735 	 _bfd_mips_elf_generic_reloc, /* special_function */
1736 	 "R_MIPS16_CALL16",	/* name */
1737 	 TRUE,			/* partial_inplace */
1738 	 0x0000ffff,		/* src_mask */
1739 	 0x0000ffff,		/* dst_mask */
1740 	 FALSE),		/* pcrel_offset */
1741 
1742   /* MIPS16 high 16 bits of symbol value.  */
1743   HOWTO (R_MIPS16_HI16,		/* type */
1744 	 16,			/* rightshift */
1745 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1746 	 16,			/* bitsize */
1747 	 FALSE,			/* pc_relative */
1748 	 0,			/* bitpos */
1749 	 complain_overflow_dont, /* complain_on_overflow */
1750 	 _bfd_mips_elf_hi16_reloc, /* special_function */
1751 	 "R_MIPS16_HI16",	/* name */
1752 	 TRUE,			/* partial_inplace */
1753 	 0x0000ffff,		/* src_mask */
1754 	 0x0000ffff,		/* dst_mask */
1755 	 FALSE),		/* pcrel_offset */
1756 
1757   /* MIPS16 low 16 bits of symbol value.  */
1758   HOWTO (R_MIPS16_LO16,		/* type */
1759 	 0,			/* rightshift */
1760 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1761 	 16,			/* bitsize */
1762 	 FALSE,			/* pc_relative */
1763 	 0,			/* bitpos */
1764 	 complain_overflow_dont, /* complain_on_overflow */
1765 	 _bfd_mips_elf_lo16_reloc, /* special_function */
1766 	 "R_MIPS16_LO16",	/* name */
1767 	 TRUE,			/* partial_inplace */
1768 	 0x0000ffff,		/* src_mask */
1769 	 0x0000ffff,		/* dst_mask */
1770 	 FALSE),		/* pcrel_offset */
1771 
1772   /* MIPS16 TLS general dynamic variable reference.  */
1773   HOWTO (R_MIPS16_TLS_GD,	/* type */
1774 	 0,			/* rightshift */
1775 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1776 	 16,			/* bitsize */
1777 	 FALSE,			/* pc_relative */
1778 	 0,			/* bitpos */
1779 	 complain_overflow_signed, /* complain_on_overflow */
1780 	 _bfd_mips_elf_generic_reloc, /* special_function */
1781 	 "R_MIPS16_TLS_GD",	/* name */
1782 	 TRUE,			/* partial_inplace */
1783 	 0x0000ffff,		/* src_mask */
1784 	 0x0000ffff,		/* dst_mask */
1785 	 FALSE),		/* pcrel_offset */
1786 
1787   /* MIPS16 TLS local dynamic variable reference.  */
1788   HOWTO (R_MIPS16_TLS_LDM,	/* type */
1789 	 0,			/* rightshift */
1790 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1791 	 16,			/* bitsize */
1792 	 FALSE,			/* pc_relative */
1793 	 0,			/* bitpos */
1794 	 complain_overflow_signed, /* complain_on_overflow */
1795 	 _bfd_mips_elf_generic_reloc, /* special_function */
1796 	 "R_MIPS16_TLS_LDM",	/* name */
1797 	 TRUE,			/* partial_inplace */
1798 	 0x0000ffff,		/* src_mask */
1799 	 0x0000ffff,		/* dst_mask */
1800 	 FALSE),		/* pcrel_offset */
1801 
1802   /* MIPS16 TLS local dynamic offset.  */
1803   HOWTO (R_MIPS16_TLS_DTPREL_HI16,	/* type */
1804 	 0,			/* rightshift */
1805 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1806 	 16,			/* bitsize */
1807 	 FALSE,			/* pc_relative */
1808 	 0,			/* bitpos */
1809 	 complain_overflow_signed, /* complain_on_overflow */
1810 	 _bfd_mips_elf_generic_reloc, /* special_function */
1811 	 "R_MIPS16_TLS_DTPREL_HI16",	/* name */
1812 	 TRUE,			/* partial_inplace */
1813 	 0x0000ffff,		/* src_mask */
1814 	 0x0000ffff,		/* dst_mask */
1815 	 FALSE),		/* pcrel_offset */
1816 
1817   /* MIPS16 TLS local dynamic offset.  */
1818   HOWTO (R_MIPS16_TLS_DTPREL_LO16,	/* type */
1819 	 0,			/* rightshift */
1820 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1821 	 16,			/* bitsize */
1822 	 FALSE,			/* pc_relative */
1823 	 0,			/* bitpos */
1824 	 complain_overflow_signed, /* complain_on_overflow */
1825 	 _bfd_mips_elf_generic_reloc, /* special_function */
1826 	 "R_MIPS16_TLS_DTPREL_LO16",	/* name */
1827 	 TRUE,			/* partial_inplace */
1828 	 0x0000ffff,		/* src_mask */
1829 	 0x0000ffff,		/* dst_mask */
1830 	 FALSE),		/* pcrel_offset */
1831 
1832   /* MIPS16 TLS thread pointer offset.  */
1833   HOWTO (R_MIPS16_TLS_GOTTPREL,	/* type */
1834 	 0,			/* rightshift */
1835 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1836 	 16,			/* bitsize */
1837 	 FALSE,			/* pc_relative */
1838 	 0,			/* bitpos */
1839 	 complain_overflow_signed, /* complain_on_overflow */
1840 	 _bfd_mips_elf_generic_reloc, /* special_function */
1841 	 "R_MIPS16_TLS_GOTTPREL",	/* name */
1842 	 TRUE,			/* partial_inplace */
1843 	 0x0000ffff,		/* src_mask */
1844 	 0x0000ffff,		/* dst_mask */
1845 	 FALSE),		/* pcrel_offset */
1846 
1847   /* MIPS16 TLS thread pointer offset.  */
1848   HOWTO (R_MIPS16_TLS_TPREL_HI16,	/* type */
1849 	 0,			/* rightshift */
1850 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1851 	 16,			/* bitsize */
1852 	 FALSE,			/* pc_relative */
1853 	 0,			/* bitpos */
1854 	 complain_overflow_signed, /* complain_on_overflow */
1855 	 _bfd_mips_elf_generic_reloc, /* special_function */
1856 	 "R_MIPS16_TLS_TPREL_HI16", /* name */
1857 	 TRUE,			/* partial_inplace */
1858 	 0x0000ffff,		/* src_mask */
1859 	 0x0000ffff,		/* dst_mask */
1860 	 FALSE),		/* pcrel_offset */
1861 
1862   /* MIPS16 TLS thread pointer offset.  */
1863   HOWTO (R_MIPS16_TLS_TPREL_LO16,	/* type */
1864 	 0,			/* rightshift */
1865 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1866 	 16,			/* bitsize */
1867 	 FALSE,			/* pc_relative */
1868 	 0,			/* bitpos */
1869 	 complain_overflow_signed, /* complain_on_overflow */
1870 	 _bfd_mips_elf_generic_reloc, /* special_function */
1871 	 "R_MIPS16_TLS_TPREL_LO16", /* name */
1872 	 TRUE,			/* partial_inplace */
1873 	 0x0000ffff,		/* src_mask */
1874 	 0x0000ffff,		/* dst_mask */
1875 	 FALSE),		/* pcrel_offset */
1876 
1877   /* MIPS16 16-bit PC-relative branch offset.  */
1878   HOWTO (R_MIPS16_PC16_S1,	/* type */
1879 	 1,			/* rightshift */
1880 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1881 	 16,			/* bitsize */
1882 	 TRUE,			/* pc_relative */
1883 	 0,			/* bitpos */
1884 	 complain_overflow_signed, /* complain_on_overflow */
1885 	 _bfd_mips_elf_generic_reloc, /* special_function */
1886 	 "R_MIPS16_PC16_S1",	/* name */
1887 	 TRUE,			/* partial_inplace */
1888 	 0x0000ffff,		/* src_mask */
1889 	 0x0000ffff,		/* dst_mask */
1890 	 TRUE),			/* pcrel_offset */
1891 };
1892 
1893 static reloc_howto_type mips16_elf64_howto_table_rela[] =
1894 {
1895   /* The reloc used for the mips16 jump instruction.  */
1896   HOWTO (R_MIPS16_26,		/* type */
1897 	 2,			/* rightshift */
1898 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1899 	 26,			/* bitsize */
1900 	 FALSE,			/* pc_relative */
1901 	 0,			/* bitpos */
1902 	 complain_overflow_dont, /* complain_on_overflow */
1903 				/* This needs complex overflow
1904 				   detection, because the upper four
1905 				   bits must match the PC.  */
1906 	 _bfd_mips_elf_generic_reloc, /* special_function */
1907 	 "R_MIPS16_26",		/* name */
1908 	 FALSE,			/* partial_inplace */
1909 	 0,			/* src_mask */
1910 	 0x3ffffff,		/* dst_mask */
1911 	 FALSE),		/* pcrel_offset */
1912 
1913   /* The reloc used for the mips16 gprel instruction.  */
1914   HOWTO (R_MIPS16_GPREL,	/* type */
1915 	 0,			/* rightshift */
1916 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1917 	 16,			/* bitsize */
1918 	 FALSE,			/* pc_relative */
1919 	 0,			/* bitpos */
1920 	 complain_overflow_signed, /* complain_on_overflow */
1921 	 mips16_gprel_reloc,	/* special_function */
1922 	 "R_MIPS16_GPREL",	/* name */
1923 	 FALSE,			/* partial_inplace */
1924 	 0,			/* src_mask */
1925 	 0x0000ffff,		/* dst_mask */
1926 	 FALSE),		/* pcrel_offset */
1927 
1928   /* A MIPS16 reference to the global offset table.  */
1929   HOWTO (R_MIPS16_GOT16,	/* type */
1930 	 0,			/* rightshift */
1931 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1932 	 16,			/* bitsize */
1933 	 FALSE,			/* pc_relative */
1934 	 0,			/* bitpos */
1935 	 complain_overflow_dont, /* complain_on_overflow */
1936 	 _bfd_mips_elf_got16_reloc, /* special_function */
1937 	 "R_MIPS16_GOT16",	/* name */
1938 	 FALSE,			/* partial_inplace */
1939 	 0,			/* src_mask */
1940 	 0x0000ffff,		/* dst_mask */
1941 	 FALSE),		/* pcrel_offset */
1942 
1943   /* A MIPS16 call through the global offset table.  */
1944   HOWTO (R_MIPS16_CALL16,	/* type */
1945 	 0,			/* rightshift */
1946 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1947 	 16,			/* bitsize */
1948 	 FALSE,			/* pc_relative */
1949 	 0,			/* bitpos */
1950 	 complain_overflow_dont, /* complain_on_overflow */
1951 	 _bfd_mips_elf_generic_reloc, /* special_function */
1952 	 "R_MIPS16_CALL16",	/* name */
1953 	 FALSE,			/* partial_inplace */
1954 	 0,			/* src_mask */
1955 	 0x0000ffff,		/* dst_mask */
1956 	 FALSE),		/* pcrel_offset */
1957 
1958   /* MIPS16 high 16 bits of symbol value.  */
1959   HOWTO (R_MIPS16_HI16,		/* type */
1960 	 16,			/* rightshift */
1961 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1962 	 16,			/* bitsize */
1963 	 FALSE,			/* pc_relative */
1964 	 0,			/* bitpos */
1965 	 complain_overflow_dont, /* complain_on_overflow */
1966 	 _bfd_mips_elf_hi16_reloc, /* special_function */
1967 	 "R_MIPS16_HI16",	/* name */
1968 	 FALSE,			/* partial_inplace */
1969 	 0,			/* src_mask */
1970 	 0x0000ffff,		/* dst_mask */
1971 	 FALSE),		/* pcrel_offset */
1972 
1973   /* MIPS16 low 16 bits of symbol value.  */
1974   HOWTO (R_MIPS16_LO16,		/* type */
1975 	 0,			/* rightshift */
1976 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1977 	 16,			/* bitsize */
1978 	 FALSE,			/* pc_relative */
1979 	 0,			/* bitpos */
1980 	 complain_overflow_dont, /* complain_on_overflow */
1981 	 _bfd_mips_elf_lo16_reloc, /* special_function */
1982 	 "R_MIPS16_LO16",	/* name */
1983 	 FALSE,			/* partial_inplace */
1984 	 0,			/* src_mask */
1985 	 0x0000ffff,		/* dst_mask */
1986 	 FALSE),		/* pcrel_offset */
1987 
1988   /* MIPS16 TLS general dynamic variable reference.  */
1989   HOWTO (R_MIPS16_TLS_GD,	/* type */
1990 	 0,			/* rightshift */
1991 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1992 	 16,			/* bitsize */
1993 	 FALSE,			/* pc_relative */
1994 	 0,			/* bitpos */
1995 	 complain_overflow_signed, /* complain_on_overflow */
1996 	 _bfd_mips_elf_generic_reloc, /* special_function */
1997 	 "R_MIPS16_TLS_GD",	/* name */
1998 	 FALSE,			/* partial_inplace */
1999 	 0,			/* src_mask */
2000 	 0x0000ffff,		/* dst_mask */
2001 	 FALSE),		/* pcrel_offset */
2002 
2003   /* MIPS16 TLS local dynamic variable reference.  */
2004   HOWTO (R_MIPS16_TLS_LDM,	/* type */
2005 	 0,			/* rightshift */
2006 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2007 	 16,			/* bitsize */
2008 	 FALSE,			/* pc_relative */
2009 	 0,			/* bitpos */
2010 	 complain_overflow_signed, /* complain_on_overflow */
2011 	 _bfd_mips_elf_generic_reloc, /* special_function */
2012 	 "R_MIPS16_TLS_LDM",	/* name */
2013 	 FALSE,			/* partial_inplace */
2014 	 0,			/* src_mask */
2015 	 0x0000ffff,		/* dst_mask */
2016 	 FALSE),		/* pcrel_offset */
2017 
2018   /* MIPS16 TLS local dynamic offset.  */
2019   HOWTO (R_MIPS16_TLS_DTPREL_HI16,	/* type */
2020 	 0,			/* rightshift */
2021 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2022 	 16,			/* bitsize */
2023 	 FALSE,			/* pc_relative */
2024 	 0,			/* bitpos */
2025 	 complain_overflow_signed, /* complain_on_overflow */
2026 	 _bfd_mips_elf_generic_reloc, /* special_function */
2027 	 "R_MIPS16_TLS_DTPREL_HI16",	/* name */
2028 	 FALSE,			/* partial_inplace */
2029 	 0,			/* src_mask */
2030 	 0x0000ffff,		/* dst_mask */
2031 	 FALSE),		/* pcrel_offset */
2032 
2033   /* MIPS16 TLS local dynamic offset.  */
2034   HOWTO (R_MIPS16_TLS_DTPREL_LO16,	/* type */
2035 	 0,			/* rightshift */
2036 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2037 	 16,			/* bitsize */
2038 	 FALSE,			/* pc_relative */
2039 	 0,			/* bitpos */
2040 	 complain_overflow_signed, /* complain_on_overflow */
2041 	 _bfd_mips_elf_generic_reloc, /* special_function */
2042 	 "R_MIPS16_TLS_DTPREL_LO16",	/* name */
2043 	 FALSE,			/* partial_inplace */
2044 	 0,			/* src_mask */
2045 	 0x0000ffff,		/* dst_mask */
2046 	 FALSE),		/* pcrel_offset */
2047 
2048   /* MIPS16 TLS thread pointer offset.  */
2049   HOWTO (R_MIPS16_TLS_GOTTPREL,	/* type */
2050 	 0,			/* rightshift */
2051 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2052 	 16,			/* bitsize */
2053 	 FALSE,			/* pc_relative */
2054 	 0,			/* bitpos */
2055 	 complain_overflow_signed, /* complain_on_overflow */
2056 	 _bfd_mips_elf_generic_reloc, /* special_function */
2057 	 "R_MIPS16_TLS_GOTTPREL",	/* name */
2058 	 FALSE,			/* partial_inplace */
2059 	 0,			/* src_mask */
2060 	 0x0000ffff,		/* dst_mask */
2061 	 FALSE),		/* pcrel_offset */
2062 
2063   /* MIPS16 TLS thread pointer offset.  */
2064   HOWTO (R_MIPS16_TLS_TPREL_HI16,	/* type */
2065 	 0,			/* rightshift */
2066 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2067 	 16,			/* bitsize */
2068 	 FALSE,			/* pc_relative */
2069 	 0,			/* bitpos */
2070 	 complain_overflow_signed, /* complain_on_overflow */
2071 	 _bfd_mips_elf_generic_reloc, /* special_function */
2072 	 "R_MIPS16_TLS_TPREL_HI16", /* name */
2073 	 FALSE,			/* partial_inplace */
2074 	 0,			/* src_mask */
2075 	 0x0000ffff,		/* dst_mask */
2076 	 FALSE),		/* pcrel_offset */
2077 
2078   /* MIPS16 TLS thread pointer offset.  */
2079   HOWTO (R_MIPS16_TLS_TPREL_LO16,	/* type */
2080 	 0,			/* rightshift */
2081 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2082 	 16,			/* bitsize */
2083 	 FALSE,			/* pc_relative */
2084 	 0,			/* bitpos */
2085 	 complain_overflow_signed, /* complain_on_overflow */
2086 	 _bfd_mips_elf_generic_reloc, /* special_function */
2087 	 "R_MIPS16_TLS_TPREL_LO16", /* name */
2088 	 FALSE,			/* partial_inplace */
2089 	 0,			/* src_mask */
2090 	 0x0000ffff,		/* dst_mask */
2091 	 FALSE),		/* pcrel_offset */
2092 
2093   /* MIPS16 16-bit PC-relative branch offset.  */
2094   HOWTO (R_MIPS16_PC16_S1,	/* type */
2095 	 1,			/* rightshift */
2096 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2097 	 16,			/* bitsize */
2098 	 TRUE,			/* pc_relative */
2099 	 0,			/* bitpos */
2100 	 complain_overflow_signed, /* complain_on_overflow */
2101 	 _bfd_mips_elf_generic_reloc, /* special_function */
2102 	 "R_MIPS16_PC16_S1",	/* name */
2103 	 FALSE,			/* partial_inplace */
2104 	 0,			/* src_mask */
2105 	 0x0000ffff,		/* dst_mask */
2106 	 TRUE),			/* pcrel_offset */
2107 };
2108 
2109 static reloc_howto_type micromips_elf64_howto_table_rel[] =
2110 {
2111   EMPTY_HOWTO (130),
2112   EMPTY_HOWTO (131),
2113   EMPTY_HOWTO (132),
2114 
2115   /* 26 bit jump address.  */
2116   HOWTO (R_MICROMIPS_26_S1,	/* type */
2117 	 1,			/* rightshift */
2118 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2119 	 26,			/* bitsize */
2120 	 FALSE,			/* pc_relative */
2121 	 0,			/* bitpos */
2122 	 complain_overflow_dont, /* complain_on_overflow */
2123 				/* This needs complex overflow
2124 				   detection, because the upper four
2125 				   bits must match the PC.  */
2126 	 _bfd_mips_elf_generic_reloc, /* special_function */
2127 	 "R_MICROMIPS_26_S1",	/* name */
2128 	 TRUE,			/* partial_inplace */
2129 	 0x3ffffff,		/* src_mask */
2130 	 0x3ffffff,		/* dst_mask */
2131 	 FALSE),		/* pcrel_offset */
2132 
2133   /* High 16 bits of symbol value.  */
2134   HOWTO (R_MICROMIPS_HI16,	/* type */
2135 	 16,			/* rightshift */
2136 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2137 	 16,			/* bitsize */
2138 	 FALSE,			/* pc_relative */
2139 	 0,			/* bitpos */
2140 	 complain_overflow_dont, /* complain_on_overflow */
2141 	 _bfd_mips_elf_hi16_reloc, /* special_function */
2142 	 "R_MICROMIPS_HI16",	/* name */
2143 	 TRUE,			/* partial_inplace */
2144 	 0x0000ffff,		/* src_mask */
2145 	 0x0000ffff,		/* dst_mask */
2146 	 FALSE),		/* pcrel_offset */
2147 
2148   /* Low 16 bits of symbol value.  */
2149   HOWTO (R_MICROMIPS_LO16,	/* type */
2150 	 0,			/* rightshift */
2151 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2152 	 16,			/* bitsize */
2153 	 FALSE,			/* pc_relative */
2154 	 0,			/* bitpos */
2155 	 complain_overflow_dont, /* complain_on_overflow */
2156 	 _bfd_mips_elf_lo16_reloc, /* special_function */
2157 	 "R_MICROMIPS_LO16",	/* name */
2158 	 TRUE,			/* partial_inplace */
2159 	 0x0000ffff,		/* src_mask */
2160 	 0x0000ffff,		/* dst_mask */
2161 	 FALSE),		/* pcrel_offset */
2162 
2163   /* GP relative reference.  */
2164   HOWTO (R_MICROMIPS_GPREL16,	/* type */
2165 	 0,			/* rightshift */
2166 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2167 	 16,			/* bitsize */
2168 	 FALSE,			/* pc_relative */
2169 	 0,			/* bitpos */
2170 	 complain_overflow_signed, /* complain_on_overflow */
2171 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
2172 	 "R_MICROMIPS_GPREL16",	/* name */
2173 	 TRUE,			/* partial_inplace */
2174 	 0x0000ffff,		/* src_mask */
2175 	 0x0000ffff,		/* dst_mask */
2176 	 FALSE),		/* pcrel_offset */
2177 
2178   /* Reference to literal section.  */
2179   HOWTO (R_MICROMIPS_LITERAL,	/* type */
2180 	 0,			/* rightshift */
2181 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2182 	 16,			/* bitsize */
2183 	 FALSE,			/* pc_relative */
2184 	 0,			/* bitpos */
2185 	 complain_overflow_signed, /* complain_on_overflow */
2186 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
2187 	 "R_MICROMIPS_LITERAL",	/* name */
2188 	 TRUE,			/* partial_inplace */
2189 	 0x0000ffff,		/* src_mask */
2190 	 0x0000ffff,		/* dst_mask */
2191 	 FALSE),		/* pcrel_offset */
2192 
2193   /* Reference to global offset table.  */
2194   HOWTO (R_MICROMIPS_GOT16,	/* type */
2195 	 0,			/* rightshift */
2196 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2197 	 16,			/* bitsize */
2198 	 FALSE,			/* pc_relative */
2199 	 0,			/* bitpos */
2200 	 complain_overflow_signed, /* complain_on_overflow */
2201 	 _bfd_mips_elf_got16_reloc, /* special_function */
2202 	 "R_MICROMIPS_GOT16",	/* name */
2203 	 TRUE,			/* partial_inplace */
2204 	 0x0000ffff,		/* src_mask */
2205 	 0x0000ffff,		/* dst_mask */
2206 	 FALSE),		/* pcrel_offset */
2207 
2208   /* This is for microMIPS branches.  */
2209   HOWTO (R_MICROMIPS_PC7_S1,	/* type */
2210 	 1,			/* rightshift */
2211 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
2212 	 7,			/* bitsize */
2213 	 TRUE,			/* pc_relative */
2214 	 0,			/* bitpos */
2215 	 complain_overflow_signed, /* complain_on_overflow */
2216 	 _bfd_mips_elf_generic_reloc, /* special_function */
2217 	 "R_MICROMIPS_PC7_S1",	/* name */
2218 	 TRUE,			/* partial_inplace */
2219 	 0x0000007f,		/* src_mask */
2220 	 0x0000007f,		/* dst_mask */
2221 	 TRUE),			/* pcrel_offset */
2222 
2223   HOWTO (R_MICROMIPS_PC10_S1,	/* type */
2224 	 1,			/* rightshift */
2225 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
2226 	 10,			/* bitsize */
2227 	 TRUE,			/* pc_relative */
2228 	 0,			/* bitpos */
2229 	 complain_overflow_signed, /* complain_on_overflow */
2230 	 _bfd_mips_elf_generic_reloc, /* special_function */
2231 	 "R_MICROMIPS_PC10_S1",	/* name */
2232 	 TRUE,			/* partial_inplace */
2233 	 0x000003ff,		/* src_mask */
2234 	 0x000003ff,		/* dst_mask */
2235 	 TRUE),			/* pcrel_offset */
2236 
2237   HOWTO (R_MICROMIPS_PC16_S1,	/* type */
2238 	 1,			/* rightshift */
2239 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2240 	 16,			/* bitsize */
2241 	 TRUE,			/* pc_relative */
2242 	 0,			/* bitpos */
2243 	 complain_overflow_signed, /* complain_on_overflow */
2244 	 _bfd_mips_elf_generic_reloc, /* special_function */
2245 	 "R_MICROMIPS_PC16_S1",	/* name */
2246 	 TRUE,			/* partial_inplace */
2247 	 0x0000ffff,		/* src_mask */
2248 	 0x0000ffff,		/* dst_mask */
2249 	 TRUE),			/* pcrel_offset */
2250 
2251   /* 16 bit call through global offset table.  */
2252   HOWTO (R_MICROMIPS_CALL16,	/* type */
2253 	 0,			/* rightshift */
2254 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2255 	 16,			/* bitsize */
2256 	 FALSE,			/* pc_relative */
2257 	 0,			/* bitpos */
2258 	 complain_overflow_signed, /* complain_on_overflow */
2259 	 _bfd_mips_elf_generic_reloc, /* special_function */
2260 	 "R_MICROMIPS_CALL16",	/* name */
2261 	 TRUE,			/* partial_inplace */
2262 	 0x0000ffff,		/* src_mask */
2263 	 0x0000ffff,		/* dst_mask */
2264 	 FALSE),		/* pcrel_offset */
2265 
2266   EMPTY_HOWTO (143),
2267   EMPTY_HOWTO (144),
2268 
2269   /* Displacement in the global offset table.  */
2270   HOWTO (R_MICROMIPS_GOT_DISP,	/* type */
2271 	 0,			/* rightshift */
2272 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2273 	 16,			/* bitsize */
2274 	 FALSE,			/* pc_relative */
2275 	 0,			/* bitpos */
2276 	 complain_overflow_signed, /* complain_on_overflow */
2277 	 _bfd_mips_elf_generic_reloc, /* special_function */
2278 	 "R_MICROMIPS_GOT_DISP",/* name */
2279 	 TRUE,			/* partial_inplace */
2280 	 0x0000ffff,		/* src_mask */
2281 	 0x0000ffff,		/* dst_mask */
2282 	 FALSE),		/* pcrel_offset */
2283 
2284   /* Displacement to page pointer in the global offset table.  */
2285   HOWTO (R_MICROMIPS_GOT_PAGE,	/* type */
2286 	 0,			/* rightshift */
2287 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2288 	 16,			/* bitsize */
2289 	 FALSE,			/* pc_relative */
2290 	 0,			/* bitpos */
2291 	 complain_overflow_signed, /* complain_on_overflow */
2292 	 _bfd_mips_elf_generic_reloc, /* special_function */
2293 	 "R_MICROMIPS_GOT_PAGE",/* name */
2294 	 TRUE,			/* partial_inplace */
2295 	 0x0000ffff,		/* src_mask */
2296 	 0x0000ffff,		/* dst_mask */
2297 	 FALSE),		/* pcrel_offset */
2298 
2299   /* Offset from page pointer in the global offset table.  */
2300   HOWTO (R_MICROMIPS_GOT_OFST,	/* type */
2301 	 0,			/* rightshift */
2302 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2303 	 16,			/* bitsize */
2304 	 FALSE,			/* pc_relative */
2305 	 0,			/* bitpos */
2306 	 complain_overflow_signed, /* complain_on_overflow */
2307 	 _bfd_mips_elf_generic_reloc, /* special_function */
2308 	 "R_MICROMIPS_GOT_OFST",/* name */
2309 	 TRUE,			/* partial_inplace */
2310 	 0x0000ffff,		/* src_mask */
2311 	 0x0000ffff,		/* dst_mask */
2312 	 FALSE),		/* pcrel_offset */
2313 
2314   /* High 16 bits of displacement in global offset table.  */
2315   HOWTO (R_MICROMIPS_GOT_HI16,	/* type */
2316 	 0,			/* rightshift */
2317 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2318 	 16,			/* bitsize */
2319 	 FALSE,			/* pc_relative */
2320 	 0,			/* bitpos */
2321 	 complain_overflow_dont, /* complain_on_overflow */
2322 	 _bfd_mips_elf_generic_reloc, /* special_function */
2323 	 "R_MICROMIPS_GOT_HI16",/* name */
2324 	 TRUE,			/* partial_inplace */
2325 	 0x0000ffff,		/* src_mask */
2326 	 0x0000ffff,		/* dst_mask */
2327 	 FALSE),		/* pcrel_offset */
2328 
2329   /* Low 16 bits of displacement in global offset table.  */
2330   HOWTO (R_MICROMIPS_GOT_LO16,	/* type */
2331 	 0,			/* rightshift */
2332 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2333 	 16,			/* bitsize */
2334 	 FALSE,			/* pc_relative */
2335 	 0,			/* bitpos */
2336 	 complain_overflow_dont, /* complain_on_overflow */
2337 	 _bfd_mips_elf_generic_reloc, /* special_function */
2338 	 "R_MICROMIPS_GOT_LO16",/* name */
2339 	 TRUE,			/* partial_inplace */
2340 	 0x0000ffff,		/* src_mask */
2341 	 0x0000ffff,		/* dst_mask */
2342 	 FALSE),		/* pcrel_offset */
2343 
2344   /* 64 bit subtraction.  Used in the N32 ABI.  */
2345   HOWTO (R_MICROMIPS_SUB,	/* type */
2346 	 0,			/* rightshift */
2347 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
2348 	 64,			/* bitsize */
2349 	 FALSE,			/* pc_relative */
2350 	 0,			/* bitpos */
2351 	 complain_overflow_dont, /* complain_on_overflow */
2352 	 _bfd_mips_elf_generic_reloc, /* special_function */
2353 	 "R_MICROMIPS_SUB",	/* name */
2354 	 TRUE,			/* partial_inplace */
2355 	 MINUS_ONE,		/* src_mask */
2356 	 MINUS_ONE,		/* dst_mask */
2357 	 FALSE),		/* pcrel_offset */
2358 
2359   /* We don't support these for REL relocations, because it means building
2360      the addend from a R_MICROMIPS_HIGHEST/R_MICROMIPS_HIGHER/
2361      R_MICROMIPS_HI16/R_MICROMIPS_LO16 sequence with varying ordering,
2362      using fallable heuristics.  */
2363   EMPTY_HOWTO (R_MICROMIPS_HIGHER),
2364   EMPTY_HOWTO (R_MICROMIPS_HIGHEST),
2365 
2366   /* High 16 bits of displacement in global offset table.  */
2367   HOWTO (R_MICROMIPS_CALL_HI16,	/* type */
2368 	 0,			/* rightshift */
2369 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2370 	 16,			/* bitsize */
2371 	 FALSE,			/* pc_relative */
2372 	 0,			/* bitpos */
2373 	 complain_overflow_dont, /* complain_on_overflow */
2374 	 _bfd_mips_elf_generic_reloc, /* special_function */
2375 	 "R_MICROMIPS_CALL_HI16",/* name */
2376 	 TRUE,			/* partial_inplace */
2377 	 0x0000ffff,		/* src_mask */
2378 	 0x0000ffff,		/* dst_mask */
2379 	 FALSE),		/* pcrel_offset */
2380 
2381   /* Low 16 bits of displacement in global offset table.  */
2382   HOWTO (R_MICROMIPS_CALL_LO16,	/* type */
2383 	 0,			/* rightshift */
2384 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2385 	 16,			/* bitsize */
2386 	 FALSE,			/* pc_relative */
2387 	 0,			/* bitpos */
2388 	 complain_overflow_dont, /* complain_on_overflow */
2389 	 _bfd_mips_elf_generic_reloc, /* special_function */
2390 	 "R_MICROMIPS_CALL_LO16",/* name */
2391 	 TRUE,			/* partial_inplace */
2392 	 0x0000ffff,		/* src_mask */
2393 	 0x0000ffff,		/* dst_mask */
2394 	 FALSE),		/* pcrel_offset */
2395 
2396   /* Section displacement.  */
2397   HOWTO (R_MICROMIPS_SCN_DISP,  /* type */
2398 	 0,			/* rightshift */
2399 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2400 	 32,			/* bitsize */
2401 	 FALSE,			/* pc_relative */
2402 	 0,			/* bitpos */
2403 	 complain_overflow_dont, /* complain_on_overflow */
2404 	 _bfd_mips_elf_generic_reloc, /* special_function */
2405 	 "R_MICROMIPS_SCN_DISP", /* name */
2406 	 TRUE,			/* partial_inplace */
2407 	 0xffffffff,		/* src_mask */
2408 	 0xffffffff,		/* dst_mask */
2409 	 FALSE),		/* pcrel_offset */
2410 
2411   /* Protected jump conversion.  This is an optimization hint.  No
2412      relocation is required for correctness.  */
2413   HOWTO (R_MICROMIPS_JALR,	/* type */
2414 	 0,			/* rightshift */
2415 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2416 	 32,			/* bitsize */
2417 	 FALSE,			/* pc_relative */
2418 	 0,			/* bitpos */
2419 	 complain_overflow_dont, /* complain_on_overflow */
2420 	 _bfd_mips_elf_generic_reloc, /* special_function */
2421 	 "R_MICROMIPS_JALR",	/* name */
2422 	 FALSE,			/* partial_inplace */
2423 	 0,			/* src_mask */
2424 	 0x00000000,		/* dst_mask */
2425 	 FALSE),		/* pcrel_offset */
2426 
2427   /* Low 16 bits of symbol value.  Note that the high 16 bits of symbol values
2428      must be zero.  This is used for relaxation.  */
2429   HOWTO (R_MICROMIPS_HI0_LO16,	/* type */
2430 	 0,			/* rightshift */
2431 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2432 	 16,			/* bitsize */
2433 	 FALSE,			/* pc_relative */
2434 	 0,			/* bitpos */
2435 	 complain_overflow_dont, /* complain_on_overflow */
2436 	 _bfd_mips_elf_generic_reloc, /* special_function */
2437 	 "R_MICROMIPS_HI0_LO16",/* name */
2438 	 TRUE,			/* partial_inplace */
2439 	 0x0000ffff,		/* src_mask */
2440 	 0x0000ffff,		/* dst_mask */
2441 	 FALSE),		/* pcrel_offset */
2442 
2443   EMPTY_HOWTO (158),
2444   EMPTY_HOWTO (159),
2445   EMPTY_HOWTO (160),
2446   EMPTY_HOWTO (161),
2447 
2448   /* TLS general dynamic variable reference.  */
2449   HOWTO (R_MICROMIPS_TLS_GD,		/* type */
2450 	 0,			/* rightshift */
2451 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2452 	 16,			/* bitsize */
2453 	 FALSE,			/* pc_relative */
2454 	 0,			/* bitpos */
2455 	 complain_overflow_signed, /* complain_on_overflow */
2456 	 _bfd_mips_elf_generic_reloc, /* special_function */
2457 	 "R_MICROMIPS_TLS_GD",	/* name */
2458 	 TRUE,			/* partial_inplace */
2459 	 0x0000ffff,		/* src_mask */
2460 	 0x0000ffff,		/* dst_mask */
2461 	 FALSE),		/* pcrel_offset */
2462 
2463   /* TLS local dynamic variable reference.  */
2464   HOWTO (R_MICROMIPS_TLS_LDM,	/* type */
2465 	 0,			/* rightshift */
2466 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2467 	 16,			/* bitsize */
2468 	 FALSE,			/* pc_relative */
2469 	 0,			/* bitpos */
2470 	 complain_overflow_signed, /* complain_on_overflow */
2471 	 _bfd_mips_elf_generic_reloc, /* special_function */
2472 	 "R_MICROMIPS_TLS_LDM",	/* name */
2473 	 TRUE,			/* partial_inplace */
2474 	 0x0000ffff,		/* src_mask */
2475 	 0x0000ffff,		/* dst_mask */
2476 	 FALSE),		/* pcrel_offset */
2477 
2478   /* TLS local dynamic offset.  */
2479   HOWTO (R_MICROMIPS_TLS_DTPREL_HI16,	/* type */
2480 	 0,			/* rightshift */
2481 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2482 	 16,			/* bitsize */
2483 	 FALSE,			/* pc_relative */
2484 	 0,			/* bitpos */
2485 	 complain_overflow_signed, /* complain_on_overflow */
2486 	 _bfd_mips_elf_generic_reloc, /* special_function */
2487 	 "R_MICROMIPS_TLS_DTPREL_HI16",	/* name */
2488 	 TRUE,			/* partial_inplace */
2489 	 0x0000ffff,		/* src_mask */
2490 	 0x0000ffff,		/* dst_mask */
2491 	 FALSE),		/* pcrel_offset */
2492 
2493   /* TLS local dynamic offset.  */
2494   HOWTO (R_MICROMIPS_TLS_DTPREL_LO16,	/* type */
2495 	 0,			/* rightshift */
2496 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2497 	 16,			/* bitsize */
2498 	 FALSE,			/* pc_relative */
2499 	 0,			/* bitpos */
2500 	 complain_overflow_signed, /* complain_on_overflow */
2501 	 _bfd_mips_elf_generic_reloc, /* special_function */
2502 	 "R_MICROMIPS_TLS_DTPREL_LO16",	/* name */
2503 	 TRUE,			/* partial_inplace */
2504 	 0x0000ffff,		/* src_mask */
2505 	 0x0000ffff,		/* dst_mask */
2506 	 FALSE),		/* pcrel_offset */
2507 
2508   /* TLS thread pointer offset.  */
2509   HOWTO (R_MICROMIPS_TLS_GOTTPREL,	/* type */
2510 	 0,			/* rightshift */
2511 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2512 	 16,			/* bitsize */
2513 	 FALSE,			/* pc_relative */
2514 	 0,			/* bitpos */
2515 	 complain_overflow_signed, /* complain_on_overflow */
2516 	 _bfd_mips_elf_generic_reloc, /* special_function */
2517 	 "R_MICROMIPS_TLS_GOTTPREL",	/* name */
2518 	 TRUE,			/* partial_inplace */
2519 	 0x0000ffff,		/* src_mask */
2520 	 0x0000ffff,		/* dst_mask */
2521 	 FALSE),		/* pcrel_offset */
2522 
2523   EMPTY_HOWTO (167),
2524   EMPTY_HOWTO (168),
2525 
2526   /* TLS thread pointer offset.  */
2527   HOWTO (R_MICROMIPS_TLS_TPREL_HI16,	/* type */
2528 	 0,			/* rightshift */
2529 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2530 	 16,			/* bitsize */
2531 	 FALSE,			/* pc_relative */
2532 	 0,			/* bitpos */
2533 	 complain_overflow_signed, /* complain_on_overflow */
2534 	 _bfd_mips_elf_generic_reloc, /* special_function */
2535 	 "R_MICROMIPS_TLS_TPREL_HI16", /* name */
2536 	 TRUE,			/* partial_inplace */
2537 	 0x0000ffff,		/* src_mask */
2538 	 0x0000ffff,		/* dst_mask */
2539 	 FALSE),		/* pcrel_offset */
2540 
2541   /* TLS thread pointer offset.  */
2542   HOWTO (R_MICROMIPS_TLS_TPREL_LO16,	/* type */
2543 	 0,			/* rightshift */
2544 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2545 	 16,			/* bitsize */
2546 	 FALSE,			/* pc_relative */
2547 	 0,			/* bitpos */
2548 	 complain_overflow_signed, /* complain_on_overflow */
2549 	 _bfd_mips_elf_generic_reloc, /* special_function */
2550 	 "R_MICROMIPS_TLS_TPREL_LO16", /* name */
2551 	 TRUE,			/* partial_inplace */
2552 	 0x0000ffff,		/* src_mask */
2553 	 0x0000ffff,		/* dst_mask */
2554 	 FALSE),		/* pcrel_offset */
2555 
2556   EMPTY_HOWTO (171),
2557 
2558   /* GP- and PC-relative relocations.  */
2559   HOWTO (R_MICROMIPS_GPREL7_S2,	/* type */
2560 	 2,			/* rightshift */
2561 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
2562 	 7,			/* bitsize */
2563 	 FALSE,			/* pc_relative */
2564 	 0,			/* bitpos */
2565 	 complain_overflow_signed, /* complain_on_overflow */
2566 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
2567 	 "R_MICROMIPS_GPREL7_S2",	/* name */
2568 	 TRUE,			/* partial_inplace */
2569 	 0x0000007f,		/* src_mask */
2570 	 0x0000007f,		/* dst_mask */
2571 	 FALSE),		/* pcrel_offset */
2572 
2573   HOWTO (R_MICROMIPS_PC23_S2,	/* type */
2574 	 2,			/* rightshift */
2575 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2576 	 23,			/* bitsize */
2577 	 TRUE,			/* pc_relative */
2578 	 0,			/* bitpos */
2579 	 complain_overflow_signed, /* complain_on_overflow */
2580 	 _bfd_mips_elf_generic_reloc, /* special_function */
2581 	 "R_MICROMIPS_PC23_S2",	/* name */
2582 	 TRUE,			/* partial_inplace */
2583 	 0x007fffff,		/* src_mask */
2584 	 0x007fffff,		/* dst_mask */
2585 	 TRUE),			/* pcrel_offset */
2586 };
2587 
2588 static reloc_howto_type micromips_elf64_howto_table_rela[] =
2589 {
2590   EMPTY_HOWTO (130),
2591   EMPTY_HOWTO (131),
2592   EMPTY_HOWTO (132),
2593 
2594   /* 26 bit jump address.  */
2595   HOWTO (R_MICROMIPS_26_S1,	/* type */
2596 	 1,			/* rightshift */
2597 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2598 	 26,			/* bitsize */
2599 	 FALSE,			/* pc_relative */
2600 	 0,			/* bitpos */
2601 	 complain_overflow_dont, /* complain_on_overflow */
2602 				/* This needs complex overflow
2603 				   detection, because the upper four
2604 				   bits must match the PC.  */
2605 	 _bfd_mips_elf_generic_reloc, /* special_function */
2606 	 "R_MICROMIPS_26_S1",	/* name */
2607 	 FALSE,			/* partial_inplace */
2608 	 0,			/* src_mask */
2609 	 0x3ffffff,		/* dst_mask */
2610 	 FALSE),		/* pcrel_offset */
2611 
2612   /* High 16 bits of symbol value.  */
2613   HOWTO (R_MICROMIPS_HI16,	/* type */
2614 	 16,			/* rightshift */
2615 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2616 	 16,			/* bitsize */
2617 	 FALSE,			/* pc_relative */
2618 	 0,			/* bitpos */
2619 	 complain_overflow_dont, /* complain_on_overflow */
2620 	 _bfd_mips_elf_hi16_reloc, /* special_function */
2621 	 "R_MICROMIPS_HI16",	/* name */
2622 	 FALSE,			/* partial_inplace */
2623 	 0,			/* src_mask */
2624 	 0x0000ffff,		/* dst_mask */
2625 	 FALSE),		/* pcrel_offset */
2626 
2627   /* Low 16 bits of symbol value.  */
2628   HOWTO (R_MICROMIPS_LO16,	/* type */
2629 	 0,			/* rightshift */
2630 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2631 	 16,			/* bitsize */
2632 	 FALSE,			/* pc_relative */
2633 	 0,			/* bitpos */
2634 	 complain_overflow_dont, /* complain_on_overflow */
2635 	 _bfd_mips_elf_lo16_reloc, /* special_function */
2636 	 "R_MICROMIPS_LO16",	/* name */
2637 	 FALSE,			/* partial_inplace */
2638 	 0,			/* src_mask */
2639 	 0x0000ffff,		/* dst_mask */
2640 	 FALSE),		/* pcrel_offset */
2641 
2642   /* GP relative reference.  */
2643   HOWTO (R_MICROMIPS_GPREL16,	/* type */
2644 	 0,			/* rightshift */
2645 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2646 	 16,			/* bitsize */
2647 	 FALSE,			/* pc_relative */
2648 	 0,			/* bitpos */
2649 	 complain_overflow_signed, /* complain_on_overflow */
2650 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
2651 	 "R_MICROMIPS_GPREL16",	/* name */
2652 	 FALSE,			/* partial_inplace */
2653 	 0,			/* src_mask */
2654 	 0x0000ffff,		/* dst_mask */
2655 	 FALSE),		/* pcrel_offset */
2656 
2657   /* Reference to literal section.  */
2658   HOWTO (R_MICROMIPS_LITERAL,	/* type */
2659 	 0,			/* rightshift */
2660 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2661 	 16,			/* bitsize */
2662 	 FALSE,			/* pc_relative */
2663 	 0,			/* bitpos */
2664 	 complain_overflow_signed, /* complain_on_overflow */
2665 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
2666 	 "R_MICROMIPS_LITERAL",	/* name */
2667 	 FALSE,			/* partial_inplace */
2668 	 0,			/* src_mask */
2669 	 0x0000ffff,		/* dst_mask */
2670 	 FALSE),		/* pcrel_offset */
2671 
2672   /* Reference to global offset table.  */
2673   HOWTO (R_MICROMIPS_GOT16,	/* type */
2674 	 0,			/* rightshift */
2675 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2676 	 16,			/* bitsize */
2677 	 FALSE,			/* pc_relative */
2678 	 0,			/* bitpos */
2679 	 complain_overflow_signed, /* complain_on_overflow */
2680 	 _bfd_mips_elf_got16_reloc, /* special_function */
2681 	 "R_MICROMIPS_GOT16",	/* name */
2682 	 FALSE,			/* partial_inplace */
2683 	 0,			/* src_mask */
2684 	 0x0000ffff,		/* dst_mask */
2685 	 FALSE),		/* pcrel_offset */
2686 
2687   /* This is for microMIPS branches.  */
2688   HOWTO (R_MICROMIPS_PC7_S1,	/* type */
2689 	 1,			/* rightshift */
2690 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
2691 	 7,			/* bitsize */
2692 	 TRUE,			/* pc_relative */
2693 	 0,			/* bitpos */
2694 	 complain_overflow_signed, /* complain_on_overflow */
2695 	 _bfd_mips_elf_generic_reloc, /* special_function */
2696 	 "R_MICROMIPS_PC7_S1",	/* name */
2697 	 FALSE,			/* partial_inplace */
2698 	 0,			/* src_mask */
2699 	 0x0000007f,		/* dst_mask */
2700 	 TRUE),			/* pcrel_offset */
2701 
2702   HOWTO (R_MICROMIPS_PC10_S1,	/* type */
2703 	 1,			/* rightshift */
2704 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
2705 	 10,			/* bitsize */
2706 	 TRUE,			/* pc_relative */
2707 	 0,			/* bitpos */
2708 	 complain_overflow_signed, /* complain_on_overflow */
2709 	 _bfd_mips_elf_generic_reloc, /* special_function */
2710 	 "R_MICROMIPS_PC10_S1",	/* name */
2711 	 FALSE,			/* partial_inplace */
2712 	 0,			/* src_mask */
2713 	 0x000003ff,		/* dst_mask */
2714 	 TRUE),			/* pcrel_offset */
2715 
2716   HOWTO (R_MICROMIPS_PC16_S1,	/* type */
2717 	 1,			/* rightshift */
2718 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2719 	 16,			/* bitsize */
2720 	 TRUE,			/* pc_relative */
2721 	 0,			/* bitpos */
2722 	 complain_overflow_signed, /* complain_on_overflow */
2723 	 _bfd_mips_elf_generic_reloc, /* special_function */
2724 	 "R_MICROMIPS_PC16_S1",	/* name */
2725 	 FALSE,			/* partial_inplace */
2726 	 0,			/* src_mask */
2727 	 0x0000ffff,		/* dst_mask */
2728 	 TRUE),			/* pcrel_offset */
2729 
2730   /* 16 bit call through global offset table.  */
2731   HOWTO (R_MICROMIPS_CALL16,	/* type */
2732 	 0,			/* rightshift */
2733 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2734 	 16,			/* bitsize */
2735 	 FALSE,			/* pc_relative */
2736 	 0,			/* bitpos */
2737 	 complain_overflow_signed, /* complain_on_overflow */
2738 	 _bfd_mips_elf_generic_reloc, /* special_function */
2739 	 "R_MICROMIPS_CALL16",	/* name */
2740 	 FALSE,			/* partial_inplace */
2741 	 0,			/* src_mask */
2742 	 0x0000ffff,		/* dst_mask */
2743 	 FALSE),		/* pcrel_offset */
2744 
2745   EMPTY_HOWTO (143),
2746   EMPTY_HOWTO (144),
2747 
2748   /* Displacement in the global offset table.  */
2749   HOWTO (R_MICROMIPS_GOT_DISP,	/* type */
2750 	 0,			/* rightshift */
2751 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2752 	 16,			/* bitsize */
2753 	 FALSE,			/* pc_relative */
2754 	 0,			/* bitpos */
2755 	 complain_overflow_signed, /* complain_on_overflow */
2756 	 _bfd_mips_elf_generic_reloc, /* special_function */
2757 	 "R_MICROMIPS_GOT_DISP",/* name */
2758 	 FALSE,			/* partial_inplace */
2759 	 0,			/* src_mask */
2760 	 0x0000ffff,		/* dst_mask */
2761 	 FALSE),		/* pcrel_offset */
2762 
2763   /* Displacement to page pointer in the global offset table.  */
2764   HOWTO (R_MICROMIPS_GOT_PAGE,	/* type */
2765 	 0,			/* rightshift */
2766 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2767 	 16,			/* bitsize */
2768 	 FALSE,			/* pc_relative */
2769 	 0,			/* bitpos */
2770 	 complain_overflow_signed, /* complain_on_overflow */
2771 	 _bfd_mips_elf_generic_reloc, /* special_function */
2772 	 "R_MICROMIPS_GOT_PAGE",/* name */
2773 	 FALSE,			/* partial_inplace */
2774 	 0,			/* src_mask */
2775 	 0x0000ffff,		/* dst_mask */
2776 	 FALSE),		/* pcrel_offset */
2777 
2778   /* Offset from page pointer in the global offset table.  */
2779   HOWTO (R_MICROMIPS_GOT_OFST,	/* type */
2780 	 0,			/* rightshift */
2781 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2782 	 16,			/* bitsize */
2783 	 FALSE,			/* pc_relative */
2784 	 0,			/* bitpos */
2785 	 complain_overflow_signed, /* complain_on_overflow */
2786 	 _bfd_mips_elf_generic_reloc, /* special_function */
2787 	 "R_MICROMIPS_GOT_OFST",/* name */
2788 	 FALSE,			/* partial_inplace */
2789 	 0,			/* src_mask */
2790 	 0x0000ffff,		/* dst_mask */
2791 	 FALSE),		/* pcrel_offset */
2792 
2793   /* High 16 bits of displacement in global offset table.  */
2794   HOWTO (R_MICROMIPS_GOT_HI16,	/* type */
2795 	 0,			/* rightshift */
2796 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2797 	 16,			/* bitsize */
2798 	 FALSE,			/* pc_relative */
2799 	 0,			/* bitpos */
2800 	 complain_overflow_dont, /* complain_on_overflow */
2801 	 _bfd_mips_elf_generic_reloc, /* special_function */
2802 	 "R_MICROMIPS_GOT_HI16",/* name */
2803 	 FALSE,			/* partial_inplace */
2804 	 0,			/* src_mask */
2805 	 0x0000ffff,		/* dst_mask */
2806 	 FALSE),		/* pcrel_offset */
2807 
2808   /* Low 16 bits of displacement in global offset table.  */
2809   HOWTO (R_MICROMIPS_GOT_LO16,	/* type */
2810 	 0,			/* rightshift */
2811 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2812 	 16,			/* bitsize */
2813 	 FALSE,			/* pc_relative */
2814 	 0,			/* bitpos */
2815 	 complain_overflow_dont, /* complain_on_overflow */
2816 	 _bfd_mips_elf_generic_reloc, /* special_function */
2817 	 "R_MICROMIPS_GOT_LO16",/* name */
2818 	 FALSE,			/* partial_inplace */
2819 	 0,			/* src_mask */
2820 	 0x0000ffff,		/* dst_mask */
2821 	 FALSE),		/* pcrel_offset */
2822 
2823   /* 64 bit subtraction.  Used in the N32 ABI.  */
2824   HOWTO (R_MICROMIPS_SUB,	/* type */
2825 	 0,			/* rightshift */
2826 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
2827 	 64,			/* bitsize */
2828 	 FALSE,			/* pc_relative */
2829 	 0,			/* bitpos */
2830 	 complain_overflow_dont, /* complain_on_overflow */
2831 	 _bfd_mips_elf_generic_reloc, /* special_function */
2832 	 "R_MICROMIPS_SUB",	/* name */
2833 	 FALSE,			/* partial_inplace */
2834 	 0,			/* src_mask */
2835 	 MINUS_ONE,		/* dst_mask */
2836 	 FALSE),		/* pcrel_offset */
2837 
2838   /* Get the higher value of a 64 bit addend.  */
2839   HOWTO (R_MICROMIPS_HIGHER,	/* type */
2840 	 0,			/* rightshift */
2841 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2842 	 16,			/* bitsize */
2843 	 FALSE,			/* pc_relative */
2844 	 0,			/* bitpos */
2845 	 complain_overflow_dont, /* complain_on_overflow */
2846 	 _bfd_mips_elf_generic_reloc, /* special_function */
2847 	 "R_MICROMIPS_HIGHER",	/* name */
2848 	 FALSE,			/* partial_inplace */
2849 	 0,			/* src_mask */
2850 	 0x0000ffff,		/* dst_mask */
2851 	 FALSE),		/* pcrel_offset */
2852 
2853   /* Get the highest value of a 64 bit addend.  */
2854   HOWTO (R_MICROMIPS_HIGHEST,	/* type */
2855 	 0,			/* rightshift */
2856 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2857 	 16,			/* bitsize */
2858 	 FALSE,			/* pc_relative */
2859 	 0,			/* bitpos */
2860 	 complain_overflow_dont, /* complain_on_overflow */
2861 	 _bfd_mips_elf_generic_reloc, /* special_function */
2862 	 "R_MICROMIPS_HIGHEST",	/* name */
2863 	 FALSE,			/* partial_inplace */
2864 	 0,			/* src_mask */
2865 	 0x0000ffff,		/* dst_mask */
2866 	 FALSE),		/* pcrel_offset */
2867 
2868   /* High 16 bits of displacement in global offset table.  */
2869   HOWTO (R_MICROMIPS_CALL_HI16,	/* type */
2870 	 0,			/* rightshift */
2871 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2872 	 16,			/* bitsize */
2873 	 FALSE,			/* pc_relative */
2874 	 0,			/* bitpos */
2875 	 complain_overflow_dont, /* complain_on_overflow */
2876 	 _bfd_mips_elf_generic_reloc, /* special_function */
2877 	 "R_MICROMIPS_CALL_HI16",/* name */
2878 	 FALSE,			/* partial_inplace */
2879 	 0,			/* src_mask */
2880 	 0x0000ffff,		/* dst_mask */
2881 	 FALSE),		/* pcrel_offset */
2882 
2883   /* Low 16 bits of displacement in global offset table.  */
2884   HOWTO (R_MICROMIPS_CALL_LO16,	/* type */
2885 	 0,			/* rightshift */
2886 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2887 	 16,			/* bitsize */
2888 	 FALSE,			/* pc_relative */
2889 	 0,			/* bitpos */
2890 	 complain_overflow_dont, /* complain_on_overflow */
2891 	 _bfd_mips_elf_generic_reloc, /* special_function */
2892 	 "R_MICROMIPS_CALL_LO16",/* name */
2893 	 FALSE,			/* partial_inplace */
2894 	 0,			/* src_mask */
2895 	 0x0000ffff,		/* dst_mask */
2896 	 FALSE),		/* pcrel_offset */
2897 
2898   /* Section displacement.  */
2899   HOWTO (R_MICROMIPS_SCN_DISP,  /* type */
2900 	 0,			/* rightshift */
2901 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2902 	 32,			/* bitsize */
2903 	 FALSE,			/* pc_relative */
2904 	 0,			/* bitpos */
2905 	 complain_overflow_dont, /* complain_on_overflow */
2906 	 _bfd_mips_elf_generic_reloc, /* special_function */
2907 	 "R_MICROMIPS_SCN_DISP", /* name */
2908 	 FALSE,			/* partial_inplace */
2909 	 0,			/* src_mask */
2910 	 0xffffffff,		/* dst_mask */
2911 	 FALSE),		/* pcrel_offset */
2912 
2913   /* Protected jump conversion.  This is an optimization hint.  No
2914      relocation is required for correctness.  */
2915   HOWTO (R_MICROMIPS_JALR,	/* type */
2916 	 0,			/* rightshift */
2917 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2918 	 32,			/* bitsize */
2919 	 FALSE,			/* pc_relative */
2920 	 0,			/* bitpos */
2921 	 complain_overflow_dont, /* complain_on_overflow */
2922 	 _bfd_mips_elf_generic_reloc, /* special_function */
2923 	 "R_MICROMIPS_JALR",	/* name */
2924 	 FALSE,			/* partial_inplace */
2925 	 0,			/* src_mask */
2926 	 0x00000000,		/* dst_mask */
2927 	 FALSE),		/* pcrel_offset */
2928 
2929   /* Low 16 bits of symbol value.  Note that the high 16 bits of symbol values
2930      must be zero.  This is used for relaxation.  */
2931   HOWTO (R_MICROMIPS_HI0_LO16,	/* type */
2932 	 0,			/* rightshift */
2933 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2934 	 16,			/* bitsize */
2935 	 FALSE,			/* pc_relative */
2936 	 0,			/* bitpos */
2937 	 complain_overflow_dont, /* complain_on_overflow */
2938 	 _bfd_mips_elf_generic_reloc, /* special_function */
2939 	 "R_MICROMIPS_HI0_LO16",/* name */
2940 	 FALSE,			/* partial_inplace */
2941 	 0,			/* src_mask */
2942 	 0x0000ffff,		/* dst_mask */
2943 	 FALSE),		/* pcrel_offset */
2944 
2945   EMPTY_HOWTO (158),
2946   EMPTY_HOWTO (159),
2947   EMPTY_HOWTO (160),
2948   EMPTY_HOWTO (161),
2949 
2950   /* TLS general dynamic variable reference.  */
2951   HOWTO (R_MICROMIPS_TLS_GD,		/* type */
2952 	 0,			/* rightshift */
2953 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2954 	 16,			/* bitsize */
2955 	 FALSE,			/* pc_relative */
2956 	 0,			/* bitpos */
2957 	 complain_overflow_signed, /* complain_on_overflow */
2958 	 _bfd_mips_elf_generic_reloc, /* special_function */
2959 	 "R_MICROMIPS_TLS_GD",	/* name */
2960 	 FALSE,			/* partial_inplace */
2961 	 0,			/* src_mask */
2962 	 0x0000ffff,		/* dst_mask */
2963 	 FALSE),		/* pcrel_offset */
2964 
2965   /* TLS local dynamic variable reference.  */
2966   HOWTO (R_MICROMIPS_TLS_LDM,	/* type */
2967 	 0,			/* rightshift */
2968 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2969 	 16,			/* bitsize */
2970 	 FALSE,			/* pc_relative */
2971 	 0,			/* bitpos */
2972 	 complain_overflow_signed, /* complain_on_overflow */
2973 	 _bfd_mips_elf_generic_reloc, /* special_function */
2974 	 "R_MICROMIPS_TLS_LDM",	/* name */
2975 	 FALSE,			/* partial_inplace */
2976 	 0,			/* src_mask */
2977 	 0x0000ffff,		/* dst_mask */
2978 	 FALSE),		/* pcrel_offset */
2979 
2980   /* TLS local dynamic offset.  */
2981   HOWTO (R_MICROMIPS_TLS_DTPREL_HI16,	/* type */
2982 	 0,			/* rightshift */
2983 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2984 	 16,			/* bitsize */
2985 	 FALSE,			/* pc_relative */
2986 	 0,			/* bitpos */
2987 	 complain_overflow_signed, /* complain_on_overflow */
2988 	 _bfd_mips_elf_generic_reloc, /* special_function */
2989 	 "R_MICROMIPS_TLS_DTPREL_HI16",	/* name */
2990 	 FALSE,			/* partial_inplace */
2991 	 0,			/* src_mask */
2992 	 0x0000ffff,		/* dst_mask */
2993 	 FALSE),		/* pcrel_offset */
2994 
2995   /* TLS local dynamic offset.  */
2996   HOWTO (R_MICROMIPS_TLS_DTPREL_LO16,	/* type */
2997 	 0,			/* rightshift */
2998 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2999 	 16,			/* bitsize */
3000 	 FALSE,			/* pc_relative */
3001 	 0,			/* bitpos */
3002 	 complain_overflow_signed, /* complain_on_overflow */
3003 	 _bfd_mips_elf_generic_reloc, /* special_function */
3004 	 "R_MICROMIPS_TLS_DTPREL_LO16",	/* name */
3005 	 FALSE,			/* partial_inplace */
3006 	 0,			/* src_mask */
3007 	 0x0000ffff,		/* dst_mask */
3008 	 FALSE),		/* pcrel_offset */
3009 
3010   /* TLS thread pointer offset.  */
3011   HOWTO (R_MICROMIPS_TLS_GOTTPREL,	/* type */
3012 	 0,			/* rightshift */
3013 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
3014 	 16,			/* bitsize */
3015 	 FALSE,			/* pc_relative */
3016 	 0,			/* bitpos */
3017 	 complain_overflow_signed, /* complain_on_overflow */
3018 	 _bfd_mips_elf_generic_reloc, /* special_function */
3019 	 "R_MICROMIPS_TLS_GOTTPREL",	/* name */
3020 	 FALSE,			/* partial_inplace */
3021 	 0,			/* src_mask */
3022 	 0x0000ffff,		/* dst_mask */
3023 	 FALSE),		/* pcrel_offset */
3024 
3025   EMPTY_HOWTO (167),
3026   EMPTY_HOWTO (168),
3027 
3028   /* TLS thread pointer offset.  */
3029   HOWTO (R_MICROMIPS_TLS_TPREL_HI16,	/* type */
3030 	 0,			/* rightshift */
3031 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
3032 	 16,			/* bitsize */
3033 	 FALSE,			/* pc_relative */
3034 	 0,			/* bitpos */
3035 	 complain_overflow_signed, /* complain_on_overflow */
3036 	 _bfd_mips_elf_generic_reloc, /* special_function */
3037 	 "R_MICROMIPS_TLS_TPREL_HI16", /* name */
3038 	 FALSE,			/* partial_inplace */
3039 	 0,			/* src_mask */
3040 	 0x0000ffff,		/* dst_mask */
3041 	 FALSE),		/* pcrel_offset */
3042 
3043   /* TLS thread pointer offset.  */
3044   HOWTO (R_MICROMIPS_TLS_TPREL_LO16,	/* type */
3045 	 0,			/* rightshift */
3046 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
3047 	 16,			/* bitsize */
3048 	 FALSE,			/* pc_relative */
3049 	 0,			/* bitpos */
3050 	 complain_overflow_signed, /* complain_on_overflow */
3051 	 _bfd_mips_elf_generic_reloc, /* special_function */
3052 	 "R_MICROMIPS_TLS_TPREL_LO16", /* name */
3053 	 FALSE,			/* partial_inplace */
3054 	 0,			/* src_mask */
3055 	 0x0000ffff,		/* dst_mask */
3056 	 FALSE),		/* pcrel_offset */
3057 
3058   EMPTY_HOWTO (171),
3059 
3060   /* GP- and PC-relative relocations.  */
3061   HOWTO (R_MICROMIPS_GPREL7_S2,	/* type */
3062 	 2,			/* rightshift */
3063 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
3064 	 7,			/* bitsize */
3065 	 FALSE,			/* pc_relative */
3066 	 0,			/* bitpos */
3067 	 complain_overflow_signed, /* complain_on_overflow */
3068 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
3069 	 "R_MICROMIPS_GPREL7_S2",	/* name */
3070 	 FALSE,			/* partial_inplace */
3071 	 0,			/* src_mask */
3072 	 0x0000007f,		/* dst_mask */
3073 	 FALSE),		/* pcrel_offset */
3074 
3075   HOWTO (R_MICROMIPS_PC23_S2,	/* type */
3076 	 2,			/* rightshift */
3077 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
3078 	 23,			/* bitsize */
3079 	 TRUE,			/* pc_relative */
3080 	 0,			/* bitpos */
3081 	 complain_overflow_signed, /* complain_on_overflow */
3082 	 _bfd_mips_elf_generic_reloc, /* special_function */
3083 	 "R_MICROMIPS_PC23_S2",	/* name */
3084 	 FALSE,			/* partial_inplace */
3085 	 0,			/* src_mask */
3086 	 0x007fffff,		/* dst_mask */
3087 	 TRUE),			/* pcrel_offset */
3088 };
3089 
3090 /* GNU extension to record C++ vtable hierarchy */
3091 static reloc_howto_type elf_mips_gnu_vtinherit_howto =
3092   HOWTO (R_MIPS_GNU_VTINHERIT,	/* type */
3093 	 0,			/* rightshift */
3094 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
3095 	 0,			/* bitsize */
3096 	 FALSE,			/* pc_relative */
3097 	 0,			/* bitpos */
3098 	 complain_overflow_dont, /* complain_on_overflow */
3099 	 NULL,			/* special_function */
3100 	 "R_MIPS_GNU_VTINHERIT", /* name */
3101 	 FALSE,			/* partial_inplace */
3102 	 0,			/* src_mask */
3103 	 0,			/* dst_mask */
3104 	 FALSE);		/* pcrel_offset */
3105 
3106 /* GNU extension to record C++ vtable member usage */
3107 static reloc_howto_type elf_mips_gnu_vtentry_howto =
3108   HOWTO (R_MIPS_GNU_VTENTRY,	/* type */
3109 	 0,			/* rightshift */
3110 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
3111 	 0,			/* bitsize */
3112 	 FALSE,			/* pc_relative */
3113 	 0,			/* bitpos */
3114 	 complain_overflow_dont, /* complain_on_overflow */
3115 	 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
3116 	 "R_MIPS_GNU_VTENTRY",	/* name */
3117 	 FALSE,			/* partial_inplace */
3118 	 0,			/* src_mask */
3119 	 0,			/* dst_mask */
3120 	 FALSE);		/* pcrel_offset */
3121 
3122 /* 16 bit offset for pc-relative branches.  */
3123 static reloc_howto_type elf_mips_gnu_rel16_s2 =
3124   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
3125 	 2,			/* rightshift */
3126 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
3127 	 16,			/* bitsize */
3128 	 TRUE,			/* pc_relative */
3129 	 0,			/* bitpos */
3130 	 complain_overflow_signed, /* complain_on_overflow */
3131 	 _bfd_mips_elf_generic_reloc,	/* special_function */
3132 	 "R_MIPS_GNU_REL16_S2",	/* name */
3133 	 TRUE,			/* partial_inplace */
3134 	 0x0000ffff,		/* src_mask */
3135 	 0x0000ffff,		/* dst_mask */
3136 	 TRUE);			/* pcrel_offset */
3137 
3138 /* 16 bit offset for pc-relative branches.  */
3139 static reloc_howto_type elf_mips_gnu_rela16_s2 =
3140   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
3141 	 2,			/* rightshift */
3142 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
3143 	 16,			/* bitsize */
3144 	 TRUE,			/* pc_relative */
3145 	 0,			/* bitpos */
3146 	 complain_overflow_signed, /* complain_on_overflow */
3147 	 _bfd_mips_elf_generic_reloc,	/* special_function */
3148 	 "R_MIPS_GNU_REL16_S2",	/* name */
3149 	 FALSE,			/* partial_inplace */
3150 	 0,			/* src_mask */
3151 	 0x0000ffff,		/* dst_mask */
3152 	 TRUE);			/* pcrel_offset */
3153 
3154 /* 32 bit pc-relative.  Used for compact EH tables.  */
3155 static reloc_howto_type elf_mips_gnu_pcrel32 =
3156   HOWTO (R_MIPS_PC32,		/* type */
3157 	 0,			/* rightshift */
3158 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
3159 	 32,			/* bitsize */
3160 	 TRUE,			/* pc_relative */
3161 	 0,			/* bitpos */
3162 	 complain_overflow_signed, /* complain_on_overflow */
3163 	 _bfd_mips_elf_generic_reloc, /* special_function */
3164 	 "R_MIPS_PC32",		/* name */
3165 	 TRUE,			/* partial_inplace */
3166 	 0xffffffff,		/* src_mask */
3167 	 0xffffffff,		/* dst_mask */
3168 	 TRUE);			/* pcrel_offset */
3169 
3170 
3171 /* Originally a VxWorks extension, but now used for other systems too.  */
3172 static reloc_howto_type elf_mips_copy_howto =
3173   HOWTO (R_MIPS_COPY,		/* type */
3174 	 0,			/* rightshift */
3175 	 0,			/* this one is variable size */
3176 	 0,			/* bitsize */
3177 	 FALSE,			/* pc_relative */
3178 	 0,			/* bitpos */
3179 	 complain_overflow_bitfield, /* complain_on_overflow */
3180 	 _bfd_mips_elf_generic_reloc, /* special_function */
3181 	 "R_MIPS_COPY",		/* name */
3182 	 FALSE,			/* partial_inplace */
3183 	 0x0,			/* src_mask */
3184 	 0x0,			/* dst_mask */
3185 	 FALSE);		/* pcrel_offset */
3186 
3187 /* Originally a VxWorks extension, but now used for other systems too.  */
3188 static reloc_howto_type elf_mips_jump_slot_howto =
3189   HOWTO (R_MIPS_JUMP_SLOT,	/* type */
3190 	 0,			/* rightshift */
3191 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
3192 	 64,			/* bitsize */
3193 	 FALSE,			/* pc_relative */
3194 	 0,			/* bitpos */
3195 	 complain_overflow_bitfield, /* complain_on_overflow */
3196 	 _bfd_mips_elf_generic_reloc, /* special_function */
3197 	 "R_MIPS_JUMP_SLOT",	/* name */
3198 	 FALSE,			/* partial_inplace */
3199 	 0x0,			/* src_mask */
3200 	 0x0,			/* dst_mask */
3201 	 FALSE);		/* pcrel_offset */
3202 
3203 /* Used in EH tables.  */
3204 static reloc_howto_type elf_mips_eh_howto =
3205   HOWTO (R_MIPS_EH,		/* type */
3206 	 0,			/* rightshift */
3207 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
3208 	 32,			/* bitsize */
3209 	 FALSE,			/* pc_relative */
3210 	 0,			/* bitpos */
3211 	 complain_overflow_signed, /* complain_on_overflow */
3212 	 _bfd_mips_elf_generic_reloc, /* special_function */
3213 	 "R_MIPS_EH",		/* name */
3214 	 TRUE,			/* partial_inplace */
3215 	 0xffffffff,		/* src_mask */
3216 	 0xffffffff,		/* dst_mask */
3217 	 FALSE);		/* pcrel_offset */
3218 
3219 
3220 /* Swap in a MIPS 64-bit Rel reloc.  */
3221 
3222 static void
3223 mips_elf64_swap_reloc_in (bfd *abfd, const Elf64_Mips_External_Rel *src,
3224 			  Elf64_Mips_Internal_Rela *dst)
3225 {
3226   dst->r_offset = H_GET_64 (abfd, src->r_offset);
3227   dst->r_sym = H_GET_32 (abfd, src->r_sym);
3228   dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
3229   dst->r_type3 = H_GET_8 (abfd, src->r_type3);
3230   dst->r_type2 = H_GET_8 (abfd, src->r_type2);
3231   dst->r_type = H_GET_8 (abfd, src->r_type);
3232   dst->r_addend = 0;
3233 }
3234 
3235 /* Swap in a MIPS 64-bit Rela reloc.  */
3236 
3237 static void
3238 mips_elf64_swap_reloca_in (bfd *abfd, const Elf64_Mips_External_Rela *src,
3239 			   Elf64_Mips_Internal_Rela *dst)
3240 {
3241   dst->r_offset = H_GET_64 (abfd, src->r_offset);
3242   dst->r_sym = H_GET_32 (abfd, src->r_sym);
3243   dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
3244   dst->r_type3 = H_GET_8 (abfd, src->r_type3);
3245   dst->r_type2 = H_GET_8 (abfd, src->r_type2);
3246   dst->r_type = H_GET_8 (abfd, src->r_type);
3247   dst->r_addend = H_GET_S64 (abfd, src->r_addend);
3248 }
3249 
3250 /* Swap out a MIPS 64-bit Rel reloc.  */
3251 
3252 static void
3253 mips_elf64_swap_reloc_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
3254 			   Elf64_Mips_External_Rel *dst)
3255 {
3256   H_PUT_64 (abfd, src->r_offset, dst->r_offset);
3257   H_PUT_32 (abfd, src->r_sym, dst->r_sym);
3258   H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
3259   H_PUT_8 (abfd, src->r_type3, dst->r_type3);
3260   H_PUT_8 (abfd, src->r_type2, dst->r_type2);
3261   H_PUT_8 (abfd, src->r_type, dst->r_type);
3262 }
3263 
3264 /* Swap out a MIPS 64-bit Rela reloc.  */
3265 
3266 static void
3267 mips_elf64_swap_reloca_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
3268 			    Elf64_Mips_External_Rela *dst)
3269 {
3270   H_PUT_64 (abfd, src->r_offset, dst->r_offset);
3271   H_PUT_32 (abfd, src->r_sym, dst->r_sym);
3272   H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
3273   H_PUT_8 (abfd, src->r_type3, dst->r_type3);
3274   H_PUT_8 (abfd, src->r_type2, dst->r_type2);
3275   H_PUT_8 (abfd, src->r_type, dst->r_type);
3276   H_PUT_S64 (abfd, src->r_addend, dst->r_addend);
3277 }
3278 
3279 /* Swap in a MIPS 64-bit Rel reloc.  */
3280 
3281 static void
3282 mips_elf64_be_swap_reloc_in (bfd *abfd, const bfd_byte *src,
3283 			     Elf_Internal_Rela *dst)
3284 {
3285   Elf64_Mips_Internal_Rela mirel;
3286 
3287   mips_elf64_swap_reloc_in (abfd,
3288 			    (const Elf64_Mips_External_Rel *) src,
3289 			    &mirel);
3290 
3291   dst[0].r_offset = mirel.r_offset;
3292   dst[0].r_info = ELF64_R_INFO (mirel.r_sym, mirel.r_type);
3293   dst[0].r_addend = 0;
3294   dst[1].r_offset = mirel.r_offset;
3295   dst[1].r_info = ELF64_R_INFO (mirel.r_ssym, mirel.r_type2);
3296   dst[1].r_addend = 0;
3297   dst[2].r_offset = mirel.r_offset;
3298   dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirel.r_type3);
3299   dst[2].r_addend = 0;
3300 }
3301 
3302 /* Swap in a MIPS 64-bit Rela reloc.  */
3303 
3304 static void
3305 mips_elf64_be_swap_reloca_in (bfd *abfd, const bfd_byte *src,
3306 			      Elf_Internal_Rela *dst)
3307 {
3308   Elf64_Mips_Internal_Rela mirela;
3309 
3310   mips_elf64_swap_reloca_in (abfd,
3311 			     (const Elf64_Mips_External_Rela *) src,
3312 			     &mirela);
3313 
3314   dst[0].r_offset = mirela.r_offset;
3315   dst[0].r_info = ELF64_R_INFO (mirela.r_sym, mirela.r_type);
3316   dst[0].r_addend = mirela.r_addend;
3317   dst[1].r_offset = mirela.r_offset;
3318   dst[1].r_info = ELF64_R_INFO (mirela.r_ssym, mirela.r_type2);
3319   dst[1].r_addend = 0;
3320   dst[2].r_offset = mirela.r_offset;
3321   dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirela.r_type3);
3322   dst[2].r_addend = 0;
3323 }
3324 
3325 /* Swap out a MIPS 64-bit Rel reloc.  */
3326 
3327 static void
3328 mips_elf64_be_swap_reloc_out (bfd *abfd, const Elf_Internal_Rela *src,
3329 			      bfd_byte *dst)
3330 {
3331   Elf64_Mips_Internal_Rela mirel;
3332 
3333   mirel.r_offset = src[0].r_offset;
3334   BFD_ASSERT(src[0].r_offset == src[1].r_offset);
3335   BFD_ASSERT(src[0].r_offset == src[2].r_offset);
3336 
3337   mirel.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
3338   mirel.r_sym = ELF64_R_SYM (src[0].r_info);
3339   mirel.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
3340   mirel.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
3341   mirel.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
3342 
3343   mips_elf64_swap_reloc_out (abfd, &mirel,
3344 			     (Elf64_Mips_External_Rel *) dst);
3345 }
3346 
3347 /* Swap out a MIPS 64-bit Rela reloc.  */
3348 
3349 static void
3350 mips_elf64_be_swap_reloca_out (bfd *abfd, const Elf_Internal_Rela *src,
3351 			       bfd_byte *dst)
3352 {
3353   Elf64_Mips_Internal_Rela mirela;
3354 
3355   mirela.r_offset = src[0].r_offset;
3356   BFD_ASSERT(src[0].r_offset == src[1].r_offset);
3357   BFD_ASSERT(src[0].r_offset == src[2].r_offset);
3358 
3359   mirela.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
3360   mirela.r_sym = ELF64_R_SYM (src[0].r_info);
3361   mirela.r_addend = src[0].r_addend;
3362   BFD_ASSERT(src[1].r_addend == 0);
3363   BFD_ASSERT(src[2].r_addend == 0);
3364 
3365   mirela.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
3366   mirela.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
3367   mirela.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
3368 
3369   mips_elf64_swap_reloca_out (abfd, &mirela,
3370 			      (Elf64_Mips_External_Rela *) dst);
3371 }
3372 
3373 /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
3374    dangerous relocation.  */
3375 
3376 static bfd_boolean
3377 mips_elf64_assign_gp (bfd *output_bfd, bfd_vma *pgp)
3378 {
3379   unsigned int count;
3380   asymbol **sym;
3381   unsigned int i;
3382 
3383   /* If we've already figured out what GP will be, just return it.  */
3384   *pgp = _bfd_get_gp_value (output_bfd);
3385   if (*pgp)
3386     return TRUE;
3387 
3388   count = bfd_get_symcount (output_bfd);
3389   sym = bfd_get_outsymbols (output_bfd);
3390 
3391   /* The linker script will have created a symbol named `_gp' with the
3392      appropriate value.  */
3393   if (sym == NULL)
3394     i = count;
3395   else
3396     {
3397       for (i = 0; i < count; i++, sym++)
3398 	{
3399 	  register const char *name;
3400 
3401 	  name = bfd_asymbol_name (*sym);
3402 	  if (*name == '_' && strcmp (name, "_gp") == 0)
3403 	    {
3404 	      *pgp = bfd_asymbol_value (*sym);
3405 	      _bfd_set_gp_value (output_bfd, *pgp);
3406 	      break;
3407 	    }
3408 	}
3409     }
3410 
3411   if (i >= count)
3412     {
3413       /* Only get the error once.  */
3414       *pgp = 4;
3415       _bfd_set_gp_value (output_bfd, *pgp);
3416       return FALSE;
3417     }
3418 
3419   return TRUE;
3420 }
3421 
3422 /* We have to figure out the gp value, so that we can adjust the
3423    symbol value correctly.  We look up the symbol _gp in the output
3424    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
3425    target data.  We don't need to adjust the symbol value for an
3426    external symbol if we are producing relocatable output.  */
3427 
3428 static bfd_reloc_status_type
3429 mips_elf64_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
3430 		     char **error_message, bfd_vma *pgp)
3431 {
3432   if (bfd_is_und_section (symbol->section)
3433       && ! relocatable)
3434     {
3435       *pgp = 0;
3436       return bfd_reloc_undefined;
3437     }
3438 
3439   *pgp = _bfd_get_gp_value (output_bfd);
3440   if (*pgp == 0
3441       && (! relocatable
3442 	  || (symbol->flags & BSF_SECTION_SYM) != 0))
3443     {
3444       if (relocatable)
3445 	{
3446 	  /* Make up a value.  */
3447 	  *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
3448 	  _bfd_set_gp_value (output_bfd, *pgp);
3449 	}
3450       else if (!mips_elf64_assign_gp (output_bfd, pgp))
3451 	{
3452 	  *error_message =
3453 	    (char *) _("GP relative relocation when _gp not defined");
3454 	  return bfd_reloc_dangerous;
3455 	}
3456     }
3457 
3458   return bfd_reloc_ok;
3459 }
3460 
3461 /* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
3462    become the offset from the gp register.  */
3463 
3464 static bfd_reloc_status_type
3465 mips_elf64_gprel16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3466 			  void *data, asection *input_section, bfd *output_bfd,
3467 			  char **error_message)
3468 {
3469   bfd_boolean relocatable;
3470   bfd_reloc_status_type ret;
3471   bfd_vma gp;
3472 
3473   /* If we're relocating, and this is an external symbol, we don't want
3474      to change anything.  */
3475   if (output_bfd != NULL
3476       && (symbol->flags & BSF_SECTION_SYM) == 0
3477       && (symbol->flags & BSF_LOCAL) != 0)
3478     {
3479       reloc_entry->address += input_section->output_offset;
3480       return bfd_reloc_ok;
3481     }
3482 
3483   if (output_bfd != NULL)
3484     relocatable = TRUE;
3485   else
3486     {
3487       relocatable = FALSE;
3488       output_bfd = symbol->section->output_section->owner;
3489     }
3490 
3491   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
3492 			     &gp);
3493   if (ret != bfd_reloc_ok)
3494     return ret;
3495 
3496   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3497 					input_section, relocatable,
3498 					data, gp);
3499 }
3500 
3501 /* Do a R_MIPS_LITERAL relocation.  */
3502 
3503 static bfd_reloc_status_type
3504 mips_elf64_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3505 			  void *data, asection *input_section, bfd *output_bfd,
3506 			  char **error_message)
3507 {
3508   bfd_boolean relocatable;
3509   bfd_reloc_status_type ret;
3510   bfd_vma gp;
3511 
3512   /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
3513   if (output_bfd != NULL
3514       && (symbol->flags & BSF_SECTION_SYM) == 0
3515       && (symbol->flags & BSF_LOCAL) != 0)
3516     {
3517       *error_message = (char *)
3518 	_("literal relocation occurs for an external symbol");
3519       return bfd_reloc_outofrange;
3520     }
3521 
3522   /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
3523   if (output_bfd != NULL)
3524     relocatable = TRUE;
3525   else
3526     {
3527       relocatable = FALSE;
3528       output_bfd = symbol->section->output_section->owner;
3529     }
3530 
3531   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
3532 			     &gp);
3533   if (ret != bfd_reloc_ok)
3534     return ret;
3535 
3536   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3537 					input_section, relocatable,
3538 					data, gp);
3539 }
3540 
3541 /* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
3542    become the offset from the gp register.  */
3543 
3544 static bfd_reloc_status_type
3545 mips_elf64_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3546 			  void *data, asection *input_section, bfd *output_bfd,
3547 			  char **error_message)
3548 {
3549   bfd_boolean relocatable;
3550   bfd_reloc_status_type ret;
3551   bfd_vma gp;
3552   bfd_vma relocation;
3553   bfd_vma val;
3554 
3555   /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
3556   if (output_bfd != NULL
3557       && (symbol->flags & BSF_SECTION_SYM) == 0
3558       && (symbol->flags & BSF_LOCAL) != 0)
3559     {
3560       *error_message = (char *)
3561 	_("32bits gp relative relocation occurs for an external symbol");
3562       return bfd_reloc_outofrange;
3563     }
3564 
3565   if (output_bfd != NULL)
3566     relocatable = TRUE;
3567   else
3568     {
3569       relocatable = FALSE;
3570       output_bfd = symbol->section->output_section->owner;
3571     }
3572 
3573   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable,
3574 			     error_message, &gp);
3575   if (ret != bfd_reloc_ok)
3576     return ret;
3577 
3578   if (bfd_is_com_section (symbol->section))
3579     relocation = 0;
3580   else
3581     relocation = symbol->value;
3582 
3583   relocation += symbol->section->output_section->vma;
3584   relocation += symbol->section->output_offset;
3585 
3586   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
3587     return bfd_reloc_outofrange;
3588 
3589   /* Set val to the offset into the section or symbol.  */
3590   val = reloc_entry->addend;
3591 
3592   if (reloc_entry->howto->partial_inplace)
3593     val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
3594 
3595   /* Adjust val for the final section location and GP value.  If we
3596      are producing relocatable output, we don't want to do this for
3597      an external symbol.  */
3598   if (! relocatable
3599       || (symbol->flags & BSF_SECTION_SYM) != 0)
3600     val += relocation - gp;
3601 
3602   if (reloc_entry->howto->partial_inplace)
3603     bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
3604   else
3605     reloc_entry->addend = val;
3606 
3607   if (relocatable)
3608     reloc_entry->address += input_section->output_offset;
3609 
3610   return bfd_reloc_ok;
3611 }
3612 
3613 /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
3614    the rest is at bits 6-10. The bitpos already got right by the howto.  */
3615 
3616 static bfd_reloc_status_type
3617 mips_elf64_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3618 			 void *data, asection *input_section, bfd *output_bfd,
3619 			 char **error_message)
3620 {
3621   if (reloc_entry->howto->partial_inplace)
3622     {
3623       reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
3624 			     | (reloc_entry->addend & 0x00000800) >> 9);
3625     }
3626 
3627   return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
3628 				      input_section, output_bfd,
3629 				      error_message);
3630 }
3631 
3632 /* Handle a mips16 GP relative reloc.  */
3633 
3634 static bfd_reloc_status_type
3635 mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3636 		    void *data, asection *input_section, bfd *output_bfd,
3637 		    char **error_message)
3638 {
3639   bfd_boolean relocatable;
3640   bfd_reloc_status_type ret;
3641   bfd_byte *location;
3642   bfd_vma gp;
3643 
3644   /* If we're relocating, and this is an external symbol, we don't want
3645      to change anything.  */
3646   if (output_bfd != NULL
3647       && (symbol->flags & BSF_SECTION_SYM) == 0
3648       && (symbol->flags & BSF_LOCAL) != 0)
3649     {
3650       reloc_entry->address += input_section->output_offset;
3651       return bfd_reloc_ok;
3652     }
3653 
3654   if (output_bfd != NULL)
3655     relocatable = TRUE;
3656   else
3657     {
3658       relocatable = FALSE;
3659       output_bfd = symbol->section->output_section->owner;
3660     }
3661 
3662   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
3663 			     &gp);
3664   if (ret != bfd_reloc_ok)
3665     return ret;
3666 
3667   location = (bfd_byte *) data + reloc_entry->address;
3668   _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
3669 				 location);
3670   ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3671 				       input_section, relocatable,
3672 				       data, gp);
3673   _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
3674 			       location);
3675 
3676   return ret;
3677 }
3678 
3679 /* A mapping from BFD reloc types to MIPS ELF reloc types.  */
3680 
3681 struct elf_reloc_map {
3682   bfd_reloc_code_real_type bfd_val;
3683   enum elf_mips_reloc_type elf_val;
3684 };
3685 
3686 static const struct elf_reloc_map mips_reloc_map[] =
3687 {
3688   { BFD_RELOC_NONE, R_MIPS_NONE },
3689   { BFD_RELOC_16, R_MIPS_16 },
3690   { BFD_RELOC_32, R_MIPS_32 },
3691   /* There is no BFD reloc for R_MIPS_REL32.  */
3692   { BFD_RELOC_64, R_MIPS_64 },
3693   { BFD_RELOC_CTOR, R_MIPS_64 },
3694   { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
3695   { BFD_RELOC_HI16_S, R_MIPS_HI16 },
3696   { BFD_RELOC_LO16, R_MIPS_LO16 },
3697   { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
3698   { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
3699   { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
3700   { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
3701   { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
3702   { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
3703   { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
3704   { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
3705   { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
3706   { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
3707   { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
3708   { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
3709   { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
3710   { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
3711   { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
3712   { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
3713   { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
3714   { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
3715   { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
3716   { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
3717   { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
3718   { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
3719   { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
3720   /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
3721   { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
3722   { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
3723   { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
3724   { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
3725   { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
3726   { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
3727   { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
3728   { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
3729   { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
3730   { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
3731   { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
3732   { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
3733   { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
3734   { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
3735   { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 },
3736   { BFD_RELOC_MIPS_21_PCREL_S2, R_MIPS_PC21_S2 },
3737   { BFD_RELOC_MIPS_26_PCREL_S2, R_MIPS_PC26_S2 },
3738   { BFD_RELOC_MIPS_18_PCREL_S3, R_MIPS_PC18_S3 },
3739   { BFD_RELOC_MIPS_19_PCREL_S2, R_MIPS_PC19_S2 },
3740   { BFD_RELOC_HI16_S_PCREL, R_MIPS_PCHI16 },
3741   { BFD_RELOC_LO16_PCREL, R_MIPS_PCLO16 }
3742 };
3743 
3744 static const struct elf_reloc_map mips16_reloc_map[] =
3745 {
3746   { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
3747   { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
3748   { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
3749   { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
3750   { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
3751   { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
3752   { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
3753   { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
3754   { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
3755     R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
3756   { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
3757     R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
3758   { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
3759   { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
3760   { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min },
3761   { BFD_RELOC_MIPS16_16_PCREL_S1, R_MIPS16_PC16_S1 - R_MIPS16_min }
3762 };
3763 
3764 static const struct elf_reloc_map micromips_reloc_map[] =
3765 {
3766   { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min },
3767   { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min },
3768   { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min },
3769   { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min },
3770   { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min },
3771   { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min },
3772   { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min },
3773   { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min },
3774   { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min },
3775   { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min },
3776   { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min },
3777   { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min },
3778   { BFD_RELOC_MICROMIPS_GOT_OFST, R_MICROMIPS_GOT_OFST - R_MICROMIPS_min },
3779   { BFD_RELOC_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_HI16 - R_MICROMIPS_min },
3780   { BFD_RELOC_MICROMIPS_GOT_LO16, R_MICROMIPS_GOT_LO16 - R_MICROMIPS_min },
3781   { BFD_RELOC_MICROMIPS_SUB, R_MICROMIPS_SUB - R_MICROMIPS_min },
3782   { BFD_RELOC_MICROMIPS_HIGHER, R_MICROMIPS_HIGHER - R_MICROMIPS_min },
3783   { BFD_RELOC_MICROMIPS_HIGHEST, R_MICROMIPS_HIGHEST - R_MICROMIPS_min },
3784   { BFD_RELOC_MICROMIPS_CALL_HI16, R_MICROMIPS_CALL_HI16 - R_MICROMIPS_min },
3785   { BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
3786   { BFD_RELOC_MICROMIPS_SCN_DISP, R_MICROMIPS_SCN_DISP - R_MICROMIPS_min },
3787   { BFD_RELOC_MICROMIPS_JALR, R_MICROMIPS_JALR - R_MICROMIPS_min },
3788   /* There is no BFD reloc for R_MICROMIPS_HI0_LO16.  */
3789   { BFD_RELOC_MICROMIPS_TLS_GD, R_MICROMIPS_TLS_GD - R_MICROMIPS_min },
3790   { BFD_RELOC_MICROMIPS_TLS_LDM, R_MICROMIPS_TLS_LDM - R_MICROMIPS_min },
3791   { BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16,
3792     R_MICROMIPS_TLS_DTPREL_HI16 - R_MICROMIPS_min },
3793   { BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16,
3794     R_MICROMIPS_TLS_DTPREL_LO16 - R_MICROMIPS_min },
3795   { BFD_RELOC_MICROMIPS_TLS_GOTTPREL,
3796     R_MICROMIPS_TLS_GOTTPREL - R_MICROMIPS_min },
3797   { BFD_RELOC_MICROMIPS_TLS_TPREL_HI16,
3798     R_MICROMIPS_TLS_TPREL_HI16 - R_MICROMIPS_min },
3799   { BFD_RELOC_MICROMIPS_TLS_TPREL_LO16,
3800     R_MICROMIPS_TLS_TPREL_LO16 - R_MICROMIPS_min },
3801   /* There is no BFD reloc for R_MICROMIPS_GPREL7_S2.  */
3802   /* There is no BFD reloc for R_MICROMIPS_PC23_S2.  */
3803 };
3804 /* Given a BFD reloc type, return a howto structure.  */
3805 
3806 static reloc_howto_type *
3807 bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3808 				 bfd_reloc_code_real_type code)
3809 {
3810   unsigned int i;
3811   /* FIXME: We default to RELA here instead of choosing the right
3812      relocation variant.  */
3813   reloc_howto_type *howto_table = mips_elf64_howto_table_rela;
3814   reloc_howto_type *howto16_table = mips16_elf64_howto_table_rela;
3815   reloc_howto_type *howto_micromips_table = micromips_elf64_howto_table_rela;
3816 
3817   for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
3818        i++)
3819     {
3820       if (mips_reloc_map[i].bfd_val == code)
3821 	return &howto_table[(int) mips_reloc_map[i].elf_val];
3822     }
3823 
3824   for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
3825        i++)
3826     {
3827       if (mips16_reloc_map[i].bfd_val == code)
3828 	return &howto16_table[(int) mips16_reloc_map[i].elf_val];
3829     }
3830 
3831   for (i = 0; i < sizeof (micromips_reloc_map) / sizeof (struct elf_reloc_map);
3832        i++)
3833     {
3834       if (micromips_reloc_map[i].bfd_val == code)
3835 	return &howto_micromips_table[(int) micromips_reloc_map[i].elf_val];
3836     }
3837 
3838   switch (code)
3839     {
3840     case BFD_RELOC_VTABLE_INHERIT:
3841       return &elf_mips_gnu_vtinherit_howto;
3842     case BFD_RELOC_VTABLE_ENTRY:
3843       return &elf_mips_gnu_vtentry_howto;
3844     case BFD_RELOC_32_PCREL:
3845       return &elf_mips_gnu_pcrel32;
3846     case BFD_RELOC_MIPS_EH:
3847       return &elf_mips_eh_howto;
3848     case BFD_RELOC_MIPS_COPY:
3849       return &elf_mips_copy_howto;
3850     case BFD_RELOC_MIPS_JUMP_SLOT:
3851       return &elf_mips_jump_slot_howto;
3852     default:
3853       bfd_set_error (bfd_error_bad_value);
3854       return NULL;
3855     }
3856 }
3857 
3858 static reloc_howto_type *
3859 bfd_elf64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3860 				 const char *r_name)
3861 {
3862   unsigned int i;
3863 
3864   for (i = 0;
3865        i < (sizeof (mips_elf64_howto_table_rela)
3866 	    / sizeof (mips_elf64_howto_table_rela[0])); i++)
3867     if (mips_elf64_howto_table_rela[i].name != NULL
3868 	&& strcasecmp (mips_elf64_howto_table_rela[i].name, r_name) == 0)
3869       return &mips_elf64_howto_table_rela[i];
3870 
3871   for (i = 0;
3872        i < (sizeof (mips16_elf64_howto_table_rela)
3873 	    / sizeof (mips16_elf64_howto_table_rela[0]));
3874        i++)
3875     if (mips16_elf64_howto_table_rela[i].name != NULL
3876 	&& strcasecmp (mips16_elf64_howto_table_rela[i].name, r_name) == 0)
3877       return &mips16_elf64_howto_table_rela[i];
3878 
3879   for (i = 0;
3880        i < (sizeof (micromips_elf64_howto_table_rela)
3881 	    / sizeof (micromips_elf64_howto_table_rela[0]));
3882        i++)
3883     if (micromips_elf64_howto_table_rela[i].name != NULL
3884 	&& strcasecmp (micromips_elf64_howto_table_rela[i].name, r_name) == 0)
3885       return &micromips_elf64_howto_table_rela[i];
3886 
3887   if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
3888     return &elf_mips_gnu_vtinherit_howto;
3889   if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
3890     return &elf_mips_gnu_vtentry_howto;
3891   if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
3892     return &elf_mips_gnu_rel16_s2;
3893   if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
3894     return &elf_mips_gnu_rela16_s2;
3895   if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0)
3896     return &elf_mips_gnu_pcrel32;
3897   if (strcasecmp (elf_mips_eh_howto.name, r_name) == 0)
3898     return &elf_mips_eh_howto;
3899   if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
3900     return &elf_mips_copy_howto;
3901   if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
3902     return &elf_mips_jump_slot_howto;
3903 
3904   return NULL;
3905 }
3906 
3907 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
3908 
3909 static reloc_howto_type *
3910 mips_elf64_rtype_to_howto (bfd *abfd, unsigned int r_type, bfd_boolean rela_p)
3911 {
3912   reloc_howto_type *howto = NULL;
3913 
3914   switch (r_type)
3915     {
3916     case R_MIPS_GNU_VTINHERIT:
3917       return &elf_mips_gnu_vtinherit_howto;
3918     case R_MIPS_GNU_VTENTRY:
3919       return &elf_mips_gnu_vtentry_howto;
3920     case R_MIPS_GNU_REL16_S2:
3921       if (rela_p)
3922 	return &elf_mips_gnu_rela16_s2;
3923       else
3924 	return &elf_mips_gnu_rel16_s2;
3925     case R_MIPS_PC32:
3926       return &elf_mips_gnu_pcrel32;
3927     case R_MIPS_EH:
3928       return &elf_mips_eh_howto;
3929     case R_MIPS_COPY:
3930       return &elf_mips_copy_howto;
3931     case R_MIPS_JUMP_SLOT:
3932       return &elf_mips_jump_slot_howto;
3933     default:
3934       if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
3935 	{
3936 	  if (rela_p)
3937 	    howto
3938 	      = &micromips_elf64_howto_table_rela[r_type - R_MICROMIPS_min];
3939 	  else
3940 	    howto
3941 	      = &micromips_elf64_howto_table_rel[r_type - R_MICROMIPS_min];
3942 	}
3943       if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
3944 	{
3945 	  if (rela_p)
3946 	    howto = &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min];
3947 	  else
3948 	    howto = &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min];
3949 	}
3950       if (r_type < R_MIPS_max)
3951 	{
3952 	  if (rela_p)
3953 	    howto = &mips_elf64_howto_table_rela[r_type];
3954 	  else
3955 	    howto = &mips_elf64_howto_table_rel[r_type];
3956 	}
3957       if (howto != NULL && howto->name != NULL)
3958 	return howto;
3959 
3960       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
3961 			  abfd, r_type);
3962       bfd_set_error (bfd_error_bad_value);
3963       return NULL;
3964     }
3965 }
3966 
3967 /* Prevent relocation handling by bfd for MIPS ELF64.  */
3968 
3969 static bfd_boolean
3970 mips_elf64_info_to_howto_rela (bfd *abfd,
3971 			       arelent *cache_ptr ATTRIBUTE_UNUSED,
3972 			       Elf_Internal_Rela *dst)
3973 {
3974   unsigned int r_type = ELF32_R_TYPE (dst->r_info);
3975   /* xgettext:c-format */
3976   _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
3977 		      abfd, r_type);
3978   bfd_set_error (bfd_error_bad_value);
3979   return FALSE;
3980 }
3981 
3982 /* Since each entry in an SHT_REL or SHT_RELA section can represent up
3983    to three relocs, we must tell the user to allocate more space.  */
3984 
3985 static long
3986 mips_elf64_get_dynamic_reloc_upper_bound (bfd *abfd)
3987 {
3988   return _bfd_elf_get_dynamic_reloc_upper_bound (abfd) * 3;
3989 }
3990 
3991 /* Read the relocations from one reloc section.  This is mostly copied
3992    from elfcode.h, except for the changes to expand one external
3993    relocation to 3 internal ones.  To reduce processing effort we
3994    could discard those R_MIPS_NONE relocations that occupy the second
3995    and the third entry of a triplet, as `mips_elf64_write_rel' and
3996    `mips_elf64_write_rela' recreate them in output automagically,
3997    however that would also remove them from `objdump -r' output,
3998    breaking a long-established tradition and likely confusing people.  */
3999 
4000 static bfd_boolean
4001 mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect,
4002 				  Elf_Internal_Shdr *rel_hdr,
4003 				  bfd_size_type reloc_count,
4004 				  arelent *relents, asymbol **symbols,
4005 				  bfd_boolean dynamic)
4006 {
4007   void *allocated;
4008   bfd_byte *native_relocs;
4009   unsigned int symcount;
4010   arelent *relent;
4011   bfd_vma i;
4012   int entsize;
4013   bfd_boolean rela_p;
4014 
4015   allocated = bfd_malloc (rel_hdr->sh_size);
4016   if (allocated == NULL)
4017     return FALSE;
4018 
4019   if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
4020       || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
4021 	  != rel_hdr->sh_size))
4022     goto error_return;
4023 
4024   native_relocs = allocated;
4025 
4026   entsize = rel_hdr->sh_entsize;
4027   BFD_ASSERT (entsize == sizeof (Elf64_Mips_External_Rel)
4028 	      || entsize == sizeof (Elf64_Mips_External_Rela));
4029 
4030   if (entsize == sizeof (Elf64_Mips_External_Rel))
4031     rela_p = FALSE;
4032   else
4033     rela_p = TRUE;
4034 
4035   if (dynamic)
4036     symcount = bfd_get_dynamic_symcount (abfd);
4037   else
4038     symcount = bfd_get_symcount (abfd);
4039 
4040   for (i = 0, relent = relents;
4041        i < reloc_count;
4042        i++, native_relocs += entsize)
4043     {
4044       Elf64_Mips_Internal_Rela rela;
4045       bfd_boolean used_sym, used_ssym;
4046       int ir;
4047 
4048       if (entsize == sizeof (Elf64_Mips_External_Rela))
4049 	mips_elf64_swap_reloca_in (abfd,
4050 				   (Elf64_Mips_External_Rela *) native_relocs,
4051 				   &rela);
4052       else
4053 	mips_elf64_swap_reloc_in (abfd,
4054 				  (Elf64_Mips_External_Rel *) native_relocs,
4055 				  &rela);
4056 
4057       /* Each entry represents exactly three actual relocations.  */
4058 
4059       used_sym = FALSE;
4060       used_ssym = FALSE;
4061       for (ir = 0; ir < 3; ir++)
4062 	{
4063 	  enum elf_mips_reloc_type type;
4064 
4065 	  switch (ir)
4066 	    {
4067 	    default:
4068 	      abort ();
4069 	    case 0:
4070 	      type = (enum elf_mips_reloc_type) rela.r_type;
4071 	      break;
4072 	    case 1:
4073 	      type = (enum elf_mips_reloc_type) rela.r_type2;
4074 	      break;
4075 	    case 2:
4076 	      type = (enum elf_mips_reloc_type) rela.r_type3;
4077 	      break;
4078 	    }
4079 
4080 	  /* Some types require symbols, whereas some do not.  */
4081 	  switch (type)
4082 	    {
4083 	    case R_MIPS_NONE:
4084 	    case R_MIPS_LITERAL:
4085 	    case R_MIPS_INSERT_A:
4086 	    case R_MIPS_INSERT_B:
4087 	    case R_MIPS_DELETE:
4088 	      relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
4089 	      break;
4090 
4091 	    default:
4092 	      if (! used_sym)
4093 		{
4094 		  if (rela.r_sym == STN_UNDEF)
4095 		    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
4096 		  else if (rela.r_sym > symcount)
4097 		    {
4098 		      _bfd_error_handler
4099 			/* xgettext:c-format */
4100 			(_("%pB(%pA): relocation %" PRIu64
4101 			   " has invalid symbol index %ld"),
4102 			 abfd, asect, (uint64_t) i, rela.r_sym);
4103 		      bfd_set_error (bfd_error_bad_value);
4104 		      relent->sym_ptr_ptr
4105 			= bfd_abs_section_ptr->symbol_ptr_ptr;
4106 		    }
4107 		  else
4108 		    {
4109 		      asymbol **ps, *s;
4110 
4111 		      ps = symbols + rela.r_sym - 1;
4112 		      s = *ps;
4113 		      if ((s->flags & BSF_SECTION_SYM) == 0)
4114 			relent->sym_ptr_ptr = ps;
4115 		      else
4116 			relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
4117 		    }
4118 
4119 		  used_sym = TRUE;
4120 		}
4121 	      else if (! used_ssym)
4122 		{
4123 		  switch (rela.r_ssym)
4124 		    {
4125 		    case RSS_UNDEF:
4126 		      relent->sym_ptr_ptr =
4127 			bfd_abs_section_ptr->symbol_ptr_ptr;
4128 		      break;
4129 
4130 		    case RSS_GP:
4131 		    case RSS_GP0:
4132 		    case RSS_LOC:
4133 		      /* FIXME: I think these need to be handled using
4134 			 special howto structures.  */
4135 		      BFD_ASSERT (0);
4136 		      break;
4137 
4138 		    default:
4139 		      BFD_ASSERT (0);
4140 		      break;
4141 		    }
4142 
4143 		  used_ssym = TRUE;
4144 		}
4145 	      else
4146 		relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
4147 
4148 	      break;
4149 	    }
4150 
4151 	  /* The address of an ELF reloc is section relative for an
4152 	     object file, and absolute for an executable file or
4153 	     shared library.  The address of a BFD reloc is always
4154 	     section relative.  */
4155 	  if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
4156 	    relent->address = rela.r_offset;
4157 	  else
4158 	    relent->address = rela.r_offset - asect->vma;
4159 
4160 	  relent->addend = rela.r_addend;
4161 
4162 	  relent->howto = mips_elf64_rtype_to_howto (abfd, type, rela_p);
4163 	  if (relent->howto == NULL)
4164 	    goto error_return;
4165 
4166 	  ++relent;
4167 	}
4168     }
4169 
4170   if (allocated != NULL)
4171     free (allocated);
4172 
4173   return TRUE;
4174 
4175  error_return:
4176   if (allocated != NULL)
4177     free (allocated);
4178   return FALSE;
4179 }
4180 
4181 /* Read the relocations.  On Irix 6, there can be two reloc sections
4182    associated with a single data section.  This is copied from
4183    elfcode.h as well, with changes as small as accounting for 3
4184    internal relocs per external reloc.  */
4185 
4186 static bfd_boolean
4187 mips_elf64_slurp_reloc_table (bfd *abfd, asection *asect,
4188 			      asymbol **symbols, bfd_boolean dynamic)
4189 {
4190   struct bfd_elf_section_data * const d = elf_section_data (asect);
4191   Elf_Internal_Shdr *rel_hdr;
4192   Elf_Internal_Shdr *rel_hdr2;
4193   bfd_size_type reloc_count;
4194   bfd_size_type reloc_count2;
4195   arelent *relents;
4196   bfd_size_type amt;
4197 
4198   if (asect->relocation != NULL)
4199     return TRUE;
4200 
4201   if (! dynamic)
4202     {
4203       if ((asect->flags & SEC_RELOC) == 0
4204 	  || asect->reloc_count == 0)
4205 	return TRUE;
4206 
4207       rel_hdr = d->rel.hdr;
4208       reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
4209       rel_hdr2 = d->rela.hdr;
4210       reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0);
4211 
4212       BFD_ASSERT (asect->reloc_count == 3 * (reloc_count + reloc_count2));
4213       BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
4214 		  || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
4215 
4216     }
4217   else
4218     {
4219       /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
4220 	 case because relocations against this section may use the
4221 	 dynamic symbol table, and in that case bfd_section_from_shdr
4222 	 in elf.c does not update the RELOC_COUNT.  */
4223       if (asect->size == 0)
4224 	return TRUE;
4225 
4226       rel_hdr = &d->this_hdr;
4227       reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
4228       rel_hdr2 = NULL;
4229       reloc_count2 = 0;
4230     }
4231 
4232   /* Allocate space for 3 arelent structures for each Rel structure.  */
4233   amt = (reloc_count + reloc_count2) * 3 * sizeof (arelent);
4234   relents = bfd_alloc (abfd, amt);
4235   if (relents == NULL)
4236     return FALSE;
4237 
4238   if (rel_hdr != NULL
4239       && ! mips_elf64_slurp_one_reloc_table (abfd, asect,
4240 					     rel_hdr, reloc_count,
4241 					     relents,
4242 					     symbols, dynamic))
4243     return FALSE;
4244   if (rel_hdr2 != NULL
4245       && ! mips_elf64_slurp_one_reloc_table (abfd, asect,
4246 					     rel_hdr2, reloc_count2,
4247 					     relents + reloc_count * 3,
4248 					     symbols, dynamic))
4249     return FALSE;
4250 
4251   asect->relocation = relents;
4252   return TRUE;
4253 }
4254 
4255 /* Write out the relocations.  */
4256 
4257 static void
4258 mips_elf64_write_relocs (bfd *abfd, asection *sec, void *data)
4259 {
4260   bfd_boolean *failedp = data;
4261   int count;
4262   Elf_Internal_Shdr *rel_hdr;
4263   unsigned int idx;
4264 
4265   /* If we have already failed, don't do anything.  */
4266   if (*failedp)
4267     return;
4268 
4269   if ((sec->flags & SEC_RELOC) == 0)
4270     return;
4271 
4272   /* The linker backend writes the relocs out itself, and sets the
4273      reloc_count field to zero to inhibit writing them here.  Also,
4274      sometimes the SEC_RELOC flag gets set even when there aren't any
4275      relocs.  */
4276   if (sec->reloc_count == 0)
4277     return;
4278 
4279   /* We can combine up to three relocs that refer to the same address
4280      if the latter relocs have no associated symbol.  */
4281   count = 0;
4282   for (idx = 0; idx < sec->reloc_count; idx++)
4283     {
4284       bfd_vma addr;
4285       unsigned int i;
4286 
4287       ++count;
4288 
4289       addr = sec->orelocation[idx]->address;
4290       for (i = 0; i < 2; i++)
4291 	{
4292 	  arelent *r;
4293 
4294 	  if (idx + 1 >= sec->reloc_count)
4295 	    break;
4296 	  r = sec->orelocation[idx + 1];
4297 	  if (r->address != addr
4298 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
4299 	      || (*r->sym_ptr_ptr)->value != 0)
4300 	    break;
4301 
4302 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
4303 
4304 	  ++idx;
4305 	}
4306     }
4307 
4308   rel_hdr = _bfd_elf_single_rel_hdr (sec);
4309 
4310   /* Do the actual relocation.  */
4311 
4312   if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rel))
4313     mips_elf64_write_rel (abfd, sec, rel_hdr, &count, data);
4314   else if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rela))
4315     mips_elf64_write_rela (abfd, sec, rel_hdr, &count, data);
4316   else
4317     BFD_ASSERT (0);
4318 }
4319 
4320 static void
4321 mips_elf64_write_rel (bfd *abfd, asection *sec,
4322 		      Elf_Internal_Shdr *rel_hdr,
4323 		      int *count, void *data)
4324 {
4325   bfd_boolean *failedp = data;
4326   Elf64_Mips_External_Rel *ext_rel;
4327   unsigned int idx;
4328   asymbol *last_sym = 0;
4329   int last_sym_idx = 0;
4330 
4331   rel_hdr->sh_size = rel_hdr->sh_entsize * *count;
4332   rel_hdr->contents = bfd_alloc (abfd, rel_hdr->sh_size);
4333   if (rel_hdr->contents == NULL)
4334     {
4335       *failedp = TRUE;
4336       return;
4337     }
4338 
4339   ext_rel = (Elf64_Mips_External_Rel *) rel_hdr->contents;
4340   for (idx = 0; idx < sec->reloc_count; idx++, ext_rel++)
4341     {
4342       arelent *ptr;
4343       Elf64_Mips_Internal_Rela int_rel;
4344       asymbol *sym;
4345       int n;
4346       unsigned int i;
4347 
4348       ptr = sec->orelocation[idx];
4349 
4350       /* The address of an ELF reloc is section relative for an object
4351 	 file, and absolute for an executable file or shared library.
4352 	 The address of a BFD reloc is always section relative.  */
4353       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
4354 	int_rel.r_offset = ptr->address;
4355       else
4356 	int_rel.r_offset = ptr->address + sec->vma;
4357 
4358       sym = *ptr->sym_ptr_ptr;
4359       if (sym == last_sym)
4360 	n = last_sym_idx;
4361       else if (bfd_is_abs_section (sym->section) && sym->value == 0)
4362 	n = STN_UNDEF;
4363       else
4364 	{
4365 	  last_sym = sym;
4366 	  n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
4367 	  if (n < 0)
4368 	    {
4369 	      *failedp = TRUE;
4370 	      return;
4371 	    }
4372 	  last_sym_idx = n;
4373 	}
4374 
4375       int_rel.r_sym = n;
4376       int_rel.r_ssym = RSS_UNDEF;
4377 
4378       if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
4379 	  && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
4380 	  && ! _bfd_elf_validate_reloc (abfd, ptr))
4381 	{
4382 	  *failedp = TRUE;
4383 	  return;
4384 	}
4385 
4386       int_rel.r_type = ptr->howto->type;
4387       int_rel.r_type2 = (int) R_MIPS_NONE;
4388       int_rel.r_type3 = (int) R_MIPS_NONE;
4389 
4390       for (i = 0; i < 2; i++)
4391 	{
4392 	  arelent *r;
4393 
4394 	  if (idx + 1 >= sec->reloc_count)
4395 	    break;
4396 	  r = sec->orelocation[idx + 1];
4397 	  if (r->address != ptr->address
4398 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
4399 	      || (*r->sym_ptr_ptr)->value != 0)
4400 	    break;
4401 
4402 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
4403 
4404 	  if (i == 0)
4405 	    int_rel.r_type2 = r->howto->type;
4406 	  else
4407 	    int_rel.r_type3 = r->howto->type;
4408 
4409 	  ++idx;
4410 	}
4411 
4412       mips_elf64_swap_reloc_out (abfd, &int_rel, ext_rel);
4413     }
4414 
4415   BFD_ASSERT (ext_rel - (Elf64_Mips_External_Rel *) rel_hdr->contents
4416 	      == *count);
4417 }
4418 
4419 static void
4420 mips_elf64_write_rela (bfd *abfd, asection *sec,
4421 		       Elf_Internal_Shdr *rela_hdr,
4422 		       int *count, void *data)
4423 {
4424   bfd_boolean *failedp = data;
4425   Elf64_Mips_External_Rela *ext_rela;
4426   unsigned int idx;
4427   asymbol *last_sym = 0;
4428   int last_sym_idx = 0;
4429 
4430   rela_hdr->sh_size = rela_hdr->sh_entsize * *count;
4431   rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size);
4432   if (rela_hdr->contents == NULL)
4433     {
4434       *failedp = TRUE;
4435       return;
4436     }
4437 
4438   ext_rela = (Elf64_Mips_External_Rela *) rela_hdr->contents;
4439   for (idx = 0; idx < sec->reloc_count; idx++, ext_rela++)
4440     {
4441       arelent *ptr;
4442       Elf64_Mips_Internal_Rela int_rela;
4443       asymbol *sym;
4444       int n;
4445       unsigned int i;
4446 
4447       ptr = sec->orelocation[idx];
4448 
4449       /* The address of an ELF reloc is section relative for an object
4450 	 file, and absolute for an executable file or shared library.
4451 	 The address of a BFD reloc is always section relative.  */
4452       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
4453 	int_rela.r_offset = ptr->address;
4454       else
4455 	int_rela.r_offset = ptr->address + sec->vma;
4456 
4457       sym = *ptr->sym_ptr_ptr;
4458       if (sym == last_sym)
4459 	n = last_sym_idx;
4460       else if (bfd_is_abs_section (sym->section) && sym->value == 0)
4461 	n = STN_UNDEF;
4462       else
4463 	{
4464 	  last_sym = sym;
4465 	  n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
4466 	  if (n < 0)
4467 	    {
4468 	      *failedp = TRUE;
4469 	      return;
4470 	    }
4471 	  last_sym_idx = n;
4472 	}
4473 
4474       int_rela.r_sym = n;
4475       int_rela.r_addend = ptr->addend;
4476       int_rela.r_ssym = RSS_UNDEF;
4477 
4478       if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
4479 	  && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
4480 	  && ! _bfd_elf_validate_reloc (abfd, ptr))
4481 	{
4482 	  *failedp = TRUE;
4483 	  return;
4484 	}
4485 
4486       int_rela.r_type = ptr->howto->type;
4487       int_rela.r_type2 = (int) R_MIPS_NONE;
4488       int_rela.r_type3 = (int) R_MIPS_NONE;
4489 
4490       for (i = 0; i < 2; i++)
4491 	{
4492 	  arelent *r;
4493 
4494 	  if (idx + 1 >= sec->reloc_count)
4495 	    break;
4496 	  r = sec->orelocation[idx + 1];
4497 	  if (r->address != ptr->address
4498 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
4499 	      || (*r->sym_ptr_ptr)->value != 0)
4500 	    break;
4501 
4502 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
4503 
4504 	  if (i == 0)
4505 	    int_rela.r_type2 = r->howto->type;
4506 	  else
4507 	    int_rela.r_type3 = r->howto->type;
4508 
4509 	  ++idx;
4510 	}
4511 
4512       mips_elf64_swap_reloca_out (abfd, &int_rela, ext_rela);
4513     }
4514 
4515   BFD_ASSERT (ext_rela - (Elf64_Mips_External_Rela *) rela_hdr->contents
4516 	      == *count);
4517 }
4518 
4519 /* Set the right machine number for a MIPS ELF file.  */
4520 
4521 static bfd_boolean
4522 mips_elf64_object_p (bfd *abfd)
4523 {
4524   unsigned long mach;
4525 
4526   /* Irix 6 is broken.  Object file symbol tables are not always
4527      sorted correctly such that local symbols precede global symbols,
4528      and the sh_info field in the symbol table is not always right.  */
4529   if (elf64_mips_irix_compat (abfd) != ict_none)
4530     elf_bad_symtab (abfd) = TRUE;
4531 
4532   mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
4533   bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
4534   return TRUE;
4535 }
4536 
4537 /* MIPS ELF local labels start with "$L".  */
4538 static bfd_boolean
4539 mips_elf64_is_local_label_name (bfd *abfd, const char *name)
4540 {
4541   if (name[0] == '$' && name[1] == 'L')
4542     return TRUE;
4543 
4544   /* We accept the generic ELF local label syntax as well.  */
4545   return _bfd_elf_is_local_label_name (abfd, name);
4546 }
4547 
4548 /* Depending on the target vector we generate some version of Irix
4549    executables or "normal" MIPS ELF ABI executables.  */
4550 static irix_compat_t
4551 elf64_mips_irix_compat (bfd *abfd)
4552 {
4553   if ((abfd->xvec == &mips_elf64_be_vec)
4554       || (abfd->xvec == &mips_elf64_le_vec))
4555     return ict_irix6;
4556   else
4557     return ict_none;
4558 }
4559 
4560 /* Support for core dump NOTE sections.  */
4561 static bfd_boolean
4562 elf64_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
4563 {
4564   int offset;
4565   unsigned int size;
4566 
4567   switch (note->descsz)
4568     {
4569       default:
4570 	return FALSE;
4571 
4572       case 480:		/* Linux/MIPS - N64 kernel */
4573 	/* pr_cursig */
4574 	elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
4575 
4576 	/* pr_pid */
4577 	elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
4578 
4579 	/* pr_reg */
4580 	offset = 112;
4581 	size = 360;
4582 
4583 	break;
4584     }
4585 
4586   /* Make a ".reg/999" section.  */
4587   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
4588 					  size, note->descpos + offset);
4589 }
4590 
4591 static bfd_boolean
4592 elf64_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
4593 {
4594   switch (note->descsz)
4595     {
4596       default:
4597 	return FALSE;
4598 
4599       case 136:		/* Linux/MIPS - N64 kernel elf_prpsinfo */
4600 	elf_tdata (abfd)->core->pid
4601 	 = bfd_get_32 (abfd, note->descdata + 24);
4602 	elf_tdata (abfd)->core->program
4603 	 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
4604 	elf_tdata (abfd)->core->command
4605 	 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
4606     }
4607 
4608   /* Note that for some reason, a spurious space is tacked
4609      onto the end of the args in some (at least one anyway)
4610      implementations, so strip it off if it exists.  */
4611 
4612   {
4613     char *command = elf_tdata (abfd)->core->command;
4614     int n = strlen (command);
4615 
4616     if (0 < n && command[n - 1] == ' ')
4617       command[n - 1] = '\0';
4618   }
4619 
4620   return TRUE;
4621 }
4622 
4623 /* Write Linux core PRSTATUS note into core file.  */
4624 
4625 static char *
4626 elf64_mips_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
4627 			     ...)
4628 {
4629   switch (note_type)
4630     {
4631     default:
4632       return NULL;
4633 
4634     case NT_PRPSINFO:
4635       BFD_FAIL ();
4636       return NULL;
4637 
4638     case NT_PRSTATUS:
4639       {
4640 	char data[480];
4641 	va_list ap;
4642 	long pid;
4643 	int cursig;
4644 	const void *greg;
4645 
4646 	va_start (ap, note_type);
4647 	memset (data, 0, 112);
4648 	pid = va_arg (ap, long);
4649 	bfd_put_32 (abfd, pid, data + 32);
4650 	cursig = va_arg (ap, int);
4651 	bfd_put_16 (abfd, cursig, data + 12);
4652 	greg = va_arg (ap, const void *);
4653 	memcpy (data + 112, greg, 360);
4654 	memset (data + 472, 0, 8);
4655 	va_end (ap);
4656 	return elfcore_write_note (abfd, buf, bufsiz,
4657 				   "CORE", note_type, data, sizeof (data));
4658       }
4659     }
4660 }
4661 
4662 /* ECOFF swapping routines.  These are used when dealing with the
4663    .mdebug section, which is in the ECOFF debugging format.  */
4664 static const struct ecoff_debug_swap mips_elf64_ecoff_debug_swap =
4665 {
4666   /* Symbol table magic number.  */
4667   magicSym2,
4668   /* Alignment of debugging information.  E.g., 4.  */
4669   8,
4670   /* Sizes of external symbolic information.  */
4671   sizeof (struct hdr_ext),
4672   sizeof (struct dnr_ext),
4673   sizeof (struct pdr_ext),
4674   sizeof (struct sym_ext),
4675   sizeof (struct opt_ext),
4676   sizeof (struct fdr_ext),
4677   sizeof (struct rfd_ext),
4678   sizeof (struct ext_ext),
4679   /* Functions to swap in external symbolic data.  */
4680   ecoff_swap_hdr_in,
4681   ecoff_swap_dnr_in,
4682   ecoff_swap_pdr_in,
4683   ecoff_swap_sym_in,
4684   ecoff_swap_opt_in,
4685   ecoff_swap_fdr_in,
4686   ecoff_swap_rfd_in,
4687   ecoff_swap_ext_in,
4688   _bfd_ecoff_swap_tir_in,
4689   _bfd_ecoff_swap_rndx_in,
4690   /* Functions to swap out external symbolic data.  */
4691   ecoff_swap_hdr_out,
4692   ecoff_swap_dnr_out,
4693   ecoff_swap_pdr_out,
4694   ecoff_swap_sym_out,
4695   ecoff_swap_opt_out,
4696   ecoff_swap_fdr_out,
4697   ecoff_swap_rfd_out,
4698   ecoff_swap_ext_out,
4699   _bfd_ecoff_swap_tir_out,
4700   _bfd_ecoff_swap_rndx_out,
4701   /* Function to read in symbolic data.  */
4702   _bfd_mips_elf_read_ecoff_info
4703 };
4704 
4705 /* Relocations in the 64 bit MIPS ELF ABI are more complex than in
4706    standard ELF.  This structure is used to redirect the relocation
4707    handling routines.  */
4708 
4709 const struct elf_size_info mips_elf64_size_info =
4710 {
4711   sizeof (Elf64_External_Ehdr),
4712   sizeof (Elf64_External_Phdr),
4713   sizeof (Elf64_External_Shdr),
4714   sizeof (Elf64_Mips_External_Rel),
4715   sizeof (Elf64_Mips_External_Rela),
4716   sizeof (Elf64_External_Sym),
4717   sizeof (Elf64_External_Dyn),
4718   sizeof (Elf_External_Note),
4719   4,		/* hash-table entry size */
4720   3,		/* internal relocations per external relocations */
4721   64,		/* arch_size */
4722   3,		/* log_file_align */
4723   ELFCLASS64,
4724   EV_CURRENT,
4725   bfd_elf64_write_out_phdrs,
4726   bfd_elf64_write_shdrs_and_ehdr,
4727   bfd_elf64_checksum_contents,
4728   mips_elf64_write_relocs,
4729   bfd_elf64_swap_symbol_in,
4730   bfd_elf64_swap_symbol_out,
4731   mips_elf64_slurp_reloc_table,
4732   bfd_elf64_slurp_symbol_table,
4733   bfd_elf64_swap_dyn_in,
4734   bfd_elf64_swap_dyn_out,
4735   mips_elf64_be_swap_reloc_in,
4736   mips_elf64_be_swap_reloc_out,
4737   mips_elf64_be_swap_reloca_in,
4738   mips_elf64_be_swap_reloca_out
4739 };
4740 
4741 #define ELF_ARCH			bfd_arch_mips
4742 #define ELF_TARGET_ID			MIPS_ELF_DATA
4743 #define ELF_MACHINE_CODE		EM_MIPS
4744 
4745 #define elf_backend_collect		TRUE
4746 #define elf_backend_type_change_ok	TRUE
4747 #define elf_backend_can_gc_sections	TRUE
4748 #define elf_backend_gc_mark_extra_sections \
4749 					_bfd_mips_elf_gc_mark_extra_sections
4750 #define elf_info_to_howto		mips_elf64_info_to_howto_rela
4751 #define elf_info_to_howto_rel		mips_elf64_info_to_howto_rela
4752 #define elf_backend_object_p		mips_elf64_object_p
4753 #define elf_backend_symbol_processing	_bfd_mips_elf_symbol_processing
4754 #define elf_backend_section_processing	_bfd_mips_elf_section_processing
4755 #define elf_backend_section_from_shdr	_bfd_mips_elf_section_from_shdr
4756 #define elf_backend_fake_sections	_bfd_mips_elf_fake_sections
4757 #define elf_backend_section_from_bfd_section \
4758 				_bfd_mips_elf_section_from_bfd_section
4759 #define elf_backend_add_symbol_hook	_bfd_mips_elf_add_symbol_hook
4760 #define elf_backend_link_output_symbol_hook \
4761 				_bfd_mips_elf_link_output_symbol_hook
4762 #define elf_backend_create_dynamic_sections \
4763 				_bfd_mips_elf_create_dynamic_sections
4764 #define elf_backend_check_relocs	_bfd_mips_elf_check_relocs
4765 #define elf_backend_merge_symbol_attribute \
4766 				_bfd_mips_elf_merge_symbol_attribute
4767 #define elf_backend_get_target_dtag	_bfd_mips_elf_get_target_dtag
4768 #define elf_backend_adjust_dynamic_symbol \
4769 				_bfd_mips_elf_adjust_dynamic_symbol
4770 #define elf_backend_always_size_sections \
4771 				_bfd_mips_elf_always_size_sections
4772 #define elf_backend_size_dynamic_sections \
4773 				_bfd_mips_elf_size_dynamic_sections
4774 #define elf_backend_init_index_section	_bfd_elf_init_1_index_section
4775 #define elf_backend_relocate_section    _bfd_mips_elf_relocate_section
4776 #define elf_backend_finish_dynamic_symbol \
4777 				_bfd_mips_elf_finish_dynamic_symbol
4778 #define elf_backend_finish_dynamic_sections \
4779 				_bfd_mips_elf_finish_dynamic_sections
4780 #define elf_backend_final_write_processing \
4781 				_bfd_mips_elf_final_write_processing
4782 #define elf_backend_additional_program_headers \
4783 				_bfd_mips_elf_additional_program_headers
4784 #define elf_backend_modify_segment_map	_bfd_mips_elf_modify_segment_map
4785 #define elf_backend_gc_mark_hook	_bfd_mips_elf_gc_mark_hook
4786 #define elf_backend_copy_indirect_symbol \
4787 					_bfd_mips_elf_copy_indirect_symbol
4788 #define elf_backend_hide_symbol		_bfd_mips_elf_hide_symbol
4789 #define elf_backend_ignore_discarded_relocs \
4790 					_bfd_mips_elf_ignore_discarded_relocs
4791 #define elf_backend_mips_irix_compat	elf64_mips_irix_compat
4792 #define elf_backend_mips_rtype_to_howto	mips_elf64_rtype_to_howto
4793 #define elf_backend_ecoff_debug_swap	&mips_elf64_ecoff_debug_swap
4794 #define elf_backend_size_info		mips_elf64_size_info
4795 
4796 #define elf_backend_grok_prstatus	elf64_mips_grok_prstatus
4797 #define elf_backend_grok_psinfo		elf64_mips_grok_psinfo
4798 
4799 #define elf_backend_got_header_size	(8 * MIPS_RESERVED_GOTNO)
4800 #define elf_backend_want_dynrelro	1
4801 
4802 /* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations
4803    work better/work only in RELA, so we default to this.  */
4804 #define elf_backend_may_use_rel_p	1
4805 #define elf_backend_may_use_rela_p	1
4806 #define elf_backend_default_use_rela_p	1
4807 #define elf_backend_rela_plts_and_copies_p 0
4808 #define elf_backend_plt_readonly	1
4809 #define elf_backend_plt_sym_val		_bfd_mips_elf_plt_sym_val
4810 
4811 #define elf_backend_sign_extend_vma	TRUE
4812 
4813 #define elf_backend_write_section	_bfd_mips_elf_write_section
4814 #define elf_backend_sort_relocs_p	_bfd_mips_elf_sort_relocs_p
4815 
4816 #define bfd_elf64_bfd_is_local_label_name \
4817 					mips_elf64_is_local_label_name
4818 #define bfd_elf64_bfd_is_target_special_symbol \
4819 					_bfd_mips_elf_is_target_special_symbol
4820 #define bfd_elf64_find_nearest_line	_bfd_mips_elf_find_nearest_line
4821 #define bfd_elf64_find_inliner_info	_bfd_mips_elf_find_inliner_info
4822 #define bfd_elf64_new_section_hook	_bfd_mips_elf_new_section_hook
4823 #define bfd_elf64_set_section_contents	_bfd_mips_elf_set_section_contents
4824 #define bfd_elf64_bfd_get_relocated_section_contents \
4825 				_bfd_elf_mips_get_relocated_section_contents
4826 #define bfd_elf64_bfd_link_hash_table_create \
4827 				_bfd_mips_elf_link_hash_table_create
4828 #define bfd_elf64_bfd_final_link	_bfd_mips_elf_final_link
4829 #define bfd_elf64_bfd_merge_private_bfd_data \
4830 				_bfd_mips_elf_merge_private_bfd_data
4831 #define bfd_elf64_bfd_set_private_flags	_bfd_mips_elf_set_private_flags
4832 #define bfd_elf64_bfd_print_private_bfd_data \
4833 				_bfd_mips_elf_print_private_bfd_data
4834 
4835 #define bfd_elf64_get_dynamic_reloc_upper_bound mips_elf64_get_dynamic_reloc_upper_bound
4836 #define bfd_elf64_mkobject		_bfd_mips_elf_mkobject
4837 
4838 /* The SGI style (n)64 NewABI.  */
4839 #define TARGET_LITTLE_SYM		mips_elf64_le_vec
4840 #define TARGET_LITTLE_NAME		"elf64-littlemips"
4841 #define TARGET_BIG_SYM			mips_elf64_be_vec
4842 #define TARGET_BIG_NAME			"elf64-bigmips"
4843 
4844 #define ELF_MAXPAGESIZE			0x10000
4845 #define ELF_COMMONPAGESIZE		0x1000
4846 
4847 #include "elf64-target.h"
4848 
4849 /* The SYSV-style 'traditional' (n)64 NewABI.  */
4850 #undef TARGET_LITTLE_SYM
4851 #undef TARGET_LITTLE_NAME
4852 #undef TARGET_BIG_SYM
4853 #undef TARGET_BIG_NAME
4854 
4855 #undef ELF_MAXPAGESIZE
4856 #undef ELF_COMMONPAGESIZE
4857 
4858 #define TARGET_LITTLE_SYM		mips_elf64_trad_le_vec
4859 #define TARGET_LITTLE_NAME		"elf64-tradlittlemips"
4860 #define TARGET_BIG_SYM			mips_elf64_trad_be_vec
4861 #define TARGET_BIG_NAME			"elf64-tradbigmips"
4862 
4863 #define ELF_MAXPAGESIZE			0x10000
4864 #define ELF_COMMONPAGESIZE		0x1000
4865 #define elf64_bed			elf64_tradbed
4866 
4867 #undef elf_backend_write_core_note
4868 #define elf_backend_write_core_note	elf64_mips_write_core_note
4869 
4870 /* Include the target file again for this target.  */
4871 #include "elf64-target.h"
4872 
4873 
4874 /* FreeBSD support.  */
4875 
4876 #undef TARGET_LITTLE_SYM
4877 #undef TARGET_LITTLE_NAME
4878 #undef TARGET_BIG_SYM
4879 #undef TARGET_BIG_NAME
4880 
4881 #define	TARGET_LITTLE_SYM		mips_elf64_tradfbsd_le_vec
4882 #define	TARGET_LITTLE_NAME		"elf64-tradlittlemips-freebsd"
4883 #define	TARGET_BIG_SYM			mips_elf64_tradfbsd_be_vec
4884 #define	TARGET_BIG_NAME			"elf64-tradbigmips-freebsd"
4885 
4886 #undef	ELF_OSABI
4887 #define	ELF_OSABI			ELFOSABI_FREEBSD
4888 
4889 #undef	elf64_bed
4890 #define elf64_bed				elf64_fbsd_tradbed
4891 
4892 #undef elf64_mips_write_core_note
4893 
4894 #include "elf64-target.h"
4895