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