OSDN Git Service

daily update
[pf3gnuchains/pf3gnuchains4x.git] / bfd / elf32-tilepro.c
1 /* TILEPro-specific support for 32-bit ELF.
2    Copyright 2011 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 "bfd.h"
22 #include "sysdep.h"
23 #include "libbfd.h"
24 #include "elf-bfd.h"
25 #include "elf/tilepro.h"
26 #include "opcode/tilepro.h"
27 #include "libiberty.h"
28 #include "elf32-tilepro.h"
29
30 #define TILEPRO_BYTES_PER_WORD 4
31
32 static reloc_howto_type tilepro_elf_howto_table [] =
33 {
34   /* This reloc does nothing.  */
35   HOWTO (R_TILEPRO_NONE,        /* type */
36          0,                     /* rightshift */
37          2,                     /* size (0 = byte, 1 = short, 2 = long) */
38          32,                    /* bitsize */
39          FALSE,                 /* pc_relative */
40          0,                     /* bitpos */
41          complain_overflow_bitfield, /* complain_on_overflow */
42          bfd_elf_generic_reloc, /* special_function */
43          "R_TILEPRO_NONE",      /* name */
44          FALSE,                 /* partial_inplace */
45          0,                     /* src_mask */
46          0,                     /* dst_mask */
47          FALSE),                /* pcrel_offset */
48
49   /* A 32 bit absolute relocation.  */
50   HOWTO (R_TILEPRO_32,  /* type */
51          0,                     /* rightshift */
52          2,                     /* size (0 = byte, 1 = short, 2 = long) */
53          32,                    /* bitsize */
54          FALSE,                 /* pc_relative */
55          0,                     /* bitpos */
56          complain_overflow_dont, /* complain_on_overflow */
57          bfd_elf_generic_reloc, /* special_function */
58          "R_TILEPRO_32",        /* name */
59          FALSE,                 /* partial_inplace */
60          0,                     /* src_mask */
61          0xffffffff,            /* dst_mask */
62          FALSE),                /* pcrel_offset */
63
64   /* A 16 bit absolute relocation.  */
65   HOWTO (R_TILEPRO_16,  /* type */
66          0,                     /* rightshift */
67          1,                     /* size (0 = byte, 1 = short, 2 = long) */
68          16,                    /* bitsize */
69          FALSE,                 /* pc_relative */
70          0,                     /* bitpos */
71          complain_overflow_bitfield, /* complain_on_overflow */
72          bfd_elf_generic_reloc, /* special_function */
73          "R_TILEPRO_16",        /* name */
74          FALSE,                 /* partial_inplace */
75          0,                     /* src_mask */
76          0xffff,                /* dst_mask */
77          FALSE),                /* pcrel_offset */
78
79   /* An 8 bit absolute relocation.  */
80   HOWTO (R_TILEPRO_8,   /* type */
81          0,                     /* rightshift */
82          0,                     /* size (0 = byte, 1 = short, 2 = long) */
83          8,                     /* bitsize */
84          FALSE,                 /* pc_relative */
85          0,                     /* bitpos */
86          complain_overflow_unsigned, /* complain_on_overflow */
87          bfd_elf_generic_reloc, /* special_function */
88          "R_TILEPRO_8", /* name */
89          FALSE,                 /* partial_inplace */
90          0,                     /* src_mask */
91          0xff,                  /* dst_mask */
92          FALSE),                /* pcrel_offset */
93
94   /* A 32 bit pc-relative relocation.  */
95   HOWTO (R_TILEPRO_32_PCREL,/* type */
96          0,                     /* rightshift */
97          2,                     /* size (0 = byte, 1 = short, 2 = long) */
98          32,                    /* bitsize */
99          TRUE,                  /* pc_relative */
100          0,                     /* bitpos */
101          complain_overflow_dont, /* complain_on_overflow */
102          bfd_elf_generic_reloc, /* special_function */
103          "R_TILEPRO_32_PCREL", /* name */
104          FALSE,                 /* partial_inplace */
105          0,                     /* src_mask */
106          0xffffffff,            /* dst_mask */
107          TRUE),                 /* pcrel_offset */
108
109   /* A 16 bit pc-relative relocation.  */
110   HOWTO (R_TILEPRO_16_PCREL,/* type */
111          0,                     /* rightshift */
112          1,                     /* size (0 = byte, 1 = short, 2 = long) */
113          16,                    /* bitsize */
114          TRUE,                  /* pc_relative */
115          0,                     /* bitpos */
116          complain_overflow_signed, /* complain_on_overflow */
117          bfd_elf_generic_reloc, /* special_function */
118          "R_TILEPRO_16_PCREL",  /* name */
119          FALSE,                 /* partial_inplace */
120          0,                     /* src_mask */
121          0xffff,                /* dst_mask */
122          TRUE),                 /* pcrel_offset */
123
124   /* An 8 bit pc-relative relocation.  */
125   HOWTO (R_TILEPRO_8_PCREL,     /* type */
126          0,                     /* rightshift */
127          0,                     /* size (0 = byte, 1 = short, 2 = long) */
128          8,                     /* bitsize */
129          TRUE,                  /* pc_relative */
130          0,                     /* bitpos */
131          complain_overflow_signed, /* complain_on_overflow */
132          bfd_elf_generic_reloc, /* special_function */
133          "R_TILEPRO_8_PCREL",/* name */
134          FALSE,                 /* partial_inplace */
135          0,                     /* src_mask */
136          0xff,                  /* dst_mask */
137          TRUE),                 /* pcrel_offset */
138
139   /* A 16 bit relocation without overflow.  */
140   HOWTO (R_TILEPRO_LO16,        /* type */
141          0,                     /* rightshift */
142          1,                     /* size (0 = byte, 1 = short, 2 = long) */
143          16,                    /* bitsize */
144          FALSE,                 /* pc_relative */
145          0,                     /* bitpos */
146          complain_overflow_dont,/* complain_on_overflow */
147          bfd_elf_generic_reloc, /* special_function */
148          "R_TILEPRO_LO16",      /* name */
149          FALSE,                 /* partial_inplace */
150          0,                     /* src_mask */
151          0xffff,                /* dst_mask */
152          FALSE),                /* pcrel_offset */
153
154   /* The high order 16 bits of an address.  */
155   HOWTO (R_TILEPRO_HI16,        /* type */
156          16,                    /* rightshift */
157          1,                     /* size (0 = byte, 1 = short, 2 = long) */
158          16,                    /* bitsize */
159          FALSE,                 /* pc_relative */
160          0,                     /* bitpos */
161          complain_overflow_dont, /* complain_on_overflow */
162          bfd_elf_generic_reloc, /* special_function */
163          "R_TILEPRO_HI16",      /* name */
164          FALSE,                 /* partial_inplace */
165          0,                     /* src_mask */
166          0xffff,                /* dst_mask */
167          FALSE),                /* pcrel_offset */
168
169   /* The high order 16 bits of an address, plus 1 if the contents of
170      the low 16 bits, treated as a signed number, is negative.  */
171   HOWTO (R_TILEPRO_HA16,        /* type */
172          16,                    /* rightshift */
173          1,                     /* size (0 = byte, 1 = short, 2 = long) */
174          16,                    /* bitsize */
175          FALSE,                 /* pc_relative */
176          0,                     /* bitpos */
177          complain_overflow_dont, /* complain_on_overflow */
178          bfd_elf_generic_reloc, /* special_function */
179          "R_TILEPRO_HA16",  /* name */
180          FALSE,                 /* partial_inplace */
181          0,                     /* src_mask */
182          0xffff,                /* dst_mask */
183          FALSE),                /* pcrel_offset */
184
185   HOWTO (R_TILEPRO_COPY,                /* type */
186          0,                     /* rightshift */
187          0,                     /* size (0 = byte, 1 = short, 2 = long) */
188          0,                     /* bitsize */
189          FALSE,                 /* pc_relative */
190          0,                     /* bitpos */
191          complain_overflow_dont, /* complain_on_overflow */
192          bfd_elf_generic_reloc, /* special_function */
193          "R_TILEPRO_COPY",              /* name */
194          FALSE,                 /* partial_inplace */
195          0,                     /* src_mask */
196          0,                     /* dst_mask */
197          TRUE),                 /* pcrel_offset */
198
199   HOWTO (R_TILEPRO_GLOB_DAT,    /* type */
200          0,                     /* rightshift */
201          0,                     /* size (0 = byte, 1 = short, 2 = long) */
202          0,                     /* bitsize */
203          FALSE,                 /* pc_relative */
204          0,                     /* bitpos */
205          complain_overflow_dont, /* complain_on_overflow */
206          bfd_elf_generic_reloc, /* special_function */
207          "R_TILEPRO_GLOB_DAT",  /* name */
208          FALSE,                 /* partial_inplace */
209          0,                     /* src_mask */
210          0,                     /* dst_mask */
211          TRUE),                 /* pcrel_offset */
212
213   HOWTO (R_TILEPRO_JMP_SLOT,    /* type */
214          0,                     /* rightshift */
215          0,                     /* size (0 = byte, 1 = short, 2 = long) */
216          0,                     /* bitsize */
217          FALSE,                 /* pc_relative */
218          0,                     /* bitpos */
219          complain_overflow_dont, /* complain_on_overflow */
220          bfd_elf_generic_reloc, /* special_function */
221          "R_TILEPRO_JMP_SLOT",  /* name */
222          FALSE,                 /* partial_inplace */
223          0,                     /* src_mask */
224          0,                     /* dst_mask */
225          TRUE),                 /* pcrel_offset */
226
227   HOWTO (R_TILEPRO_RELATIVE,    /* type */
228          0,                     /* rightshift */
229          0,                     /* size (0 = byte, 1 = short, 2 = long) */
230          0,                     /* bitsize */
231          FALSE,                 /* pc_relative */
232          0,                     /* bitpos */
233          complain_overflow_dont, /* complain_on_overflow */
234          bfd_elf_generic_reloc, /* special_function */
235          "R_TILEPRO_RELATIVE",  /* name */
236          FALSE,                 /* partial_inplace */
237          0,                     /* src_mask */
238          0,                     /* dst_mask */
239          TRUE),                 /* pcrel_offset */
240
241   HOWTO (R_TILEPRO_BROFF_X1, /* type */
242          TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */
243          2,                     /* size (0 = byte, 1 = short, 2 = long) */
244          17,                    /* bitsize */
245          TRUE,                  /* pc_relative */
246          0,                     /* bitpos */
247          complain_overflow_signed, /* complain_on_overflow */
248          bfd_elf_generic_reloc, /* special_function */
249          "R_TILEPRO_BROFF_X1", /* name */
250          FALSE,                 /* partial_inplace */
251          0,                     /* src_mask */
252          -1,                    /* dst_mask */
253          TRUE),                 /* pcrel_offset */
254
255   HOWTO (R_TILEPRO_JOFFLONG_X1, /* type */
256          TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */
257          2,                     /* size (0 = byte, 1 = short, 2 = long) */
258          29,                    /* bitsize */
259          TRUE,                  /* pc_relative */
260          0,                     /* bitpos */
261          complain_overflow_signed,/* complain_on_overflow */
262          bfd_elf_generic_reloc, /* special_function */
263          "R_TILEPRO_JOFFLONG_X1", /* name */
264          FALSE,                 /* partial_inplace */
265          0,                     /* src_mask */
266          -1,                    /* dst_mask */
267          TRUE),                 /* pcrel_offset */
268
269   HOWTO (R_TILEPRO_JOFFLONG_X1_PLT, /* type */
270          TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */
271          2,                     /* size (0 = byte, 1 = short, 2 = long) */
272          29,                    /* bitsize */
273          TRUE,                  /* pc_relative */
274          0,                     /* bitpos */
275          complain_overflow_signed,/* complain_on_overflow */
276          bfd_elf_generic_reloc, /* special_function */
277          "R_TILEPRO_JOFFLONG_X1_PLT", /* name */
278          FALSE,                 /* partial_inplace */
279          0,                     /* src_mask */
280          -1,                    /* dst_mask */
281          TRUE),                 /* pcrel_offset */
282
283 #define TILEPRO_IMM_HOWTO(name, size, bitsize) \
284   HOWTO (name, 0, size, bitsize, FALSE, 0, \
285          complain_overflow_signed, bfd_elf_generic_reloc, \
286          #name, FALSE, 0, -1, FALSE)
287
288 #define TILEPRO_UIMM_HOWTO(name, size, bitsize) \
289   HOWTO (name, 0, size, bitsize, FALSE, 0, \
290          complain_overflow_unsigned, bfd_elf_generic_reloc, \
291          #name, FALSE, 0, -1, FALSE)
292
293   TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_X0,  0,  8),
294   TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_Y0,  0,  8),
295   TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_X1,  0,  8),
296   TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_Y1,  0,  8),
297   TILEPRO_UIMM_HOWTO(R_TILEPRO_MT_IMM15_X1, 1,  15),
298   TILEPRO_UIMM_HOWTO(R_TILEPRO_MF_IMM15_X1, 1,  15),
299   TILEPRO_IMM_HOWTO(R_TILEPRO_IMM16_X0, 1, 16),
300   TILEPRO_IMM_HOWTO(R_TILEPRO_IMM16_X1, 1, 16),
301
302 #define TILEPRO_IMM16_HOWTO(name, rshift) \
303   HOWTO (name, rshift, 1, 16, FALSE, 0, \
304          complain_overflow_dont, bfd_elf_generic_reloc, \
305          #name, FALSE, 0, 0xffff, FALSE)
306
307   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_LO,  0),
308   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_LO,  0),
309   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_HI, 16),
310   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_HI, 16),
311   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_HA, 16),
312   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_HA, 16),
313
314   /* PC-relative offsets. */
315
316   HOWTO (R_TILEPRO_IMM16_X0_PCREL,      /* type */
317          0,                     /* rightshift */
318          1,                     /* size (0 = byte, 1 = short, 2 = long) */
319          16,                    /* bitsize */
320          TRUE,                  /* pc_relative */
321          0,                     /* bitpos */
322          complain_overflow_signed, /* complain_on_overflow */
323          bfd_elf_generic_reloc, /* special_function */
324          "R_TILEPRO_IMM16_X0_PCREL",/* name */
325          FALSE,                 /* partial_inplace */
326          0,                     /* src_mask */
327          -1,                    /* dst_mask */
328          TRUE),                 /* pcrel_offset */
329
330   HOWTO (R_TILEPRO_IMM16_X1_PCREL,      /* type */
331          0,                     /* rightshift */
332          1,                     /* size (0 = byte, 1 = short, 2 = long) */
333          16,                    /* bitsize */
334          TRUE,                  /* pc_relative */
335          0,                     /* bitpos */
336          complain_overflow_signed, /* complain_on_overflow */
337          bfd_elf_generic_reloc, /* special_function */
338          "R_TILEPRO_IMM16_X1_PCREL",/* name */
339          FALSE,                 /* partial_inplace */
340          0,                     /* src_mask */
341          -1,                    /* dst_mask */
342          TRUE),                 /* pcrel_offset */
343
344 #define TILEPRO_IMM16_HOWTO_PCREL(name, rshift) \
345   HOWTO (name, rshift, 1, 16, TRUE, 0, \
346          complain_overflow_dont, bfd_elf_generic_reloc, \
347          #name, FALSE, 0, 0xffff, TRUE)
348
349   TILEPRO_IMM16_HOWTO_PCREL (R_TILEPRO_IMM16_X0_LO_PCREL,  0),
350   TILEPRO_IMM16_HOWTO_PCREL (R_TILEPRO_IMM16_X1_LO_PCREL,  0),
351   TILEPRO_IMM16_HOWTO_PCREL (R_TILEPRO_IMM16_X0_HI_PCREL, 16),
352   TILEPRO_IMM16_HOWTO_PCREL (R_TILEPRO_IMM16_X1_HI_PCREL, 16),
353   TILEPRO_IMM16_HOWTO_PCREL (R_TILEPRO_IMM16_X0_HA_PCREL, 16),
354   TILEPRO_IMM16_HOWTO_PCREL (R_TILEPRO_IMM16_X1_HA_PCREL, 16),
355
356   /* Byte offset into GOT for a particular symbol. */
357   TILEPRO_IMM_HOWTO(R_TILEPRO_IMM16_X0_GOT, 1, 16),
358   TILEPRO_IMM_HOWTO(R_TILEPRO_IMM16_X1_GOT, 1, 16),
359   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_GOT_LO,  0),
360   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_GOT_LO,  0),
361   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_GOT_HI, 16),
362   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_GOT_HI, 16),
363   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_GOT_HA, 16),
364   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_GOT_HA, 16),
365
366   TILEPRO_UIMM_HOWTO(R_TILEPRO_MMSTART_X0, 0, 5),
367   TILEPRO_UIMM_HOWTO(R_TILEPRO_MMEND_X0,   0, 5),
368   TILEPRO_UIMM_HOWTO(R_TILEPRO_MMSTART_X1, 0, 5),
369   TILEPRO_UIMM_HOWTO(R_TILEPRO_MMEND_X1,   0, 5),
370
371   TILEPRO_UIMM_HOWTO(R_TILEPRO_SHAMT_X0, 0, 5),
372   TILEPRO_UIMM_HOWTO(R_TILEPRO_SHAMT_X1, 0, 5),
373   TILEPRO_UIMM_HOWTO(R_TILEPRO_SHAMT_Y0, 0, 5),
374   TILEPRO_UIMM_HOWTO(R_TILEPRO_SHAMT_Y1, 0, 5),
375
376   TILEPRO_IMM_HOWTO(R_TILEPRO_DEST_IMM8_X1, 0, 8),
377
378   /* These relocs are currently not defined.  */
379   EMPTY_HOWTO (56),
380   EMPTY_HOWTO (57),
381   EMPTY_HOWTO (58),
382   EMPTY_HOWTO (59),
383   EMPTY_HOWTO (60),
384   EMPTY_HOWTO (61),
385   EMPTY_HOWTO (62),
386   EMPTY_HOWTO (63),
387   EMPTY_HOWTO (64),
388   EMPTY_HOWTO (65),
389
390   /* Offsets into the GOT of TLS Descriptors. */
391
392   HOWTO (R_TILEPRO_IMM16_X0_TLS_GD,/* type */
393          0,                     /* rightshift */
394          1,                     /* size (0 = byte, 1 = short, 2 = long) */
395          16,                    /* bitsize */
396          FALSE,                 /* pc_relative */
397          0,                     /* bitpos */
398          complain_overflow_signed, /* complain_on_overflow */
399          bfd_elf_generic_reloc, /* special_function */
400          "R_TILEPRO_IMM16_X0_TLS_GD",/* name */
401          FALSE,                 /* partial_inplace */
402          0,                     /* src_mask */
403          0xffff,                /* dst_mask */
404          FALSE),                /* pcrel_offset */
405
406   HOWTO (R_TILEPRO_IMM16_X1_TLS_GD,/* type */
407          0,                     /* rightshift */
408          1,                     /* size (0 = byte, 1 = short, 2 = long) */
409          16,                    /* bitsize */
410          FALSE,                 /* pc_relative */
411          0,                     /* bitpos */
412          complain_overflow_signed, /* complain_on_overflow */
413          bfd_elf_generic_reloc, /* special_function */
414          "R_TILEPRO_IMM16_X1_TLS_GD",/* name */
415          FALSE,                 /* partial_inplace */
416          0,                     /* src_mask */
417          0xffff,                /* dst_mask */
418          FALSE),                /* pcrel_offset */
419
420   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_GD_LO,  0),
421   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_GD_LO,  0),
422   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_GD_HI, 16),
423   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_GD_HI, 16),
424   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_GD_HA, 16),
425   TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_GD_HA, 16),
426
427   /* Offsets into the GOT of TLS Descriptors. */
428
429   HOWTO (R_TILEPRO_IMM16_X0_TLS_IE,/* type */
430          0,                     /* rightshift */
431          1,                     /* size (0 = byte, 1 = short, 2 = long) */
432          16,                    /* bitsize */
433          FALSE,                 /* pc_relative */
434          0,                     /* bitpos */
435          complain_overflow_signed, /* complain_on_overflow */
436          bfd_elf_generic_reloc, /* special_function */
437          "R_TILEPRO_IMM16_X0_TLS_IE",/* name */
438          FALSE,                 /* partial_inplace */
439          0,                     /* src_mask */
440          -1,                    /* dst_mask */
441          TRUE),                 /* pcrel_offset */
442
443   HOWTO (R_TILEPRO_IMM16_X1_TLS_IE,/* type */
444          0,                     /* rightshift */
445          1,                     /* size (0 = byte, 1 = short, 2 = long) */
446          16,                    /* bitsize */
447          FALSE,                 /* pc_relative */
448          0,                     /* bitpos */
449          complain_overflow_signed, /* complain_on_overflow */
450          bfd_elf_generic_reloc, /* special_function */
451          "R_TILEPRO_IMM16_X1_TLS_IE",/* name */
452          FALSE,                 /* partial_inplace */
453          0,                     /* src_mask */
454          -1,                    /* dst_mask */
455          TRUE),                 /* pcrel_offset */
456
457 #define TILEPRO_IMM16_HOWTO_TLS_IE(name, rshift) \
458   HOWTO (name, rshift, 1, 16, FALSE, 0, \
459          complain_overflow_dont, bfd_elf_generic_reloc, \
460          #name, FALSE, 0, 0xffff, TRUE)
461
462   TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X0_TLS_IE_LO,  0),
463   TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X1_TLS_IE_LO,  0),
464   TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X0_TLS_IE_HI, 16),
465   TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X1_TLS_IE_HI, 16),
466   TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X0_TLS_IE_HA, 16),
467   TILEPRO_IMM16_HOWTO_TLS_IE (R_TILEPRO_IMM16_X1_TLS_IE_HA, 16),
468
469   /* These are common with the Solaris TLS implementation. */
470   HOWTO(R_TILEPRO_TLS_DTPMOD32, 0, 0, 0, FALSE, 0, complain_overflow_dont,
471         bfd_elf_generic_reloc, "R_TILEPRO_TLS_DTPMOD32",
472         FALSE, 0, 0, TRUE),
473   HOWTO(R_TILEPRO_TLS_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield,
474         bfd_elf_generic_reloc, "R_TILEPRO_TLS_DTPOFF32",
475         FALSE, 0, 0xFFFFFFFF, TRUE),
476   HOWTO(R_TILEPRO_TLS_TPOFF32, 0, 0, 0, FALSE, 0, complain_overflow_dont,
477         bfd_elf_generic_reloc, "R_TILEPRO_TLS_TPOFF32",
478         FALSE, 0, 0, TRUE)
479
480 };
481
482 static reloc_howto_type tilepro_elf_howto_table2 [] =
483 {
484   /* GNU extension to record C++ vtable hierarchy */
485   HOWTO (R_TILEPRO_GNU_VTINHERIT, /* type */
486          0,                     /* rightshift */
487          2,                     /* size (0 = byte, 1 = short, 2 = long) */
488          0,                     /* bitsize */
489          FALSE,                 /* pc_relative */
490          0,                     /* bitpos */
491          complain_overflow_dont, /* complain_on_overflow */
492          NULL,                  /* special_function */
493          "R_TILEPRO_GNU_VTINHERIT", /* name */
494          FALSE,                 /* partial_inplace */
495          0,                     /* src_mask */
496          0,                     /* dst_mask */
497          FALSE),                /* pcrel_offset */
498
499   /* GNU extension to record C++ vtable member usage */
500   HOWTO (R_TILEPRO_GNU_VTENTRY,     /* type */
501          0,                     /* rightshift */
502          2,                     /* size (0 = byte, 1 = short, 2 = long) */
503          0,                     /* bitsize */
504          FALSE,                 /* pc_relative */
505          0,                     /* bitpos */
506          complain_overflow_dont, /* complain_on_overflow */
507          _bfd_elf_rel_vtable_reloc_fn,  /* special_function */
508          "R_TILEPRO_GNU_VTENTRY",   /* name */
509          FALSE,                 /* partial_inplace */
510          0,                     /* src_mask */
511          0,                     /* dst_mask */
512          FALSE),                /* pcrel_offset */
513
514 };
515 \f
516 /* Map BFD reloc types to TILEPRO ELF reloc types.  */
517
518 typedef struct tilepro_reloc_map
519 {
520   bfd_reloc_code_real_type  bfd_reloc_val;
521   unsigned int              tilepro_reloc_val;
522   reloc_howto_type *        table;
523 } reloc_map;
524
525 static const reloc_map tilepro_reloc_map [] =
526 {
527 #define TH_REMAP(bfd, tilepro) \
528   { bfd, tilepro, tilepro_elf_howto_table },
529
530   /* Standard relocations. */
531   TH_REMAP (BFD_RELOC_NONE,                    R_TILEPRO_NONE)
532   TH_REMAP (BFD_RELOC_32,                      R_TILEPRO_32)
533   TH_REMAP (BFD_RELOC_16,                      R_TILEPRO_16)
534   TH_REMAP (BFD_RELOC_8,                       R_TILEPRO_8)
535   TH_REMAP (BFD_RELOC_32_PCREL,                R_TILEPRO_32_PCREL)
536   TH_REMAP (BFD_RELOC_16_PCREL,                R_TILEPRO_16_PCREL)
537   TH_REMAP (BFD_RELOC_8_PCREL,                 R_TILEPRO_8_PCREL)
538   TH_REMAP (BFD_RELOC_LO16,                    R_TILEPRO_LO16)
539   TH_REMAP (BFD_RELOC_HI16,                    R_TILEPRO_HI16)
540   TH_REMAP (BFD_RELOC_HI16_S,                  R_TILEPRO_HA16)
541
542   /* Custom relocations. */
543   TH_REMAP (BFD_RELOC_TILEPRO_COPY,            R_TILEPRO_COPY)
544   TH_REMAP (BFD_RELOC_TILEPRO_GLOB_DAT,        R_TILEPRO_GLOB_DAT)
545   TH_REMAP (BFD_RELOC_TILEPRO_JMP_SLOT,        R_TILEPRO_JMP_SLOT)
546   TH_REMAP (BFD_RELOC_TILEPRO_RELATIVE,        R_TILEPRO_RELATIVE)
547   TH_REMAP (BFD_RELOC_TILEPRO_BROFF_X1,        R_TILEPRO_BROFF_X1)
548   TH_REMAP (BFD_RELOC_TILEPRO_JOFFLONG_X1,     R_TILEPRO_JOFFLONG_X1)
549   TH_REMAP (BFD_RELOC_TILEPRO_JOFFLONG_X1_PLT, R_TILEPRO_JOFFLONG_X1_PLT)
550   TH_REMAP (BFD_RELOC_TILEPRO_IMM8_X0,         R_TILEPRO_IMM8_X0)
551   TH_REMAP (BFD_RELOC_TILEPRO_IMM8_Y0,         R_TILEPRO_IMM8_Y0)
552   TH_REMAP (BFD_RELOC_TILEPRO_IMM8_X1,         R_TILEPRO_IMM8_X1)
553   TH_REMAP (BFD_RELOC_TILEPRO_IMM8_Y1,         R_TILEPRO_IMM8_Y1)
554   TH_REMAP (BFD_RELOC_TILEPRO_DEST_IMM8_X1,    R_TILEPRO_DEST_IMM8_X1)
555   TH_REMAP (BFD_RELOC_TILEPRO_MT_IMM15_X1,     R_TILEPRO_MT_IMM15_X1)
556   TH_REMAP (BFD_RELOC_TILEPRO_MF_IMM15_X1,     R_TILEPRO_MF_IMM15_X1)
557   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0,        R_TILEPRO_IMM16_X0)
558   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1,        R_TILEPRO_IMM16_X1)
559   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_LO,     R_TILEPRO_IMM16_X0_LO)
560   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_LO,     R_TILEPRO_IMM16_X1_LO)
561   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_HI,     R_TILEPRO_IMM16_X0_HI)
562   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_HI,     R_TILEPRO_IMM16_X1_HI)
563   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_HA,     R_TILEPRO_IMM16_X0_HA)
564   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_HA,     R_TILEPRO_IMM16_X1_HA)
565
566   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_PCREL,    R_TILEPRO_IMM16_X0_PCREL)
567   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_PCREL,    R_TILEPRO_IMM16_X1_PCREL)
568   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_LO_PCREL, R_TILEPRO_IMM16_X0_LO_PCREL)
569   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_LO_PCREL, R_TILEPRO_IMM16_X1_LO_PCREL)
570   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_HI_PCREL, R_TILEPRO_IMM16_X0_HI_PCREL)
571   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_HI_PCREL, R_TILEPRO_IMM16_X1_HI_PCREL)
572   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_HA_PCREL, R_TILEPRO_IMM16_X0_HA_PCREL)
573   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_HA_PCREL, R_TILEPRO_IMM16_X1_HA_PCREL)
574
575   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_GOT, R_TILEPRO_IMM16_X0_GOT)
576   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_GOT, R_TILEPRO_IMM16_X1_GOT)
577   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_GOT_LO, R_TILEPRO_IMM16_X0_GOT_LO)
578   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_GOT_LO, R_TILEPRO_IMM16_X1_GOT_LO)
579   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_GOT_HI, R_TILEPRO_IMM16_X0_GOT_HI)
580   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_GOT_HI, R_TILEPRO_IMM16_X1_GOT_HI)
581   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_GOT_HA, R_TILEPRO_IMM16_X0_GOT_HA)
582   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_GOT_HA, R_TILEPRO_IMM16_X1_GOT_HA)
583
584   TH_REMAP (BFD_RELOC_TILEPRO_MMSTART_X0,  R_TILEPRO_MMSTART_X0)
585   TH_REMAP (BFD_RELOC_TILEPRO_MMEND_X0,    R_TILEPRO_MMEND_X0)
586   TH_REMAP (BFD_RELOC_TILEPRO_MMSTART_X1,  R_TILEPRO_MMSTART_X1)
587   TH_REMAP (BFD_RELOC_TILEPRO_MMEND_X1,    R_TILEPRO_MMEND_X1)
588   TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_X0,    R_TILEPRO_SHAMT_X0)
589   TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_X1,    R_TILEPRO_SHAMT_X1)
590   TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_Y0,    R_TILEPRO_SHAMT_Y0)
591   TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_Y1,    R_TILEPRO_SHAMT_Y1)
592
593   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD,    R_TILEPRO_IMM16_X0_TLS_GD)
594   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD,    R_TILEPRO_IMM16_X1_TLS_GD)
595   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO, R_TILEPRO_IMM16_X0_TLS_GD_LO)
596   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_LO, R_TILEPRO_IMM16_X1_TLS_GD_LO)
597   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HI, R_TILEPRO_IMM16_X0_TLS_GD_HI)
598   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HI, R_TILEPRO_IMM16_X1_TLS_GD_HI)
599   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HA, R_TILEPRO_IMM16_X0_TLS_GD_HA)
600   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HA, R_TILEPRO_IMM16_X1_TLS_GD_HA)
601
602   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE,    R_TILEPRO_IMM16_X0_TLS_IE)
603   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE,    R_TILEPRO_IMM16_X1_TLS_IE)
604   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_LO, R_TILEPRO_IMM16_X0_TLS_IE_LO)
605   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_LO, R_TILEPRO_IMM16_X1_TLS_IE_LO)
606   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HI, R_TILEPRO_IMM16_X0_TLS_IE_HI)
607   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HI, R_TILEPRO_IMM16_X1_TLS_IE_HI)
608   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HA, R_TILEPRO_IMM16_X0_TLS_IE_HA)
609   TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HA, R_TILEPRO_IMM16_X1_TLS_IE_HA)
610
611   TH_REMAP (BFD_RELOC_TILEPRO_TLS_DTPMOD32, R_TILEPRO_TLS_DTPMOD32)
612   TH_REMAP (BFD_RELOC_TILEPRO_TLS_DTPOFF32, R_TILEPRO_TLS_DTPOFF32)
613   TH_REMAP (BFD_RELOC_TILEPRO_TLS_TPOFF32,  R_TILEPRO_TLS_TPOFF32)
614
615 #undef TH_REMAP
616
617   { BFD_RELOC_VTABLE_INHERIT, R_TILEPRO_GNU_VTINHERIT, tilepro_elf_howto_table2 },
618   { BFD_RELOC_VTABLE_ENTRY,   R_TILEPRO_GNU_VTENTRY,   tilepro_elf_howto_table2 },
619 };
620
621
622
623 /* The TILEPro linker needs to keep track of the number of relocs that it
624    decides to copy as dynamic relocs in check_relocs for each symbol.
625    This is so that it can later discard them if they are found to be
626    unnecessary.  We store the information in a field extending the
627    regular ELF linker hash table.  */
628
629 struct tilepro_elf_dyn_relocs
630 {
631   struct tilepro_elf_dyn_relocs *next;
632
633   /* The input section of the reloc.  */
634   asection *sec;
635
636   /* Total number of relocs copied for the input section.  */
637   bfd_size_type count;
638
639   /* Number of pc-relative relocs copied for the input section.  */
640   bfd_size_type pc_count;
641 };
642
643 /* TILEPRO ELF linker hash entry.  */
644
645 struct tilepro_elf_link_hash_entry
646 {
647   struct elf_link_hash_entry elf;
648
649   /* Track dynamic relocs copied for this symbol.  */
650   struct tilepro_elf_dyn_relocs *dyn_relocs;
651
652 #define GOT_UNKNOWN     0
653 #define GOT_NORMAL      1
654 #define GOT_TLS_GD      2
655 #define GOT_TLS_IE      4
656   unsigned char tls_type;
657 };
658
659 #define tilepro_elf_hash_entry(ent) \
660   ((struct tilepro_elf_link_hash_entry *)(ent))
661
662 struct _bfd_tilepro_elf_obj_tdata
663 {
664   struct elf_obj_tdata root;
665
666   /* tls_type for each local got entry.  */
667   char *local_got_tls_type;
668 };
669
670 #define _bfd_tilepro_elf_tdata(abfd) \
671   ((struct _bfd_tilepro_elf_obj_tdata *) (abfd)->tdata.any)
672
673 #define _bfd_tilepro_elf_local_got_tls_type(abfd) \
674   (_bfd_tilepro_elf_tdata (abfd)->local_got_tls_type)
675
676 #define is_tilepro_elf(bfd)                             \
677   (bfd_get_flavour (bfd) == bfd_target_elf_flavour      \
678    && elf_tdata (bfd) != NULL                           \
679    && elf_object_id (bfd) == TILEPRO_ELF_DATA)
680
681 #include "elf/common.h"
682 #include "elf/internal.h"
683
684 struct tilepro_elf_link_hash_table
685 {
686   struct elf_link_hash_table elf;
687
688   /* Short-cuts to get to dynamic linker sections.  */
689   asection *sdynbss;
690   asection *srelbss;
691
692   /* Small local sym to section mapping cache.  */
693   struct sym_cache sym_cache;
694 };
695
696 /* Get the Tilepro ELF linker hash table from a link_info structure.  */
697 #define tilepro_elf_hash_table(p) \
698   (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
699   == TILEPRO_ELF_DATA \
700   ? ((struct tilepro_elf_link_hash_table *) ((p)->hash)) : NULL)
701
702 static reloc_howto_type *
703 tilepro_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
704                            bfd_reloc_code_real_type code)
705 {
706   unsigned int i;
707
708   for (i = ARRAY_SIZE (tilepro_reloc_map); --i;)
709     {
710       const reloc_map * entry;
711
712       entry = tilepro_reloc_map + i;
713
714       if (entry->bfd_reloc_val == code)
715         return entry->table + (entry->tilepro_reloc_val
716                                - entry->table[0].type);
717     }
718
719   return NULL;
720 }
721
722 static reloc_howto_type *
723 tilepro_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
724                            const char *r_name)
725 {
726   unsigned int i;
727
728   for (i = 0;
729        i < (sizeof (tilepro_elf_howto_table)
730             / sizeof (tilepro_elf_howto_table[0]));
731        i++)
732     if (tilepro_elf_howto_table[i].name != NULL
733         && strcasecmp (tilepro_elf_howto_table[i].name, r_name) == 0)
734       return &tilepro_elf_howto_table[i];
735
736   return NULL;
737 }
738
739 /* Set the howto pointer for an TILEPro ELF reloc.  */
740
741 static void
742 tilepro_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
743                             arelent * cache_ptr,
744                             Elf_Internal_Rela * dst)
745 {
746   unsigned int r_type = ELF32_R_TYPE (dst->r_info);
747
748   if (r_type <= (unsigned int) R_TILEPRO_TLS_TPOFF32)
749     cache_ptr->howto = &tilepro_elf_howto_table [r_type];
750   else if (r_type - R_TILEPRO_GNU_VTINHERIT
751            <= (unsigned int) R_TILEPRO_GNU_VTENTRY)
752     cache_ptr->howto
753       = &tilepro_elf_howto_table2 [r_type - R_TILEPRO_GNU_VTINHERIT];
754   else
755     abort ();
756 }
757
758 typedef tilepro_bundle_bits (*tilepro_create_func)(int);
759
760 static const tilepro_create_func reloc_to_create_func[] =
761 {
762   /* The first fourteen relocation types don't correspond to operands */
763   NULL,
764   NULL,
765   NULL,
766   NULL,
767   NULL,
768   NULL,
769   NULL,
770   NULL,
771   NULL,
772   NULL,
773   NULL,
774   NULL,
775   NULL,
776   NULL,
777
778   /* The remaining relocations are used for immediate operands */
779   create_BrOff_X1,
780   create_JOffLong_X1,
781   create_JOffLong_X1,
782   create_Imm8_X0,
783   create_Imm8_Y0,
784   create_Imm8_X1,
785   create_Imm8_Y1,
786   create_MT_Imm15_X1,
787   create_MF_Imm15_X1,
788   create_Imm16_X0,
789   create_Imm16_X1,
790   create_Imm16_X0,
791   create_Imm16_X1,
792   create_Imm16_X0,
793   create_Imm16_X1,
794   create_Imm16_X0,
795   create_Imm16_X1,
796   create_Imm16_X0,
797   create_Imm16_X1,
798   create_Imm16_X0,
799   create_Imm16_X1,
800   create_Imm16_X0,
801   create_Imm16_X1,
802   create_Imm16_X0,
803   create_Imm16_X1,
804   create_Imm16_X0,
805   create_Imm16_X1,
806   create_Imm16_X0,
807   create_Imm16_X1,
808   create_Imm16_X0,
809   create_Imm16_X1,
810   create_Imm16_X0,
811   create_Imm16_X1,
812   create_MMStart_X0,
813   create_MMEnd_X0,
814   create_MMStart_X1,
815   create_MMEnd_X1,
816   create_ShAmt_X0,
817   create_ShAmt_X1,
818   create_ShAmt_Y0,
819   create_ShAmt_Y1,
820
821   create_Dest_Imm8_X1,
822   NULL,
823   NULL,
824   NULL,
825   NULL,
826   NULL,
827   NULL,
828   NULL,
829   NULL,
830   NULL,
831   NULL,
832
833   create_Imm16_X0,
834   create_Imm16_X1,
835   create_Imm16_X0,
836   create_Imm16_X1,
837   create_Imm16_X0,
838   create_Imm16_X1,
839   create_Imm16_X0,
840   create_Imm16_X1,
841   create_Imm16_X0,
842   create_Imm16_X1,
843   create_Imm16_X0,
844   create_Imm16_X1,
845   create_Imm16_X0,
846   create_Imm16_X1,
847   create_Imm16_X0,
848   create_Imm16_X1
849 };
850
851 #define NELEMS(a)       ((int) (sizeof (a) / sizeof ((a)[0])))
852
853 /* Support for core dump NOTE sections.  */
854
855 static bfd_boolean
856 tilepro_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
857 {
858   int offset;
859   size_t size;
860
861   if (note->descsz != TILEPRO_PRSTATUS_SIZEOF)
862     return FALSE;
863
864   /* pr_cursig */
865   elf_tdata (abfd)->core_signal =
866     bfd_get_16 (abfd, note->descdata + TILEPRO_PRSTATUS_OFFSET_PR_CURSIG);
867
868   /* pr_pid */
869   elf_tdata (abfd)->core_pid =
870     bfd_get_32 (abfd, note->descdata + TILEPRO_PRSTATUS_OFFSET_PR_PID);
871
872   /* pr_reg */
873   offset = TILEPRO_PRSTATUS_OFFSET_PR_REG;
874   size   = TILEPRO_GREGSET_T_SIZE;
875
876   /* Make a ".reg/999" section.  */
877   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
878                                           size, note->descpos + offset);
879 }
880
881 static bfd_boolean
882 tilepro_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
883 {
884   if (note->descsz != TILEPRO_PRPSINFO_SIZEOF)
885     return FALSE;
886
887   elf_tdata (abfd)->core_program
888     = _bfd_elfcore_strndup (abfd,
889                             note->descdata + TILEPRO_PRPSINFO_OFFSET_PR_FNAME,
890                             16);
891   elf_tdata (abfd)->core_command
892     = _bfd_elfcore_strndup (abfd,
893                             note->descdata + TILEPRO_PRPSINFO_OFFSET_PR_PSARGS,
894                             ELF_PR_PSARGS_SIZE);
895
896
897   /* Note that for some reason, a spurious space is tacked
898      onto the end of the args in some (at least one anyway)
899      implementations, so strip it off if it exists.  */
900   {
901     char *command = elf_tdata (abfd)->core_command;
902     int n = strlen (command);
903
904     if (0 < n && command[n - 1] == ' ')
905       command[n - 1] = '\0';
906   }
907
908   return TRUE;
909 }
910
911
912 static void
913 tilepro_elf_append_rela_32 (bfd *abfd, asection *s, Elf_Internal_Rela *rel)
914 {
915   Elf32_External_Rela *loc32;
916
917   loc32 = (Elf32_External_Rela *) s->contents;
918   loc32 += s->reloc_count++;
919   bfd_elf32_swap_reloca_out (abfd, rel, (bfd_byte *) loc32);
920 }
921
922 /* PLT/GOT stuff */
923
924 /* The procedure linkage table starts with the following header:
925
926    {
927     rli     r29, r29, 16
928     lwadd   r28, r27, 4
929    }
930     lw      r27, r27
931    {
932     info    10            ## SP not offset, return PC in LR
933     jr      r27
934    }
935
936    Subsequent entries are the following, jumping to the header at the end:
937
938    lnk     r28
939 1:
940    {
941     auli    r28, r28, <_GLOBAL_OFFSET_TABLE_ - 1b + MY_GOT_OFFSET>
942     auli    r27, r28, <_GLOBAL_OFFSET_TABLE_ - 1b>
943    }
944    {
945     addli   r28, r28, <_GLOBAL_OFFSET_TABLE_ - 1b + MY_GOT_OFFSET>
946     addli   r27, r27, <_GLOBAL_OFFSET_TABLE_ - 1b>
947    }
948    {
949     auli    r29, zero, MY_PLT_INDEX
950     lw      r28, r28
951    }
952    {
953     info    10            ## SP not offset, return PC in LR
954     jr      r28
955    }
956
957    We initially store MY_PLT_INDEX in the high bits so that we can use the all
958    16 bits as an unsigned offset; if we use the low bits we would get an
959    unwanted sign extension.  The PLT header then rotates the index to get the
960    right value, before calling the resolution routine.  This computation can
961    fit in unused bundle slots so it's free.
962
963    This code sequence lets the code at at the start of the PLT determine
964    which PLT entry was executed by examining 'r29'.
965
966    Note that MY_PLT_INDEX skips over the header entries, so the first
967    actual jump table entry has index zero.
968 */
969
970 #define PLT_HEADER_SIZE_IN_BUNDLES 3
971 #define PLT_ENTRY_SIZE_IN_BUNDLES  5
972
973 #define PLT_HEADER_SIZE \
974   (PLT_HEADER_SIZE_IN_BUNDLES * TILEPRO_BUNDLE_SIZE_IN_BYTES)
975 #define PLT_ENTRY_SIZE \
976   (PLT_ENTRY_SIZE_IN_BUNDLES * TILEPRO_BUNDLE_SIZE_IN_BYTES)
977
978 /* The size in bytes of an entry in the global offset table.  */
979
980 #define GOT_ENTRY_SIZE TILEPRO_BYTES_PER_WORD
981
982 #define GOTPLT_HEADER_SIZE (2 * GOT_ENTRY_SIZE)
983
984
985 static const bfd_byte
986 tilepro_plt0_entry[PLT_HEADER_SIZE] =
987 {
988   0x5d, 0x07, 0x03, 0x70,
989   0x6e, 0x23, 0xd0, 0x30, /* { rli r29, r29, 16 ; lwadd r28, r27, 4 } */
990   0x00, 0x50, 0xba, 0x6d,
991   0x00, 0x08, 0x6d, 0xdc, /* { lw r27, r27 } */
992   0xff, 0xaf, 0x10, 0x50,
993   0x60, 0x03, 0x18, 0x08, /* { info 10 ; jr r27 } */
994 };
995
996 static const bfd_byte
997 tilepro_short_plt_entry[PLT_ENTRY_SIZE] =
998 {
999   0x00, 0x50, 0x16, 0x70,
1000   0x0e, 0x00, 0x1a, 0x08, /* { lnk r28 } */
1001   0x1c, 0x07, 0x00, 0xa0,
1002   0x8d, 0x03, 0x00, 0x18, /* { addli r28, r28, 0 ; addli r27, r28, 0 } */
1003   0xdd, 0x0f, 0x00, 0x30,
1004   0x8e, 0x73, 0x0b, 0x40, /* { auli r29, zero, 0 ; lw r28, r28 } */
1005   0xff, 0xaf, 0x10, 0x50,
1006   0x80, 0x03, 0x18, 0x08, /* { info 10 ; jr r28 } */
1007   0x00, 0x00, 0x00, 0x00,
1008   0x00, 0x00, 0x00, 0x00,
1009 };
1010
1011 static const bfd_byte
1012 tilepro_long_plt_entry[PLT_ENTRY_SIZE] =
1013 {
1014   0x00, 0x50, 0x16, 0x70,
1015   0x0e, 0x00, 0x1a, 0x08, /* { lnk r28 } */
1016   0x1c, 0x07, 0x00, 0xb0,
1017   0x8d, 0x03, 0x00, 0x20, /* { auli r28, r28, 0 ; auli r27, r28, 0 } */
1018   0x1c, 0x07, 0x00, 0xa0,
1019   0x6d, 0x03, 0x00, 0x18, /* { addli r28, r28, 0 ; addli r27, r27, 0 } */
1020   0xdd, 0x0f, 0x00, 0x30,
1021   0x8e, 0x73, 0x0b, 0x40, /* { auli r29, zero, 0 ; lw r28, r28 } */
1022   0xff, 0xaf, 0x10, 0x50,
1023   0x80, 0x03, 0x18, 0x08, /* { info 10 ; jr r28 } */
1024 };
1025
1026 static bfd_vma
1027 tilepro_ha16(bfd_vma vma)
1028 {
1029   return ((vma >> 16) + ((vma >> 15) & 1)) & 0xffff;
1030 }
1031
1032 static int
1033 tilepro_plt_entry_build (asection *splt, asection *sgotplt, bfd_vma offset,
1034                       bfd_vma *r_offset)
1035 {
1036   int plt_index = (offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
1037   int got_offset = plt_index * GOT_ENTRY_SIZE + GOTPLT_HEADER_SIZE;
1038   tilepro_bundle_bits *pc;
1039
1040   /* Compute the distance from the got entry to the lnk.  */
1041   bfd_signed_vma dist_got_entry = sgotplt->output_section->vma
1042     + sgotplt->output_offset
1043     + got_offset
1044     - splt->output_section->vma
1045     - splt->output_offset
1046     - offset
1047     - TILEPRO_BUNDLE_SIZE_IN_BYTES;
1048
1049   /* Compute the distance to GOTPLT[0].  */
1050   bfd_signed_vma dist_got0 = dist_got_entry - got_offset;
1051
1052   /* Check whether we can use the short plt entry with 16-bit offset.  */
1053   bfd_boolean short_plt_entry =
1054     (dist_got_entry <= 0x7fff && dist_got0 >= -0x8000);
1055
1056   /* Copy the plt entry template.  */
1057   memcpy (splt->contents + offset,
1058           short_plt_entry ? tilepro_short_plt_entry : tilepro_long_plt_entry,
1059           PLT_ENTRY_SIZE);
1060
1061   /* Write the immediate offsets.  */
1062   pc = (tilepro_bundle_bits *)(splt->contents + offset);
1063   pc++;
1064
1065   if (!short_plt_entry)
1066     {
1067       /* { auli r28, r28, &GOTPLT[MY_GOT_INDEX] ; auli r27, r28, &GOTPLT[0] } */
1068       *pc++ |= create_Imm16_X0 (tilepro_ha16 (dist_got_entry))
1069         | create_Imm16_X1 (tilepro_ha16 (dist_got0));
1070     }
1071
1072   /* { addli r28, r28, &GOTPLT[MY_GOT_INDEX] ; addli r27, r28, &GOTPLT[0] } or
1073      { addli r28, r28, &GOTPLT[MY_GOT_INDEX] ; addli r27, r27, &GOTPLT[0] } */
1074   *pc++ |= create_Imm16_X0 (dist_got_entry)
1075     | create_Imm16_X1 (dist_got0);
1076
1077   /* { auli r29, zero, MY_PLT_INDEX ; lw r28, r28 } */
1078   *pc |= create_Imm16_X0 (plt_index);
1079
1080   /* Set the relocation offset.  */
1081   *r_offset = got_offset;
1082
1083   return plt_index;
1084 }
1085
1086 #define TILEPRO_ELF_RELA_BYTES (sizeof(Elf32_External_Rela))
1087
1088
1089 /* Create an entry in an TILEPro ELF linker hash table.  */
1090
1091 static struct bfd_hash_entry *
1092 link_hash_newfunc (struct bfd_hash_entry *entry,
1093                    struct bfd_hash_table *table, const char *string)
1094 {
1095   /* Allocate the structure if it has not already been allocated by a
1096      subclass.  */
1097   if (entry == NULL)
1098     {
1099       entry =
1100         bfd_hash_allocate (table,
1101                            sizeof (struct tilepro_elf_link_hash_entry));
1102       if (entry == NULL)
1103         return entry;
1104     }
1105
1106   /* Call the allocation method of the superclass.  */
1107   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
1108   if (entry != NULL)
1109     {
1110       struct tilepro_elf_link_hash_entry *eh;
1111
1112       eh = (struct tilepro_elf_link_hash_entry *) entry;
1113       eh->dyn_relocs = NULL;
1114       eh->tls_type = GOT_UNKNOWN;
1115     }
1116
1117   return entry;
1118 }
1119
1120 /* Create a TILEPRO ELF linker hash table.  */
1121
1122 static struct bfd_link_hash_table *
1123 tilepro_elf_link_hash_table_create (bfd *abfd)
1124 {
1125   struct tilepro_elf_link_hash_table *ret;
1126   bfd_size_type amt = sizeof (struct tilepro_elf_link_hash_table);
1127
1128   ret = (struct tilepro_elf_link_hash_table *) bfd_zmalloc (amt);
1129   if (ret == NULL)
1130     return NULL;
1131
1132   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc,
1133                                       sizeof (struct tilepro_elf_link_hash_entry),
1134                                       TILEPRO_ELF_DATA))
1135     {
1136       free (ret);
1137       return NULL;
1138     }
1139
1140   return &ret->elf.root;
1141 }
1142
1143 /* Create the .got section.  */
1144
1145 static bfd_boolean
1146 tilepro_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
1147 {
1148   flagword flags;
1149   asection *s, *s_got;
1150   struct elf_link_hash_entry *h;
1151   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
1152   struct elf_link_hash_table *htab = elf_hash_table (info);
1153
1154   /* This function may be called more than once.  */
1155   s = bfd_get_section_by_name (abfd, ".got");
1156   if (s != NULL && (s->flags & SEC_LINKER_CREATED) != 0)
1157     return TRUE;
1158
1159   flags = bed->dynamic_sec_flags;
1160
1161   s = bfd_make_section_with_flags (abfd,
1162                                    (bed->rela_plts_and_copies_p
1163                                     ? ".rela.got" : ".rel.got"),
1164                                    (bed->dynamic_sec_flags
1165                                     | SEC_READONLY));
1166   if (s == NULL
1167       || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
1168     return FALSE;
1169   htab->srelgot = s;
1170
1171   s = s_got = bfd_make_section_with_flags (abfd, ".got", flags);
1172   if (s == NULL
1173       || !bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
1174     return FALSE;
1175   htab->sgot = s;
1176
1177   /* The first bit of the global offset table is the header.  */
1178   s->size += bed->got_header_size;
1179
1180   if (bed->want_got_plt)
1181     {
1182       s = bfd_make_section_with_flags (abfd, ".got.plt", flags);
1183       if (s == NULL
1184           || !bfd_set_section_alignment (abfd, s,
1185                                          bed->s->log_file_align))
1186         return FALSE;
1187       htab->sgotplt = s;
1188
1189       /* Reserve room for the header.  */
1190       s->size += GOTPLT_HEADER_SIZE;
1191     }
1192
1193   if (bed->want_got_sym)
1194     {
1195       /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the .got
1196          section.  We don't do this in the linker script because we don't want
1197          to define the symbol if we are not creating a global offset
1198          table.  */
1199       h = _bfd_elf_define_linkage_sym (abfd, info, s_got,
1200                                        "_GLOBAL_OFFSET_TABLE_");
1201       elf_hash_table (info)->hgot = h;
1202       if (h == NULL)
1203         return FALSE;
1204     }
1205
1206   return TRUE;
1207 }
1208
1209 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and
1210    .rela.bss sections in DYNOBJ, and set up shortcuts to them in our
1211    hash table.  */
1212
1213 static bfd_boolean
1214 tilepro_elf_create_dynamic_sections (bfd *dynobj,
1215                                      struct bfd_link_info *info)
1216 {
1217   struct tilepro_elf_link_hash_table *htab;
1218
1219   htab = tilepro_elf_hash_table (info);
1220   BFD_ASSERT (htab != NULL);
1221
1222   if (!tilepro_elf_create_got_section (dynobj, info))
1223     return FALSE;
1224
1225   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1226     return FALSE;
1227
1228   htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
1229   if (!info->shared)
1230     htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
1231
1232   if (!htab->elf.splt || !htab->elf.srelplt || !htab->sdynbss
1233       || (!info->shared && !htab->srelbss))
1234     abort ();
1235
1236   return TRUE;
1237 }
1238
1239 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
1240
1241 static void
1242 tilepro_elf_copy_indirect_symbol (struct bfd_link_info *info,
1243                                   struct elf_link_hash_entry *dir,
1244                                   struct elf_link_hash_entry *ind)
1245 {
1246   struct tilepro_elf_link_hash_entry *edir, *eind;
1247
1248   edir = (struct tilepro_elf_link_hash_entry *) dir;
1249   eind = (struct tilepro_elf_link_hash_entry *) ind;
1250
1251   if (eind->dyn_relocs != NULL)
1252     {
1253       if (edir->dyn_relocs != NULL)
1254         {
1255           struct tilepro_elf_dyn_relocs **pp;
1256           struct tilepro_elf_dyn_relocs *p;
1257
1258           /* Add reloc counts against the indirect sym to the direct sym
1259              list.  Merge any entries against the same section.  */
1260           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1261             {
1262               struct tilepro_elf_dyn_relocs *q;
1263
1264               for (q = edir->dyn_relocs; q != NULL; q = q->next)
1265                 if (q->sec == p->sec)
1266                   {
1267                     q->pc_count += p->pc_count;
1268                     q->count += p->count;
1269                     *pp = p->next;
1270                     break;
1271                   }
1272               if (q == NULL)
1273                 pp = &p->next;
1274             }
1275           *pp = edir->dyn_relocs;
1276         }
1277
1278       edir->dyn_relocs = eind->dyn_relocs;
1279       eind->dyn_relocs = NULL;
1280     }
1281
1282   if (ind->root.type == bfd_link_hash_indirect
1283       && dir->got.refcount <= 0)
1284     {
1285       edir->tls_type = eind->tls_type;
1286       eind->tls_type = GOT_UNKNOWN;
1287     }
1288   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
1289 }
1290
1291 /* Look through the relocs for a section during the first phase, and
1292    allocate space in the global offset table or procedure linkage
1293    table.  */
1294
1295 static bfd_boolean
1296 tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
1297                           asection *sec, const Elf_Internal_Rela *relocs)
1298 {
1299   struct tilepro_elf_link_hash_table *htab;
1300   Elf_Internal_Shdr *symtab_hdr;
1301   struct elf_link_hash_entry **sym_hashes;
1302   const Elf_Internal_Rela *rel;
1303   const Elf_Internal_Rela *rel_end;
1304   asection *sreloc;
1305   int num_relocs;
1306
1307   if (info->relocatable)
1308     return TRUE;
1309
1310   htab = tilepro_elf_hash_table (info);
1311   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1312   sym_hashes = elf_sym_hashes (abfd);
1313
1314   sreloc = NULL;
1315
1316   num_relocs = sec->reloc_count;
1317
1318   BFD_ASSERT (is_tilepro_elf (abfd) || num_relocs == 0);
1319
1320   if (htab->elf.dynobj == NULL)
1321     htab->elf.dynobj = abfd;
1322
1323   rel_end = relocs + num_relocs;
1324   for (rel = relocs; rel < rel_end; rel++)
1325     {
1326       unsigned int r_type;
1327       unsigned long r_symndx;
1328       struct elf_link_hash_entry *h;
1329       int tls_type;
1330
1331       r_symndx = ELF32_R_SYM (rel->r_info);
1332       r_type = ELF32_R_TYPE (rel->r_info);
1333
1334       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1335         {
1336           (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1337                                  abfd, r_symndx);
1338           return FALSE;
1339         }
1340
1341       if (r_symndx < symtab_hdr->sh_info)
1342         h = NULL;
1343       else
1344         {
1345           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1346           while (h->root.type == bfd_link_hash_indirect
1347                  || h->root.type == bfd_link_hash_warning)
1348             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1349         }
1350
1351       switch (r_type)
1352         {
1353         case R_TILEPRO_IMM16_X0_TLS_GD:
1354         case R_TILEPRO_IMM16_X1_TLS_GD:
1355         case R_TILEPRO_IMM16_X0_TLS_GD_LO:
1356         case R_TILEPRO_IMM16_X1_TLS_GD_LO:
1357         case R_TILEPRO_IMM16_X0_TLS_GD_HI:
1358         case R_TILEPRO_IMM16_X1_TLS_GD_HI:
1359         case R_TILEPRO_IMM16_X0_TLS_GD_HA:
1360         case R_TILEPRO_IMM16_X1_TLS_GD_HA:
1361           tls_type = GOT_TLS_GD;
1362           goto have_got_reference;
1363
1364         case R_TILEPRO_IMM16_X0_TLS_IE:
1365         case R_TILEPRO_IMM16_X1_TLS_IE:
1366         case R_TILEPRO_IMM16_X0_TLS_IE_LO:
1367         case R_TILEPRO_IMM16_X1_TLS_IE_LO:
1368         case R_TILEPRO_IMM16_X0_TLS_IE_HI:
1369         case R_TILEPRO_IMM16_X1_TLS_IE_HI:
1370         case R_TILEPRO_IMM16_X0_TLS_IE_HA:
1371         case R_TILEPRO_IMM16_X1_TLS_IE_HA:
1372           tls_type = GOT_TLS_IE;
1373           if (info->shared)
1374             info->flags |= DF_STATIC_TLS;
1375           goto have_got_reference;
1376
1377         case R_TILEPRO_IMM16_X0_GOT:
1378         case R_TILEPRO_IMM16_X1_GOT:
1379         case R_TILEPRO_IMM16_X0_GOT_LO:
1380         case R_TILEPRO_IMM16_X1_GOT_LO:
1381         case R_TILEPRO_IMM16_X0_GOT_HI:
1382         case R_TILEPRO_IMM16_X1_GOT_HI:
1383         case R_TILEPRO_IMM16_X0_GOT_HA:
1384         case R_TILEPRO_IMM16_X1_GOT_HA:
1385            tls_type = GOT_NORMAL;
1386            /* Fall Through */
1387
1388         have_got_reference:
1389           /* This symbol requires a global offset table entry.  */
1390           {
1391             int old_tls_type;
1392
1393             if (h != NULL)
1394               {
1395                 h->got.refcount += 1;
1396                 old_tls_type = tilepro_elf_hash_entry(h)->tls_type;
1397               }
1398             else
1399               {
1400                 bfd_signed_vma *local_got_refcounts;
1401
1402                 /* This is a global offset table entry for a local symbol.  */
1403                 local_got_refcounts = elf_local_got_refcounts (abfd);
1404                 if (local_got_refcounts == NULL)
1405                   {
1406                     bfd_size_type size;
1407
1408                     size = symtab_hdr->sh_info;
1409                     size *= (sizeof (bfd_signed_vma) + sizeof(char));
1410                     local_got_refcounts = ((bfd_signed_vma *)
1411                                            bfd_zalloc (abfd, size));
1412                     if (local_got_refcounts == NULL)
1413                       return FALSE;
1414                     elf_local_got_refcounts (abfd) = local_got_refcounts;
1415                     _bfd_tilepro_elf_local_got_tls_type (abfd)
1416                       = (char *) (local_got_refcounts + symtab_hdr->sh_info);
1417                   }
1418                 local_got_refcounts[r_symndx] += 1;
1419                 old_tls_type =
1420                   _bfd_tilepro_elf_local_got_tls_type (abfd) [r_symndx];
1421               }
1422
1423             /* If a TLS symbol is accessed using IE at least once,
1424                there is no point to use dynamic model for it.  */
1425             if (old_tls_type != tls_type && old_tls_type != GOT_UNKNOWN
1426                 && (old_tls_type != GOT_TLS_GD
1427                     || tls_type != GOT_TLS_IE))
1428               {
1429                 if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD)
1430                   tls_type = old_tls_type;
1431                 else
1432                   {
1433                     (*_bfd_error_handler)
1434                       (_("%B: `%s' accessed both as normal and thread local symbol"),
1435                        abfd, h ? h->root.root.string : "<local>");
1436                     return FALSE;
1437                   }
1438               }
1439
1440             if (old_tls_type != tls_type)
1441               {
1442                 if (h != NULL)
1443                   tilepro_elf_hash_entry (h)->tls_type = tls_type;
1444                 else
1445                   _bfd_tilepro_elf_local_got_tls_type (abfd) [r_symndx] =
1446                     tls_type;
1447               }
1448           }
1449
1450           if (htab->elf.sgot == NULL)
1451             {
1452               if (!tilepro_elf_create_got_section (htab->elf.dynobj, info))
1453                 return FALSE;
1454             }
1455           break;
1456
1457         case R_TILEPRO_JOFFLONG_X1_PLT:
1458           /* This symbol requires a procedure linkage table entry.  We
1459              actually build the entry in adjust_dynamic_symbol,
1460              because this might be a case of linking PIC code without
1461              linking in any dynamic objects, in which case we don't
1462              need to generate a procedure linkage table after all.  */
1463
1464           if (h != NULL)
1465             {
1466               h->needs_plt = 1;
1467               h->plt.refcount += 1;
1468             }
1469           break;
1470
1471         case R_TILEPRO_32_PCREL:
1472         case R_TILEPRO_16_PCREL:
1473         case R_TILEPRO_8_PCREL:
1474         case R_TILEPRO_IMM16_X0_PCREL:
1475         case R_TILEPRO_IMM16_X1_PCREL:
1476         case R_TILEPRO_IMM16_X0_LO_PCREL:
1477         case R_TILEPRO_IMM16_X1_LO_PCREL:
1478         case R_TILEPRO_IMM16_X0_HI_PCREL:
1479         case R_TILEPRO_IMM16_X1_HI_PCREL:
1480         case R_TILEPRO_IMM16_X0_HA_PCREL:
1481         case R_TILEPRO_IMM16_X1_HA_PCREL:
1482           if (h != NULL)
1483             h->non_got_ref = 1;
1484
1485           if (h != NULL
1486               && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1487             break;
1488           /* Fall through.  */
1489
1490         case R_TILEPRO_32:
1491         case R_TILEPRO_16:
1492         case R_TILEPRO_8:
1493         case R_TILEPRO_LO16:
1494         case R_TILEPRO_HI16:
1495         case R_TILEPRO_HA16:
1496         case R_TILEPRO_COPY:
1497         case R_TILEPRO_GLOB_DAT:
1498         case R_TILEPRO_JMP_SLOT:
1499         case R_TILEPRO_RELATIVE:
1500         case R_TILEPRO_BROFF_X1:
1501         case R_TILEPRO_JOFFLONG_X1:
1502         case R_TILEPRO_IMM8_X0:
1503         case R_TILEPRO_IMM8_Y0:
1504         case R_TILEPRO_IMM8_X1:
1505         case R_TILEPRO_IMM8_Y1:
1506         case R_TILEPRO_DEST_IMM8_X1:
1507         case R_TILEPRO_MT_IMM15_X1:
1508         case R_TILEPRO_MF_IMM15_X1:
1509         case R_TILEPRO_IMM16_X0:
1510         case R_TILEPRO_IMM16_X1:
1511         case R_TILEPRO_IMM16_X0_LO:
1512         case R_TILEPRO_IMM16_X1_LO:
1513         case R_TILEPRO_IMM16_X0_HI:
1514         case R_TILEPRO_IMM16_X1_HI:
1515         case R_TILEPRO_IMM16_X0_HA:
1516         case R_TILEPRO_IMM16_X1_HA:
1517         case R_TILEPRO_MMSTART_X0:
1518         case R_TILEPRO_MMEND_X0:
1519         case R_TILEPRO_MMSTART_X1:
1520         case R_TILEPRO_MMEND_X1:
1521         case R_TILEPRO_SHAMT_X0:
1522         case R_TILEPRO_SHAMT_X1:
1523         case R_TILEPRO_SHAMT_Y0:
1524         case R_TILEPRO_SHAMT_Y1:
1525           if (h != NULL)
1526             {
1527               h->non_got_ref = 1;
1528
1529               if (!info->shared)
1530                 {
1531                   /* We may need a .plt entry if the function this reloc
1532                      refers to is in a shared lib.  */
1533                   h->plt.refcount += 1;
1534                 }
1535             }
1536
1537           /* If we are creating a shared library, and this is a reloc
1538              against a global symbol, or a non PC relative reloc
1539              against a local symbol, then we need to copy the reloc
1540              into the shared library.  However, if we are linking with
1541              -Bsymbolic, we do not need to copy a reloc against a
1542              global symbol which is defined in an object we are
1543              including in the link (i.e., DEF_REGULAR is set).  At
1544              this point we have not seen all the input files, so it is
1545              possible that DEF_REGULAR is not set now but will be set
1546              later (it is never cleared).  In case of a weak definition,
1547              DEF_REGULAR may be cleared later by a strong definition in
1548              a shared library.  We account for that possibility below by
1549              storing information in the relocs_copied field of the hash
1550              table entry.  A similar situation occurs when creating
1551              shared libraries and symbol visibility changes render the
1552              symbol local.
1553
1554              If on the other hand, we are creating an executable, we
1555              may need to keep relocations for symbols satisfied by a
1556              dynamic library if we manage to avoid copy relocs for the
1557              symbol.  */
1558           if ((info->shared
1559                && (sec->flags & SEC_ALLOC) != 0
1560                && (! tilepro_elf_howto_table[r_type].pc_relative
1561                    || (h != NULL
1562                        && (! info->symbolic
1563                            || h->root.type == bfd_link_hash_defweak
1564                            || !h->def_regular))))
1565               || (!info->shared
1566                   && (sec->flags & SEC_ALLOC) != 0
1567                   && h != NULL
1568                   && (h->root.type == bfd_link_hash_defweak
1569                       || !h->def_regular)))
1570             {
1571               struct tilepro_elf_dyn_relocs *p;
1572               struct tilepro_elf_dyn_relocs **head;
1573
1574               /* When creating a shared object, we must copy these
1575                  relocs into the output file.  We create a reloc
1576                  section in dynobj and make room for the reloc.  */
1577               if (sreloc == NULL)
1578                 {
1579                   sreloc = _bfd_elf_make_dynamic_reloc_section
1580                     (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ TRUE);
1581
1582                   if (sreloc == NULL)
1583                     return FALSE;
1584                 }
1585
1586               /* If this is a global symbol, we count the number of
1587                  relocations we need for this symbol.  */
1588               if (h != NULL)
1589                 head =
1590                   &((struct tilepro_elf_link_hash_entry *) h)->dyn_relocs;
1591               else
1592                 {
1593                   /* Track dynamic relocs needed for local syms too.
1594                      We really need local syms available to do this
1595                      easily.  Oh well.  */
1596
1597                   asection *s;
1598                   void *vpp;
1599                   Elf_Internal_Sym *isym;
1600
1601                   isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1602                                                 abfd, r_symndx);
1603                   if (isym == NULL)
1604                     return FALSE;
1605
1606                   s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1607                   if (s == NULL)
1608                     s = sec;
1609
1610                   vpp = &elf_section_data (s)->local_dynrel;
1611                   head = (struct tilepro_elf_dyn_relocs **) vpp;
1612                 }
1613
1614               p = *head;
1615               if (p == NULL || p->sec != sec)
1616                 {
1617                   bfd_size_type amt = sizeof *p;
1618                   p = ((struct tilepro_elf_dyn_relocs *)
1619                        bfd_alloc (htab->elf.dynobj, amt));
1620                   if (p == NULL)
1621                     return FALSE;
1622                   p->next = *head;
1623                   *head = p;
1624                   p->sec = sec;
1625                   p->count = 0;
1626                   p->pc_count = 0;
1627                 }
1628
1629               p->count += 1;
1630               if (tilepro_elf_howto_table[r_type].pc_relative)
1631                 p->pc_count += 1;
1632             }
1633
1634           break;
1635
1636         case R_TILEPRO_GNU_VTINHERIT:
1637           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1638             return FALSE;
1639           break;
1640
1641         case R_TILEPRO_GNU_VTENTRY:
1642           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1643             return FALSE;
1644           break;
1645
1646         default:
1647           break;
1648         }
1649     }
1650
1651   return TRUE;
1652 }
1653
1654 \f
1655 static asection *
1656 tilepro_elf_gc_mark_hook (asection *sec,
1657                           struct bfd_link_info *info,
1658                           Elf_Internal_Rela *rel,
1659                           struct elf_link_hash_entry *h,
1660                           Elf_Internal_Sym *sym)
1661 {
1662   if (h != NULL)
1663     {
1664       switch (ELF32_R_TYPE (rel->r_info))
1665       {
1666       case R_TILEPRO_GNU_VTINHERIT:
1667       case R_TILEPRO_GNU_VTENTRY:
1668         break;
1669       }
1670     }
1671
1672   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1673 }
1674
1675 /* Update the got entry reference counts for the section being removed.  */
1676 static bfd_boolean
1677 tilepro_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
1678                            asection *sec, const Elf_Internal_Rela *relocs)
1679 {
1680   struct tilepro_elf_link_hash_table *htab;
1681   Elf_Internal_Shdr *symtab_hdr;
1682   struct elf_link_hash_entry **sym_hashes;
1683   bfd_signed_vma *local_got_refcounts;
1684   const Elf_Internal_Rela *rel, *relend;
1685
1686   if (info->relocatable)
1687     return TRUE;
1688
1689   BFD_ASSERT (is_tilepro_elf (abfd) || sec->reloc_count == 0);
1690
1691   elf_section_data (sec)->local_dynrel = NULL;
1692
1693   htab = tilepro_elf_hash_table (info);
1694   BFD_ASSERT (htab != NULL);
1695   symtab_hdr = &elf_symtab_hdr (abfd);
1696   sym_hashes = elf_sym_hashes (abfd);
1697   local_got_refcounts = elf_local_got_refcounts (abfd);
1698
1699   relend = relocs + sec->reloc_count;
1700   for (rel = relocs; rel < relend; rel++)
1701     {
1702       unsigned long r_symndx;
1703       unsigned int r_type;
1704       struct elf_link_hash_entry *h = NULL;
1705
1706       r_symndx = ELF32_R_SYM (rel->r_info);
1707       if (r_symndx >= symtab_hdr->sh_info)
1708         {
1709           struct tilepro_elf_link_hash_entry *eh;
1710           struct tilepro_elf_dyn_relocs **pp;
1711           struct tilepro_elf_dyn_relocs *p;
1712
1713           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1714           while (h->root.type == bfd_link_hash_indirect
1715                  || h->root.type == bfd_link_hash_warning)
1716             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1717           eh = (struct tilepro_elf_link_hash_entry *) h;
1718           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
1719             if (p->sec == sec)
1720               {
1721                 /* Everything must go for SEC.  */
1722                 *pp = p->next;
1723                 break;
1724               }
1725         }
1726
1727       r_type = ELF32_R_TYPE (rel->r_info);
1728       switch (r_type)
1729         {
1730         case R_TILEPRO_IMM16_X0_GOT:
1731         case R_TILEPRO_IMM16_X1_GOT:
1732         case R_TILEPRO_IMM16_X0_GOT_LO:
1733         case R_TILEPRO_IMM16_X1_GOT_LO:
1734         case R_TILEPRO_IMM16_X0_GOT_HI:
1735         case R_TILEPRO_IMM16_X1_GOT_HI:
1736         case R_TILEPRO_IMM16_X0_GOT_HA:
1737         case R_TILEPRO_IMM16_X1_GOT_HA:
1738         case R_TILEPRO_IMM16_X0_TLS_GD:
1739         case R_TILEPRO_IMM16_X1_TLS_GD:
1740         case R_TILEPRO_IMM16_X0_TLS_GD_LO:
1741         case R_TILEPRO_IMM16_X1_TLS_GD_LO:
1742         case R_TILEPRO_IMM16_X0_TLS_GD_HI:
1743         case R_TILEPRO_IMM16_X1_TLS_GD_HI:
1744         case R_TILEPRO_IMM16_X0_TLS_GD_HA:
1745         case R_TILEPRO_IMM16_X1_TLS_GD_HA:
1746         case R_TILEPRO_IMM16_X0_TLS_IE:
1747         case R_TILEPRO_IMM16_X1_TLS_IE:
1748         case R_TILEPRO_IMM16_X0_TLS_IE_LO:
1749         case R_TILEPRO_IMM16_X1_TLS_IE_LO:
1750         case R_TILEPRO_IMM16_X0_TLS_IE_HI:
1751         case R_TILEPRO_IMM16_X1_TLS_IE_HI:
1752         case R_TILEPRO_IMM16_X0_TLS_IE_HA:
1753         case R_TILEPRO_IMM16_X1_TLS_IE_HA:
1754           if (h != NULL)
1755             {
1756               if (h->got.refcount > 0)
1757                 h->got.refcount--;
1758             }
1759           else
1760             {
1761               if (local_got_refcounts[r_symndx] > 0)
1762                 local_got_refcounts[r_symndx]--;
1763             }
1764           break;
1765
1766         case R_TILEPRO_32_PCREL:
1767         case R_TILEPRO_16_PCREL:
1768         case R_TILEPRO_8_PCREL:
1769         case R_TILEPRO_IMM16_X0_PCREL:
1770         case R_TILEPRO_IMM16_X1_PCREL:
1771         case R_TILEPRO_IMM16_X0_LO_PCREL:
1772         case R_TILEPRO_IMM16_X1_LO_PCREL:
1773         case R_TILEPRO_IMM16_X0_HI_PCREL:
1774         case R_TILEPRO_IMM16_X1_HI_PCREL:
1775         case R_TILEPRO_IMM16_X0_HA_PCREL:
1776         case R_TILEPRO_IMM16_X1_HA_PCREL:
1777           if (h != NULL
1778               && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1779             break;
1780           /* Fall through.  */
1781
1782         case R_TILEPRO_32:
1783         case R_TILEPRO_16:
1784         case R_TILEPRO_8:
1785         case R_TILEPRO_LO16:
1786         case R_TILEPRO_HI16:
1787         case R_TILEPRO_HA16:
1788         case R_TILEPRO_COPY:
1789         case R_TILEPRO_GLOB_DAT:
1790         case R_TILEPRO_JMP_SLOT:
1791         case R_TILEPRO_RELATIVE:
1792         case R_TILEPRO_BROFF_X1:
1793         case R_TILEPRO_JOFFLONG_X1:
1794         case R_TILEPRO_IMM8_X0:
1795         case R_TILEPRO_IMM8_Y0:
1796         case R_TILEPRO_IMM8_X1:
1797         case R_TILEPRO_IMM8_Y1:
1798         case R_TILEPRO_DEST_IMM8_X1:
1799         case R_TILEPRO_MT_IMM15_X1:
1800         case R_TILEPRO_MF_IMM15_X1:
1801         case R_TILEPRO_IMM16_X0:
1802         case R_TILEPRO_IMM16_X1:
1803         case R_TILEPRO_IMM16_X0_LO:
1804         case R_TILEPRO_IMM16_X1_LO:
1805         case R_TILEPRO_IMM16_X0_HI:
1806         case R_TILEPRO_IMM16_X1_HI:
1807         case R_TILEPRO_IMM16_X0_HA:
1808         case R_TILEPRO_IMM16_X1_HA:
1809         case R_TILEPRO_MMSTART_X0:
1810         case R_TILEPRO_MMEND_X0:
1811         case R_TILEPRO_MMSTART_X1:
1812         case R_TILEPRO_MMEND_X1:
1813         case R_TILEPRO_SHAMT_X0:
1814         case R_TILEPRO_SHAMT_X1:
1815         case R_TILEPRO_SHAMT_Y0:
1816         case R_TILEPRO_SHAMT_Y1:
1817           if (info->shared)
1818             break;
1819           /* Fall through.  */
1820
1821         case R_TILEPRO_JOFFLONG_X1_PLT:
1822           if (h != NULL)
1823             {
1824               if (h->plt.refcount > 0)
1825                 h->plt.refcount--;
1826             }
1827           break;
1828
1829         default:
1830           break;
1831         }
1832     }
1833
1834   return TRUE;
1835 }
1836
1837 /* Adjust a symbol defined by a dynamic object and referenced by a
1838    regular object.  The current definition is in some section of the
1839    dynamic object, but we're not including those sections.  We have to
1840    change the definition to something the rest of the link can
1841    understand.  */
1842
1843 static bfd_boolean
1844 tilepro_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
1845                                    struct elf_link_hash_entry *h)
1846 {
1847   struct tilepro_elf_link_hash_table *htab;
1848   struct tilepro_elf_link_hash_entry * eh;
1849   struct tilepro_elf_dyn_relocs *p;
1850   asection *s;
1851
1852   htab = tilepro_elf_hash_table (info);
1853   BFD_ASSERT (htab != NULL);
1854
1855   /* Make sure we know what is going on here.  */
1856   BFD_ASSERT (htab->elf.dynobj != NULL
1857               && (h->needs_plt
1858                   || h->u.weakdef != NULL
1859                   || (h->def_dynamic
1860                       && h->ref_regular
1861                       && !h->def_regular)));
1862
1863   /* If this is a function, put it in the procedure linkage table.  We
1864      will fill in the contents of the procedure linkage table later
1865      (although we could actually do it here). */
1866   if (h->type == STT_FUNC || h->needs_plt)
1867     {
1868       if (h->plt.refcount <= 0
1869           || SYMBOL_CALLS_LOCAL (info, h)
1870           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1871               && h->root.type == bfd_link_hash_undefweak))
1872         {
1873           /* This case can occur if we saw a R_TILEPRO_JOFFLONG_X1_PLT
1874              reloc in an input file, but the symbol was never referred
1875              to by a dynamic object, or if all references were garbage
1876              collected.  In such a case, we don't actually need to build
1877              a procedure linkage table, and we can just do a
1878              R_TILEPRO_JOFFLONG_X1 relocation instead. */
1879           h->plt.offset = (bfd_vma) -1;
1880           h->needs_plt = 0;
1881         }
1882
1883       return TRUE;
1884     }
1885   else
1886     h->plt.offset = (bfd_vma) -1;
1887
1888   /* If this is a weak symbol, and there is a real definition, the
1889      processor independent code will have arranged for us to see the
1890      real definition first, and we can just use the same value.  */
1891   if (h->u.weakdef != NULL)
1892     {
1893       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
1894                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
1895       h->root.u.def.section = h->u.weakdef->root.u.def.section;
1896       h->root.u.def.value = h->u.weakdef->root.u.def.value;
1897       return TRUE;
1898     }
1899
1900   /* This is a reference to a symbol defined by a dynamic object which
1901      is not a function.  */
1902
1903   /* If we are creating a shared library, we must presume that the
1904      only references to the symbol are via the global offset table.
1905      For such cases we need not do anything here; the relocations will
1906      be handled correctly by relocate_section.  */
1907   if (info->shared)
1908     return TRUE;
1909
1910   /* If there are no references to this symbol that do not use the
1911      GOT, we don't need to generate a copy reloc.  */
1912   if (!h->non_got_ref)
1913     return TRUE;
1914
1915   /* If -z nocopyreloc was given, we won't generate them either.  */
1916   if (info->nocopyreloc)
1917     {
1918       h->non_got_ref = 0;
1919       return TRUE;
1920     }
1921
1922   eh = (struct tilepro_elf_link_hash_entry *) h;
1923   for (p = eh->dyn_relocs; p != NULL; p = p->next)
1924     {
1925       s = p->sec->output_section;
1926       if (s != NULL && (s->flags & SEC_READONLY) != 0)
1927         break;
1928     }
1929
1930   /* If we didn't find any dynamic relocs in read-only sections, then
1931      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
1932   if (p == NULL)
1933     {
1934       h->non_got_ref = 0;
1935       return TRUE;
1936     }
1937
1938   if (h->size == 0)
1939     {
1940       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
1941                              h->root.root.string);
1942       return TRUE;
1943     }
1944
1945   /* We must allocate the symbol in our .dynbss section, which will
1946      become part of the .bss section of the executable.  There will be
1947      an entry for this symbol in the .dynsym section.  The dynamic
1948      object will contain position independent code, so all references
1949      from the dynamic object to this symbol will go through the global
1950      offset table.  The dynamic linker will use the .dynsym entry to
1951      determine the address it must put in the global offset table, so
1952      both the dynamic object and the regular object will refer to the
1953      same memory location for the variable.  */
1954
1955   /* We must generate a R_TILEPRO_COPY reloc to tell the dynamic linker
1956      to copy the initial value out of the dynamic object and into the
1957      runtime process image.  We need to remember the offset into the
1958      .rel.bss section we are going to use.  */
1959   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1960     {
1961       htab->srelbss->size += TILEPRO_ELF_RELA_BYTES;
1962       h->needs_copy = 1;
1963     }
1964
1965   return _bfd_elf_adjust_dynamic_copy (h, htab->sdynbss);
1966 }
1967
1968 /* Allocate space in .plt, .got and associated reloc sections for
1969    dynamic relocs.  */
1970
1971 static bfd_boolean
1972 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
1973 {
1974   struct bfd_link_info *info;
1975   struct tilepro_elf_link_hash_table *htab;
1976   struct tilepro_elf_link_hash_entry *eh;
1977   struct tilepro_elf_dyn_relocs *p;
1978
1979   if (h->root.type == bfd_link_hash_indirect)
1980     return TRUE;
1981
1982   info = (struct bfd_link_info *) inf;
1983   htab = tilepro_elf_hash_table (info);
1984   BFD_ASSERT (htab != NULL);
1985
1986   if (htab->elf.dynamic_sections_created
1987       && h->plt.refcount > 0)
1988     {
1989       /* Make sure this symbol is output as a dynamic symbol.
1990          Undefined weak syms won't yet be marked as dynamic.  */
1991       if (h->dynindx == -1
1992           && !h->forced_local)
1993         {
1994           if (! bfd_elf_link_record_dynamic_symbol (info, h))
1995             return FALSE;
1996         }
1997
1998       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
1999         {
2000           asection *s = htab->elf.splt;
2001
2002           /* Allocate room for the header.  */
2003           if (s->size == 0)
2004             {
2005               s->size = PLT_HEADER_SIZE;
2006             }
2007
2008           h->plt.offset = s->size;
2009
2010           /* If this symbol is not defined in a regular file, and we are
2011              not generating a shared library, then set the symbol to this
2012              location in the .plt.  This is required to make function
2013              pointers compare as equal between the normal executable and
2014              the shared library.  */
2015           if (! info->shared
2016               && !h->def_regular)
2017             {
2018               h->root.u.def.section = s;
2019               h->root.u.def.value = h->plt.offset;
2020             }
2021
2022           /* Make room for this entry.  */
2023           s->size += PLT_ENTRY_SIZE;
2024
2025           /* We also need to make an entry in the .got.plt section.  */
2026           htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
2027
2028           /* We also need to make an entry in the .rela.plt section.  */
2029           htab->elf.srelplt->size += TILEPRO_ELF_RELA_BYTES;
2030         }
2031       else
2032         {
2033           h->plt.offset = (bfd_vma) -1;
2034           h->needs_plt = 0;
2035         }
2036     }
2037   else
2038     {
2039       h->plt.offset = (bfd_vma) -1;
2040       h->needs_plt = 0;
2041     }
2042
2043   if (h->got.refcount > 0)
2044     {
2045       asection *s;
2046       bfd_boolean dyn;
2047       int tls_type = tilepro_elf_hash_entry(h)->tls_type;
2048
2049       /* Make sure this symbol is output as a dynamic symbol.
2050          Undefined weak syms won't yet be marked as dynamic.  */
2051       if (h->dynindx == -1
2052           && !h->forced_local)
2053         {
2054           if (! bfd_elf_link_record_dynamic_symbol (info, h))
2055             return FALSE;
2056         }
2057
2058       s = htab->elf.sgot;
2059       h->got.offset = s->size;
2060       s->size += TILEPRO_BYTES_PER_WORD;
2061       /* R_TILEPRO_IMM16_Xn_TLS_GD entries need 2 consecutive GOT slots. */
2062       if (tls_type == GOT_TLS_GD)
2063         s->size += TILEPRO_BYTES_PER_WORD;
2064       dyn = htab->elf.dynamic_sections_created;
2065       /* R_TILEPRO_IMM16_Xn_TLS_IE_xxx needs one dynamic relocation,
2066          R_TILEPRO_IMM16_Xn_TLS_GD_xxx needs two if local symbol and two if
2067          global.  */
2068       if (tls_type == GOT_TLS_GD || tls_type == GOT_TLS_IE)
2069         htab->elf.srelgot->size += 2 * TILEPRO_ELF_RELA_BYTES;
2070       else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h))
2071         htab->elf.srelgot->size += TILEPRO_ELF_RELA_BYTES;
2072     }
2073   else
2074     h->got.offset = (bfd_vma) -1;
2075
2076   eh = (struct tilepro_elf_link_hash_entry *) h;
2077   if (eh->dyn_relocs == NULL)
2078     return TRUE;
2079
2080   /* In the shared -Bsymbolic case, discard space allocated for
2081      dynamic pc-relative relocs against symbols which turn out to be
2082      defined in regular objects.  For the normal shared case, discard
2083      space for pc-relative relocs that have become local due to symbol
2084      visibility changes.  */
2085
2086   if (info->shared)
2087     {
2088       if (SYMBOL_CALLS_LOCAL (info, h))
2089         {
2090           struct tilepro_elf_dyn_relocs **pp;
2091
2092           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
2093             {
2094               p->count -= p->pc_count;
2095               p->pc_count = 0;
2096               if (p->count == 0)
2097                 *pp = p->next;
2098               else
2099                 pp = &p->next;
2100             }
2101         }
2102
2103       /* Also discard relocs on undefined weak syms with non-default
2104          visibility.  */
2105       if (eh->dyn_relocs != NULL
2106           && h->root.type == bfd_link_hash_undefweak)
2107         {
2108           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
2109             eh->dyn_relocs = NULL;
2110
2111           /* Make sure undefined weak symbols are output as a dynamic
2112              symbol in PIEs.  */
2113           else if (h->dynindx == -1
2114                    && !h->forced_local)
2115             {
2116               if (! bfd_elf_link_record_dynamic_symbol (info, h))
2117                 return FALSE;
2118             }
2119         }
2120     }
2121   else
2122     {
2123       /* For the non-shared case, discard space for relocs against
2124          symbols which turn out to need copy relocs or are not
2125          dynamic.  */
2126
2127       if (!h->non_got_ref
2128           && ((h->def_dynamic
2129                && !h->def_regular)
2130               || (htab->elf.dynamic_sections_created
2131                   && (h->root.type == bfd_link_hash_undefweak
2132                       || h->root.type == bfd_link_hash_undefined))))
2133         {
2134           /* Make sure this symbol is output as a dynamic symbol.
2135              Undefined weak syms won't yet be marked as dynamic.  */
2136           if (h->dynindx == -1
2137               && !h->forced_local)
2138             {
2139               if (! bfd_elf_link_record_dynamic_symbol (info, h))
2140                 return FALSE;
2141             }
2142
2143           /* If that succeeded, we know we'll be keeping all the
2144              relocs.  */
2145           if (h->dynindx != -1)
2146             goto keep;
2147         }
2148
2149       eh->dyn_relocs = NULL;
2150
2151     keep: ;
2152     }
2153
2154   /* Finally, allocate space.  */
2155   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2156     {
2157       asection *sreloc = elf_section_data (p->sec)->sreloc;
2158       sreloc->size += p->count * TILEPRO_ELF_RELA_BYTES;
2159     }
2160
2161   return TRUE;
2162 }
2163
2164 /* Find any dynamic relocs that apply to read-only sections.  */
2165
2166 static bfd_boolean
2167 readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2168 {
2169   struct tilepro_elf_link_hash_entry *eh;
2170   struct tilepro_elf_dyn_relocs *p;
2171
2172   eh = (struct tilepro_elf_link_hash_entry *) h;
2173   for (p = eh->dyn_relocs; p != NULL; p = p->next)
2174     {
2175       asection *s = p->sec->output_section;
2176
2177       if (s != NULL && (s->flags & SEC_READONLY) != 0)
2178         {
2179           struct bfd_link_info *info = (struct bfd_link_info *) inf;
2180
2181           info->flags |= DF_TEXTREL;
2182
2183           /* Not an error, just cut short the traversal.  */
2184           return FALSE;
2185         }
2186     }
2187   return TRUE;
2188 }
2189
2190 /* Return true if the dynamic symbol for a given section should be
2191    omitted when creating a shared library.  */
2192
2193 static bfd_boolean
2194 tilepro_elf_omit_section_dynsym (bfd *output_bfd,
2195                                     struct bfd_link_info *info,
2196                                     asection *p)
2197 {
2198   /* We keep the .got section symbol so that explicit relocations
2199      against the _GLOBAL_OFFSET_TABLE_ symbol emitted in PIC mode
2200      can be turned into relocations against the .got symbol.  */
2201   if (strcmp (p->name, ".got") == 0)
2202     return FALSE;
2203
2204   return _bfd_elf_link_omit_section_dynsym (output_bfd, info, p);
2205 }
2206
2207 /* Set the sizes of the dynamic sections.  */
2208
2209 #define ELF32_DYNAMIC_INTERPRETER "/lib/ld.so.1"
2210
2211 static bfd_boolean
2212 tilepro_elf_size_dynamic_sections (bfd *output_bfd,
2213                                       struct bfd_link_info *info)
2214 {
2215   (void)output_bfd;
2216
2217   struct tilepro_elf_link_hash_table *htab;
2218   bfd *dynobj;
2219   asection *s;
2220   bfd *ibfd;
2221
2222   htab = tilepro_elf_hash_table (info);
2223   BFD_ASSERT (htab != NULL);
2224   dynobj = htab->elf.dynobj;
2225   BFD_ASSERT (dynobj != NULL);
2226
2227   if (elf_hash_table (info)->dynamic_sections_created)
2228     {
2229       /* Set the contents of the .interp section to the interpreter.  */
2230       if (info->executable)
2231         {
2232           s = bfd_get_section_by_name (dynobj, ".interp");
2233           BFD_ASSERT (s != NULL);
2234           s->size = sizeof ELF32_DYNAMIC_INTERPRETER;
2235           s->contents = (unsigned char *) ELF32_DYNAMIC_INTERPRETER;
2236         }
2237     }
2238
2239   /* Set up .got offsets for local syms, and space for local dynamic
2240      relocs.  */
2241   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2242     {
2243       bfd_signed_vma *local_got;
2244       bfd_signed_vma *end_local_got;
2245       char *local_tls_type;
2246       bfd_size_type locsymcount;
2247       Elf_Internal_Shdr *symtab_hdr;
2248       asection *srel;
2249
2250       if (! is_tilepro_elf (ibfd))
2251         continue;
2252
2253       for (s = ibfd->sections; s != NULL; s = s->next)
2254         {
2255           struct tilepro_elf_dyn_relocs *p;
2256
2257           for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
2258             {
2259               if (!bfd_is_abs_section (p->sec)
2260                   && bfd_is_abs_section (p->sec->output_section))
2261                 {
2262                   /* Input section has been discarded, either because
2263                      it is a copy of a linkonce section or due to
2264                      linker script /DISCARD/, so we'll be discarding
2265                      the relocs too.  */
2266                 }
2267               else if (p->count != 0)
2268                 {
2269                   srel = elf_section_data (p->sec)->sreloc;
2270                   srel->size += p->count * TILEPRO_ELF_RELA_BYTES;
2271                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
2272                     info->flags |= DF_TEXTREL;
2273                 }
2274             }
2275         }
2276
2277       local_got = elf_local_got_refcounts (ibfd);
2278       if (!local_got)
2279         continue;
2280
2281       symtab_hdr = &elf_symtab_hdr (ibfd);
2282       locsymcount = symtab_hdr->sh_info;
2283       end_local_got = local_got + locsymcount;
2284       local_tls_type = _bfd_tilepro_elf_local_got_tls_type (ibfd);
2285       s = htab->elf.sgot;
2286       srel = htab->elf.srelgot;
2287       for (; local_got < end_local_got; ++local_got, ++local_tls_type)
2288         {
2289           if (*local_got > 0)
2290             {
2291               *local_got = s->size;
2292               s->size += TILEPRO_BYTES_PER_WORD;
2293               if (*local_tls_type == GOT_TLS_GD)
2294                 s->size += TILEPRO_BYTES_PER_WORD;
2295               if (info->shared
2296                   || *local_tls_type == GOT_TLS_GD
2297                   || *local_tls_type == GOT_TLS_IE)
2298                 srel->size += TILEPRO_ELF_RELA_BYTES;
2299             }
2300           else
2301             *local_got = (bfd_vma) -1;
2302         }
2303     }
2304
2305   /* Allocate global sym .plt and .got entries, and space for global
2306      sym dynamic relocs.  */
2307   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
2308
2309   if (elf_hash_table (info)->dynamic_sections_created)
2310     {
2311       /* If the .got section is more than 0x8000 bytes, we add
2312          0x8000 to the value of _GLOBAL_OFFSET_TABLE_, so that 16
2313          bit relocations have a greater chance of working. */
2314       if (htab->elf.sgot->size >= 0x8000
2315           && elf_hash_table (info)->hgot->root.u.def.value == 0)
2316         elf_hash_table (info)->hgot->root.u.def.value = 0x8000;
2317     }
2318
2319   if (htab->elf.sgotplt)
2320     {
2321       struct elf_link_hash_entry *got;
2322       got = elf_link_hash_lookup (elf_hash_table (info),
2323                                   "_GLOBAL_OFFSET_TABLE_",
2324                                   FALSE, FALSE, FALSE);
2325
2326       /* Don't allocate .got.plt section if there are no GOT nor PLT
2327          entries and there is no refeence to _GLOBAL_OFFSET_TABLE_.  */
2328       if ((got == NULL
2329            || !got->ref_regular_nonweak)
2330           && (htab->elf.sgotplt->size
2331               == GOTPLT_HEADER_SIZE)
2332           && (htab->elf.splt == NULL
2333               || htab->elf.splt->size == 0)
2334           && (htab->elf.sgot == NULL
2335               || (htab->elf.sgot->size
2336                   == get_elf_backend_data (output_bfd)->got_header_size)))
2337         htab->elf.sgotplt->size = 0;
2338     }
2339
2340   /* The check_relocs and adjust_dynamic_symbol entry points have
2341      determined the sizes of the various dynamic sections.  Allocate
2342      memory for them.  */
2343   for (s = dynobj->sections; s != NULL; s = s->next)
2344     {
2345       if ((s->flags & SEC_LINKER_CREATED) == 0)
2346         continue;
2347
2348       if (s == htab->elf.splt
2349           || s == htab->elf.sgot
2350           || s == htab->elf.sgotplt
2351           || s == htab->sdynbss)
2352         {
2353           /* Strip this section if we don't need it; see the
2354              comment below.  */
2355         }
2356       else if (strncmp (s->name, ".rela", 5) == 0)
2357         {
2358           if (s->size != 0)
2359             {
2360               /* We use the reloc_count field as a counter if we need
2361                  to copy relocs into the output file.  */
2362               s->reloc_count = 0;
2363             }
2364         }
2365       else
2366         {
2367           /* It's not one of our sections.  */
2368           continue;
2369         }
2370
2371       if (s->size == 0)
2372         {
2373           /* If we don't need this section, strip it from the
2374              output file.  This is mostly to handle .rela.bss and
2375              .rela.plt.  We must create both sections in
2376              create_dynamic_sections, because they must be created
2377              before the linker maps input sections to output
2378              sections.  The linker does that before
2379              adjust_dynamic_symbol is called, and it is that
2380              function which decides whether anything needs to go
2381              into these sections.  */
2382           s->flags |= SEC_EXCLUDE;
2383           continue;
2384         }
2385
2386       if ((s->flags & SEC_HAS_CONTENTS) == 0)
2387         continue;
2388
2389       /* Allocate memory for the section contents.  Zero the memory
2390          for the benefit of .rela.plt, which has 4 unused entries
2391          at the beginning, and we don't want garbage.  */
2392       s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2393       if (s->contents == NULL)
2394         return FALSE;
2395     }
2396
2397   if (elf_hash_table (info)->dynamic_sections_created)
2398     {
2399       /* Add some entries to the .dynamic section.  We fill in the
2400          values later, in tilepro_elf_finish_dynamic_sections, but we
2401          must add the entries now so that we get the correct size for
2402          the .dynamic section.  The DT_DEBUG entry is filled in by the
2403          dynamic linker and used by the debugger.  */
2404 #define add_dynamic_entry(TAG, VAL) \
2405   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2406
2407       if (info->executable)
2408         {
2409           if (!add_dynamic_entry (DT_DEBUG, 0))
2410             return FALSE;
2411         }
2412
2413       if (htab->elf.srelplt->size != 0)
2414         {
2415           if (!add_dynamic_entry (DT_PLTGOT, 0)
2416               || !add_dynamic_entry (DT_PLTRELSZ, 0)
2417               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2418               || !add_dynamic_entry (DT_JMPREL, 0))
2419             return FALSE;
2420         }
2421
2422       if (!add_dynamic_entry (DT_RELA, 0)
2423           || !add_dynamic_entry (DT_RELASZ, 0)
2424           || !add_dynamic_entry (DT_RELAENT, TILEPRO_ELF_RELA_BYTES))
2425         return FALSE;
2426
2427       /* If any dynamic relocs apply to a read-only section,
2428          then we need a DT_TEXTREL entry.  */
2429       if ((info->flags & DF_TEXTREL) == 0)
2430         elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info);
2431
2432       if (info->flags & DF_TEXTREL)
2433         {
2434           if (!add_dynamic_entry (DT_TEXTREL, 0))
2435             return FALSE;
2436         }
2437     }
2438 #undef add_dynamic_entry
2439
2440   return TRUE;
2441 }
2442 \f
2443 /* Return the base VMA address which should be subtracted from real addresses
2444    when resolving @dtpoff relocation.
2445    This is PT_TLS segment p_vaddr.  */
2446
2447 static bfd_vma
2448 dtpoff_base (struct bfd_link_info *info)
2449 {
2450   /* If tls_sec is NULL, we should have signalled an error already.  */
2451   if (elf_hash_table (info)->tls_sec == NULL)
2452     return 0;
2453   return elf_hash_table (info)->tls_sec->vma;
2454 }
2455
2456 /* Return the relocation value for R_TILEPRO_TLS_TPOFF32. */
2457
2458 static bfd_vma
2459 tpoff (struct bfd_link_info *info, bfd_vma address)
2460 {
2461   struct elf_link_hash_table *htab = elf_hash_table (info);
2462
2463   /* If tls_sec is NULL, we should have signalled an error already.  */
2464   if (htab->tls_sec == NULL)
2465     return 0;
2466
2467   return (address - htab->tls_sec->vma);
2468 }
2469
2470 /* Relocate an TILEPRO ELF section.
2471
2472    The RELOCATE_SECTION function is called by the new ELF backend linker
2473    to handle the relocations for a section.
2474
2475    The relocs are always passed as Rela structures.
2476
2477    This function is responsible for adjusting the section contents as
2478    necessary, and (if generating a relocatable output file) adjusting
2479    the reloc addend as necessary.
2480
2481    This function does not have to worry about setting the reloc
2482    address or the reloc symbol index.
2483
2484    LOCAL_SYMS is a pointer to the swapped in local symbols.
2485
2486    LOCAL_SECTIONS is an array giving the section in the input file
2487    corresponding to the st_shndx field of each local symbol.
2488
2489    The global hash table entry for the global symbols can be found
2490    via elf_sym_hashes (input_bfd).
2491
2492    When generating relocatable output, this function must handle
2493    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
2494    going to be the section symbol corresponding to the output
2495    section, which means that the addend must be adjusted
2496    accordingly.  */
2497
2498 static bfd_boolean
2499 tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
2500                               bfd *input_bfd, asection *input_section,
2501                               bfd_byte *contents, Elf_Internal_Rela *relocs,
2502                               Elf_Internal_Sym *local_syms,
2503                               asection **local_sections)
2504 {
2505   struct tilepro_elf_link_hash_table *htab;
2506   Elf_Internal_Shdr *symtab_hdr;
2507   struct elf_link_hash_entry **sym_hashes;
2508   bfd_vma *local_got_offsets;
2509   bfd_vma got_base;
2510   asection *sreloc;
2511   Elf_Internal_Rela *rel;
2512   Elf_Internal_Rela *relend;
2513   int num_relocs;
2514
2515   htab = tilepro_elf_hash_table (info);
2516   BFD_ASSERT (htab != NULL);
2517   symtab_hdr = &elf_symtab_hdr (input_bfd);
2518   sym_hashes = elf_sym_hashes (input_bfd);
2519   local_got_offsets = elf_local_got_offsets (input_bfd);
2520
2521   if (elf_hash_table (info)->hgot == NULL)
2522     got_base = 0;
2523   else
2524     got_base = elf_hash_table (info)->hgot->root.u.def.value;
2525
2526   sreloc = elf_section_data (input_section)->sreloc;
2527
2528   rel = relocs;
2529   num_relocs = input_section->reloc_count;
2530   relend = relocs + num_relocs;
2531   for (; rel < relend; rel++)
2532     {
2533       int r_type, tls_type;
2534       reloc_howto_type *howto;
2535       unsigned long r_symndx;
2536       struct elf_link_hash_entry *h;
2537       Elf_Internal_Sym *sym;
2538       tilepro_create_func create_func;
2539       asection *sec;
2540       bfd_vma relocation;
2541       bfd_reloc_status_type r;
2542       const char *name;
2543       bfd_vma off;
2544       bfd_boolean is_plt = FALSE;
2545
2546       bfd_boolean unresolved_reloc;
2547
2548       r_type = ELF32_R_TYPE (rel->r_info);
2549       if (r_type == R_TILEPRO_GNU_VTINHERIT
2550           || r_type == R_TILEPRO_GNU_VTENTRY)
2551         continue;
2552
2553       if ((unsigned int)r_type >= NELEMS(tilepro_elf_howto_table))
2554         {
2555           /* Not clear if we need to check here, but just be paranoid. */
2556           (*_bfd_error_handler)
2557             (_("%B: unrecognized relocation (0x%x) in section `%A'"),
2558              input_bfd, r_type, input_section);
2559           bfd_set_error (bfd_error_bad_value);
2560           return FALSE;
2561         }
2562
2563       howto = tilepro_elf_howto_table + r_type;
2564
2565       /* This is a final link.  */
2566       r_symndx = ELF32_R_SYM (rel->r_info);
2567       h = NULL;
2568       sym = NULL;
2569       sec = NULL;
2570       unresolved_reloc = FALSE;
2571       if (r_symndx < symtab_hdr->sh_info)
2572         {
2573           sym = local_syms + r_symndx;
2574           sec = local_sections[r_symndx];
2575           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2576         }
2577       else
2578         {
2579           bfd_boolean warned;
2580
2581           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2582                                    r_symndx, symtab_hdr, sym_hashes,
2583                                    h, sec, relocation,
2584                                    unresolved_reloc, warned);
2585           if (warned)
2586             {
2587               /* To avoid generating warning messages about truncated
2588                  relocations, set the relocation's address to be the same as
2589                  the start of this section.  */
2590               if (input_section->output_section != NULL)
2591                 relocation = input_section->output_section->vma;
2592               else
2593                 relocation = 0;
2594             }
2595         }
2596
2597       if (sec != NULL && elf_discarded_section (sec))
2598         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2599                                          rel, relend, howto, contents);
2600
2601       if (info->relocatable)
2602         continue;
2603
2604       if (h != NULL)
2605         name = h->root.root.string;
2606       else
2607         {
2608           name = (bfd_elf_string_from_elf_section
2609                   (input_bfd, symtab_hdr->sh_link, sym->st_name));
2610           if (name == NULL || *name == '\0')
2611             name = bfd_section_name (input_bfd, sec);
2612         }
2613
2614       switch (r_type)
2615         {
2616         case R_TILEPRO_IMM16_X0_GOT:
2617         case R_TILEPRO_IMM16_X1_GOT:
2618         case R_TILEPRO_IMM16_X0_GOT_LO:
2619         case R_TILEPRO_IMM16_X1_GOT_LO:
2620         case R_TILEPRO_IMM16_X0_GOT_HI:
2621         case R_TILEPRO_IMM16_X1_GOT_HI:
2622         case R_TILEPRO_IMM16_X0_GOT_HA:
2623         case R_TILEPRO_IMM16_X1_GOT_HA:
2624           /* Relocation is to the entry for this symbol in the global
2625              offset table.  */
2626           if (htab->elf.sgot == NULL)
2627             abort ();
2628
2629           if (h != NULL)
2630             {
2631               bfd_boolean dyn;
2632
2633               off = h->got.offset;
2634               BFD_ASSERT (off != (bfd_vma) -1);
2635               dyn = elf_hash_table (info)->dynamic_sections_created;
2636
2637               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2638                   || (info->shared
2639                       && SYMBOL_REFERENCES_LOCAL (info, h)))
2640                 {
2641                   /* This is actually a static link, or it is a
2642                      -Bsymbolic link and the symbol is defined
2643                      locally, or the symbol was forced to be local
2644                      because of a version file.  We must initialize
2645                      this entry in the global offset table.  Since the
2646                      offset must always be a multiple
2647                      of 4 for 32-bit, we use the least significant bit
2648                      to record whether we have initialized it already.
2649
2650                      When doing a dynamic link, we create a .rela.got
2651                      relocation entry to initialize the value.  This
2652                      is done in the finish_dynamic_symbol routine.  */
2653                   if ((off & 1) != 0)
2654                     off &= ~1;
2655                   else
2656                     {
2657                       bfd_put_32 (output_bfd, relocation,
2658                                           htab->elf.sgot->contents + off);
2659                       h->got.offset |= 1;
2660                     }
2661                 }
2662               else
2663                 unresolved_reloc = FALSE;
2664             }
2665           else
2666             {
2667               BFD_ASSERT (local_got_offsets != NULL
2668                           && local_got_offsets[r_symndx] != (bfd_vma) -1);
2669
2670               off = local_got_offsets[r_symndx];
2671
2672               /* The offset must always be a multiple of 4 on 32-bit.
2673                  We use the least significant bit to record
2674                  whether we have already processed this entry.  */
2675               if ((off & 1) != 0)
2676                 off &= ~1;
2677               else
2678                 {
2679                   if (info->shared)
2680                     {
2681                       asection *s;
2682                       Elf_Internal_Rela outrel;
2683
2684                       /* We need to generate a R_TILEPRO_RELATIVE reloc
2685                          for the dynamic linker.  */
2686                       s = htab->elf.srelgot;
2687                       BFD_ASSERT (s != NULL);
2688
2689                       outrel.r_offset = (htab->elf.sgot->output_section->vma
2690                                          + htab->elf.sgot->output_offset
2691                                          + off);
2692                       outrel.r_info = ELF32_R_INFO (0, R_TILEPRO_RELATIVE);
2693                       outrel.r_addend = relocation;
2694                       relocation = 0;
2695                       tilepro_elf_append_rela_32 (output_bfd, s, &outrel);
2696                     }
2697
2698                   bfd_put_32 (output_bfd, relocation,
2699                                       htab->elf.sgot->contents + off);
2700                   local_got_offsets[r_symndx] |= 1;
2701                 }
2702             }
2703           relocation = htab->elf.sgot->output_offset + off - got_base;
2704           break;
2705
2706         case R_TILEPRO_JOFFLONG_X1_PLT:
2707           /* Relocation is to the entry for this symbol in the
2708              procedure linkage table.  */
2709           BFD_ASSERT (h != NULL);
2710
2711           if (h->plt.offset == (bfd_vma) -1 || htab->elf.splt == NULL)
2712             {
2713               /* We didn't make a PLT entry for this symbol.  This
2714                  happens when statically linking PIC code, or when
2715                  using -Bsymbolic.  */
2716               break;
2717             }
2718
2719           relocation = (htab->elf.splt->output_section->vma
2720                         + htab->elf.splt->output_offset
2721                         + h->plt.offset);
2722           unresolved_reloc = FALSE;
2723           break;
2724
2725         case R_TILEPRO_32_PCREL:
2726         case R_TILEPRO_16_PCREL:
2727         case R_TILEPRO_8_PCREL:
2728         case R_TILEPRO_IMM16_X0_PCREL:
2729         case R_TILEPRO_IMM16_X1_PCREL:
2730         case R_TILEPRO_IMM16_X0_LO_PCREL:
2731         case R_TILEPRO_IMM16_X1_LO_PCREL:
2732         case R_TILEPRO_IMM16_X0_HI_PCREL:
2733         case R_TILEPRO_IMM16_X1_HI_PCREL:
2734         case R_TILEPRO_IMM16_X0_HA_PCREL:
2735         case R_TILEPRO_IMM16_X1_HA_PCREL:
2736           if (h != NULL
2737               && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
2738             break;
2739           /* Fall through.  */
2740         case R_TILEPRO_32:
2741         case R_TILEPRO_16:
2742         case R_TILEPRO_8:
2743         case R_TILEPRO_LO16:
2744         case R_TILEPRO_HI16:
2745         case R_TILEPRO_HA16:
2746         case R_TILEPRO_COPY:
2747         case R_TILEPRO_GLOB_DAT:
2748         case R_TILEPRO_JMP_SLOT:
2749         case R_TILEPRO_RELATIVE:
2750         case R_TILEPRO_BROFF_X1:
2751         case R_TILEPRO_JOFFLONG_X1:
2752         case R_TILEPRO_IMM8_X0:
2753         case R_TILEPRO_IMM8_Y0:
2754         case R_TILEPRO_IMM8_X1:
2755         case R_TILEPRO_IMM8_Y1:
2756         case R_TILEPRO_DEST_IMM8_X1:
2757         case R_TILEPRO_MT_IMM15_X1:
2758         case R_TILEPRO_MF_IMM15_X1:
2759         case R_TILEPRO_IMM16_X0:
2760         case R_TILEPRO_IMM16_X1:
2761         case R_TILEPRO_IMM16_X0_LO:
2762         case R_TILEPRO_IMM16_X1_LO:
2763         case R_TILEPRO_IMM16_X0_HI:
2764         case R_TILEPRO_IMM16_X1_HI:
2765         case R_TILEPRO_IMM16_X0_HA:
2766         case R_TILEPRO_IMM16_X1_HA:
2767         case R_TILEPRO_MMSTART_X0:
2768         case R_TILEPRO_MMEND_X0:
2769         case R_TILEPRO_MMSTART_X1:
2770         case R_TILEPRO_MMEND_X1:
2771         case R_TILEPRO_SHAMT_X0:
2772         case R_TILEPRO_SHAMT_X1:
2773         case R_TILEPRO_SHAMT_Y0:
2774         case R_TILEPRO_SHAMT_Y1:
2775           if ((input_section->flags & SEC_ALLOC) == 0)
2776             break;
2777
2778           if ((info->shared
2779                && (h == NULL
2780                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2781                    || h->root.type != bfd_link_hash_undefweak)
2782                && (! howto->pc_relative
2783                    || !SYMBOL_CALLS_LOCAL (info, h)))
2784               || (!info->shared
2785                   && h != NULL
2786                   && h->dynindx != -1
2787                   && !h->non_got_ref
2788                   && ((h->def_dynamic
2789                        && !h->def_regular)
2790                       || h->root.type == bfd_link_hash_undefweak
2791                       || h->root.type == bfd_link_hash_undefined)))
2792             {
2793               Elf_Internal_Rela outrel;
2794               bfd_boolean skip, relocate = FALSE;
2795
2796               /* When generating a shared object, these relocations
2797                  are copied into the output file to be resolved at run
2798                  time.  */
2799
2800               BFD_ASSERT (sreloc != NULL);
2801
2802               skip = FALSE;
2803
2804               outrel.r_offset =
2805                 _bfd_elf_section_offset (output_bfd, info, input_section,
2806                                          rel->r_offset);
2807               if (outrel.r_offset == (bfd_vma) -1)
2808                 skip = TRUE;
2809               else if (outrel.r_offset == (bfd_vma) -2)
2810                 skip = TRUE, relocate = TRUE;
2811               outrel.r_offset += (input_section->output_section->vma
2812                                   + input_section->output_offset);
2813
2814               switch (r_type)
2815                 {
2816                 case R_TILEPRO_32_PCREL:
2817                 case R_TILEPRO_16_PCREL:
2818                 case R_TILEPRO_8_PCREL:
2819                   /* If the symbol is not dynamic, we should not keep
2820                      a dynamic relocation.  But an .rela.* slot has been
2821                      allocated for it, output R_TILEPRO_NONE.
2822                      FIXME: Add code tracking needed dynamic relocs as
2823                      e.g. i386 has.  */
2824                   if (h->dynindx == -1)
2825                     skip = TRUE, relocate = TRUE;
2826                   break;
2827                 }
2828
2829               if (skip)
2830                 memset (&outrel, 0, sizeof outrel);
2831               /* h->dynindx may be -1 if the symbol was marked to
2832                  become local.  */
2833               else if (h != NULL &&
2834                        h->dynindx != -1
2835                        && (! is_plt
2836                            || !info->shared
2837                            || !SYMBOLIC_BIND (info, h)
2838                            || !h->def_regular))
2839                 {
2840                   BFD_ASSERT (h->dynindx != -1);
2841                   outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2842                   outrel.r_addend = rel->r_addend;
2843                 }
2844               else
2845                 {
2846                   if (r_type == R_TILEPRO_32)
2847                     {
2848                       outrel.r_info = ELF32_R_INFO (0, R_TILEPRO_RELATIVE);
2849                       outrel.r_addend = relocation + rel->r_addend;
2850                     }
2851                   else
2852                     {
2853                       long indx;
2854
2855                       outrel.r_addend = relocation + rel->r_addend;
2856
2857                       if (is_plt)
2858                         sec = htab->elf.splt;
2859
2860                       if (bfd_is_abs_section (sec))
2861                         indx = 0;
2862                       else if (sec == NULL || sec->owner == NULL)
2863                         {
2864                           bfd_set_error (bfd_error_bad_value);
2865                           return FALSE;
2866                         }
2867                       else
2868                         {
2869                           asection *osec;
2870
2871                           /* We are turning this relocation into one
2872                              against a section symbol.  It would be
2873                              proper to subtract the symbol's value,
2874                              osec->vma, from the emitted reloc addend,
2875                              but ld.so expects buggy relocs.  */
2876                           osec = sec->output_section;
2877                           indx = elf_section_data (osec)->dynindx;
2878
2879                           if (indx == 0)
2880                             {
2881                               osec = htab->elf.text_index_section;
2882                               indx = elf_section_data (osec)->dynindx;
2883                             }
2884
2885                           /* FIXME: we really should be able to link non-pic
2886                              shared libraries.  */
2887                           if (indx == 0)
2888                             {
2889                               BFD_FAIL ();
2890                               (*_bfd_error_handler)
2891                                 (_("%B: probably compiled without -fPIC?"),
2892                                  input_bfd);
2893                               bfd_set_error (bfd_error_bad_value);
2894                               return FALSE;
2895                             }
2896                         }
2897
2898                       outrel.r_info = ELF32_R_INFO (indx, r_type);
2899                     }
2900                 }
2901
2902               tilepro_elf_append_rela_32 (output_bfd, sreloc, &outrel);
2903
2904               /* This reloc will be computed at runtime, so there's no
2905                  need to do anything now.  */
2906               if (! relocate)
2907                 continue;
2908             }
2909           break;
2910
2911         case R_TILEPRO_IMM16_X0_TLS_GD:
2912         case R_TILEPRO_IMM16_X1_TLS_GD:
2913         case R_TILEPRO_IMM16_X0_TLS_GD_LO:
2914         case R_TILEPRO_IMM16_X1_TLS_GD_LO:
2915         case R_TILEPRO_IMM16_X0_TLS_GD_HI:
2916         case R_TILEPRO_IMM16_X1_TLS_GD_HI:
2917         case R_TILEPRO_IMM16_X0_TLS_GD_HA:
2918         case R_TILEPRO_IMM16_X1_TLS_GD_HA:
2919           tls_type = GOT_TLS_GD;
2920           goto have_tls_reference;
2921
2922         case R_TILEPRO_IMM16_X0_TLS_IE:
2923         case R_TILEPRO_IMM16_X1_TLS_IE:
2924         case R_TILEPRO_IMM16_X0_TLS_IE_LO:
2925         case R_TILEPRO_IMM16_X1_TLS_IE_LO:
2926         case R_TILEPRO_IMM16_X0_TLS_IE_HI:
2927         case R_TILEPRO_IMM16_X1_TLS_IE_HI:
2928         case R_TILEPRO_IMM16_X0_TLS_IE_HA:
2929         case R_TILEPRO_IMM16_X1_TLS_IE_HA:
2930           tls_type = GOT_TLS_IE;
2931           /* Fall through. */
2932
2933         have_tls_reference:
2934           if (h == NULL && local_got_offsets)
2935             tls_type
2936               = _bfd_tilepro_elf_local_got_tls_type (input_bfd) [r_symndx];
2937           else if (h != NULL)
2938             {
2939               tls_type = tilepro_elf_hash_entry(h)->tls_type;
2940             }
2941           if (tls_type == GOT_TLS_IE)
2942             switch (r_type)
2943               {
2944               case R_TILEPRO_IMM16_X0_TLS_GD:
2945                 r_type = R_TILEPRO_IMM16_X0_TLS_IE;
2946                 break;
2947               case R_TILEPRO_IMM16_X1_TLS_GD:
2948                 r_type = R_TILEPRO_IMM16_X1_TLS_IE;
2949                 break;
2950               case R_TILEPRO_IMM16_X0_TLS_GD_LO:
2951                 r_type = R_TILEPRO_IMM16_X0_TLS_IE_LO;
2952                 break;
2953               case R_TILEPRO_IMM16_X1_TLS_GD_LO:
2954                 r_type = R_TILEPRO_IMM16_X1_TLS_IE_LO;
2955                 break;
2956               case R_TILEPRO_IMM16_X0_TLS_GD_HI:
2957                 r_type = R_TILEPRO_IMM16_X0_TLS_IE_HI;
2958                 break;
2959               case R_TILEPRO_IMM16_X1_TLS_GD_HI:
2960                 r_type = R_TILEPRO_IMM16_X1_TLS_IE_HI;
2961                 break;
2962               case R_TILEPRO_IMM16_X0_TLS_GD_HA:
2963                 r_type = R_TILEPRO_IMM16_X0_TLS_IE_HA;
2964                 break;
2965               case R_TILEPRO_IMM16_X1_TLS_GD_HA:
2966                 r_type = R_TILEPRO_IMM16_X1_TLS_IE_HA;
2967                 break;
2968               }
2969
2970           if (h != NULL)
2971             {
2972               off = h->got.offset;
2973               h->got.offset |= 1;
2974             }
2975           else
2976             {
2977               BFD_ASSERT (local_got_offsets != NULL);
2978               off = local_got_offsets[r_symndx];
2979               local_got_offsets[r_symndx] |= 1;
2980             }
2981
2982           if (htab->elf.sgot == NULL)
2983             abort ();
2984
2985           if ((off & 1) != 0)
2986             off &= ~1;
2987           else
2988             {
2989               Elf_Internal_Rela outrel;
2990               int indx = 0;
2991               bfd_boolean need_relocs = FALSE;
2992
2993               if (htab->elf.srelgot == NULL)
2994                 abort ();
2995
2996               if (h != NULL)
2997               {
2998                 bfd_boolean dyn;
2999                 dyn = htab->elf.dynamic_sections_created;
3000
3001                 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3002                     && (!info->shared
3003                         || !SYMBOL_REFERENCES_LOCAL (info, h)))
3004                   {
3005                     indx = h->dynindx;
3006                   }
3007               }
3008
3009               /* The GOT entries have not been initialized yet.  Do it
3010                  now, and emit any relocations. */
3011               if ((info->shared || indx != 0)
3012                   && (h == NULL
3013                       || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
3014                       || h->root.type != bfd_link_hash_undefweak))
3015                     need_relocs = TRUE;
3016
3017               switch (r_type)
3018                 {
3019                   case R_TILEPRO_IMM16_X0_TLS_IE:
3020                   case R_TILEPRO_IMM16_X1_TLS_IE:
3021                   case R_TILEPRO_IMM16_X0_TLS_IE_LO:
3022                   case R_TILEPRO_IMM16_X1_TLS_IE_LO:
3023                   case R_TILEPRO_IMM16_X0_TLS_IE_HI:
3024                   case R_TILEPRO_IMM16_X1_TLS_IE_HI:
3025                   case R_TILEPRO_IMM16_X0_TLS_IE_HA:
3026                   case R_TILEPRO_IMM16_X1_TLS_IE_HA:
3027                     if (need_relocs) {
3028                       bfd_put_32 (output_bfd, 0, htab->elf.sgot->contents + off);
3029                       outrel.r_offset = (htab->elf.sgot->output_section->vma
3030                                        + htab->elf.sgot->output_offset + off);
3031                       outrel.r_addend = 0;
3032                       if (indx == 0)
3033                         outrel.r_addend = relocation - dtpoff_base (info);
3034                       outrel.r_info = ELF32_R_INFO (indx, R_TILEPRO_TLS_TPOFF32);
3035                       tilepro_elf_append_rela_32 (output_bfd, htab->elf.srelgot,
3036                                                   &outrel);
3037                     } else {
3038                       bfd_put_32 (output_bfd, tpoff (info, relocation),
3039                                   htab->elf.sgot->contents + off);
3040                     }
3041                     break;
3042
3043                   case R_TILEPRO_IMM16_X0_TLS_GD:
3044                   case R_TILEPRO_IMM16_X1_TLS_GD:
3045                   case R_TILEPRO_IMM16_X0_TLS_GD_LO:
3046                   case R_TILEPRO_IMM16_X1_TLS_GD_LO:
3047                   case R_TILEPRO_IMM16_X0_TLS_GD_HI:
3048                   case R_TILEPRO_IMM16_X1_TLS_GD_HI:
3049                   case R_TILEPRO_IMM16_X0_TLS_GD_HA:
3050                   case R_TILEPRO_IMM16_X1_TLS_GD_HA:
3051                     if (need_relocs) {
3052                       outrel.r_offset = (htab->elf.sgot->output_section->vma
3053                                        + htab->elf.sgot->output_offset + off);
3054                       outrel.r_addend = 0;
3055                       outrel.r_info = ELF32_R_INFO (indx, R_TILEPRO_TLS_DTPMOD32);
3056                       bfd_put_32 (output_bfd, 0, htab->elf.sgot->contents + off);
3057                       tilepro_elf_append_rela_32 (output_bfd, htab->elf.srelgot,
3058                                                   &outrel);
3059                       if (indx == 0)
3060                         {
3061                           BFD_ASSERT (! unresolved_reloc);
3062                           bfd_put_32 (output_bfd,
3063                                       relocation - dtpoff_base (info),
3064                                       (htab->elf.sgot->contents + off +
3065                                        TILEPRO_BYTES_PER_WORD));
3066                         }
3067                       else
3068                         {
3069                           bfd_put_32 (output_bfd, 0,
3070                                       (htab->elf.sgot->contents + off +
3071                                        TILEPRO_BYTES_PER_WORD));
3072                           outrel.r_info = ELF32_R_INFO (indx,
3073                                                         R_TILEPRO_TLS_DTPOFF32);
3074                           outrel.r_offset += TILEPRO_BYTES_PER_WORD;
3075                           tilepro_elf_append_rela_32 (output_bfd,
3076                                                       htab->elf.srelgot, &outrel);
3077                         }
3078                     }
3079
3080                     else {
3081                       /* If we are not emitting relocations for a
3082                          general dynamic reference, then we must be in a
3083                          static link or an executable link with the
3084                          symbol binding locally.  Mark it as belonging
3085                          to module 1, the executable.  */
3086                       bfd_put_32 (output_bfd, 1,
3087                                   htab->elf.sgot->contents + off );
3088                       bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
3089                                   htab->elf.sgot->contents + off +
3090                                   TILEPRO_BYTES_PER_WORD);
3091                    }
3092                    break;
3093                 }
3094             }
3095
3096           if (off >= (bfd_vma) -2)
3097             abort ();
3098
3099           relocation = htab->elf.sgot->output_offset + off - got_base;
3100           unresolved_reloc = FALSE;
3101           howto = tilepro_elf_howto_table + r_type;
3102           break;
3103
3104         default:
3105           break;
3106         }
3107
3108       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
3109          because such sections are not SEC_ALLOC and thus ld.so will
3110          not process them.  */
3111       if (unresolved_reloc
3112           && !((input_section->flags & SEC_DEBUGGING) != 0
3113                && h->def_dynamic)
3114           && _bfd_elf_section_offset (output_bfd, info, input_section,
3115                                       rel->r_offset) != (bfd_vma) -1)
3116         (*_bfd_error_handler)
3117           (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
3118            input_bfd,
3119            input_section,
3120            (long) rel->r_offset,
3121            howto->name,
3122            h->root.root.string);
3123
3124       r = bfd_reloc_continue;
3125
3126       /* For the _HA types, we add 0x8000 so that if bit 15 is set,
3127        * we will increment bit 16.  The howto->rightshift takes care
3128        * of the rest for us. */
3129       switch (r_type)
3130       {
3131       case R_TILEPRO_HA16:
3132       case R_TILEPRO_IMM16_X0_HA:
3133       case R_TILEPRO_IMM16_X1_HA:
3134       case R_TILEPRO_IMM16_X0_HA_PCREL:
3135       case R_TILEPRO_IMM16_X1_HA_PCREL:
3136       case R_TILEPRO_IMM16_X0_GOT_HA:
3137       case R_TILEPRO_IMM16_X1_GOT_HA:
3138       case R_TILEPRO_IMM16_X0_TLS_GD_HA:
3139       case R_TILEPRO_IMM16_X1_TLS_GD_HA:
3140       case R_TILEPRO_IMM16_X0_TLS_IE_HA:
3141       case R_TILEPRO_IMM16_X1_TLS_IE_HA:
3142         relocation += 0x8000;
3143         break;
3144       }
3145
3146       /* Get the operand creation function, if any. */
3147       create_func = reloc_to_create_func[r_type];
3148       if (create_func == NULL)
3149       {
3150         r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3151                                       contents, rel->r_offset,
3152                                       relocation, rel->r_addend);
3153       }
3154       else
3155       {
3156         if (howto->pc_relative)
3157         {
3158           relocation -=
3159             input_section->output_section->vma + input_section->output_offset;
3160           if (howto->pcrel_offset)
3161             relocation -= rel->r_offset;
3162         }
3163
3164         bfd_byte *data;
3165
3166         /* Add the relocation addend if any to the final target value */
3167         relocation += rel->r_addend;
3168
3169         /* Do basic range checking */
3170         r = bfd_check_overflow (howto->complain_on_overflow,
3171                                 howto->bitsize,
3172                                 howto->rightshift,
3173                                 32,
3174                                 relocation);
3175
3176         /*
3177          * Write the relocated value out into the raw section data.
3178          * Don't put a relocation out in the .rela section.
3179          */
3180         tilepro_bundle_bits mask = create_func(-1);
3181         tilepro_bundle_bits value = create_func(relocation >> howto->rightshift);
3182
3183         /* Only touch bytes while the mask is not 0, so we
3184            don't write to out of bounds memory if this is actually
3185            a 16-bit switch instruction. */
3186         for (data = contents + rel->r_offset; mask != 0; data++)
3187           {
3188             bfd_byte byte_mask = (bfd_byte)mask;
3189             *data = (*data & ~byte_mask) | ((bfd_byte)value & byte_mask);
3190             mask >>= 8;
3191             value >>= 8;
3192           }
3193       }
3194
3195       if (r != bfd_reloc_ok)
3196         {
3197           const char *msg = NULL;
3198
3199           switch (r)
3200             {
3201             case bfd_reloc_overflow:
3202               r = info->callbacks->reloc_overflow
3203                 (info, (h ? &h->root : NULL), name, howto->name,
3204                  (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
3205               break;
3206
3207             case bfd_reloc_undefined:
3208               r = info->callbacks->undefined_symbol
3209                 (info, name, input_bfd, input_section, rel->r_offset,
3210                  TRUE);
3211               break;
3212
3213             case bfd_reloc_outofrange:
3214               msg = _("internal error: out of range error");
3215               break;
3216
3217             case bfd_reloc_notsupported:
3218               msg = _("internal error: unsupported relocation error");
3219               break;
3220
3221             case bfd_reloc_dangerous:
3222               msg = _("internal error: dangerous relocation");
3223               break;
3224
3225             default:
3226               msg = _("internal error: unknown error");
3227               break;
3228             }
3229
3230           if (msg)
3231             r = info->callbacks->warning
3232               (info, msg, name, input_bfd, input_section, rel->r_offset);
3233
3234           if (! r)
3235             return FALSE;
3236         }
3237     }
3238
3239   return TRUE;
3240 }
3241
3242 /* Finish up dynamic symbol handling.  We set the contents of various
3243    dynamic sections here.  */
3244
3245 static bfd_boolean
3246 tilepro_elf_finish_dynamic_symbol (bfd *output_bfd,
3247                                    struct bfd_link_info *info,
3248                                    struct elf_link_hash_entry *h,
3249                                    Elf_Internal_Sym *sym)
3250 {
3251   struct tilepro_elf_link_hash_table *htab;
3252
3253   htab = tilepro_elf_hash_table (info);
3254   BFD_ASSERT (htab != NULL);
3255
3256   if (h->plt.offset != (bfd_vma) -1)
3257     {
3258       asection *splt;
3259       asection *srela;
3260       asection *sgotplt;
3261       Elf_Internal_Rela rela;
3262       bfd_byte *loc;
3263       bfd_vma r_offset;
3264
3265       int rela_index;
3266
3267       /* This symbol has an entry in the PLT.  Set it up.  */
3268
3269       BFD_ASSERT (h->dynindx != -1);
3270
3271       splt = htab->elf.splt;
3272       srela = htab->elf.srelplt;
3273       sgotplt = htab->elf.sgotplt;
3274
3275       if (splt == NULL || srela == NULL)
3276        abort ();
3277
3278       /* Fill in the entry in the procedure linkage table.  */
3279       rela_index = tilepro_plt_entry_build (splt, sgotplt, h->plt.offset,
3280                                             &r_offset);
3281
3282       /* Fill in the entry in the global offset table, which initially points
3283          to the beginning of the plt.  */
3284       bfd_put_32 (output_bfd, splt->output_section->vma + splt->output_offset,
3285                   sgotplt->contents + r_offset);
3286
3287       /* Fill in the entry in the .rela.plt section.  */
3288       rela.r_offset = (sgotplt->output_section->vma
3289                        + sgotplt->output_offset
3290                        + r_offset);
3291       rela.r_addend = 0;
3292       rela.r_info = ELF32_R_INFO (h->dynindx, R_TILEPRO_JMP_SLOT);
3293
3294       loc = srela->contents + rela_index * sizeof (Elf32_External_Rela);
3295       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3296
3297       if (!h->def_regular)
3298         {
3299           /* Mark the symbol as undefined, rather than as defined in
3300              the .plt section.  Leave the value alone.  */
3301           sym->st_shndx = SHN_UNDEF;
3302           /* If the symbol is weak, we do need to clear the value.
3303              Otherwise, the PLT entry would provide a definition for
3304              the symbol even if the symbol wasn't defined anywhere,
3305              and so the symbol would never be NULL.  */
3306           if (!h->ref_regular_nonweak)
3307             sym->st_value = 0;
3308         }
3309     }
3310
3311   if (h->got.offset != (bfd_vma) -1
3312       && tilepro_elf_hash_entry(h)->tls_type != GOT_TLS_GD
3313       && tilepro_elf_hash_entry(h)->tls_type != GOT_TLS_IE)
3314     {
3315       asection *sgot;
3316       asection *srela;
3317       Elf_Internal_Rela rela;
3318
3319       /* This symbol has an entry in the GOT.  Set it up.  */
3320
3321       sgot = htab->elf.sgot;
3322       srela = htab->elf.srelgot;
3323       BFD_ASSERT (sgot != NULL && srela != NULL);
3324
3325       rela.r_offset = (sgot->output_section->vma
3326                        + sgot->output_offset
3327                        + (h->got.offset &~ (bfd_vma) 1));
3328
3329       /* If this is a -Bsymbolic link, and the symbol is defined
3330          locally, we just want to emit a RELATIVE reloc.  Likewise if
3331          the symbol was forced to be local because of a version file.
3332          The entry in the global offset table will already have been
3333          initialized in the relocate_section function.  */
3334       if (info->shared
3335           && (info->symbolic || h->dynindx == -1)
3336           && h->def_regular)
3337         {
3338           asection *sec = h->root.u.def.section;
3339           rela.r_info = ELF32_R_INFO (0, R_TILEPRO_RELATIVE);
3340           rela.r_addend = (h->root.u.def.value
3341                            + sec->output_section->vma
3342                            + sec->output_offset);
3343         }
3344       else
3345         {
3346           rela.r_info = ELF32_R_INFO (h->dynindx, R_TILEPRO_GLOB_DAT);
3347           rela.r_addend = 0;
3348         }
3349
3350       bfd_put_32 (output_bfd, 0,
3351                           sgot->contents + (h->got.offset & ~(bfd_vma) 1));
3352       tilepro_elf_append_rela_32 (output_bfd, srela, &rela);
3353     }
3354
3355   if (h->needs_copy)
3356     {
3357       asection *s;
3358       Elf_Internal_Rela rela;
3359
3360       /* This symbols needs a copy reloc.  Set it up.  */
3361       BFD_ASSERT (h->dynindx != -1);
3362
3363       s = bfd_get_section_by_name (h->root.u.def.section->owner,
3364                                    ".rela.bss");
3365       BFD_ASSERT (s != NULL);
3366
3367       rela.r_offset = (h->root.u.def.value
3368                        + h->root.u.def.section->output_section->vma
3369                        + h->root.u.def.section->output_offset);
3370       rela.r_info = ELF32_R_INFO (h->dynindx, R_TILEPRO_COPY);
3371       rela.r_addend = 0;
3372       tilepro_elf_append_rela_32 (output_bfd, s, &rela);
3373     }
3374
3375   /* Mark some specially defined symbols as absolute. */
3376   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3377       || (h == htab->elf.hgot || h == htab->elf.hplt))
3378     sym->st_shndx = SHN_ABS;
3379
3380   return TRUE;
3381 }
3382
3383 /* Finish up the dynamic sections.  */
3384
3385 static bfd_boolean
3386 tilepro_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
3387                     bfd *dynobj, asection *sdyn,
3388                     asection *splt ATTRIBUTE_UNUSED)
3389 {
3390   Elf32_External_Dyn *dyncon, *dynconend;
3391   struct tilepro_elf_link_hash_table *htab;
3392
3393   htab = tilepro_elf_hash_table (info);
3394   BFD_ASSERT (htab != NULL);
3395   dyncon = (Elf32_External_Dyn *) sdyn->contents;
3396   dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
3397   for (; dyncon < dynconend; dyncon++)
3398     {
3399       Elf_Internal_Dyn dyn;
3400       asection *s;
3401
3402       bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3403
3404       switch (dyn.d_tag)
3405         {
3406         case DT_PLTGOT:
3407           s = htab->elf.sgotplt;
3408           dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
3409           break;
3410         case DT_JMPREL:
3411           s = htab->elf.srelplt;
3412           dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
3413           break;
3414         case DT_PLTRELSZ:
3415           s = htab->elf.srelplt;
3416           dyn.d_un.d_val = s->size;
3417           break;
3418         default:
3419           continue;
3420         }
3421
3422       bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3423     }
3424   return TRUE;
3425 }
3426
3427 static bfd_boolean
3428 tilepro_elf_finish_dynamic_sections (bfd *output_bfd,
3429                                      struct bfd_link_info *info)
3430 {
3431   bfd *dynobj;
3432   asection *sdyn;
3433   struct tilepro_elf_link_hash_table *htab;
3434
3435   htab = tilepro_elf_hash_table (info);
3436   BFD_ASSERT (htab != NULL);
3437   dynobj = htab->elf.dynobj;
3438
3439   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3440
3441   if (elf_hash_table (info)->dynamic_sections_created)
3442     {
3443       asection *splt;
3444       bfd_boolean ret;
3445
3446       splt = bfd_get_section_by_name (dynobj, ".plt");
3447       BFD_ASSERT (splt != NULL && sdyn != NULL);
3448
3449       ret = tilepro_finish_dyn (output_bfd, info, dynobj, sdyn, splt);
3450
3451       if (ret != TRUE)
3452         return ret;
3453
3454       /* Fill in the first entry in the procedure linkage table.  */
3455       if (splt->size > 0)
3456         memcpy (splt->contents, tilepro_plt0_entry, PLT_HEADER_SIZE);
3457
3458       elf_section_data (splt->output_section)->this_hdr.sh_entsize
3459         = PLT_ENTRY_SIZE;
3460     }
3461
3462   if (htab->elf.sgotplt)
3463     {
3464       if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
3465         {
3466           (*_bfd_error_handler)
3467             (_("discarded output section: `%A'"), htab->elf.sgotplt);
3468           return FALSE;
3469         }
3470
3471       if (htab->elf.sgotplt->size > 0)
3472         {
3473           /* Write the first two entries in .got.plt, needed for the dynamic
3474              linker.  */
3475           bfd_put_32 (output_bfd, (bfd_vma) -1,
3476                       htab->elf.sgotplt->contents);
3477           bfd_put_32 (output_bfd, (bfd_vma) 0,
3478                       htab->elf.sgotplt->contents + GOT_ENTRY_SIZE);
3479         }
3480
3481       elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize
3482         = GOT_ENTRY_SIZE;
3483     }
3484
3485   if (htab->elf.sgot)
3486     {
3487       if (htab->elf.sgot->size > 0)
3488         {
3489           /* Set the first entry in the global offset table to the address of
3490              the dynamic section.  */
3491           bfd_vma val = (sdyn ?
3492                          sdyn->output_section->vma + sdyn->output_offset :
3493                          0);
3494           bfd_put_32 (output_bfd, val, htab->elf.sgot->contents);
3495         }
3496
3497       elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
3498         = GOT_ENTRY_SIZE;
3499     }
3500
3501   return TRUE;
3502 }
3503
3504 \f
3505
3506 /* Return address for Ith PLT stub in section PLT, for relocation REL
3507    or (bfd_vma) -1 if it should not be included.  */
3508
3509 static bfd_vma
3510 tilepro_elf_plt_sym_val (bfd_vma i, const asection *plt,
3511                       const arelent *rel ATTRIBUTE_UNUSED)
3512 {
3513   return plt->vma + PLT_HEADER_SIZE + i * PLT_ENTRY_SIZE;
3514 }
3515
3516 static enum elf_reloc_type_class
3517 tilepro_reloc_type_class (const Elf_Internal_Rela *rela)
3518 {
3519   switch ((int) ELF32_R_TYPE (rela->r_info))
3520     {
3521     case R_TILEPRO_RELATIVE:
3522       return reloc_class_relative;
3523     case R_TILEPRO_JMP_SLOT:
3524       return reloc_class_plt;
3525     case R_TILEPRO_COPY:
3526       return reloc_class_copy;
3527     default:
3528       return reloc_class_normal;
3529     }
3530 }
3531
3532 static int
3533 tilepro_additional_program_headers (bfd *abfd,
3534                                     struct bfd_link_info *info ATTRIBUTE_UNUSED)
3535 {
3536   /* Each .intrpt section specified by the user adds another PT_LOAD
3537      header since the sections are discontiguous. */
3538   static const char intrpt_sections[4][9] =
3539     {
3540       ".intrpt0", ".intrpt1", ".intrpt2", ".intrpt3"
3541     };
3542   int count = 0;
3543   int i;
3544
3545   for (i = 0; i < 4; i++)
3546     {
3547       asection *sec = bfd_get_section_by_name (abfd, intrpt_sections[i]);
3548       if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
3549         ++count;
3550     }
3551
3552   /* Add four "padding" headers in to leave room in case a custom linker
3553      script does something fancy. Otherwise ld complains that it ran
3554      out of program headers and refuses to link. */
3555   count += 4;
3556
3557   return count;
3558 }
3559
3560 #define ELF_ARCH                bfd_arch_tilepro
3561 #define ELF_TARGET_ID           TILEPRO_ELF_DATA
3562 #define ELF_MACHINE_CODE        EM_TILEPRO
3563 #define ELF_MAXPAGESIZE         0x10000
3564 #define ELF_COMMONPAGESIZE      0x10000
3565
3566 #define TARGET_LITTLE_SYM       bfd_elf32_tilepro_vec
3567 #define TARGET_LITTLE_NAME      "elf32-tilepro"
3568
3569 #define elf_backend_reloc_type_class         tilepro_reloc_type_class
3570
3571 #define bfd_elf32_bfd_reloc_name_lookup      tilepro_reloc_name_lookup
3572 #define bfd_elf32_bfd_link_hash_table_create tilepro_elf_link_hash_table_create
3573 #define bfd_elf32_bfd_reloc_type_lookup      tilepro_reloc_type_lookup
3574
3575 #define elf_backend_copy_indirect_symbol     tilepro_elf_copy_indirect_symbol
3576 #define elf_backend_create_dynamic_sections  tilepro_elf_create_dynamic_sections
3577 #define elf_backend_check_relocs             tilepro_elf_check_relocs
3578 #define elf_backend_adjust_dynamic_symbol    tilepro_elf_adjust_dynamic_symbol
3579 #define elf_backend_omit_section_dynsym      tilepro_elf_omit_section_dynsym
3580 #define elf_backend_size_dynamic_sections    tilepro_elf_size_dynamic_sections
3581 #define elf_backend_relocate_section         tilepro_elf_relocate_section
3582 #define elf_backend_finish_dynamic_symbol    tilepro_elf_finish_dynamic_symbol
3583 #define elf_backend_finish_dynamic_sections  tilepro_elf_finish_dynamic_sections
3584 #define elf_backend_gc_mark_hook             tilepro_elf_gc_mark_hook
3585 #define elf_backend_gc_sweep_hook            tilepro_elf_gc_sweep_hook
3586 #define elf_backend_plt_sym_val              tilepro_elf_plt_sym_val
3587 #define elf_info_to_howto_rel                NULL
3588 #define elf_info_to_howto                    tilepro_info_to_howto_rela
3589 #define elf_backend_grok_prstatus            tilepro_elf_grok_prstatus
3590 #define elf_backend_grok_psinfo              tilepro_elf_grok_psinfo
3591 #define elf_backend_additional_program_headers tilepro_additional_program_headers
3592
3593 #define elf_backend_init_index_section  _bfd_elf_init_1_index_section
3594
3595 #define elf_backend_can_gc_sections 1
3596 #define elf_backend_can_refcount 1
3597 #define elf_backend_want_got_plt 1
3598 #define elf_backend_plt_readonly 1
3599 /* Align PLT mod 64 byte L2 line size. */
3600 #define elf_backend_plt_alignment 6
3601 #define elf_backend_want_plt_sym 1
3602 #define elf_backend_got_header_size GOT_ENTRY_SIZE
3603 #define elf_backend_rela_normal 1
3604 #define elf_backend_default_execstack 0
3605
3606 #include "elf32-target.h"