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