daily update
[binutils.git] / bfd / elf32-tilepro.c
blob7b08aff04ed59ad5118bd00e90adb928cc978cad
1 /* TILEPro-specific support for 32-bit ELF.
2 Copyright 2011 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
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"
30 #define TILEPRO_BYTES_PER_WORD 4
32 static reloc_howto_type tilepro_elf_howto_table [] =
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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 */
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)
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)
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),
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)
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),
314 /* PC-relative offsets. */
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 */
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 */
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)
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),
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),
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),
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),
376 TILEPRO_IMM_HOWTO(R_TILEPRO_DEST_IMM8_X1, 0, 8),
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),
390 /* Offsets into the GOT of TLS Descriptors. */
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 */
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 */
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),
427 /* Offsets into the GOT of TLS Descriptors. */
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 */
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 */
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)
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),
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)
482 static reloc_howto_type tilepro_elf_howto_table2 [] =
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 */
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 */
516 /* Map BFD reloc types to TILEPRO ELF reloc types. */
518 typedef struct tilepro_reloc_map
520 bfd_reloc_code_real_type bfd_reloc_val;
521 unsigned int tilepro_reloc_val;
522 reloc_howto_type * table;
523 } reloc_map;
525 static const reloc_map tilepro_reloc_map [] =
527 #define TH_REMAP(bfd, tilepro) \
528 { bfd, tilepro, tilepro_elf_howto_table },
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)
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)
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)
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)
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)
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)
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)
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)
615 #undef TH_REMAP
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 },
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. */
629 struct tilepro_elf_dyn_relocs
631 struct tilepro_elf_dyn_relocs *next;
633 /* The input section of the reloc. */
634 asection *sec;
636 /* Total number of relocs copied for the input section. */
637 bfd_size_type count;
639 /* Number of pc-relative relocs copied for the input section. */
640 bfd_size_type pc_count;
643 /* TILEPRO ELF linker hash entry. */
645 struct tilepro_elf_link_hash_entry
647 struct elf_link_hash_entry elf;
649 /* Track dynamic relocs copied for this symbol. */
650 struct tilepro_elf_dyn_relocs *dyn_relocs;
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;
659 #define tilepro_elf_hash_entry(ent) \
660 ((struct tilepro_elf_link_hash_entry *)(ent))
662 struct _bfd_tilepro_elf_obj_tdata
664 struct elf_obj_tdata root;
666 /* tls_type for each local got entry. */
667 char *local_got_tls_type;
670 #define _bfd_tilepro_elf_tdata(abfd) \
671 ((struct _bfd_tilepro_elf_obj_tdata *) (abfd)->tdata.any)
673 #define _bfd_tilepro_elf_local_got_tls_type(abfd) \
674 (_bfd_tilepro_elf_tdata (abfd)->local_got_tls_type)
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)
681 #include "elf/common.h"
682 #include "elf/internal.h"
684 struct tilepro_elf_link_hash_table
686 struct elf_link_hash_table elf;
688 /* Short-cuts to get to dynamic linker sections. */
689 asection *sdynbss;
690 asection *srelbss;
692 /* Small local sym to section mapping cache. */
693 struct sym_cache sym_cache;
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)
702 static reloc_howto_type *
703 tilepro_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
704 bfd_reloc_code_real_type code)
706 unsigned int i;
708 for (i = ARRAY_SIZE (tilepro_reloc_map); --i;)
710 const reloc_map * entry;
712 entry = tilepro_reloc_map + i;
714 if (entry->bfd_reloc_val == code)
715 return entry->table + (entry->tilepro_reloc_val
716 - entry->table[0].type);
719 return NULL;
722 static reloc_howto_type *
723 tilepro_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
724 const char *r_name)
726 unsigned int i;
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];
736 return NULL;
739 /* Set the howto pointer for an TILEPro ELF reloc. */
741 static void
742 tilepro_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED,
743 arelent * cache_ptr,
744 Elf_Internal_Rela * dst)
746 unsigned int r_type = ELF32_R_TYPE (dst->r_info);
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 ();
758 typedef tilepro_bundle_bits (*tilepro_create_func)(int);
760 static const tilepro_create_func reloc_to_create_func[] =
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,
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,
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,
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
851 #define NELEMS(a) ((int) (sizeof (a) / sizeof ((a)[0])))
853 /* Support for core dump NOTE sections. */
855 static bfd_boolean
856 tilepro_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
858 int offset;
859 size_t size;
861 if (note->descsz != TILEPRO_PRSTATUS_SIZEOF)
862 return FALSE;
864 /* pr_cursig */
865 elf_tdata (abfd)->core_signal =
866 bfd_get_16 (abfd, note->descdata + TILEPRO_PRSTATUS_OFFSET_PR_CURSIG);
868 /* pr_pid */
869 elf_tdata (abfd)->core_pid =
870 bfd_get_32 (abfd, note->descdata + TILEPRO_PRSTATUS_OFFSET_PR_PID);
872 /* pr_reg */
873 offset = TILEPRO_PRSTATUS_OFFSET_PR_REG;
874 size = TILEPRO_GREGSET_T_SIZE;
876 /* Make a ".reg/999" section. */
877 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
878 size, note->descpos + offset);
881 static bfd_boolean
882 tilepro_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
884 if (note->descsz != TILEPRO_PRPSINFO_SIZEOF)
885 return FALSE;
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);
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. */
901 char *command = elf_tdata (abfd)->core_command;
902 int n = strlen (command);
904 if (0 < n && command[n - 1] == ' ')
905 command[n - 1] = '\0';
908 return TRUE;
912 static void
913 tilepro_elf_append_rela_32 (bfd *abfd, asection *s, Elf_Internal_Rela *rel)
915 Elf32_External_Rela *loc32;
917 loc32 = (Elf32_External_Rela *) s->contents;
918 loc32 += s->reloc_count++;
919 bfd_elf32_swap_reloca_out (abfd, rel, (bfd_byte *) loc32);
922 /* PLT/GOT stuff */
924 /* The procedure linkage table starts with the following header:
927 rli r29, r29, 16
928 lwadd r28, r27, 4
930 lw r27, r27
932 info 10 ## SP not offset, return PC in LR
933 jr r27
936 Subsequent entries are the following, jumping to the header at the end:
938 lnk r28
941 auli r28, r28, <_GLOBAL_OFFSET_TABLE_ - 1b + MY_GOT_OFFSET>
942 auli r27, r28, <_GLOBAL_OFFSET_TABLE_ - 1b>
945 addli r28, r28, <_GLOBAL_OFFSET_TABLE_ - 1b + MY_GOT_OFFSET>
946 addli r27, r27, <_GLOBAL_OFFSET_TABLE_ - 1b>
949 auli r29, zero, MY_PLT_INDEX
950 lw r28, r28
953 info 10 ## SP not offset, return PC in LR
954 jr r28
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.
963 This code sequence lets the code at at the start of the PLT determine
964 which PLT entry was executed by examining 'r29'.
966 Note that MY_PLT_INDEX skips over the header entries, so the first
967 actual jump table entry has index zero.
970 #define PLT_HEADER_SIZE_IN_BUNDLES 3
971 #define PLT_ENTRY_SIZE_IN_BUNDLES 5
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)
978 /* The size in bytes of an entry in the global offset table. */
980 #define GOT_ENTRY_SIZE TILEPRO_BYTES_PER_WORD
982 #define GOTPLT_HEADER_SIZE (2 * GOT_ENTRY_SIZE)
985 static const bfd_byte
986 tilepro_plt0_entry[PLT_HEADER_SIZE] =
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 } */
996 static const bfd_byte
997 tilepro_short_plt_entry[PLT_ENTRY_SIZE] =
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,
1011 static const bfd_byte
1012 tilepro_long_plt_entry[PLT_ENTRY_SIZE] =
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 } */
1026 static bfd_vma
1027 tilepro_ha16(bfd_vma vma)
1029 return ((vma >> 16) + ((vma >> 15) & 1)) & 0xffff;
1032 static int
1033 tilepro_plt_entry_build (asection *splt, asection *sgotplt, bfd_vma offset,
1034 bfd_vma *r_offset)
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;
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;
1049 /* Compute the distance to GOTPLT[0]. */
1050 bfd_signed_vma dist_got0 = dist_got_entry - got_offset;
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);
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);
1061 /* Write the immediate offsets. */
1062 pc = (tilepro_bundle_bits *)(splt->contents + offset);
1063 pc++;
1065 if (!short_plt_entry)
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));
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);
1077 /* { auli r29, zero, MY_PLT_INDEX ; lw r28, r28 } */
1078 *pc |= create_Imm16_X0 (plt_index);
1080 /* Set the relocation offset. */
1081 *r_offset = got_offset;
1083 return plt_index;
1086 #define TILEPRO_ELF_RELA_BYTES (sizeof(Elf32_External_Rela))
1089 /* Create an entry in an TILEPro ELF linker hash table. */
1091 static struct bfd_hash_entry *
1092 link_hash_newfunc (struct bfd_hash_entry *entry,
1093 struct bfd_hash_table *table, const char *string)
1095 /* Allocate the structure if it has not already been allocated by a
1096 subclass. */
1097 if (entry == NULL)
1099 entry =
1100 bfd_hash_allocate (table,
1101 sizeof (struct tilepro_elf_link_hash_entry));
1102 if (entry == NULL)
1103 return entry;
1106 /* Call the allocation method of the superclass. */
1107 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
1108 if (entry != NULL)
1110 struct tilepro_elf_link_hash_entry *eh;
1112 eh = (struct tilepro_elf_link_hash_entry *) entry;
1113 eh->dyn_relocs = NULL;
1114 eh->tls_type = GOT_UNKNOWN;
1117 return entry;
1120 /* Create a TILEPRO ELF linker hash table. */
1122 static struct bfd_link_hash_table *
1123 tilepro_elf_link_hash_table_create (bfd *abfd)
1125 struct tilepro_elf_link_hash_table *ret;
1126 bfd_size_type amt = sizeof (struct tilepro_elf_link_hash_table);
1128 ret = (struct tilepro_elf_link_hash_table *) bfd_zmalloc (amt);
1129 if (ret == NULL)
1130 return NULL;
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))
1136 free (ret);
1137 return NULL;
1140 return &ret->elf.root;
1143 /* Create the .got section. */
1145 static bfd_boolean
1146 tilepro_elf_create_got_section (bfd *abfd, struct bfd_link_info *info)
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);
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;
1159 flags = bed->dynamic_sec_flags;
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;
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;
1177 /* The first bit of the global offset table is the header. */
1178 s->size += bed->got_header_size;
1180 if (bed->want_got_plt)
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;
1189 /* Reserve room for the header. */
1190 s->size += GOTPLT_HEADER_SIZE;
1193 if (bed->want_got_sym)
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;
1206 return TRUE;
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. */
1213 static bfd_boolean
1214 tilepro_elf_create_dynamic_sections (bfd *dynobj,
1215 struct bfd_link_info *info)
1217 struct tilepro_elf_link_hash_table *htab;
1219 htab = tilepro_elf_hash_table (info);
1220 BFD_ASSERT (htab != NULL);
1222 if (!tilepro_elf_create_got_section (dynobj, info))
1223 return FALSE;
1225 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1226 return FALSE;
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");
1232 if (!htab->elf.splt || !htab->elf.srelplt || !htab->sdynbss
1233 || (!info->shared && !htab->srelbss))
1234 abort ();
1236 return TRUE;
1239 /* Copy the extra info we tack onto an elf_link_hash_entry. */
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)
1246 struct tilepro_elf_link_hash_entry *edir, *eind;
1248 edir = (struct tilepro_elf_link_hash_entry *) dir;
1249 eind = (struct tilepro_elf_link_hash_entry *) ind;
1251 if (eind->dyn_relocs != NULL)
1253 if (edir->dyn_relocs != NULL)
1255 struct tilepro_elf_dyn_relocs **pp;
1256 struct tilepro_elf_dyn_relocs *p;
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; )
1262 struct tilepro_elf_dyn_relocs *q;
1264 for (q = edir->dyn_relocs; q != NULL; q = q->next)
1265 if (q->sec == p->sec)
1267 q->pc_count += p->pc_count;
1268 q->count += p->count;
1269 *pp = p->next;
1270 break;
1272 if (q == NULL)
1273 pp = &p->next;
1275 *pp = edir->dyn_relocs;
1278 edir->dyn_relocs = eind->dyn_relocs;
1279 eind->dyn_relocs = NULL;
1282 if (ind->root.type == bfd_link_hash_indirect
1283 && dir->got.refcount <= 0)
1285 edir->tls_type = eind->tls_type;
1286 eind->tls_type = GOT_UNKNOWN;
1288 _bfd_elf_link_hash_copy_indirect (info, dir, ind);
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. */
1295 static bfd_boolean
1296 tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
1297 asection *sec, const Elf_Internal_Rela *relocs)
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;
1307 if (info->relocatable)
1308 return TRUE;
1310 htab = tilepro_elf_hash_table (info);
1311 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1312 sym_hashes = elf_sym_hashes (abfd);
1314 sreloc = NULL;
1316 num_relocs = sec->reloc_count;
1318 BFD_ASSERT (is_tilepro_elf (abfd) || num_relocs == 0);
1320 if (htab->elf.dynobj == NULL)
1321 htab->elf.dynobj = abfd;
1323 rel_end = relocs + num_relocs;
1324 for (rel = relocs; rel < rel_end; rel++)
1326 unsigned int r_type;
1327 unsigned long r_symndx;
1328 struct elf_link_hash_entry *h;
1329 int tls_type;
1331 r_symndx = ELF32_R_SYM (rel->r_info);
1332 r_type = ELF32_R_TYPE (rel->r_info);
1334 if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
1336 (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
1337 abfd, r_symndx);
1338 return FALSE;
1341 if (r_symndx < symtab_hdr->sh_info)
1342 h = NULL;
1343 else
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;
1351 switch (r_type)
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;
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;
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 */
1388 have_got_reference:
1389 /* This symbol requires a global offset table entry. */
1391 int old_tls_type;
1393 if (h != NULL)
1395 h->got.refcount += 1;
1396 old_tls_type = tilepro_elf_hash_entry(h)->tls_type;
1398 else
1400 bfd_signed_vma *local_got_refcounts;
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)
1406 bfd_size_type size;
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);
1418 local_got_refcounts[r_symndx] += 1;
1419 old_tls_type =
1420 _bfd_tilepro_elf_local_got_tls_type (abfd) [r_symndx];
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))
1429 if (old_tls_type == GOT_TLS_IE && tls_type == GOT_TLS_GD)
1430 tls_type = old_tls_type;
1431 else
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;
1440 if (old_tls_type != tls_type)
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;
1450 if (htab->elf.sgot == NULL)
1452 if (!tilepro_elf_create_got_section (htab->elf.dynobj, info))
1453 return FALSE;
1455 break;
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. */
1464 if (h != NULL)
1466 h->needs_plt = 1;
1467 h->plt.refcount += 1;
1469 break;
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;
1485 if (h != NULL
1486 && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
1487 break;
1488 /* Fall through. */
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)
1527 h->non_got_ref = 1;
1529 if (!info->shared)
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;
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.
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)))
1571 struct tilepro_elf_dyn_relocs *p;
1572 struct tilepro_elf_dyn_relocs **head;
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)
1579 sreloc = _bfd_elf_make_dynamic_reloc_section
1580 (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ TRUE);
1582 if (sreloc == NULL)
1583 return FALSE;
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
1593 /* Track dynamic relocs needed for local syms too.
1594 We really need local syms available to do this
1595 easily. Oh well. */
1597 asection *s;
1598 void *vpp;
1599 Elf_Internal_Sym *isym;
1601 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1602 abfd, r_symndx);
1603 if (isym == NULL)
1604 return FALSE;
1606 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
1607 if (s == NULL)
1608 s = sec;
1610 vpp = &elf_section_data (s)->local_dynrel;
1611 head = (struct tilepro_elf_dyn_relocs **) vpp;
1614 p = *head;
1615 if (p == NULL || p->sec != sec)
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;
1629 p->count += 1;
1630 if (tilepro_elf_howto_table[r_type].pc_relative)
1631 p->pc_count += 1;
1634 break;
1636 case R_TILEPRO_GNU_VTINHERIT:
1637 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
1638 return FALSE;
1639 break;
1641 case R_TILEPRO_GNU_VTENTRY:
1642 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
1643 return FALSE;
1644 break;
1646 default:
1647 break;
1651 return TRUE;
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)
1662 if (h != NULL)
1664 switch (ELF32_R_TYPE (rel->r_info))
1666 case R_TILEPRO_GNU_VTINHERIT:
1667 case R_TILEPRO_GNU_VTENTRY:
1668 break;
1672 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
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)
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;
1686 if (info->relocatable)
1687 return TRUE;
1689 BFD_ASSERT (is_tilepro_elf (abfd) || sec->reloc_count == 0);
1691 elf_section_data (sec)->local_dynrel = NULL;
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);
1699 relend = relocs + sec->reloc_count;
1700 for (rel = relocs; rel < relend; rel++)
1702 unsigned long r_symndx;
1703 unsigned int r_type;
1704 struct elf_link_hash_entry *h = NULL;
1706 r_symndx = ELF32_R_SYM (rel->r_info);
1707 if (r_symndx >= symtab_hdr->sh_info)
1709 struct tilepro_elf_link_hash_entry *eh;
1710 struct tilepro_elf_dyn_relocs **pp;
1711 struct tilepro_elf_dyn_relocs *p;
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)
1721 /* Everything must go for SEC. */
1722 *pp = p->next;
1723 break;
1727 r_type = ELF32_R_TYPE (rel->r_info);
1728 switch (r_type)
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)
1756 if (h->got.refcount > 0)
1757 h->got.refcount--;
1759 else
1761 if (local_got_refcounts[r_symndx] > 0)
1762 local_got_refcounts[r_symndx]--;
1764 break;
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. */
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. */
1821 case R_TILEPRO_JOFFLONG_X1_PLT:
1822 if (h != NULL)
1824 if (h->plt.refcount > 0)
1825 h->plt.refcount--;
1827 break;
1829 default:
1830 break;
1834 return TRUE;
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. */
1843 static bfd_boolean
1844 tilepro_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
1845 struct elf_link_hash_entry *h)
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;
1852 htab = tilepro_elf_hash_table (info);
1853 BFD_ASSERT (htab != NULL);
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)));
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)
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))
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;
1883 return TRUE;
1885 else
1886 h->plt.offset = (bfd_vma) -1;
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)
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;
1900 /* This is a reference to a symbol defined by a dynamic object which
1901 is not a function. */
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;
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;
1915 /* If -z nocopyreloc was given, we won't generate them either. */
1916 if (info->nocopyreloc)
1918 h->non_got_ref = 0;
1919 return TRUE;
1922 eh = (struct tilepro_elf_link_hash_entry *) h;
1923 for (p = eh->dyn_relocs; p != NULL; p = p->next)
1925 s = p->sec->output_section;
1926 if (s != NULL && (s->flags & SEC_READONLY) != 0)
1927 break;
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)
1934 h->non_got_ref = 0;
1935 return TRUE;
1938 if (h->size == 0)
1940 (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
1941 h->root.root.string);
1942 return TRUE;
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. */
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)
1961 htab->srelbss->size += TILEPRO_ELF_RELA_BYTES;
1962 h->needs_copy = 1;
1965 return _bfd_elf_adjust_dynamic_copy (h, htab->sdynbss);
1968 /* Allocate space in .plt, .got and associated reloc sections for
1969 dynamic relocs. */
1971 static bfd_boolean
1972 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
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;
1979 if (h->root.type == bfd_link_hash_indirect)
1980 return TRUE;
1982 info = (struct bfd_link_info *) inf;
1983 htab = tilepro_elf_hash_table (info);
1984 BFD_ASSERT (htab != NULL);
1986 if (htab->elf.dynamic_sections_created
1987 && h->plt.refcount > 0)
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)
1994 if (! bfd_elf_link_record_dynamic_symbol (info, h))
1995 return FALSE;
1998 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
2000 asection *s = htab->elf.splt;
2002 /* Allocate room for the header. */
2003 if (s->size == 0)
2005 s->size = PLT_HEADER_SIZE;
2008 h->plt.offset = s->size;
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)
2018 h->root.u.def.section = s;
2019 h->root.u.def.value = h->plt.offset;
2022 /* Make room for this entry. */
2023 s->size += PLT_ENTRY_SIZE;
2025 /* We also need to make an entry in the .got.plt section. */
2026 htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
2028 /* We also need to make an entry in the .rela.plt section. */
2029 htab->elf.srelplt->size += TILEPRO_ELF_RELA_BYTES;
2031 else
2033 h->plt.offset = (bfd_vma) -1;
2034 h->needs_plt = 0;
2037 else
2039 h->plt.offset = (bfd_vma) -1;
2040 h->needs_plt = 0;
2043 if (h->got.refcount > 0)
2045 asection *s;
2046 bfd_boolean dyn;
2047 int tls_type = tilepro_elf_hash_entry(h)->tls_type;
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)
2054 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2055 return FALSE;
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;
2073 else
2074 h->got.offset = (bfd_vma) -1;
2076 eh = (struct tilepro_elf_link_hash_entry *) h;
2077 if (eh->dyn_relocs == NULL)
2078 return TRUE;
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. */
2086 if (info->shared)
2088 if (SYMBOL_CALLS_LOCAL (info, h))
2090 struct tilepro_elf_dyn_relocs **pp;
2092 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
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;
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)
2108 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
2109 eh->dyn_relocs = NULL;
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)
2116 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2117 return FALSE;
2121 else
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. */
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))))
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)
2139 if (! bfd_elf_link_record_dynamic_symbol (info, h))
2140 return FALSE;
2143 /* If that succeeded, we know we'll be keeping all the
2144 relocs. */
2145 if (h->dynindx != -1)
2146 goto keep;
2149 eh->dyn_relocs = NULL;
2151 keep: ;
2154 /* Finally, allocate space. */
2155 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2157 asection *sreloc = elf_section_data (p->sec)->sreloc;
2158 sreloc->size += p->count * TILEPRO_ELF_RELA_BYTES;
2161 return TRUE;
2164 /* Find any dynamic relocs that apply to read-only sections. */
2166 static bfd_boolean
2167 readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2169 struct tilepro_elf_link_hash_entry *eh;
2170 struct tilepro_elf_dyn_relocs *p;
2172 eh = (struct tilepro_elf_link_hash_entry *) h;
2173 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2175 asection *s = p->sec->output_section;
2177 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2179 struct bfd_link_info *info = (struct bfd_link_info *) inf;
2181 info->flags |= DF_TEXTREL;
2183 /* Not an error, just cut short the traversal. */
2184 return FALSE;
2187 return TRUE;
2190 /* Return true if the dynamic symbol for a given section should be
2191 omitted when creating a shared library. */
2193 static bfd_boolean
2194 tilepro_elf_omit_section_dynsym (bfd *output_bfd,
2195 struct bfd_link_info *info,
2196 asection *p)
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;
2204 return _bfd_elf_link_omit_section_dynsym (output_bfd, info, p);
2207 /* Set the sizes of the dynamic sections. */
2209 #define ELF32_DYNAMIC_INTERPRETER "/lib/ld.so.1"
2211 static bfd_boolean
2212 tilepro_elf_size_dynamic_sections (bfd *output_bfd,
2213 struct bfd_link_info *info)
2215 (void)output_bfd;
2217 struct tilepro_elf_link_hash_table *htab;
2218 bfd *dynobj;
2219 asection *s;
2220 bfd *ibfd;
2222 htab = tilepro_elf_hash_table (info);
2223 BFD_ASSERT (htab != NULL);
2224 dynobj = htab->elf.dynobj;
2225 BFD_ASSERT (dynobj != NULL);
2227 if (elf_hash_table (info)->dynamic_sections_created)
2229 /* Set the contents of the .interp section to the interpreter. */
2230 if (info->executable)
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;
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)
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;
2250 if (! is_tilepro_elf (ibfd))
2251 continue;
2253 for (s = ibfd->sections; s != NULL; s = s->next)
2255 struct tilepro_elf_dyn_relocs *p;
2257 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
2259 if (!bfd_is_abs_section (p->sec)
2260 && bfd_is_abs_section (p->sec->output_section))
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. */
2267 else if (p->count != 0)
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;
2277 local_got = elf_local_got_refcounts (ibfd);
2278 if (!local_got)
2279 continue;
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)
2289 if (*local_got > 0)
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;
2300 else
2301 *local_got = (bfd_vma) -1;
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);
2309 if (elf_hash_table (info)->dynamic_sections_created)
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;
2319 if (htab->elf.sgotplt)
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);
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;
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)
2345 if ((s->flags & SEC_LINKER_CREATED) == 0)
2346 continue;
2348 if (s == htab->elf.splt
2349 || s == htab->elf.sgot
2350 || s == htab->elf.sgotplt
2351 || s == htab->sdynbss)
2353 /* Strip this section if we don't need it; see the
2354 comment below. */
2356 else if (strncmp (s->name, ".rela", 5) == 0)
2358 if (s->size != 0)
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;
2365 else
2367 /* It's not one of our sections. */
2368 continue;
2371 if (s->size == 0)
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;
2386 if ((s->flags & SEC_HAS_CONTENTS) == 0)
2387 continue;
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;
2397 if (elf_hash_table (info)->dynamic_sections_created)
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)
2407 if (info->executable)
2409 if (!add_dynamic_entry (DT_DEBUG, 0))
2410 return FALSE;
2413 if (htab->elf.srelplt->size != 0)
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;
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;
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);
2432 if (info->flags & DF_TEXTREL)
2434 if (!add_dynamic_entry (DT_TEXTREL, 0))
2435 return FALSE;
2438 #undef add_dynamic_entry
2440 return TRUE;
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. */
2447 static bfd_vma
2448 dtpoff_base (struct bfd_link_info *info)
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;
2456 /* Return the relocation value for R_TILEPRO_TLS_TPOFF32. */
2458 static bfd_vma
2459 tpoff (struct bfd_link_info *info, bfd_vma address)
2461 struct elf_link_hash_table *htab = elf_hash_table (info);
2463 /* If tls_sec is NULL, we should have signalled an error already. */
2464 if (htab->tls_sec == NULL)
2465 return 0;
2467 return (address - htab->tls_sec->vma);
2470 /* Relocate an TILEPRO ELF section.
2472 The RELOCATE_SECTION function is called by the new ELF backend linker
2473 to handle the relocations for a section.
2475 The relocs are always passed as Rela structures.
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.
2481 This function does not have to worry about setting the reloc
2482 address or the reloc symbol index.
2484 LOCAL_SYMS is a pointer to the swapped in local symbols.
2486 LOCAL_SECTIONS is an array giving the section in the input file
2487 corresponding to the st_shndx field of each local symbol.
2489 The global hash table entry for the global symbols can be found
2490 via elf_sym_hashes (input_bfd).
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. */
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)
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;
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);
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;
2526 sreloc = elf_section_data (input_section)->sreloc;
2528 rel = relocs;
2529 num_relocs = input_section->reloc_count;
2530 relend = relocs + num_relocs;
2531 for (; rel < relend; rel++)
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;
2546 bfd_boolean unresolved_reloc;
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;
2553 if ((unsigned int)r_type >= NELEMS(tilepro_elf_howto_table))
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;
2563 howto = tilepro_elf_howto_table + r_type;
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)
2573 sym = local_syms + r_symndx;
2574 sec = local_sections[r_symndx];
2575 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2577 else
2579 bfd_boolean warned;
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)
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;
2597 if (sec != NULL && elf_discarded_section (sec))
2598 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2599 rel, relend, howto, contents);
2601 if (info->relocatable)
2602 continue;
2604 if (h != NULL)
2605 name = h->root.root.string;
2606 else
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);
2614 switch (r_type)
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 ();
2629 if (h != NULL)
2631 bfd_boolean dyn;
2633 off = h->got.offset;
2634 BFD_ASSERT (off != (bfd_vma) -1);
2635 dyn = elf_hash_table (info)->dynamic_sections_created;
2637 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2638 || (info->shared
2639 && SYMBOL_REFERENCES_LOCAL (info, h)))
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.
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
2657 bfd_put_32 (output_bfd, relocation,
2658 htab->elf.sgot->contents + off);
2659 h->got.offset |= 1;
2662 else
2663 unresolved_reloc = FALSE;
2665 else
2667 BFD_ASSERT (local_got_offsets != NULL
2668 && local_got_offsets[r_symndx] != (bfd_vma) -1);
2670 off = local_got_offsets[r_symndx];
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
2679 if (info->shared)
2681 asection *s;
2682 Elf_Internal_Rela outrel;
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);
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);
2698 bfd_put_32 (output_bfd, relocation,
2699 htab->elf.sgot->contents + off);
2700 local_got_offsets[r_symndx] |= 1;
2703 relocation = htab->elf.sgot->output_offset + off - got_base;
2704 break;
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);
2711 if (h->plt.offset == (bfd_vma) -1 || htab->elf.splt == NULL)
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;
2719 relocation = (htab->elf.splt->output_section->vma
2720 + htab->elf.splt->output_offset
2721 + h->plt.offset);
2722 unresolved_reloc = FALSE;
2723 break;
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;
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)))
2793 Elf_Internal_Rela outrel;
2794 bfd_boolean skip, relocate = FALSE;
2796 /* When generating a shared object, these relocations
2797 are copied into the output file to be resolved at run
2798 time. */
2800 BFD_ASSERT (sreloc != NULL);
2802 skip = FALSE;
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);
2814 switch (r_type)
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;
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))
2840 BFD_ASSERT (h->dynindx != -1);
2841 outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2842 outrel.r_addend = rel->r_addend;
2844 else
2846 if (r_type == R_TILEPRO_32)
2848 outrel.r_info = ELF32_R_INFO (0, R_TILEPRO_RELATIVE);
2849 outrel.r_addend = relocation + rel->r_addend;
2851 else
2853 long indx;
2855 outrel.r_addend = relocation + rel->r_addend;
2857 if (is_plt)
2858 sec = htab->elf.splt;
2860 if (bfd_is_abs_section (sec))
2861 indx = 0;
2862 else if (sec == NULL || sec->owner == NULL)
2864 bfd_set_error (bfd_error_bad_value);
2865 return FALSE;
2867 else
2869 asection *osec;
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;
2879 if (indx == 0)
2881 osec = htab->elf.text_index_section;
2882 indx = elf_section_data (osec)->dynindx;
2885 /* FIXME: we really should be able to link non-pic
2886 shared libraries. */
2887 if (indx == 0)
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;
2898 outrel.r_info = ELF32_R_INFO (indx, r_type);
2902 tilepro_elf_append_rela_32 (output_bfd, sreloc, &outrel);
2904 /* This reloc will be computed at runtime, so there's no
2905 need to do anything now. */
2906 if (! relocate)
2907 continue;
2909 break;
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;
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. */
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)
2939 tls_type = tilepro_elf_hash_entry(h)->tls_type;
2941 if (tls_type == GOT_TLS_IE)
2942 switch (r_type)
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;
2970 if (h != NULL)
2972 off = h->got.offset;
2973 h->got.offset |= 1;
2975 else
2977 BFD_ASSERT (local_got_offsets != NULL);
2978 off = local_got_offsets[r_symndx];
2979 local_got_offsets[r_symndx] |= 1;
2982 if (htab->elf.sgot == NULL)
2983 abort ();
2985 if ((off & 1) != 0)
2986 off &= ~1;
2987 else
2989 Elf_Internal_Rela outrel;
2990 int indx = 0;
2991 bfd_boolean need_relocs = FALSE;
2993 if (htab->elf.srelgot == NULL)
2994 abort ();
2996 if (h != NULL)
2998 bfd_boolean dyn;
2999 dyn = htab->elf.dynamic_sections_created;
3001 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
3002 && (!info->shared
3003 || !SYMBOL_REFERENCES_LOCAL (info, h)))
3005 indx = h->dynindx;
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;
3017 switch (r_type)
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);
3041 break;
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)
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));
3067 else
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);
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);
3092 break;
3096 if (off >= (bfd_vma) -2)
3097 abort ();
3099 relocation = htab->elf.sgot->output_offset + off - got_base;
3100 unresolved_reloc = FALSE;
3101 howto = tilepro_elf_howto_table + r_type;
3102 break;
3104 default:
3105 break;
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);
3124 r = bfd_reloc_continue;
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)
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;
3146 /* Get the operand creation function, if any. */
3147 create_func = reloc_to_create_func[r_type];
3148 if (create_func == NULL)
3150 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3151 contents, rel->r_offset,
3152 relocation, rel->r_addend);
3154 else
3156 if (howto->pc_relative)
3158 relocation -=
3159 input_section->output_section->vma + input_section->output_offset;
3160 if (howto->pcrel_offset)
3161 relocation -= rel->r_offset;
3164 bfd_byte *data;
3166 /* Add the relocation addend if any to the final target value */
3167 relocation += rel->r_addend;
3169 /* Do basic range checking */
3170 r = bfd_check_overflow (howto->complain_on_overflow,
3171 howto->bitsize,
3172 howto->rightshift,
3174 relocation);
3177 * Write the relocated value out into the raw section data.
3178 * Don't put a relocation out in the .rela section.
3180 tilepro_bundle_bits mask = create_func(-1);
3181 tilepro_bundle_bits value = create_func(relocation >> howto->rightshift);
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++)
3188 bfd_byte byte_mask = (bfd_byte)mask;
3189 *data = (*data & ~byte_mask) | ((bfd_byte)value & byte_mask);
3190 mask >>= 8;
3191 value >>= 8;
3195 if (r != bfd_reloc_ok)
3197 const char *msg = NULL;
3199 switch (r)
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;
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;
3213 case bfd_reloc_outofrange:
3214 msg = _("internal error: out of range error");
3215 break;
3217 case bfd_reloc_notsupported:
3218 msg = _("internal error: unsupported relocation error");
3219 break;
3221 case bfd_reloc_dangerous:
3222 msg = _("internal error: dangerous relocation");
3223 break;
3225 default:
3226 msg = _("internal error: unknown error");
3227 break;
3230 if (msg)
3231 r = info->callbacks->warning
3232 (info, msg, name, input_bfd, input_section, rel->r_offset);
3234 if (! r)
3235 return FALSE;
3239 return TRUE;
3242 /* Finish up dynamic symbol handling. We set the contents of various
3243 dynamic sections here. */
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)
3251 struct tilepro_elf_link_hash_table *htab;
3253 htab = tilepro_elf_hash_table (info);
3254 BFD_ASSERT (htab != NULL);
3256 if (h->plt.offset != (bfd_vma) -1)
3258 asection *splt;
3259 asection *srela;
3260 asection *sgotplt;
3261 Elf_Internal_Rela rela;
3262 bfd_byte *loc;
3263 bfd_vma r_offset;
3265 int rela_index;
3267 /* This symbol has an entry in the PLT. Set it up. */
3269 BFD_ASSERT (h->dynindx != -1);
3271 splt = htab->elf.splt;
3272 srela = htab->elf.srelplt;
3273 sgotplt = htab->elf.sgotplt;
3275 if (splt == NULL || srela == NULL)
3276 abort ();
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);
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);
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);
3294 loc = srela->contents + rela_index * sizeof (Elf32_External_Rela);
3295 bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
3297 if (!h->def_regular)
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;
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)
3315 asection *sgot;
3316 asection *srela;
3317 Elf_Internal_Rela rela;
3319 /* This symbol has an entry in the GOT. Set it up. */
3321 sgot = htab->elf.sgot;
3322 srela = htab->elf.srelgot;
3323 BFD_ASSERT (sgot != NULL && srela != NULL);
3325 rela.r_offset = (sgot->output_section->vma
3326 + sgot->output_offset
3327 + (h->got.offset &~ (bfd_vma) 1));
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)
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);
3344 else
3346 rela.r_info = ELF32_R_INFO (h->dynindx, R_TILEPRO_GLOB_DAT);
3347 rela.r_addend = 0;
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);
3355 if (h->needs_copy)
3357 asection *s;
3358 Elf_Internal_Rela rela;
3360 /* This symbols needs a copy reloc. Set it up. */
3361 BFD_ASSERT (h->dynindx != -1);
3363 s = bfd_get_section_by_name (h->root.u.def.section->owner,
3364 ".rela.bss");
3365 BFD_ASSERT (s != NULL);
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);
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;
3380 return TRUE;
3383 /* Finish up the dynamic sections. */
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)
3390 Elf32_External_Dyn *dyncon, *dynconend;
3391 struct tilepro_elf_link_hash_table *htab;
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++)
3399 Elf_Internal_Dyn dyn;
3400 asection *s;
3402 bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3404 switch (dyn.d_tag)
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;
3422 bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3424 return TRUE;
3427 static bfd_boolean
3428 tilepro_elf_finish_dynamic_sections (bfd *output_bfd,
3429 struct bfd_link_info *info)
3431 bfd *dynobj;
3432 asection *sdyn;
3433 struct tilepro_elf_link_hash_table *htab;
3435 htab = tilepro_elf_hash_table (info);
3436 BFD_ASSERT (htab != NULL);
3437 dynobj = htab->elf.dynobj;
3439 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3441 if (elf_hash_table (info)->dynamic_sections_created)
3443 asection *splt;
3444 bfd_boolean ret;
3446 splt = bfd_get_section_by_name (dynobj, ".plt");
3447 BFD_ASSERT (splt != NULL && sdyn != NULL);
3449 ret = tilepro_finish_dyn (output_bfd, info, dynobj, sdyn, splt);
3451 if (ret != TRUE)
3452 return ret;
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);
3458 elf_section_data (splt->output_section)->this_hdr.sh_entsize
3459 = PLT_ENTRY_SIZE;
3462 if (htab->elf.sgotplt)
3464 if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
3466 (*_bfd_error_handler)
3467 (_("discarded output section: `%A'"), htab->elf.sgotplt);
3468 return FALSE;
3471 if (htab->elf.sgotplt->size > 0)
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);
3481 elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize
3482 = GOT_ENTRY_SIZE;
3485 if (htab->elf.sgot)
3487 if (htab->elf.sgot->size > 0)
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 :
3494 bfd_put_32 (output_bfd, val, htab->elf.sgot->contents);
3497 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize
3498 = GOT_ENTRY_SIZE;
3501 return TRUE;
3506 /* Return address for Ith PLT stub in section PLT, for relocation REL
3507 or (bfd_vma) -1 if it should not be included. */
3509 static bfd_vma
3510 tilepro_elf_plt_sym_val (bfd_vma i, const asection *plt,
3511 const arelent *rel ATTRIBUTE_UNUSED)
3513 return plt->vma + PLT_HEADER_SIZE + i * PLT_ENTRY_SIZE;
3516 static enum elf_reloc_type_class
3517 tilepro_reloc_type_class (const Elf_Internal_Rela *rela)
3519 switch ((int) ELF32_R_TYPE (rela->r_info))
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;
3532 static int
3533 tilepro_additional_program_headers (bfd *abfd,
3534 struct bfd_link_info *info ATTRIBUTE_UNUSED)
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] =
3540 ".intrpt0", ".intrpt1", ".intrpt2", ".intrpt3"
3542 int count = 0;
3543 int i;
3545 for (i = 0; i < 4; i++)
3547 asection *sec = bfd_get_section_by_name (abfd, intrpt_sections[i]);
3548 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
3549 ++count;
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;
3557 return count;
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
3566 #define TARGET_LITTLE_SYM bfd_elf32_tilepro_vec
3567 #define TARGET_LITTLE_NAME "elf32-tilepro"
3569 #define elf_backend_reloc_type_class tilepro_reloc_type_class
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
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
3593 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
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
3606 #include "elf32-target.h"