OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [elf32-tilepro.c] - Blame information for rev 163

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.