Home | History | Annotate | Download | only in bfd
      1 /* TILE-Gx-specific support for ELF.
      2    Copyright (C) 2011-2014 Free Software Foundation, Inc.
      3 
      4    This file is part of BFD, the Binary File Descriptor library.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software
     18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     19    MA 02110-1301, USA.  */
     20 
     21 #include "sysdep.h"
     22 #include "bfd.h"
     23 #include "libbfd.h"
     24 #include "elf-bfd.h"
     25 #include "elf/tilegx.h"
     26 #include "opcode/tilegx.h"
     27 #include "libiberty.h"
     28 #include "elfxx-tilegx.h"
     29 
     30 #define ABI_64_P(abfd) \
     31   (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64)
     32 
     33 #define TILEGX_ELF_WORD_BYTES(htab) \
     34   ((htab)->bytes_per_word)
     35 
     36 /* The size of an external RELA relocation.  */
     37 #define TILEGX_ELF_RELA_BYTES(htab) \
     38   ((htab)->bytes_per_rela)
     39 
     40 /* Both 32-bit and 64-bit tilegx encode this in an identical manner,
     41    so just take advantage of that.  */
     42 #define TILEGX_ELF_R_TYPE(r_info) \
     43   ((r_info) & 0xFF)
     44 
     45 #define TILEGX_ELF_R_INFO(htab, in_rel, index, type)	\
     46   ((htab)->r_info (in_rel, index, type))
     47 
     48 #define TILEGX_ELF_R_SYMNDX(htab, r_info) \
     49   ((htab)->r_symndx(r_info))
     50 
     51 #define TILEGX_ELF_DTPOFF_RELOC(htab) \
     52   ((htab)->dtpoff_reloc)
     53 
     54 #define TILEGX_ELF_DTPMOD_RELOC(htab) \
     55   ((htab)->dtpmod_reloc)
     56 
     57 #define TILEGX_ELF_TPOFF_RELOC(htab) \
     58   ((htab)->tpoff_reloc)
     59 
     60 #define TILEGX_ELF_PUT_WORD(htab, bfd, val, ptr) \
     61   ((htab)->put_word (bfd, val, ptr))
     62 
     63 /* The name of the dynamic interpreter.  This is put in the .interp
     64    section.  */
     65 
     66 #define ELF64_DYNAMIC_INTERPRETER "/lib/ld.so.1"
     67 #define ELF32_DYNAMIC_INTERPRETER "/lib32/ld.so.1"
     68 
     69 
     70 static reloc_howto_type tilegx_elf_howto_table [] =
     71 {
     72   /* This reloc does nothing.  */
     73   HOWTO (R_TILEGX_NONE,	/* type */
     74 	 0,			/* rightshift */
     75 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
     76 	 32,			/* bitsize */
     77 	 FALSE,			/* pc_relative */
     78 	 0,			/* bitpos */
     79 	 complain_overflow_bitfield, /* complain_on_overflow */
     80 	 bfd_elf_generic_reloc,	/* special_function */
     81 	 "R_TILEGX_NONE",	/* name */
     82 	 FALSE,			/* partial_inplace */
     83 	 0,			/* src_mask */
     84 	 0,			/* dst_mask */
     85 	 FALSE),		/* pcrel_offset */
     86 #ifdef BFD64
     87   /* A 64 bit absolute relocation.  */
     88   HOWTO (R_TILEGX_64,	/* type */
     89 	 0,			/* rightshift */
     90 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
     91 	 64,			/* bitsize */
     92 	 FALSE,			/* pc_relative */
     93 	 0,			/* bitpos */
     94 	 complain_overflow_dont, /* complain_on_overflow */
     95 	 bfd_elf_generic_reloc,	/* special_function */
     96 	 "R_TILEGX_64",	/* name */
     97 	 FALSE,			/* partial_inplace */
     98 	 0,			/* src_mask */
     99 	 0xffffffffffffffffULL,	/* dst_mask */
    100 	 FALSE),		/* pcrel_offset */
    101 #endif
    102   /* A 32 bit absolute relocation.  */
    103   HOWTO (R_TILEGX_32,	/* type */
    104 	 0,			/* rightshift */
    105 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    106 	 32,			/* bitsize */
    107 	 FALSE,			/* pc_relative */
    108 	 0,			/* bitpos */
    109 	 complain_overflow_dont, /* complain_on_overflow */
    110 	 bfd_elf_generic_reloc,	/* special_function */
    111 	 "R_TILEGX_32",	/* name */
    112 	 FALSE,			/* partial_inplace */
    113 	 0,			/* src_mask */
    114 	 0xffffffff,		/* dst_mask */
    115 	 FALSE),		/* pcrel_offset */
    116 
    117   /* A 16 bit absolute relocation.  */
    118   HOWTO (R_TILEGX_16,	/* type */
    119 	 0,			/* rightshift */
    120 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    121 	 16,			/* bitsize */
    122 	 FALSE,			/* pc_relative */
    123 	 0,			/* bitpos */
    124 	 complain_overflow_bitfield, /* complain_on_overflow */
    125 	 bfd_elf_generic_reloc,	/* special_function */
    126 	 "R_TILEGX_16",	/* name */
    127 	 FALSE,			/* partial_inplace */
    128 	 0,			/* src_mask */
    129 	 0xffff,		/* dst_mask */
    130 	 FALSE),		/* pcrel_offset */
    131 
    132   /* An 8 bit absolute relocation.  */
    133   HOWTO (R_TILEGX_8,	/* type */
    134 	 0,			/* rightshift */
    135 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    136 	 8,			/* bitsize */
    137 	 FALSE,			/* pc_relative */
    138 	 0,			/* bitpos */
    139 	 complain_overflow_unsigned, /* complain_on_overflow */
    140 	 bfd_elf_generic_reloc,	/* special_function */
    141 	 "R_TILEGX_8",	/* name */
    142 	 FALSE,			/* partial_inplace */
    143 	 0,			/* src_mask */
    144 	 0xff,			/* dst_mask */
    145 	 FALSE),		/* pcrel_offset */
    146 #ifdef BFD64
    147   /* A 64 bit pc-relative relocation.  */
    148   HOWTO (R_TILEGX_64_PCREL,/* type */
    149 	 0,			/* rightshift */
    150 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
    151 	 64,			/* bitsize */
    152 	 TRUE,			/* pc_relative */
    153 	 0,			/* bitpos */
    154 	 complain_overflow_dont, /* complain_on_overflow */
    155 	 bfd_elf_generic_reloc,	/* special_function */
    156 	 "R_TILEGX_32_PCREL", /* name */
    157 	 FALSE,			/* partial_inplace */
    158 	 0,			/* src_mask */
    159 	 0xffffffffffffffffULL,	/* dst_mask */
    160 	 TRUE),			/* pcrel_offset */
    161 #endif
    162   /* A 32 bit pc-relative relocation.  */
    163   HOWTO (R_TILEGX_32_PCREL,/* type */
    164 	 0,			/* rightshift */
    165 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    166 	 32,			/* bitsize */
    167 	 TRUE,			/* pc_relative */
    168 	 0,			/* bitpos */
    169 	 complain_overflow_dont, /* complain_on_overflow */
    170 	 bfd_elf_generic_reloc,	/* special_function */
    171 	 "R_TILEGX_32_PCREL", /* name */
    172 	 FALSE,			/* partial_inplace */
    173 	 0,			/* src_mask */
    174 	 0xffffffff,		/* dst_mask */
    175 	 TRUE),			/* pcrel_offset */
    176 
    177   /* A 16 bit pc-relative relocation.  */
    178   HOWTO (R_TILEGX_16_PCREL,/* type */
    179 	 0,			/* rightshift */
    180 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    181 	 16,			/* bitsize */
    182 	 TRUE,			/* pc_relative */
    183 	 0,			/* bitpos */
    184 	 complain_overflow_signed, /* complain_on_overflow */
    185 	 bfd_elf_generic_reloc,	/* special_function */
    186 	 "R_TILEGX_16_PCREL",	/* name */
    187 	 FALSE,			/* partial_inplace */
    188 	 0,			/* src_mask */
    189 	 0xffff,		/* dst_mask */
    190 	 TRUE),			/* pcrel_offset */
    191 
    192   /* An 8 bit pc-relative relocation.  */
    193   HOWTO (R_TILEGX_8_PCREL,	/* type */
    194 	 0,			/* rightshift */
    195 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    196 	 8,			/* bitsize */
    197 	 TRUE,			/* pc_relative */
    198 	 0,			/* bitpos */
    199 	 complain_overflow_signed, /* complain_on_overflow */
    200 	 bfd_elf_generic_reloc,	/* special_function */
    201 	 "R_TILEGX_8_PCREL",/* name */
    202 	 FALSE,			/* partial_inplace */
    203 	 0,			/* src_mask */
    204 	 0xff,			/* dst_mask */
    205 	 TRUE),			/* pcrel_offset */
    206 
    207   /* A 16 bit relocation without overflow.  */
    208   HOWTO (R_TILEGX_HW0,	/* type */
    209 	 0,			/* rightshift */
    210 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    211 	 16,			/* bitsize */
    212 	 FALSE,			/* pc_relative */
    213 	 0,			/* bitpos */
    214 	 complain_overflow_dont,/* complain_on_overflow */
    215 	 bfd_elf_generic_reloc,	/* special_function */
    216 	 "R_TILEGX_HW0",	/* name */
    217 	 FALSE,			/* partial_inplace */
    218 	 0,			/* src_mask */
    219 	 0xffff,		/* dst_mask */
    220 	 FALSE),		/* pcrel_offset */
    221 
    222   /* A 16 bit relocation without overflow.  */
    223   HOWTO (R_TILEGX_HW1,	/* type */
    224 	 16,			/* rightshift */
    225 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    226 	 16,			/* bitsize */
    227 	 FALSE,			/* pc_relative */
    228 	 0,			/* bitpos */
    229 	 complain_overflow_dont,/* complain_on_overflow */
    230 	 bfd_elf_generic_reloc,	/* special_function */
    231 	 "R_TILEGX_HW1",	/* name */
    232 	 FALSE,			/* partial_inplace */
    233 	 0,			/* src_mask */
    234 	 0xffff,		/* dst_mask */
    235 	 FALSE),		/* pcrel_offset */
    236 
    237   /* A 16 bit relocation without overflow.  */
    238   HOWTO (R_TILEGX_HW2,	/* type */
    239 	 32,			/* rightshift */
    240 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    241 	 16,			/* bitsize */
    242 	 FALSE,			/* pc_relative */
    243 	 0,			/* bitpos */
    244 	 complain_overflow_dont,/* complain_on_overflow */
    245 	 bfd_elf_generic_reloc,	/* special_function */
    246 	 "R_TILEGX_HW2",	/* name */
    247 	 FALSE,			/* partial_inplace */
    248 	 0,			/* src_mask */
    249 	 0xffff,		/* dst_mask */
    250 	 FALSE),		/* pcrel_offset */
    251 
    252   /* A 16 bit relocation without overflow.  */
    253   HOWTO (R_TILEGX_HW3,	/* type */
    254 	 48,			/* rightshift */
    255 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    256 	 16,			/* bitsize */
    257 	 FALSE,			/* pc_relative */
    258 	 0,			/* bitpos */
    259 	 complain_overflow_dont,/* complain_on_overflow */
    260 	 bfd_elf_generic_reloc,	/* special_function */
    261 	 "R_TILEGX_HW3",	/* name */
    262 	 FALSE,			/* partial_inplace */
    263 	 0,			/* src_mask */
    264 	 0xffff,		/* dst_mask */
    265 	 FALSE),		/* pcrel_offset */
    266 
    267   /* A 16 bit relocation with overflow.  */
    268   HOWTO (R_TILEGX_HW0_LAST,	/* type */
    269 	 0,			/* rightshift */
    270 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    271 	 16,			/* bitsize */
    272 	 FALSE,			/* pc_relative */
    273 	 0,			/* bitpos */
    274 	 complain_overflow_signed,/* complain_on_overflow */
    275 	 bfd_elf_generic_reloc,	/* special_function */
    276 	 "R_TILEGX_HW0_LAST",	/* name */
    277 	 FALSE,			/* partial_inplace */
    278 	 0,			/* src_mask */
    279 	 0xffff,		/* dst_mask */
    280 	 FALSE),		/* pcrel_offset */
    281 
    282   /* A 16 bit relocation with overflow.  */
    283   HOWTO (R_TILEGX_HW1_LAST,	/* type */
    284 	 16,			/* rightshift */
    285 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    286 	 16,			/* bitsize */
    287 	 FALSE,			/* pc_relative */
    288 	 0,			/* bitpos */
    289 	 complain_overflow_signed,/* complain_on_overflow */
    290 	 bfd_elf_generic_reloc,	/* special_function */
    291 	 "R_TILEGX_HW1_LAST",	/* name */
    292 	 FALSE,			/* partial_inplace */
    293 	 0,			/* src_mask */
    294 	 0xffff,		/* dst_mask */
    295 	 FALSE),		/* pcrel_offset */
    296 
    297   /* A 16 bit relocation with overflow.  */
    298   HOWTO (R_TILEGX_HW2_LAST,	/* type */
    299 	 32,			/* rightshift */
    300 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
    301 	 16,			/* bitsize */
    302 	 FALSE,			/* pc_relative */
    303 	 0,			/* bitpos */
    304 	 complain_overflow_signed,/* complain_on_overflow */
    305 	 bfd_elf_generic_reloc,	/* special_function */
    306 	 "R_TILEGX_HW2_LAST",	/* name */
    307 	 FALSE,			/* partial_inplace */
    308 	 0,			/* src_mask */
    309 	 0xffff,		/* dst_mask */
    310 	 FALSE),		/* pcrel_offset */
    311 
    312   HOWTO (R_TILEGX_COPY,		/* type */
    313 	 0,			/* rightshift */
    314 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    315 	 0,			/* bitsize */
    316 	 FALSE,			/* pc_relative */
    317 	 0,			/* bitpos */
    318 	 complain_overflow_dont, /* complain_on_overflow */
    319 	 bfd_elf_generic_reloc,	/* special_function */
    320 	 "R_TILEGX_COPY",		/* name */
    321 	 FALSE,			/* partial_inplace */
    322 	 0,			/* src_mask */
    323 	 0,			/* dst_mask */
    324 	 TRUE),			/* pcrel_offset */
    325 
    326   HOWTO (R_TILEGX_GLOB_DAT,	/* type */
    327 	 0,			/* rightshift */
    328 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    329 	 0,			/* bitsize */
    330 	 FALSE,			/* pc_relative */
    331 	 0,			/* bitpos */
    332 	 complain_overflow_dont, /* complain_on_overflow */
    333 	 bfd_elf_generic_reloc,	/* special_function */
    334 	 "R_TILEGX_GLOB_DAT",	/* name */
    335 	 FALSE,			/* partial_inplace */
    336 	 0,			/* src_mask */
    337 	 0,			/* dst_mask */
    338 	 TRUE),			/* pcrel_offset */
    339 
    340   HOWTO (R_TILEGX_JMP_SLOT,	/* type */
    341 	 0,			/* rightshift */
    342 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    343 	 0,			/* bitsize */
    344 	 FALSE,			/* pc_relative */
    345 	 0,			/* bitpos */
    346 	 complain_overflow_dont, /* complain_on_overflow */
    347 	 bfd_elf_generic_reloc,	/* special_function */
    348 	 "R_TILEGX_JMP_SLOT",	/* name */
    349 	 FALSE,			/* partial_inplace */
    350 	 0,			/* src_mask */
    351 	 0,			/* dst_mask */
    352 	 TRUE),			/* pcrel_offset */
    353 
    354   HOWTO (R_TILEGX_RELATIVE,	/* type */
    355 	 0,			/* rightshift */
    356 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
    357 	 0,			/* bitsize */
    358 	 FALSE,			/* pc_relative */
    359 	 0,			/* bitpos */
    360 	 complain_overflow_dont, /* complain_on_overflow */
    361 	 bfd_elf_generic_reloc,	/* special_function */
    362 	 "R_TILEGX_RELATIVE",	/* name */
    363 	 FALSE,			/* partial_inplace */
    364 	 0,			/* src_mask */
    365 	 0,			/* dst_mask */
    366 	 TRUE),			/* pcrel_offset */
    367 
    368   HOWTO (R_TILEGX_BROFF_X1, /* type */
    369 	 TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */
    370 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    371 	 17,			/* bitsize */
    372 	 TRUE,			/* pc_relative */
    373 	 0,			/* bitpos */
    374 	 complain_overflow_signed, /* complain_on_overflow */
    375 	 bfd_elf_generic_reloc, /* special_function */
    376 	 "R_TILEGX_BROFF_X1", /* name */
    377 	 FALSE,			/* partial_inplace */
    378 	 0,			/* src_mask */
    379 	 -1,			/* dst_mask */
    380 	 TRUE),			/* pcrel_offset */
    381 
    382   HOWTO (R_TILEGX_JUMPOFF_X1, /* type */
    383 	 TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */
    384 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    385 	 27,			/* bitsize */
    386 	 TRUE,			/* pc_relative */
    387 	 0,			/* bitpos */
    388 	 complain_overflow_signed,/* complain_on_overflow */
    389 	 bfd_elf_generic_reloc, /* special_function */
    390 	 "R_TILEGX_JUMPOFF_X1", /* name */
    391 	 FALSE,			/* partial_inplace */
    392 	 0,			/* src_mask */
    393 	 -1,			/* dst_mask */
    394 	 TRUE), 		/* pcrel_offset */
    395 
    396   HOWTO (R_TILEGX_JUMPOFF_X1_PLT, /* type */
    397 	 TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */
    398 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    399 	 27,			/* bitsize */
    400 	 TRUE,			/* pc_relative */
    401 	 0,			/* bitpos */
    402 	 complain_overflow_signed,/* complain_on_overflow */
    403 	 bfd_elf_generic_reloc, /* special_function */
    404 	 "R_TILEGX_JUMPOFF_X1_PLT", /* name */
    405 	 FALSE,			/* partial_inplace */
    406 	 0,			/* src_mask */
    407 	 -1,			/* dst_mask */
    408 	 TRUE), 		/* pcrel_offset */
    409 
    410 #define TILEGX_IMM_HOWTO(name, size, bitsize) \
    411   HOWTO (name, 0, size, bitsize, FALSE, 0, \
    412          complain_overflow_signed, bfd_elf_generic_reloc, \
    413          #name, FALSE, 0, -1, FALSE)
    414 
    415 #define TILEGX_UIMM_HOWTO(name, size, bitsize) \
    416   HOWTO (name, 0, size, bitsize, FALSE, 0, \
    417          complain_overflow_unsigned, bfd_elf_generic_reloc, \
    418          #name, FALSE, 0, -1, FALSE)
    419 
    420   TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X0, 0, 8),
    421   TILEGX_IMM_HOWTO(R_TILEGX_IMM8_Y0, 0, 8),
    422   TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X1, 0, 8),
    423   TILEGX_IMM_HOWTO(R_TILEGX_IMM8_Y1, 0, 8),
    424   TILEGX_IMM_HOWTO(R_TILEGX_DEST_IMM8_X1, 0, 8),
    425 
    426   TILEGX_UIMM_HOWTO(R_TILEGX_MT_IMM14_X1, 1, 14),
    427   TILEGX_UIMM_HOWTO(R_TILEGX_MF_IMM14_X1, 1, 14),
    428 
    429   TILEGX_UIMM_HOWTO(R_TILEGX_MMSTART_X0, 0, 6),
    430   TILEGX_UIMM_HOWTO(R_TILEGX_MMEND_X0,   0, 6),
    431 
    432   TILEGX_UIMM_HOWTO(R_TILEGX_SHAMT_X0, 0, 6),
    433   TILEGX_UIMM_HOWTO(R_TILEGX_SHAMT_X1, 0, 6),
    434   TILEGX_UIMM_HOWTO(R_TILEGX_SHAMT_Y0, 0, 6),
    435   TILEGX_UIMM_HOWTO(R_TILEGX_SHAMT_Y1, 0, 6),
    436 
    437 #define TILEGX_IMM16_HOWTO(name, rshift) \
    438   HOWTO (name, rshift, 1, 16, FALSE, 0, \
    439          complain_overflow_dont, bfd_elf_generic_reloc, \
    440          #name, FALSE, 0, 0xffff, FALSE)
    441 
    442   TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW0, 0),
    443   TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW0, 0),
    444   TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW1, 16),
    445   TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW1, 16),
    446   TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW2, 32),
    447   TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW2, 32),
    448   TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW3, 48),
    449   TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW3, 48),
    450 
    451 #define TILEGX_IMM16_HOWTO_LAST(name, rshift) \
    452   HOWTO (name, rshift, 1, 16, FALSE, 0, \
    453          complain_overflow_signed, bfd_elf_generic_reloc, \
    454          #name, FALSE, 0, 0xffff, FALSE)
    455 
    456   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW0_LAST, 0),
    457   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW0_LAST, 0),
    458   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW1_LAST, 16),
    459   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW1_LAST, 16),
    460   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW2_LAST, 32),
    461   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW2_LAST, 32),
    462 
    463   /* PC-relative offsets. */
    464 
    465 #define TILEGX_IMM16_HOWTO_PCREL(name, rshift) \
    466   HOWTO (name, rshift, 1, 16, TRUE, 0, \
    467          complain_overflow_dont, bfd_elf_generic_reloc, \
    468          #name, FALSE, 0, 0xffff, TRUE)
    469 
    470   TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X0_HW0_PCREL, 0),
    471   TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X1_HW0_PCREL, 0),
    472   TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X0_HW1_PCREL, 16),
    473   TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X1_HW1_PCREL, 16),
    474   TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X0_HW2_PCREL, 32),
    475   TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X1_HW2_PCREL, 32),
    476   TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X0_HW3_PCREL, 48),
    477   TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X1_HW3_PCREL, 48),
    478 
    479 #define TILEGX_IMM16_HOWTO_LAST_PCREL(name, rshift) \
    480   HOWTO (name, rshift, 1, 16, TRUE, 0, \
    481          complain_overflow_signed, bfd_elf_generic_reloc, \
    482          #name, FALSE, 0, 0xffff, TRUE)
    483 
    484   TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW0_LAST_PCREL,  0),
    485   TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW0_LAST_PCREL,  0),
    486   TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW1_LAST_PCREL, 16),
    487   TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW1_LAST_PCREL, 16),
    488   TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW2_LAST_PCREL, 32),
    489   TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW2_LAST_PCREL, 32),
    490 
    491   TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW0_GOT, 0),
    492   TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW0_GOT, 0),
    493 
    494   TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X0_HW0_PLT_PCREL, 0),
    495   TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X1_HW0_PLT_PCREL, 0),
    496   TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X0_HW1_PLT_PCREL, 16),
    497   TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X1_HW1_PLT_PCREL, 16),
    498   TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X0_HW2_PLT_PCREL, 32),
    499   TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X1_HW2_PLT_PCREL, 32),
    500 
    501   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW0_LAST_GOT, 0),
    502   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW0_LAST_GOT, 0),
    503   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW1_LAST_GOT, 16),
    504   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW1_LAST_GOT, 16),
    505 
    506   TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X0_HW3_PLT_PCREL, 48),
    507   TILEGX_IMM16_HOWTO_PCREL (R_TILEGX_IMM16_X1_HW3_PLT_PCREL, 48),
    508 
    509   TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW0_TLS_GD, 0),
    510   TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW0_TLS_GD, 0),
    511 
    512   TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW0_TLS_LE, 0),
    513   TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW0_TLS_LE, 0),
    514   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE, 0),
    515   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE, 0),
    516   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE, 16),
    517   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE, 16),
    518 
    519   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD, 0),
    520   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD, 0),
    521   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD, 16),
    522   TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD, 16),
    523   EMPTY_HOWTO (90),
    524   EMPTY_HOWTO (91),
    525 
    526 #define TILEGX_IMM16_HOWTO_TLS_IE(name, rshift) \
    527   HOWTO (name, rshift, 1, 16, FALSE, 0, \
    528          complain_overflow_dont, bfd_elf_generic_reloc, \
    529          #name, FALSE, 0, 0xffff, TRUE)
    530 
    531   TILEGX_IMM16_HOWTO_TLS_IE (R_TILEGX_IMM16_X0_HW0_TLS_IE, 0),
    532   TILEGX_IMM16_HOWTO_TLS_IE (R_TILEGX_IMM16_X1_HW0_TLS_IE, 0),
    533 
    534   TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL,  0),
    535   TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL,  0),
    536   TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL, 16),
    537   TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL, 16),
    538   TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL, 32),
    539   TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL, 32),
    540 
    541 #define TILEGX_IMM16_HOWTO_LAST_TLS_IE(name, rshift) \
    542   HOWTO (name, rshift, 1, 16, FALSE, 0, \
    543          complain_overflow_signed, bfd_elf_generic_reloc, \
    544          #name, FALSE, 0, 0xffff, TRUE)
    545 
    546   TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE, 0),
    547   TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE, 0),
    548   TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE, 16),
    549   TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE, 16),
    550   EMPTY_HOWTO (104),
    551   EMPTY_HOWTO (105),
    552 
    553   HOWTO(R_TILEGX_TLS_DTPMOD64, 0, 0, 0, FALSE, 0, complain_overflow_dont,
    554         bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPMOD64",
    555         FALSE, 0, 0, TRUE),
    556   HOWTO(R_TILEGX_TLS_DTPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield,
    557         bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPOFF64",
    558         FALSE, 0, -1, TRUE),
    559   HOWTO(R_TILEGX_TLS_TPOFF64, 0, 0, 0, FALSE, 0, complain_overflow_dont,
    560         bfd_elf_generic_reloc, "R_TILEGX_TLS_TPOFF64",
    561         FALSE, 0, 0, TRUE),
    562 
    563   HOWTO(R_TILEGX_TLS_DTPMOD32, 0, 0, 0, FALSE, 0, complain_overflow_dont,
    564         bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPMOD32",
    565         FALSE, 0, 0, TRUE),
    566   HOWTO(R_TILEGX_TLS_DTPOFF32, 0, 4, 32, FALSE, 0, complain_overflow_bitfield,
    567         bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPOFF32",
    568         FALSE, 0, -1, TRUE),
    569   HOWTO(R_TILEGX_TLS_TPOFF32, 0, 0, 0, FALSE, 0, complain_overflow_dont,
    570         bfd_elf_generic_reloc, "R_TILEGX_TLS_TPOFF32",
    571         FALSE, 0, 0, TRUE),
    572 
    573   HOWTO (R_TILEGX_TLS_GD_CALL, /* type */
    574 	 TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */
    575 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
    576 	 27,			/* bitsize */
    577 	 TRUE,			/* pc_relative */
    578 	 0,			/* bitpos */
    579 	 complain_overflow_signed,/* complain_on_overflow */
    580 	 bfd_elf_generic_reloc, /* special_function */
    581 	 "R_TILEGX_TLS_GD_CALL", /* name */
    582 	 FALSE,			/* partial_inplace */
    583 	 0,			/* src_mask */
    584 	 -1,			/* dst_mask */
    585 	 TRUE), 		/* pcrel_offset */
    586 
    587   TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X0_TLS_GD_ADD,  0,  8),
    588   TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X1_TLS_GD_ADD,  0,  8),
    589   TILEGX_IMM_HOWTO(R_TILEGX_IMM8_Y0_TLS_GD_ADD,  0,  8),
    590   TILEGX_IMM_HOWTO(R_TILEGX_IMM8_Y1_TLS_GD_ADD,  0,  8),
    591   TILEGX_IMM_HOWTO(R_TILEGX_TLS_IE_LOAD, 0,  8),
    592   TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X0_TLS_ADD,  0,  8),
    593   TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X1_TLS_ADD,  0,  8),
    594   TILEGX_IMM_HOWTO(R_TILEGX_IMM8_Y0_TLS_ADD,  0,  8),
    595   TILEGX_IMM_HOWTO(R_TILEGX_IMM8_Y1_TLS_ADD,  0,  8),
    596 };
    597 
    598 static reloc_howto_type tilegx_elf_howto_table2 [] =
    599 {
    600   /* GNU extension to record C++ vtable hierarchy */
    601   HOWTO (R_TILEGX_GNU_VTINHERIT, /* type */
    602          0,                     /* rightshift */
    603          4,                     /* size (0 = byte, 1 = short, 2 = long) */
    604          0,                     /* bitsize */
    605          FALSE,                 /* pc_relative */
    606          0,                     /* bitpos */
    607          complain_overflow_dont, /* complain_on_overflow */
    608          NULL,                  /* special_function */
    609          "R_TILEGX_GNU_VTINHERIT", /* name */
    610          FALSE,                 /* partial_inplace */
    611          0,                     /* src_mask */
    612          0,                     /* dst_mask */
    613          FALSE),                /* pcrel_offset */
    614 
    615   /* GNU extension to record C++ vtable member usage */
    616   HOWTO (R_TILEGX_GNU_VTENTRY,     /* type */
    617          0,                     /* rightshift */
    618          4,                     /* size (0 = byte, 1 = short, 2 = long) */
    619          0,                     /* bitsize */
    620          FALSE,                 /* pc_relative */
    621          0,                     /* bitpos */
    622          complain_overflow_dont, /* complain_on_overflow */
    623          _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
    624          "R_TILEGX_GNU_VTENTRY",   /* name */
    625          FALSE,                 /* partial_inplace */
    626          0,                     /* src_mask */
    627          0,                     /* dst_mask */
    628          FALSE),                /* pcrel_offset */
    629 
    630 };
    631 
    632 /* Map BFD reloc types to TILEGX ELF reloc types.  */
    634 
    635 typedef struct tilegx_reloc_map
    636 {
    637   bfd_reloc_code_real_type  bfd_reloc_val;
    638   unsigned int              tilegx_reloc_val;
    639   reloc_howto_type *        table;
    640 } reloc_map;
    641 
    642 static const reloc_map tilegx_reloc_map [] =
    643 {
    644 #define TH_REMAP(bfd, tilegx) \
    645   { bfd, tilegx, tilegx_elf_howto_table },
    646 
    647   /* Standard relocations. */
    648   TH_REMAP (BFD_RELOC_NONE,                    R_TILEGX_NONE)
    649   TH_REMAP (BFD_RELOC_64,                      R_TILEGX_64)
    650   TH_REMAP (BFD_RELOC_32,                      R_TILEGX_32)
    651   TH_REMAP (BFD_RELOC_16,                      R_TILEGX_16)
    652   TH_REMAP (BFD_RELOC_8,                       R_TILEGX_8)
    653   TH_REMAP (BFD_RELOC_64_PCREL,                R_TILEGX_64_PCREL)
    654   TH_REMAP (BFD_RELOC_32_PCREL,                R_TILEGX_32_PCREL)
    655   TH_REMAP (BFD_RELOC_16_PCREL,                R_TILEGX_16_PCREL)
    656   TH_REMAP (BFD_RELOC_8_PCREL,                 R_TILEGX_8_PCREL)
    657 
    658 #define SIMPLE_REMAP(t) TH_REMAP (BFD_RELOC_##t, R_##t)
    659 
    660   /* Custom relocations. */
    661   SIMPLE_REMAP (TILEGX_HW0)
    662   SIMPLE_REMAP (TILEGX_HW1)
    663   SIMPLE_REMAP (TILEGX_HW2)
    664   SIMPLE_REMAP (TILEGX_HW3)
    665   SIMPLE_REMAP (TILEGX_HW0_LAST)
    666   SIMPLE_REMAP (TILEGX_HW1_LAST)
    667   SIMPLE_REMAP (TILEGX_HW2_LAST)
    668   SIMPLE_REMAP (TILEGX_COPY)
    669   SIMPLE_REMAP (TILEGX_GLOB_DAT)
    670   SIMPLE_REMAP (TILEGX_JMP_SLOT)
    671   SIMPLE_REMAP (TILEGX_RELATIVE)
    672   SIMPLE_REMAP (TILEGX_BROFF_X1)
    673   SIMPLE_REMAP (TILEGX_JUMPOFF_X1)
    674   SIMPLE_REMAP (TILEGX_JUMPOFF_X1_PLT)
    675   SIMPLE_REMAP (TILEGX_IMM8_X0)
    676   SIMPLE_REMAP (TILEGX_IMM8_Y0)
    677   SIMPLE_REMAP (TILEGX_IMM8_X1)
    678   SIMPLE_REMAP (TILEGX_IMM8_Y1)
    679   SIMPLE_REMAP (TILEGX_DEST_IMM8_X1)
    680   SIMPLE_REMAP (TILEGX_MT_IMM14_X1)
    681   SIMPLE_REMAP (TILEGX_MF_IMM14_X1)
    682   SIMPLE_REMAP (TILEGX_MMSTART_X0)
    683   SIMPLE_REMAP (TILEGX_MMEND_X0)
    684   SIMPLE_REMAP (TILEGX_SHAMT_X0)
    685   SIMPLE_REMAP (TILEGX_SHAMT_X1)
    686   SIMPLE_REMAP (TILEGX_SHAMT_Y0)
    687   SIMPLE_REMAP (TILEGX_SHAMT_Y1)
    688   SIMPLE_REMAP (TILEGX_IMM16_X0_HW0)
    689   SIMPLE_REMAP (TILEGX_IMM16_X1_HW0)
    690   SIMPLE_REMAP (TILEGX_IMM16_X0_HW1)
    691   SIMPLE_REMAP (TILEGX_IMM16_X1_HW1)
    692   SIMPLE_REMAP (TILEGX_IMM16_X0_HW2)
    693   SIMPLE_REMAP (TILEGX_IMM16_X1_HW2)
    694   SIMPLE_REMAP (TILEGX_IMM16_X0_HW3)
    695   SIMPLE_REMAP (TILEGX_IMM16_X1_HW3)
    696   SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_LAST)
    697   SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_LAST)
    698   SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_LAST)
    699   SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_LAST)
    700   SIMPLE_REMAP (TILEGX_IMM16_X0_HW2_LAST)
    701   SIMPLE_REMAP (TILEGX_IMM16_X1_HW2_LAST)
    702   SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_PCREL)
    703   SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_PCREL)
    704   SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_PCREL)
    705   SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_PCREL)
    706   SIMPLE_REMAP (TILEGX_IMM16_X0_HW2_PCREL)
    707   SIMPLE_REMAP (TILEGX_IMM16_X1_HW2_PCREL)
    708   SIMPLE_REMAP (TILEGX_IMM16_X0_HW3_PCREL)
    709   SIMPLE_REMAP (TILEGX_IMM16_X1_HW3_PCREL)
    710   SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_LAST_PCREL)
    711   SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_LAST_PCREL)
    712   SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_LAST_PCREL)
    713   SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_LAST_PCREL)
    714   SIMPLE_REMAP (TILEGX_IMM16_X0_HW2_LAST_PCREL)
    715   SIMPLE_REMAP (TILEGX_IMM16_X1_HW2_LAST_PCREL)
    716   SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_GOT)
    717   SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_GOT)
    718   SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_PLT_PCREL)
    719   SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_PLT_PCREL)
    720   SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_PLT_PCREL)
    721   SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_PLT_PCREL)
    722   SIMPLE_REMAP (TILEGX_IMM16_X0_HW2_PLT_PCREL)
    723   SIMPLE_REMAP (TILEGX_IMM16_X1_HW2_PLT_PCREL)
    724   SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_LAST_GOT)
    725   SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_LAST_GOT)
    726   SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_LAST_GOT)
    727   SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_LAST_GOT)
    728   SIMPLE_REMAP (TILEGX_IMM16_X0_HW3_PLT_PCREL)
    729   SIMPLE_REMAP (TILEGX_IMM16_X1_HW3_PLT_PCREL)
    730   SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_TLS_GD)
    731   SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_TLS_GD)
    732   SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_TLS_LE)
    733   SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_TLS_LE)
    734   SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_LAST_TLS_LE)
    735   SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_LAST_TLS_LE)
    736   SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_LAST_TLS_LE)
    737   SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_LAST_TLS_LE)
    738   SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_LAST_TLS_GD)
    739   SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_LAST_TLS_GD)
    740   SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_LAST_TLS_GD)
    741   SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_LAST_TLS_GD)
    742   SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_TLS_IE)
    743   SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_TLS_IE)
    744   SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL)
    745   SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL)
    746   SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL)
    747   SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL)
    748   SIMPLE_REMAP (TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL)
    749   SIMPLE_REMAP (TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL)
    750   SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_LAST_TLS_IE)
    751   SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_LAST_TLS_IE)
    752   SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_LAST_TLS_IE)
    753   SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_LAST_TLS_IE)
    754 
    755   SIMPLE_REMAP (TILEGX_TLS_DTPMOD64)
    756   SIMPLE_REMAP (TILEGX_TLS_DTPOFF64)
    757   SIMPLE_REMAP (TILEGX_TLS_TPOFF64)
    758 
    759   SIMPLE_REMAP (TILEGX_TLS_DTPMOD32)
    760   SIMPLE_REMAP (TILEGX_TLS_DTPOFF32)
    761   SIMPLE_REMAP (TILEGX_TLS_TPOFF32)
    762 
    763   SIMPLE_REMAP (TILEGX_TLS_GD_CALL)
    764   SIMPLE_REMAP (TILEGX_IMM8_X0_TLS_GD_ADD)
    765   SIMPLE_REMAP (TILEGX_IMM8_X1_TLS_GD_ADD)
    766   SIMPLE_REMAP (TILEGX_IMM8_Y0_TLS_GD_ADD)
    767   SIMPLE_REMAP (TILEGX_IMM8_Y1_TLS_GD_ADD)
    768   SIMPLE_REMAP (TILEGX_TLS_IE_LOAD)
    769   SIMPLE_REMAP (TILEGX_IMM8_X0_TLS_ADD)
    770   SIMPLE_REMAP (TILEGX_IMM8_X1_TLS_ADD)
    771   SIMPLE_REMAP (TILEGX_IMM8_Y0_TLS_ADD)
    772   SIMPLE_REMAP (TILEGX_IMM8_Y1_TLS_ADD)
    773 
    774 #undef SIMPLE_REMAP
    775 #undef TH_REMAP
    776 
    777   { BFD_RELOC_VTABLE_INHERIT,       R_TILEGX_GNU_VTINHERIT, tilegx_elf_howto_table2 },
    778   { BFD_RELOC_VTABLE_ENTRY,         R_TILEGX_GNU_VTENTRY,   tilegx_elf_howto_table2 },
    779 };
    780 
    781 
    782 
    783 /* The TILE-Gx linker needs to keep track of the number of relocs that it
    784    decides to copy as dynamic relocs in check_relocs for each symbol.
    785    This is so that it can later discard them if they are found to be
    786    unnecessary.  We store the information in a field extending the
    787    regular ELF linker hash table.  */
    788 
    789 struct tilegx_elf_dyn_relocs
    790 {
    791   struct tilegx_elf_dyn_relocs *next;
    792 
    793   /* The input section of the reloc.  */
    794   asection *sec;
    795 
    796   /* Total number of relocs copied for the input section.  */
    797   bfd_size_type count;
    798 
    799   /* Number of pc-relative relocs copied for the input section.  */
    800   bfd_size_type pc_count;
    801 };
    802 
    803 /* TILEGX ELF linker hash entry.  */
    804 
    805 struct tilegx_elf_link_hash_entry
    806 {
    807   struct elf_link_hash_entry elf;
    808 
    809   /* Track dynamic relocs copied for this symbol.  */
    810   struct tilegx_elf_dyn_relocs *dyn_relocs;
    811 
    812 #define GOT_UNKNOWN     0
    813 #define GOT_NORMAL      1
    814 #define GOT_TLS_GD      2
    815 #define GOT_TLS_IE      4
    816   unsigned char tls_type;
    817 };
    818 
    819 #define tilegx_elf_hash_entry(ent) \
    820   ((struct tilegx_elf_link_hash_entry *)(ent))
    821 
    822 struct _bfd_tilegx_elf_obj_tdata
    823 {
    824   struct elf_obj_tdata root;
    825 
    826   /* tls_type for each local got entry.  */
    827   char *local_got_tls_type;
    828 };
    829 
    830 #define _bfd_tilegx_elf_tdata(abfd) \
    831   ((struct _bfd_tilegx_elf_obj_tdata *) (abfd)->tdata.any)
    832 
    833 #define _bfd_tilegx_elf_local_got_tls_type(abfd) \
    834   (_bfd_tilegx_elf_tdata (abfd)->local_got_tls_type)
    835 
    836 #define is_tilegx_elf(bfd)				\
    837   (bfd_get_flavour (bfd) == bfd_target_elf_flavour	\
    838    && elf_tdata (bfd) != NULL				\
    839    && elf_object_id (bfd) == TILEGX_ELF_DATA)
    840 
    841 #include "elf/common.h"
    842 #include "elf/internal.h"
    843 
    844 struct tilegx_elf_link_hash_table
    845 {
    846   struct elf_link_hash_table elf;
    847 
    848   int bytes_per_word;
    849   int word_align_power;
    850   int bytes_per_rela;
    851   int dtpmod_reloc;
    852   int dtpoff_reloc;
    853   int tpoff_reloc;
    854   bfd_vma (*r_info) (Elf_Internal_Rela *, bfd_vma, bfd_vma);
    855   bfd_vma (*r_symndx) (bfd_vma);
    856   void (*put_word) (bfd *, bfd_vma, void *);
    857   const char *dynamic_interpreter;
    858 
    859   /* Short-cuts to get to dynamic linker sections.  */
    860   asection *sdynbss;
    861   asection *srelbss;
    862 
    863   /* Whether LE transition has been disabled for some of the
    864      sections.  */
    865   bfd_boolean disable_le_transition;
    866 
    867   /* Small local sym to section mapping cache.  */
    868   struct sym_cache sym_cache;
    869 };
    870 
    871 
    872 /* Get the Tile ELF linker hash table from a link_info structure.  */
    873 #define tilegx_elf_hash_table(p) \
    874   (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
    875   == TILEGX_ELF_DATA ? ((struct tilegx_elf_link_hash_table *) ((p)->hash)) : NULL)
    876 
    877 #ifdef BFD64
    878 static bfd_vma
    879 tilegx_elf_r_info_64 (Elf_Internal_Rela *in_rel ATTRIBUTE_UNUSED,
    880 		      bfd_vma rel_index,
    881 		      bfd_vma type)
    882 {
    883   return ELF64_R_INFO (rel_index, type);
    884 }
    885 
    886 static bfd_vma
    887 tilegx_elf_r_symndx_64 (bfd_vma r_info)
    888 {
    889   return ELF64_R_SYM (r_info);
    890 }
    891 
    892 static void
    893 tilegx_put_word_64 (bfd *abfd, bfd_vma val, void *ptr)
    894 {
    895   bfd_put_64 (abfd, val, ptr);
    896 }
    897 #endif /* BFD64 */
    898 
    899 static bfd_vma
    900 tilegx_elf_r_info_32 (Elf_Internal_Rela *in_rel ATTRIBUTE_UNUSED,
    901 		      bfd_vma rel_index,
    902 		      bfd_vma type)
    903 {
    904   return ELF32_R_INFO (rel_index, type);
    905 }
    906 
    907 static bfd_vma
    908 tilegx_elf_r_symndx_32 (bfd_vma r_info)
    909 {
    910   return ELF32_R_SYM (r_info);
    911 }
    912 
    913 static void
    914 tilegx_put_word_32 (bfd *abfd, bfd_vma val, void *ptr)
    915 {
    916   bfd_put_32 (abfd, val, ptr);
    917 }
    918 
    919 reloc_howto_type *
    920 tilegx_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
    921 			  bfd_reloc_code_real_type code)
    922 {
    923   unsigned int i;
    924 
    925   for (i = ARRAY_SIZE (tilegx_reloc_map); --i;)
    926     {
    927       const reloc_map * entry;
    928 
    929       entry = tilegx_reloc_map + i;
    930 
    931       if (entry->bfd_reloc_val == code)
    932 	return entry->table + (entry->tilegx_reloc_val
    933 			       - entry->table[0].type);
    934     }
    935 
    936   return NULL;
    937 }
    938 
    939 reloc_howto_type *
    940 tilegx_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    941 			  const char *r_name)
    942 {
    943   unsigned int i;
    944 
    945   for (i = 0;
    946        i < (sizeof (tilegx_elf_howto_table)
    947             / sizeof (tilegx_elf_howto_table[0]));
    948        i++)
    949     if (tilegx_elf_howto_table[i].name != NULL
    950         && strcasecmp (tilegx_elf_howto_table[i].name, r_name) == 0)
    951       return &tilegx_elf_howto_table[i];
    952 
    953   return NULL;
    954 }
    955 
    956 void
    957 tilegx_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
    958 			   arelent *cache_ptr,
    959 			   Elf_Internal_Rela *dst)
    960 {
    961   unsigned int r_type = TILEGX_ELF_R_TYPE (dst->r_info);
    962 
    963   if (r_type <= (unsigned int) R_TILEGX_IMM8_Y1_TLS_ADD)
    964     cache_ptr->howto = &tilegx_elf_howto_table [r_type];
    965   else if (r_type - R_TILEGX_GNU_VTINHERIT
    966 	   <= (unsigned int) R_TILEGX_GNU_VTENTRY)
    967     cache_ptr->howto
    968       = &tilegx_elf_howto_table2 [r_type - R_TILEGX_GNU_VTINHERIT];
    969   else
    970     abort ();
    971 }
    972 
    973 typedef tilegx_bundle_bits (*tilegx_create_func)(int);
    974 
    975 static const tilegx_create_func reloc_to_create_func[] =
    976 {
    977   /* The first twenty relocation types don't correspond to operands */
    978   NULL,
    979   NULL,
    980   NULL,
    981   NULL,
    982   NULL,
    983   NULL,
    984   NULL,
    985   NULL,
    986   NULL,
    987   NULL,
    988   NULL,
    989   NULL,
    990   NULL,
    991   NULL,
    992   NULL,
    993   NULL,
    994   NULL,
    995   NULL,
    996   NULL,
    997   NULL,
    998 
    999   /* The remaining relocations are used for immediate operands */
   1000   create_BrOff_X1,
   1001   create_JumpOff_X1,
   1002   create_JumpOff_X1,
   1003   create_Imm8_X0,
   1004   create_Imm8_Y0,
   1005   create_Imm8_X1,
   1006   create_Imm8_Y1,
   1007   create_Dest_Imm8_X1,
   1008   create_MT_Imm14_X1,
   1009   create_MF_Imm14_X1,
   1010   create_BFStart_X0,
   1011   create_BFEnd_X0,
   1012   create_ShAmt_X0,
   1013   create_ShAmt_X1,
   1014   create_ShAmt_Y0,
   1015   create_ShAmt_Y1,
   1016   create_Imm16_X0,
   1017   create_Imm16_X1,
   1018   create_Imm16_X0,
   1019   create_Imm16_X1,
   1020   create_Imm16_X0,
   1021   create_Imm16_X1,
   1022   create_Imm16_X0,
   1023   create_Imm16_X1,
   1024   create_Imm16_X0,
   1025   create_Imm16_X1,
   1026   create_Imm16_X0,
   1027   create_Imm16_X1,
   1028   create_Imm16_X0,
   1029   create_Imm16_X1,
   1030   create_Imm16_X0,
   1031   create_Imm16_X1,
   1032   create_Imm16_X0,
   1033   create_Imm16_X1,
   1034   create_Imm16_X0,
   1035   create_Imm16_X1,
   1036   create_Imm16_X0,
   1037   create_Imm16_X1,
   1038   create_Imm16_X0,
   1039   create_Imm16_X1,
   1040   create_Imm16_X0,
   1041   create_Imm16_X1,
   1042   create_Imm16_X0,
   1043   create_Imm16_X1,
   1044   create_Imm16_X0,
   1045   create_Imm16_X1,
   1046   create_Imm16_X0,
   1047   create_Imm16_X1,
   1048   create_Imm16_X0,
   1049   create_Imm16_X1,
   1050   create_Imm16_X0,
   1051   create_Imm16_X1,
   1052   create_Imm16_X0,
   1053   create_Imm16_X1,
   1054   create_Imm16_X0,
   1055   create_Imm16_X1,
   1056   create_Imm16_X0,
   1057   create_Imm16_X1,
   1058   create_Imm16_X0,
   1059   create_Imm16_X1,
   1060   create_Imm16_X0,
   1061   create_Imm16_X1,
   1062   create_Imm16_X0,
   1063   create_Imm16_X1,
   1064   create_Imm16_X0,
   1065   create_Imm16_X1,
   1066   create_Imm16_X0,
   1067   create_Imm16_X1,
   1068   create_Imm16_X0,
   1069   create_Imm16_X1,
   1070   NULL,
   1071   NULL,
   1072   create_Imm16_X0,
   1073   create_Imm16_X1,
   1074   create_Imm16_X0,
   1075   create_Imm16_X1,
   1076   create_Imm16_X0,
   1077   create_Imm16_X1,
   1078   create_Imm16_X0,
   1079   create_Imm16_X1,
   1080   create_Imm16_X0,
   1081   create_Imm16_X1,
   1082   create_Imm16_X0,
   1083   create_Imm16_X1,
   1084 };
   1085 
   1086 static void
   1087 tilegx_elf_append_rela (bfd *abfd, asection *s, Elf_Internal_Rela *rel)
   1088 {
   1089   const struct elf_backend_data *bed;
   1090   bfd_byte *loc;
   1091 
   1092   bed = get_elf_backend_data (abfd);
   1093   loc = s->contents + (s->reloc_count++ * bed->s->sizeof_rela);
   1094   bed->s->swap_reloca_out (abfd, rel, loc);
   1095 }
   1096 
   1097 /* PLT/GOT stuff */
   1098 
   1099 /* The procedure linkage table starts with the following header:
   1100 
   1101      ld_add       r28, r27, 8
   1102      ld           r27, r27
   1103    {
   1104      jr           r27
   1105      info         10            ## SP not offset, return PC in LR
   1106    }
   1107 
   1108    Subsequent entries are the following, jumping to the header at the end:
   1109 
   1110    {
   1111      moveli       r28, <_GLOBAL_OFFSET_TABLE_ - 1f + MY_GOT_OFFSET>
   1112      lnk          r26
   1113    }
   1114 1:
   1115    {
   1116      moveli       r27, <_GLOBAL_OFFSET_TABLE_ - 1b>
   1117      shl16insli   r28, r28, <_GLOBAL_OFFSET_TABLE_ - 1b + MY_GOT_OFFSET>
   1118    }
   1119    {
   1120      add          r28, r26, r28
   1121      shl16insli   r27, r27, <_GLOBAL_OFFSET_TABLE_ - 1b>
   1122    }
   1123    {
   1124      add          r27, r26, r27
   1125      ld           r28, r28
   1126      info         10       ## SP not offset, return PC in LR
   1127    }
   1128    {
   1129      shl16insli   r29, zero, MY_PLT_INDEX
   1130      jr           r28
   1131    }
   1132 
   1133    This code sequence lets the code at at the start of the PLT determine
   1134    which PLT entry was executed by examining 'r29'.
   1135 
   1136    Note that MY_PLT_INDEX skips over the header entries, so the first
   1137    actual jump table entry has index zero.
   1138 
   1139    If the offset fits in 16 bits,
   1140 
   1141      lnk          r26
   1142 1:
   1143    {
   1144      addli        r28, r26, <_GLOBAL_OFFSET_TABLE_ - 1b + MY_GOT_OFFSET>
   1145      moveli       r27, <_GLOBAL_OFFSET_TABLE_ - 1b>
   1146    }
   1147    {
   1148      shl16insli   r29, zero, MY_PLT_INDEX
   1149      ld           r28, r28
   1150    }
   1151    {
   1152      add          r27, r26, r27
   1153      jr           r28
   1154    }
   1155      info         10       ## SP not offset, return PC in LR
   1156 
   1157    For the purpose of backtracing, the procedure linkage table ends with the
   1158    following tail entry:
   1159 
   1160      info         10       ## SP not offset, return PC in LR
   1161 
   1162    The 32-bit versions are similar, with ld4s replacing ld, and offsets into
   1163    the GOT being multiples of 4 instead of 8.
   1164 
   1165 */
   1166 
   1167 #define PLT_HEADER_SIZE_IN_BUNDLES 3
   1168 #define PLT_ENTRY_SIZE_IN_BUNDLES 5
   1169 #define PLT_TAIL_SIZE_IN_BUNDLES 1
   1170 
   1171 #define PLT_HEADER_SIZE \
   1172   (PLT_HEADER_SIZE_IN_BUNDLES * TILEGX_BUNDLE_SIZE_IN_BYTES)
   1173 #define PLT_ENTRY_SIZE \
   1174   (PLT_ENTRY_SIZE_IN_BUNDLES * TILEGX_BUNDLE_SIZE_IN_BYTES)
   1175 #define PLT_TAIL_SIZE \
   1176   (PLT_TAIL_SIZE_IN_BUNDLES * TILEGX_BUNDLE_SIZE_IN_BYTES)
   1177 
   1178 #define GOT_ENTRY_SIZE(htab) TILEGX_ELF_WORD_BYTES (htab)
   1179 
   1180 #define GOTPLT_HEADER_SIZE(htab) (2 * GOT_ENTRY_SIZE (htab))
   1181 
   1182 static const bfd_byte
   1183 tilegx64_plt0_entry[PLT_HEADER_SIZE] =
   1184 {
   1185   0x00, 0x30, 0x48, 0x51,
   1186   0x6e, 0x43, 0xa0, 0x18, /* { ld_add r28, r27, 8 } */
   1187   0x00, 0x30, 0xbc, 0x35,
   1188   0x00, 0x40, 0xde, 0x9e, /* { ld r27, r27 } */
   1189   0xff, 0xaf, 0x30, 0x40,
   1190   0x60, 0x73, 0x6a, 0x28, /* { info 10 ; jr r27 } */
   1191 };
   1192 
   1193 static const bfd_byte
   1194 tilegx64_long_plt_entry[PLT_ENTRY_SIZE] =
   1195 {
   1196   0xdc, 0x0f, 0x00, 0x10,
   1197   0x0d, 0xf0, 0x6a, 0x28, /* { moveli r28, 0 ; lnk r26 } */
   1198   0xdb, 0x0f, 0x00, 0x10,
   1199   0x8e, 0x03, 0x00, 0x38, /* { moveli r27, 0 ; shl16insli r28, r28, 0 } */
   1200   0x9c, 0xc6, 0x0d, 0xd0,
   1201   0x6d, 0x03, 0x00, 0x38, /* { add r28, r26, r28 ; shl16insli r27, r27, 0 } */
   1202   0x9b, 0xb6, 0xc5, 0xad,
   1203   0xff, 0x57, 0xe0, 0x8e, /* { add r27, r26, r27 ; info 10 ; ld r28, r28 } */
   1204   0xdd, 0x0f, 0x00, 0x70,
   1205   0x80, 0x73, 0x6a, 0x28, /* { shl16insli r29, zero, 0 ; jr r28 } */
   1206 };
   1207 
   1208 static const bfd_byte
   1209 tilegx64_short_plt_entry[PLT_ENTRY_SIZE] =
   1210 {
   1211   0x00, 0x30, 0x48, 0x51,
   1212   0x0d, 0xf0, 0x6a, 0x28, /* { lnk r26 } */
   1213   0x9c, 0x06, 0x00, 0x90,
   1214   0xed, 0x07, 0x00, 0x00, /* { addli r28, r26, 0 ; moveli r27, 0 } */
   1215   0xdd, 0x0f, 0x00, 0x70,
   1216   0x8e, 0xeb, 0x6a, 0x28, /* { shl16insli r29, zero, 0 ; ld r28, r28 } */
   1217   0x9b, 0xb6, 0x0d, 0x50,
   1218   0x80, 0x73, 0x6a, 0x28, /* { add r27, r26, r27 ; jr r28 } */
   1219   0x00, 0x30, 0x48, 0xd1,
   1220   0xff, 0x57, 0x18, 0x18, /* { info 10 } */
   1221 };
   1222 
   1223 /* Reuse an existing info 10 bundle.  */
   1224 static const bfd_byte *const tilegx64_plt_tail_entry =
   1225   &tilegx64_short_plt_entry[4 * TILEGX_BUNDLE_SIZE_IN_BYTES];
   1226 
   1227 static const bfd_byte
   1228 tilegx32_plt0_entry[PLT_HEADER_SIZE] =
   1229 {
   1230   0x00, 0x30, 0x48, 0x51,
   1231   0x6e, 0x23, 0x58, 0x18, /* { ld4s_add r28, r27, 4 } */
   1232   0x00, 0x30, 0xbc, 0x35,
   1233   0x00, 0x40, 0xde, 0x9c, /* { ld4s r27, r27 } */
   1234   0xff, 0xaf, 0x30, 0x40,
   1235   0x60, 0x73, 0x6a, 0x28, /* { info 10 ; jr r27 } */
   1236 };
   1237 
   1238 static const bfd_byte
   1239 tilegx32_long_plt_entry[PLT_ENTRY_SIZE] =
   1240 {
   1241   0xdc, 0x0f, 0x00, 0x10,
   1242   0x0d, 0xf0, 0x6a, 0x28, /* { moveli r28, 0 ; lnk r26 } */
   1243   0xdb, 0x0f, 0x00, 0x10,
   1244   0x8e, 0x03, 0x00, 0x38, /* { moveli r27, 0 ; shl16insli r28, r28, 0 } */
   1245   0x9c, 0xc6, 0x0d, 0xd0,
   1246   0x6d, 0x03, 0x00, 0x38, /* { add r28, r26, r28 ; shl16insli r27, r27, 0 } */
   1247   0x9b, 0xb6, 0xc5, 0xad,
   1248   0xff, 0x57, 0xe0, 0x8c, /* { add r27, r26, r27 ; info 10 ; ld4s r28, r28 } */
   1249   0xdd, 0x0f, 0x00, 0x70,
   1250   0x80, 0x73, 0x6a, 0x28, /* { shl16insli r29, zero, 0 ; jr r28 } */
   1251 };
   1252 
   1253 static const bfd_byte
   1254 tilegx32_short_plt_entry[PLT_ENTRY_SIZE] =
   1255 {
   1256   0x00, 0x30, 0x48, 0x51,
   1257   0x0d, 0xf0, 0x6a, 0x28, /* { lnk r26 } */
   1258   0x9c, 0x06, 0x00, 0x90,
   1259   0xed, 0x07, 0x00, 0x00, /* { addli r28, r26, 0 ; moveli r27, 0 } */
   1260   0xdd, 0x0f, 0x00, 0x70,
   1261   0x8e, 0x9b, 0x6a, 0x28, /* { shl16insli r29, zero, 0 ; ld4s r28, r28 } */
   1262   0x9b, 0xb6, 0x0d, 0x50,
   1263   0x80, 0x73, 0x6a, 0x28, /* { add r27, r26, r27 ; jr r28 } */
   1264   0x00, 0x30, 0x48, 0xd1,
   1265   0xff, 0x57, 0x18, 0x18, /* { info 10 } */
   1266 };
   1267 
   1268 /* Reuse an existing info 10 bundle.  */
   1269 static const bfd_byte *const tilegx32_plt_tail_entry =
   1270   &tilegx64_short_plt_entry[4 * TILEGX_BUNDLE_SIZE_IN_BYTES];
   1271 
   1272 static int
   1273 tilegx_plt_entry_build (bfd *output_bfd,
   1274 			struct tilegx_elf_link_hash_table *htab,
   1275 			asection *splt, asection *sgotplt,
   1276 			bfd_vma offset, bfd_vma *r_offset)
   1277 {
   1278   int plt_index = (offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
   1279   int got_offset = (plt_index * GOT_ENTRY_SIZE (htab)
   1280 		    + GOTPLT_HEADER_SIZE (htab));
   1281   tilegx_bundle_bits *pc;
   1282 
   1283   /* Compute the distance from the got entry to the lnk.  */
   1284   bfd_signed_vma dist_got_entry = sgotplt->output_section->vma
   1285     + sgotplt->output_offset
   1286     + got_offset
   1287     - splt->output_section->vma
   1288     - splt->output_offset
   1289     - offset
   1290     - TILEGX_BUNDLE_SIZE_IN_BYTES;
   1291 
   1292   /* Compute the distance to GOTPLT[0].  */
   1293   bfd_signed_vma dist_got0 = dist_got_entry - got_offset;
   1294 
   1295   /* Check whether we can use the short plt entry with 16-bit offset.  */
   1296   bfd_boolean short_plt_entry =
   1297     (dist_got_entry <= 0x7fff && dist_got0 >= -0x8000);
   1298 
   1299   const tilegx_bundle_bits *plt_entry = (tilegx_bundle_bits *)
   1300     (ABI_64_P (output_bfd) ?
   1301      (short_plt_entry ? tilegx64_short_plt_entry : tilegx64_long_plt_entry) :
   1302      (short_plt_entry ? tilegx32_short_plt_entry : tilegx32_long_plt_entry));
   1303 
   1304   /* Copy the plt entry template.  */
   1305   memcpy (splt->contents + offset, plt_entry, PLT_ENTRY_SIZE);
   1306 
   1307   /* Write the immediate offsets.  */
   1308   pc = (tilegx_bundle_bits *)(splt->contents + offset);
   1309 
   1310   if (short_plt_entry)
   1311     {
   1312       /* { lnk r28 }  */
   1313       pc++;
   1314 
   1315       /* { addli r28, r28, &GOTPLT[MY_GOT_INDEX] ; moveli r27, &GOTPLT[0] }  */
   1316       *pc++ |= create_Imm16_X0 (dist_got_entry)
   1317 	| create_Imm16_X1 (dist_got0);
   1318 
   1319       /* { shl16insli r29, zero, MY_PLT_INDEX ; ld r28, r28 }  */
   1320       *pc++ |= create_Imm16_X0 (plt_index);
   1321     }
   1322   else
   1323     {
   1324       /* { moveli r28, &GOTPLT[MY_GOT_INDEX] ; lnk r26 }  */
   1325       *pc++ |= create_Imm16_X0 (dist_got_entry >> 16);
   1326 
   1327       /* { moveli r27, &GOTPLT[0] ;
   1328 	   shl16insli r28, r28, &GOTPLT[MY_GOT_INDEX] }  */
   1329       *pc++ |= create_Imm16_X0 (dist_got0 >> 16)
   1330 	| create_Imm16_X1 (dist_got_entry);
   1331 
   1332       /* { add r28, r26, r28 ; shl16insli r27, r27, &GOTPLT[0] }  */
   1333       *pc++ |= create_Imm16_X1 (dist_got0);
   1334 
   1335       /* { add r27, r26, r27 ; info 10 ; ld r28, r28 } */
   1336       pc++;
   1337 
   1338       /* { shl16insli r29, zero, MY_GOT_INDEX ; jr r28 } */
   1339       *pc++ |= create_Imm16_X0 (plt_index);
   1340    }
   1341 
   1342   /* Set the relocation offset.  */
   1343   *r_offset = got_offset;
   1344 
   1345   return plt_index;
   1346 }
   1347 
   1348 /* Create an entry in an TILEGX ELF linker hash table.  */
   1349 
   1350 static struct bfd_hash_entry *
   1351 link_hash_newfunc (struct bfd_hash_entry *entry,
   1352 		   struct bfd_hash_table *table, const char *string)
   1353 {
   1354   /* Allocate the structure if it has not already been allocated by a
   1355      subclass.  */
   1356   if (entry == NULL)
   1357     {
   1358       entry =
   1359         bfd_hash_allocate (table,
   1360                            sizeof (struct tilegx_elf_link_hash_entry));
   1361       if (entry == NULL)
   1362 	return entry;
   1363     }
   1364 
   1365   /* Call the allocation method of the superclass.  */
   1366   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
   1367   if (entry != NULL)
   1368     {
   1369       struct tilegx_elf_link_hash_entry *eh;
   1370 
   1371       eh = (struct tilegx_elf_link_hash_entry *) entry;
   1372       eh->dyn_relocs = NULL;
   1373       eh->tls_type = GOT_UNKNOWN;
   1374     }
   1375 
   1376   return entry;
   1377 }
   1378 
   1379 /* Create a TILEGX ELF linker hash table.  */
   1380 
   1381 struct bfd_link_hash_table *
   1382 tilegx_elf_link_hash_table_create (bfd *abfd)
   1383 {
   1384   struct tilegx_elf_link_hash_table *ret;
   1385   bfd_size_type amt = sizeof (struct tilegx_elf_link_hash_table);
   1386 
   1387   ret = (struct tilegx_elf_link_hash_table *) bfd_zmalloc (amt);
   1388   if (ret == NULL)
   1389     return NULL;
   1390 
   1391 #ifdef BFD64
   1392   if (ABI_64_P (abfd))
   1393     {
   1394       ret->bytes_per_word = 8;
   1395       ret->word_align_power = 3;
   1396       ret->bytes_per_rela = sizeof (Elf64_External_Rela);
   1397       ret->dtpoff_reloc = R_TILEGX_TLS_DTPOFF64;
   1398       ret->dtpmod_reloc = R_TILEGX_TLS_DTPMOD64;
   1399       ret->tpoff_reloc = R_TILEGX_TLS_TPOFF64;
   1400       ret->r_info = tilegx_elf_r_info_64;
   1401       ret->r_symndx = tilegx_elf_r_symndx_64;
   1402       ret->dynamic_interpreter = ELF64_DYNAMIC_INTERPRETER;
   1403       ret->put_word = tilegx_put_word_64;
   1404     }
   1405   else
   1406 #endif
   1407     {
   1408       ret->bytes_per_word = 4;
   1409       ret->word_align_power = 2;
   1410       ret->bytes_per_rela = sizeof (Elf32_External_Rela);
   1411       ret->dtpoff_reloc = R_TILEGX_TLS_DTPOFF32;
   1412       ret->dtpmod_reloc = R_TILEGX_TLS_DTPMOD32;
   1413       ret->tpoff_reloc = R_TILEGX_TLS_TPOFF32;
   1414       ret->r_info = tilegx_elf_r_info_32;
   1415       ret->r_symndx = tilegx_elf_r_symndx_32;
   1416       ret->dynamic_interpreter = ELF32_DYNAMIC_INTERPRETER;
   1417       ret->put_word = tilegx_put_word_32;
   1418     }
   1419 
   1420   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc,
   1421 				      sizeof (struct tilegx_elf_link_hash_entry),
   1422 				      TILEGX_ELF_DATA))
   1423     {
   1424       free (ret);
   1425       return NULL;
   1426     }
   1427 
   1428   return &ret->elf.root;
   1429 }
   1430 
   1431 /* Create the .got section.  */
   1432 
   1433 static bfd_boolean
   1434 tilegx_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
   1435 {
   1436   flagword flags;
   1437   asection *s, *s_got;
   1438   struct elf_link_hash_entry *h;
   1439   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
   1440   struct elf_link_hash_table *htab = elf_hash_table (info);
   1441 
   1442   /* This function may be called more than once.  */
   1443   s = bfd_get_linker_section (abfd, ".got");
   1444   if (s != NULL)
   1445     return TRUE;
   1446 
   1447   flags = bed->dynamic_sec_flags;
   1448 
   1449   s = bfd_make_section_anyway_with_flags (abfd,
   1450 					  (bed->rela_plts_and_copies_p
   1451 					   ? ".rela.got" : ".rel.got"),
   1452 					  (bed->dynamic_sec_flags
   1453 					   | SEC_READONLY));
   1454   if (s == NULL
   1455       || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
   1456     return FALSE;
   1457   htab->srelgot = s;
   1458 
   1459   s = s_got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
   1460   if (s == NULL
   1461       || !bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
   1462     return FALSE;
   1463   htab->sgot = s;
   1464 
   1465   /* The first bit of the global offset table is the header.  */
   1466   s->size += bed->got_header_size;
   1467 
   1468   if (bed->want_got_plt)
   1469     {
   1470       s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
   1471       if (s == NULL
   1472 	  || !bfd_set_section_alignment (abfd, s,
   1473 					 bed->s->log_file_align))
   1474 	return FALSE;
   1475       htab->sgotplt = s;
   1476 
   1477       /* Reserve room for the header.  */
   1478       s->size += GOTPLT_HEADER_SIZE (tilegx_elf_hash_table (info));
   1479     }
   1480 
   1481   if (bed->want_got_sym)
   1482     {
   1483       /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
   1484 	 section.  We don't do this in the linker script because we don't want
   1485 	 to define the symbol if we are not creating a global offset
   1486 	 table.  */
   1487       h = _bfd_elf_define_linkage_sym (abfd, info, s_got,
   1488 				       "_GLOBAL_OFFSET_TABLE_");
   1489       elf_hash_table (info)->hgot = h;
   1490       if (h == NULL)
   1491 	return FALSE;
   1492     }
   1493 
   1494   return TRUE;
   1495 }
   1496 
   1497 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
   1498    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
   1499    hash table.  */
   1500 
   1501 bfd_boolean
   1502 tilegx_elf_create_dynamic_sections (bfd *dynobj,
   1503 				    struct bfd_link_info *info)
   1504 {
   1505   struct tilegx_elf_link_hash_table *htab;
   1506 
   1507   htab = tilegx_elf_hash_table (info);
   1508   BFD_ASSERT (htab != NULL);
   1509 
   1510   if (!tilegx_elf_create_got_section (dynobj, info))
   1511     return FALSE;
   1512 
   1513   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
   1514     return FALSE;
   1515 
   1516   htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
   1517   if (!info->shared)
   1518     htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
   1519 
   1520   if (!htab->elf.splt || !htab->elf.srelplt || !htab->sdynbss
   1521       || (!info->shared && !htab->srelbss))
   1522     abort ();
   1523 
   1524   return TRUE;
   1525 }
   1526 
   1527 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
   1528 
   1529 void
   1530 tilegx_elf_copy_indirect_symbol (struct bfd_link_info *info,
   1531 				 struct elf_link_hash_entry *dir,
   1532 				 struct elf_link_hash_entry *ind)
   1533 {
   1534   struct tilegx_elf_link_hash_entry *edir, *eind;
   1535 
   1536   edir = (struct tilegx_elf_link_hash_entry *) dir;
   1537   eind = (struct tilegx_elf_link_hash_entry *) ind;
   1538 
   1539   if (eind->dyn_relocs != NULL)
   1540     {
   1541       if (edir->dyn_relocs != NULL)
   1542 	{
   1543 	  struct tilegx_elf_dyn_relocs **pp;
   1544 	  struct tilegx_elf_dyn_relocs *p;
   1545 
   1546 	  /* Add reloc counts against the indirect sym to the direct sym
   1547 	     list.  Merge any entries against the same section.  */
   1548 	  for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
   1549 	    {
   1550 	      struct tilegx_elf_dyn_relocs *q;
   1551 
   1552 	      for (q = edir->dyn_relocs; q != NULL; q = q->next)
   1553 		if (q->sec == p->sec)
   1554 		  {
   1555 		    q->pc_count += p->pc_count;
   1556 		    q->count += p->count;
   1557 		    *pp = p->next;
   1558 		    break;
   1559 		  }
   1560 	      if (q == NULL)
   1561 		pp = &p->next;
   1562 	    }
   1563 	  *pp = edir->dyn_relocs;
   1564 	}
   1565 
   1566       edir->dyn_relocs = eind->dyn_relocs;
   1567       eind->dyn_relocs = NULL;
   1568     }
   1569 
   1570   if (ind->root.type == bfd_link_hash_indirect
   1571       && dir->got.refcount <= 0)
   1572     {
   1573       edir->tls_type = eind->tls_type;
   1574       eind->tls_type = GOT_UNKNOWN;
   1575     }
   1576   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
   1577 }
   1578 
   1579 static int
   1580 tilegx_tls_translate_to_le (int r_type)
   1581 {
   1582   switch (r_type)
   1583     {
   1584     case R_TILEGX_IMM16_X0_HW0_TLS_GD:
   1585     case R_TILEGX_IMM16_X0_HW0_TLS_IE:
   1586       return R_TILEGX_IMM16_X0_HW0_TLS_LE;
   1587 
   1588     case R_TILEGX_IMM16_X1_HW0_TLS_GD:
   1589     case R_TILEGX_IMM16_X1_HW0_TLS_IE:
   1590       return R_TILEGX_IMM16_X1_HW0_TLS_LE;
   1591 
   1592     case R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
   1593     case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
   1594       return R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE;
   1595 
   1596     case R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
   1597     case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
   1598       return R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE;
   1599 
   1600     case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
   1601     case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
   1602       return R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE;
   1603 
   1604     case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
   1605     case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
   1606       return R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE;
   1607     }
   1608   return r_type;
   1609 }
   1610 
   1611 static int
   1612 tilegx_tls_translate_to_ie (int r_type)
   1613 {
   1614   switch (r_type)
   1615     {
   1616     case R_TILEGX_IMM16_X0_HW0_TLS_GD:
   1617     case R_TILEGX_IMM16_X0_HW0_TLS_IE:
   1618       return R_TILEGX_IMM16_X0_HW0_TLS_IE;
   1619 
   1620     case R_TILEGX_IMM16_X1_HW0_TLS_GD:
   1621     case R_TILEGX_IMM16_X1_HW0_TLS_IE:
   1622       return R_TILEGX_IMM16_X1_HW0_TLS_IE;
   1623 
   1624     case R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
   1625     case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
   1626       return R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE;
   1627 
   1628     case R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
   1629     case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
   1630       return R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE;
   1631 
   1632     case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
   1633     case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
   1634       return R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE;
   1635 
   1636     case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
   1637     case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
   1638       return R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE;
   1639     }
   1640   return r_type;
   1641 }
   1642 
   1643 static int
   1644 tilegx_elf_tls_transition (struct bfd_link_info *info, int r_type,
   1645 			   int is_local, bfd_boolean disable_le_transition)
   1646 {
   1647   if (info->shared)
   1648     return r_type;
   1649 
   1650   if (is_local && !disable_le_transition)
   1651     return tilegx_tls_translate_to_le (r_type);
   1652   else
   1653     return tilegx_tls_translate_to_ie (r_type);
   1654 }
   1655 
   1656 /* Look through the relocs for a section during the first phase, and
   1657    allocate space in the global offset table or procedure linkage
   1658    table.  */
   1659 
   1660 bfd_boolean
   1661 tilegx_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
   1662 			 asection *sec, const Elf_Internal_Rela *relocs)
   1663 {
   1664   struct tilegx_elf_link_hash_table *htab;
   1665   Elf_Internal_Shdr *symtab_hdr;
   1666   struct elf_link_hash_entry **sym_hashes;
   1667   const Elf_Internal_Rela *rel;
   1668   const Elf_Internal_Rela *rel_end;
   1669   asection *sreloc;
   1670   int num_relocs;
   1671   bfd_boolean has_tls_gd_or_ie = FALSE, has_tls_add = FALSE;
   1672 
   1673   if (info->relocatable)
   1674     return TRUE;
   1675 
   1676   htab = tilegx_elf_hash_table (info);
   1677   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   1678   sym_hashes = elf_sym_hashes (abfd);
   1679 
   1680   sreloc = NULL;
   1681 
   1682   num_relocs = sec->reloc_count;
   1683 
   1684   BFD_ASSERT (is_tilegx_elf (abfd) || num_relocs == 0);
   1685 
   1686   if (htab->elf.dynobj == NULL)
   1687     htab->elf.dynobj = abfd;
   1688 
   1689   rel_end = relocs + num_relocs;
   1690 
   1691   /* Check whether to do optimization to transform TLS GD/IE
   1692      referehces to TLS LE.  We disable it if we're linking with old
   1693      TLS code sequences that do not support such optimization.  Old
   1694      TLS code sequences have tls_gd_call/tls_ie_load relocations but
   1695      no tls_add relocations.  */
   1696   for (rel = relocs; rel < rel_end && !has_tls_add; rel++)
   1697     {
   1698       int r_type = TILEGX_ELF_R_TYPE (rel->r_info);
   1699       switch (r_type)
   1700 	{
   1701 	case R_TILEGX_TLS_GD_CALL:
   1702 	case R_TILEGX_TLS_IE_LOAD:
   1703 	  has_tls_gd_or_ie = TRUE;
   1704 	  break;
   1705 	case R_TILEGX_IMM8_X0_TLS_ADD:
   1706 	case R_TILEGX_IMM8_Y0_TLS_ADD:
   1707 	case R_TILEGX_IMM8_X1_TLS_ADD:
   1708 	case R_TILEGX_IMM8_Y1_TLS_ADD:
   1709 	  has_tls_add = TRUE;
   1710 	  break;
   1711 	}
   1712     }
   1713 
   1714   sec->sec_flg0 = (has_tls_gd_or_ie && !has_tls_add);
   1715   htab->disable_le_transition |= sec->sec_flg0;
   1716 
   1717   for (rel = relocs; rel < rel_end; rel++)
   1718     {
   1719       unsigned int r_type;
   1720       unsigned long r_symndx;
   1721       struct elf_link_hash_entry *h;
   1722       int tls_type;
   1723 
   1724       r_symndx = TILEGX_ELF_R_SYMNDX (htab, rel->r_info);
   1725       r_type = TILEGX_ELF_R_TYPE (rel->r_info);
   1726 
   1727       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
   1728 	{
   1729 	  (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
   1730 				 abfd, r_symndx);
   1731 	  return FALSE;
   1732 	}
   1733 
   1734       if (r_symndx < symtab_hdr->sh_info)
   1735 	h = NULL;
   1736       else
   1737 	{
   1738 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   1739 	  while (h->root.type == bfd_link_hash_indirect
   1740 		 || h->root.type == bfd_link_hash_warning)
   1741 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   1742 
   1743 	  /* PR15323, ref flags aren't set for references in the same
   1744 	     object.  */
   1745 	  h->root.non_ir_ref = 1;
   1746 	}
   1747 
   1748       r_type = tilegx_elf_tls_transition (info, r_type, h == NULL,
   1749 					  sec->sec_flg0);
   1750       switch (r_type)
   1751 	{
   1752 	case R_TILEGX_IMM16_X0_HW0_TLS_LE:
   1753 	case R_TILEGX_IMM16_X1_HW0_TLS_LE:
   1754 	case R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE:
   1755 	case R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE:
   1756 	case R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE:
   1757 	case R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE:
   1758 	  if (info->shared)
   1759 	    goto r_tilegx_plt32;
   1760 	  break;
   1761 
   1762 	case R_TILEGX_IMM16_X0_HW0_TLS_GD:
   1763 	case R_TILEGX_IMM16_X1_HW0_TLS_GD:
   1764 	case R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
   1765 	case R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
   1766 	case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
   1767 	case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
   1768 	  BFD_ASSERT (info->shared);
   1769 	  tls_type = GOT_TLS_GD;
   1770           goto have_got_reference;
   1771 
   1772 	case R_TILEGX_IMM16_X0_HW0_TLS_IE:
   1773 	case R_TILEGX_IMM16_X1_HW0_TLS_IE:
   1774 	case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
   1775 	case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
   1776 	case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
   1777 	case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
   1778           tls_type = GOT_TLS_IE;
   1779           if (info->shared)
   1780             info->flags |= DF_STATIC_TLS;
   1781           goto have_got_reference;
   1782 
   1783 	case R_TILEGX_IMM16_X0_HW0_GOT:
   1784 	case R_TILEGX_IMM16_X1_HW0_GOT:
   1785 	case R_TILEGX_IMM16_X0_HW0_LAST_GOT:
   1786 	case R_TILEGX_IMM16_X1_HW0_LAST_GOT:
   1787 	case R_TILEGX_IMM16_X0_HW1_LAST_GOT:
   1788 	case R_TILEGX_IMM16_X1_HW1_LAST_GOT:
   1789           tls_type = GOT_NORMAL;
   1790           /* Fall Through */
   1791 
   1792         have_got_reference:
   1793 	  /* This symbol requires a global offset table entry.  */
   1794 	  {
   1795             int old_tls_type;
   1796 
   1797 	    if (h != NULL)
   1798 	      {
   1799 		h->got.refcount += 1;
   1800 		old_tls_type = tilegx_elf_hash_entry(h)->tls_type;
   1801 	      }
   1802 	    else
   1803 	      {
   1804 		bfd_signed_vma *local_got_refcounts;
   1805 
   1806 		/* This is a global offset table entry for a local symbol.  */
   1807 		local_got_refcounts = elf_local_got_refcounts (abfd);
   1808 		if (local_got_refcounts == NULL)
   1809 		  {
   1810 		    bfd_size_type size;
   1811 
   1812 		    size = symtab_hdr->sh_info;
   1813 		    size *= (sizeof (bfd_signed_vma) + sizeof(char));
   1814 		    local_got_refcounts = ((bfd_signed_vma *)
   1815 					   bfd_zalloc (abfd, size));
   1816 		    if (local_got_refcounts == NULL)
   1817 		      return FALSE;
   1818 		    elf_local_got_refcounts (abfd) = local_got_refcounts;
   1819                     _bfd_tilegx_elf_local_got_tls_type (abfd)
   1820                       = (char *) (local_got_refcounts + symtab_hdr->sh_info);
   1821 		  }
   1822 		local_got_refcounts[r_symndx] += 1;
   1823                 old_tls_type = _bfd_tilegx_elf_local_got_tls_type (abfd) [r_symndx];
   1824               }
   1825 
   1826             /* If a TLS symbol is accessed using IE at least once,
   1827                there is no point to use dynamic model for it.  */
   1828             if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
   1829                 && (old_tls_type != GOT_TLS_GD
   1830                     || tls_type != GOT_TLS_IE))
   1831               {
   1832                 if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD)
   1833                   tls_type = old_tls_type;
   1834                 else
   1835                   {
   1836                     (*_bfd_error_handler)
   1837                       (_("%B: `%s' accessed both as normal and thread local symbol"),
   1838                        abfd, h ? h->root.root.string : "<local>");
   1839                     return FALSE;
   1840                   }
   1841               }
   1842 
   1843             if (old_tls_type != tls_type)
   1844               {
   1845                 if (h != NULL)
   1846                   tilegx_elf_hash_entry (h)->tls_type = tls_type;
   1847                 else
   1848                   _bfd_tilegx_elf_local_got_tls_type (abfd) [r_symndx] = tls_type;
   1849 	      }
   1850 	  }
   1851 
   1852 	  if (htab->elf.sgot == NULL)
   1853 	    {
   1854 	      if (!tilegx_elf_create_got_section (htab->elf.dynobj, info))
   1855 		return FALSE;
   1856 	    }
   1857 	  break;
   1858 
   1859 	case R_TILEGX_TLS_GD_CALL:
   1860 	  if (info->shared)
   1861 	    {
   1862 	      /* These are basically R_TILEGX_JUMPOFF_X1_PLT relocs
   1863 		 against __tls_get_addr.  */
   1864 	      struct bfd_link_hash_entry *bh = NULL;
   1865 	      if (! _bfd_generic_link_add_one_symbol (info, abfd,
   1866 						      "__tls_get_addr", 0,
   1867 						      bfd_und_section_ptr, 0,
   1868 						      NULL, FALSE, FALSE,
   1869 						      &bh))
   1870 		return FALSE;
   1871 	      h = (struct elf_link_hash_entry *) bh;
   1872 	    }
   1873 	  else
   1874 	    break;
   1875 	  /* Fall through */
   1876 
   1877         case R_TILEGX_JUMPOFF_X1_PLT:
   1878 	case R_TILEGX_IMM16_X0_HW0_PLT_PCREL:
   1879 	case R_TILEGX_IMM16_X1_HW0_PLT_PCREL:
   1880 	case R_TILEGX_IMM16_X0_HW1_PLT_PCREL:
   1881 	case R_TILEGX_IMM16_X1_HW1_PLT_PCREL:
   1882 	case R_TILEGX_IMM16_X0_HW2_PLT_PCREL:
   1883 	case R_TILEGX_IMM16_X1_HW2_PLT_PCREL:
   1884 	case R_TILEGX_IMM16_X0_HW3_PLT_PCREL:
   1885 	case R_TILEGX_IMM16_X1_HW3_PLT_PCREL:
   1886 	case R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL:
   1887 	case R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL:
   1888 	case R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL:
   1889 	case R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL:
   1890 	case R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL:
   1891 	case R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL:
   1892 	  /* This symbol requires a procedure linkage table entry.  We
   1893 	     actually build the entry in adjust_dynamic_symbol,
   1894 	     because this might be a case of linking PIC code without
   1895 	     linking in any dynamic objects, in which case we don't
   1896 	     need to generate a procedure linkage table after all.  */
   1897 
   1898 	  if (h != NULL)
   1899             {
   1900               h->needs_plt = 1;
   1901               h->plt.refcount += 1;
   1902             }
   1903 	  break;
   1904 
   1905         case R_TILEGX_64_PCREL:
   1906         case R_TILEGX_32_PCREL:
   1907         case R_TILEGX_16_PCREL:
   1908         case R_TILEGX_8_PCREL:
   1909 	case R_TILEGX_IMM16_X0_HW0_PCREL:
   1910 	case R_TILEGX_IMM16_X1_HW0_PCREL:
   1911 	case R_TILEGX_IMM16_X0_HW1_PCREL:
   1912 	case R_TILEGX_IMM16_X1_HW1_PCREL:
   1913 	case R_TILEGX_IMM16_X0_HW2_PCREL:
   1914 	case R_TILEGX_IMM16_X1_HW2_PCREL:
   1915 	case R_TILEGX_IMM16_X0_HW3_PCREL:
   1916 	case R_TILEGX_IMM16_X1_HW3_PCREL:
   1917 	case R_TILEGX_IMM16_X0_HW0_LAST_PCREL:
   1918 	case R_TILEGX_IMM16_X1_HW0_LAST_PCREL:
   1919 	case R_TILEGX_IMM16_X0_HW1_LAST_PCREL:
   1920 	case R_TILEGX_IMM16_X1_HW1_LAST_PCREL:
   1921 	case R_TILEGX_IMM16_X0_HW2_LAST_PCREL:
   1922 	case R_TILEGX_IMM16_X1_HW2_LAST_PCREL:
   1923 	  if (h != NULL)
   1924 	    h->non_got_ref = 1;
   1925 
   1926 	  if (h != NULL
   1927 	      && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
   1928 	    break;
   1929 	  /* Fall through.  */
   1930 
   1931         case R_TILEGX_64:
   1932         case R_TILEGX_32:
   1933         case R_TILEGX_16:
   1934         case R_TILEGX_8:
   1935 	case R_TILEGX_HW0:
   1936 	case R_TILEGX_HW1:
   1937 	case R_TILEGX_HW2:
   1938 	case R_TILEGX_HW3:
   1939 	case R_TILEGX_HW0_LAST:
   1940 	case R_TILEGX_HW1_LAST:
   1941 	case R_TILEGX_HW2_LAST:
   1942         case R_TILEGX_COPY:
   1943         case R_TILEGX_GLOB_DAT:
   1944         case R_TILEGX_JMP_SLOT:
   1945         case R_TILEGX_RELATIVE:
   1946         case R_TILEGX_BROFF_X1:
   1947         case R_TILEGX_JUMPOFF_X1:
   1948         case R_TILEGX_IMM8_X0:
   1949         case R_TILEGX_IMM8_Y0:
   1950         case R_TILEGX_IMM8_X1:
   1951         case R_TILEGX_IMM8_Y1:
   1952         case R_TILEGX_DEST_IMM8_X1:
   1953         case R_TILEGX_MT_IMM14_X1:
   1954         case R_TILEGX_MF_IMM14_X1:
   1955         case R_TILEGX_MMSTART_X0:
   1956         case R_TILEGX_MMEND_X0:
   1957         case R_TILEGX_SHAMT_X0:
   1958         case R_TILEGX_SHAMT_X1:
   1959         case R_TILEGX_SHAMT_Y0:
   1960         case R_TILEGX_SHAMT_Y1:
   1961 	case R_TILEGX_IMM16_X0_HW0:
   1962 	case R_TILEGX_IMM16_X1_HW0:
   1963 	case R_TILEGX_IMM16_X0_HW1:
   1964 	case R_TILEGX_IMM16_X1_HW1:
   1965 	case R_TILEGX_IMM16_X0_HW2:
   1966 	case R_TILEGX_IMM16_X1_HW2:
   1967 	case R_TILEGX_IMM16_X0_HW3:
   1968 	case R_TILEGX_IMM16_X1_HW3:
   1969 	case R_TILEGX_IMM16_X0_HW0_LAST:
   1970 	case R_TILEGX_IMM16_X1_HW0_LAST:
   1971 	case R_TILEGX_IMM16_X0_HW1_LAST:
   1972 	case R_TILEGX_IMM16_X1_HW1_LAST:
   1973 	case R_TILEGX_IMM16_X0_HW2_LAST:
   1974 	case R_TILEGX_IMM16_X1_HW2_LAST:
   1975 	  if (h != NULL)
   1976 	    h->non_got_ref = 1;
   1977 
   1978 	r_tilegx_plt32:
   1979 	  if (h != NULL && !info->shared)
   1980 	    {
   1981 	      /* We may need a .plt entry if the function this reloc
   1982 		 refers to is in a shared lib.  */
   1983 	      h->plt.refcount += 1;
   1984 	    }
   1985 
   1986 	  /* If we are creating a shared library, and this is a reloc
   1987 	     against a global symbol, or a non PC relative reloc
   1988 	     against a local symbol, then we need to copy the reloc
   1989 	     into the shared library.  However, if we are linking with
   1990 	     -Bsymbolic, we do not need to copy a reloc against a
   1991 	     global symbol which is defined in an object we are
   1992 	     including in the link (i.e., DEF_REGULAR is set).  At
   1993 	     this point we have not seen all the input files, so it is
   1994 	     possible that DEF_REGULAR is not set now but will be set
   1995 	     later (it is never cleared).  In case of a weak definition,
   1996 	     DEF_REGULAR may be cleared later by a strong definition in
   1997 	     a shared library.  We account for that possibility below by
   1998 	     storing information in the relocs_copied field of the hash
   1999 	     table entry.  A similar situation occurs when creating
   2000 	     shared libraries and symbol visibility changes render the
   2001 	     symbol local.
   2002 
   2003 	     If on the other hand, we are creating an executable, we
   2004 	     may need to keep relocations for symbols satisfied by a
   2005 	     dynamic library if we manage to avoid copy relocs for the
   2006 	     symbol.  */
   2007 	  if ((info->shared
   2008 	       && (sec->flags & SEC_ALLOC) != 0
   2009 	       && (! tilegx_elf_howto_table[r_type].pc_relative
   2010 		   || (h != NULL
   2011 		       && (! info->symbolic
   2012 			   || h->root.type == bfd_link_hash_defweak
   2013 			   || !h->def_regular))))
   2014 	      || (!info->shared
   2015 		  && (sec->flags & SEC_ALLOC) != 0
   2016 		  && h != NULL
   2017 		  && (h->root.type == bfd_link_hash_defweak
   2018 		      || !h->def_regular)))
   2019 	    {
   2020 	      struct tilegx_elf_dyn_relocs *p;
   2021 	      struct tilegx_elf_dyn_relocs **head;
   2022 
   2023 	      /* When creating a shared object, we must copy these
   2024 		 relocs into the output file.  We create a reloc
   2025 		 section in dynobj and make room for the reloc.  */
   2026 	      if (sreloc == NULL)
   2027 		{
   2028 		  sreloc = _bfd_elf_make_dynamic_reloc_section
   2029 		    (sec, htab->elf.dynobj, htab->word_align_power, abfd,
   2030 		     /*rela?*/ TRUE);
   2031 
   2032 		  if (sreloc == NULL)
   2033 		    return FALSE;
   2034 		}
   2035 
   2036 	      /* If this is a global symbol, we count the number of
   2037 		 relocations we need for this symbol.  */
   2038 	      if (h != NULL)
   2039 		head =
   2040                   &((struct tilegx_elf_link_hash_entry *) h)->dyn_relocs;
   2041 	      else
   2042 		{
   2043 		  /* Track dynamic relocs needed for local syms too.
   2044 		     We really need local syms available to do this
   2045 		     easily.  Oh well.  */
   2046 
   2047 		  asection *s;
   2048 		  void *vpp;
   2049 		  Elf_Internal_Sym *isym;
   2050 
   2051 		  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
   2052 						abfd, r_symndx);
   2053 		  if (isym == NULL)
   2054 		    return FALSE;
   2055 
   2056 		  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
   2057 		  if (s == NULL)
   2058 		    s = sec;
   2059 
   2060 		  vpp = &elf_section_data (s)->local_dynrel;
   2061 		  head = (struct tilegx_elf_dyn_relocs **) vpp;
   2062 		}
   2063 
   2064 	      p = *head;
   2065 	      if (p == NULL || p->sec != sec)
   2066 		{
   2067 		  bfd_size_type amt = sizeof *p;
   2068 		  p = ((struct tilegx_elf_dyn_relocs *)
   2069 		       bfd_alloc (htab->elf.dynobj, amt));
   2070 		  if (p == NULL)
   2071 		    return FALSE;
   2072 		  p->next = *head;
   2073 		  *head = p;
   2074 		  p->sec = sec;
   2075 		  p->count = 0;
   2076 		  p->pc_count = 0;
   2077 		}
   2078 
   2079 	      p->count += 1;
   2080 	      if (tilegx_elf_howto_table[r_type].pc_relative)
   2081 		p->pc_count += 1;
   2082 	    }
   2083 
   2084 	  break;
   2085 
   2086 	case R_TILEGX_GNU_VTINHERIT:
   2087 	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
   2088 	    return FALSE;
   2089 	  break;
   2090 
   2091 	case R_TILEGX_GNU_VTENTRY:
   2092 	  if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
   2093 	    return FALSE;
   2094 	  break;
   2095 
   2096 	default:
   2097 	  break;
   2098 	}
   2099     }
   2100 
   2101   return TRUE;
   2102 }
   2103 
   2104 
   2105 asection *
   2107 tilegx_elf_gc_mark_hook (asection *sec,
   2108 			 struct bfd_link_info *info,
   2109 			 Elf_Internal_Rela *rel,
   2110 			 struct elf_link_hash_entry *h,
   2111 			 Elf_Internal_Sym *sym)
   2112 {
   2113   if (h != NULL)
   2114     {
   2115       switch (TILEGX_ELF_R_TYPE (rel->r_info))
   2116 	{
   2117 	case R_TILEGX_GNU_VTINHERIT:
   2118 	case R_TILEGX_GNU_VTENTRY:
   2119 	  return NULL;
   2120 	}
   2121     }
   2122 
   2123   /* FIXME: The test here, in check_relocs and in relocate_section
   2124      dealing with TLS optimization, ought to be !info->executable.  */
   2125   if (info->shared)
   2126     {
   2127       switch (TILEGX_ELF_R_TYPE (rel->r_info))
   2128 	{
   2129 	case R_TILEGX_TLS_GD_CALL:
   2130 	  /* This reloc implicitly references __tls_get_addr.  We know
   2131 	     another reloc will reference the same symbol as the one
   2132 	     on this reloc, so the real symbol and section will be
   2133 	     gc marked when processing the other reloc.  That lets
   2134 	     us handle __tls_get_addr here.  */
   2135 	  h = elf_link_hash_lookup (elf_hash_table (info), "__tls_get_addr",
   2136 				    FALSE, FALSE, TRUE);
   2137 	  BFD_ASSERT (h != NULL);
   2138 	  h->mark = 1;
   2139 	  if (h->u.weakdef != NULL)
   2140 	    h->u.weakdef->mark = 1;
   2141 	  sym = NULL;
   2142 	}
   2143     }
   2144 
   2145   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
   2146 }
   2147 
   2148 /* Update the got entry reference counts for the section being removed.  */
   2149 bfd_boolean
   2150 tilegx_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
   2151 			  asection *sec, const Elf_Internal_Rela *relocs)
   2152 {
   2153   struct tilegx_elf_link_hash_table *htab;
   2154   Elf_Internal_Shdr *symtab_hdr;
   2155   struct elf_link_hash_entry **sym_hashes;
   2156   bfd_signed_vma *local_got_refcounts;
   2157   const Elf_Internal_Rela *rel, *relend;
   2158 
   2159   if (info->relocatable)
   2160     return TRUE;
   2161 
   2162   BFD_ASSERT (is_tilegx_elf (abfd) || sec->reloc_count == 0);
   2163 
   2164   elf_section_data (sec)->local_dynrel = NULL;
   2165 
   2166   htab = tilegx_elf_hash_table (info);
   2167   BFD_ASSERT (htab != NULL);
   2168   symtab_hdr = &elf_symtab_hdr (abfd);
   2169   sym_hashes = elf_sym_hashes (abfd);
   2170   local_got_refcounts = elf_local_got_refcounts (abfd);
   2171 
   2172   relend = relocs + sec->reloc_count;
   2173   for (rel = relocs; rel < relend; rel++)
   2174     {
   2175       unsigned long r_symndx;
   2176       unsigned int r_type;
   2177       struct elf_link_hash_entry *h = NULL;
   2178 
   2179       r_symndx = TILEGX_ELF_R_SYMNDX (htab, rel->r_info);
   2180       if (r_symndx >= symtab_hdr->sh_info)
   2181 	{
   2182 	  struct tilegx_elf_link_hash_entry *eh;
   2183 	  struct tilegx_elf_dyn_relocs **pp;
   2184 	  struct tilegx_elf_dyn_relocs *p;
   2185 
   2186 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   2187 	  while (h->root.type == bfd_link_hash_indirect
   2188 		 || h->root.type == bfd_link_hash_warning)
   2189 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   2190 	  eh = (struct tilegx_elf_link_hash_entry *) h;
   2191 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
   2192 	    if (p->sec == sec)
   2193 	      {
   2194 		/* Everything must go for SEC.  */
   2195 		*pp = p->next;
   2196 		break;
   2197 	      }
   2198 	}
   2199 
   2200       r_type = TILEGX_ELF_R_TYPE (rel->r_info);
   2201       r_type = tilegx_elf_tls_transition (info, r_type, h != NULL,
   2202 					  sec->sec_flg0);
   2203       switch (r_type)
   2204 	{
   2205 	case R_TILEGX_IMM16_X0_HW0_GOT:
   2206 	case R_TILEGX_IMM16_X1_HW0_GOT:
   2207 	case R_TILEGX_IMM16_X0_HW0_LAST_GOT:
   2208 	case R_TILEGX_IMM16_X1_HW0_LAST_GOT:
   2209 	case R_TILEGX_IMM16_X0_HW1_LAST_GOT:
   2210 	case R_TILEGX_IMM16_X1_HW1_LAST_GOT:
   2211 	case R_TILEGX_IMM16_X0_HW0_TLS_GD:
   2212 	case R_TILEGX_IMM16_X1_HW0_TLS_GD:
   2213 	case R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
   2214 	case R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
   2215 	case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
   2216 	case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
   2217 	case R_TILEGX_IMM16_X0_HW0_TLS_IE:
   2218 	case R_TILEGX_IMM16_X1_HW0_TLS_IE:
   2219 	case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
   2220 	case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
   2221 	case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
   2222 	case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
   2223 	  if (h != NULL)
   2224 	    {
   2225 	      if (h->got.refcount > 0)
   2226 		h->got.refcount--;
   2227 	    }
   2228 	  else
   2229 	    {
   2230 	      if (local_got_refcounts &&
   2231 		  local_got_refcounts[r_symndx] > 0)
   2232 		local_got_refcounts[r_symndx]--;
   2233 	    }
   2234 	  break;
   2235 
   2236         case R_TILEGX_64_PCREL:
   2237         case R_TILEGX_32_PCREL:
   2238         case R_TILEGX_16_PCREL:
   2239         case R_TILEGX_8_PCREL:
   2240 	case R_TILEGX_IMM16_X0_HW0_PCREL:
   2241 	case R_TILEGX_IMM16_X1_HW0_PCREL:
   2242 	case R_TILEGX_IMM16_X0_HW1_PCREL:
   2243 	case R_TILEGX_IMM16_X1_HW1_PCREL:
   2244 	case R_TILEGX_IMM16_X0_HW2_PCREL:
   2245 	case R_TILEGX_IMM16_X1_HW2_PCREL:
   2246 	case R_TILEGX_IMM16_X0_HW3_PCREL:
   2247 	case R_TILEGX_IMM16_X1_HW3_PCREL:
   2248 	case R_TILEGX_IMM16_X0_HW0_LAST_PCREL:
   2249 	case R_TILEGX_IMM16_X1_HW0_LAST_PCREL:
   2250 	case R_TILEGX_IMM16_X0_HW1_LAST_PCREL:
   2251 	case R_TILEGX_IMM16_X1_HW1_LAST_PCREL:
   2252 	case R_TILEGX_IMM16_X0_HW2_LAST_PCREL:
   2253 	case R_TILEGX_IMM16_X1_HW2_LAST_PCREL:
   2254 	  if (h != NULL
   2255 	      && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
   2256 	    break;
   2257 	  /* Fall through.  */
   2258 
   2259         case R_TILEGX_64:
   2260         case R_TILEGX_32:
   2261         case R_TILEGX_16:
   2262         case R_TILEGX_8:
   2263 	case R_TILEGX_HW0:
   2264 	case R_TILEGX_HW1:
   2265 	case R_TILEGX_HW2:
   2266 	case R_TILEGX_HW3:
   2267 	case R_TILEGX_HW0_LAST:
   2268 	case R_TILEGX_HW1_LAST:
   2269 	case R_TILEGX_HW2_LAST:
   2270         case R_TILEGX_COPY:
   2271         case R_TILEGX_GLOB_DAT:
   2272         case R_TILEGX_JMP_SLOT:
   2273         case R_TILEGX_RELATIVE:
   2274         case R_TILEGX_BROFF_X1:
   2275         case R_TILEGX_JUMPOFF_X1:
   2276         case R_TILEGX_IMM8_X0:
   2277         case R_TILEGX_IMM8_Y0:
   2278         case R_TILEGX_IMM8_X1:
   2279         case R_TILEGX_IMM8_Y1:
   2280         case R_TILEGX_DEST_IMM8_X1:
   2281         case R_TILEGX_MT_IMM14_X1:
   2282         case R_TILEGX_MF_IMM14_X1:
   2283         case R_TILEGX_MMSTART_X0:
   2284         case R_TILEGX_MMEND_X0:
   2285         case R_TILEGX_SHAMT_X0:
   2286         case R_TILEGX_SHAMT_X1:
   2287         case R_TILEGX_SHAMT_Y0:
   2288         case R_TILEGX_SHAMT_Y1:
   2289 	case R_TILEGX_IMM16_X0_HW0:
   2290 	case R_TILEGX_IMM16_X1_HW0:
   2291 	case R_TILEGX_IMM16_X0_HW1:
   2292 	case R_TILEGX_IMM16_X1_HW1:
   2293 	case R_TILEGX_IMM16_X0_HW2:
   2294 	case R_TILEGX_IMM16_X1_HW2:
   2295 	case R_TILEGX_IMM16_X0_HW3:
   2296 	case R_TILEGX_IMM16_X1_HW3:
   2297 	case R_TILEGX_IMM16_X0_HW0_LAST:
   2298 	case R_TILEGX_IMM16_X1_HW0_LAST:
   2299 	case R_TILEGX_IMM16_X0_HW1_LAST:
   2300 	case R_TILEGX_IMM16_X1_HW1_LAST:
   2301 	case R_TILEGX_IMM16_X0_HW2_LAST:
   2302 	case R_TILEGX_IMM16_X1_HW2_LAST:
   2303 	  if (info->shared)
   2304 	    break;
   2305 	  /* Fall through.  */
   2306 
   2307         case R_TILEGX_JUMPOFF_X1_PLT:
   2308 	case R_TILEGX_IMM16_X0_HW0_PLT_PCREL:
   2309 	case R_TILEGX_IMM16_X1_HW0_PLT_PCREL:
   2310 	case R_TILEGX_IMM16_X0_HW1_PLT_PCREL:
   2311 	case R_TILEGX_IMM16_X1_HW1_PLT_PCREL:
   2312 	case R_TILEGX_IMM16_X0_HW2_PLT_PCREL:
   2313 	case R_TILEGX_IMM16_X1_HW2_PLT_PCREL:
   2314 	case R_TILEGX_IMM16_X0_HW3_PLT_PCREL:
   2315 	case R_TILEGX_IMM16_X1_HW3_PLT_PCREL:
   2316 	case R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL:
   2317 	case R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL:
   2318 	case R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL:
   2319 	case R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL:
   2320 	case R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL:
   2321 	case R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL:
   2322 	  if (h != NULL)
   2323 	    {
   2324 	      if (h->plt.refcount > 0)
   2325 		h->plt.refcount--;
   2326 	    }
   2327 	  break;
   2328 
   2329 	default:
   2330 	  break;
   2331 	}
   2332     }
   2333 
   2334   return TRUE;
   2335 }
   2336 
   2337 /* Adjust a symbol defined by a dynamic object and referenced by a
   2338    regular object.  The current definition is in some section of the
   2339    dynamic object, but we're not including those sections.  We have to
   2340    change the definition to something the rest of the link can
   2341    understand.  */
   2342 
   2343 bfd_boolean
   2344 tilegx_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
   2345 				  struct elf_link_hash_entry *h)
   2346 {
   2347   struct tilegx_elf_link_hash_table *htab;
   2348   struct tilegx_elf_link_hash_entry * eh;
   2349   struct tilegx_elf_dyn_relocs *p;
   2350   bfd *dynobj;
   2351   asection *s;
   2352 
   2353   htab = tilegx_elf_hash_table (info);
   2354   BFD_ASSERT (htab != NULL);
   2355 
   2356   dynobj = htab->elf.dynobj;
   2357 
   2358   /* Make sure we know what is going on here.  */
   2359   BFD_ASSERT (dynobj != NULL
   2360 	      && (h->needs_plt
   2361 		  || h->u.weakdef != NULL
   2362 		  || (h->def_dynamic
   2363 		      && h->ref_regular
   2364 		      && !h->def_regular)));
   2365 
   2366   /* If this is a function, put it in the procedure linkage table.  We
   2367      will fill in the contents of the procedure linkage table later
   2368      (although we could actually do it here). */
   2369   if (h->type == STT_FUNC || h->needs_plt)
   2370     {
   2371       if (h->plt.refcount <= 0
   2372 	  || SYMBOL_CALLS_LOCAL (info, h)
   2373 	  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
   2374 	      && h->root.type == bfd_link_hash_undefweak))
   2375 	{
   2376 	  /* This case can occur if we saw a R_TILEGX_JUMPOFF_X1_PLT
   2377              reloc in an input file, but the symbol was never referred
   2378              to by a dynamic object, or if all references were garbage
   2379              collected.  In such a case, we don't actually need to build
   2380              a procedure linkage table, and we can just do a
   2381              R_TILEGX_JUMPOFF_X1 relocation instead. */
   2382 	  h->plt.offset = (bfd_vma) -1;
   2383 	  h->needs_plt = 0;
   2384 	}
   2385 
   2386       return TRUE;
   2387     }
   2388   else
   2389     h->plt.offset = (bfd_vma) -1;
   2390 
   2391   /* If this is a weak symbol, and there is a real definition, the
   2392      processor independent code will have arranged for us to see the
   2393      real definition first, and we can just use the same value.  */
   2394   if (h->u.weakdef != NULL)
   2395     {
   2396       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
   2397 		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
   2398       h->root.u.def.section = h->u.weakdef->root.u.def.section;
   2399       h->root.u.def.value = h->u.weakdef->root.u.def.value;
   2400       return TRUE;
   2401     }
   2402 
   2403   /* This is a reference to a symbol defined by a dynamic object which
   2404      is not a function.  */
   2405 
   2406   /* If we are creating a shared library, we must presume that the
   2407      only references to the symbol are via the global offset table.
   2408      For such cases we need not do anything here; the relocations will
   2409      be handled correctly by relocate_section.  */
   2410   if (info->shared)
   2411     return TRUE;
   2412 
   2413   /* If there are no references to this symbol that do not use the
   2414      GOT, we don't need to generate a copy reloc.  */
   2415   if (!h->non_got_ref)
   2416     return TRUE;
   2417 
   2418   /* If -z nocopyreloc was given, we won't generate them either.  */
   2419   if (info->nocopyreloc)
   2420     {
   2421       h->non_got_ref = 0;
   2422       return TRUE;
   2423     }
   2424 
   2425   eh = (struct tilegx_elf_link_hash_entry *) h;
   2426   for (p = eh->dyn_relocs; p != NULL; p = p->next)
   2427     {
   2428       s = p->sec->output_section;
   2429       if (s != NULL && (s->flags & SEC_READONLY) != 0)
   2430 	break;
   2431     }
   2432 
   2433   /* If we didn't find any dynamic relocs in read-only sections, then
   2434      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
   2435   if (p == NULL)
   2436     {
   2437       h->non_got_ref = 0;
   2438       return TRUE;
   2439     }
   2440 
   2441   /* We must allocate the symbol in our .dynbss section, which will
   2442      become part of the .bss section of the executable.  There will be
   2443      an entry for this symbol in the .dynsym section.  The dynamic
   2444      object will contain position independent code, so all references
   2445      from the dynamic object to this symbol will go through the global
   2446      offset table.  The dynamic linker will use the .dynsym entry to
   2447      determine the address it must put in the global offset table, so
   2448      both the dynamic object and the regular object will refer to the
   2449      same memory location for the variable.  */
   2450 
   2451   /* We must generate a R_TILEGX_COPY reloc to tell the dynamic linker
   2452      to copy the initial value out of the dynamic object and into the
   2453      runtime process image.  We need to remember the offset into the
   2454      .rel.bss section we are going to use.  */
   2455   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
   2456     {
   2457       htab->srelbss->size += TILEGX_ELF_RELA_BYTES (htab);
   2458       h->needs_copy = 1;
   2459     }
   2460 
   2461   return _bfd_elf_adjust_dynamic_copy (h, htab->sdynbss);
   2462 }
   2463 
   2464 /* Allocate space in .plt, .got and associated reloc sections for
   2465    dynamic relocs.  */
   2466 
   2467 static bfd_boolean
   2468 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
   2469 {
   2470   struct bfd_link_info *info;
   2471   struct tilegx_elf_link_hash_table *htab;
   2472   struct tilegx_elf_link_hash_entry *eh;
   2473   struct tilegx_elf_dyn_relocs *p;
   2474 
   2475   if (h->root.type == bfd_link_hash_indirect)
   2476     return TRUE;
   2477 
   2478   info = (struct bfd_link_info *) inf;
   2479   htab = tilegx_elf_hash_table (info);
   2480   BFD_ASSERT (htab != NULL);
   2481 
   2482   if (htab->elf.dynamic_sections_created
   2483       && h->plt.refcount > 0)
   2484     {
   2485       /* Make sure this symbol is output as a dynamic symbol.
   2486 	 Undefined weak syms won't yet be marked as dynamic.  */
   2487       if (h->dynindx == -1
   2488 	  && !h->forced_local)
   2489 	{
   2490 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2491 	    return FALSE;
   2492 	}
   2493 
   2494       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
   2495 	{
   2496 	  asection *s = htab->elf.splt;
   2497 
   2498 	  /* Allocate room for the header and tail.  */
   2499 	  if (s->size == 0)
   2500 	    {
   2501 	      s->size = PLT_ENTRY_SIZE;
   2502 	    }
   2503 
   2504           h->plt.offset = s->size - PLT_ENTRY_SIZE + PLT_HEADER_SIZE;
   2505 
   2506 	  /* If this symbol is not defined in a regular file, and we are
   2507 	     not generating a shared library, then set the symbol to this
   2508 	     location in the .plt.  This is required to make function
   2509 	     pointers compare as equal between the normal executable and
   2510 	     the shared library.  */
   2511 	  if (! info->shared
   2512 	      && !h->def_regular)
   2513 	    {
   2514 	      h->root.u.def.section = s;
   2515 	      h->root.u.def.value = h->plt.offset;
   2516 	    }
   2517 
   2518 	  /* Make room for this entry.  */
   2519 	  s->size += PLT_ENTRY_SIZE;
   2520 
   2521 	  /* We also need to make an entry in the .got.plt section.  */
   2522 	  htab->elf.sgotplt->size += GOT_ENTRY_SIZE (htab);
   2523 
   2524 	  /* We also need to make an entry in the .rela.plt section.  */
   2525 	  htab->elf.srelplt->size += TILEGX_ELF_RELA_BYTES (htab);
   2526 	}
   2527       else
   2528 	{
   2529 	  h->plt.offset = (bfd_vma) -1;
   2530 	  h->needs_plt = 0;
   2531 	}
   2532     }
   2533   else
   2534     {
   2535       h->plt.offset = (bfd_vma) -1;
   2536       h->needs_plt = 0;
   2537     }
   2538 
   2539   /* If a TLS_IE symbol is now local to the binary, make it a TLS_LE
   2540      requiring no TLS entry.  */
   2541   if (h->got.refcount > 0
   2542       && !htab->disable_le_transition
   2543       && !info->shared
   2544       && h->dynindx == -1
   2545       && tilegx_elf_hash_entry(h)->tls_type == GOT_TLS_IE)
   2546     h->got.offset = (bfd_vma) -1;
   2547   else if (h->got.refcount > 0)
   2548     {
   2549       asection *s;
   2550       bfd_boolean dyn;
   2551       int tls_type = tilegx_elf_hash_entry(h)->tls_type;
   2552 
   2553       /* Make sure this symbol is output as a dynamic symbol.
   2554 	 Undefined weak syms won't yet be marked as dynamic.  */
   2555       if (h->dynindx == -1
   2556 	  && !h->forced_local)
   2557 	{
   2558 	  if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2559 	    return FALSE;
   2560 	}
   2561 
   2562       s = htab->elf.sgot;
   2563       h->got.offset = s->size;
   2564       s->size += TILEGX_ELF_WORD_BYTES (htab);
   2565       /* TLS_GD entries need 2 consecutive GOT slots. */
   2566       if (tls_type == GOT_TLS_GD)
   2567         s->size += TILEGX_ELF_WORD_BYTES (htab);
   2568       dyn = htab->elf.dynamic_sections_created;
   2569       /* TLS_IE needs one dynamic relocation,
   2570          TLS_GD needs two if local symbol and two if global.  */
   2571       if (tls_type == GOT_TLS_GD || tls_type == GOT_TLS_IE)
   2572 	htab->elf.srelgot->size += 2 * TILEGX_ELF_RELA_BYTES (htab);
   2573       else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h))
   2574 	htab->elf.srelgot->size += TILEGX_ELF_RELA_BYTES (htab);
   2575     }
   2576   else
   2577     h->got.offset = (bfd_vma) -1;
   2578 
   2579   eh = (struct tilegx_elf_link_hash_entry *) h;
   2580   if (eh->dyn_relocs == NULL)
   2581     return TRUE;
   2582 
   2583   /* In the shared -Bsymbolic case, discard space allocated for
   2584      dynamic pc-relative relocs against symbols which turn out to be
   2585      defined in regular objects.  For the normal shared case, discard
   2586      space for pc-relative relocs that have become local due to symbol
   2587      visibility changes.  */
   2588 
   2589   if (info->shared)
   2590     {
   2591       if (SYMBOL_CALLS_LOCAL (info, h))
   2592 	{
   2593 	  struct tilegx_elf_dyn_relocs **pp;
   2594 
   2595 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
   2596 	    {
   2597 	      p->count -= p->pc_count;
   2598 	      p->pc_count = 0;
   2599 	      if (p->count == 0)
   2600 		*pp = p->next;
   2601 	      else
   2602 		pp = &p->next;
   2603 	    }
   2604 	}
   2605 
   2606       /* Also discard relocs on undefined weak syms with non-default
   2607 	 visibility.  */
   2608       if (eh->dyn_relocs != NULL
   2609 	  && h->root.type == bfd_link_hash_undefweak)
   2610 	{
   2611 	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
   2612 	    eh->dyn_relocs = NULL;
   2613 
   2614 	  /* Make sure undefined weak symbols are output as a dynamic
   2615 	     symbol in PIEs.  */
   2616 	  else if (h->dynindx == -1
   2617 		   && !h->forced_local)
   2618 	    {
   2619 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2620 		return FALSE;
   2621 	    }
   2622 	}
   2623     }
   2624   else
   2625     {
   2626       /* For the non-shared case, discard space for relocs against
   2627 	 symbols which turn out to need copy relocs or are not
   2628 	 dynamic.  */
   2629 
   2630       if (!h->non_got_ref
   2631 	  && ((h->def_dynamic
   2632 	       && !h->def_regular)
   2633 	      || (htab->elf.dynamic_sections_created
   2634 		  && (h->root.type == bfd_link_hash_undefweak
   2635 		      || h->root.type == bfd_link_hash_undefined))))
   2636 	{
   2637 	  /* Make sure this symbol is output as a dynamic symbol.
   2638 	     Undefined weak syms won't yet be marked as dynamic.  */
   2639 	  if (h->dynindx == -1
   2640 	      && !h->forced_local)
   2641 	    {
   2642 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2643 		return FALSE;
   2644 	    }
   2645 
   2646 	  /* If that succeeded, we know we'll be keeping all the
   2647 	     relocs.  */
   2648 	  if (h->dynindx != -1)
   2649 	    goto keep;
   2650 	}
   2651 
   2652       eh->dyn_relocs = NULL;
   2653 
   2654     keep: ;
   2655     }
   2656 
   2657   /* Finally, allocate space.  */
   2658   for (p = eh->dyn_relocs; p != NULL; p = p->next)
   2659     {
   2660       asection *sreloc = elf_section_data (p->sec)->sreloc;
   2661       sreloc->size += p->count * TILEGX_ELF_RELA_BYTES (htab);
   2662     }
   2663 
   2664   return TRUE;
   2665 }
   2666 
   2667 /* Find any dynamic relocs that apply to read-only sections.  */
   2668 
   2669 static bfd_boolean
   2670 readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
   2671 {
   2672   struct tilegx_elf_link_hash_entry *eh;
   2673   struct tilegx_elf_dyn_relocs *p;
   2674 
   2675   eh = (struct tilegx_elf_link_hash_entry *) h;
   2676   for (p = eh->dyn_relocs; p != NULL; p = p->next)
   2677     {
   2678       asection *s = p->sec->output_section;
   2679 
   2680       if (s != NULL && (s->flags & SEC_READONLY) != 0)
   2681 	{
   2682 	  struct bfd_link_info *info = (struct bfd_link_info *) inf;
   2683 
   2684 	  info->flags |= DF_TEXTREL;
   2685 
   2686 	  /* Not an error, just cut short the traversal.  */
   2687 	  return FALSE;
   2688 	}
   2689     }
   2690   return TRUE;
   2691 }
   2692 
   2693 /* Return true if the dynamic symbol for a given section should be
   2694    omitted when creating a shared library.  */
   2695 
   2696 bfd_boolean
   2697 tilegx_elf_omit_section_dynsym (bfd *output_bfd,
   2698 				struct bfd_link_info *info,
   2699 				asection *p)
   2700 {
   2701   /* We keep the .got section symbol so that explicit relocations
   2702      against the _GLOBAL_OFFSET_TABLE_ symbol emitted in PIC mode
   2703      can be turned into relocations against the .got symbol.  */
   2704   if (strcmp (p->name, ".got") == 0)
   2705     return FALSE;
   2706 
   2707   return _bfd_elf_link_omit_section_dynsym (output_bfd, info, p);
   2708 }
   2709 
   2710 bfd_boolean
   2711 tilegx_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   2712 				  struct bfd_link_info *info)
   2713 {
   2714   struct tilegx_elf_link_hash_table *htab;
   2715   bfd *dynobj;
   2716   asection *s;
   2717   bfd *ibfd;
   2718 
   2719   htab = tilegx_elf_hash_table (info);
   2720   BFD_ASSERT (htab != NULL);
   2721   dynobj = htab->elf.dynobj;
   2722   BFD_ASSERT (dynobj != NULL);
   2723 
   2724   if (elf_hash_table (info)->dynamic_sections_created)
   2725     {
   2726       /* Set the contents of the .interp section to the interpreter.  */
   2727       if (info->executable)
   2728 	{
   2729 	  s = bfd_get_linker_section (dynobj, ".interp");
   2730 	  BFD_ASSERT (s != NULL);
   2731 	  s->size = strlen (htab->dynamic_interpreter) + 1;
   2732 	  s->contents = (unsigned char *) htab->dynamic_interpreter;
   2733 	}
   2734     }
   2735 
   2736   /* Set up .got offsets for local syms, and space for local dynamic
   2737      relocs.  */
   2738   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
   2739     {
   2740       bfd_signed_vma *local_got;
   2741       bfd_signed_vma *end_local_got;
   2742       char *local_tls_type;
   2743       bfd_size_type locsymcount;
   2744       Elf_Internal_Shdr *symtab_hdr;
   2745       asection *srel;
   2746 
   2747       if (! is_tilegx_elf (ibfd))
   2748 	continue;
   2749 
   2750       for (s = ibfd->sections; s != NULL; s = s->next)
   2751 	{
   2752 	  struct tilegx_elf_dyn_relocs *p;
   2753 
   2754 	  for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
   2755 	    {
   2756 	      if (!bfd_is_abs_section (p->sec)
   2757 		  && bfd_is_abs_section (p->sec->output_section))
   2758 		{
   2759 		  /* Input section has been discarded, either because
   2760 		     it is a copy of a linkonce section or due to
   2761 		     linker script /DISCARD/, so we'll be discarding
   2762 		     the relocs too.  */
   2763 		}
   2764 	      else if (p->count != 0)
   2765 		{
   2766 		  srel = elf_section_data (p->sec)->sreloc;
   2767 		  srel->size += p->count * TILEGX_ELF_RELA_BYTES (htab);
   2768 		  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
   2769 		    info->flags |= DF_TEXTREL;
   2770 		}
   2771 	    }
   2772 	}
   2773 
   2774       local_got = elf_local_got_refcounts (ibfd);
   2775       if (!local_got)
   2776 	continue;
   2777 
   2778       symtab_hdr = &elf_symtab_hdr (ibfd);
   2779       locsymcount = symtab_hdr->sh_info;
   2780       end_local_got = local_got + locsymcount;
   2781       local_tls_type = _bfd_tilegx_elf_local_got_tls_type (ibfd);
   2782       s = htab->elf.sgot;
   2783       srel = htab->elf.srelgot;
   2784       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
   2785 	{
   2786 	  if (*local_got > 0)
   2787 	    {
   2788 	      *local_got = s->size;
   2789 	      s->size += TILEGX_ELF_WORD_BYTES (htab);
   2790               if (*local_tls_type == GOT_TLS_GD)
   2791                 s->size += TILEGX_ELF_WORD_BYTES (htab);
   2792               if (info->shared
   2793                   || *local_tls_type == GOT_TLS_GD
   2794                   || *local_tls_type == GOT_TLS_IE)
   2795 		srel->size += TILEGX_ELF_RELA_BYTES (htab);
   2796 	    }
   2797 	  else
   2798 	    *local_got = (bfd_vma) -1;
   2799 	}
   2800     }
   2801 
   2802   /* Allocate global sym .plt and .got entries, and space for global
   2803      sym dynamic relocs.  */
   2804   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
   2805 
   2806   if (elf_hash_table (info)->dynamic_sections_created)
   2807     {
   2808       /* If the .got section is more than 0x8000 bytes, we add
   2809 	 0x8000 to the value of _GLOBAL_OFFSET_TABLE_, so that 16
   2810 	 bit relocations have a greater chance of working. */
   2811       if (htab->elf.sgot->size >= 0x8000
   2812 	  && elf_hash_table (info)->hgot->root.u.def.value == 0)
   2813 	elf_hash_table (info)->hgot->root.u.def.value = 0x8000;
   2814     }
   2815 
   2816   if (htab->elf.sgotplt)
   2817     {
   2818       struct elf_link_hash_entry *got;
   2819       got = elf_link_hash_lookup (elf_hash_table (info),
   2820 				  "_GLOBAL_OFFSET_TABLE_",
   2821 				  FALSE, FALSE, FALSE);
   2822 
   2823       /* Don't allocate .got.plt section if there are no GOT nor PLT
   2824          entries and there is no refeence to _GLOBAL_OFFSET_TABLE_.  */
   2825       if ((got == NULL
   2826 	   || !got->ref_regular_nonweak)
   2827 	  && (htab->elf.sgotplt->size
   2828 	      == (unsigned)GOTPLT_HEADER_SIZE (htab))
   2829 	  && (htab->elf.splt == NULL
   2830 	      || htab->elf.splt->size == 0)
   2831 	  && (htab->elf.sgot == NULL
   2832 	      || (htab->elf.sgot->size
   2833 		  == get_elf_backend_data (output_bfd)->got_header_size)))
   2834 	htab->elf.sgotplt->size = 0;
   2835     }
   2836 
   2837   /* The check_relocs and adjust_dynamic_symbol entry points have
   2838      determined the sizes of the various dynamic sections.  Allocate
   2839      memory for them.  */
   2840   for (s = dynobj->sections; s != NULL; s = s->next)
   2841     {
   2842       if ((s->flags & SEC_LINKER_CREATED) == 0)
   2843 	continue;
   2844 
   2845       if (s == htab->elf.splt
   2846 	  || s == htab->elf.sgot
   2847 	  || s == htab->elf.sgotplt
   2848 	  || s == htab->sdynbss)
   2849 	{
   2850 	  /* Strip this section if we don't need it; see the
   2851 	     comment below.  */
   2852 	}
   2853       else if (strncmp (s->name, ".rela", 5) == 0)
   2854 	{
   2855 	  if (s->size != 0)
   2856 	    {
   2857 	      /* We use the reloc_count field as a counter if we need
   2858 		 to copy relocs into the output file.  */
   2859 	      s->reloc_count = 0;
   2860 	    }
   2861 	}
   2862       else
   2863 	{
   2864 	  /* It's not one of our sections.  */
   2865 	  continue;
   2866 	}
   2867 
   2868       if (s->size == 0)
   2869 	{
   2870 	  /* If we don't need this section, strip it from the
   2871 	     output file.  This is mostly to handle .rela.bss and
   2872 	     .rela.plt.  We must create both sections in
   2873 	     create_dynamic_sections, because they must be created
   2874 	     before the linker maps input sections to output
   2875 	     sections.  The linker does that before
   2876 	     adjust_dynamic_symbol is called, and it is that
   2877 	     function which decides whether anything needs to go
   2878 	     into these sections.  */
   2879 	  s->flags |= SEC_EXCLUDE;
   2880 	  continue;
   2881 	}
   2882 
   2883       if ((s->flags & SEC_HAS_CONTENTS) == 0)
   2884 	continue;
   2885 
   2886       /* Allocate memory for the section contents.  Zero the memory
   2887 	 for the benefit of .rela.plt, which has 4 unused entries
   2888 	 at the beginning, and we don't want garbage.  */
   2889       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
   2890       if (s->contents == NULL)
   2891 	return FALSE;
   2892     }
   2893 
   2894   if (elf_hash_table (info)->dynamic_sections_created)
   2895     {
   2896       /* Add some entries to the .dynamic section.  We fill in the
   2897 	 values later, in tilegx_elf_finish_dynamic_sections, but we
   2898 	 must add the entries now so that we get the correct size for
   2899 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
   2900 	 dynamic linker and used by the debugger.  */
   2901 #define add_dynamic_entry(TAG, VAL) \
   2902   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
   2903 
   2904       if (info->executable)
   2905 	{
   2906 	  if (!add_dynamic_entry (DT_DEBUG, 0))
   2907 	    return FALSE;
   2908 	}
   2909 
   2910       if (htab->elf.srelplt->size != 0)
   2911 	{
   2912 	  if (!add_dynamic_entry (DT_PLTGOT, 0)
   2913 	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
   2914 	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
   2915 	      || !add_dynamic_entry (DT_JMPREL, 0))
   2916 	    return FALSE;
   2917 	}
   2918 
   2919       if (!add_dynamic_entry (DT_RELA, 0)
   2920 	  || !add_dynamic_entry (DT_RELASZ, 0)
   2921 	  || !add_dynamic_entry (DT_RELAENT, TILEGX_ELF_RELA_BYTES (htab)))
   2922 	return FALSE;
   2923 
   2924       /* If any dynamic relocs apply to a read-only section,
   2925 	 then we need a DT_TEXTREL entry.  */
   2926       if ((info->flags & DF_TEXTREL) == 0)
   2927 	elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info);
   2928 
   2929       if (info->flags & DF_TEXTREL)
   2930 	{
   2931 	  if (!add_dynamic_entry (DT_TEXTREL, 0))
   2932 	    return FALSE;
   2933 	}
   2934     }
   2935 #undef add_dynamic_entry
   2936 
   2937   return TRUE;
   2938 }
   2939 
   2940 /* Return the base VMA address which should be subtracted from real addresses
   2942    when resolving @dtpoff relocation.
   2943    This is PT_TLS segment p_vaddr.  */
   2944 
   2945 static bfd_vma
   2946 dtpoff_base (struct bfd_link_info *info)
   2947 {
   2948   /* If tls_sec is NULL, we should have signalled an error already.  */
   2949   if (elf_hash_table (info)->tls_sec == NULL)
   2950     return 0;
   2951   return elf_hash_table (info)->tls_sec->vma;
   2952 }
   2953 
   2954 /* Return the relocation value for @tpoff relocation. */
   2955 
   2956 static bfd_vma
   2957 tpoff (struct bfd_link_info *info, bfd_vma address)
   2958 {
   2959   struct elf_link_hash_table *htab = elf_hash_table (info);
   2960 
   2961   /* If tls_sec is NULL, we should have signalled an error already.  */
   2962   if (htab->tls_sec == NULL)
   2963     return 0;
   2964 
   2965   return (address - htab->tls_sec->vma);
   2966 }
   2967 
   2968 /* Copy SIZE bits from FROM to TO at address ADDR.  */
   2969 
   2970 static void
   2971 tilegx_copy_bits (bfd_byte *addr, int from, int to, int size)
   2972 {
   2973   int i;
   2974   for (i = 0; i < size; i++)
   2975     {
   2976       int from_byte = (from + i) / 8;
   2977       int from_bit = (from + i) % 8;
   2978       int to_byte = (to + i) / 8;
   2979       int to_bit = (to + i) % 8;
   2980       bfd_byte to_mask = 1 << to_bit;
   2981       addr[to_byte] = (addr[to_byte] & ~to_mask)
   2982 	| ((addr[from_byte] >> from_bit << to_bit) & to_mask);
   2983     }
   2984 }
   2985 
   2986 /* Replace the MASK bits in ADDR with those in INSN, for the next
   2987    TILEGX_BUNDLE_SIZE_IN_BYTES bytes.  */
   2988 
   2989 static void
   2990 tilegx_replace_insn (bfd_byte *addr, const bfd_byte *mask,
   2991 		     const bfd_byte *insn)
   2992 {
   2993   int i;
   2994   for (i = 0; i < TILEGX_BUNDLE_SIZE_IN_BYTES; i++)
   2995     {
   2996       addr[i] = (addr[i] & ~mask[i]) | (insn[i] & mask[i]);
   2997     }
   2998 }
   2999 
   3000 /* Mask to extract the bits corresponding to an instruction in a
   3001    specific pipe of a bundle.  */
   3002 static const bfd_byte insn_mask_X1[] = {
   3003   0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x3f
   3004 };
   3005 
   3006 /* Mask to extract the bits corresponding to an instruction in a
   3007    specific pipe of a bundle, minus the destination operand and the
   3008    first source operand.  */
   3009 static const bfd_byte insn_mask_X0_no_dest_no_srca[] = {
   3010   0x00, 0xf0, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00
   3011 };
   3012 
   3013 static const bfd_byte insn_mask_X1_no_dest_no_srca[] = {
   3014   0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x3f
   3015 };
   3016 
   3017 static const bfd_byte insn_mask_Y0_no_dest_no_srca[] = {
   3018   0x00, 0xf0, 0x0f, 0x78, 0x00, 0x00, 0x00, 0x00
   3019 };
   3020 static const bfd_byte insn_mask_Y1_no_dest_no_srca[] = {
   3021   0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x07, 0x3c
   3022 };
   3023 
   3024 /* Mask to extract the bits corresponding to an instruction in a
   3025    specific pipe of a bundle, minus the register operands.  */
   3026 static const bfd_byte insn_mask_X0_no_operand[] = {
   3027   0x00, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0x00, 0x00
   3028 };
   3029 
   3030 static const bfd_byte insn_mask_X1_no_operand[] = {
   3031   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x3f
   3032 };
   3033 
   3034 static const bfd_byte insn_mask_Y0_no_operand[] = {
   3035   0x00, 0x00, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00
   3036 };
   3037 
   3038 static const bfd_byte insn_mask_Y1_no_operand[] = {
   3039   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3c
   3040 };
   3041 
   3042 /* Various instructions synthesized to support tls references.  */
   3043 
   3044 /* ld r0, r0 in the X1 pipe, used for tls ie.  */
   3045 static const bfd_byte insn_tls_ie_ld_X1[] = {
   3046   0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x6a, 0x28
   3047 };
   3048 
   3049 /* ld4s r0, r0 in the X1 pipe, used for tls ie.  */
   3050 static const bfd_byte insn_tls_ie_ld4s_X1[] = {
   3051   0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x6a, 0x28
   3052 };
   3053 
   3054 /* add r0, r0, tp in various pipes, used for tls ie.  */
   3055 static const bfd_byte insn_tls_ie_add_X0X1[] = {
   3056   0x00, 0x50, 0x0f, 0x50, 0x00, 0xa8, 0x07, 0x28
   3057 };
   3058 static const bfd_byte insn_tls_ie_add_Y0Y1[] = {
   3059   0x00, 0x50, 0x27, 0x2c, 0x00, 0xa8, 0x13, 0x9a
   3060 };
   3061 
   3062 /* addx r0, r0, tp in various pipes, used for tls ie.  */
   3063 static const bfd_byte insn_tls_ie_addx_X0X1[] = {
   3064   0x00, 0x50, 0x0b, 0x50, 0x00, 0xa8, 0x05, 0x28
   3065 };
   3066 static const bfd_byte insn_tls_ie_addx_Y0Y1[] = {
   3067   0x00, 0x50, 0x03, 0x2c, 0x00, 0xa8, 0x01, 0x9a
   3068 };
   3069 
   3070 /* move r0, r0 in various pipes, used for tls gd.  */
   3071 static const bfd_byte insn_tls_gd_add_X0X1[] = {
   3072   0x00, 0xf0, 0x07, 0x51, 0x00, 0xf8, 0x3b, 0x28
   3073 };
   3074 static const bfd_byte insn_tls_gd_add_Y0Y1[] = {
   3075   0x00, 0xf0, 0x0b, 0x54, 0x00, 0xf8, 0x05, 0xae
   3076 };
   3077 
   3078 static const bfd_byte *insn_move_X0X1 = insn_tls_gd_add_X0X1;
   3079 static const bfd_byte *insn_move_Y0Y1 = insn_tls_gd_add_Y0Y1;
   3080 
   3081 static const bfd_byte *insn_add_X0X1 = insn_tls_ie_add_X0X1;
   3082 static const bfd_byte *insn_add_Y0Y1 = insn_tls_ie_add_Y0Y1;
   3083 
   3084 static const bfd_byte *insn_addx_X0X1 = insn_tls_ie_addx_X0X1;
   3085 static const bfd_byte *insn_addx_Y0Y1 = insn_tls_ie_addx_Y0Y1;
   3086 
   3087 /* Relocate an TILEGX ELF section.
   3088 
   3089    The RELOCATE_SECTION function is called by the new ELF backend linker
   3090    to handle the relocations for a section.
   3091 
   3092    The relocs are always passed as Rela structures.
   3093 
   3094    This function is responsible for adjusting the section contents as
   3095    necessary, and (if generating a relocatable output file) adjusting
   3096    the reloc addend as necessary.
   3097 
   3098    This function does not have to worry about setting the reloc
   3099    address or the reloc symbol index.
   3100 
   3101    LOCAL_SYMS is a pointer to the swapped in local symbols.
   3102 
   3103    LOCAL_SECTIONS is an array giving the section in the input file
   3104    corresponding to the st_shndx field of each local symbol.
   3105 
   3106    The global hash table entry for the global symbols can be found
   3107    via elf_sym_hashes (input_bfd).
   3108 
   3109    When generating relocatable output, this function must handle
   3110    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
   3111    going to be the section symbol corresponding to the output
   3112    section, which means that the addend must be adjusted
   3113    accordingly.  */
   3114 
   3115 bfd_boolean
   3116 tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
   3117 			     bfd *input_bfd, asection *input_section,
   3118 			     bfd_byte *contents, Elf_Internal_Rela *relocs,
   3119 			     Elf_Internal_Sym *local_syms,
   3120 			     asection **local_sections)
   3121 {
   3122   struct tilegx_elf_link_hash_table *htab;
   3123   Elf_Internal_Shdr *symtab_hdr;
   3124   struct elf_link_hash_entry **sym_hashes;
   3125   bfd_vma *local_got_offsets;
   3126   bfd_vma got_base;
   3127   asection *sreloc;
   3128   Elf_Internal_Rela *rel;
   3129   Elf_Internal_Rela *relend;
   3130   int num_relocs;
   3131 
   3132   htab = tilegx_elf_hash_table (info);
   3133   BFD_ASSERT (htab != NULL);
   3134   symtab_hdr = &elf_symtab_hdr (input_bfd);
   3135   sym_hashes = elf_sym_hashes (input_bfd);
   3136   local_got_offsets = elf_local_got_offsets (input_bfd);
   3137 
   3138   if (elf_hash_table (info)->hgot == NULL)
   3139     got_base = 0;
   3140   else
   3141     got_base = elf_hash_table (info)->hgot->root.u.def.value;
   3142 
   3143   sreloc = elf_section_data (input_section)->sreloc;
   3144 
   3145   rel = relocs;
   3146   num_relocs = input_section->reloc_count;
   3147   relend = relocs + num_relocs;
   3148   for (; rel < relend; rel++)
   3149     {
   3150       int r_type, tls_type;
   3151       bfd_boolean is_tls_iele, is_tls_le;
   3152       reloc_howto_type *howto;
   3153       unsigned long r_symndx;
   3154       struct elf_link_hash_entry *h;
   3155       Elf_Internal_Sym *sym;
   3156       tilegx_create_func create_func;
   3157       asection *sec;
   3158       bfd_vma relocation;
   3159       bfd_reloc_status_type r;
   3160       const char *name;
   3161       bfd_vma off;
   3162       bfd_boolean is_plt = FALSE;
   3163 
   3164       bfd_boolean unresolved_reloc;
   3165 
   3166       r_type = TILEGX_ELF_R_TYPE (rel->r_info);
   3167       if (r_type == R_TILEGX_GNU_VTINHERIT
   3168 	  || r_type == R_TILEGX_GNU_VTENTRY)
   3169 	continue;
   3170 
   3171       if ((unsigned int)r_type >= ARRAY_SIZE (tilegx_elf_howto_table))
   3172 	{
   3173           /* Not clear if we need to check here, but just be paranoid. */
   3174 	  (*_bfd_error_handler)
   3175 	    (_("%B: unrecognized relocation (0x%x) in section `%A'"),
   3176 	     input_bfd, r_type, input_section);
   3177 	  bfd_set_error (bfd_error_bad_value);
   3178 	  return FALSE;
   3179 	}
   3180 
   3181       howto = tilegx_elf_howto_table + r_type;
   3182 
   3183       /* This is a final link.  */
   3184       r_symndx = TILEGX_ELF_R_SYMNDX (htab, rel->r_info);
   3185       h = NULL;
   3186       sym = NULL;
   3187       sec = NULL;
   3188       unresolved_reloc = FALSE;
   3189       if (r_symndx < symtab_hdr->sh_info)
   3190 	{
   3191 	  sym = local_syms + r_symndx;
   3192 	  sec = local_sections[r_symndx];
   3193 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
   3194 	}
   3195       else
   3196 	{
   3197 	  bfd_boolean warned ATTRIBUTE_UNUSED;
   3198 	  bfd_boolean ignored ATTRIBUTE_UNUSED;
   3199 
   3200 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
   3201 				   r_symndx, symtab_hdr, sym_hashes,
   3202 				   h, sec, relocation,
   3203 				   unresolved_reloc, warned, ignored);
   3204 	  if (warned)
   3205 	    {
   3206 	      /* To avoid generating warning messages about truncated
   3207 		 relocations, set the relocation's address to be the same as
   3208 		 the start of this section.  */
   3209 	      if (input_section->output_section != NULL)
   3210 		relocation = input_section->output_section->vma;
   3211 	      else
   3212 		relocation = 0;
   3213 	    }
   3214 	}
   3215 
   3216       if (sec != NULL && discarded_section (sec))
   3217 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
   3218 					 rel, 1, relend, howto, 0, contents);
   3219 
   3220       if (info->relocatable)
   3221 	continue;
   3222 
   3223       if (h != NULL)
   3224 	name = h->root.root.string;
   3225       else
   3226 	{
   3227 	  name = (bfd_elf_string_from_elf_section
   3228 		  (input_bfd, symtab_hdr->sh_link, sym->st_name));
   3229 	  if (name == NULL || *name == '\0')
   3230 	    name = bfd_section_name (input_bfd, sec);
   3231 	}
   3232 
   3233       switch (r_type)
   3234 	{
   3235 	case R_TILEGX_TLS_GD_CALL:
   3236 	case R_TILEGX_IMM8_X0_TLS_GD_ADD:
   3237 	case R_TILEGX_IMM8_Y0_TLS_GD_ADD:
   3238 	case R_TILEGX_IMM8_X1_TLS_GD_ADD:
   3239 	case R_TILEGX_IMM8_Y1_TLS_GD_ADD:
   3240 	case R_TILEGX_IMM8_X0_TLS_ADD:
   3241 	case R_TILEGX_IMM8_Y0_TLS_ADD:
   3242 	case R_TILEGX_IMM8_X1_TLS_ADD:
   3243 	case R_TILEGX_IMM8_Y1_TLS_ADD:
   3244 	  tls_type = GOT_UNKNOWN;
   3245 	  if (h == NULL && local_got_offsets)
   3246 	    tls_type =
   3247 	      _bfd_tilegx_elf_local_got_tls_type (input_bfd) [r_symndx];
   3248 	  else if (h != NULL)
   3249 	    tls_type = tilegx_elf_hash_entry(h)->tls_type;
   3250 
   3251 	  is_tls_iele = (! info->shared || tls_type == GOT_TLS_IE);
   3252 	  is_tls_le = is_tls_iele && (!input_section->sec_flg0
   3253 				      && !info->shared
   3254 				      && (h == NULL || h->dynindx == -1));
   3255 
   3256 	  if (r_type == R_TILEGX_TLS_GD_CALL)
   3257 	    {
   3258 	      if (is_tls_le)
   3259 		{
   3260 		  /* GD -> LE */
   3261 		  tilegx_replace_insn (contents + rel->r_offset,
   3262 				       insn_mask_X1, insn_move_X0X1);
   3263 		  continue;
   3264 		}
   3265 	      else if (is_tls_iele)
   3266 		{
   3267 		  /* GD -> IE */
   3268 		  if (ABI_64_P (output_bfd))
   3269 		    tilegx_replace_insn (contents + rel->r_offset,
   3270 					 insn_mask_X1, insn_tls_ie_ld_X1);
   3271 		  else
   3272 		    tilegx_replace_insn (contents + rel->r_offset,
   3273 					 insn_mask_X1, insn_tls_ie_ld4s_X1);
   3274 		  continue;
   3275 		}
   3276 
   3277 	      /* GD -> GD */
   3278 	      h = (struct elf_link_hash_entry *)
   3279 		bfd_link_hash_lookup (info->hash, "__tls_get_addr", FALSE,
   3280 				      FALSE, TRUE);
   3281 	      BFD_ASSERT (h != NULL);
   3282 	      r_type = R_TILEGX_JUMPOFF_X1_PLT;
   3283 	      howto = tilegx_elf_howto_table + r_type;
   3284 	    }
   3285 	  else if (r_type == R_TILEGX_IMM8_X0_TLS_ADD
   3286 		   || r_type ==  R_TILEGX_IMM8_X1_TLS_ADD
   3287 		   || r_type ==  R_TILEGX_IMM8_Y0_TLS_ADD
   3288 		   || r_type ==  R_TILEGX_IMM8_Y1_TLS_ADD)
   3289 	    {
   3290 	      bfd_boolean is_pipe0 =
   3291 		(r_type == R_TILEGX_IMM8_X0_TLS_ADD
   3292 		 || r_type ==  R_TILEGX_IMM8_Y0_TLS_ADD);
   3293 	      bfd_boolean is_X0X1 =
   3294 		(r_type == R_TILEGX_IMM8_X0_TLS_ADD
   3295 		 || r_type ==  R_TILEGX_IMM8_X1_TLS_ADD);
   3296 	      int dest_begin = is_pipe0 ? 0 : 31;
   3297 	      int src_begin;
   3298 	      const bfd_byte *insn;
   3299 	      const bfd_byte *mask = NULL;
   3300 
   3301 	      if (is_tls_le)
   3302 		{
   3303 		  /* 1. copy dest operand into the first source operand.
   3304 		     2. change the opcode to "move".  */
   3305 		  src_begin = is_pipe0 ? 6 : 37;
   3306 		  insn = is_X0X1 ? insn_move_X0X1 : insn_move_Y0Y1;
   3307 
   3308 		  switch (r_type)
   3309 		    {
   3310 		    case R_TILEGX_IMM8_X0_TLS_ADD:
   3311 		      mask = insn_mask_X0_no_dest_no_srca;
   3312 		      break;
   3313 		    case R_TILEGX_IMM8_X1_TLS_ADD:
   3314 		      mask = insn_mask_X1_no_dest_no_srca;
   3315 		      break;
   3316 		    case R_TILEGX_IMM8_Y0_TLS_ADD:
   3317 		      mask = insn_mask_Y0_no_dest_no_srca;
   3318 		      break;
   3319 		    case R_TILEGX_IMM8_Y1_TLS_ADD:
   3320 		      mask = insn_mask_Y1_no_dest_no_srca;
   3321 		      break;
   3322 		    }
   3323 		}
   3324 	      else
   3325 		{
   3326 		  /* 1. copy dest operand into the second source operand.
   3327 		     2. change the opcode to "add".  */
   3328 		  src_begin = is_pipe0 ? 12 : 43;
   3329 		  if (ABI_64_P (output_bfd))
   3330 		    insn = is_X0X1 ? insn_add_X0X1 : insn_add_Y0Y1;
   3331 		  else
   3332 		    insn = is_X0X1 ? insn_addx_X0X1 : insn_addx_Y0Y1;
   3333 
   3334 		  switch (r_type)
   3335 		    {
   3336 		    case R_TILEGX_IMM8_X0_TLS_ADD:
   3337 		      mask = insn_mask_X0_no_operand;
   3338 		      break;
   3339 		    case R_TILEGX_IMM8_X1_TLS_ADD:
   3340 		      mask = insn_mask_X1_no_operand;
   3341 		      break;
   3342 		    case R_TILEGX_IMM8_Y0_TLS_ADD:
   3343 		      mask = insn_mask_Y0_no_operand;
   3344 		      break;
   3345 		    case R_TILEGX_IMM8_Y1_TLS_ADD:
   3346 		      mask = insn_mask_Y1_no_operand;
   3347 		      break;
   3348 		    }
   3349 		}
   3350 
   3351 	      tilegx_copy_bits (contents + rel->r_offset, dest_begin,
   3352 				src_begin, 6);
   3353 	      tilegx_replace_insn (contents  + rel->r_offset, mask, insn);
   3354 
   3355 	      continue;
   3356 	    }
   3357 	  else
   3358 	    {
   3359 	      const bfd_byte *mask = NULL;
   3360 	      const bfd_byte *add_insn = NULL;
   3361 	      bfd_boolean is_64bit = ABI_64_P (output_bfd);
   3362 
   3363 	      switch (r_type)
   3364 		{
   3365 		case R_TILEGX_IMM8_X0_TLS_GD_ADD:
   3366 		  add_insn = is_tls_iele
   3367 		    ? (is_64bit ? insn_tls_ie_add_X0X1 : insn_tls_ie_addx_X0X1)
   3368 		    : insn_tls_gd_add_X0X1;
   3369 		  mask = insn_mask_X0_no_dest_no_srca;
   3370 		  break;
   3371 		case R_TILEGX_IMM8_X1_TLS_GD_ADD:
   3372 		  add_insn = is_tls_iele
   3373 		    ? (is_64bit ? insn_tls_ie_add_X0X1 : insn_tls_ie_addx_X0X1)
   3374 		    : insn_tls_gd_add_X0X1;
   3375 		  mask = insn_mask_X1_no_dest_no_srca;
   3376 		  break;
   3377 		case R_TILEGX_IMM8_Y0_TLS_GD_ADD:
   3378 		  add_insn = is_tls_iele
   3379 		    ? (is_64bit ? insn_tls_ie_add_Y0Y1 : insn_tls_ie_addx_Y0Y1)
   3380 		    : insn_tls_gd_add_Y0Y1;
   3381 		  mask = insn_mask_Y0_no_dest_no_srca;
   3382 		  break;
   3383 		case R_TILEGX_IMM8_Y1_TLS_GD_ADD:
   3384 		  add_insn = is_tls_iele
   3385 		    ? (is_64bit ? insn_tls_ie_add_Y0Y1 : insn_tls_ie_addx_Y0Y1)
   3386 		    : insn_tls_gd_add_Y0Y1;
   3387 		  mask = insn_mask_Y1_no_dest_no_srca;
   3388 		  break;
   3389 		}
   3390 
   3391 	      tilegx_replace_insn (contents + rel->r_offset, mask, add_insn);
   3392 
   3393 	      continue;
   3394 	    }
   3395 	  break;
   3396 	case R_TILEGX_TLS_IE_LOAD:
   3397 	  if (!input_section->sec_flg0
   3398 	      && !info->shared
   3399 	      && (h == NULL || h->dynindx == -1))
   3400 	    {
   3401 	      /* IE -> LE */
   3402 	      tilegx_replace_insn (contents + rel->r_offset,
   3403 				   insn_mask_X1_no_dest_no_srca,
   3404 				   insn_move_X0X1);
   3405 	    }
   3406 	  else
   3407 	    {
   3408 	      /* IE -> IE */
   3409 	      if (ABI_64_P (output_bfd))
   3410 		tilegx_replace_insn (contents + rel->r_offset,
   3411 				     insn_mask_X1_no_dest_no_srca,
   3412 				     insn_tls_ie_ld_X1);
   3413 	      else
   3414 		tilegx_replace_insn (contents + rel->r_offset,
   3415 				     insn_mask_X1_no_dest_no_srca,
   3416 				     insn_tls_ie_ld4s_X1);
   3417 	    }
   3418 	  continue;
   3419 	  break;
   3420 	default:
   3421 	  break;
   3422 	}
   3423 
   3424       switch (r_type)
   3425 	{
   3426 	case R_TILEGX_IMM16_X0_HW0_GOT:
   3427 	case R_TILEGX_IMM16_X1_HW0_GOT:
   3428 	case R_TILEGX_IMM16_X0_HW0_LAST_GOT:
   3429 	case R_TILEGX_IMM16_X1_HW0_LAST_GOT:
   3430 	case R_TILEGX_IMM16_X0_HW1_LAST_GOT:
   3431 	case R_TILEGX_IMM16_X1_HW1_LAST_GOT:
   3432 	  /* Relocation is to the entry for this symbol in the global
   3433 	     offset table.  */
   3434 	  if (htab->elf.sgot == NULL)
   3435 	    abort ();
   3436 
   3437 	  if (h != NULL)
   3438 	    {
   3439 	      bfd_boolean dyn;
   3440 
   3441 	      off = h->got.offset;
   3442 	      BFD_ASSERT (off != (bfd_vma) -1);
   3443 	      dyn = elf_hash_table (info)->dynamic_sections_created;
   3444 
   3445 	      if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
   3446 		  || (info->shared
   3447 		      && SYMBOL_REFERENCES_LOCAL (info, h)))
   3448 		{
   3449 		  /* This is actually a static link, or it is a
   3450 		     -Bsymbolic link and the symbol is defined
   3451 		     locally, or the symbol was forced to be local
   3452 		     because of a version file.  We must initialize
   3453 		     this entry in the global offset table.  Since the
   3454 		     offset must always be a multiple
   3455 		     of 8 for 64-bit, we use the least significant bit
   3456 		     to record whether we have initialized it already.
   3457 
   3458 		     When doing a dynamic link, we create a .rela.got
   3459 		     relocation entry to initialize the value.  This
   3460 		     is done in the finish_dynamic_symbol routine.  */
   3461 		  if ((off & 1) != 0)
   3462 		    off &= ~1;
   3463 		  else
   3464 		    {
   3465 		      TILEGX_ELF_PUT_WORD (htab, output_bfd, relocation,
   3466 					   htab->elf.sgot->contents + off);
   3467 		      h->got.offset |= 1;
   3468 		    }
   3469 		}
   3470 	      else
   3471 		unresolved_reloc = FALSE;
   3472 	    }
   3473 	  else
   3474 	    {
   3475 	      BFD_ASSERT (local_got_offsets != NULL
   3476 			  && local_got_offsets[r_symndx] != (bfd_vma) -1);
   3477 
   3478 	      off = local_got_offsets[r_symndx];
   3479 
   3480 	      /* The offset must always be a multiple of 8 on 64-bit.
   3481                  We use the least significant bit to record
   3482 		 whether we have already processed this entry.  */
   3483 	      if ((off & 1) != 0)
   3484 		off &= ~1;
   3485 	      else
   3486 		{
   3487 		  if (info->shared)
   3488 		    {
   3489 		      asection *s;
   3490 		      Elf_Internal_Rela outrel;
   3491 
   3492 		      /* We need to generate a R_TILEGX_RELATIVE reloc
   3493 			 for the dynamic linker.  */
   3494 		      s = htab->elf.srelgot;
   3495 		      BFD_ASSERT (s != NULL);
   3496 
   3497 		      outrel.r_offset = (htab->elf.sgot->output_section->vma
   3498 					 + htab->elf.sgot->output_offset
   3499 					 + off);
   3500 		      outrel.r_info =
   3501 			TILEGX_ELF_R_INFO (htab, NULL, 0, R_TILEGX_RELATIVE);
   3502 		      outrel.r_addend = relocation;
   3503 		      relocation = 0;
   3504 		      tilegx_elf_append_rela (output_bfd, s, &outrel);
   3505 		    }
   3506 
   3507 		  TILEGX_ELF_PUT_WORD (htab, output_bfd, relocation,
   3508 				       htab->elf.sgot->contents + off);
   3509 		  local_got_offsets[r_symndx] |= 1;
   3510 		}
   3511 	    }
   3512 	  relocation = off - got_base;
   3513 	  break;
   3514 
   3515         case R_TILEGX_JUMPOFF_X1_PLT:
   3516 	case R_TILEGX_IMM16_X0_HW0_PLT_PCREL:
   3517 	case R_TILEGX_IMM16_X1_HW0_PLT_PCREL:
   3518 	case R_TILEGX_IMM16_X0_HW1_PLT_PCREL:
   3519 	case R_TILEGX_IMM16_X1_HW1_PLT_PCREL:
   3520 	case R_TILEGX_IMM16_X0_HW2_PLT_PCREL:
   3521 	case R_TILEGX_IMM16_X1_HW2_PLT_PCREL:
   3522 	case R_TILEGX_IMM16_X0_HW3_PLT_PCREL:
   3523 	case R_TILEGX_IMM16_X1_HW3_PLT_PCREL:
   3524 	case R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL:
   3525 	case R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL:
   3526 	case R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL:
   3527 	case R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL:
   3528 	case R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL:
   3529 	case R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL:
   3530 	  /* Relocation is to the entry for this symbol in the
   3531 	     procedure linkage table.  */
   3532           BFD_ASSERT (h != NULL);
   3533 
   3534 	  if (h->plt.offset == (bfd_vma) -1 || htab->elf.splt == NULL)
   3535 	    {
   3536 	      /* We didn't make a PLT entry for this symbol.  This
   3537 		 happens when statically linking PIC code, or when
   3538 		 using -Bsymbolic.  */
   3539 	      break;
   3540 	    }
   3541 
   3542 	  relocation = (htab->elf.splt->output_section->vma
   3543 			+ htab->elf.splt->output_offset
   3544 			+ h->plt.offset);
   3545 	  unresolved_reloc = FALSE;
   3546 	  break;
   3547 
   3548         case R_TILEGX_64_PCREL:
   3549         case R_TILEGX_32_PCREL:
   3550         case R_TILEGX_16_PCREL:
   3551         case R_TILEGX_8_PCREL:
   3552 	case R_TILEGX_IMM16_X0_HW0_PCREL:
   3553 	case R_TILEGX_IMM16_X1_HW0_PCREL:
   3554 	case R_TILEGX_IMM16_X0_HW1_PCREL:
   3555 	case R_TILEGX_IMM16_X1_HW1_PCREL:
   3556 	case R_TILEGX_IMM16_X0_HW2_PCREL:
   3557 	case R_TILEGX_IMM16_X1_HW2_PCREL:
   3558 	case R_TILEGX_IMM16_X0_HW3_PCREL:
   3559 	case R_TILEGX_IMM16_X1_HW3_PCREL:
   3560 	case R_TILEGX_IMM16_X0_HW0_LAST_PCREL:
   3561 	case R_TILEGX_IMM16_X1_HW0_LAST_PCREL:
   3562 	case R_TILEGX_IMM16_X0_HW1_LAST_PCREL:
   3563 	case R_TILEGX_IMM16_X1_HW1_LAST_PCREL:
   3564 	case R_TILEGX_IMM16_X0_HW2_LAST_PCREL:
   3565 	case R_TILEGX_IMM16_X1_HW2_LAST_PCREL:
   3566 	  if (h != NULL
   3567 	      && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
   3568 	    break;
   3569 	  /* Fall through.  */
   3570         case R_TILEGX_64:
   3571         case R_TILEGX_32:
   3572         case R_TILEGX_16:
   3573         case R_TILEGX_8:
   3574 	case R_TILEGX_HW0:
   3575 	case R_TILEGX_HW1:
   3576 	case R_TILEGX_HW2:
   3577 	case R_TILEGX_HW3:
   3578 	case R_TILEGX_HW0_LAST:
   3579 	case R_TILEGX_HW1_LAST:
   3580 	case R_TILEGX_HW2_LAST:
   3581         case R_TILEGX_COPY:
   3582         case R_TILEGX_GLOB_DAT:
   3583         case R_TILEGX_JMP_SLOT:
   3584         case R_TILEGX_RELATIVE:
   3585         case R_TILEGX_BROFF_X1:
   3586         case R_TILEGX_JUMPOFF_X1:
   3587         case R_TILEGX_IMM8_X0:
   3588         case R_TILEGX_IMM8_Y0:
   3589         case R_TILEGX_IMM8_X1:
   3590         case R_TILEGX_IMM8_Y1:
   3591         case R_TILEGX_DEST_IMM8_X1:
   3592         case R_TILEGX_MT_IMM14_X1:
   3593         case R_TILEGX_MF_IMM14_X1:
   3594         case R_TILEGX_MMSTART_X0:
   3595         case R_TILEGX_MMEND_X0:
   3596         case R_TILEGX_SHAMT_X0:
   3597         case R_TILEGX_SHAMT_X1:
   3598         case R_TILEGX_SHAMT_Y0:
   3599         case R_TILEGX_SHAMT_Y1:
   3600 	case R_TILEGX_IMM16_X0_HW0:
   3601 	case R_TILEGX_IMM16_X1_HW0:
   3602 	case R_TILEGX_IMM16_X0_HW1:
   3603 	case R_TILEGX_IMM16_X1_HW1:
   3604 	case R_TILEGX_IMM16_X0_HW2:
   3605 	case R_TILEGX_IMM16_X1_HW2:
   3606 	case R_TILEGX_IMM16_X0_HW3:
   3607 	case R_TILEGX_IMM16_X1_HW3:
   3608 	case R_TILEGX_IMM16_X0_HW0_LAST:
   3609 	case R_TILEGX_IMM16_X1_HW0_LAST:
   3610 	case R_TILEGX_IMM16_X0_HW1_LAST:
   3611 	case R_TILEGX_IMM16_X1_HW1_LAST:
   3612 	case R_TILEGX_IMM16_X0_HW2_LAST:
   3613 	case R_TILEGX_IMM16_X1_HW2_LAST:
   3614 	  if ((input_section->flags & SEC_ALLOC) == 0)
   3615 	    break;
   3616 
   3617 	  if ((info->shared
   3618 	       && (h == NULL
   3619 		   || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   3620 		   || h->root.type != bfd_link_hash_undefweak)
   3621 	       && (! howto->pc_relative
   3622 		   || !SYMBOL_CALLS_LOCAL (info, h)))
   3623 	      || (!info->shared
   3624 		  && h != NULL
   3625 		  && h->dynindx != -1
   3626 		  && !h->non_got_ref
   3627 		  && ((h->def_dynamic
   3628 		       && !h->def_regular)
   3629 		      || h->root.type == bfd_link_hash_undefweak
   3630 		      || h->root.type == bfd_link_hash_undefined)))
   3631 	    {
   3632 	      Elf_Internal_Rela outrel;
   3633 	      bfd_boolean skip, relocate = FALSE;
   3634 
   3635 	      /* When generating a shared object, these relocations
   3636 		 are copied into the output file to be resolved at run
   3637 		 time.  */
   3638 
   3639 	      BFD_ASSERT (sreloc != NULL);
   3640 
   3641 	      skip = FALSE;
   3642 
   3643 	      outrel.r_offset =
   3644 		_bfd_elf_section_offset (output_bfd, info, input_section,
   3645 					 rel->r_offset);
   3646 	      if (outrel.r_offset == (bfd_vma) -1)
   3647 		skip = TRUE;
   3648 	      else if (outrel.r_offset == (bfd_vma) -2)
   3649 		skip = TRUE, relocate = TRUE;
   3650 	      outrel.r_offset += (input_section->output_section->vma
   3651 				  + input_section->output_offset);
   3652 
   3653 	      switch (r_type)
   3654 		{
   3655                 case R_TILEGX_64_PCREL:
   3656                 case R_TILEGX_32_PCREL:
   3657                 case R_TILEGX_16_PCREL:
   3658                 case R_TILEGX_8_PCREL:
   3659 		  /* If the symbol is not dynamic, we should not keep
   3660 		     a dynamic relocation.  But an .rela.* slot has been
   3661 		     allocated for it, output R_TILEGX_NONE.
   3662 		     FIXME: Add code tracking needed dynamic relocs as
   3663 		     e.g. i386 has.  */
   3664 		  if (h->dynindx == -1)
   3665 		    skip = TRUE, relocate = TRUE;
   3666 		  break;
   3667 		}
   3668 
   3669 	      if (skip)
   3670 		memset (&outrel, 0, sizeof outrel);
   3671 	      /* h->dynindx may be -1 if the symbol was marked to
   3672 		 become local.  */
   3673 	      else if (h != NULL &&
   3674 		       h->dynindx != -1
   3675 		       && (! is_plt
   3676 			   || !info->shared
   3677 			   || !SYMBOLIC_BIND (info, h)
   3678 			   || !h->def_regular))
   3679 		{
   3680 		  BFD_ASSERT (h->dynindx != -1);
   3681 		  outrel.r_info = TILEGX_ELF_R_INFO (htab, rel, h->dynindx, r_type);
   3682 		  outrel.r_addend = rel->r_addend;
   3683 		}
   3684 	      else
   3685 		{
   3686 		  if (r_type == R_TILEGX_32 || r_type == R_TILEGX_64)
   3687 		    {
   3688 		      outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, 0,
   3689 							 R_TILEGX_RELATIVE);
   3690 		      outrel.r_addend = relocation + rel->r_addend;
   3691 		    }
   3692 		  else
   3693 		    {
   3694 		      long indx;
   3695 
   3696 		      outrel.r_addend = relocation + rel->r_addend;
   3697 
   3698 		      if (is_plt)
   3699 			sec = htab->elf.splt;
   3700 
   3701 		      if (bfd_is_abs_section (sec))
   3702 			indx = 0;
   3703 		      else if (sec == NULL || sec->owner == NULL)
   3704 			{
   3705 			  bfd_set_error (bfd_error_bad_value);
   3706 			  return FALSE;
   3707 			}
   3708 		      else
   3709 			{
   3710 			  asection *osec;
   3711 
   3712 			  /* We are turning this relocation into one
   3713 			     against a section symbol.  It would be
   3714 			     proper to subtract the symbol's value,
   3715 			     osec->vma, from the emitted reloc addend,
   3716 			     but ld.so expects buggy relocs.  */
   3717 			  osec = sec->output_section;
   3718 			  indx = elf_section_data (osec)->dynindx;
   3719 
   3720 			  if (indx == 0)
   3721 			    {
   3722 			      osec = htab->elf.text_index_section;
   3723 			      indx = elf_section_data (osec)->dynindx;
   3724 			    }
   3725 
   3726 			  /* FIXME: we really should be able to link non-pic
   3727 			     shared libraries.  */
   3728 			  if (indx == 0)
   3729 			    {
   3730 			      BFD_FAIL ();
   3731 			      (*_bfd_error_handler)
   3732 				(_("%B: probably compiled without -fPIC?"),
   3733 				 input_bfd);
   3734 			      bfd_set_error (bfd_error_bad_value);
   3735 			      return FALSE;
   3736 			    }
   3737 			}
   3738 
   3739 		      outrel.r_info = TILEGX_ELF_R_INFO (htab, rel, indx,
   3740 							 r_type);
   3741 		    }
   3742 		}
   3743 
   3744 	      tilegx_elf_append_rela (output_bfd, sreloc, &outrel);
   3745 
   3746 	      /* This reloc will be computed at runtime, so there's no
   3747 		 need to do anything now.  */
   3748 	      if (! relocate)
   3749 		continue;
   3750 	    }
   3751 	  break;
   3752 
   3753         case R_TILEGX_IMM16_X0_HW0_TLS_LE:
   3754         case R_TILEGX_IMM16_X1_HW0_TLS_LE:
   3755         case R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE:
   3756         case R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE:
   3757         case R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE:
   3758         case R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE:
   3759 	  if (info->shared)
   3760 	    {
   3761 	      Elf_Internal_Rela outrel;
   3762 	      bfd_boolean skip;
   3763 
   3764 	      BFD_ASSERT (sreloc != NULL);
   3765 	      skip = FALSE;
   3766 	      outrel.r_offset =
   3767 		_bfd_elf_section_offset (output_bfd, info, input_section,
   3768 					 rel->r_offset);
   3769 	      if (outrel.r_offset == (bfd_vma) -1)
   3770 		skip = TRUE;
   3771 	      else if (outrel.r_offset == (bfd_vma) -2)
   3772 		skip = TRUE;
   3773 	      outrel.r_offset += (input_section->output_section->vma
   3774 				  + input_section->output_offset);
   3775 	      if (skip)
   3776 		memset (&outrel, 0, sizeof outrel);
   3777 	      else
   3778 		{
   3779 		  outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, 0, r_type);
   3780 		  outrel.r_addend = relocation - dtpoff_base (info)
   3781 				    + rel->r_addend;
   3782 		}
   3783 
   3784 	      tilegx_elf_append_rela (output_bfd, sreloc, &outrel);
   3785 	      continue;
   3786 	    }
   3787 	  relocation = tpoff (info, relocation);
   3788 	  break;
   3789 
   3790         case R_TILEGX_IMM16_X0_HW0_TLS_GD:
   3791         case R_TILEGX_IMM16_X1_HW0_TLS_GD:
   3792         case R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
   3793         case R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
   3794         case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
   3795         case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
   3796         case R_TILEGX_IMM16_X0_HW0_TLS_IE:
   3797         case R_TILEGX_IMM16_X1_HW0_TLS_IE:
   3798         case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
   3799         case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
   3800         case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
   3801         case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
   3802 	  r_type = tilegx_elf_tls_transition (info, r_type, h == NULL,
   3803 					      input_section->sec_flg0);
   3804           tls_type = GOT_UNKNOWN;
   3805 	  if (h == NULL && local_got_offsets)
   3806 	    tls_type =
   3807 	      _bfd_tilegx_elf_local_got_tls_type (input_bfd) [r_symndx];
   3808 	  else if (h != NULL)
   3809 	    {
   3810 	      tls_type = tilegx_elf_hash_entry(h)->tls_type;
   3811 	      if (!info->shared && h->dynindx == -1 && tls_type == GOT_TLS_IE)
   3812 		r_type = (!input_section->sec_flg0
   3813 			  ? tilegx_tls_translate_to_le (r_type)
   3814 			  : tilegx_tls_translate_to_ie (r_type));
   3815 	    }
   3816 
   3817 	  if (tls_type == GOT_TLS_IE)
   3818 	    r_type = tilegx_tls_translate_to_ie (r_type);
   3819 
   3820 	  if (r_type == R_TILEGX_IMM16_X0_HW0_TLS_LE
   3821 	      || r_type == R_TILEGX_IMM16_X1_HW0_TLS_LE
   3822 	      || r_type == R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE
   3823 	      || r_type == R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE
   3824 	      || r_type == R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE
   3825 	      || r_type == R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE)
   3826 	    {
   3827 	      relocation = tpoff (info, relocation);
   3828 	      break;
   3829 	    }
   3830 
   3831 	  if (h != NULL)
   3832 	    {
   3833 	      off = h->got.offset;
   3834 	      h->got.offset |= 1;
   3835 	    }
   3836 	  else
   3837 	    {
   3838 	      BFD_ASSERT (local_got_offsets != NULL);
   3839 	      off = local_got_offsets[r_symndx];
   3840 	      local_got_offsets[r_symndx] |= 1;
   3841 	    }
   3842 
   3843 	  if (htab->elf.sgot == NULL)
   3844 	    abort ();
   3845 
   3846 	  if ((off & 1) != 0)
   3847 	    off &= ~1;
   3848 	  else
   3849 	    {
   3850 	      Elf_Internal_Rela outrel;
   3851 	      int indx = 0;
   3852 	      bfd_boolean need_relocs = FALSE;
   3853 
   3854 	      if (htab->elf.srelgot == NULL)
   3855 		abort ();
   3856 
   3857 	      if (h != NULL)
   3858 	      {
   3859 	        bfd_boolean dyn;
   3860 	        dyn = htab->elf.dynamic_sections_created;
   3861 
   3862 		if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
   3863 		    && (!info->shared
   3864 			|| !SYMBOL_REFERENCES_LOCAL (info, h)))
   3865 		  {
   3866 		    indx = h->dynindx;
   3867 		  }
   3868 	      }
   3869 
   3870 	      /* The GOT entries have not been initialized yet.  Do it
   3871 	         now, and emit any relocations. */
   3872 	      if ((info->shared || indx != 0)
   3873 		  && (h == NULL
   3874 		      || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   3875 		      || h->root.type != bfd_link_hash_undefweak))
   3876 		    need_relocs = TRUE;
   3877 
   3878               switch (r_type)
   3879                 {
   3880 		  case R_TILEGX_IMM16_X0_HW0_TLS_IE:
   3881 		  case R_TILEGX_IMM16_X1_HW0_TLS_IE:
   3882 		  case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
   3883 		  case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
   3884 		  case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
   3885 		  case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
   3886 		    if (need_relocs) {
   3887 		      TILEGX_ELF_PUT_WORD (htab, output_bfd, 0,
   3888 					   htab->elf.sgot->contents + off);
   3889 	              outrel.r_offset = (htab->elf.sgot->output_section->vma
   3890 				       + htab->elf.sgot->output_offset + off);
   3891 	              outrel.r_addend = 0;
   3892 		      if (indx == 0)
   3893 		        outrel.r_addend = relocation - dtpoff_base (info);
   3894 		      outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, indx,
   3895 							 TILEGX_ELF_TPOFF_RELOC (htab));
   3896 		      tilegx_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
   3897                     } else {
   3898 		      TILEGX_ELF_PUT_WORD (htab, output_bfd,
   3899 					   tpoff (info, relocation),
   3900 					   htab->elf.sgot->contents + off);
   3901                     }
   3902                     break;
   3903 
   3904 		  case R_TILEGX_IMM16_X0_HW0_TLS_GD:
   3905 		  case R_TILEGX_IMM16_X1_HW0_TLS_GD:
   3906 		  case R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
   3907 		  case R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
   3908 		  case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
   3909 		  case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
   3910 		    if (need_relocs) {
   3911  	              outrel.r_offset = (htab->elf.sgot->output_section->vma
   3912 				       + htab->elf.sgot->output_offset + off);
   3913 	              outrel.r_addend = 0;
   3914 	              outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, indx,
   3915 							 TILEGX_ELF_DTPMOD_RELOC (htab));
   3916 		      TILEGX_ELF_PUT_WORD (htab, output_bfd, 0,
   3917 					   htab->elf.sgot->contents + off);
   3918 	              tilegx_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
   3919 		      if (indx == 0)
   3920 		        {
   3921 		      	  BFD_ASSERT (! unresolved_reloc);
   3922 			  TILEGX_ELF_PUT_WORD (htab, output_bfd,
   3923 					       relocation - dtpoff_base (info),
   3924 					       (htab->elf.sgot->contents + off +
   3925 						TILEGX_ELF_WORD_BYTES (htab)));
   3926 		        }
   3927 		      else
   3928 		        {
   3929 			  TILEGX_ELF_PUT_WORD (htab, output_bfd, 0,
   3930 					       (htab->elf.sgot->contents + off +
   3931 						TILEGX_ELF_WORD_BYTES (htab)));
   3932 		          outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, indx,
   3933 							     TILEGX_ELF_DTPOFF_RELOC (htab));
   3934 		          outrel.r_offset += TILEGX_ELF_WORD_BYTES (htab);
   3935 		          tilegx_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
   3936 		        }
   3937                     }
   3938 
   3939 		    else {
   3940 		      /* If we are not emitting relocations for a
   3941 		         general dynamic reference, then we must be in a
   3942 		         static link or an executable link with the
   3943 		         symbol binding locally.  Mark it as belonging
   3944 		         to module 1, the executable.  */
   3945 		      TILEGX_ELF_PUT_WORD (htab, output_bfd, 1,
   3946 					   htab->elf.sgot->contents + off );
   3947 		      TILEGX_ELF_PUT_WORD (htab, output_bfd,
   3948 					   relocation - dtpoff_base (info),
   3949 					   htab->elf.sgot->contents + off +
   3950 					   TILEGX_ELF_WORD_BYTES (htab));
   3951 		   }
   3952                    break;
   3953                 }
   3954 	    }
   3955 
   3956 	  if (off >= (bfd_vma) -2)
   3957 	    abort ();
   3958 
   3959 	  relocation = off - got_base;
   3960 	  unresolved_reloc = FALSE;
   3961 	  howto = tilegx_elf_howto_table + r_type;
   3962 	  break;
   3963 
   3964 	default:
   3965 	  break;
   3966 	}
   3967 
   3968       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
   3969 	 because such sections are not SEC_ALLOC and thus ld.so will
   3970 	 not process them.  */
   3971       if (unresolved_reloc
   3972 	  && !((input_section->flags & SEC_DEBUGGING) != 0
   3973 	       && h->def_dynamic)
   3974 	  && _bfd_elf_section_offset (output_bfd, info, input_section,
   3975 				      rel->r_offset) != (bfd_vma) -1)
   3976 	(*_bfd_error_handler)
   3977 	  (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
   3978 	   input_bfd,
   3979 	   input_section,
   3980 	   (long) rel->r_offset,
   3981 	   howto->name,
   3982 	   h->root.root.string);
   3983 
   3984       r = bfd_reloc_continue;
   3985 
   3986       /* Get the operand creation function, if any. */
   3987       create_func = reloc_to_create_func[r_type];
   3988       if (create_func == NULL)
   3989       {
   3990         r = _bfd_final_link_relocate (howto, input_bfd, input_section,
   3991                                       contents, rel->r_offset,
   3992                                       relocation, rel->r_addend);
   3993       }
   3994       else
   3995       {
   3996         if (howto->pc_relative)
   3997         {
   3998           relocation -=
   3999             input_section->output_section->vma + input_section->output_offset;
   4000           if (howto->pcrel_offset)
   4001             relocation -= rel->r_offset;
   4002         }
   4003 
   4004         bfd_byte *data;
   4005 
   4006         /* Add the relocation addend if any to the final target value */
   4007         relocation += rel->r_addend;
   4008 
   4009         /* Do basic range checking */
   4010         r = bfd_check_overflow (howto->complain_on_overflow,
   4011                                 howto->bitsize,
   4012                                 howto->rightshift,
   4013                                 TILEGX_ELF_WORD_BYTES (htab) * 8,
   4014                                 relocation);
   4015 
   4016         /*
   4017          * Write the relocated value out into the raw section data.
   4018          * Don't put a relocation out in the .rela section.
   4019          */
   4020         tilegx_bundle_bits mask = create_func(-1);
   4021         tilegx_bundle_bits value = create_func(relocation >> howto->rightshift);
   4022 
   4023         /* Only touch bytes while the mask is not 0, so we
   4024            don't write to out of bounds memory if this is actually
   4025            a 16-bit switch instruction. */
   4026         for (data = contents + rel->r_offset; mask != 0; data++)
   4027           {
   4028             bfd_byte byte_mask = (bfd_byte)mask;
   4029             *data = (*data & ~byte_mask) | ((bfd_byte)value & byte_mask);
   4030             mask >>= 8;
   4031             value >>= 8;
   4032           }
   4033       }
   4034 
   4035       if (r != bfd_reloc_ok)
   4036 	{
   4037 	  const char *msg = NULL;
   4038 
   4039 	  switch (r)
   4040 	    {
   4041 	    case bfd_reloc_overflow:
   4042 	      r = info->callbacks->reloc_overflow
   4043 		(info, (h ? &h->root : NULL), name, howto->name,
   4044 		 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
   4045 	      break;
   4046 
   4047 	    case bfd_reloc_undefined:
   4048 	      r = info->callbacks->undefined_symbol
   4049 		(info, name, input_bfd, input_section, rel->r_offset,
   4050 		 TRUE);
   4051 	      break;
   4052 
   4053 	    case bfd_reloc_outofrange:
   4054 	      msg = _("internal error: out of range error");
   4055 	      break;
   4056 
   4057 	    case bfd_reloc_notsupported:
   4058 	      msg = _("internal error: unsupported relocation error");
   4059 	      break;
   4060 
   4061 	    case bfd_reloc_dangerous:
   4062 	      msg = _("internal error: dangerous relocation");
   4063 	      break;
   4064 
   4065 	    default:
   4066 	      msg = _("internal error: unknown error");
   4067 	      break;
   4068 	    }
   4069 
   4070 	  if (msg)
   4071 	    r = info->callbacks->warning
   4072 	      (info, msg, name, input_bfd, input_section, rel->r_offset);
   4073 
   4074 	  if (! r)
   4075 	    return FALSE;
   4076 	}
   4077     }
   4078 
   4079   return TRUE;
   4080 }
   4081 
   4082 /* Finish up dynamic symbol handling.  We set the contents of various
   4083    dynamic sections here.  */
   4084 
   4085 bfd_boolean
   4086 tilegx_elf_finish_dynamic_symbol (bfd *output_bfd,
   4087 				  struct bfd_link_info *info,
   4088 				  struct elf_link_hash_entry *h,
   4089 				  Elf_Internal_Sym *sym)
   4090 {
   4091   struct tilegx_elf_link_hash_table *htab;
   4092 
   4093   htab = tilegx_elf_hash_table (info);
   4094   BFD_ASSERT (htab != NULL);
   4095 
   4096   if (h->plt.offset != (bfd_vma) -1)
   4097     {
   4098       asection *splt;
   4099       asection *srela;
   4100       asection *sgotplt;
   4101       Elf_Internal_Rela rela;
   4102       bfd_byte *loc;
   4103       bfd_vma r_offset;
   4104       const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
   4105 
   4106 
   4107       int rela_index;
   4108 
   4109       /* This symbol has an entry in the PLT.  Set it up.  */
   4110 
   4111       BFD_ASSERT (h->dynindx != -1);
   4112 
   4113       splt = htab->elf.splt;
   4114       srela = htab->elf.srelplt;
   4115       sgotplt = htab->elf.sgotplt;
   4116 
   4117       if (splt == NULL || srela == NULL)
   4118        abort ();
   4119 
   4120       /* Fill in the entry in the procedure linkage table.  */
   4121       rela_index = tilegx_plt_entry_build (output_bfd, htab, splt, sgotplt,
   4122 					   h->plt.offset, &r_offset);
   4123 
   4124       /* Fill in the entry in the global offset table, which initially points
   4125 	 to the beginning of the plt.  */
   4126       TILEGX_ELF_PUT_WORD (htab, output_bfd,
   4127 			   splt->output_section->vma + splt->output_offset,
   4128 			   sgotplt->contents + r_offset);
   4129 
   4130       /* Fill in the entry in the .rela.plt section.  */
   4131       rela.r_offset = (sgotplt->output_section->vma
   4132 		       + sgotplt->output_offset
   4133 		       + r_offset);
   4134       rela.r_addend = 0;
   4135       rela.r_info = TILEGX_ELF_R_INFO (htab, NULL, h->dynindx, R_TILEGX_JMP_SLOT);
   4136 
   4137       loc = srela->contents + rela_index * TILEGX_ELF_RELA_BYTES (htab);
   4138       bed->s->swap_reloca_out (output_bfd, &rela, loc);
   4139 
   4140       if (!h->def_regular)
   4141 	{
   4142 	  /* Mark the symbol as undefined, rather than as defined in
   4143 	     the .plt section.  Leave the value alone.  */
   4144 	  sym->st_shndx = SHN_UNDEF;
   4145 	  /* If the symbol is weak, we do need to clear the value.
   4146 	     Otherwise, the PLT entry would provide a definition for
   4147 	     the symbol even if the symbol wasn't defined anywhere,
   4148 	     and so the symbol would never be NULL.  */
   4149 	  if (!h->ref_regular_nonweak)
   4150 	    sym->st_value = 0;
   4151 	}
   4152     }
   4153 
   4154   if (h->got.offset != (bfd_vma) -1
   4155       && tilegx_elf_hash_entry(h)->tls_type != GOT_TLS_GD
   4156       && tilegx_elf_hash_entry(h)->tls_type != GOT_TLS_IE)
   4157     {
   4158       asection *sgot;
   4159       asection *srela;
   4160       Elf_Internal_Rela rela;
   4161 
   4162       /* This symbol has an entry in the GOT.  Set it up.  */
   4163 
   4164       sgot = htab->elf.sgot;
   4165       srela = htab->elf.srelgot;
   4166       BFD_ASSERT (sgot != NULL && srela != NULL);
   4167 
   4168       rela.r_offset = (sgot->output_section->vma
   4169 		       + sgot->output_offset
   4170 		       + (h->got.offset &~ (bfd_vma) 1));
   4171 
   4172       /* If this is a -Bsymbolic link, and the symbol is defined
   4173 	 locally, we just want to emit a RELATIVE reloc.  Likewise if
   4174 	 the symbol was forced to be local because of a version file.
   4175 	 The entry in the global offset table will already have been
   4176 	 initialized in the relocate_section function.  */
   4177       if (info->shared
   4178 	  && (info->symbolic || h->dynindx == -1)
   4179 	  && h->def_regular)
   4180 	{
   4181 	  asection *sec = h->root.u.def.section;
   4182 	  rela.r_info = TILEGX_ELF_R_INFO (htab, NULL, 0, R_TILEGX_RELATIVE);
   4183 	  rela.r_addend = (h->root.u.def.value
   4184 			   + sec->output_section->vma
   4185 			   + sec->output_offset);
   4186 	}
   4187       else
   4188 	{
   4189 	  rela.r_info = TILEGX_ELF_R_INFO (htab, NULL, h->dynindx, R_TILEGX_GLOB_DAT);
   4190 	  rela.r_addend = 0;
   4191 	}
   4192 
   4193       TILEGX_ELF_PUT_WORD (htab, output_bfd, 0,
   4194 			   sgot->contents + (h->got.offset & ~(bfd_vma) 1));
   4195       tilegx_elf_append_rela (output_bfd, srela, &rela);
   4196     }
   4197 
   4198   if (h->needs_copy)
   4199     {
   4200       asection *s;
   4201       Elf_Internal_Rela rela;
   4202 
   4203       /* This symbols needs a copy reloc.  Set it up.  */
   4204       BFD_ASSERT (h->dynindx != -1);
   4205 
   4206       s = htab->srelbss;
   4207       BFD_ASSERT (s != NULL);
   4208 
   4209       rela.r_offset = (h->root.u.def.value
   4210 		       + h->root.u.def.section->output_section->vma
   4211 		       + h->root.u.def.section->output_offset);
   4212       rela.r_info = TILEGX_ELF_R_INFO (htab, NULL, h->dynindx, R_TILEGX_COPY);
   4213       rela.r_addend = 0;
   4214       tilegx_elf_append_rela (output_bfd, s, &rela);
   4215     }
   4216 
   4217   /* Mark some specially defined symbols as absolute. */
   4218   if (h == htab->elf.hdynamic
   4219       || (h == htab->elf.hgot || h == htab->elf.hplt))
   4220     sym->st_shndx = SHN_ABS;
   4221 
   4222   return TRUE;
   4223 }
   4224 
   4225 /* Finish up the dynamic sections.  */
   4226 
   4227 static bfd_boolean
   4228 tilegx_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
   4229 		   bfd *dynobj, asection *sdyn,
   4230 		   asection *splt ATTRIBUTE_UNUSED)
   4231 {
   4232   struct tilegx_elf_link_hash_table *htab;
   4233   const struct elf_backend_data *bed;
   4234   bfd_byte *dyncon, *dynconend;
   4235   size_t dynsize;
   4236 
   4237   htab = tilegx_elf_hash_table (info);
   4238   BFD_ASSERT (htab != NULL);
   4239   bed = get_elf_backend_data (output_bfd);
   4240   dynsize = bed->s->sizeof_dyn;
   4241   dynconend = sdyn->contents + sdyn->size;
   4242 
   4243   for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
   4244     {
   4245       Elf_Internal_Dyn dyn;
   4246       asection *s;
   4247 
   4248       bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
   4249 
   4250       switch (dyn.d_tag)
   4251 	{
   4252 	case DT_PLTGOT:
   4253 	  s = htab->elf.sgotplt;
   4254 	  dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
   4255 	  break;
   4256 	case DT_JMPREL:
   4257 	  s = htab->elf.srelplt;
   4258 	  dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
   4259 	  break;
   4260 	case DT_PLTRELSZ:
   4261 	  s = htab->elf.srelplt;
   4262 	  dyn.d_un.d_val = s->size;
   4263 	  break;
   4264 	default:
   4265 	  continue;
   4266 	}
   4267 
   4268       bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
   4269     }
   4270   return TRUE;
   4271 }
   4272 
   4273 bfd_boolean
   4274 tilegx_elf_finish_dynamic_sections (bfd *output_bfd,
   4275 				    struct bfd_link_info *info)
   4276 {
   4277   bfd *dynobj;
   4278   asection *sdyn;
   4279   struct tilegx_elf_link_hash_table *htab;
   4280   size_t pad_size;
   4281 
   4282   htab = tilegx_elf_hash_table (info);
   4283   BFD_ASSERT (htab != NULL);
   4284   dynobj = htab->elf.dynobj;
   4285 
   4286   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
   4287 
   4288   if (elf_hash_table (info)->dynamic_sections_created)
   4289     {
   4290       asection *splt;
   4291       bfd_boolean ret;
   4292 
   4293       splt = htab->elf.splt;
   4294       BFD_ASSERT (splt != NULL && sdyn != NULL);
   4295 
   4296       ret = tilegx_finish_dyn (output_bfd, info, dynobj, sdyn, splt);
   4297 
   4298       if (ret != TRUE)
   4299 	return ret;
   4300 
   4301       /* Fill in the head and tail entries in the procedure linkage table.  */
   4302       if (splt->size > 0)
   4303 	{
   4304 	  memcpy (splt->contents,
   4305 		  ABI_64_P (output_bfd) ?
   4306 		    tilegx64_plt0_entry : tilegx32_plt0_entry,
   4307 		  PLT_HEADER_SIZE);
   4308 
   4309 	  memcpy (splt->contents + splt->size
   4310 		  - PLT_ENTRY_SIZE + PLT_HEADER_SIZE,
   4311 		  ABI_64_P (output_bfd) ?
   4312 		    tilegx64_plt_tail_entry : tilegx32_plt_tail_entry,
   4313 		  PLT_TAIL_SIZE);
   4314 	  /* Add padding so that the plt section is a multiple of its
   4315 	     entry size.  */
   4316 	  pad_size = PLT_ENTRY_SIZE - PLT_HEADER_SIZE - PLT_TAIL_SIZE;
   4317 	  memset (splt->contents + splt->size - pad_size, 0, pad_size);
   4318 	}
   4319 
   4320       elf_section_data (splt->output_section)->this_hdr.sh_entsize
   4321 	= PLT_ENTRY_SIZE;
   4322     }
   4323 
   4324   if (htab->elf.sgotplt)
   4325     {
   4326       if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
   4327 	{
   4328 	  (*_bfd_error_handler)
   4329 	    (_("discarded output section: `%A'"), htab->elf.sgotplt);
   4330 	  return FALSE;
   4331 	}
   4332 
   4333       if (htab->elf.sgotplt->size > 0)
   4334 	{
   4335 	  /* Write the first two entries in .got.plt, needed for the dynamic
   4336 	     linker.  */
   4337 	  TILEGX_ELF_PUT_WORD (htab, output_bfd, (bfd_vma) -1,
   4338 			       htab->elf.sgotplt->contents);
   4339 	  TILEGX_ELF_PUT_WORD (htab, output_bfd, (bfd_vma) 0,
   4340 			       htab->elf.sgotplt->contents
   4341 			       + GOT_ENTRY_SIZE (htab));
   4342 	}
   4343 
   4344       elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize =
   4345 	GOT_ENTRY_SIZE (htab);
   4346     }
   4347 
   4348   if (htab->elf.sgot)
   4349     {
   4350       if (htab->elf.sgot->size > 0)
   4351 	{
   4352 	  /* Set the first entry in the global offset table to the address of
   4353 	     the dynamic section.  */
   4354 	  bfd_vma val = (sdyn ?
   4355 			 sdyn->output_section->vma + sdyn->output_offset :
   4356 			 0);
   4357 	  TILEGX_ELF_PUT_WORD (htab, output_bfd, val,
   4358 			       htab->elf.sgot->contents);
   4359 	}
   4360 
   4361       elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize =
   4362 	GOT_ENTRY_SIZE (htab);
   4363     }
   4364 
   4365   return TRUE;
   4366 }
   4367 
   4368 
   4369 
   4371 /* Return address for Ith PLT stub in section PLT, for relocation REL
   4372    or (bfd_vma) -1 if it should not be included.  */
   4373 
   4374 bfd_vma
   4375 tilegx_elf_plt_sym_val (bfd_vma i, const asection *plt,
   4376 			const arelent *rel ATTRIBUTE_UNUSED)
   4377 {
   4378   return plt->vma + PLT_HEADER_SIZE + i * PLT_ENTRY_SIZE;
   4379 }
   4380 
   4381 enum elf_reloc_type_class
   4382 tilegx_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
   4383 			 const asection *rel_sec ATTRIBUTE_UNUSED,
   4384 			 const Elf_Internal_Rela *rela)
   4385 {
   4386   switch ((int) TILEGX_ELF_R_TYPE (rela->r_info))
   4387     {
   4388     case R_TILEGX_RELATIVE:
   4389       return reloc_class_relative;
   4390     case R_TILEGX_JMP_SLOT:
   4391       return reloc_class_plt;
   4392     case R_TILEGX_COPY:
   4393       return reloc_class_copy;
   4394     default:
   4395       return reloc_class_normal;
   4396     }
   4397 }
   4398 
   4399 int
   4400 tilegx_additional_program_headers (bfd *abfd,
   4401 				   struct bfd_link_info *info ATTRIBUTE_UNUSED)
   4402 {
   4403   /* Each .intrpt section specified by the user adds another PT_LOAD
   4404      header since the sections are discontiguous. */
   4405   static const char intrpt_sections[4][9] =
   4406     {
   4407       ".intrpt0", ".intrpt1", ".intrpt2", ".intrpt3"
   4408     };
   4409   int count = 0;
   4410   int i;
   4411 
   4412   for (i = 0; i < 4; i++)
   4413     {
   4414       asection *sec = bfd_get_section_by_name (abfd, intrpt_sections[i]);
   4415       if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
   4416 	++count;
   4417     }
   4418 
   4419   /* Add four "padding" headers in to leave room in case a custom linker
   4420      script does something fancy. Otherwise ld complains that it ran
   4421      out of program headers and refuses to link. */
   4422   count += 4;
   4423 
   4424   return count;
   4425 }
   4426 
   4427 
   4428 bfd_boolean
   4429 _bfd_tilegx_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
   4430 {
   4431   const char *targ1 = bfd_get_target (ibfd);
   4432   const char *targ2 = bfd_get_target (obfd);
   4433 
   4434   if (strcmp (targ1, targ2) != 0)
   4435     {
   4436       (*_bfd_error_handler)
   4437 	(_("%B: Cannot link together %s and %s objects."),
   4438 	 ibfd, targ1, targ2);
   4439       bfd_set_error (bfd_error_bad_value);
   4440       return FALSE;
   4441     }
   4442 
   4443   return TRUE;
   4444 }
   4445