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