Home | History | Annotate | Download | only in bfd
      1 /* TILE-Gx-specific support for ELF.
      2    Copyright (C) 2011-2016 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 	 3,			/* size (0 = byte, 1 = short, 2 = long) */
     76 	 0,			/* bitsize */
     77 	 FALSE,			/* pc_relative */
     78 	 0,			/* bitpos */
     79 	 complain_overflow_dont, /* 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 (!bfd_link_pic (info))
   1518     htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
   1519 
   1520   if (!htab->elf.splt || !htab->elf.srelplt || !htab->sdynbss
   1521       || (!bfd_link_pic (info) && !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 (bfd_link_pic (info))
   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 (bfd_link_relocatable (info))
   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 (bfd_link_pic (info))
   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 (bfd_link_pic (info));
   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 (bfd_link_pic (info))
   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 (bfd_link_pic (info))
   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 && !bfd_link_pic (info))
   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 ((bfd_link_pic (info)
   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 	      || (!bfd_link_pic (info)
   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 !bfd_link_executable (info).  */
   2125   if (bfd_link_pic (info))
   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 (bfd_link_relocatable (info))
   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 (bfd_link_pic (info))
   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 (bfd_link_pic (info))
   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 (info, 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, bfd_link_pic (info), 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 (! bfd_link_pic (info)
   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       && !bfd_link_pic (info)
   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,
   2574 						bfd_link_pic (info),
   2575 						h))
   2576 	htab->elf.srelgot->size += TILEGX_ELF_RELA_BYTES (htab);
   2577     }
   2578   else
   2579     h->got.offset = (bfd_vma) -1;
   2580 
   2581   eh = (struct tilegx_elf_link_hash_entry *) h;
   2582   if (eh->dyn_relocs == NULL)
   2583     return TRUE;
   2584 
   2585   /* In the shared -Bsymbolic case, discard space allocated for
   2586      dynamic pc-relative relocs against symbols which turn out to be
   2587      defined in regular objects.  For the normal shared case, discard
   2588      space for pc-relative relocs that have become local due to symbol
   2589      visibility changes.  */
   2590 
   2591   if (bfd_link_pic (info))
   2592     {
   2593       if (SYMBOL_CALLS_LOCAL (info, h))
   2594 	{
   2595 	  struct tilegx_elf_dyn_relocs **pp;
   2596 
   2597 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
   2598 	    {
   2599 	      p->count -= p->pc_count;
   2600 	      p->pc_count = 0;
   2601 	      if (p->count == 0)
   2602 		*pp = p->next;
   2603 	      else
   2604 		pp = &p->next;
   2605 	    }
   2606 	}
   2607 
   2608       /* Also discard relocs on undefined weak syms with non-default
   2609 	 visibility.  */
   2610       if (eh->dyn_relocs != NULL
   2611 	  && h->root.type == bfd_link_hash_undefweak)
   2612 	{
   2613 	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
   2614 	    eh->dyn_relocs = NULL;
   2615 
   2616 	  /* Make sure undefined weak symbols are output as a dynamic
   2617 	     symbol in PIEs.  */
   2618 	  else if (h->dynindx == -1
   2619 		   && !h->forced_local)
   2620 	    {
   2621 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2622 		return FALSE;
   2623 	    }
   2624 	}
   2625     }
   2626   else
   2627     {
   2628       /* For the non-shared case, discard space for relocs against
   2629 	 symbols which turn out to need copy relocs or are not
   2630 	 dynamic.  */
   2631 
   2632       if (!h->non_got_ref
   2633 	  && ((h->def_dynamic
   2634 	       && !h->def_regular)
   2635 	      || (htab->elf.dynamic_sections_created
   2636 		  && (h->root.type == bfd_link_hash_undefweak
   2637 		      || h->root.type == bfd_link_hash_undefined))))
   2638 	{
   2639 	  /* Make sure this symbol is output as a dynamic symbol.
   2640 	     Undefined weak syms won't yet be marked as dynamic.  */
   2641 	  if (h->dynindx == -1
   2642 	      && !h->forced_local)
   2643 	    {
   2644 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
   2645 		return FALSE;
   2646 	    }
   2647 
   2648 	  /* If that succeeded, we know we'll be keeping all the
   2649 	     relocs.  */
   2650 	  if (h->dynindx != -1)
   2651 	    goto keep;
   2652 	}
   2653 
   2654       eh->dyn_relocs = NULL;
   2655 
   2656     keep: ;
   2657     }
   2658 
   2659   /* Finally, allocate space.  */
   2660   for (p = eh->dyn_relocs; p != NULL; p = p->next)
   2661     {
   2662       asection *sreloc = elf_section_data (p->sec)->sreloc;
   2663       sreloc->size += p->count * TILEGX_ELF_RELA_BYTES (htab);
   2664     }
   2665 
   2666   return TRUE;
   2667 }
   2668 
   2669 /* Find any dynamic relocs that apply to read-only sections.  */
   2670 
   2671 static bfd_boolean
   2672 readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
   2673 {
   2674   struct tilegx_elf_link_hash_entry *eh;
   2675   struct tilegx_elf_dyn_relocs *p;
   2676 
   2677   eh = (struct tilegx_elf_link_hash_entry *) h;
   2678   for (p = eh->dyn_relocs; p != NULL; p = p->next)
   2679     {
   2680       asection *s = p->sec->output_section;
   2681 
   2682       if (s != NULL && (s->flags & SEC_READONLY) != 0)
   2683 	{
   2684 	  struct bfd_link_info *info = (struct bfd_link_info *) inf;
   2685 
   2686 	  info->flags |= DF_TEXTREL;
   2687 
   2688 	  /* Not an error, just cut short the traversal.  */
   2689 	  return FALSE;
   2690 	}
   2691     }
   2692   return TRUE;
   2693 }
   2694 
   2695 /* Return true if the dynamic symbol for a given section should be
   2696    omitted when creating a shared library.  */
   2697 
   2698 bfd_boolean
   2699 tilegx_elf_omit_section_dynsym (bfd *output_bfd,
   2700 				struct bfd_link_info *info,
   2701 				asection *p)
   2702 {
   2703   /* We keep the .got section symbol so that explicit relocations
   2704      against the _GLOBAL_OFFSET_TABLE_ symbol emitted in PIC mode
   2705      can be turned into relocations against the .got symbol.  */
   2706   if (strcmp (p->name, ".got") == 0)
   2707     return FALSE;
   2708 
   2709   return _bfd_elf_link_omit_section_dynsym (output_bfd, info, p);
   2710 }
   2711 
   2712 bfd_boolean
   2713 tilegx_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   2714 				  struct bfd_link_info *info)
   2715 {
   2716   struct tilegx_elf_link_hash_table *htab;
   2717   bfd *dynobj;
   2718   asection *s;
   2719   bfd *ibfd;
   2720 
   2721   htab = tilegx_elf_hash_table (info);
   2722   BFD_ASSERT (htab != NULL);
   2723   dynobj = htab->elf.dynobj;
   2724   BFD_ASSERT (dynobj != NULL);
   2725 
   2726   if (elf_hash_table (info)->dynamic_sections_created)
   2727     {
   2728       /* Set the contents of the .interp section to the interpreter.  */
   2729       if (bfd_link_executable (info) && !info->nointerp)
   2730 	{
   2731 	  s = bfd_get_linker_section (dynobj, ".interp");
   2732 	  BFD_ASSERT (s != NULL);
   2733 	  s->size = strlen (htab->dynamic_interpreter) + 1;
   2734 	  s->contents = (unsigned char *) htab->dynamic_interpreter;
   2735 	}
   2736     }
   2737 
   2738   /* Set up .got offsets for local syms, and space for local dynamic
   2739      relocs.  */
   2740   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
   2741     {
   2742       bfd_signed_vma *local_got;
   2743       bfd_signed_vma *end_local_got;
   2744       char *local_tls_type;
   2745       bfd_size_type locsymcount;
   2746       Elf_Internal_Shdr *symtab_hdr;
   2747       asection *srel;
   2748 
   2749       if (! is_tilegx_elf (ibfd))
   2750 	continue;
   2751 
   2752       for (s = ibfd->sections; s != NULL; s = s->next)
   2753 	{
   2754 	  struct tilegx_elf_dyn_relocs *p;
   2755 
   2756 	  for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
   2757 	    {
   2758 	      if (!bfd_is_abs_section (p->sec)
   2759 		  && bfd_is_abs_section (p->sec->output_section))
   2760 		{
   2761 		  /* Input section has been discarded, either because
   2762 		     it is a copy of a linkonce section or due to
   2763 		     linker script /DISCARD/, so we'll be discarding
   2764 		     the relocs too.  */
   2765 		}
   2766 	      else if (p->count != 0)
   2767 		{
   2768 		  srel = elf_section_data (p->sec)->sreloc;
   2769 		  srel->size += p->count * TILEGX_ELF_RELA_BYTES (htab);
   2770 		  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
   2771 		    info->flags |= DF_TEXTREL;
   2772 		}
   2773 	    }
   2774 	}
   2775 
   2776       local_got = elf_local_got_refcounts (ibfd);
   2777       if (!local_got)
   2778 	continue;
   2779 
   2780       symtab_hdr = &elf_symtab_hdr (ibfd);
   2781       locsymcount = symtab_hdr->sh_info;
   2782       end_local_got = local_got + locsymcount;
   2783       local_tls_type = _bfd_tilegx_elf_local_got_tls_type (ibfd);
   2784       s = htab->elf.sgot;
   2785       srel = htab->elf.srelgot;
   2786       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
   2787 	{
   2788 	  if (*local_got > 0)
   2789 	    {
   2790 	      *local_got = s->size;
   2791 	      s->size += TILEGX_ELF_WORD_BYTES (htab);
   2792               if (*local_tls_type == GOT_TLS_GD)
   2793                 s->size += TILEGX_ELF_WORD_BYTES (htab);
   2794               if (bfd_link_pic (info)
   2795                   || *local_tls_type == GOT_TLS_GD
   2796                   || *local_tls_type == GOT_TLS_IE)
   2797 		srel->size += TILEGX_ELF_RELA_BYTES (htab);
   2798 	    }
   2799 	  else
   2800 	    *local_got = (bfd_vma) -1;
   2801 	}
   2802     }
   2803 
   2804   /* Allocate global sym .plt and .got entries, and space for global
   2805      sym dynamic relocs.  */
   2806   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
   2807 
   2808   if (elf_hash_table (info)->dynamic_sections_created)
   2809     {
   2810       /* If the .got section is more than 0x8000 bytes, we add
   2811 	 0x8000 to the value of _GLOBAL_OFFSET_TABLE_, so that 16
   2812 	 bit relocations have a greater chance of working. */
   2813       if (htab->elf.sgot->size >= 0x8000
   2814 	  && elf_hash_table (info)->hgot->root.u.def.value == 0)
   2815 	elf_hash_table (info)->hgot->root.u.def.value = 0x8000;
   2816     }
   2817 
   2818   if (htab->elf.sgotplt)
   2819     {
   2820       struct elf_link_hash_entry *got;
   2821       got = elf_link_hash_lookup (elf_hash_table (info),
   2822 				  "_GLOBAL_OFFSET_TABLE_",
   2823 				  FALSE, FALSE, FALSE);
   2824 
   2825       /* Don't allocate .got.plt section if there are no GOT nor PLT
   2826          entries and there is no refeence to _GLOBAL_OFFSET_TABLE_.  */
   2827       if ((got == NULL
   2828 	   || !got->ref_regular_nonweak)
   2829 	  && (htab->elf.sgotplt->size
   2830 	      == (unsigned)GOTPLT_HEADER_SIZE (htab))
   2831 	  && (htab->elf.splt == NULL
   2832 	      || htab->elf.splt->size == 0)
   2833 	  && (htab->elf.sgot == NULL
   2834 	      || (htab->elf.sgot->size
   2835 		  == get_elf_backend_data (output_bfd)->got_header_size)))
   2836 	htab->elf.sgotplt->size = 0;
   2837     }
   2838 
   2839   /* The check_relocs and adjust_dynamic_symbol entry points have
   2840      determined the sizes of the various dynamic sections.  Allocate
   2841      memory for them.  */
   2842   for (s = dynobj->sections; s != NULL; s = s->next)
   2843     {
   2844       if ((s->flags & SEC_LINKER_CREATED) == 0)
   2845 	continue;
   2846 
   2847       if (s == htab->elf.splt
   2848 	  || s == htab->elf.sgot
   2849 	  || s == htab->elf.sgotplt
   2850 	  || s == htab->sdynbss)
   2851 	{
   2852 	  /* Strip this section if we don't need it; see the
   2853 	     comment below.  */
   2854 	}
   2855       else if (strncmp (s->name, ".rela", 5) == 0)
   2856 	{
   2857 	  if (s->size != 0)
   2858 	    {
   2859 	      /* We use the reloc_count field as a counter if we need
   2860 		 to copy relocs into the output file.  */
   2861 	      s->reloc_count = 0;
   2862 	    }
   2863 	}
   2864       else
   2865 	{
   2866 	  /* It's not one of our sections.  */
   2867 	  continue;
   2868 	}
   2869 
   2870       if (s->size == 0)
   2871 	{
   2872 	  /* If we don't need this section, strip it from the
   2873 	     output file.  This is mostly to handle .rela.bss and
   2874 	     .rela.plt.  We must create both sections in
   2875 	     create_dynamic_sections, because they must be created
   2876 	     before the linker maps input sections to output
   2877 	     sections.  The linker does that before
   2878 	     adjust_dynamic_symbol is called, and it is that
   2879 	     function which decides whether anything needs to go
   2880 	     into these sections.  */
   2881 	  s->flags |= SEC_EXCLUDE;
   2882 	  continue;
   2883 	}
   2884 
   2885       if ((s->flags & SEC_HAS_CONTENTS) == 0)
   2886 	continue;
   2887 
   2888       /* Allocate memory for the section contents.  Zero the memory
   2889 	 for the benefit of .rela.plt, which has 4 unused entries
   2890 	 at the beginning, and we don't want garbage.  */
   2891       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
   2892       if (s->contents == NULL)
   2893 	return FALSE;
   2894     }
   2895 
   2896   if (elf_hash_table (info)->dynamic_sections_created)
   2897     {
   2898       /* Add some entries to the .dynamic section.  We fill in the
   2899 	 values later, in tilegx_elf_finish_dynamic_sections, but we
   2900 	 must add the entries now so that we get the correct size for
   2901 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
   2902 	 dynamic linker and used by the debugger.  */
   2903 #define add_dynamic_entry(TAG, VAL) \
   2904   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
   2905 
   2906       if (bfd_link_executable (info))
   2907 	{
   2908 	  if (!add_dynamic_entry (DT_DEBUG, 0))
   2909 	    return FALSE;
   2910 	}
   2911 
   2912       if (htab->elf.srelplt->size != 0)
   2913 	{
   2914 	  if (!add_dynamic_entry (DT_PLTGOT, 0)
   2915 	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
   2916 	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
   2917 	      || !add_dynamic_entry (DT_JMPREL, 0))
   2918 	    return FALSE;
   2919 	}
   2920 
   2921       if (!add_dynamic_entry (DT_RELA, 0)
   2922 	  || !add_dynamic_entry (DT_RELASZ, 0)
   2923 	  || !add_dynamic_entry (DT_RELAENT, TILEGX_ELF_RELA_BYTES (htab)))
   2924 	return FALSE;
   2925 
   2926       /* If any dynamic relocs apply to a read-only section,
   2927 	 then we need a DT_TEXTREL entry.  */
   2928       if ((info->flags & DF_TEXTREL) == 0)
   2929 	elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info);
   2930 
   2931       if (info->flags & DF_TEXTREL)
   2932 	{
   2933 	  if (!add_dynamic_entry (DT_TEXTREL, 0))
   2934 	    return FALSE;
   2935 	}
   2936     }
   2937 #undef add_dynamic_entry
   2938 
   2939   return TRUE;
   2940 }
   2941 
   2942 /* Return the base VMA address which should be subtracted from real addresses
   2944    when resolving @dtpoff relocation.
   2945    This is PT_TLS segment p_vaddr.  */
   2946 
   2947 static bfd_vma
   2948 dtpoff_base (struct bfd_link_info *info)
   2949 {
   2950   /* If tls_sec is NULL, we should have signalled an error already.  */
   2951   if (elf_hash_table (info)->tls_sec == NULL)
   2952     return 0;
   2953   return elf_hash_table (info)->tls_sec->vma;
   2954 }
   2955 
   2956 /* Return the relocation value for @tpoff relocation. */
   2957 
   2958 static bfd_vma
   2959 tpoff (struct bfd_link_info *info, bfd_vma address)
   2960 {
   2961   struct elf_link_hash_table *htab = elf_hash_table (info);
   2962 
   2963   /* If tls_sec is NULL, we should have signalled an error already.  */
   2964   if (htab->tls_sec == NULL)
   2965     return 0;
   2966 
   2967   return (address - htab->tls_sec->vma);
   2968 }
   2969 
   2970 /* Copy SIZE bits from FROM to TO at address ADDR.  */
   2971 
   2972 static void
   2973 tilegx_copy_bits (bfd_byte *addr, int from, int to, int size)
   2974 {
   2975   int i;
   2976   for (i = 0; i < size; i++)
   2977     {
   2978       int from_byte = (from + i) / 8;
   2979       int from_bit = (from + i) % 8;
   2980       int to_byte = (to + i) / 8;
   2981       int to_bit = (to + i) % 8;
   2982       bfd_byte to_mask = 1 << to_bit;
   2983       addr[to_byte] = (addr[to_byte] & ~to_mask)
   2984 	| ((addr[from_byte] >> from_bit << to_bit) & to_mask);
   2985     }
   2986 }
   2987 
   2988 /* Replace the MASK bits in ADDR with those in INSN, for the next
   2989    TILEGX_BUNDLE_SIZE_IN_BYTES bytes.  */
   2990 
   2991 static void
   2992 tilegx_replace_insn (bfd_byte *addr, const bfd_byte *mask,
   2993 		     const bfd_byte *insn)
   2994 {
   2995   int i;
   2996   for (i = 0; i < TILEGX_BUNDLE_SIZE_IN_BYTES; i++)
   2997     {
   2998       addr[i] = (addr[i] & ~mask[i]) | (insn[i] & mask[i]);
   2999     }
   3000 }
   3001 
   3002 /* Mask to extract the bits corresponding to an instruction in a
   3003    specific pipe of a bundle.  */
   3004 static const bfd_byte insn_mask_X1[] = {
   3005   0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x3f
   3006 };
   3007 
   3008 /* Mask to extract the bits corresponding to an instruction in a
   3009    specific pipe of a bundle, minus the destination operand and the
   3010    first source operand.  */
   3011 static const bfd_byte insn_mask_X0_no_dest_no_srca[] = {
   3012   0x00, 0xf0, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00
   3013 };
   3014 
   3015 static const bfd_byte insn_mask_X1_no_dest_no_srca[] = {
   3016   0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x3f
   3017 };
   3018 
   3019 static const bfd_byte insn_mask_Y0_no_dest_no_srca[] = {
   3020   0x00, 0xf0, 0x0f, 0x78, 0x00, 0x00, 0x00, 0x00
   3021 };
   3022 static const bfd_byte insn_mask_Y1_no_dest_no_srca[] = {
   3023   0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x07, 0x3c
   3024 };
   3025 
   3026 /* Mask to extract the bits corresponding to an instruction in a
   3027    specific pipe of a bundle, minus the register operands.  */
   3028 static const bfd_byte insn_mask_X0_no_operand[] = {
   3029   0x00, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0x00, 0x00
   3030 };
   3031 
   3032 static const bfd_byte insn_mask_X1_no_operand[] = {
   3033   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x3f
   3034 };
   3035 
   3036 static const bfd_byte insn_mask_Y0_no_operand[] = {
   3037   0x00, 0x00, 0x0c, 0x78, 0x00, 0x00, 0x00, 0x00
   3038 };
   3039 
   3040 static const bfd_byte insn_mask_Y1_no_operand[] = {
   3041   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3c
   3042 };
   3043 
   3044 /* Various instructions synthesized to support tls references.  */
   3045 
   3046 /* ld r0, r0 in the X1 pipe, used for tls ie.  */
   3047 static const bfd_byte insn_tls_ie_ld_X1[] = {
   3048   0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x6a, 0x28
   3049 };
   3050 
   3051 /* ld4s r0, r0 in the X1 pipe, used for tls ie.  */
   3052 static const bfd_byte insn_tls_ie_ld4s_X1[] = {
   3053   0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x6a, 0x28
   3054 };
   3055 
   3056 /* add r0, r0, tp in various pipes, used for tls ie.  */
   3057 static const bfd_byte insn_tls_ie_add_X0X1[] = {
   3058   0x00, 0x50, 0x0f, 0x50, 0x00, 0xa8, 0x07, 0x28
   3059 };
   3060 static const bfd_byte insn_tls_ie_add_Y0Y1[] = {
   3061   0x00, 0x50, 0x27, 0x2c, 0x00, 0xa8, 0x13, 0x9a
   3062 };
   3063 
   3064 /* addx r0, r0, tp in various pipes, used for tls ie.  */
   3065 static const bfd_byte insn_tls_ie_addx_X0X1[] = {
   3066   0x00, 0x50, 0x0b, 0x50, 0x00, 0xa8, 0x05, 0x28
   3067 };
   3068 static const bfd_byte insn_tls_ie_addx_Y0Y1[] = {
   3069   0x00, 0x50, 0x03, 0x2c, 0x00, 0xa8, 0x01, 0x9a
   3070 };
   3071 
   3072 /* move r0, r0 in various pipes, used for tls gd.  */
   3073 static const bfd_byte insn_tls_gd_add_X0X1[] = {
   3074   0x00, 0xf0, 0x07, 0x51, 0x00, 0xf8, 0x3b, 0x28
   3075 };
   3076 static const bfd_byte insn_tls_gd_add_Y0Y1[] = {
   3077   0x00, 0xf0, 0x0b, 0x54, 0x00, 0xf8, 0x05, 0xae
   3078 };
   3079 
   3080 static const bfd_byte *insn_move_X0X1 = insn_tls_gd_add_X0X1;
   3081 static const bfd_byte *insn_move_Y0Y1 = insn_tls_gd_add_Y0Y1;
   3082 
   3083 static const bfd_byte *insn_add_X0X1 = insn_tls_ie_add_X0X1;
   3084 static const bfd_byte *insn_add_Y0Y1 = insn_tls_ie_add_Y0Y1;
   3085 
   3086 static const bfd_byte *insn_addx_X0X1 = insn_tls_ie_addx_X0X1;
   3087 static const bfd_byte *insn_addx_Y0Y1 = insn_tls_ie_addx_Y0Y1;
   3088 
   3089 /* Relocate an TILEGX ELF section.
   3090 
   3091    The RELOCATE_SECTION function is called by the new ELF backend linker
   3092    to handle the relocations for a section.
   3093 
   3094    The relocs are always passed as Rela structures.
   3095 
   3096    This function is responsible for adjusting the section contents as
   3097    necessary, and (if generating a relocatable output file) adjusting
   3098    the reloc addend as necessary.
   3099 
   3100    This function does not have to worry about setting the reloc
   3101    address or the reloc symbol index.
   3102 
   3103    LOCAL_SYMS is a pointer to the swapped in local symbols.
   3104 
   3105    LOCAL_SECTIONS is an array giving the section in the input file
   3106    corresponding to the st_shndx field of each local symbol.
   3107 
   3108    The global hash table entry for the global symbols can be found
   3109    via elf_sym_hashes (input_bfd).
   3110 
   3111    When generating relocatable output, this function must handle
   3112    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
   3113    going to be the section symbol corresponding to the output
   3114    section, which means that the addend must be adjusted
   3115    accordingly.  */
   3116 
   3117 bfd_boolean
   3118 tilegx_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
   3119 			     bfd *input_bfd, asection *input_section,
   3120 			     bfd_byte *contents, Elf_Internal_Rela *relocs,
   3121 			     Elf_Internal_Sym *local_syms,
   3122 			     asection **local_sections)
   3123 {
   3124   struct tilegx_elf_link_hash_table *htab;
   3125   Elf_Internal_Shdr *symtab_hdr;
   3126   struct elf_link_hash_entry **sym_hashes;
   3127   bfd_vma *local_got_offsets;
   3128   bfd_vma got_base;
   3129   asection *sreloc;
   3130   Elf_Internal_Rela *rel;
   3131   Elf_Internal_Rela *relend;
   3132   int num_relocs;
   3133 
   3134   htab = tilegx_elf_hash_table (info);
   3135   BFD_ASSERT (htab != NULL);
   3136   symtab_hdr = &elf_symtab_hdr (input_bfd);
   3137   sym_hashes = elf_sym_hashes (input_bfd);
   3138   local_got_offsets = elf_local_got_offsets (input_bfd);
   3139 
   3140   if (elf_hash_table (info)->hgot == NULL)
   3141     got_base = 0;
   3142   else
   3143     got_base = elf_hash_table (info)->hgot->root.u.def.value;
   3144 
   3145   sreloc = elf_section_data (input_section)->sreloc;
   3146 
   3147   rel = relocs;
   3148   num_relocs = input_section->reloc_count;
   3149   relend = relocs + num_relocs;
   3150   for (; rel < relend; rel++)
   3151     {
   3152       int r_type, tls_type;
   3153       bfd_boolean is_tls_iele, is_tls_le;
   3154       reloc_howto_type *howto;
   3155       unsigned long r_symndx;
   3156       struct elf_link_hash_entry *h;
   3157       Elf_Internal_Sym *sym;
   3158       tilegx_create_func create_func;
   3159       asection *sec;
   3160       bfd_vma relocation;
   3161       bfd_reloc_status_type r;
   3162       const char *name;
   3163       bfd_vma off;
   3164       bfd_boolean is_plt = FALSE;
   3165 
   3166       bfd_boolean unresolved_reloc;
   3167 
   3168       r_type = TILEGX_ELF_R_TYPE (rel->r_info);
   3169       if (r_type == R_TILEGX_GNU_VTINHERIT
   3170 	  || r_type == R_TILEGX_GNU_VTENTRY)
   3171 	continue;
   3172 
   3173       if ((unsigned int)r_type >= ARRAY_SIZE (tilegx_elf_howto_table))
   3174 	{
   3175           /* Not clear if we need to check here, but just be paranoid. */
   3176 	  (*_bfd_error_handler)
   3177 	    (_("%B: unrecognized relocation (0x%x) in section `%A'"),
   3178 	     input_bfd, r_type, input_section);
   3179 	  bfd_set_error (bfd_error_bad_value);
   3180 	  return FALSE;
   3181 	}
   3182 
   3183       howto = tilegx_elf_howto_table + r_type;
   3184 
   3185       /* This is a final link.  */
   3186       r_symndx = TILEGX_ELF_R_SYMNDX (htab, rel->r_info);
   3187       h = NULL;
   3188       sym = NULL;
   3189       sec = NULL;
   3190       unresolved_reloc = FALSE;
   3191       if (r_symndx < symtab_hdr->sh_info)
   3192 	{
   3193 	  sym = local_syms + r_symndx;
   3194 	  sec = local_sections[r_symndx];
   3195 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
   3196 	}
   3197       else
   3198 	{
   3199 	  bfd_boolean warned ATTRIBUTE_UNUSED;
   3200 	  bfd_boolean ignored ATTRIBUTE_UNUSED;
   3201 
   3202 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
   3203 				   r_symndx, symtab_hdr, sym_hashes,
   3204 				   h, sec, relocation,
   3205 				   unresolved_reloc, warned, ignored);
   3206 	  if (warned)
   3207 	    {
   3208 	      /* To avoid generating warning messages about truncated
   3209 		 relocations, set the relocation's address to be the same as
   3210 		 the start of this section.  */
   3211 	      if (input_section->output_section != NULL)
   3212 		relocation = input_section->output_section->vma;
   3213 	      else
   3214 		relocation = 0;
   3215 	    }
   3216 	}
   3217 
   3218       if (sec != NULL && discarded_section (sec))
   3219 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
   3220 					 rel, 1, relend, howto, 0, contents);
   3221 
   3222       if (bfd_link_relocatable (info))
   3223 	continue;
   3224 
   3225       if (h != NULL)
   3226 	name = h->root.root.string;
   3227       else
   3228 	{
   3229 	  name = (bfd_elf_string_from_elf_section
   3230 		  (input_bfd, symtab_hdr->sh_link, sym->st_name));
   3231 	  if (name == NULL || *name == '\0')
   3232 	    name = bfd_section_name (input_bfd, sec);
   3233 	}
   3234 
   3235       switch (r_type)
   3236 	{
   3237 	case R_TILEGX_TLS_GD_CALL:
   3238 	case R_TILEGX_IMM8_X0_TLS_GD_ADD:
   3239 	case R_TILEGX_IMM8_Y0_TLS_GD_ADD:
   3240 	case R_TILEGX_IMM8_X1_TLS_GD_ADD:
   3241 	case R_TILEGX_IMM8_Y1_TLS_GD_ADD:
   3242 	case R_TILEGX_IMM8_X0_TLS_ADD:
   3243 	case R_TILEGX_IMM8_Y0_TLS_ADD:
   3244 	case R_TILEGX_IMM8_X1_TLS_ADD:
   3245 	case R_TILEGX_IMM8_Y1_TLS_ADD:
   3246 	  tls_type = GOT_UNKNOWN;
   3247 	  if (h == NULL && local_got_offsets)
   3248 	    tls_type =
   3249 	      _bfd_tilegx_elf_local_got_tls_type (input_bfd) [r_symndx];
   3250 	  else if (h != NULL)
   3251 	    tls_type = tilegx_elf_hash_entry(h)->tls_type;
   3252 
   3253 	  is_tls_iele = (! bfd_link_pic (info) || tls_type == GOT_TLS_IE);
   3254 	  is_tls_le = is_tls_iele && (!input_section->sec_flg0
   3255 				      && !bfd_link_pic (info)
   3256 				      && (h == NULL || h->dynindx == -1));
   3257 
   3258 	  if (r_type == R_TILEGX_TLS_GD_CALL)
   3259 	    {
   3260 	      if (is_tls_le)
   3261 		{
   3262 		  /* GD -> LE */
   3263 		  tilegx_replace_insn (contents + rel->r_offset,
   3264 				       insn_mask_X1, insn_move_X0X1);
   3265 		  continue;
   3266 		}
   3267 	      else if (is_tls_iele)
   3268 		{
   3269 		  /* GD -> IE */
   3270 		  if (ABI_64_P (output_bfd))
   3271 		    tilegx_replace_insn (contents + rel->r_offset,
   3272 					 insn_mask_X1, insn_tls_ie_ld_X1);
   3273 		  else
   3274 		    tilegx_replace_insn (contents + rel->r_offset,
   3275 					 insn_mask_X1, insn_tls_ie_ld4s_X1);
   3276 		  continue;
   3277 		}
   3278 
   3279 	      /* GD -> GD */
   3280 	      h = (struct elf_link_hash_entry *)
   3281 		bfd_link_hash_lookup (info->hash, "__tls_get_addr", FALSE,
   3282 				      FALSE, TRUE);
   3283 	      BFD_ASSERT (h != NULL);
   3284 	      r_type = R_TILEGX_JUMPOFF_X1_PLT;
   3285 	      howto = tilegx_elf_howto_table + r_type;
   3286 	    }
   3287 	  else if (r_type == R_TILEGX_IMM8_X0_TLS_ADD
   3288 		   || r_type ==  R_TILEGX_IMM8_X1_TLS_ADD
   3289 		   || r_type ==  R_TILEGX_IMM8_Y0_TLS_ADD
   3290 		   || r_type ==  R_TILEGX_IMM8_Y1_TLS_ADD)
   3291 	    {
   3292 	      bfd_boolean is_pipe0 =
   3293 		(r_type == R_TILEGX_IMM8_X0_TLS_ADD
   3294 		 || r_type ==  R_TILEGX_IMM8_Y0_TLS_ADD);
   3295 	      bfd_boolean is_X0X1 =
   3296 		(r_type == R_TILEGX_IMM8_X0_TLS_ADD
   3297 		 || r_type ==  R_TILEGX_IMM8_X1_TLS_ADD);
   3298 	      int dest_begin = is_pipe0 ? 0 : 31;
   3299 	      int src_begin;
   3300 	      const bfd_byte *insn;
   3301 	      const bfd_byte *mask = NULL;
   3302 
   3303 	      if (is_tls_le)
   3304 		{
   3305 		  /* 1. copy dest operand into the first source operand.
   3306 		     2. change the opcode to "move".  */
   3307 		  src_begin = is_pipe0 ? 6 : 37;
   3308 		  insn = is_X0X1 ? insn_move_X0X1 : insn_move_Y0Y1;
   3309 
   3310 		  switch (r_type)
   3311 		    {
   3312 		    case R_TILEGX_IMM8_X0_TLS_ADD:
   3313 		      mask = insn_mask_X0_no_dest_no_srca;
   3314 		      break;
   3315 		    case R_TILEGX_IMM8_X1_TLS_ADD:
   3316 		      mask = insn_mask_X1_no_dest_no_srca;
   3317 		      break;
   3318 		    case R_TILEGX_IMM8_Y0_TLS_ADD:
   3319 		      mask = insn_mask_Y0_no_dest_no_srca;
   3320 		      break;
   3321 		    case R_TILEGX_IMM8_Y1_TLS_ADD:
   3322 		      mask = insn_mask_Y1_no_dest_no_srca;
   3323 		      break;
   3324 		    }
   3325 		}
   3326 	      else
   3327 		{
   3328 		  /* 1. copy dest operand into the second source operand.
   3329 		     2. change the opcode to "add".  */
   3330 		  src_begin = is_pipe0 ? 12 : 43;
   3331 		  if (ABI_64_P (output_bfd))
   3332 		    insn = is_X0X1 ? insn_add_X0X1 : insn_add_Y0Y1;
   3333 		  else
   3334 		    insn = is_X0X1 ? insn_addx_X0X1 : insn_addx_Y0Y1;
   3335 
   3336 		  switch (r_type)
   3337 		    {
   3338 		    case R_TILEGX_IMM8_X0_TLS_ADD:
   3339 		      mask = insn_mask_X0_no_operand;
   3340 		      break;
   3341 		    case R_TILEGX_IMM8_X1_TLS_ADD:
   3342 		      mask = insn_mask_X1_no_operand;
   3343 		      break;
   3344 		    case R_TILEGX_IMM8_Y0_TLS_ADD:
   3345 		      mask = insn_mask_Y0_no_operand;
   3346 		      break;
   3347 		    case R_TILEGX_IMM8_Y1_TLS_ADD:
   3348 		      mask = insn_mask_Y1_no_operand;
   3349 		      break;
   3350 		    }
   3351 		}
   3352 
   3353 	      tilegx_copy_bits (contents + rel->r_offset, dest_begin,
   3354 				src_begin, 6);
   3355 	      tilegx_replace_insn (contents  + rel->r_offset, mask, insn);
   3356 
   3357 	      continue;
   3358 	    }
   3359 	  else
   3360 	    {
   3361 	      const bfd_byte *mask = NULL;
   3362 	      const bfd_byte *add_insn = NULL;
   3363 	      bfd_boolean is_64bit = ABI_64_P (output_bfd);
   3364 
   3365 	      switch (r_type)
   3366 		{
   3367 		case R_TILEGX_IMM8_X0_TLS_GD_ADD:
   3368 		  add_insn = is_tls_iele
   3369 		    ? (is_64bit ? insn_tls_ie_add_X0X1 : insn_tls_ie_addx_X0X1)
   3370 		    : insn_tls_gd_add_X0X1;
   3371 		  mask = insn_mask_X0_no_dest_no_srca;
   3372 		  break;
   3373 		case R_TILEGX_IMM8_X1_TLS_GD_ADD:
   3374 		  add_insn = is_tls_iele
   3375 		    ? (is_64bit ? insn_tls_ie_add_X0X1 : insn_tls_ie_addx_X0X1)
   3376 		    : insn_tls_gd_add_X0X1;
   3377 		  mask = insn_mask_X1_no_dest_no_srca;
   3378 		  break;
   3379 		case R_TILEGX_IMM8_Y0_TLS_GD_ADD:
   3380 		  add_insn = is_tls_iele
   3381 		    ? (is_64bit ? insn_tls_ie_add_Y0Y1 : insn_tls_ie_addx_Y0Y1)
   3382 		    : insn_tls_gd_add_Y0Y1;
   3383 		  mask = insn_mask_Y0_no_dest_no_srca;
   3384 		  break;
   3385 		case R_TILEGX_IMM8_Y1_TLS_GD_ADD:
   3386 		  add_insn = is_tls_iele
   3387 		    ? (is_64bit ? insn_tls_ie_add_Y0Y1 : insn_tls_ie_addx_Y0Y1)
   3388 		    : insn_tls_gd_add_Y0Y1;
   3389 		  mask = insn_mask_Y1_no_dest_no_srca;
   3390 		  break;
   3391 		}
   3392 
   3393 	      tilegx_replace_insn (contents + rel->r_offset, mask, add_insn);
   3394 
   3395 	      continue;
   3396 	    }
   3397 	  break;
   3398 	case R_TILEGX_TLS_IE_LOAD:
   3399 	  if (!input_section->sec_flg0
   3400 	      && !bfd_link_pic (info)
   3401 	      && (h == NULL || h->dynindx == -1))
   3402 	    {
   3403 	      /* IE -> LE */
   3404 	      tilegx_replace_insn (contents + rel->r_offset,
   3405 				   insn_mask_X1_no_dest_no_srca,
   3406 				   insn_move_X0X1);
   3407 	    }
   3408 	  else
   3409 	    {
   3410 	      /* IE -> IE */
   3411 	      if (ABI_64_P (output_bfd))
   3412 		tilegx_replace_insn (contents + rel->r_offset,
   3413 				     insn_mask_X1_no_dest_no_srca,
   3414 				     insn_tls_ie_ld_X1);
   3415 	      else
   3416 		tilegx_replace_insn (contents + rel->r_offset,
   3417 				     insn_mask_X1_no_dest_no_srca,
   3418 				     insn_tls_ie_ld4s_X1);
   3419 	    }
   3420 	  continue;
   3421 	  break;
   3422 	default:
   3423 	  break;
   3424 	}
   3425 
   3426       switch (r_type)
   3427 	{
   3428 	case R_TILEGX_IMM16_X0_HW0_GOT:
   3429 	case R_TILEGX_IMM16_X1_HW0_GOT:
   3430 	case R_TILEGX_IMM16_X0_HW0_LAST_GOT:
   3431 	case R_TILEGX_IMM16_X1_HW0_LAST_GOT:
   3432 	case R_TILEGX_IMM16_X0_HW1_LAST_GOT:
   3433 	case R_TILEGX_IMM16_X1_HW1_LAST_GOT:
   3434 	  /* Relocation is to the entry for this symbol in the global
   3435 	     offset table.  */
   3436 	  if (htab->elf.sgot == NULL)
   3437 	    abort ();
   3438 
   3439 	  if (h != NULL)
   3440 	    {
   3441 	      bfd_boolean dyn;
   3442 
   3443 	      off = h->got.offset;
   3444 	      BFD_ASSERT (off != (bfd_vma) -1);
   3445 	      dyn = elf_hash_table (info)->dynamic_sections_created;
   3446 
   3447 	      if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
   3448 						     bfd_link_pic (info),
   3449 						     h)
   3450 		  || (bfd_link_pic (info)
   3451 		      && SYMBOL_REFERENCES_LOCAL (info, h)))
   3452 		{
   3453 		  /* This is actually a static link, or it is a
   3454 		     -Bsymbolic link and the symbol is defined
   3455 		     locally, or the symbol was forced to be local
   3456 		     because of a version file.  We must initialize
   3457 		     this entry in the global offset table.  Since the
   3458 		     offset must always be a multiple
   3459 		     of 8 for 64-bit, we use the least significant bit
   3460 		     to record whether we have initialized it already.
   3461 
   3462 		     When doing a dynamic link, we create a .rela.got
   3463 		     relocation entry to initialize the value.  This
   3464 		     is done in the finish_dynamic_symbol routine.  */
   3465 		  if ((off & 1) != 0)
   3466 		    off &= ~1;
   3467 		  else
   3468 		    {
   3469 		      TILEGX_ELF_PUT_WORD (htab, output_bfd, relocation,
   3470 					   htab->elf.sgot->contents + off);
   3471 		      h->got.offset |= 1;
   3472 		    }
   3473 		}
   3474 	      else
   3475 		unresolved_reloc = FALSE;
   3476 	    }
   3477 	  else
   3478 	    {
   3479 	      BFD_ASSERT (local_got_offsets != NULL
   3480 			  && local_got_offsets[r_symndx] != (bfd_vma) -1);
   3481 
   3482 	      off = local_got_offsets[r_symndx];
   3483 
   3484 	      /* The offset must always be a multiple of 8 on 64-bit.
   3485                  We use the least significant bit to record
   3486 		 whether we have already processed this entry.  */
   3487 	      if ((off & 1) != 0)
   3488 		off &= ~1;
   3489 	      else
   3490 		{
   3491 		  if (bfd_link_pic (info))
   3492 		    {
   3493 		      asection *s;
   3494 		      Elf_Internal_Rela outrel;
   3495 
   3496 		      /* We need to generate a R_TILEGX_RELATIVE reloc
   3497 			 for the dynamic linker.  */
   3498 		      s = htab->elf.srelgot;
   3499 		      BFD_ASSERT (s != NULL);
   3500 
   3501 		      outrel.r_offset = (htab->elf.sgot->output_section->vma
   3502 					 + htab->elf.sgot->output_offset
   3503 					 + off);
   3504 		      outrel.r_info =
   3505 			TILEGX_ELF_R_INFO (htab, NULL, 0, R_TILEGX_RELATIVE);
   3506 		      outrel.r_addend = relocation;
   3507 		      relocation = 0;
   3508 		      tilegx_elf_append_rela (output_bfd, s, &outrel);
   3509 		    }
   3510 
   3511 		  TILEGX_ELF_PUT_WORD (htab, output_bfd, relocation,
   3512 				       htab->elf.sgot->contents + off);
   3513 		  local_got_offsets[r_symndx] |= 1;
   3514 		}
   3515 	    }
   3516 	  relocation = off - got_base;
   3517 	  break;
   3518 
   3519         case R_TILEGX_JUMPOFF_X1_PLT:
   3520 	case R_TILEGX_IMM16_X0_HW0_PLT_PCREL:
   3521 	case R_TILEGX_IMM16_X1_HW0_PLT_PCREL:
   3522 	case R_TILEGX_IMM16_X0_HW1_PLT_PCREL:
   3523 	case R_TILEGX_IMM16_X1_HW1_PLT_PCREL:
   3524 	case R_TILEGX_IMM16_X0_HW2_PLT_PCREL:
   3525 	case R_TILEGX_IMM16_X1_HW2_PLT_PCREL:
   3526 	case R_TILEGX_IMM16_X0_HW3_PLT_PCREL:
   3527 	case R_TILEGX_IMM16_X1_HW3_PLT_PCREL:
   3528 	case R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL:
   3529 	case R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL:
   3530 	case R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL:
   3531 	case R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL:
   3532 	case R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL:
   3533 	case R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL:
   3534 	  /* Relocation is to the entry for this symbol in the
   3535 	     procedure linkage table.  */
   3536           BFD_ASSERT (h != NULL);
   3537 
   3538 	  if (h->plt.offset == (bfd_vma) -1 || htab->elf.splt == NULL)
   3539 	    {
   3540 	      /* We didn't make a PLT entry for this symbol.  This
   3541 		 happens when statically linking PIC code, or when
   3542 		 using -Bsymbolic.  */
   3543 	      break;
   3544 	    }
   3545 
   3546 	  relocation = (htab->elf.splt->output_section->vma
   3547 			+ htab->elf.splt->output_offset
   3548 			+ h->plt.offset);
   3549 	  unresolved_reloc = FALSE;
   3550 	  break;
   3551 
   3552         case R_TILEGX_64_PCREL:
   3553         case R_TILEGX_32_PCREL:
   3554         case R_TILEGX_16_PCREL:
   3555         case R_TILEGX_8_PCREL:
   3556 	case R_TILEGX_IMM16_X0_HW0_PCREL:
   3557 	case R_TILEGX_IMM16_X1_HW0_PCREL:
   3558 	case R_TILEGX_IMM16_X0_HW1_PCREL:
   3559 	case R_TILEGX_IMM16_X1_HW1_PCREL:
   3560 	case R_TILEGX_IMM16_X0_HW2_PCREL:
   3561 	case R_TILEGX_IMM16_X1_HW2_PCREL:
   3562 	case R_TILEGX_IMM16_X0_HW3_PCREL:
   3563 	case R_TILEGX_IMM16_X1_HW3_PCREL:
   3564 	case R_TILEGX_IMM16_X0_HW0_LAST_PCREL:
   3565 	case R_TILEGX_IMM16_X1_HW0_LAST_PCREL:
   3566 	case R_TILEGX_IMM16_X0_HW1_LAST_PCREL:
   3567 	case R_TILEGX_IMM16_X1_HW1_LAST_PCREL:
   3568 	case R_TILEGX_IMM16_X0_HW2_LAST_PCREL:
   3569 	case R_TILEGX_IMM16_X1_HW2_LAST_PCREL:
   3570 	  if (h != NULL
   3571 	      && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
   3572 	    break;
   3573 	  /* Fall through.  */
   3574         case R_TILEGX_64:
   3575         case R_TILEGX_32:
   3576         case R_TILEGX_16:
   3577         case R_TILEGX_8:
   3578 	case R_TILEGX_HW0:
   3579 	case R_TILEGX_HW1:
   3580 	case R_TILEGX_HW2:
   3581 	case R_TILEGX_HW3:
   3582 	case R_TILEGX_HW0_LAST:
   3583 	case R_TILEGX_HW1_LAST:
   3584 	case R_TILEGX_HW2_LAST:
   3585         case R_TILEGX_COPY:
   3586         case R_TILEGX_GLOB_DAT:
   3587         case R_TILEGX_JMP_SLOT:
   3588         case R_TILEGX_RELATIVE:
   3589         case R_TILEGX_BROFF_X1:
   3590         case R_TILEGX_JUMPOFF_X1:
   3591         case R_TILEGX_IMM8_X0:
   3592         case R_TILEGX_IMM8_Y0:
   3593         case R_TILEGX_IMM8_X1:
   3594         case R_TILEGX_IMM8_Y1:
   3595         case R_TILEGX_DEST_IMM8_X1:
   3596         case R_TILEGX_MT_IMM14_X1:
   3597         case R_TILEGX_MF_IMM14_X1:
   3598         case R_TILEGX_MMSTART_X0:
   3599         case R_TILEGX_MMEND_X0:
   3600         case R_TILEGX_SHAMT_X0:
   3601         case R_TILEGX_SHAMT_X1:
   3602         case R_TILEGX_SHAMT_Y0:
   3603         case R_TILEGX_SHAMT_Y1:
   3604 	case R_TILEGX_IMM16_X0_HW0:
   3605 	case R_TILEGX_IMM16_X1_HW0:
   3606 	case R_TILEGX_IMM16_X0_HW1:
   3607 	case R_TILEGX_IMM16_X1_HW1:
   3608 	case R_TILEGX_IMM16_X0_HW2:
   3609 	case R_TILEGX_IMM16_X1_HW2:
   3610 	case R_TILEGX_IMM16_X0_HW3:
   3611 	case R_TILEGX_IMM16_X1_HW3:
   3612 	case R_TILEGX_IMM16_X0_HW0_LAST:
   3613 	case R_TILEGX_IMM16_X1_HW0_LAST:
   3614 	case R_TILEGX_IMM16_X0_HW1_LAST:
   3615 	case R_TILEGX_IMM16_X1_HW1_LAST:
   3616 	case R_TILEGX_IMM16_X0_HW2_LAST:
   3617 	case R_TILEGX_IMM16_X1_HW2_LAST:
   3618 	  if ((input_section->flags & SEC_ALLOC) == 0)
   3619 	    break;
   3620 
   3621 	  if ((bfd_link_pic (info)
   3622 	       && (h == NULL
   3623 		   || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   3624 		   || h->root.type != bfd_link_hash_undefweak)
   3625 	       && (! howto->pc_relative
   3626 		   || !SYMBOL_CALLS_LOCAL (info, h)))
   3627 	      || (!bfd_link_pic (info)
   3628 		  && h != NULL
   3629 		  && h->dynindx != -1
   3630 		  && !h->non_got_ref
   3631 		  && ((h->def_dynamic
   3632 		       && !h->def_regular)
   3633 		      || h->root.type == bfd_link_hash_undefweak
   3634 		      || h->root.type == bfd_link_hash_undefined)))
   3635 	    {
   3636 	      Elf_Internal_Rela outrel;
   3637 	      bfd_boolean skip, relocate = FALSE;
   3638 
   3639 	      /* When generating a shared object, these relocations
   3640 		 are copied into the output file to be resolved at run
   3641 		 time.  */
   3642 
   3643 	      BFD_ASSERT (sreloc != NULL);
   3644 
   3645 	      skip = FALSE;
   3646 
   3647 	      outrel.r_offset =
   3648 		_bfd_elf_section_offset (output_bfd, info, input_section,
   3649 					 rel->r_offset);
   3650 	      if (outrel.r_offset == (bfd_vma) -1)
   3651 		skip = TRUE;
   3652 	      else if (outrel.r_offset == (bfd_vma) -2)
   3653 		skip = TRUE, relocate = TRUE;
   3654 	      outrel.r_offset += (input_section->output_section->vma
   3655 				  + input_section->output_offset);
   3656 
   3657 	      switch (r_type)
   3658 		{
   3659                 case R_TILEGX_64_PCREL:
   3660                 case R_TILEGX_32_PCREL:
   3661                 case R_TILEGX_16_PCREL:
   3662                 case R_TILEGX_8_PCREL:
   3663 		  /* If the symbol is not dynamic, we should not keep
   3664 		     a dynamic relocation.  But an .rela.* slot has been
   3665 		     allocated for it, output R_TILEGX_NONE.
   3666 		     FIXME: Add code tracking needed dynamic relocs as
   3667 		     e.g. i386 has.  */
   3668 		  if (h->dynindx == -1)
   3669 		    skip = TRUE, relocate = TRUE;
   3670 		  break;
   3671 		}
   3672 
   3673 	      if (skip)
   3674 		memset (&outrel, 0, sizeof outrel);
   3675 	      /* h->dynindx may be -1 if the symbol was marked to
   3676 		 become local.  */
   3677 	      else if (h != NULL &&
   3678 		       h->dynindx != -1
   3679 		       && (! is_plt
   3680 			   || !bfd_link_pic (info)
   3681 			   || !SYMBOLIC_BIND (info, h)
   3682 			   || !h->def_regular))
   3683 		{
   3684 		  BFD_ASSERT (h->dynindx != -1);
   3685 		  outrel.r_info = TILEGX_ELF_R_INFO (htab, rel, h->dynindx, r_type);
   3686 		  outrel.r_addend = rel->r_addend;
   3687 		}
   3688 	      else
   3689 		{
   3690 		  if (r_type == R_TILEGX_32 || r_type == R_TILEGX_64)
   3691 		    {
   3692 		      outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, 0,
   3693 							 R_TILEGX_RELATIVE);
   3694 		      outrel.r_addend = relocation + rel->r_addend;
   3695 		    }
   3696 		  else
   3697 		    {
   3698 		      long indx;
   3699 
   3700 		      outrel.r_addend = relocation + rel->r_addend;
   3701 
   3702 		      if (is_plt)
   3703 			sec = htab->elf.splt;
   3704 
   3705 		      if (bfd_is_abs_section (sec))
   3706 			indx = 0;
   3707 		      else if (sec == NULL || sec->owner == NULL)
   3708 			{
   3709 			  bfd_set_error (bfd_error_bad_value);
   3710 			  return FALSE;
   3711 			}
   3712 		      else
   3713 			{
   3714 			  asection *osec;
   3715 
   3716 			  /* We are turning this relocation into one
   3717 			     against a section symbol.  It would be
   3718 			     proper to subtract the symbol's value,
   3719 			     osec->vma, from the emitted reloc addend,
   3720 			     but ld.so expects buggy relocs.  */
   3721 			  osec = sec->output_section;
   3722 			  indx = elf_section_data (osec)->dynindx;
   3723 
   3724 			  if (indx == 0)
   3725 			    {
   3726 			      osec = htab->elf.text_index_section;
   3727 			      indx = elf_section_data (osec)->dynindx;
   3728 			    }
   3729 
   3730 			  /* FIXME: we really should be able to link non-pic
   3731 			     shared libraries.  */
   3732 			  if (indx == 0)
   3733 			    {
   3734 			      BFD_FAIL ();
   3735 			      (*_bfd_error_handler)
   3736 				(_("%B: probably compiled without -fPIC?"),
   3737 				 input_bfd);
   3738 			      bfd_set_error (bfd_error_bad_value);
   3739 			      return FALSE;
   3740 			    }
   3741 			}
   3742 
   3743 		      outrel.r_info = TILEGX_ELF_R_INFO (htab, rel, indx,
   3744 							 r_type);
   3745 		    }
   3746 		}
   3747 
   3748 	      tilegx_elf_append_rela (output_bfd, sreloc, &outrel);
   3749 
   3750 	      /* This reloc will be computed at runtime, so there's no
   3751 		 need to do anything now.  */
   3752 	      if (! relocate)
   3753 		continue;
   3754 	    }
   3755 	  break;
   3756 
   3757         case R_TILEGX_IMM16_X0_HW0_TLS_LE:
   3758         case R_TILEGX_IMM16_X1_HW0_TLS_LE:
   3759         case R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE:
   3760         case R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE:
   3761         case R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE:
   3762         case R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE:
   3763 	  if (bfd_link_pic (info))
   3764 	    {
   3765 	      Elf_Internal_Rela outrel;
   3766 	      bfd_boolean skip;
   3767 
   3768 	      BFD_ASSERT (sreloc != NULL);
   3769 	      skip = FALSE;
   3770 	      outrel.r_offset =
   3771 		_bfd_elf_section_offset (output_bfd, info, input_section,
   3772 					 rel->r_offset);
   3773 	      if (outrel.r_offset == (bfd_vma) -1)
   3774 		skip = TRUE;
   3775 	      else if (outrel.r_offset == (bfd_vma) -2)
   3776 		skip = TRUE;
   3777 	      outrel.r_offset += (input_section->output_section->vma
   3778 				  + input_section->output_offset);
   3779 	      if (skip)
   3780 		memset (&outrel, 0, sizeof outrel);
   3781 	      else
   3782 		{
   3783 		  outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, 0, r_type);
   3784 		  outrel.r_addend = relocation - dtpoff_base (info)
   3785 				    + rel->r_addend;
   3786 		}
   3787 
   3788 	      tilegx_elf_append_rela (output_bfd, sreloc, &outrel);
   3789 	      continue;
   3790 	    }
   3791 	  relocation = tpoff (info, relocation);
   3792 	  break;
   3793 
   3794         case R_TILEGX_IMM16_X0_HW0_TLS_GD:
   3795         case R_TILEGX_IMM16_X1_HW0_TLS_GD:
   3796         case R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
   3797         case R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
   3798         case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
   3799         case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
   3800         case R_TILEGX_IMM16_X0_HW0_TLS_IE:
   3801         case R_TILEGX_IMM16_X1_HW0_TLS_IE:
   3802         case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
   3803         case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
   3804         case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
   3805         case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
   3806 	  r_type = tilegx_elf_tls_transition (info, r_type, h == NULL,
   3807 					      input_section->sec_flg0);
   3808           tls_type = GOT_UNKNOWN;
   3809 	  if (h == NULL && local_got_offsets)
   3810 	    tls_type =
   3811 	      _bfd_tilegx_elf_local_got_tls_type (input_bfd) [r_symndx];
   3812 	  else if (h != NULL)
   3813 	    {
   3814 	      tls_type = tilegx_elf_hash_entry(h)->tls_type;
   3815 	      if (!bfd_link_pic (info)
   3816 		  && h->dynindx == -1
   3817 		  && tls_type == GOT_TLS_IE)
   3818 		r_type = (!input_section->sec_flg0
   3819 			  ? tilegx_tls_translate_to_le (r_type)
   3820 			  : tilegx_tls_translate_to_ie (r_type));
   3821 	    }
   3822 
   3823 	  if (tls_type == GOT_TLS_IE)
   3824 	    r_type = tilegx_tls_translate_to_ie (r_type);
   3825 
   3826 	  if (r_type == R_TILEGX_IMM16_X0_HW0_TLS_LE
   3827 	      || r_type == R_TILEGX_IMM16_X1_HW0_TLS_LE
   3828 	      || r_type == R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE
   3829 	      || r_type == R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE
   3830 	      || r_type == R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE
   3831 	      || r_type == R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE)
   3832 	    {
   3833 	      relocation = tpoff (info, relocation);
   3834 	      break;
   3835 	    }
   3836 
   3837 	  if (h != NULL)
   3838 	    {
   3839 	      off = h->got.offset;
   3840 	      h->got.offset |= 1;
   3841 	    }
   3842 	  else
   3843 	    {
   3844 	      BFD_ASSERT (local_got_offsets != NULL);
   3845 	      off = local_got_offsets[r_symndx];
   3846 	      local_got_offsets[r_symndx] |= 1;
   3847 	    }
   3848 
   3849 	  if (htab->elf.sgot == NULL)
   3850 	    abort ();
   3851 
   3852 	  if ((off & 1) != 0)
   3853 	    off &= ~1;
   3854 	  else
   3855 	    {
   3856 	      Elf_Internal_Rela outrel;
   3857 	      int indx = 0;
   3858 	      bfd_boolean need_relocs = FALSE;
   3859 
   3860 	      if (htab->elf.srelgot == NULL)
   3861 		abort ();
   3862 
   3863 	      if (h != NULL)
   3864 	      {
   3865 	        bfd_boolean dyn;
   3866 	        dyn = htab->elf.dynamic_sections_created;
   3867 
   3868 		if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
   3869 						     bfd_link_pic (info),
   3870 						     h)
   3871 		    && (!bfd_link_pic (info)
   3872 			|| !SYMBOL_REFERENCES_LOCAL (info, h)))
   3873 		  {
   3874 		    indx = h->dynindx;
   3875 		  }
   3876 	      }
   3877 
   3878 	      /* The GOT entries have not been initialized yet.  Do it
   3879 	         now, and emit any relocations. */
   3880 	      if ((bfd_link_pic (info) || indx != 0)
   3881 		  && (h == NULL
   3882 		      || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
   3883 		      || h->root.type != bfd_link_hash_undefweak))
   3884 		    need_relocs = TRUE;
   3885 
   3886               switch (r_type)
   3887                 {
   3888 		  case R_TILEGX_IMM16_X0_HW0_TLS_IE:
   3889 		  case R_TILEGX_IMM16_X1_HW0_TLS_IE:
   3890 		  case R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
   3891 		  case R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
   3892 		  case R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
   3893 		  case R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
   3894 		    if (need_relocs) {
   3895 		      TILEGX_ELF_PUT_WORD (htab, output_bfd, 0,
   3896 					   htab->elf.sgot->contents + off);
   3897 	              outrel.r_offset = (htab->elf.sgot->output_section->vma
   3898 				       + htab->elf.sgot->output_offset + off);
   3899 	              outrel.r_addend = 0;
   3900 		      if (indx == 0)
   3901 		        outrel.r_addend = relocation - dtpoff_base (info);
   3902 		      outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, indx,
   3903 							 TILEGX_ELF_TPOFF_RELOC (htab));
   3904 		      tilegx_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
   3905                     } else {
   3906 		      TILEGX_ELF_PUT_WORD (htab, output_bfd,
   3907 					   tpoff (info, relocation),
   3908 					   htab->elf.sgot->contents + off);
   3909                     }
   3910                     break;
   3911 
   3912 		  case R_TILEGX_IMM16_X0_HW0_TLS_GD:
   3913 		  case R_TILEGX_IMM16_X1_HW0_TLS_GD:
   3914 		  case R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
   3915 		  case R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
   3916 		  case R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
   3917 		  case R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
   3918 		    if (need_relocs) {
   3919  	              outrel.r_offset = (htab->elf.sgot->output_section->vma
   3920 				       + htab->elf.sgot->output_offset + off);
   3921 	              outrel.r_addend = 0;
   3922 	              outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, indx,
   3923 							 TILEGX_ELF_DTPMOD_RELOC (htab));
   3924 		      TILEGX_ELF_PUT_WORD (htab, output_bfd, 0,
   3925 					   htab->elf.sgot->contents + off);
   3926 	              tilegx_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
   3927 		      if (indx == 0)
   3928 		        {
   3929 		      	  BFD_ASSERT (! unresolved_reloc);
   3930 			  TILEGX_ELF_PUT_WORD (htab, output_bfd,
   3931 					       relocation - dtpoff_base (info),
   3932 					       (htab->elf.sgot->contents + off +
   3933 						TILEGX_ELF_WORD_BYTES (htab)));
   3934 		        }
   3935 		      else
   3936 		        {
   3937 			  TILEGX_ELF_PUT_WORD (htab, output_bfd, 0,
   3938 					       (htab->elf.sgot->contents + off +
   3939 						TILEGX_ELF_WORD_BYTES (htab)));
   3940 		          outrel.r_info = TILEGX_ELF_R_INFO (htab, NULL, indx,
   3941 							     TILEGX_ELF_DTPOFF_RELOC (htab));
   3942 		          outrel.r_offset += TILEGX_ELF_WORD_BYTES (htab);
   3943 		          tilegx_elf_append_rela (output_bfd, htab->elf.srelgot, &outrel);
   3944 		        }
   3945                     }
   3946 
   3947 		    else {
   3948 		      /* If we are not emitting relocations for a
   3949 		         general dynamic reference, then we must be in a
   3950 		         static link or an executable link with the
   3951 		         symbol binding locally.  Mark it as belonging
   3952 		         to module 1, the executable.  */
   3953 		      TILEGX_ELF_PUT_WORD (htab, output_bfd, 1,
   3954 					   htab->elf.sgot->contents + off );
   3955 		      TILEGX_ELF_PUT_WORD (htab, output_bfd,
   3956 					   relocation - dtpoff_base (info),
   3957 					   htab->elf.sgot->contents + off +
   3958 					   TILEGX_ELF_WORD_BYTES (htab));
   3959 		   }
   3960                    break;
   3961                 }
   3962 	    }
   3963 
   3964 	  if (off >= (bfd_vma) -2)
   3965 	    abort ();
   3966 
   3967 	  relocation = off - got_base;
   3968 	  unresolved_reloc = FALSE;
   3969 	  howto = tilegx_elf_howto_table + r_type;
   3970 	  break;
   3971 
   3972 	default:
   3973 	  break;
   3974 	}
   3975 
   3976       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
   3977 	 because such sections are not SEC_ALLOC and thus ld.so will
   3978 	 not process them.  */
   3979       if (unresolved_reloc
   3980 	  && !((input_section->flags & SEC_DEBUGGING) != 0
   3981 	       && h->def_dynamic)
   3982 	  && _bfd_elf_section_offset (output_bfd, info, input_section,
   3983 				      rel->r_offset) != (bfd_vma) -1)
   3984 	(*_bfd_error_handler)
   3985 	  (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
   3986 	   input_bfd,
   3987 	   input_section,
   3988 	   (long) rel->r_offset,
   3989 	   howto->name,
   3990 	   h->root.root.string);
   3991 
   3992       r = bfd_reloc_continue;
   3993 
   3994       /* Get the operand creation function, if any. */
   3995       create_func = reloc_to_create_func[r_type];
   3996       if (create_func == NULL)
   3997       {
   3998         r = _bfd_final_link_relocate (howto, input_bfd, input_section,
   3999                                       contents, rel->r_offset,
   4000                                       relocation, rel->r_addend);
   4001       }
   4002       else
   4003       {
   4004         if (howto->pc_relative)
   4005         {
   4006           relocation -=
   4007             input_section->output_section->vma + input_section->output_offset;
   4008           if (howto->pcrel_offset)
   4009             relocation -= rel->r_offset;
   4010         }
   4011 
   4012         bfd_byte *data;
   4013 
   4014         /* Add the relocation addend if any to the final target value */
   4015         relocation += rel->r_addend;
   4016 
   4017         /* Do basic range checking */
   4018         r = bfd_check_overflow (howto->complain_on_overflow,
   4019                                 howto->bitsize,
   4020                                 howto->rightshift,
   4021                                 TILEGX_ELF_WORD_BYTES (htab) * 8,
   4022                                 relocation);
   4023 
   4024         /*
   4025          * Write the relocated value out into the raw section data.
   4026          * Don't put a relocation out in the .rela section.
   4027          */
   4028         tilegx_bundle_bits mask = create_func(-1);
   4029         tilegx_bundle_bits value = create_func(relocation >> howto->rightshift);
   4030 
   4031         /* Only touch bytes while the mask is not 0, so we
   4032            don't write to out of bounds memory if this is actually
   4033            a 16-bit switch instruction. */
   4034         for (data = contents + rel->r_offset; mask != 0; data++)
   4035           {
   4036             bfd_byte byte_mask = (bfd_byte)mask;
   4037             *data = (*data & ~byte_mask) | ((bfd_byte)value & byte_mask);
   4038             mask >>= 8;
   4039             value >>= 8;
   4040           }
   4041       }
   4042 
   4043       if (r != bfd_reloc_ok)
   4044 	{
   4045 	  const char *msg = NULL;
   4046 
   4047 	  switch (r)
   4048 	    {
   4049 	    case bfd_reloc_overflow:
   4050 	      (*info->callbacks->reloc_overflow)
   4051 		(info, (h ? &h->root : NULL), name, howto->name,
   4052 		 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
   4053 	      break;
   4054 
   4055 	    case bfd_reloc_undefined:
   4056 	      (*info->callbacks->undefined_symbol)
   4057 		(info, name, input_bfd, input_section, rel->r_offset, TRUE);
   4058 	      break;
   4059 
   4060 	    case bfd_reloc_outofrange:
   4061 	      msg = _("internal error: out of range error");
   4062 	      break;
   4063 
   4064 	    case bfd_reloc_notsupported:
   4065 	      msg = _("internal error: unsupported relocation error");
   4066 	      break;
   4067 
   4068 	    case bfd_reloc_dangerous:
   4069 	      msg = _("internal error: dangerous relocation");
   4070 	      break;
   4071 
   4072 	    default:
   4073 	      msg = _("internal error: unknown error");
   4074 	      break;
   4075 	    }
   4076 
   4077 	  if (msg)
   4078 	    (*info->callbacks->warning) (info, msg, name, input_bfd,
   4079 					 input_section, rel->r_offset);
   4080 	}
   4081     }
   4082 
   4083   return TRUE;
   4084 }
   4085 
   4086 /* Finish up dynamic symbol handling.  We set the contents of various
   4087    dynamic sections here.  */
   4088 
   4089 bfd_boolean
   4090 tilegx_elf_finish_dynamic_symbol (bfd *output_bfd,
   4091 				  struct bfd_link_info *info,
   4092 				  struct elf_link_hash_entry *h,
   4093 				  Elf_Internal_Sym *sym)
   4094 {
   4095   struct tilegx_elf_link_hash_table *htab;
   4096 
   4097   htab = tilegx_elf_hash_table (info);
   4098   BFD_ASSERT (htab != NULL);
   4099 
   4100   if (h->plt.offset != (bfd_vma) -1)
   4101     {
   4102       asection *splt;
   4103       asection *srela;
   4104       asection *sgotplt;
   4105       Elf_Internal_Rela rela;
   4106       bfd_byte *loc;
   4107       bfd_vma r_offset;
   4108       const struct elf_backend_data *bed = get_elf_backend_data (output_bfd);
   4109 
   4110 
   4111       int rela_index;
   4112 
   4113       /* This symbol has an entry in the PLT.  Set it up.  */
   4114 
   4115       BFD_ASSERT (h->dynindx != -1);
   4116 
   4117       splt = htab->elf.splt;
   4118       srela = htab->elf.srelplt;
   4119       sgotplt = htab->elf.sgotplt;
   4120 
   4121       if (splt == NULL || srela == NULL)
   4122        abort ();
   4123 
   4124       /* Fill in the entry in the procedure linkage table.  */
   4125       rela_index = tilegx_plt_entry_build (output_bfd, htab, splt, sgotplt,
   4126 					   h->plt.offset, &r_offset);
   4127 
   4128       /* Fill in the entry in the global offset table, which initially points
   4129 	 to the beginning of the plt.  */
   4130       TILEGX_ELF_PUT_WORD (htab, output_bfd,
   4131 			   splt->output_section->vma + splt->output_offset,
   4132 			   sgotplt->contents + r_offset);
   4133 
   4134       /* Fill in the entry in the .rela.plt section.  */
   4135       rela.r_offset = (sgotplt->output_section->vma
   4136 		       + sgotplt->output_offset
   4137 		       + r_offset);
   4138       rela.r_addend = 0;
   4139       rela.r_info = TILEGX_ELF_R_INFO (htab, NULL, h->dynindx, R_TILEGX_JMP_SLOT);
   4140 
   4141       loc = srela->contents + rela_index * TILEGX_ELF_RELA_BYTES (htab);
   4142       bed->s->swap_reloca_out (output_bfd, &rela, loc);
   4143 
   4144       if (!h->def_regular)
   4145 	{
   4146 	  /* Mark the symbol as undefined, rather than as defined in
   4147 	     the .plt section.  Leave the value alone.  */
   4148 	  sym->st_shndx = SHN_UNDEF;
   4149 	  /* If the symbol is weak, we do need to clear the value.
   4150 	     Otherwise, the PLT entry would provide a definition for
   4151 	     the symbol even if the symbol wasn't defined anywhere,
   4152 	     and so the symbol would never be NULL.  */
   4153 	  if (!h->ref_regular_nonweak)
   4154 	    sym->st_value = 0;
   4155 	}
   4156     }
   4157 
   4158   if (h->got.offset != (bfd_vma) -1
   4159       && tilegx_elf_hash_entry(h)->tls_type != GOT_TLS_GD
   4160       && tilegx_elf_hash_entry(h)->tls_type != GOT_TLS_IE)
   4161     {
   4162       asection *sgot;
   4163       asection *srela;
   4164       Elf_Internal_Rela rela;
   4165 
   4166       /* This symbol has an entry in the GOT.  Set it up.  */
   4167 
   4168       sgot = htab->elf.sgot;
   4169       srela = htab->elf.srelgot;
   4170       BFD_ASSERT (sgot != NULL && srela != NULL);
   4171 
   4172       rela.r_offset = (sgot->output_section->vma
   4173 		       + sgot->output_offset
   4174 		       + (h->got.offset &~ (bfd_vma) 1));
   4175 
   4176       /* If this is a -Bsymbolic link, and the symbol is defined
   4177 	 locally, we just want to emit a RELATIVE reloc.  Likewise if
   4178 	 the symbol was forced to be local because of a version file.
   4179 	 The entry in the global offset table will already have been
   4180 	 initialized in the relocate_section function.  */
   4181       if (bfd_link_pic (info)
   4182 	  && (info->symbolic || h->dynindx == -1)
   4183 	  && h->def_regular)
   4184 	{
   4185 	  asection *sec = h->root.u.def.section;
   4186 	  rela.r_info = TILEGX_ELF_R_INFO (htab, NULL, 0, R_TILEGX_RELATIVE);
   4187 	  rela.r_addend = (h->root.u.def.value
   4188 			   + sec->output_section->vma
   4189 			   + sec->output_offset);
   4190 	}
   4191       else
   4192 	{
   4193 	  rela.r_info = TILEGX_ELF_R_INFO (htab, NULL, h->dynindx, R_TILEGX_GLOB_DAT);
   4194 	  rela.r_addend = 0;
   4195 	}
   4196 
   4197       TILEGX_ELF_PUT_WORD (htab, output_bfd, 0,
   4198 			   sgot->contents + (h->got.offset & ~(bfd_vma) 1));
   4199       tilegx_elf_append_rela (output_bfd, srela, &rela);
   4200     }
   4201 
   4202   if (h->needs_copy)
   4203     {
   4204       asection *s;
   4205       Elf_Internal_Rela rela;
   4206 
   4207       /* This symbols needs a copy reloc.  Set it up.  */
   4208       BFD_ASSERT (h->dynindx != -1);
   4209 
   4210       s = htab->srelbss;
   4211       BFD_ASSERT (s != NULL);
   4212 
   4213       rela.r_offset = (h->root.u.def.value
   4214 		       + h->root.u.def.section->output_section->vma
   4215 		       + h->root.u.def.section->output_offset);
   4216       rela.r_info = TILEGX_ELF_R_INFO (htab, NULL, h->dynindx, R_TILEGX_COPY);
   4217       rela.r_addend = 0;
   4218       tilegx_elf_append_rela (output_bfd, s, &rela);
   4219     }
   4220 
   4221   /* Mark some specially defined symbols as absolute. */
   4222   if (h == htab->elf.hdynamic
   4223       || (h == htab->elf.hgot || h == htab->elf.hplt))
   4224     sym->st_shndx = SHN_ABS;
   4225 
   4226   return TRUE;
   4227 }
   4228 
   4229 /* Finish up the dynamic sections.  */
   4230 
   4231 static bfd_boolean
   4232 tilegx_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
   4233 		   bfd *dynobj, asection *sdyn,
   4234 		   asection *splt ATTRIBUTE_UNUSED)
   4235 {
   4236   struct tilegx_elf_link_hash_table *htab;
   4237   const struct elf_backend_data *bed;
   4238   bfd_byte *dyncon, *dynconend;
   4239   size_t dynsize;
   4240 
   4241   htab = tilegx_elf_hash_table (info);
   4242   BFD_ASSERT (htab != NULL);
   4243   bed = get_elf_backend_data (output_bfd);
   4244   dynsize = bed->s->sizeof_dyn;
   4245   dynconend = sdyn->contents + sdyn->size;
   4246 
   4247   for (dyncon = sdyn->contents; dyncon < dynconend; dyncon += dynsize)
   4248     {
   4249       Elf_Internal_Dyn dyn;
   4250       asection *s;
   4251 
   4252       bed->s->swap_dyn_in (dynobj, dyncon, &dyn);
   4253 
   4254       switch (dyn.d_tag)
   4255 	{
   4256 	case DT_PLTGOT:
   4257 	  s = htab->elf.sgotplt;
   4258 	  dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
   4259 	  break;
   4260 	case DT_JMPREL:
   4261 	  s = htab->elf.srelplt;
   4262 	  dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
   4263 	  break;
   4264 	case DT_PLTRELSZ:
   4265 	  s = htab->elf.srelplt;
   4266 	  dyn.d_un.d_val = s->size;
   4267 	  break;
   4268 	default:
   4269 	  continue;
   4270 	}
   4271 
   4272       bed->s->swap_dyn_out (output_bfd, &dyn, dyncon);
   4273     }
   4274   return TRUE;
   4275 }
   4276 
   4277 bfd_boolean
   4278 tilegx_elf_finish_dynamic_sections (bfd *output_bfd,
   4279 				    struct bfd_link_info *info)
   4280 {
   4281   bfd *dynobj;
   4282   asection *sdyn;
   4283   struct tilegx_elf_link_hash_table *htab;
   4284   size_t pad_size;
   4285 
   4286   htab = tilegx_elf_hash_table (info);
   4287   BFD_ASSERT (htab != NULL);
   4288   dynobj = htab->elf.dynobj;
   4289 
   4290   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
   4291 
   4292   if (elf_hash_table (info)->dynamic_sections_created)
   4293     {
   4294       asection *splt;
   4295       bfd_boolean ret;
   4296 
   4297       splt = htab->elf.splt;
   4298       BFD_ASSERT (splt != NULL && sdyn != NULL);
   4299 
   4300       ret = tilegx_finish_dyn (output_bfd, info, dynobj, sdyn, splt);
   4301 
   4302       if (ret != TRUE)
   4303 	return ret;
   4304 
   4305       /* Fill in the head and tail entries in the procedure linkage table.  */
   4306       if (splt->size > 0)
   4307 	{
   4308 	  memcpy (splt->contents,
   4309 		  ABI_64_P (output_bfd) ?
   4310 		    tilegx64_plt0_entry : tilegx32_plt0_entry,
   4311 		  PLT_HEADER_SIZE);
   4312 
   4313 	  memcpy (splt->contents + splt->size
   4314 		  - PLT_ENTRY_SIZE + PLT_HEADER_SIZE,
   4315 		  ABI_64_P (output_bfd) ?
   4316 		    tilegx64_plt_tail_entry : tilegx32_plt_tail_entry,
   4317 		  PLT_TAIL_SIZE);
   4318 	  /* Add padding so that the plt section is a multiple of its
   4319 	     entry size.  */
   4320 	  pad_size = PLT_ENTRY_SIZE - PLT_HEADER_SIZE - PLT_TAIL_SIZE;
   4321 	  memset (splt->contents + splt->size - pad_size, 0, pad_size);
   4322 	}
   4323 
   4324       elf_section_data (splt->output_section)->this_hdr.sh_entsize
   4325 	= PLT_ENTRY_SIZE;
   4326     }
   4327 
   4328   if (htab->elf.sgotplt)
   4329     {
   4330       if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
   4331 	{
   4332 	  (*_bfd_error_handler)
   4333 	    (_("discarded output section: `%A'"), htab->elf.sgotplt);
   4334 	  return FALSE;
   4335 	}
   4336 
   4337       if (htab->elf.sgotplt->size > 0)
   4338 	{
   4339 	  /* Write the first two entries in .got.plt, needed for the dynamic
   4340 	     linker.  */
   4341 	  TILEGX_ELF_PUT_WORD (htab, output_bfd, (bfd_vma) -1,
   4342 			       htab->elf.sgotplt->contents);
   4343 	  TILEGX_ELF_PUT_WORD (htab, output_bfd, (bfd_vma) 0,
   4344 			       htab->elf.sgotplt->contents
   4345 			       + GOT_ENTRY_SIZE (htab));
   4346 	}
   4347 
   4348       elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize =
   4349 	GOT_ENTRY_SIZE (htab);
   4350     }
   4351 
   4352   if (htab->elf.sgot)
   4353     {
   4354       if (htab->elf.sgot->size > 0)
   4355 	{
   4356 	  /* Set the first entry in the global offset table to the address of
   4357 	     the dynamic section.  */
   4358 	  bfd_vma val = (sdyn ?
   4359 			 sdyn->output_section->vma + sdyn->output_offset :
   4360 			 0);
   4361 	  TILEGX_ELF_PUT_WORD (htab, output_bfd, val,
   4362 			       htab->elf.sgot->contents);
   4363 	}
   4364 
   4365       elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize =
   4366 	GOT_ENTRY_SIZE (htab);
   4367     }
   4368 
   4369   return TRUE;
   4370 }
   4371 
   4372 
   4373 
   4375 /* Return address for Ith PLT stub in section PLT, for relocation REL
   4376    or (bfd_vma) -1 if it should not be included.  */
   4377 
   4378 bfd_vma
   4379 tilegx_elf_plt_sym_val (bfd_vma i, const asection *plt,
   4380 			const arelent *rel ATTRIBUTE_UNUSED)
   4381 {
   4382   return plt->vma + PLT_HEADER_SIZE + i * PLT_ENTRY_SIZE;
   4383 }
   4384 
   4385 enum elf_reloc_type_class
   4386 tilegx_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
   4387 			 const asection *rel_sec ATTRIBUTE_UNUSED,
   4388 			 const Elf_Internal_Rela *rela)
   4389 {
   4390   switch ((int) TILEGX_ELF_R_TYPE (rela->r_info))
   4391     {
   4392     case R_TILEGX_RELATIVE:
   4393       return reloc_class_relative;
   4394     case R_TILEGX_JMP_SLOT:
   4395       return reloc_class_plt;
   4396     case R_TILEGX_COPY:
   4397       return reloc_class_copy;
   4398     default:
   4399       return reloc_class_normal;
   4400     }
   4401 }
   4402 
   4403 int
   4404 tilegx_additional_program_headers (bfd *abfd,
   4405 				   struct bfd_link_info *info ATTRIBUTE_UNUSED)
   4406 {
   4407   /* Each .intrpt section specified by the user adds another PT_LOAD
   4408      header since the sections are discontiguous. */
   4409   static const char intrpt_sections[4][9] =
   4410     {
   4411       ".intrpt0", ".intrpt1", ".intrpt2", ".intrpt3"
   4412     };
   4413   int count = 0;
   4414   int i;
   4415 
   4416   for (i = 0; i < 4; i++)
   4417     {
   4418       asection *sec = bfd_get_section_by_name (abfd, intrpt_sections[i]);
   4419       if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
   4420 	++count;
   4421     }
   4422 
   4423   /* Add four "padding" headers in to leave room in case a custom linker
   4424      script does something fancy. Otherwise ld complains that it ran
   4425      out of program headers and refuses to link. */
   4426   count += 4;
   4427 
   4428   return count;
   4429 }
   4430 
   4431 
   4432 bfd_boolean
   4433 _bfd_tilegx_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
   4434 {
   4435   const char *targ1 = bfd_get_target (ibfd);
   4436   const char *targ2 = bfd_get_target (obfd);
   4437 
   4438   if (strcmp (targ1, targ2) != 0)
   4439     {
   4440       (*_bfd_error_handler)
   4441 	(_("%B: Cannot link together %s and %s objects."),
   4442 	 ibfd, targ1, targ2);
   4443       bfd_set_error (bfd_error_bad_value);
   4444       return FALSE;
   4445     }
   4446 
   4447   return TRUE;
   4448 }
   4449