Coverage Report

Created: 2025-06-24 06:45

/src/binutils-gdb/bfd/elf32-tic6x.c
Line
Count
Source (jump to first uncovered line)
1
/* 32-bit ELF support for TI C6X
2
   Copyright (C) 2010-2025 Free Software Foundation, Inc.
3
   Contributed by Joseph Myers <joseph@codesourcery.com>
4
      Bernd Schmidt  <bernds@codesourcery.com>
5
6
   This file is part of BFD, the Binary File Descriptor library.
7
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3 of the License, or
11
   (at your option) any later version.
12
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
18
   You should have received a copy of the GNU General Public License
19
   along with this program; if not, write to the Free Software
20
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21
   MA 02110-1301, USA.  */
22
23
#include "sysdep.h"
24
#include <limits.h>
25
#include "bfd.h"
26
#include "libbfd.h"
27
#include "libiberty.h"
28
#include "elf-bfd.h"
29
#include "elf/tic6x.h"
30
#include "elf32-tic6x.h"
31
32
0
#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0"
33
34
/* DSBT binaries have a default 128K stack.  */
35
0
#define DEFAULT_STACK_SIZE 0x20000
36
37
/* The size in bytes of an entry in the procedure linkage table.  */
38
0
#define PLT_ENTRY_SIZE 24
39
40
/* TI C6X ELF linker hash table.  */
41
42
struct elf32_tic6x_link_hash_table
43
{
44
  struct elf_link_hash_table elf;
45
46
  /* C6X specific command line arguments.  */
47
  struct elf32_tic6x_params params;
48
49
  /* The output BFD, for convenience.  */
50
  bfd *obfd;
51
52
  /* The .dsbt section.  */
53
  asection *dsbt;
54
};
55
56
/* Get the TI C6X ELF linker hash table from a link_info structure.  */
57
58
#define elf32_tic6x_hash_table(p) \
59
0
  ((struct elf32_tic6x_link_hash_table *) ((p)->hash))
60
61
typedef enum
62
{
63
  DELETE_EXIDX_ENTRY,
64
  INSERT_EXIDX_CANTUNWIND_AT_END
65
}
66
tic6x_unwind_edit_type;
67
68
/* A (sorted) list of edits to apply to an unwind table.  */
69
typedef struct tic6x_unwind_table_edit
70
{
71
  tic6x_unwind_edit_type type;
72
  /* Note: we sometimes want to insert an unwind entry corresponding to a
73
     section different from the one we're currently writing out, so record the
74
     (text) section this edit relates to here.  */
75
  asection *linked_section;
76
  unsigned int index;
77
  struct tic6x_unwind_table_edit *next;
78
}
79
tic6x_unwind_table_edit;
80
81
typedef struct _tic6x_elf_section_data
82
{
83
  /* Information about mapping symbols.  */
84
  struct bfd_elf_section_data elf;
85
  /* Information about unwind tables.  */
86
  union
87
  {
88
    /* Unwind info attached to a text section.  */
89
    struct
90
    {
91
      asection *tic6x_exidx_sec;
92
    } text;
93
94
    /* Unwind info attached to an .c6xabi.exidx section.  */
95
    struct
96
    {
97
      tic6x_unwind_table_edit *unwind_edit_list;
98
      tic6x_unwind_table_edit *unwind_edit_tail;
99
    } exidx;
100
  } u;
101
}
102
_tic6x_elf_section_data;
103
104
#define elf32_tic6x_section_data(sec) \
105
0
  ((_tic6x_elf_section_data *) elf_section_data (sec))
106
107
struct elf32_tic6x_obj_tdata
108
{
109
  struct elf_obj_tdata root;
110
111
  /* Whether to use RELA relocations when generating relocations.
112
     This is a per-object flag to allow the assembler to generate REL
113
     relocations for use in linker testcases.  */
114
  bool use_rela_p;
115
};
116
117
#define elf32_tic6x_tdata(abfd) \
118
335k
  ((struct elf32_tic6x_obj_tdata *) (abfd)->tdata.any)
119
120
#define is_tic6x_elf(bfd) \
121
0
  (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
122
0
   && elf_tdata (bfd) != NULL \
123
0
   && elf_object_id (bfd) == TIC6X_ELF_DATA)
124
125
/* C6X ELF uses two common sections.  One is the usual one, and the
126
   other is for small objects.  All the small objects are kept
127
   together, and then referenced via the gp pointer, which yields
128
   faster assembler code.  This is what we use for the small common
129
   section.  This approach is copied from ecoff.c.  */
130
static asection tic6x_elf_scom_section;
131
static const asymbol tic6x_elf_scom_symbol =
132
  GLOBAL_SYM_INIT (".scommon", &tic6x_elf_scom_section);
133
static asection tic6x_elf_scom_section =
134
  BFD_FAKE_SECTION (tic6x_elf_scom_section, &tic6x_elf_scom_symbol,
135
        ".scommon", 0, SEC_IS_COMMON | SEC_SMALL_DATA);
136
137
static reloc_howto_type elf32_tic6x_howto_table[] =
138
{
139
  HOWTO (R_C6000_NONE,    /* type */
140
   0,     /* rightshift */
141
   0,     /* size */
142
   0,     /* bitsize */
143
   false,     /* pc_relative */
144
   0,     /* bitpos */
145
   complain_overflow_dont,/* complain_on_overflow */
146
   bfd_elf_generic_reloc, /* special_function */
147
   "R_C6000_NONE",  /* name */
148
   false,     /* partial_inplace */
149
   0,     /* src_mask */
150
   0,     /* dst_mask */
151
   false),    /* pcrel_offset */
152
  HOWTO (R_C6000_ABS32,   /* type */
153
   0,     /* rightshift */
154
   4,     /* size */
155
   32,      /* bitsize */
156
   false,     /* pc_relative */
157
   0,     /* bitpos */
158
   complain_overflow_dont,/* complain_on_overflow */
159
   bfd_elf_generic_reloc, /* special_function */
160
   "R_C6000_ABS32", /* name */
161
   false,     /* partial_inplace */
162
   0,     /* src_mask */
163
   0xffffffff,    /* dst_mask */
164
   false),    /* pcrel_offset */
165
  HOWTO (R_C6000_ABS16,   /* type */
166
   0,     /* rightshift */
167
   2,     /* size */
168
   16,      /* bitsize */
169
   false,     /* pc_relative */
170
   0,     /* bitpos */
171
   complain_overflow_bitfield,/* complain_on_overflow */
172
   bfd_elf_generic_reloc, /* special_function */
173
   "R_C6000_ABS16", /* name */
174
   false,     /* partial_inplace */
175
   0,     /* src_mask */
176
   0x0000ffff,    /* dst_mask */
177
   false),    /* pcrel_offset */
178
  HOWTO (R_C6000_ABS8,    /* type */
179
   0,     /* rightshift */
180
   1,     /* size */
181
   8,     /* bitsize */
182
   false,     /* pc_relative */
183
   0,     /* bitpos */
184
   complain_overflow_bitfield,/* complain_on_overflow */
185
   bfd_elf_generic_reloc, /* special_function */
186
   "R_C6000_ABS8",  /* name */
187
   false,     /* partial_inplace */
188
   0,     /* src_mask */
189
   0x000000ff,    /* dst_mask */
190
   false),    /* pcrel_offset */
191
  HOWTO (R_C6000_PCR_S21, /* type */
192
   2,     /* rightshift */
193
   4,     /* size */
194
   21,      /* bitsize */
195
   true,      /* pc_relative */
196
   7,     /* bitpos */
197
   complain_overflow_signed,/* complain_on_overflow */
198
   bfd_elf_generic_reloc, /* special_function */
199
   "R_C6000_PCR_S21", /* name */
200
   false,     /* partial_inplace */
201
   0,     /* src_mask */
202
   0x0fffff80,    /* dst_mask */
203
   true),     /* pcrel_offset */
204
  HOWTO (R_C6000_PCR_S12, /* type */
205
   2,     /* rightshift */
206
   4,     /* size */
207
   12,      /* bitsize */
208
   true,      /* pc_relative */
209
   16,      /* bitpos */
210
   complain_overflow_signed,/* complain_on_overflow */
211
   bfd_elf_generic_reloc, /* special_function */
212
   "R_C6000_PCR_S12", /* name */
213
   false,     /* partial_inplace */
214
   0,     /* src_mask */
215
   0x0fff0000,    /* dst_mask */
216
   true),     /* pcrel_offset */
217
  HOWTO (R_C6000_PCR_S10, /* type */
218
   2,     /* rightshift */
219
   4,     /* size */
220
   10,      /* bitsize */
221
   true,      /* pc_relative */
222
   13,      /* bitpos */
223
   complain_overflow_signed,/* complain_on_overflow */
224
   bfd_elf_generic_reloc, /* special_function */
225
   "R_C6000_PCR_S10", /* name */
226
   false,     /* partial_inplace */
227
   0,     /* src_mask */
228
   0x007fe000,    /* dst_mask */
229
   true),     /* pcrel_offset */
230
  HOWTO (R_C6000_PCR_S7,  /* type */
231
   2,     /* rightshift */
232
   4,     /* size */
233
   7,     /* bitsize */
234
   true,      /* pc_relative */
235
   16,      /* bitpos */
236
   complain_overflow_signed,/* complain_on_overflow */
237
   bfd_elf_generic_reloc, /* special_function */
238
   "R_C6000_PCR_S7",  /* name */
239
   false,     /* partial_inplace */
240
   0,     /* src_mask */
241
   0x007f0000,    /* dst_mask */
242
   true),     /* pcrel_offset */
243
  HOWTO (R_C6000_ABS_S16, /* type */
244
   0,     /* rightshift */
245
   4,     /* size */
246
   16,      /* bitsize */
247
   false,     /* pc_relative */
248
   7,     /* bitpos */
249
   complain_overflow_signed,/* complain_on_overflow */
250
   bfd_elf_generic_reloc, /* special_function */
251
   "R_C6000_ABS_S16", /* name */
252
   false,     /* partial_inplace */
253
   0,     /* src_mask */
254
   0x007fff80,    /* dst_mask */
255
   false),    /* pcrel_offset */
256
  HOWTO (R_C6000_ABS_L16, /* type */
257
   0,     /* rightshift */
258
   4,     /* size */
259
   16,      /* bitsize */
260
   false,     /* pc_relative */
261
   7,     /* bitpos */
262
   complain_overflow_dont,/* complain_on_overflow */
263
   bfd_elf_generic_reloc, /* special_function */
264
   "R_C6000_ABS_L16", /* name */
265
   false,     /* partial_inplace */
266
   0,     /* src_mask */
267
   0x007fff80,    /* dst_mask */
268
   false),    /* pcrel_offset */
269
  HOWTO (R_C6000_ABS_H16, /* type */
270
   16,      /* rightshift */
271
   4,     /* size */
272
   16,      /* bitsize */
273
   false,     /* pc_relative */
274
   7,     /* bitpos */
275
   complain_overflow_dont,/* complain_on_overflow */
276
   bfd_elf_generic_reloc, /* special_function */
277
   "R_C6000_ABS_H16", /* name */
278
   false,     /* partial_inplace */
279
   0,     /* src_mask */
280
   0x007fff80,    /* dst_mask */
281
   false),    /* pcrel_offset */
282
  HOWTO (R_C6000_SBR_U15_B, /* type */
283
   0,     /* rightshift */
284
   4,     /* size */
285
   15,      /* bitsize */
286
   false,     /* pc_relative */
287
   8,     /* bitpos */
288
   complain_overflow_unsigned,/* complain_on_overflow */
289
   bfd_elf_generic_reloc, /* special_function */
290
   "R_C6000_SBR_U15_B", /* name */
291
   false,     /* partial_inplace */
292
   0,     /* src_mask */
293
   0x007fff00,    /* dst_mask */
294
   false),    /* pcrel_offset */
295
  HOWTO (R_C6000_SBR_U15_H, /* type */
296
   1,     /* rightshift */
297
   4,     /* size */
298
   15,      /* bitsize */
299
   false,     /* pc_relative */
300
   8,     /* bitpos */
301
   complain_overflow_unsigned,/* complain_on_overflow */
302
   bfd_elf_generic_reloc, /* special_function */
303
   "R_C6000_SBR_U15_H", /* name */
304
   false,     /* partial_inplace */
305
   0,     /* src_mask */
306
   0x007fff00,    /* dst_mask */
307
   false),    /* pcrel_offset */
308
  HOWTO (R_C6000_SBR_U15_W, /* type */
309
   2,     /* rightshift */
310
   4,     /* size */
311
   15,      /* bitsize */
312
   false,     /* pc_relative */
313
   8,     /* bitpos */
314
   complain_overflow_unsigned,/* complain_on_overflow */
315
   bfd_elf_generic_reloc, /* special_function */
316
   "R_C6000_SBR_U15_W", /* name */
317
   false,     /* partial_inplace */
318
   0,     /* src_mask */
319
   0x007fff00,    /* dst_mask */
320
   false),    /* pcrel_offset */
321
  HOWTO (R_C6000_SBR_S16, /* type */
322
   0,     /* rightshift */
323
   4,     /* size */
324
   16,      /* bitsize */
325
   false,     /* pc_relative */
326
   7,     /* bitpos */
327
   complain_overflow_signed,/* complain_on_overflow */
328
   bfd_elf_generic_reloc, /* special_function */
329
   "R_C6000_SBR_S16", /* name */
330
   false,     /* partial_inplace */
331
   0,     /* src_mask */
332
   0x007fff80,    /* dst_mask */
333
   false),    /* pcrel_offset */
334
  HOWTO (R_C6000_SBR_L16_B, /* type */
335
   0,     /* rightshift */
336
   4,     /* size */
337
   16,      /* bitsize */
338
   false,     /* pc_relative */
339
   7,     /* bitpos */
340
   complain_overflow_dont,/* complain_on_overflow */
341
   bfd_elf_generic_reloc, /* special_function */
342
   "R_C6000_SBR_L16_B", /* name */
343
   false,     /* partial_inplace */
344
   0,     /* src_mask */
345
   0x007fff80,    /* dst_mask */
346
   false),    /* pcrel_offset */
347
  HOWTO (R_C6000_SBR_L16_H, /* type */
348
   1,     /* rightshift */
349
   4,     /* size */
350
   16,      /* bitsize */
351
   false,     /* pc_relative */
352
   7,     /* bitpos */
353
   complain_overflow_dont,/* complain_on_overflow */
354
   bfd_elf_generic_reloc, /* special_function */
355
   "R_C6000_SBR_L16_H", /* name */
356
   false,     /* partial_inplace */
357
   0,     /* src_mask */
358
   0x007fff80,    /* dst_mask */
359
   false),    /* pcrel_offset */
360
  HOWTO (R_C6000_SBR_L16_W, /* type */
361
   2,     /* rightshift */
362
   4,     /* size */
363
   16,      /* bitsize */
364
   false,     /* pc_relative */
365
   7,     /* bitpos */
366
   complain_overflow_dont,/* complain_on_overflow */
367
   bfd_elf_generic_reloc, /* special_function */
368
   "R_C6000_SBR_L16_W", /* name */
369
   false,     /* partial_inplace */
370
   0,     /* src_mask */
371
   0x007fff80,    /* dst_mask */
372
   false),    /* pcrel_offset */
373
  HOWTO (R_C6000_SBR_H16_B, /* type */
374
   16,      /* rightshift */
375
   4,     /* size */
376
   16,      /* bitsize */
377
   false,     /* pc_relative */
378
   7,     /* bitpos */
379
   complain_overflow_dont,/* complain_on_overflow */
380
   bfd_elf_generic_reloc, /* special_function */
381
   "R_C6000_SBR_H16_B", /* name */
382
   false,     /* partial_inplace */
383
   0,     /* src_mask */
384
   0x007fff80,    /* dst_mask */
385
   false),    /* pcrel_offset */
386
  HOWTO (R_C6000_SBR_H16_H, /* type */
387
   17,      /* rightshift */
388
   4,     /* size */
389
   16,      /* bitsize */
390
   false,     /* pc_relative */
391
   7,     /* bitpos */
392
   complain_overflow_dont,/* complain_on_overflow */
393
   bfd_elf_generic_reloc, /* special_function */
394
   "R_C6000_SBR_H16_H", /* name */
395
   false,     /* partial_inplace */
396
   0,     /* src_mask */
397
   0x007fff80,    /* dst_mask */
398
   false),    /* pcrel_offset */
399
  HOWTO (R_C6000_SBR_H16_W, /* type */
400
   18,      /* rightshift */
401
   4,     /* size */
402
   16,      /* bitsize */
403
   false,     /* pc_relative */
404
   7,     /* bitpos */
405
   complain_overflow_dont,/* complain_on_overflow */
406
   bfd_elf_generic_reloc, /* special_function */
407
   "R_C6000_SBR_H16_W", /* name */
408
   false,     /* partial_inplace */
409
   0,     /* src_mask */
410
   0x007fff80,    /* dst_mask */
411
   false),    /* pcrel_offset */
412
  HOWTO (R_C6000_SBR_GOT_U15_W, /* type */
413
   2,     /* rightshift */
414
   4,     /* size */
415
   15,      /* bitsize */
416
   false,     /* pc_relative */
417
   8,     /* bitpos */
418
   complain_overflow_unsigned,/* complain_on_overflow */
419
   bfd_elf_generic_reloc, /* special_function */
420
   "R_C6000_SBR_GOT_U15_W",/* name */
421
   false,     /* partial_inplace */
422
   0,     /* src_mask */
423
   0x007fff00,    /* dst_mask */
424
   false),    /* pcrel_offset */
425
  HOWTO (R_C6000_SBR_GOT_L16_W, /* type */
426
   2,     /* rightshift */
427
   4,     /* size */
428
   16,      /* bitsize */
429
   false,     /* pc_relative */
430
   7,     /* bitpos */
431
   complain_overflow_dont,/* complain_on_overflow */
432
   bfd_elf_generic_reloc, /* special_function */
433
   "R_C6000_SBR_GOT_L16_W",/* name */
434
   false,     /* partial_inplace */
435
   0,     /* src_mask */
436
   0x007fff80,    /* dst_mask */
437
   false),    /* pcrel_offset */
438
  HOWTO (R_C6000_SBR_GOT_H16_W, /* type */
439
   18,      /* rightshift */
440
   4,     /* size */
441
   16,      /* bitsize */
442
   false,     /* pc_relative */
443
   7,     /* bitpos */
444
   complain_overflow_dont,/* complain_on_overflow */
445
   bfd_elf_generic_reloc, /* special_function */
446
   "R_C6000_SBR_GOT_H16_W",/* name */
447
   false,     /* partial_inplace */
448
   0,     /* src_mask */
449
   0x007fff80,    /* dst_mask */
450
   false),    /* pcrel_offset */
451
  HOWTO (R_C6000_DSBT_INDEX,  /* type */
452
   0,     /* rightshift */
453
   4,     /* size */
454
   15,      /* bitsize */
455
   false,     /* pc_relative */
456
   8,     /* bitpos */
457
   complain_overflow_unsigned,/* complain_on_overflow */
458
   bfd_elf_generic_reloc, /* special_function */
459
   "R_C6000_DSBT_INDEX",  /* name */
460
   false,     /* partial_inplace */
461
   0,     /* src_mask */
462
   0x007fff00,    /* dst_mask */
463
   false),    /* pcrel_offset */
464
  HOWTO (R_C6000_PREL31,  /* type */
465
   1,     /* rightshift */
466
   4,     /* size */
467
   31,      /* bitsize */
468
   true,      /* pc_relative */
469
   0,     /* bitpos */
470
   complain_overflow_dont,/* complain_on_overflow */
471
   bfd_elf_generic_reloc, /* special_function */
472
   "R_C6000_PREL31",  /* name */
473
   false,     /* partial_inplace */
474
   0,     /* src_mask */
475
   0x7fffffff,    /* dst_mask */
476
   true),     /* pcrel_offset */
477
  HOWTO (R_C6000_COPY,    /* type */
478
   0,     /* rightshift */
479
   4,     /* size */
480
   32,      /* bitsize */
481
   false,     /* pc_relative */
482
   0,     /* bitpos */
483
   complain_overflow_dont,/* complain_on_overflow */
484
   bfd_elf_generic_reloc, /* special_function */
485
   "R_C6000_COPY",  /* name */
486
   false,     /* partial_inplace */
487
   0,     /* src_mask */
488
   0xffffffff,    /* dst_mask */
489
   false),    /* pcrel_offset */
490
  HOWTO (R_C6000_JUMP_SLOT, /* type */
491
   0,     /* rightshift */
492
   4,     /* size */
493
   32,      /* bitsize */
494
   false,     /* pc_relative */
495
   0,     /* bitpos */
496
   complain_overflow_dont,/* complain_on_overflow */
497
   bfd_elf_generic_reloc, /* special_function */
498
   "R_C6000_JUMP_SLOT", /* name */
499
   false,     /* partial_inplace */
500
   0,     /* src_mask */
501
   0xffffffff,    /* dst_mask */
502
   false),    /* pcrel_offset */
503
  HOWTO (R_C6000_EHTYPE,  /* type */
504
   0,     /* rightshift */
505
   4,     /* size */
506
   32,      /* bitsize */
507
   false,     /* pc_relative */
508
   0,     /* bitpos */
509
   complain_overflow_dont,/* complain_on_overflow */
510
   bfd_elf_generic_reloc, /* special_function */
511
   "R_C6000_EHTYPE",  /* name */
512
   false,     /* partial_inplace */
513
   0,     /* src_mask */
514
   0xffffffff,    /* dst_mask */
515
   false),    /* pcrel_offset */
516
  HOWTO (R_C6000_PCR_H16, /* type */
517
   16,      /* rightshift */
518
   4,     /* size */
519
   16,      /* bitsize */
520
   true,      /* pc_relative */
521
   7,     /* bitpos */
522
   complain_overflow_dont,/* complain_on_overflow */
523
   bfd_elf_generic_reloc, /* special_function */
524
   "R_C6000_PCR_H16", /* name */
525
   false,     /* partial_inplace */
526
   0,     /* src_mask */
527
   0x007fff80,    /* dst_mask */
528
   true),     /* pcrel_offset */
529
  HOWTO (R_C6000_PCR_L16, /* type */
530
   0,     /* rightshift */
531
   4,     /* size */
532
   16,      /* bitsize */
533
   true,      /* pc_relative */
534
   7,     /* bitpos */
535
   complain_overflow_dont,/* complain_on_overflow */
536
   bfd_elf_generic_reloc, /* special_function */
537
   "R_C6000_PCR_L16", /* name */
538
   false,     /* partial_inplace */
539
   0,     /* src_mask */
540
   0x007fff80,    /* dst_mask */
541
   true),     /* pcrel_offset */
542
  EMPTY_HOWTO (31),
543
  EMPTY_HOWTO (32),
544
  EMPTY_HOWTO (33),
545
  EMPTY_HOWTO (34),
546
  EMPTY_HOWTO (35),
547
  EMPTY_HOWTO (36),
548
  EMPTY_HOWTO (37),
549
  EMPTY_HOWTO (38),
550
  EMPTY_HOWTO (39),
551
  EMPTY_HOWTO (40),
552
  EMPTY_HOWTO (41),
553
  EMPTY_HOWTO (42),
554
  EMPTY_HOWTO (43),
555
  EMPTY_HOWTO (44),
556
  EMPTY_HOWTO (45),
557
  EMPTY_HOWTO (46),
558
  EMPTY_HOWTO (47),
559
  EMPTY_HOWTO (48),
560
  EMPTY_HOWTO (49),
561
  EMPTY_HOWTO (50),
562
  EMPTY_HOWTO (51),
563
  EMPTY_HOWTO (52),
564
  EMPTY_HOWTO (53),
565
  EMPTY_HOWTO (54),
566
  EMPTY_HOWTO (55),
567
  EMPTY_HOWTO (56),
568
  EMPTY_HOWTO (57),
569
  EMPTY_HOWTO (58),
570
  EMPTY_HOWTO (59),
571
  EMPTY_HOWTO (60),
572
  EMPTY_HOWTO (61),
573
  EMPTY_HOWTO (62),
574
  EMPTY_HOWTO (63),
575
  EMPTY_HOWTO (64),
576
  EMPTY_HOWTO (65),
577
  EMPTY_HOWTO (66),
578
  EMPTY_HOWTO (67),
579
  EMPTY_HOWTO (68),
580
  EMPTY_HOWTO (69),
581
  EMPTY_HOWTO (70),
582
  EMPTY_HOWTO (71),
583
  EMPTY_HOWTO (72),
584
  EMPTY_HOWTO (73),
585
  EMPTY_HOWTO (74),
586
  EMPTY_HOWTO (75),
587
  EMPTY_HOWTO (76),
588
  EMPTY_HOWTO (77),
589
  EMPTY_HOWTO (78),
590
  EMPTY_HOWTO (79),
591
  EMPTY_HOWTO (80),
592
  EMPTY_HOWTO (81),
593
  EMPTY_HOWTO (82),
594
  EMPTY_HOWTO (83),
595
  EMPTY_HOWTO (84),
596
  EMPTY_HOWTO (85),
597
  EMPTY_HOWTO (86),
598
  EMPTY_HOWTO (87),
599
  EMPTY_HOWTO (88),
600
  EMPTY_HOWTO (89),
601
  EMPTY_HOWTO (90),
602
  EMPTY_HOWTO (91),
603
  EMPTY_HOWTO (92),
604
  EMPTY_HOWTO (93),
605
  EMPTY_HOWTO (94),
606
  EMPTY_HOWTO (95),
607
  EMPTY_HOWTO (96),
608
  EMPTY_HOWTO (97),
609
  EMPTY_HOWTO (98),
610
  EMPTY_HOWTO (99),
611
  EMPTY_HOWTO (100),
612
  EMPTY_HOWTO (101),
613
  EMPTY_HOWTO (102),
614
  EMPTY_HOWTO (103),
615
  EMPTY_HOWTO (104),
616
  EMPTY_HOWTO (105),
617
  EMPTY_HOWTO (106),
618
  EMPTY_HOWTO (107),
619
  EMPTY_HOWTO (108),
620
  EMPTY_HOWTO (109),
621
  EMPTY_HOWTO (110),
622
  EMPTY_HOWTO (111),
623
  EMPTY_HOWTO (112),
624
  EMPTY_HOWTO (113),
625
  EMPTY_HOWTO (114),
626
  EMPTY_HOWTO (115),
627
  EMPTY_HOWTO (116),
628
  EMPTY_HOWTO (117),
629
  EMPTY_HOWTO (118),
630
  EMPTY_HOWTO (119),
631
  EMPTY_HOWTO (120),
632
  EMPTY_HOWTO (121),
633
  EMPTY_HOWTO (122),
634
  EMPTY_HOWTO (123),
635
  EMPTY_HOWTO (124),
636
  EMPTY_HOWTO (125),
637
  EMPTY_HOWTO (126),
638
  EMPTY_HOWTO (127),
639
  EMPTY_HOWTO (128),
640
  EMPTY_HOWTO (129),
641
  EMPTY_HOWTO (130),
642
  EMPTY_HOWTO (131),
643
  EMPTY_HOWTO (132),
644
  EMPTY_HOWTO (133),
645
  EMPTY_HOWTO (134),
646
  EMPTY_HOWTO (135),
647
  EMPTY_HOWTO (136),
648
  EMPTY_HOWTO (137),
649
  EMPTY_HOWTO (138),
650
  EMPTY_HOWTO (139),
651
  EMPTY_HOWTO (140),
652
  EMPTY_HOWTO (141),
653
  EMPTY_HOWTO (142),
654
  EMPTY_HOWTO (143),
655
  EMPTY_HOWTO (144),
656
  EMPTY_HOWTO (145),
657
  EMPTY_HOWTO (146),
658
  EMPTY_HOWTO (147),
659
  EMPTY_HOWTO (148),
660
  EMPTY_HOWTO (149),
661
  EMPTY_HOWTO (150),
662
  EMPTY_HOWTO (151),
663
  EMPTY_HOWTO (152),
664
  EMPTY_HOWTO (153),
665
  EMPTY_HOWTO (154),
666
  EMPTY_HOWTO (155),
667
  EMPTY_HOWTO (156),
668
  EMPTY_HOWTO (157),
669
  EMPTY_HOWTO (158),
670
  EMPTY_HOWTO (159),
671
  EMPTY_HOWTO (160),
672
  EMPTY_HOWTO (161),
673
  EMPTY_HOWTO (162),
674
  EMPTY_HOWTO (163),
675
  EMPTY_HOWTO (164),
676
  EMPTY_HOWTO (165),
677
  EMPTY_HOWTO (166),
678
  EMPTY_HOWTO (167),
679
  EMPTY_HOWTO (168),
680
  EMPTY_HOWTO (169),
681
  EMPTY_HOWTO (170),
682
  EMPTY_HOWTO (171),
683
  EMPTY_HOWTO (172),
684
  EMPTY_HOWTO (173),
685
  EMPTY_HOWTO (174),
686
  EMPTY_HOWTO (175),
687
  EMPTY_HOWTO (176),
688
  EMPTY_HOWTO (177),
689
  EMPTY_HOWTO (178),
690
  EMPTY_HOWTO (179),
691
  EMPTY_HOWTO (180),
692
  EMPTY_HOWTO (181),
693
  EMPTY_HOWTO (182),
694
  EMPTY_HOWTO (183),
695
  EMPTY_HOWTO (184),
696
  EMPTY_HOWTO (185),
697
  EMPTY_HOWTO (186),
698
  EMPTY_HOWTO (187),
699
  EMPTY_HOWTO (188),
700
  EMPTY_HOWTO (189),
701
  EMPTY_HOWTO (190),
702
  EMPTY_HOWTO (191),
703
  EMPTY_HOWTO (192),
704
  EMPTY_HOWTO (193),
705
  EMPTY_HOWTO (194),
706
  EMPTY_HOWTO (195),
707
  EMPTY_HOWTO (196),
708
  EMPTY_HOWTO (197),
709
  EMPTY_HOWTO (198),
710
  EMPTY_HOWTO (199),
711
  EMPTY_HOWTO (200),
712
  EMPTY_HOWTO (201),
713
  EMPTY_HOWTO (202),
714
  EMPTY_HOWTO (203),
715
  EMPTY_HOWTO (204),
716
  EMPTY_HOWTO (205),
717
  EMPTY_HOWTO (206),
718
  EMPTY_HOWTO (207),
719
  EMPTY_HOWTO (208),
720
  EMPTY_HOWTO (209),
721
  EMPTY_HOWTO (210),
722
  EMPTY_HOWTO (211),
723
  EMPTY_HOWTO (212),
724
  EMPTY_HOWTO (213),
725
  EMPTY_HOWTO (214),
726
  EMPTY_HOWTO (215),
727
  EMPTY_HOWTO (216),
728
  EMPTY_HOWTO (217),
729
  EMPTY_HOWTO (218),
730
  EMPTY_HOWTO (219),
731
  EMPTY_HOWTO (220),
732
  EMPTY_HOWTO (221),
733
  EMPTY_HOWTO (222),
734
  EMPTY_HOWTO (223),
735
  EMPTY_HOWTO (224),
736
  EMPTY_HOWTO (225),
737
  EMPTY_HOWTO (226),
738
  EMPTY_HOWTO (227),
739
  EMPTY_HOWTO (228),
740
  EMPTY_HOWTO (229),
741
  EMPTY_HOWTO (230),
742
  EMPTY_HOWTO (231),
743
  EMPTY_HOWTO (232),
744
  EMPTY_HOWTO (233),
745
  EMPTY_HOWTO (234),
746
  EMPTY_HOWTO (235),
747
  EMPTY_HOWTO (236),
748
  EMPTY_HOWTO (237),
749
  EMPTY_HOWTO (238),
750
  EMPTY_HOWTO (239),
751
  EMPTY_HOWTO (240),
752
  EMPTY_HOWTO (241),
753
  EMPTY_HOWTO (242),
754
  EMPTY_HOWTO (243),
755
  EMPTY_HOWTO (244),
756
  EMPTY_HOWTO (245),
757
  EMPTY_HOWTO (246),
758
  EMPTY_HOWTO (247),
759
  EMPTY_HOWTO (248),
760
  EMPTY_HOWTO (249),
761
  EMPTY_HOWTO (250),
762
  EMPTY_HOWTO (251),
763
  EMPTY_HOWTO (252),
764
  HOWTO (R_C6000_ALIGN,   /* type */
765
   0,     /* rightshift */
766
   0,     /* size */
767
   0,     /* bitsize */
768
   false,     /* pc_relative */
769
   0,     /* bitpos */
770
   complain_overflow_dont,/* complain_on_overflow */
771
   bfd_elf_generic_reloc, /* special_function */
772
   "R_C6000_ALIGN", /* name */
773
   false,     /* partial_inplace */
774
   0,     /* src_mask */
775
   0,     /* dst_mask */
776
   false),    /* pcrel_offset */
777
  HOWTO (R_C6000_FPHEAD,  /* type */
778
   0,     /* rightshift */
779
   0,     /* size */
780
   0,     /* bitsize */
781
   false,     /* pc_relative */
782
   0,     /* bitpos */
783
   complain_overflow_dont,/* complain_on_overflow */
784
   bfd_elf_generic_reloc, /* special_function */
785
   "R_C6000_FPHEAD",  /* name */
786
   false,     /* partial_inplace */
787
   0,     /* src_mask */
788
   0,     /* dst_mask */
789
   false),    /* pcrel_offset */
790
  HOWTO (R_C6000_NOCMP,   /* type */
791
   0,     /* rightshift */
792
   0,     /* size */
793
   0,     /* bitsize */
794
   false,     /* pc_relative */
795
   0,     /* bitpos */
796
   complain_overflow_dont,/* complain_on_overflow */
797
   bfd_elf_generic_reloc, /* special_function */
798
   "R_C6000_NOCMP", /* name */
799
   false,     /* partial_inplace */
800
   0,     /* src_mask */
801
   0,     /* dst_mask */
802
   false)     /* pcrel_offset */
803
};
804
805
static reloc_howto_type elf32_tic6x_howto_table_rel[] =
806
{
807
  HOWTO (R_C6000_NONE,    /* type */
808
   0,     /* rightshift */
809
   0,     /* size */
810
   0,     /* bitsize */
811
   false,     /* pc_relative */
812
   0,     /* bitpos */
813
   complain_overflow_dont,/* complain_on_overflow */
814
   bfd_elf_generic_reloc, /* special_function */
815
   "R_C6000_NONE",  /* name */
816
   true,      /* partial_inplace */
817
   0,     /* src_mask */
818
   0,     /* dst_mask */
819
   false),    /* pcrel_offset */
820
  HOWTO (R_C6000_ABS32,   /* type */
821
   0,     /* rightshift */
822
   4,     /* size */
823
   32,      /* bitsize */
824
   false,     /* pc_relative */
825
   0,     /* bitpos */
826
   complain_overflow_dont,/* complain_on_overflow */
827
   bfd_elf_generic_reloc, /* special_function */
828
   "R_C6000_ABS32", /* name */
829
   true,      /* partial_inplace */
830
   0xffffffff,    /* src_mask */
831
   0xffffffff,    /* dst_mask */
832
   false),    /* pcrel_offset */
833
  HOWTO (R_C6000_ABS16,   /* type */
834
   0,     /* rightshift */
835
   2,     /* size */
836
   16,      /* bitsize */
837
   false,     /* pc_relative */
838
   0,     /* bitpos */
839
   complain_overflow_bitfield,/* complain_on_overflow */
840
   bfd_elf_generic_reloc, /* special_function */
841
   "R_C6000_ABS16", /* name */
842
   true,      /* partial_inplace */
843
   0x0000ffff,    /* src_mask */
844
   0x0000ffff,    /* dst_mask */
845
   false),    /* pcrel_offset */
846
  HOWTO (R_C6000_ABS8,    /* type */
847
   0,     /* rightshift */
848
   1,     /* size */
849
   8,     /* bitsize */
850
   false,     /* pc_relative */
851
   0,     /* bitpos */
852
   complain_overflow_bitfield,/* complain_on_overflow */
853
   bfd_elf_generic_reloc, /* special_function */
854
   "R_C6000_ABS8",  /* name */
855
   true,      /* partial_inplace */
856
   0x000000ff,    /* src_mask */
857
   0x000000ff,    /* dst_mask */
858
   false),    /* pcrel_offset */
859
  HOWTO (R_C6000_PCR_S21, /* type */
860
   2,     /* rightshift */
861
   4,     /* size */
862
   21,      /* bitsize */
863
   true,      /* pc_relative */
864
   7,     /* bitpos */
865
   complain_overflow_signed,/* complain_on_overflow */
866
   bfd_elf_generic_reloc, /* special_function */
867
   "R_C6000_PCR_S21", /* name */
868
   true,      /* partial_inplace */
869
   0x0fffff80,    /* src_mask */
870
   0x0fffff80,    /* dst_mask */
871
   true),     /* pcrel_offset */
872
  HOWTO (R_C6000_PCR_S12, /* type */
873
   2,     /* rightshift */
874
   4,     /* size */
875
   12,      /* bitsize */
876
   true,      /* pc_relative */
877
   16,      /* bitpos */
878
   complain_overflow_signed,/* complain_on_overflow */
879
   bfd_elf_generic_reloc, /* special_function */
880
   "R_C6000_PCR_S12", /* name */
881
   true,      /* partial_inplace */
882
   0x0fff0000,    /* src_mask */
883
   0x0fff0000,    /* dst_mask */
884
   true),     /* pcrel_offset */
885
  HOWTO (R_C6000_PCR_S10, /* type */
886
   2,     /* rightshift */
887
   4,     /* size */
888
   10,      /* bitsize */
889
   true,      /* pc_relative */
890
   13,      /* bitpos */
891
   complain_overflow_signed,/* complain_on_overflow */
892
   bfd_elf_generic_reloc, /* special_function */
893
   "R_C6000_PCR_S10", /* name */
894
   true,      /* partial_inplace */
895
   0x007fe000,    /* src_mask */
896
   0x007fe000,    /* dst_mask */
897
   true),     /* pcrel_offset */
898
  HOWTO (R_C6000_PCR_S7,  /* type */
899
   2,     /* rightshift */
900
   4,     /* size */
901
   7,     /* bitsize */
902
   true,      /* pc_relative */
903
   16,      /* bitpos */
904
   complain_overflow_signed,/* complain_on_overflow */
905
   bfd_elf_generic_reloc, /* special_function */
906
   "R_C6000_PCR_S7",  /* name */
907
   true,      /* partial_inplace */
908
   0x007f0000,    /* src_mask */
909
   0x007f0000,    /* dst_mask */
910
   true),     /* pcrel_offset */
911
  HOWTO (R_C6000_ABS_S16, /* type */
912
   0,     /* rightshift */
913
   4,     /* size */
914
   16,      /* bitsize */
915
   false,     /* pc_relative */
916
   7,     /* bitpos */
917
   complain_overflow_signed,/* complain_on_overflow */
918
   bfd_elf_generic_reloc, /* special_function */
919
   "R_C6000_ABS_S16", /* name */
920
   true,      /* partial_inplace */
921
   0x007fff80,    /* src_mask */
922
   0x007fff80,    /* dst_mask */
923
   false),    /* pcrel_offset */
924
  HOWTO (R_C6000_ABS_L16, /* type */
925
   0,     /* rightshift */
926
   4,     /* size */
927
   16,      /* bitsize */
928
   false,     /* pc_relative */
929
   7,     /* bitpos */
930
   complain_overflow_dont,/* complain_on_overflow */
931
   bfd_elf_generic_reloc, /* special_function */
932
   "R_C6000_ABS_L16", /* name */
933
   true,      /* partial_inplace */
934
   0x007fff80,    /* src_mask */
935
   0x007fff80,    /* dst_mask */
936
   false),    /* pcrel_offset */
937
  EMPTY_HOWTO (R_C6000_ABS_H16),
938
  HOWTO (R_C6000_SBR_U15_B, /* type */
939
   0,     /* rightshift */
940
   4,     /* size */
941
   15,      /* bitsize */
942
   false,     /* pc_relative */
943
   8,     /* bitpos */
944
   complain_overflow_unsigned,/* complain_on_overflow */
945
   bfd_elf_generic_reloc, /* special_function */
946
   "R_C6000_SBR_U15_B", /* name */
947
   true,      /* partial_inplace */
948
   0x007fff00,    /* src_mask */
949
   0x007fff00,    /* dst_mask */
950
   false),    /* pcrel_offset */
951
  HOWTO (R_C6000_SBR_U15_H, /* type */
952
   1,     /* rightshift */
953
   4,     /* size */
954
   15,      /* bitsize */
955
   false,     /* pc_relative */
956
   8,     /* bitpos */
957
   complain_overflow_unsigned,/* complain_on_overflow */
958
   bfd_elf_generic_reloc, /* special_function */
959
   "R_C6000_SBR_U15_H", /* name */
960
   true,      /* partial_inplace */
961
   0x007fff00,    /* src_mask */
962
   0x007fff00,    /* dst_mask */
963
   false),    /* pcrel_offset */
964
  HOWTO (R_C6000_SBR_U15_W, /* type */
965
   2,     /* rightshift */
966
   4,     /* size */
967
   15,      /* bitsize */
968
   false,     /* pc_relative */
969
   8,     /* bitpos */
970
   complain_overflow_unsigned,/* complain_on_overflow */
971
   bfd_elf_generic_reloc, /* special_function */
972
   "R_C6000_SBR_U15_W", /* name */
973
   true,      /* partial_inplace */
974
   0x007fff00,    /* src_mask */
975
   0x007fff00,    /* dst_mask */
976
   false),    /* pcrel_offset */
977
  HOWTO (R_C6000_SBR_S16, /* type */
978
   0,     /* rightshift */
979
   4,     /* size */
980
   16,      /* bitsize */
981
   false,     /* pc_relative */
982
   7,     /* bitpos */
983
   complain_overflow_signed,/* complain_on_overflow */
984
   bfd_elf_generic_reloc, /* special_function */
985
   "R_C6000_SBR_S16", /* name */
986
   true,      /* partial_inplace */
987
   0x007fff80,    /* src_mask */
988
   0x007fff80,    /* dst_mask */
989
   false),    /* pcrel_offset */
990
  HOWTO (R_C6000_SBR_L16_B, /* type */
991
   0,     /* rightshift */
992
   4,     /* size */
993
   16,      /* bitsize */
994
   false,     /* pc_relative */
995
   7,     /* bitpos */
996
   complain_overflow_dont,/* complain_on_overflow */
997
   bfd_elf_generic_reloc, /* special_function */
998
   "R_C6000_SBR_L16_B", /* name */
999
   true,      /* partial_inplace */
1000
   0x007fff80,    /* src_mask */
1001
   0x007fff80,    /* dst_mask */
1002
   false),    /* pcrel_offset */
1003
  HOWTO (R_C6000_SBR_L16_H, /* type */
1004
   1,     /* rightshift */
1005
   4,     /* size */
1006
   16,      /* bitsize */
1007
   false,     /* pc_relative */
1008
   7,     /* bitpos */
1009
   complain_overflow_dont,/* complain_on_overflow */
1010
   bfd_elf_generic_reloc, /* special_function */
1011
   "R_C6000_SBR_L16_H", /* name */
1012
   true,      /* partial_inplace */
1013
   0x007fff80,    /* src_mask */
1014
   0x007fff80,    /* dst_mask */
1015
   false),    /* pcrel_offset */
1016
  HOWTO (R_C6000_SBR_L16_W, /* type */
1017
   2,     /* rightshift */
1018
   4,     /* size */
1019
   16,      /* bitsize */
1020
   false,     /* pc_relative */
1021
   7,     /* bitpos */
1022
   complain_overflow_dont,/* complain_on_overflow */
1023
   bfd_elf_generic_reloc, /* special_function */
1024
   "R_C6000_SBR_L16_W", /* name */
1025
   true,      /* partial_inplace */
1026
   0x007fff80,    /* src_mask */
1027
   0x007fff80,    /* dst_mask */
1028
   false),    /* pcrel_offset */
1029
  EMPTY_HOWTO (R_C6000_SBR_H16_B),
1030
  EMPTY_HOWTO (R_C6000_SBR_H16_H),
1031
  EMPTY_HOWTO (R_C6000_SBR_H16_W),
1032
  HOWTO (R_C6000_SBR_GOT_U15_W, /* type */
1033
   2,     /* rightshift */
1034
   4,     /* size */
1035
   15,      /* bitsize */
1036
   false,     /* pc_relative */
1037
   8,     /* bitpos */
1038
   complain_overflow_unsigned,/* complain_on_overflow */
1039
   bfd_elf_generic_reloc, /* special_function */
1040
   "R_C6000_SBR_GOT_U15_W",/* name */
1041
   true,      /* partial_inplace */
1042
   0x007fff00,    /* src_mask */
1043
   0x007fff00,    /* dst_mask */
1044
   false),    /* pcrel_offset */
1045
  HOWTO (R_C6000_SBR_GOT_L16_W, /* type */
1046
   2,     /* rightshift */
1047
   4,     /* size */
1048
   16,      /* bitsize */
1049
   false,     /* pc_relative */
1050
   7,     /* bitpos */
1051
   complain_overflow_dont,/* complain_on_overflow */
1052
   bfd_elf_generic_reloc, /* special_function */
1053
   "R_C6000_SBR_GOT_L16_W",/* name */
1054
   true,      /* partial_inplace */
1055
   0x007fff80,    /* src_mask */
1056
   0x007fff80,    /* dst_mask */
1057
   false),    /* pcrel_offset */
1058
  EMPTY_HOWTO (R_C6000_SBR_GOT_H16_W),
1059
  HOWTO (R_C6000_DSBT_INDEX,  /* type */
1060
   0,     /* rightshift */
1061
   4,     /* size */
1062
   15,      /* bitsize */
1063
   false,     /* pc_relative */
1064
   8,     /* bitpos */
1065
   complain_overflow_unsigned,/* complain_on_overflow */
1066
   bfd_elf_generic_reloc, /* special_function */
1067
   "R_C6000_DSBT_INDEX",  /* name */
1068
   true,      /* partial_inplace */
1069
   0,     /* src_mask */
1070
   0x007fff00,    /* dst_mask */
1071
   false),    /* pcrel_offset */
1072
  HOWTO (R_C6000_PREL31,  /* type */
1073
   1,     /* rightshift */
1074
   4,     /* size */
1075
   31,      /* bitsize */
1076
   true,      /* pc_relative */
1077
   0,     /* bitpos */
1078
   complain_overflow_dont,/* complain_on_overflow */
1079
   bfd_elf_generic_reloc, /* special_function */
1080
   "R_C6000_PREL31",  /* name */
1081
   true,      /* partial_inplace */
1082
   0,     /* src_mask */
1083
   0x7fffffff,    /* dst_mask */
1084
   true),     /* pcrel_offset */
1085
  HOWTO (R_C6000_COPY,    /* type */
1086
   0,     /* rightshift */
1087
   4,     /* size */
1088
   32,      /* bitsize */
1089
   false,     /* pc_relative */
1090
   0,     /* bitpos */
1091
   complain_overflow_dont,/* complain_on_overflow */
1092
   bfd_elf_generic_reloc, /* special_function */
1093
   "R_C6000_COPY",  /* name */
1094
   true,      /* partial_inplace */
1095
   0,     /* src_mask */
1096
   0xffffffff,    /* dst_mask */
1097
   false),    /* pcrel_offset */
1098
  HOWTO (R_C6000_JUMP_SLOT, /* type */
1099
   0,     /* rightshift */
1100
   4,     /* size */
1101
   32,      /* bitsize */
1102
   false,     /* pc_relative */
1103
   0,     /* bitpos */
1104
   complain_overflow_dont,/* complain_on_overflow */
1105
   bfd_elf_generic_reloc, /* special_function */
1106
   "R_C6000_JUMP_SLOT", /* name */
1107
   false,     /* partial_inplace */
1108
   0,     /* src_mask */
1109
   0xffffffff,    /* dst_mask */
1110
   false),    /* pcrel_offset */
1111
  HOWTO (R_C6000_EHTYPE,  /* type */
1112
   0,     /* rightshift */
1113
   4,     /* size */
1114
   32,      /* bitsize */
1115
   false,     /* pc_relative */
1116
   0,     /* bitpos */
1117
   complain_overflow_dont,/* complain_on_overflow */
1118
   bfd_elf_generic_reloc, /* special_function */
1119
   "R_C6000_EHTYPE",  /* name */
1120
   false,     /* partial_inplace */
1121
   0,     /* src_mask */
1122
   0xffffffff,    /* dst_mask */
1123
   false),    /* pcrel_offset */
1124
  EMPTY_HOWTO (R_C6000_PCR_H16),
1125
  EMPTY_HOWTO (R_C6000_PCR_L16),
1126
  EMPTY_HOWTO (31),
1127
  EMPTY_HOWTO (32),
1128
  EMPTY_HOWTO (33),
1129
  EMPTY_HOWTO (34),
1130
  EMPTY_HOWTO (35),
1131
  EMPTY_HOWTO (36),
1132
  EMPTY_HOWTO (37),
1133
  EMPTY_HOWTO (38),
1134
  EMPTY_HOWTO (39),
1135
  EMPTY_HOWTO (40),
1136
  EMPTY_HOWTO (41),
1137
  EMPTY_HOWTO (42),
1138
  EMPTY_HOWTO (43),
1139
  EMPTY_HOWTO (44),
1140
  EMPTY_HOWTO (45),
1141
  EMPTY_HOWTO (46),
1142
  EMPTY_HOWTO (47),
1143
  EMPTY_HOWTO (48),
1144
  EMPTY_HOWTO (49),
1145
  EMPTY_HOWTO (50),
1146
  EMPTY_HOWTO (51),
1147
  EMPTY_HOWTO (52),
1148
  EMPTY_HOWTO (53),
1149
  EMPTY_HOWTO (54),
1150
  EMPTY_HOWTO (55),
1151
  EMPTY_HOWTO (56),
1152
  EMPTY_HOWTO (57),
1153
  EMPTY_HOWTO (58),
1154
  EMPTY_HOWTO (59),
1155
  EMPTY_HOWTO (60),
1156
  EMPTY_HOWTO (61),
1157
  EMPTY_HOWTO (62),
1158
  EMPTY_HOWTO (63),
1159
  EMPTY_HOWTO (64),
1160
  EMPTY_HOWTO (65),
1161
  EMPTY_HOWTO (66),
1162
  EMPTY_HOWTO (67),
1163
  EMPTY_HOWTO (68),
1164
  EMPTY_HOWTO (69),
1165
  EMPTY_HOWTO (70),
1166
  EMPTY_HOWTO (71),
1167
  EMPTY_HOWTO (72),
1168
  EMPTY_HOWTO (73),
1169
  EMPTY_HOWTO (74),
1170
  EMPTY_HOWTO (75),
1171
  EMPTY_HOWTO (76),
1172
  EMPTY_HOWTO (77),
1173
  EMPTY_HOWTO (78),
1174
  EMPTY_HOWTO (79),
1175
  EMPTY_HOWTO (80),
1176
  EMPTY_HOWTO (81),
1177
  EMPTY_HOWTO (82),
1178
  EMPTY_HOWTO (83),
1179
  EMPTY_HOWTO (84),
1180
  EMPTY_HOWTO (85),
1181
  EMPTY_HOWTO (86),
1182
  EMPTY_HOWTO (87),
1183
  EMPTY_HOWTO (88),
1184
  EMPTY_HOWTO (89),
1185
  EMPTY_HOWTO (90),
1186
  EMPTY_HOWTO (91),
1187
  EMPTY_HOWTO (92),
1188
  EMPTY_HOWTO (93),
1189
  EMPTY_HOWTO (94),
1190
  EMPTY_HOWTO (95),
1191
  EMPTY_HOWTO (96),
1192
  EMPTY_HOWTO (97),
1193
  EMPTY_HOWTO (98),
1194
  EMPTY_HOWTO (99),
1195
  EMPTY_HOWTO (100),
1196
  EMPTY_HOWTO (101),
1197
  EMPTY_HOWTO (102),
1198
  EMPTY_HOWTO (103),
1199
  EMPTY_HOWTO (104),
1200
  EMPTY_HOWTO (105),
1201
  EMPTY_HOWTO (106),
1202
  EMPTY_HOWTO (107),
1203
  EMPTY_HOWTO (108),
1204
  EMPTY_HOWTO (109),
1205
  EMPTY_HOWTO (110),
1206
  EMPTY_HOWTO (111),
1207
  EMPTY_HOWTO (112),
1208
  EMPTY_HOWTO (113),
1209
  EMPTY_HOWTO (114),
1210
  EMPTY_HOWTO (115),
1211
  EMPTY_HOWTO (116),
1212
  EMPTY_HOWTO (117),
1213
  EMPTY_HOWTO (118),
1214
  EMPTY_HOWTO (119),
1215
  EMPTY_HOWTO (120),
1216
  EMPTY_HOWTO (121),
1217
  EMPTY_HOWTO (122),
1218
  EMPTY_HOWTO (123),
1219
  EMPTY_HOWTO (124),
1220
  EMPTY_HOWTO (125),
1221
  EMPTY_HOWTO (126),
1222
  EMPTY_HOWTO (127),
1223
  EMPTY_HOWTO (128),
1224
  EMPTY_HOWTO (129),
1225
  EMPTY_HOWTO (130),
1226
  EMPTY_HOWTO (131),
1227
  EMPTY_HOWTO (132),
1228
  EMPTY_HOWTO (133),
1229
  EMPTY_HOWTO (134),
1230
  EMPTY_HOWTO (135),
1231
  EMPTY_HOWTO (136),
1232
  EMPTY_HOWTO (137),
1233
  EMPTY_HOWTO (138),
1234
  EMPTY_HOWTO (139),
1235
  EMPTY_HOWTO (140),
1236
  EMPTY_HOWTO (141),
1237
  EMPTY_HOWTO (142),
1238
  EMPTY_HOWTO (143),
1239
  EMPTY_HOWTO (144),
1240
  EMPTY_HOWTO (145),
1241
  EMPTY_HOWTO (146),
1242
  EMPTY_HOWTO (147),
1243
  EMPTY_HOWTO (148),
1244
  EMPTY_HOWTO (149),
1245
  EMPTY_HOWTO (150),
1246
  EMPTY_HOWTO (151),
1247
  EMPTY_HOWTO (152),
1248
  EMPTY_HOWTO (153),
1249
  EMPTY_HOWTO (154),
1250
  EMPTY_HOWTO (155),
1251
  EMPTY_HOWTO (156),
1252
  EMPTY_HOWTO (157),
1253
  EMPTY_HOWTO (158),
1254
  EMPTY_HOWTO (159),
1255
  EMPTY_HOWTO (160),
1256
  EMPTY_HOWTO (161),
1257
  EMPTY_HOWTO (162),
1258
  EMPTY_HOWTO (163),
1259
  EMPTY_HOWTO (164),
1260
  EMPTY_HOWTO (165),
1261
  EMPTY_HOWTO (166),
1262
  EMPTY_HOWTO (167),
1263
  EMPTY_HOWTO (168),
1264
  EMPTY_HOWTO (169),
1265
  EMPTY_HOWTO (170),
1266
  EMPTY_HOWTO (171),
1267
  EMPTY_HOWTO (172),
1268
  EMPTY_HOWTO (173),
1269
  EMPTY_HOWTO (174),
1270
  EMPTY_HOWTO (175),
1271
  EMPTY_HOWTO (176),
1272
  EMPTY_HOWTO (177),
1273
  EMPTY_HOWTO (178),
1274
  EMPTY_HOWTO (179),
1275
  EMPTY_HOWTO (180),
1276
  EMPTY_HOWTO (181),
1277
  EMPTY_HOWTO (182),
1278
  EMPTY_HOWTO (183),
1279
  EMPTY_HOWTO (184),
1280
  EMPTY_HOWTO (185),
1281
  EMPTY_HOWTO (186),
1282
  EMPTY_HOWTO (187),
1283
  EMPTY_HOWTO (188),
1284
  EMPTY_HOWTO (189),
1285
  EMPTY_HOWTO (190),
1286
  EMPTY_HOWTO (191),
1287
  EMPTY_HOWTO (192),
1288
  EMPTY_HOWTO (193),
1289
  EMPTY_HOWTO (194),
1290
  EMPTY_HOWTO (195),
1291
  EMPTY_HOWTO (196),
1292
  EMPTY_HOWTO (197),
1293
  EMPTY_HOWTO (198),
1294
  EMPTY_HOWTO (199),
1295
  EMPTY_HOWTO (200),
1296
  EMPTY_HOWTO (201),
1297
  EMPTY_HOWTO (202),
1298
  EMPTY_HOWTO (203),
1299
  EMPTY_HOWTO (204),
1300
  EMPTY_HOWTO (205),
1301
  EMPTY_HOWTO (206),
1302
  EMPTY_HOWTO (207),
1303
  EMPTY_HOWTO (208),
1304
  EMPTY_HOWTO (209),
1305
  EMPTY_HOWTO (210),
1306
  EMPTY_HOWTO (211),
1307
  EMPTY_HOWTO (212),
1308
  EMPTY_HOWTO (213),
1309
  EMPTY_HOWTO (214),
1310
  EMPTY_HOWTO (215),
1311
  EMPTY_HOWTO (216),
1312
  EMPTY_HOWTO (217),
1313
  EMPTY_HOWTO (218),
1314
  EMPTY_HOWTO (219),
1315
  EMPTY_HOWTO (220),
1316
  EMPTY_HOWTO (221),
1317
  EMPTY_HOWTO (222),
1318
  EMPTY_HOWTO (223),
1319
  EMPTY_HOWTO (224),
1320
  EMPTY_HOWTO (225),
1321
  EMPTY_HOWTO (226),
1322
  EMPTY_HOWTO (227),
1323
  EMPTY_HOWTO (228),
1324
  EMPTY_HOWTO (229),
1325
  EMPTY_HOWTO (230),
1326
  EMPTY_HOWTO (231),
1327
  EMPTY_HOWTO (232),
1328
  EMPTY_HOWTO (233),
1329
  EMPTY_HOWTO (234),
1330
  EMPTY_HOWTO (235),
1331
  EMPTY_HOWTO (236),
1332
  EMPTY_HOWTO (237),
1333
  EMPTY_HOWTO (238),
1334
  EMPTY_HOWTO (239),
1335
  EMPTY_HOWTO (240),
1336
  EMPTY_HOWTO (241),
1337
  EMPTY_HOWTO (242),
1338
  EMPTY_HOWTO (243),
1339
  EMPTY_HOWTO (244),
1340
  EMPTY_HOWTO (245),
1341
  EMPTY_HOWTO (246),
1342
  EMPTY_HOWTO (247),
1343
  EMPTY_HOWTO (248),
1344
  EMPTY_HOWTO (249),
1345
  EMPTY_HOWTO (250),
1346
  EMPTY_HOWTO (251),
1347
  EMPTY_HOWTO (252),
1348
  HOWTO (R_C6000_ALIGN,   /* type */
1349
   0,     /* rightshift */
1350
   0,     /* size */
1351
   0,     /* bitsize */
1352
   false,     /* pc_relative */
1353
   0,     /* bitpos */
1354
   complain_overflow_dont,/* complain_on_overflow */
1355
   bfd_elf_generic_reloc, /* special_function */
1356
   "R_C6000_ALIGN", /* name */
1357
   true,      /* partial_inplace */
1358
   0,     /* src_mask */
1359
   0,     /* dst_mask */
1360
   false),    /* pcrel_offset */
1361
  HOWTO (R_C6000_FPHEAD,  /* type */
1362
   0,     /* rightshift */
1363
   0,     /* size */
1364
   0,     /* bitsize */
1365
   false,     /* pc_relative */
1366
   0,     /* bitpos */
1367
   complain_overflow_dont,/* complain_on_overflow */
1368
   bfd_elf_generic_reloc, /* special_function */
1369
   "R_C6000_FPHEAD",  /* name */
1370
   true,      /* partial_inplace */
1371
   0,     /* src_mask */
1372
   0,     /* dst_mask */
1373
   false),    /* pcrel_offset */
1374
  HOWTO (R_C6000_NOCMP,   /* type */
1375
   0,     /* rightshift */
1376
   0,     /* size */
1377
   0,     /* bitsize */
1378
   false,     /* pc_relative */
1379
   0,     /* bitpos */
1380
   complain_overflow_dont,/* complain_on_overflow */
1381
   bfd_elf_generic_reloc, /* special_function */
1382
   "R_C6000_NOCMP", /* name */
1383
   true,      /* partial_inplace */
1384
   0,     /* src_mask */
1385
   0,     /* dst_mask */
1386
   false)     /* pcrel_offset */
1387
};
1388
1389
/* Map BFD relocations to ELF relocations.  */
1390
1391
typedef struct
1392
{
1393
  bfd_reloc_code_real_type bfd_reloc_val;
1394
  enum elf_tic6x_reloc_type elf_reloc_val;
1395
} tic6x_reloc_map;
1396
1397
static const tic6x_reloc_map elf32_tic6x_reloc_map[] =
1398
  {
1399
    { BFD_RELOC_NONE, R_C6000_NONE },
1400
    { BFD_RELOC_32, R_C6000_ABS32 },
1401
    { BFD_RELOC_16, R_C6000_ABS16 },
1402
    { BFD_RELOC_8, R_C6000_ABS8 },
1403
    { BFD_RELOC_C6000_PCR_S21, R_C6000_PCR_S21 },
1404
    { BFD_RELOC_C6000_PCR_S12, R_C6000_PCR_S12 },
1405
    { BFD_RELOC_C6000_PCR_S10, R_C6000_PCR_S10 },
1406
    { BFD_RELOC_C6000_PCR_S7, R_C6000_PCR_S7 },
1407
    { BFD_RELOC_C6000_ABS_S16, R_C6000_ABS_S16 },
1408
    { BFD_RELOC_C6000_ABS_L16, R_C6000_ABS_L16 },
1409
    { BFD_RELOC_C6000_ABS_H16, R_C6000_ABS_H16 },
1410
    { BFD_RELOC_C6000_SBR_U15_B, R_C6000_SBR_U15_B },
1411
    { BFD_RELOC_C6000_SBR_U15_H, R_C6000_SBR_U15_H },
1412
    { BFD_RELOC_C6000_SBR_U15_W, R_C6000_SBR_U15_W },
1413
    { BFD_RELOC_C6000_SBR_S16, R_C6000_SBR_S16 },
1414
    { BFD_RELOC_C6000_SBR_L16_B, R_C6000_SBR_L16_B },
1415
    { BFD_RELOC_C6000_SBR_L16_H, R_C6000_SBR_L16_H },
1416
    { BFD_RELOC_C6000_SBR_L16_W, R_C6000_SBR_L16_W },
1417
    { BFD_RELOC_C6000_SBR_H16_B, R_C6000_SBR_H16_B },
1418
    { BFD_RELOC_C6000_SBR_H16_H, R_C6000_SBR_H16_H },
1419
    { BFD_RELOC_C6000_SBR_H16_W, R_C6000_SBR_H16_W },
1420
    { BFD_RELOC_C6000_SBR_GOT_U15_W, R_C6000_SBR_GOT_U15_W },
1421
    { BFD_RELOC_C6000_SBR_GOT_L16_W, R_C6000_SBR_GOT_L16_W },
1422
    { BFD_RELOC_C6000_SBR_GOT_H16_W, R_C6000_SBR_GOT_H16_W },
1423
    { BFD_RELOC_C6000_DSBT_INDEX, R_C6000_DSBT_INDEX },
1424
    { BFD_RELOC_C6000_PREL31, R_C6000_PREL31 },
1425
    { BFD_RELOC_C6000_COPY, R_C6000_COPY },
1426
    { BFD_RELOC_C6000_JUMP_SLOT, R_C6000_JUMP_SLOT },
1427
    { BFD_RELOC_C6000_EHTYPE, R_C6000_EHTYPE },
1428
    { BFD_RELOC_C6000_PCR_H16, R_C6000_PCR_H16 },
1429
    { BFD_RELOC_C6000_PCR_L16, R_C6000_PCR_L16 },
1430
    { BFD_RELOC_C6000_ALIGN, R_C6000_ALIGN },
1431
    { BFD_RELOC_C6000_FPHEAD, R_C6000_FPHEAD },
1432
    { BFD_RELOC_C6000_NOCMP, R_C6000_NOCMP }
1433
  };
1434
1435
static reloc_howto_type *
1436
elf32_tic6x_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code)
1437
0
{
1438
0
  unsigned int i;
1439
1440
0
  for (i = 0; i < ARRAY_SIZE (elf32_tic6x_reloc_map); i++)
1441
0
    if (elf32_tic6x_reloc_map[i].bfd_reloc_val == code)
1442
0
      {
1443
0
  enum elf_tic6x_reloc_type elf_reloc_val;
1444
0
  reloc_howto_type *howto;
1445
1446
0
  elf_reloc_val = elf32_tic6x_reloc_map[i].elf_reloc_val;
1447
0
  if (elf32_tic6x_tdata (abfd)->use_rela_p)
1448
0
    howto = &elf32_tic6x_howto_table[elf_reloc_val];
1449
0
  else
1450
0
    howto = &elf32_tic6x_howto_table_rel[elf_reloc_val];
1451
1452
  /* Some relocations are RELA-only; do not return them for
1453
     REL.  */
1454
0
  if (howto->name == NULL)
1455
0
    howto = NULL;
1456
1457
0
  return howto;
1458
0
      }
1459
1460
0
  return NULL;
1461
0
}
1462
1463
static reloc_howto_type *
1464
elf32_tic6x_reloc_name_lookup (bfd *abfd, const char *r_name)
1465
0
{
1466
0
  if (elf32_tic6x_tdata (abfd)->use_rela_p)
1467
0
    {
1468
0
      unsigned int i;
1469
1470
0
      for (i = 0; i < ARRAY_SIZE (elf32_tic6x_howto_table); i++)
1471
0
  if (elf32_tic6x_howto_table[i].name != NULL
1472
0
      && strcasecmp (elf32_tic6x_howto_table[i].name, r_name) == 0)
1473
0
    return &elf32_tic6x_howto_table[i];
1474
0
    }
1475
0
  else
1476
0
    {
1477
0
      unsigned int i;
1478
1479
0
      for (i = 0; i < ARRAY_SIZE (elf32_tic6x_howto_table_rel); i++)
1480
0
  if (elf32_tic6x_howto_table_rel[i].name != NULL
1481
0
      && strcasecmp (elf32_tic6x_howto_table_rel[i].name, r_name) == 0)
1482
0
    return &elf32_tic6x_howto_table_rel[i];
1483
0
    }
1484
1485
0
  return NULL;
1486
0
}
1487
1488
static bool
1489
elf32_tic6x_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
1490
         Elf_Internal_Rela *elf_reloc)
1491
0
{
1492
0
  unsigned int r_type;
1493
1494
0
  r_type = ELF32_R_TYPE (elf_reloc->r_info);
1495
0
  if (r_type >= ARRAY_SIZE (elf32_tic6x_howto_table))
1496
0
    {
1497
      /* xgettext:c-format */
1498
0
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1499
0
        abfd, r_type);
1500
0
      bfd_set_error (bfd_error_bad_value);
1501
0
      return false;
1502
0
    }
1503
1504
0
  bfd_reloc->howto = &elf32_tic6x_howto_table[r_type];
1505
0
  if (bfd_reloc->howto == NULL || bfd_reloc->howto->name == NULL)
1506
0
    {
1507
      /* xgettext:c-format */
1508
0
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1509
0
        abfd, r_type);
1510
0
      bfd_set_error (bfd_error_bad_value);
1511
0
      return false;
1512
0
    }
1513
1514
0
  return true;
1515
0
}
1516
1517
static bool
1518
elf32_tic6x_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc,
1519
             Elf_Internal_Rela *elf_reloc)
1520
0
{
1521
0
  unsigned int r_type;
1522
1523
0
  r_type = ELF32_R_TYPE (elf_reloc->r_info);
1524
0
  if (r_type >= ARRAY_SIZE (elf32_tic6x_howto_table_rel))
1525
0
    {
1526
      /* xgettext:c-format */
1527
0
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1528
0
        abfd, r_type);
1529
0
      bfd_set_error (bfd_error_bad_value);
1530
0
      return false;
1531
0
    }
1532
1533
0
  bfd_reloc->howto = &elf32_tic6x_howto_table_rel[r_type];
1534
0
  if (bfd_reloc->howto == NULL || bfd_reloc->howto->name == NULL)
1535
0
    {
1536
      /* xgettext:c-format */
1537
0
      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
1538
0
        abfd, r_type);
1539
0
      bfd_set_error (bfd_error_bad_value);
1540
0
      return false;
1541
0
    }
1542
1543
0
  return true;
1544
0
}
1545
1546
void
1547
elf32_tic6x_set_use_rela_p (bfd *abfd, bool use_rela_p)
1548
311k
{
1549
311k
  elf32_tic6x_tdata (abfd)->use_rela_p = use_rela_p;
1550
311k
}
1551
1552
/* Create a C6X ELF linker hash table.  */
1553
1554
static struct bfd_link_hash_table *
1555
elf32_tic6x_link_hash_table_create (bfd *abfd)
1556
0
{
1557
0
  struct elf32_tic6x_link_hash_table *ret;
1558
0
  size_t amt = sizeof (struct elf32_tic6x_link_hash_table);
1559
1560
0
  ret = bfd_zmalloc (amt);
1561
0
  if (ret == NULL)
1562
0
    return NULL;
1563
1564
0
  if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
1565
0
              _bfd_elf_link_hash_newfunc,
1566
0
              sizeof (struct elf_link_hash_entry)))
1567
0
    {
1568
0
      free (ret);
1569
0
      return NULL;
1570
0
    }
1571
1572
0
  ret->obfd = abfd;
1573
0
  ret->elf.is_relocatable_executable = 1;
1574
1575
0
  return &ret->elf.root;
1576
0
}
1577
1578
static bool
1579
elf32_tic6x_final_link (bfd *abfd, struct bfd_link_info *info)
1580
0
{
1581
0
  if (bfd_link_pic (info))
1582
0
    {
1583
0
      obj_attribute *out_attr;
1584
0
      out_attr = elf_known_obj_attributes_proc (abfd);
1585
0
      if (out_attr[Tag_ABI_PIC].i == 0)
1586
0
  {
1587
0
    _bfd_error_handler (_("warning: generating a shared library "
1588
0
        "containing non-PIC code"));
1589
0
  }
1590
0
      if (out_attr[Tag_ABI_PID].i == 0)
1591
0
  {
1592
0
    _bfd_error_handler (_("warning: generating a shared library "
1593
0
        "containing non-PID code"));
1594
0
  }
1595
0
    }
1596
  /* Invoke the regular ELF backend linker to do all the work.  */
1597
0
  if (!bfd_elf_final_link (abfd, info))
1598
0
    return false;
1599
1600
0
  return true;
1601
0
}
1602
1603
/* Called to pass PARAMS to the backend.  We store them in the hash table
1604
   associated with INFO.  */
1605
1606
void
1607
elf32_tic6x_setup (struct bfd_link_info *info,
1608
       struct elf32_tic6x_params *params)
1609
0
{
1610
0
  struct elf32_tic6x_link_hash_table *htab = elf32_tic6x_hash_table (info);
1611
0
  htab->params = *params;
1612
0
}
1613
1614
/* Determine if we're dealing with a DSBT object.  */
1615
1616
static bool
1617
elf32_tic6x_using_dsbt (bfd *abfd)
1618
0
{
1619
0
  return bfd_elf_get_obj_attr_int (abfd, OBJ_ATTR_PROC,
1620
0
           Tag_ABI_DSBT);
1621
0
}
1622
1623
/* Create .plt, .rela.plt, .got, .got.plt, .rela.got and .dsbt
1624
   sections in DYNOBJ, and set up shortcuts to them in our hash
1625
   table.  */
1626
1627
static bool
1628
elf32_tic6x_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
1629
0
{
1630
0
  struct elf32_tic6x_link_hash_table *htab;
1631
0
  flagword flags;
1632
1633
0
  htab = elf32_tic6x_hash_table (info);
1634
0
  if (htab == NULL)
1635
0
    return false;
1636
1637
0
  if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1638
0
    return false;
1639
1640
  /* Create .dsbt  */
1641
0
  flags = (SEC_ALLOC | SEC_LOAD
1642
0
     | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
1643
0
  htab->dsbt = bfd_make_section_anyway_with_flags (dynobj, ".dsbt",
1644
0
               flags);
1645
0
  if (htab->dsbt == NULL
1646
0
      || !bfd_set_section_alignment (htab->dsbt, 2)
1647
0
      || !bfd_set_section_alignment (htab->elf.splt, 5))
1648
0
    return false;
1649
1650
0
  return true;
1651
0
}
1652
1653
static bool
1654
elf32_tic6x_mkobject (bfd *abfd)
1655
311k
{
1656
311k
  bool ret;
1657
1658
311k
  ret = bfd_elf_allocate_object (abfd, sizeof (struct elf32_tic6x_obj_tdata));
1659
311k
  if (ret)
1660
311k
    elf32_tic6x_set_use_rela_p (abfd, true);
1661
311k
  return ret;
1662
311k
}
1663
1664
/* Install relocation RELA into section SRELA, incrementing its
1665
   reloc_count.  */
1666
1667
static void
1668
elf32_tic6x_install_rela (bfd *output_bfd, asection *srela,
1669
        Elf_Internal_Rela *rela)
1670
0
{
1671
0
  bfd_byte *loc;
1672
0
  bfd_vma off = srela->reloc_count++ * sizeof (Elf32_External_Rela);
1673
0
  loc = srela->contents + off;
1674
0
  BFD_ASSERT (off < srela->size);
1675
0
  bfd_elf32_swap_reloca_out (output_bfd, rela, loc);
1676
0
}
1677
1678
/* Create a dynamic reloc against the GOT at offset OFFSET.  The contents
1679
   of the GOT at this offset have been initialized with the relocation.  */
1680
1681
static void
1682
elf32_tic6x_make_got_dynreloc (bfd *output_bfd,
1683
             struct elf32_tic6x_link_hash_table *htab,
1684
             asection *sym_sec, bfd_vma offset)
1685
0
{
1686
0
  asection *sgot = htab->elf.sgot;
1687
0
  Elf_Internal_Rela outrel;
1688
0
  int dynindx;
1689
1690
0
  outrel.r_offset = sgot->output_section->vma + sgot->output_offset + offset;
1691
0
  outrel.r_addend = bfd_get_32 (output_bfd, sgot->contents + offset);
1692
0
  if (sym_sec && sym_sec->output_section
1693
0
      && ! bfd_is_abs_section (sym_sec->output_section)
1694
0
      && ! bfd_is_und_section (sym_sec->output_section))
1695
0
    {
1696
0
      dynindx = elf_section_data (sym_sec->output_section)->dynindx;
1697
0
      outrel.r_addend -= sym_sec->output_section->vma;
1698
0
    }
1699
0
  else
1700
0
    {
1701
0
      dynindx = 0;
1702
0
    }
1703
0
  outrel.r_info = ELF32_R_INFO (dynindx, R_C6000_ABS32);
1704
0
  elf32_tic6x_install_rela (output_bfd, htab->elf.srelgot, &outrel);
1705
0
}
1706
1707
/* Finish up dynamic symbol handling.  We set the contents of various
1708
   dynamic sections here.  */
1709
1710
static bool
1711
elf32_tic6x_finish_dynamic_symbol (bfd * output_bfd,
1712
           struct bfd_link_info *info,
1713
           struct elf_link_hash_entry *h,
1714
           Elf_Internal_Sym * sym)
1715
0
{
1716
0
  struct elf32_tic6x_link_hash_table *htab;
1717
1718
0
  htab = elf32_tic6x_hash_table (info);
1719
1720
0
  if (h->plt.offset != (bfd_vma) -1)
1721
0
    {
1722
0
      bfd_vma plt_index;
1723
0
      bfd_vma got_section_offset, got_dp_offset, rela_offset;
1724
0
      Elf_Internal_Rela rela;
1725
0
      bfd_byte *loc;
1726
0
      asection *plt, *gotplt, *relplt;
1727
0
      const struct elf_backend_data *bed;
1728
1729
0
      bed = get_elf_backend_data (output_bfd);
1730
1731
0
      BFD_ASSERT (htab->elf.splt != NULL);
1732
0
      plt = htab->elf.splt;
1733
0
      gotplt = htab->elf.sgotplt;
1734
0
      relplt = htab->elf.srelplt;
1735
1736
      /* This symbol has an entry in the procedure linkage table.  Set
1737
   it up.  */
1738
1739
0
      if ((h->dynindx == -1
1740
0
     && !((h->forced_local || bfd_link_executable (info))
1741
0
    && h->def_regular
1742
0
    && h->type == STT_GNU_IFUNC))
1743
0
    || plt == NULL
1744
0
    || gotplt == NULL
1745
0
    || relplt == NULL)
1746
0
  abort ();
1747
1748
      /* Get the index in the procedure linkage table which
1749
   corresponds to this symbol.  This is the index of this symbol
1750
   in all the symbols for which we are making plt entries.  The
1751
   first entry in the procedure linkage table is reserved.
1752
1753
   Get the offset into the .got table of the entry that
1754
   corresponds to this function.  Each .got entry is 4 bytes.
1755
   The first three are reserved.
1756
1757
   For static executables, we don't reserve anything.  */
1758
1759
0
      plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
1760
0
      got_section_offset = plt_index + bed->got_header_size / 4;
1761
0
      got_dp_offset = got_section_offset + htab->params.dsbt_size;
1762
0
      rela_offset = plt_index * sizeof (Elf32_External_Rela);
1763
1764
0
      got_section_offset *= 4;
1765
1766
      /* Fill in the entry in the procedure linkage table.  */
1767
1768
      /* ldw .d2t2 *+B14($GOT(f)), b2 */
1769
0
      bfd_put_32 (output_bfd, got_dp_offset << 8 | 0x0100006e,
1770
0
      plt->contents + h->plt.offset);
1771
      /* mvk .s2 low(rela_offset), b0 */
1772
0
      bfd_put_32 (output_bfd, (rela_offset & 0xffff) << 7 | 0x0000002a,
1773
0
      plt->contents + h->plt.offset + 4);
1774
      /* mvkh .s2 high(rela_offset), b0 */
1775
0
      bfd_put_32 (output_bfd, ((rela_offset >> 16) & 0xffff) << 7 | 0x0000006a,
1776
0
      plt->contents + h->plt.offset + 8);
1777
      /* nop 2 */
1778
0
      bfd_put_32 (output_bfd, 0x00002000,
1779
0
      plt->contents + h->plt.offset + 12);
1780
      /* b .s2 b2 */
1781
0
      bfd_put_32 (output_bfd, 0x00080362,
1782
0
      plt->contents + h->plt.offset + 16);
1783
      /* nop 5 */
1784
0
      bfd_put_32 (output_bfd, 0x00008000,
1785
0
      plt->contents + h->plt.offset + 20);
1786
1787
      /* Fill in the entry in the global offset table.  */
1788
0
      bfd_put_32 (output_bfd,
1789
0
      (plt->output_section->vma + plt->output_offset),
1790
0
      gotplt->contents + got_section_offset);
1791
1792
      /* Fill in the entry in the .rel.plt section.  */
1793
0
      rela.r_offset = (gotplt->output_section->vma
1794
0
           + gotplt->output_offset
1795
0
           + got_section_offset);
1796
0
      rela.r_info = ELF32_R_INFO (h->dynindx, R_C6000_JUMP_SLOT);
1797
0
      rela.r_addend = 0;
1798
0
      loc = relplt->contents + rela_offset;
1799
0
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1800
1801
0
      if (!h->def_regular)
1802
0
  {
1803
    /* Mark the symbol as undefined, rather than as defined in
1804
       the .plt section.  */
1805
0
    sym->st_shndx = SHN_UNDEF;
1806
0
    sym->st_value = 0;
1807
0
  }
1808
0
    }
1809
1810
0
  if (h->got.offset != (bfd_vma) -1)
1811
0
    {
1812
0
      asection *sgot;
1813
0
      asection *srela;
1814
1815
      /* This symbol has an entry in the global offset table.
1816
   Set it up.  */
1817
1818
0
      sgot = htab->elf.sgot;
1819
0
      srela = htab->elf.srelgot;
1820
0
      BFD_ASSERT (sgot != NULL && srela != NULL);
1821
1822
      /* If this is a -Bsymbolic link, and the symbol is defined
1823
   locally, we just want to emit a RELATIVE reloc.  Likewise if
1824
   the symbol was forced to be local because of a version file.
1825
   The entry in the global offset table will already have been
1826
   initialized in the relocate_section function.  */
1827
0
      if (bfd_link_pic (info)
1828
0
    && (SYMBOLIC_BIND (info, h)
1829
0
        || h->dynindx == -1 || h->forced_local) && h->def_regular)
1830
0
  {
1831
0
    asection *s = h->root.u.def.section;
1832
0
    elf32_tic6x_make_got_dynreloc (output_bfd, htab, s,
1833
0
           h->got.offset & ~(bfd_vma) 1);
1834
0
  }
1835
0
      else
1836
0
  {
1837
0
    Elf_Internal_Rela outrel;
1838
0
    bfd_put_32 (output_bfd, (bfd_vma) 0,
1839
0
          sgot->contents + (h->got.offset & ~(bfd_vma) 1));
1840
0
    outrel.r_offset = (sgot->output_section->vma
1841
0
         + sgot->output_offset
1842
0
         + (h->got.offset & ~(bfd_vma) 1));
1843
0
    outrel.r_info = ELF32_R_INFO (h->dynindx, R_C6000_ABS32);
1844
0
    outrel.r_addend = 0;
1845
1846
0
    elf32_tic6x_install_rela (output_bfd, srela, &outrel);
1847
0
  }
1848
0
    }
1849
1850
0
  if (h->needs_copy)
1851
0
    {
1852
0
      Elf_Internal_Rela rel;
1853
0
      asection *s;
1854
1855
      /* This symbol needs a copy reloc.  Set it up.  */
1856
1857
0
      if (h->dynindx == -1
1858
0
    || (h->root.type != bfd_link_hash_defined
1859
0
        && h->root.type != bfd_link_hash_defweak)
1860
0
    || htab->elf.srelbss == NULL
1861
0
    || htab->elf.sreldynrelro == NULL)
1862
0
  abort ();
1863
1864
0
      rel.r_offset = (h->root.u.def.value
1865
0
          + h->root.u.def.section->output_section->vma
1866
0
          + h->root.u.def.section->output_offset);
1867
0
      rel.r_info = ELF32_R_INFO (h->dynindx, R_C6000_COPY);
1868
0
      rel.r_addend = 0;
1869
0
      if (h->root.u.def.section == htab->elf.sdynrelro)
1870
0
  s = htab->elf.sreldynrelro;
1871
0
      else
1872
0
  s = htab->elf.srelbss;
1873
1874
0
      elf32_tic6x_install_rela (output_bfd, s, &rel);
1875
0
    }
1876
1877
  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
1878
0
  if (h == elf_hash_table (info)->hdynamic
1879
0
      || h == elf_hash_table (info)->hgot)
1880
0
    sym->st_shndx = SHN_ABS;
1881
1882
0
  return true;
1883
0
}
1884
1885
/* Unwinding tables are not referenced directly.  This pass marks them as
1886
   required if the corresponding code section is marked.  */
1887
1888
static bool
1889
elf32_tic6x_gc_mark_extra_sections (struct bfd_link_info *info,
1890
            elf_gc_mark_hook_fn gc_mark_hook)
1891
0
{
1892
0
  bfd *sub;
1893
0
  Elf_Internal_Shdr **elf_shdrp;
1894
0
  bool again;
1895
1896
0
  _bfd_elf_gc_mark_extra_sections (info, gc_mark_hook);
1897
1898
  /* Marking EH data may cause additional code sections to be marked,
1899
     requiring multiple passes.  */
1900
0
  again = true;
1901
0
  while (again)
1902
0
    {
1903
0
      again = false;
1904
0
      for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
1905
0
  {
1906
0
    asection *o;
1907
1908
0
    if (! is_tic6x_elf (sub))
1909
0
      continue;
1910
1911
0
    elf_shdrp = elf_elfsections (sub);
1912
0
    for (o = sub->sections; o != NULL; o = o->next)
1913
0
      {
1914
0
        Elf_Internal_Shdr *hdr;
1915
1916
0
        hdr = &elf_section_data (o)->this_hdr;
1917
0
        if (hdr->sh_type == SHT_C6000_UNWIND
1918
0
      && hdr->sh_link
1919
0
      && hdr->sh_link < elf_numsections (sub)
1920
0
      && !o->gc_mark
1921
0
      && elf_shdrp[hdr->sh_link]->bfd_section->gc_mark)
1922
0
    {
1923
0
      again = true;
1924
0
      if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
1925
0
        return false;
1926
0
    }
1927
0
      }
1928
0
  }
1929
0
    }
1930
1931
0
  return true;
1932
0
}
1933
1934
/* Return TRUE if this is an unwinding table index.  */
1935
1936
static bool
1937
is_tic6x_elf_unwind_section_name (const char *name)
1938
0
{
1939
0
  return (startswith (name, ELF_STRING_C6000_unwind)
1940
0
    || startswith (name, ELF_STRING_C6000_unwind_once));
1941
0
}
1942
1943
1944
/* Set the type and flags for an unwinding index table.  We do this by
1945
   the section name, which is a hack, but ought to work.  */
1946
1947
static bool
1948
elf32_tic6x_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
1949
         Elf_Internal_Shdr *hdr, asection *sec)
1950
0
{
1951
0
  const char * name;
1952
1953
0
  name = bfd_section_name (sec);
1954
1955
0
  if (is_tic6x_elf_unwind_section_name (name))
1956
0
    {
1957
0
      hdr->sh_type = SHT_C6000_UNWIND;
1958
0
      hdr->sh_flags |= SHF_LINK_ORDER;
1959
0
    }
1960
1961
0
  return true;
1962
0
}
1963
1964
/* Adjust a symbol defined by a dynamic object and referenced by a
1965
   regular object.  The current definition is in some section of the
1966
   dynamic object, but we're not including those sections.  We have to
1967
   change the definition to something the rest of the link can
1968
   understand.  */
1969
1970
static bool
1971
elf32_tic6x_adjust_dynamic_symbol (struct bfd_link_info *info,
1972
           struct elf_link_hash_entry *h)
1973
0
{
1974
0
  struct elf32_tic6x_link_hash_table *htab;
1975
0
  bfd *dynobj;
1976
0
  asection *s, *srel;
1977
1978
0
  dynobj = elf_hash_table (info)->dynobj;
1979
1980
  /* Make sure we know what is going on here.  */
1981
0
  BFD_ASSERT (dynobj != NULL
1982
0
        && (h->needs_plt
1983
0
      || h->is_weakalias
1984
0
      || (h->def_dynamic && h->ref_regular && !h->def_regular)));
1985
1986
  /* If this is a function, put it in the procedure linkage table.  We
1987
     will fill in the contents of the procedure linkage table later,
1988
     when we know the address of the .got section.  */
1989
0
  if (h->type == STT_FUNC
1990
0
      || h->needs_plt)
1991
0
    {
1992
0
      if (h->plt.refcount <= 0
1993
0
    || SYMBOL_CALLS_LOCAL (info, h)
1994
0
    || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1995
0
        && h->root.type == bfd_link_hash_undefweak))
1996
0
  {
1997
    /* This case can occur if we saw a PLT32 reloc in an input
1998
       file, but the symbol was never referred to by a dynamic
1999
       object, or if all references were garbage collected.  In
2000
       such a case, we don't actually need to build a procedure
2001
       linkage table, and we can just do a PC32 reloc instead.  */
2002
0
    h->plt.offset = (bfd_vma) -1;
2003
0
    h->needs_plt = 0;
2004
0
  }
2005
2006
0
      return true;
2007
0
    }
2008
2009
  /* If this is a weak symbol, and there is a real definition, the
2010
     processor independent code will have arranged for us to see the
2011
     real definition first, and we can just use the same value.  */
2012
0
  if (h->is_weakalias)
2013
0
    {
2014
0
      struct elf_link_hash_entry *def = weakdef (h);
2015
0
      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
2016
0
      h->root.u.def.section = def->root.u.def.section;
2017
0
      h->root.u.def.value = def->root.u.def.value;
2018
0
      h->non_got_ref = def->non_got_ref;
2019
0
      return true;
2020
0
    }
2021
2022
  /* This is a reference to a symbol defined by a dynamic object which
2023
     is not a function.  */
2024
2025
  /* If we are creating a shared library, we must presume that the
2026
     only references to the symbol are via the global offset table.
2027
     For such cases we need not do anything here; the relocations will
2028
     be handled correctly by relocate_section.  */
2029
0
  if (bfd_link_pic (info))
2030
0
    return true;
2031
2032
  /* If there are no references to this symbol that do not use the
2033
     GOT, we don't need to generate a copy reloc.  */
2034
0
  if (!h->non_got_ref)
2035
0
    return true;
2036
2037
  /* If -z nocopyreloc was given, we won't generate them either.  */
2038
0
  if (info->nocopyreloc)
2039
0
    {
2040
0
      h->non_got_ref = 0;
2041
0
      return true;
2042
0
    }
2043
2044
0
  htab = elf32_tic6x_hash_table (info);
2045
0
  if (htab == NULL)
2046
0
    return false;
2047
2048
  /* We must allocate the symbol in our .dynbss section, which will
2049
     become part of the .bss section of the executable.  There will be
2050
     an entry for this symbol in the .dynsym section.  The dynamic
2051
     object will contain position independent code, so all references
2052
     from the dynamic object to this symbol will go through the global
2053
     offset table.  The dynamic linker will use the .dynsym entry to
2054
     determine the address it must put in the global offset table, so
2055
     both the dynamic object and the regular object will refer to the
2056
     same memory location for the variable.  */
2057
2058
  /* We must generate a R_C6000_COPY reloc to tell the dynamic linker to
2059
     copy the initial value out of the dynamic object and into the
2060
     runtime process image.  */
2061
0
  if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
2062
0
    {
2063
0
      s = htab->elf.sdynrelro;
2064
0
      srel = htab->elf.sreldynrelro;
2065
0
    }
2066
0
  else
2067
0
    {
2068
0
      s = htab->elf.sdynbss;
2069
0
      srel = htab->elf.srelbss;
2070
0
    }
2071
0
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2072
0
    {
2073
0
      srel->size += sizeof (Elf32_External_Rela);
2074
0
      h->needs_copy = 1;
2075
0
    }
2076
2077
0
  return _bfd_elf_adjust_dynamic_copy (info, h, s);
2078
0
}
2079
2080
static bool
2081
elf32_tic6x_new_section_hook (bfd *abfd, asection *sec)
2082
23.6k
{
2083
23.6k
  bool ret;
2084
23.6k
  _tic6x_elf_section_data *sdata;
2085
2086
23.6k
  sdata = bfd_zalloc (abfd, sizeof (*sdata));
2087
23.6k
  if (sdata == NULL)
2088
0
    return false;
2089
23.6k
  sec->used_by_bfd = sdata;
2090
2091
23.6k
  ret = _bfd_elf_new_section_hook (abfd, sec);
2092
23.6k
  sec->use_rela_p = elf32_tic6x_tdata (abfd)->use_rela_p;
2093
2094
23.6k
  return ret;
2095
23.6k
}
2096
2097
/* Return true if relocation REL against section SEC is a REL rather
2098
   than RELA relocation.  RELOCS is the first relocation in the
2099
   section and ABFD is the bfd that contains SEC.  */
2100
2101
static bool
2102
elf32_tic6x_rel_relocation_p (bfd *abfd, asection *sec,
2103
            const Elf_Internal_Rela *relocs,
2104
            const Elf_Internal_Rela *rel)
2105
0
{
2106
0
  Elf_Internal_Shdr *rel_hdr;
2107
0
  const struct elf_backend_data *bed;
2108
2109
  /* To determine which flavor of relocation this is, we depend on the
2110
     fact that the INPUT_SECTION's REL_HDR is read before RELA_HDR.  */
2111
0
  rel_hdr = elf_section_data (sec)->rel.hdr;
2112
0
  if (rel_hdr == NULL)
2113
0
    return false;
2114
0
  bed = get_elf_backend_data (abfd);
2115
0
  return ((size_t) (rel - relocs)
2116
0
    < NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel);
2117
0
}
2118
2119
/* We need dynamic symbols for every section, since segments can
2120
   relocate independently.  */
2121
static bool
2122
elf32_tic6x_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
2123
              struct bfd_link_info *info ATTRIBUTE_UNUSED,
2124
              asection *p)
2125
0
{
2126
0
  switch (elf_section_data (p)->this_hdr.sh_type)
2127
0
    {
2128
0
    case SHT_PROGBITS:
2129
0
    case SHT_NOBITS:
2130
      /* If sh_type is yet undecided, assume it could be
2131
   SHT_PROGBITS/SHT_NOBITS.  */
2132
0
    case SHT_NULL:
2133
0
      return false;
2134
2135
      /* There shouldn't be section relative relocations
2136
   against any other section.  */
2137
0
    default:
2138
0
      return true;
2139
0
    }
2140
0
}
2141
2142
static int
2143
elf32_tic6x_relocate_section (bfd *output_bfd,
2144
            struct bfd_link_info *info,
2145
            bfd *input_bfd,
2146
            asection *input_section,
2147
            bfd_byte *contents,
2148
            Elf_Internal_Rela *relocs,
2149
            Elf_Internal_Sym *local_syms,
2150
            asection **local_sections)
2151
0
{
2152
0
  struct elf32_tic6x_link_hash_table *htab;
2153
0
  Elf_Internal_Shdr *symtab_hdr;
2154
0
  struct elf_link_hash_entry **sym_hashes;
2155
0
  bfd_vma *local_got_offsets;
2156
0
  Elf_Internal_Rela *rel;
2157
0
  Elf_Internal_Rela *relend;
2158
0
  bool ok = true;
2159
2160
0
  htab = elf32_tic6x_hash_table (info);
2161
0
  symtab_hdr = & elf_symtab_hdr (input_bfd);
2162
0
  sym_hashes = elf_sym_hashes (input_bfd);
2163
0
  local_got_offsets = elf_local_got_offsets (input_bfd);
2164
2165
0
  relend = relocs + input_section->reloc_count;
2166
2167
0
  for (rel = relocs; rel < relend; rel ++)
2168
0
    {
2169
0
      int r_type;
2170
0
      unsigned long r_symndx;
2171
0
      arelent bfd_reloc;
2172
0
      reloc_howto_type *howto;
2173
0
      Elf_Internal_Sym *sym;
2174
0
      asection *sec;
2175
0
      struct elf_link_hash_entry *h;
2176
0
      bfd_vma off, off2, relocation;
2177
0
      bool unresolved_reloc;
2178
0
      bfd_reloc_status_type r;
2179
0
      struct bfd_link_hash_entry *sbh;
2180
0
      bool is_rel;
2181
0
      bool res;
2182
2183
0
      r_type = ELF32_R_TYPE (rel->r_info);
2184
0
      r_symndx = ELF32_R_SYM (rel->r_info);
2185
2186
0
      is_rel = elf32_tic6x_rel_relocation_p (input_bfd, input_section,
2187
0
               relocs, rel);
2188
2189
0
      if (is_rel)
2190
0
  res = elf32_tic6x_info_to_howto_rel (input_bfd, &bfd_reloc, rel);
2191
0
      else
2192
0
  res = elf32_tic6x_info_to_howto (input_bfd, &bfd_reloc, rel);
2193
2194
0
      if (!res || (howto = bfd_reloc.howto) == NULL)
2195
0
  {
2196
0
    bfd_set_error (bfd_error_bad_value);
2197
0
    return false;
2198
0
  }
2199
2200
0
      h = NULL;
2201
0
      sym = NULL;
2202
0
      sec = NULL;
2203
0
      unresolved_reloc = false;
2204
2205
0
      if (r_symndx < symtab_hdr->sh_info)
2206
0
  {
2207
0
    sym = local_syms + r_symndx;
2208
0
    sec = local_sections[r_symndx];
2209
0
    relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2210
0
  }
2211
0
      else
2212
0
  {
2213
0
    bool warned, ignored;
2214
2215
0
    RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2216
0
           r_symndx, symtab_hdr, sym_hashes,
2217
0
           h, sec, relocation,
2218
0
           unresolved_reloc, warned, ignored);
2219
0
  }
2220
2221
0
      if (sec != NULL && discarded_section (sec))
2222
0
  RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2223
0
           rel, 1, relend, howto, 0, contents);
2224
2225
0
      if (bfd_link_relocatable (info))
2226
0
  {
2227
0
    if (is_rel
2228
0
        && sym != NULL
2229
0
        && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
2230
0
      {
2231
0
        rel->r_addend = 0;
2232
0
        relocation = sec->output_offset + sym->st_value;
2233
0
        r = _bfd_relocate_contents (howto, input_bfd, relocation,
2234
0
            contents + rel->r_offset);
2235
0
        goto done_reloc;
2236
0
      }
2237
0
    continue;
2238
0
  }
2239
2240
0
      switch (r_type)
2241
0
  {
2242
0
  case R_C6000_NONE:
2243
0
  case R_C6000_ALIGN:
2244
0
  case R_C6000_FPHEAD:
2245
0
  case R_C6000_NOCMP:
2246
    /* No action needed.  */
2247
0
    continue;
2248
2249
0
  case R_C6000_PCR_S21:
2250
    /* A branch to an undefined weak symbol is turned into a
2251
       "b .s2 B3" instruction if the existing insn is of the
2252
       form "b .s2 symbol".  */
2253
0
    if (h ? h->root.type == bfd_link_hash_undefweak
2254
0
        && (htab->elf.splt == NULL || h->plt.offset == (bfd_vma) -1)
2255
0
        : r_symndx != STN_UNDEF && bfd_is_und_section (sec))
2256
0
      {
2257
0
        unsigned long oldval;
2258
0
        oldval = bfd_get_32 (input_bfd, contents + rel->r_offset);
2259
2260
0
        if ((oldval & 0x7e) == 0x12)
2261
0
    {
2262
0
      oldval &= 0xF0000001;
2263
0
      bfd_put_32 (input_bfd, oldval | 0x000c0362,
2264
0
            contents + rel->r_offset);
2265
0
      r = bfd_reloc_ok;
2266
0
      goto done_reloc;
2267
0
    }
2268
0
      }
2269
    /* Fall through.  */
2270
2271
0
  case R_C6000_PCR_S12:
2272
0
  case R_C6000_PCR_S10:
2273
0
  case R_C6000_PCR_S7:
2274
0
    if (h != NULL
2275
0
        && h->plt.offset != (bfd_vma) -1
2276
0
        && htab->elf.splt != NULL)
2277
0
      {
2278
0
        relocation = (htab->elf.splt->output_section->vma
2279
0
          + htab->elf.splt->output_offset
2280
0
          + h->plt.offset);
2281
0
      }
2282
2283
    /* Generic PC-relative handling produces a value relative to
2284
       the exact location of the relocation.  Adjust it to be
2285
       relative to the start of the fetch packet instead.  */
2286
0
    relocation += (input_section->output_section->vma
2287
0
       + input_section->output_offset
2288
0
       + rel->r_offset) & 0x1f;
2289
0
    unresolved_reloc = false;
2290
0
    break;
2291
2292
0
  case R_C6000_PCR_H16:
2293
0
  case R_C6000_PCR_L16:
2294
0
    off = (input_section->output_section->vma
2295
0
     + input_section->output_offset
2296
0
     + rel->r_offset);
2297
    /* These must be calculated as R = S - FP(FP(PC) - A).
2298
       PC, here, is the value we just computed in OFF.  RELOCATION
2299
       has the address of S + A. */
2300
0
    relocation -= rel->r_addend;
2301
0
    off2 = ((off & ~(bfd_vma)0x1f) - rel->r_addend) & (bfd_vma)~0x1f;
2302
0
    off2 = relocation - off2;
2303
0
    relocation = off + off2;
2304
0
    break;
2305
2306
0
  case R_C6000_DSBT_INDEX:
2307
0
    relocation = elf32_tic6x_hash_table (info)->params.dsbt_index;
2308
0
    if (!bfd_link_pic (info) || relocation != 0)
2309
0
      break;
2310
2311
    /* fall through */
2312
0
  case R_C6000_ABS32:
2313
0
  case R_C6000_ABS16:
2314
0
  case R_C6000_ABS8:
2315
0
  case R_C6000_ABS_S16:
2316
0
  case R_C6000_ABS_L16:
2317
0
  case R_C6000_ABS_H16:
2318
    /* When generating a shared object or relocatable executable, these
2319
       relocations are copied into the output file to be resolved at
2320
       run time.  */
2321
0
    if ((bfd_link_pic (info) || elf32_tic6x_using_dsbt (output_bfd))
2322
0
        && (input_section->flags & SEC_ALLOC)
2323
0
        && (h == NULL
2324
0
      || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2325
0
      || h->root.type != bfd_link_hash_undefweak))
2326
0
      {
2327
0
        Elf_Internal_Rela outrel;
2328
0
        bool skip, relocate;
2329
0
        asection *sreloc;
2330
2331
0
        unresolved_reloc = false;
2332
2333
0
        sreloc = elf_section_data (input_section)->sreloc;
2334
0
        BFD_ASSERT (sreloc != NULL && sreloc->contents != NULL);
2335
2336
0
        skip = false;
2337
0
        relocate = false;
2338
2339
0
        outrel.r_offset =
2340
0
    _bfd_elf_section_offset (output_bfd, info, input_section,
2341
0
           rel->r_offset);
2342
0
        if (outrel.r_offset == (bfd_vma) -1)
2343
0
    skip = true;
2344
0
        else if (outrel.r_offset == (bfd_vma) -2)
2345
0
    skip = true, relocate = true;
2346
0
        outrel.r_offset += (input_section->output_section->vma
2347
0
          + input_section->output_offset);
2348
2349
0
        if (skip)
2350
0
    memset (&outrel, 0, sizeof outrel);
2351
0
        else if (h != NULL
2352
0
           && h->dynindx != -1
2353
0
           && (!bfd_link_pic (info)
2354
0
         || !SYMBOLIC_BIND (info, h)
2355
0
         || !h->def_regular))
2356
0
    {
2357
0
      outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2358
0
      outrel.r_addend = rel->r_addend;
2359
0
    }
2360
0
        else
2361
0
    {
2362
0
      long indx;
2363
2364
0
      outrel.r_addend = relocation + rel->r_addend;
2365
2366
0
      if (bfd_is_abs_section (sec))
2367
0
        indx = 0;
2368
0
      else if (sec == NULL || sec->owner == NULL)
2369
0
        {
2370
0
          bfd_set_error (bfd_error_bad_value);
2371
0
          return false;
2372
0
        }
2373
0
      else
2374
0
        {
2375
0
          asection *osec;
2376
2377
0
          osec = sec->output_section;
2378
0
          indx = elf_section_data (osec)->dynindx;
2379
0
          outrel.r_addend -= osec->vma;
2380
0
          BFD_ASSERT (indx != 0);
2381
0
        }
2382
2383
0
      outrel.r_info = ELF32_R_INFO (indx, r_type);
2384
0
    }
2385
2386
0
        elf32_tic6x_install_rela (output_bfd, sreloc, &outrel);
2387
2388
        /* If this reloc is against an external symbol, we do not want to
2389
     fiddle with the addend.  Otherwise, we need to include the symbol
2390
     value so that it becomes an addend for the dynamic reloc.  */
2391
0
        if (! relocate)
2392
0
    continue;
2393
0
      }
2394
2395
    /* Generic logic OK.  */
2396
0
    break;
2397
2398
0
  case R_C6000_SBR_U15_B:
2399
0
  case R_C6000_SBR_U15_H:
2400
0
  case R_C6000_SBR_U15_W:
2401
0
  case R_C6000_SBR_S16:
2402
0
  case R_C6000_SBR_L16_B:
2403
0
  case R_C6000_SBR_L16_H:
2404
0
  case R_C6000_SBR_L16_W:
2405
0
  case R_C6000_SBR_H16_B:
2406
0
  case R_C6000_SBR_H16_H:
2407
0
  case R_C6000_SBR_H16_W:
2408
0
    sbh = bfd_link_hash_lookup (info->hash, "__c6xabi_DSBT_BASE",
2409
0
              false, false, true);
2410
0
    if (sbh != NULL
2411
0
        && (sbh->type == bfd_link_hash_defined
2412
0
      || sbh->type == bfd_link_hash_defweak))
2413
0
      {
2414
0
        if (h ? (h->root.type == bfd_link_hash_undefweak
2415
0
           && (htab->elf.splt == NULL
2416
0
         || h->plt.offset == (bfd_vma) -1))
2417
0
      : r_symndx != STN_UNDEF && bfd_is_und_section (sec))
2418
0
    relocation = 0;
2419
0
        else
2420
0
    relocation -= (sbh->u.def.value
2421
0
             + sbh->u.def.section->output_section->vma
2422
0
             + sbh->u.def.section->output_offset);
2423
0
      }
2424
0
    else
2425
0
      {
2426
0
        _bfd_error_handler (_("%pB: SB-relative relocation but "
2427
0
            "__c6xabi_DSBT_BASE not defined"),
2428
0
          input_bfd);
2429
0
        ok = false;
2430
0
        continue;
2431
0
      }
2432
0
    break;
2433
2434
0
  case R_C6000_SBR_GOT_U15_W:
2435
0
  case R_C6000_SBR_GOT_L16_W:
2436
0
  case R_C6000_SBR_GOT_H16_W:
2437
0
  case R_C6000_EHTYPE:
2438
    /* Relocation is to the entry for this symbol in the global
2439
       offset table.  */
2440
0
    if (htab->elf.sgot == NULL)
2441
0
      abort ();
2442
2443
0
    if (h != NULL)
2444
0
      {
2445
0
        bool dyn;
2446
2447
0
        off = h->got.offset;
2448
0
        dyn = htab->elf.dynamic_sections_created;
2449
0
        if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
2450
0
                 bfd_link_pic (info),
2451
0
                 h)
2452
0
      || (bfd_link_pic (info)
2453
0
          && SYMBOL_REFERENCES_LOCAL (info, h))
2454
0
      || (ELF_ST_VISIBILITY (h->other)
2455
0
          && h->root.type == bfd_link_hash_undefweak))
2456
0
    {
2457
      /* This is actually a static link, or it is a
2458
         -Bsymbolic link and the symbol is defined
2459
         locally, or the symbol was forced to be local
2460
         because of a version file.  We must initialize
2461
         this entry in the global offset table.  Since the
2462
         offset must always be a multiple of 4, we use the
2463
         least significant bit to record whether we have
2464
         initialized it already.
2465
2466
         When doing a dynamic link, we create a .rel.got
2467
         relocation entry to initialize the value.  This
2468
         is done in the finish_dynamic_symbol routine.  */
2469
0
      if ((off & 1) != 0)
2470
0
        off &= ~1;
2471
0
      else
2472
0
        {
2473
0
          bfd_put_32 (output_bfd, relocation,
2474
0
          htab->elf.sgot->contents + off);
2475
0
          h->got.offset |= 1;
2476
2477
0
          if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
2478
0
                  bfd_link_pic (info),
2479
0
                  h)
2480
0
        && !(ELF_ST_VISIBILITY (h->other)
2481
0
             && h->root.type == bfd_link_hash_undefweak))
2482
0
      elf32_tic6x_make_got_dynreloc (output_bfd, htab, sec,
2483
0
                   off);
2484
0
        }
2485
0
    }
2486
0
        else
2487
0
    unresolved_reloc = false;
2488
0
      }
2489
0
    else
2490
0
      {
2491
0
        if (local_got_offsets == NULL)
2492
0
    abort ();
2493
2494
0
        off = local_got_offsets[r_symndx];
2495
2496
        /* The offset must always be a multiple of 4.  We use
2497
     the least significant bit to record whether we have
2498
     already generated the necessary reloc.  */
2499
0
        if ((off & 1) != 0)
2500
0
    off &= ~1;
2501
0
        else
2502
0
    {
2503
0
      bfd_put_32 (output_bfd, relocation,
2504
0
            htab->elf.sgot->contents + off);
2505
2506
0
      if (bfd_link_pic (info) || elf32_tic6x_using_dsbt (output_bfd))
2507
0
        elf32_tic6x_make_got_dynreloc (output_bfd, htab, sec, off);
2508
2509
0
      local_got_offsets[r_symndx] |= 1;
2510
0
    }
2511
0
      }
2512
2513
0
    if (off >= (bfd_vma) -2)
2514
0
      abort ();
2515
2516
0
    if (htab->dsbt)
2517
0
      relocation = (htab->elf.sgot->output_section->vma
2518
0
        + htab->elf.sgot->output_offset + off
2519
0
        - htab->dsbt->output_section->vma
2520
0
        - htab->dsbt->output_offset);
2521
0
    else
2522
0
      relocation = (htab->elf.sgot->output_section->vma
2523
0
        + htab->elf.sgot->output_offset + off
2524
0
        - htab->elf.sgotplt->output_section->vma
2525
0
        - htab->elf.sgotplt->output_offset);
2526
2527
0
    if (rel->r_addend != 0)
2528
0
      {
2529
        /* We can't do anything for a relocation which is against
2530
     a symbol *plus offset*.  GOT holds relocations for
2531
     symbols.  Make this an error; the compiler isn't
2532
     allowed to pass us these kinds of things.  */
2533
0
        if (h == NULL)
2534
0
    _bfd_error_handler
2535
      /* xgettext:c-format */
2536
0
      (_("%pB, section %pA: relocation %s with non-zero addend %"
2537
0
         PRId64 " against local symbol"),
2538
0
       input_bfd,
2539
0
       input_section,
2540
0
       elf32_tic6x_howto_table[r_type].name,
2541
0
       (int64_t) rel->r_addend);
2542
0
        else
2543
0
    _bfd_error_handler
2544
      /* xgettext:c-format */
2545
0
      (_("%pB, section %pA: relocation %s with non-zero addend %"
2546
0
         PRId64 " against symbol `%s'"),
2547
0
       input_bfd,
2548
0
       input_section,
2549
0
       elf32_tic6x_howto_table[r_type].name,
2550
0
       (int64_t) rel->r_addend,
2551
0
       h->root.root.string[0] != '\0' ? h->root.root.string
2552
0
       : _("[whose name is lost]"));
2553
2554
0
        bfd_set_error (bfd_error_bad_value);
2555
0
        return false;
2556
0
      }
2557
0
    break;
2558
2559
0
  case R_C6000_PREL31:
2560
0
    if (h != NULL
2561
0
        && h->plt.offset != (bfd_vma) -1
2562
0
        && htab->elf.splt != NULL)
2563
0
      {
2564
0
        relocation = (htab->elf.splt->output_section->vma
2565
0
          + htab->elf.splt->output_offset
2566
0
          + h->plt.offset);
2567
0
      }
2568
0
    break;
2569
2570
0
  case R_C6000_COPY:
2571
    /* Invalid in relocatable object.  */
2572
0
  default:
2573
    /* Unknown relocation.  */
2574
    /* xgettext:c-format */
2575
0
    _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
2576
0
            input_bfd, r_type);
2577
0
    bfd_set_error (bfd_error_bad_value);
2578
0
    ok = false;
2579
0
    continue;
2580
0
  }
2581
2582
0
      r = _bfd_final_link_relocate (howto, input_bfd, input_section,
2583
0
            contents, rel->r_offset,
2584
0
            relocation, rel->r_addend);
2585
2586
0
    done_reloc:
2587
0
      if (r == bfd_reloc_ok
2588
0
    && howto->complain_on_overflow == complain_overflow_bitfield)
2589
0
  {
2590
    /* Generic overflow handling accepts cases the ABI says
2591
       should be rejected for R_C6000_ABS16 and
2592
       R_C6000_ABS8.  */
2593
0
    bfd_vma value = (relocation + rel->r_addend) & 0xffffffff;
2594
0
    bfd_vma sbit = 1 << (howto->bitsize - 1);
2595
0
    bfd_vma sbits = (-(bfd_vma) sbit) & 0xffffffff;
2596
0
    bfd_vma value_sbits = value & sbits;
2597
2598
0
    if (value_sbits != 0
2599
0
        && value_sbits != sbit
2600
0
        && value_sbits != sbits)
2601
0
      r = bfd_reloc_overflow;
2602
0
  }
2603
2604
0
      if (r != bfd_reloc_ok)
2605
0
  {
2606
0
    const char *name;
2607
0
    const char *error_message;
2608
2609
0
    if (h != NULL)
2610
0
      name = h->root.root.string;
2611
0
    else
2612
0
      {
2613
0
        name = bfd_elf_string_from_elf_section (input_bfd,
2614
0
                  symtab_hdr->sh_link,
2615
0
                  sym->st_name);
2616
0
        if (name == NULL)
2617
0
    return false;
2618
0
        if (*name == '\0')
2619
0
    name = bfd_section_name (sec);
2620
0
      }
2621
2622
0
    switch (r)
2623
0
      {
2624
0
      case bfd_reloc_overflow:
2625
        /* If the overflowing reloc was to an undefined symbol,
2626
     we have already printed one error message and there
2627
     is no point complaining again.  */
2628
0
        if (!h || h->root.type != bfd_link_hash_undefined)
2629
0
    (*info->callbacks->reloc_overflow)
2630
0
      (info, (h ? &h->root : NULL), name, howto->name,
2631
0
       (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
2632
0
        break;
2633
2634
0
      case bfd_reloc_undefined:
2635
0
        (*info->callbacks->undefined_symbol) (info, name, input_bfd,
2636
0
                input_section,
2637
0
                rel->r_offset, true);
2638
0
        break;
2639
2640
0
      case bfd_reloc_outofrange:
2641
0
        error_message = _("out of range");
2642
0
        goto common_error;
2643
2644
0
      case bfd_reloc_notsupported:
2645
0
        error_message = _("unsupported relocation");
2646
0
        goto common_error;
2647
2648
0
      case bfd_reloc_dangerous:
2649
0
        error_message = _("dangerous relocation");
2650
0
        goto common_error;
2651
2652
0
      default:
2653
0
        error_message = _("unknown error");
2654
        /* Fall through.  */
2655
2656
0
      common_error:
2657
0
        BFD_ASSERT (error_message != NULL);
2658
0
        (*info->callbacks->reloc_dangerous)
2659
0
    (info, error_message, input_bfd, input_section, rel->r_offset);
2660
0
        break;
2661
0
      }
2662
0
  }
2663
0
    }
2664
2665
0
  return ok;
2666
0
}
2667
2668

2669
/* Look through the relocs for a section during the first phase, and
2670
   calculate needed space in the global offset table, procedure linkage
2671
   table, and dynamic reloc sections.  */
2672
2673
static bool
2674
elf32_tic6x_check_relocs (bfd *abfd, struct bfd_link_info *info,
2675
        asection *sec, const Elf_Internal_Rela *relocs)
2676
0
{
2677
0
  struct elf32_tic6x_link_hash_table *htab;
2678
0
  Elf_Internal_Shdr *symtab_hdr;
2679
0
  struct elf_link_hash_entry **sym_hashes;
2680
0
  const Elf_Internal_Rela *rel;
2681
0
  const Elf_Internal_Rela *rel_end;
2682
0
  asection *sreloc;
2683
2684
0
  if (bfd_link_relocatable (info))
2685
0
    return true;
2686
2687
0
  htab = elf32_tic6x_hash_table (info);
2688
0
  symtab_hdr = &elf_symtab_hdr (abfd);
2689
0
  sym_hashes = elf_sym_hashes (abfd);
2690
2691
  /* Create dynamic sections for relocatable executables so that we can
2692
     copy relocations.  */
2693
0
  if ((bfd_link_pic (info) || elf32_tic6x_using_dsbt (abfd))
2694
0
      && ! htab->elf.dynamic_sections_created)
2695
0
    {
2696
0
      if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
2697
0
  return false;
2698
0
    }
2699
2700
0
  sreloc = NULL;
2701
2702
0
  rel_end = relocs + sec->reloc_count;
2703
0
  for (rel = relocs; rel < rel_end; rel++)
2704
0
    {
2705
0
      unsigned int r_type;
2706
0
      unsigned int r_symndx;
2707
0
      struct elf_link_hash_entry *h;
2708
0
      Elf_Internal_Sym *isym;
2709
2710
0
      r_symndx = ELF32_R_SYM (rel->r_info);
2711
0
      r_type = ELF32_R_TYPE (rel->r_info);
2712
2713
0
      if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
2714
0
  {
2715
    /* xgettext:c-format */
2716
0
    _bfd_error_handler (_("%pB: bad symbol index: %d"),
2717
0
            abfd, r_symndx);
2718
0
    return false;
2719
0
  }
2720
2721
0
      if (r_symndx < symtab_hdr->sh_info)
2722
0
  {
2723
    /* A local symbol.  */
2724
0
    isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache,
2725
0
          abfd, r_symndx);
2726
0
    if (isym == NULL)
2727
0
      return false;
2728
0
    h = NULL;
2729
0
  }
2730
0
      else
2731
0
  {
2732
0
    isym = NULL;
2733
0
    h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2734
0
    while (h->root.type == bfd_link_hash_indirect
2735
0
     || h->root.type == bfd_link_hash_warning)
2736
0
      h = (struct elf_link_hash_entry *) h->root.u.i.link;
2737
0
  }
2738
2739
0
      switch (r_type)
2740
0
  {
2741
0
  case R_C6000_PCR_S21:
2742
0
  case R_C6000_PREL31:
2743
    /* This symbol requires a procedure linkage table entry.  We
2744
       actually build the entry in adjust_dynamic_symbol,
2745
       because this might be a case of linking PIC code which is
2746
       never referenced by a dynamic object, in which case we
2747
       don't need to generate a procedure linkage table entry
2748
       after all.  */
2749
2750
    /* If this is a local symbol, we resolve it directly without
2751
       creating a procedure linkage table entry.  */
2752
0
    if (h == NULL)
2753
0
      continue;
2754
2755
0
    h->needs_plt = 1;
2756
0
    h->plt.refcount += 1;
2757
0
    break;
2758
2759
0
  case R_C6000_SBR_GOT_U15_W:
2760
0
  case R_C6000_SBR_GOT_L16_W:
2761
0
  case R_C6000_SBR_GOT_H16_W:
2762
0
  case R_C6000_EHTYPE:
2763
    /* This symbol requires a global offset table entry.  */
2764
0
    if (h != NULL)
2765
0
      {
2766
0
        h->got.refcount += 1;
2767
0
      }
2768
0
    else
2769
0
      {
2770
0
        bfd_signed_vma *local_got_refcounts;
2771
2772
        /* This is a global offset table entry for a local symbol.  */
2773
0
        local_got_refcounts = elf_local_got_refcounts (abfd);
2774
0
        if (local_got_refcounts == NULL)
2775
0
    {
2776
0
      bfd_size_type size;
2777
2778
0
      size = symtab_hdr->sh_info;
2779
0
      size *= (sizeof (bfd_signed_vma)
2780
0
         + sizeof (bfd_vma) + sizeof(char));
2781
0
      local_got_refcounts = bfd_zalloc (abfd, size);
2782
0
      if (local_got_refcounts == NULL)
2783
0
        return false;
2784
0
      elf_local_got_refcounts (abfd) = local_got_refcounts;
2785
0
    }
2786
0
        local_got_refcounts[r_symndx] += 1;
2787
0
      }
2788
2789
0
    if (htab->elf.sgot == NULL)
2790
0
      {
2791
0
        if (htab->elf.dynobj == NULL)
2792
0
    htab->elf.dynobj = abfd;
2793
0
        if (!_bfd_elf_create_got_section (htab->elf.dynobj, info))
2794
0
    return false;
2795
0
      }
2796
0
    break;
2797
2798
0
  case R_C6000_DSBT_INDEX:
2799
    /* We'd like to check for nonzero dsbt_index here, but it's
2800
       set up only after check_relocs is called.  Instead, we
2801
       store the number of R_C6000_DSBT_INDEX relocs in the
2802
       pc_count field, and potentially discard the extra space
2803
       in elf32_tic6x_allocate_dynrelocs.  */
2804
0
    if (!bfd_link_pic (info))
2805
0
      break;
2806
2807
    /* fall through */
2808
0
  case R_C6000_ABS32:
2809
0
  case R_C6000_ABS16:
2810
0
  case R_C6000_ABS8:
2811
0
  case R_C6000_ABS_S16:
2812
0
  case R_C6000_ABS_L16:
2813
0
  case R_C6000_ABS_H16:
2814
    /* If we are creating a shared library, and this is a reloc
2815
       against a global symbol, or a non PC relative reloc
2816
       against a local symbol, then we need to copy the reloc
2817
       into the shared library.  However, if we are linking with
2818
       -Bsymbolic, we do not need to copy a reloc against a
2819
       global symbol which is defined in an object we are
2820
       including in the link (i.e., DEF_REGULAR is set).  At
2821
       this point we have not seen all the input files, so it is
2822
       possible that DEF_REGULAR is not set now but will be set
2823
       later (it is never cleared).  In case of a weak definition,
2824
       DEF_REGULAR may be cleared later by a strong definition in
2825
       a shared library.  We account for that possibility below by
2826
       storing information in the relocs_copied field of the hash
2827
       table entry.  A similar situation occurs when creating
2828
       shared libraries and symbol visibility changes render the
2829
       symbol local.
2830
2831
       If on the other hand, we are creating an executable, we
2832
       may need to keep relocations for symbols satisfied by a
2833
       dynamic library if we manage to avoid copy relocs for the
2834
       symbol.  */
2835
0
    if ((bfd_link_pic (info) || elf32_tic6x_using_dsbt (abfd))
2836
0
        && (sec->flags & SEC_ALLOC) != 0)
2837
0
      {
2838
0
        struct elf_dyn_relocs *p;
2839
0
        struct elf_dyn_relocs **head;
2840
2841
        /* We must copy these reloc types into the output file.
2842
     Create a reloc section in dynobj and make room for
2843
     this reloc.  */
2844
0
        if (sreloc == NULL)
2845
0
    {
2846
0
      if (htab->elf.dynobj == NULL)
2847
0
        htab->elf.dynobj = abfd;
2848
2849
0
      sreloc = _bfd_elf_make_dynamic_reloc_section
2850
0
        (sec, htab->elf.dynobj, 2, abfd, /*rela? */ true);
2851
2852
0
      if (sreloc == NULL)
2853
0
        return false;
2854
0
    }
2855
2856
        /* If this is a global symbol, we count the number of
2857
     relocations we need for this symbol.  */
2858
0
        if (h != NULL)
2859
0
    {
2860
0
      head = &h->dyn_relocs;
2861
0
    }
2862
0
        else
2863
0
    {
2864
      /* Track dynamic relocs needed for local syms too.
2865
         We really need local syms available to do this
2866
         easily.  Oh well.  */
2867
0
      void **vpp;
2868
0
      asection *s;
2869
2870
0
      s = bfd_section_from_elf_index (abfd, isym->st_shndx);
2871
0
      if (s == NULL)
2872
0
        s = sec;
2873
2874
0
      vpp = &elf_section_data (s)->local_dynrel;
2875
0
      head = (struct elf_dyn_relocs **)vpp;
2876
0
    }
2877
2878
0
        p = *head;
2879
0
        if (p == NULL || p->sec != sec)
2880
0
    {
2881
0
      size_t amt = sizeof *p;
2882
0
      p = bfd_alloc (htab->elf.dynobj, amt);
2883
0
      if (p == NULL)
2884
0
        return false;
2885
0
      p->next = *head;
2886
0
      *head = p;
2887
0
      p->sec = sec;
2888
0
      p->count = 0;
2889
0
      p->pc_count = 0;
2890
0
    }
2891
2892
0
        p->count += 1;
2893
0
        if (r_type == R_C6000_DSBT_INDEX)
2894
0
    p->pc_count += 1;
2895
0
      }
2896
0
    break;
2897
2898
0
  case R_C6000_SBR_U15_B:
2899
0
  case R_C6000_SBR_U15_H:
2900
0
  case R_C6000_SBR_U15_W:
2901
0
  case R_C6000_SBR_S16:
2902
0
  case R_C6000_SBR_L16_B:
2903
0
  case R_C6000_SBR_L16_H:
2904
0
  case R_C6000_SBR_L16_W:
2905
0
  case R_C6000_SBR_H16_B:
2906
0
  case R_C6000_SBR_H16_H:
2907
0
  case R_C6000_SBR_H16_W:
2908
0
    {
2909
      /* These relocations implicitly reference __c6xabi_DSBT_BASE.
2910
         Add an explicit reference so that the symbol will be
2911
         provided by a linker script.  */
2912
0
      struct bfd_link_hash_entry *bh = NULL;
2913
0
      if (!_bfd_generic_link_add_one_symbol (info, abfd,
2914
0
               "__c6xabi_DSBT_BASE",
2915
0
               BSF_GLOBAL,
2916
0
               bfd_und_section_ptr, 0,
2917
0
               NULL, false, false, &bh))
2918
0
        return false;
2919
0
      ((struct elf_link_hash_entry *) bh)->non_elf = 0;
2920
0
    }
2921
0
    if (h != NULL && bfd_link_executable (info))
2922
0
      {
2923
        /* For B14-relative addresses, we might need a copy
2924
     reloc.  */
2925
0
        h->non_got_ref = 1;
2926
0
      }
2927
0
    break;
2928
2929
0
  default:
2930
0
    break;
2931
0
  }
2932
0
    }
2933
2934
0
  return true;
2935
0
}
2936
2937
static bool
2938
elf32_tic6x_add_symbol_hook (bfd *abfd,
2939
           struct bfd_link_info *info ATTRIBUTE_UNUSED,
2940
           Elf_Internal_Sym *sym,
2941
           const char **namep ATTRIBUTE_UNUSED,
2942
           flagword *flagsp ATTRIBUTE_UNUSED,
2943
           asection **secp,
2944
           bfd_vma *valp)
2945
0
{
2946
0
  switch (sym->st_shndx)
2947
0
    {
2948
0
    case SHN_TIC6X_SCOMMON:
2949
0
      *secp = bfd_make_section_old_way (abfd, ".scommon");
2950
0
      (*secp)->flags |= SEC_IS_COMMON | SEC_SMALL_DATA;
2951
0
      *valp = sym->st_size;
2952
0
      bfd_set_section_alignment (*secp, bfd_log2 (sym->st_value));
2953
0
      break;
2954
0
    }
2955
2956
0
  return true;
2957
0
}
2958
2959
static void
2960
elf32_tic6x_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, asymbol *asym)
2961
0
{
2962
0
  elf_symbol_type *elfsym;
2963
2964
0
  elfsym = (elf_symbol_type *) asym;
2965
0
  switch (elfsym->internal_elf_sym.st_shndx)
2966
0
    {
2967
0
    case SHN_TIC6X_SCOMMON:
2968
0
      asym->section = &tic6x_elf_scom_section;
2969
0
      asym->value = elfsym->internal_elf_sym.st_size;
2970
0
      break;
2971
0
    }
2972
0
}
2973
2974
static int
2975
elf32_tic6x_link_output_symbol_hook (struct bfd_link_info *info ATTRIBUTE_UNUSED,
2976
             const char *name ATTRIBUTE_UNUSED,
2977
             Elf_Internal_Sym *sym,
2978
             asection *input_sec,
2979
             struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
2980
0
{
2981
  /* If we see a common symbol, which implies a relocatable link, then
2982
     if a symbol was small common in an input file, mark it as small
2983
     common in the output file.  */
2984
0
  if (sym->st_shndx == SHN_COMMON && strcmp (input_sec->name, ".scommon") == 0)
2985
0
    sym->st_shndx = SHN_TIC6X_SCOMMON;
2986
2987
0
  return 1;
2988
0
}
2989
2990
static bool
2991
elf32_tic6x_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
2992
              asection *sec,
2993
              int *retval)
2994
0
{
2995
0
  if (strcmp (bfd_section_name (sec), ".scommon") == 0)
2996
0
    {
2997
0
      *retval = SHN_TIC6X_SCOMMON;
2998
0
      return true;
2999
0
    }
3000
3001
0
  return false;
3002
0
}
3003
3004
/* Allocate space in .plt, .got and associated reloc sections for
3005
   dynamic relocs.  */
3006
3007
static bool
3008
elf32_tic6x_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
3009
0
{
3010
0
  struct bfd_link_info *info;
3011
0
  struct elf32_tic6x_link_hash_table *htab;
3012
0
  struct elf_dyn_relocs *p;
3013
3014
0
  if (h->root.type == bfd_link_hash_indirect)
3015
0
    return true;
3016
3017
0
  info = (struct bfd_link_info *) inf;
3018
0
  htab = elf32_tic6x_hash_table (info);
3019
3020
0
  if (htab->elf.dynamic_sections_created && h->plt.refcount > 0)
3021
0
    {
3022
      /* Make sure this symbol is output as a dynamic symbol.
3023
   Undefined weak syms won't yet be marked as dynamic.  */
3024
0
      if (h->dynindx == -1 && !h->forced_local)
3025
0
  {
3026
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
3027
0
      return false;
3028
0
  }
3029
3030
0
      if (bfd_link_pic (info)
3031
0
    || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
3032
0
  {
3033
0
    asection *s = htab->elf.splt;
3034
3035
    /* If this is the first .plt entry, make room for the special
3036
       first entry.  */
3037
0
    if (s->size == 0)
3038
0
      s->size += PLT_ENTRY_SIZE;
3039
3040
0
    h->plt.offset = s->size;
3041
3042
    /* If this symbol is not defined in a regular file, and we are
3043
       not generating a shared library, then set the symbol to this
3044
       location in the .plt.  This is required to make function
3045
       pointers compare as equal between the normal executable and
3046
       the shared library.  */
3047
0
    if (! bfd_link_pic (info) && !h->def_regular)
3048
0
      {
3049
0
        h->root.u.def.section = s;
3050
0
        h->root.u.def.value = h->plt.offset;
3051
0
      }
3052
3053
    /* Make room for this entry.  */
3054
0
    s->size += PLT_ENTRY_SIZE;
3055
    /* We also need to make an entry in the .got.plt section, which
3056
       will be placed in the .got section by the linker script.  */
3057
0
    htab->elf.sgotplt->size += 4;
3058
    /* We also need to make an entry in the .rel.plt section.  */
3059
0
    htab->elf.srelplt->size += sizeof (Elf32_External_Rela);
3060
0
  }
3061
0
      else
3062
0
  {
3063
0
    h->plt.offset = (bfd_vma) -1;
3064
0
    h->needs_plt = 0;
3065
0
  }
3066
0
    }
3067
0
  else
3068
0
    {
3069
0
      h->plt.offset = (bfd_vma) -1;
3070
0
      h->needs_plt = 0;
3071
0
    }
3072
3073
0
  if (h->got.refcount > 0)
3074
0
    {
3075
0
      asection *s;
3076
3077
      /* Make sure this symbol is output as a dynamic symbol.
3078
   Undefined weak syms won't yet be marked as dynamic.  */
3079
0
      if (h->dynindx == -1
3080
0
    && !h->forced_local)
3081
0
  {
3082
0
    if (! bfd_elf_link_record_dynamic_symbol (info, h))
3083
0
      return false;
3084
0
  }
3085
3086
0
      s = htab->elf.sgot;
3087
0
      h->got.offset = s->size;
3088
0
      s->size += 4;
3089
3090
0
      if (!(ELF_ST_VISIBILITY (h->other)
3091
0
      && h->root.type == bfd_link_hash_undefweak))
3092
0
  htab->elf.srelgot->size += sizeof (Elf32_External_Rela);
3093
0
    }
3094
0
  else
3095
0
    h->got.offset = (bfd_vma) -1;
3096
3097
0
  if (h->dyn_relocs == NULL)
3098
0
    return true;
3099
3100
  /* Discard relocs on undefined weak syms with non-default
3101
     visibility.  */
3102
0
  if (bfd_link_pic (info) || elf32_tic6x_using_dsbt (htab->obfd))
3103
0
    {
3104
      /* We use the pc_count field to hold the number of
3105
   R_C6000_DSBT_INDEX relocs.  */
3106
0
      if (htab->params.dsbt_index != 0)
3107
0
  {
3108
0
    struct elf_dyn_relocs **pp;
3109
3110
0
    for (pp = &h->dyn_relocs; (p = *pp) != NULL; )
3111
0
      {
3112
0
        p->count -= p->pc_count;
3113
0
        p->pc_count = 0;
3114
0
        if (p->count == 0)
3115
0
    *pp = p->next;
3116
0
        else
3117
0
    pp = &p->next;
3118
0
      }
3119
0
  }
3120
3121
0
      if (h->dyn_relocs != NULL
3122
0
    && h->root.type == bfd_link_hash_undefweak)
3123
0
  {
3124
0
    if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
3125
0
      h->dyn_relocs = NULL;
3126
3127
    /* Make sure undefined weak symbols are output as a dynamic
3128
       symbol in PIEs.  */
3129
0
    else if (h->dynindx == -1
3130
0
       && !h->forced_local)
3131
0
      {
3132
0
        if (! bfd_elf_link_record_dynamic_symbol (info, h))
3133
0
    return false;
3134
0
      }
3135
0
  }
3136
0
    }
3137
3138
  /* Finally, allocate space.  */
3139
0
  for (p = h->dyn_relocs; p != NULL; p = p->next)
3140
0
    {
3141
0
      asection *sreloc;
3142
3143
0
      sreloc = elf_section_data (p->sec)->sreloc;
3144
3145
0
      BFD_ASSERT (sreloc != NULL);
3146
0
      sreloc->size += p->count * sizeof (Elf32_External_Rela);
3147
0
    }
3148
3149
0
  return true;
3150
0
}
3151
3152
/* Set the sizes of the dynamic sections.  */
3153
3154
static bool
3155
elf32_tic6x_late_size_sections (bfd *output_bfd, struct bfd_link_info *info)
3156
0
{
3157
0
  struct elf32_tic6x_link_hash_table *htab;
3158
0
  bfd *dynobj;
3159
0
  asection *s;
3160
0
  bool relocs;
3161
0
  bfd *ibfd;
3162
3163
0
  htab = elf32_tic6x_hash_table (info);
3164
0
  dynobj = htab->elf.dynobj;
3165
0
  if (dynobj == NULL)
3166
0
    return true;
3167
3168
0
  if (htab->elf.dynamic_sections_created)
3169
0
    {
3170
      /* Set the contents of the .interp section to the interpreter.  */
3171
0
      if (bfd_link_executable (info) && !info->nointerp)
3172
0
  {
3173
0
    s = bfd_get_linker_section (dynobj, ".interp");
3174
0
    if (s == NULL)
3175
0
      abort ();
3176
0
    s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3177
0
    s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3178
0
    s->alloced = 1;
3179
0
  }
3180
0
    }
3181
3182
  /* Set up .got offsets for local syms, and space for local dynamic
3183
     relocs.  */
3184
0
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
3185
0
    {
3186
0
      bfd_signed_vma *local_got;
3187
0
      bfd_signed_vma *end_local_got;
3188
0
      bfd_size_type locsymcount;
3189
0
      Elf_Internal_Shdr *symtab_hdr;
3190
0
      asection *srel;
3191
3192
0
      for (s = ibfd->sections; s != NULL; s = s->next)
3193
0
  {
3194
0
    struct elf_dyn_relocs *p;
3195
3196
0
    for (p = ((struct elf_dyn_relocs *)
3197
0
         elf_section_data (s)->local_dynrel);
3198
0
         p != NULL;
3199
0
         p = p->next)
3200
0
      {
3201
0
        if (!bfd_is_abs_section (p->sec)
3202
0
      && bfd_is_abs_section (p->sec->output_section))
3203
0
    {
3204
      /* Input section has been discarded, either because
3205
         it is a copy of a linkonce section or due to
3206
         linker script /DISCARD/, so we'll be discarding
3207
         the relocs too.  */
3208
0
    }
3209
0
        else if (p->count != 0)
3210
0
    {
3211
0
      srel = elf_section_data (p->sec)->sreloc;
3212
0
      srel->size += p->count * sizeof (Elf32_External_Rela);
3213
0
      if ((p->sec->output_section->flags & SEC_READONLY) != 0)
3214
0
        info->flags |= DF_TEXTREL;
3215
0
    }
3216
0
      }
3217
0
  }
3218
3219
0
      local_got = elf_local_got_refcounts (ibfd);
3220
0
      if (!local_got)
3221
0
  continue;
3222
3223
0
      symtab_hdr = &elf_symtab_hdr (ibfd);
3224
0
      locsymcount = symtab_hdr->sh_info;
3225
0
      end_local_got = local_got + locsymcount;
3226
0
      s = htab->elf.sgot;
3227
0
      srel = htab->elf.srelgot;
3228
0
      for (; local_got < end_local_got; ++local_got)
3229
0
  {
3230
0
    if (*local_got > 0)
3231
0
      {
3232
0
        *local_got = s->size;
3233
0
        s->size += 4;
3234
3235
0
        if (bfd_link_pic (info) || elf32_tic6x_using_dsbt (output_bfd))
3236
0
    {
3237
0
      srel->size += sizeof (Elf32_External_Rela);
3238
0
    }
3239
0
      }
3240
0
    else
3241
0
      *local_got = (bfd_vma) -1;
3242
0
  }
3243
0
    }
3244
3245
  /* Allocate global sym .plt and .got entries, and space for global
3246
     sym dynamic relocs.  */
3247
0
  elf_link_hash_traverse (&htab->elf, elf32_tic6x_allocate_dynrelocs, info);
3248
3249
  /* We now have determined the sizes of the various dynamic sections.
3250
     Allocate memory for them.  */
3251
0
  relocs = false;
3252
0
  for (s = dynobj->sections; s != NULL; s = s->next)
3253
0
    {
3254
0
      bool strip_section = true;
3255
3256
0
      if ((s->flags & SEC_LINKER_CREATED) == 0)
3257
0
  continue;
3258
3259
0
      if (s == htab->dsbt)
3260
0
  s->size = 4 * htab->params.dsbt_size;
3261
0
      else if (s == htab->elf.splt
3262
0
         || s == htab->elf.sgot
3263
0
         || s == htab->elf.sgotplt
3264
0
         || s == htab->elf.sdynbss
3265
0
         || s == htab->elf.sdynrelro)
3266
0
  {
3267
    /* Strip this section if we don't need it; see the
3268
       comment below.  */
3269
    /* We'd like to strip these sections if they aren't needed, but if
3270
       we've exported dynamic symbols from them we must leave them.
3271
       It's too late to tell BFD to get rid of the symbols.  */
3272
3273
0
    if (htab->elf.hplt != NULL)
3274
0
      strip_section = false;
3275
3276
    /* Round up the size of the PLT section to a multiple of 32.  */
3277
0
    if (s == htab->elf.splt && s->size > 0)
3278
0
      s->size = (s->size + 31) & ~(bfd_vma)31;
3279
0
  }
3280
0
      else if (startswith (bfd_section_name (s), ".rela"))
3281
0
  {
3282
0
    if (s->size != 0
3283
0
        && s != htab->elf.srelplt)
3284
0
      relocs = true;
3285
3286
    /* We use the reloc_count field as a counter if we need
3287
       to copy relocs into the output file.  */
3288
0
    s->reloc_count = 0;
3289
0
  }
3290
0
      else
3291
0
  {
3292
    /* It's not one of our sections, so don't allocate space.  */
3293
0
    continue;
3294
0
  }
3295
3296
0
      if (s->size == 0)
3297
0
  {
3298
    /* If we don't need this section, strip it from the
3299
       output file.  This is mostly to handle .rel.bss and
3300
       .rel.plt.  We must create both sections in
3301
       create_dynamic_sections, because they must be created
3302
       before the linker maps input sections to output
3303
       sections.  The linker does that before
3304
       adjust_dynamic_symbol is called, and it is that
3305
       function which decides whether anything needs to go
3306
       into these sections.  */
3307
0
    if (strip_section)
3308
0
      s->flags |= SEC_EXCLUDE;
3309
0
    continue;
3310
0
  }
3311
3312
0
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
3313
0
  continue;
3314
3315
      /* Allocate memory for the section contents.  We use bfd_zalloc
3316
   here in case unused entries are not reclaimed before the
3317
   section's contents are written out.  This should not happen,
3318
   but this way if it does, we get a R_C6000_NONE reloc instead
3319
   of garbage.  */
3320
0
      s->contents = bfd_zalloc (dynobj, s->size);
3321
0
      if (s->contents == NULL)
3322
0
  return false;
3323
0
      s->alloced = 1;
3324
0
    }
3325
3326
0
  if (htab->elf.dynamic_sections_created)
3327
0
    {
3328
      /* Add some entries to the .dynamic section.  We fill in the
3329
   values later, in elf32_tic6x_finish_dynamic_sections, but we
3330
   must add the entries now so that we get the correct size for
3331
   the .dynamic section.  The DT_DEBUG entry is filled in by the
3332
   dynamic linker and used by the debugger.  */
3333
0
#define add_dynamic_entry(TAG, VAL) \
3334
0
  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3335
3336
0
      if (!_bfd_elf_add_dynamic_tags (output_bfd, info, relocs))
3337
0
  return false;
3338
3339
0
      if (!add_dynamic_entry (DT_C6000_DSBT_BASE, 0)
3340
0
    || !add_dynamic_entry (DT_C6000_DSBT_SIZE, htab->params.dsbt_size)
3341
0
    || !add_dynamic_entry (DT_C6000_DSBT_INDEX,
3342
0
         htab->params.dsbt_index))
3343
0
  return false;
3344
3345
0
    }
3346
0
#undef add_dynamic_entry
3347
3348
0
  return true;
3349
0
}
3350
3351
/* This function is called after all the input files have been read,
3352
   and the input sections have been assigned to output sections.  */
3353
3354
static bool
3355
elf32_tic6x_early_size_sections (bfd *output_bfd, struct bfd_link_info *info)
3356
0
{
3357
0
  if (elf32_tic6x_using_dsbt (output_bfd) && !bfd_link_relocatable (info)
3358
0
      && !bfd_elf_stack_segment_size (output_bfd, info,
3359
0
              "__stacksize", DEFAULT_STACK_SIZE))
3360
0
    return false;
3361
3362
0
  return true;
3363
0
}
3364
3365
static bool
3366
elf32_tic6x_finish_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
3367
             struct bfd_link_info *info)
3368
0
{
3369
0
  struct elf32_tic6x_link_hash_table *htab;
3370
0
  bfd *dynobj;
3371
0
  asection *sdyn;
3372
3373
0
  htab = elf32_tic6x_hash_table (info);
3374
0
  dynobj = htab->elf.dynobj;
3375
0
  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
3376
3377
0
  if (elf_hash_table (info)->dynamic_sections_created)
3378
0
    {
3379
0
      Elf32_External_Dyn * dyncon;
3380
0
      Elf32_External_Dyn * dynconend;
3381
3382
0
      BFD_ASSERT (sdyn != NULL);
3383
3384
0
      dyncon = (Elf32_External_Dyn *) sdyn->contents;
3385
0
      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
3386
3387
0
      for (; dyncon < dynconend; dyncon++)
3388
0
  {
3389
0
    Elf_Internal_Dyn dyn;
3390
0
    asection *s;
3391
3392
0
    bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3393
3394
0
    switch (dyn.d_tag)
3395
0
      {
3396
0
      default:
3397
0
        break;
3398
3399
0
      case DT_C6000_DSBT_BASE:
3400
0
        s = htab->dsbt;
3401
0
        dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset);
3402
0
        break;
3403
3404
0
      case DT_PLTGOT:
3405
0
        s = htab->elf.sgotplt;
3406
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
3407
0
        break;
3408
3409
0
      case DT_JMPREL:
3410
0
        s = htab->elf.srelplt;
3411
0
        dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
3412
0
        break;
3413
3414
0
      case DT_PLTRELSZ:
3415
0
        s = htab->elf.srelplt;
3416
0
        dyn.d_un.d_val = s->size;
3417
0
        break;
3418
0
      }
3419
0
    bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3420
0
  }
3421
3422
      /* Fill in the first entry in the procedure linkage table.  */
3423
0
      if (htab->elf.splt && htab->elf.splt->size > 0)
3424
0
  {
3425
0
    bfd_vma got_offs = (htab->elf.sgotplt->output_section->vma
3426
0
            + htab->elf.sgotplt->output_offset
3427
0
            - htab->dsbt->output_section->vma
3428
0
            - htab->dsbt->output_offset) / 4;
3429
3430
    /* ldw .D2T2 *+b14[$GOT(0)],b2 */
3431
0
    bfd_put_32 (output_bfd, got_offs << 8 | 0x0100006e,
3432
0
          htab->elf.splt->contents);
3433
    /* ldw .D2T2 *+b14[$GOT(4)],b1 */
3434
0
    bfd_put_32 (output_bfd, (got_offs + 1) << 8 | 0x0080006e,
3435
0
          htab->elf.splt->contents + 4);
3436
    /* nop 3 */
3437
0
    bfd_put_32 (output_bfd, 0x00004000,
3438
0
          htab->elf.splt->contents + 8);
3439
    /* b .s2 b2 */
3440
0
    bfd_put_32 (output_bfd, 0x00080362,
3441
0
          htab->elf.splt->contents + 12);
3442
    /* nop 5 */
3443
0
    bfd_put_32 (output_bfd, 0x00008000,
3444
0
          htab->elf.splt->contents + 16);
3445
3446
0
    elf_section_data (htab->elf.splt->output_section)
3447
0
      ->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
3448
0
  }
3449
0
    }
3450
3451
0
  return true;
3452
0
}
3453
3454
/* Return address for Ith PLT stub in section PLT, for relocation REL
3455
   or (bfd_vma) -1 if it should not be included.  */
3456
3457
static bfd_vma
3458
elf32_tic6x_plt_sym_val (bfd_vma i, const asection *plt,
3459
       const arelent *rel ATTRIBUTE_UNUSED)
3460
0
{
3461
0
  return plt->vma + (i + 1) * PLT_ENTRY_SIZE;
3462
0
}
3463
3464
static int
3465
elf32_tic6x_obj_attrs_arg_type (int tag)
3466
0
{
3467
0
  if (tag == Tag_ABI_compatibility)
3468
0
    return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL;
3469
0
  else if (tag & 1)
3470
0
    return ATTR_TYPE_FLAG_STR_VAL;
3471
0
  else
3472
0
    return ATTR_TYPE_FLAG_INT_VAL;
3473
0
}
3474
3475
static int
3476
elf32_tic6x_obj_attrs_order (int num)
3477
0
{
3478
0
  if (num == LEAST_KNOWN_OBJ_ATTRIBUTE)
3479
0
    return Tag_ABI_conformance;
3480
0
  if ((num - 1) < Tag_ABI_conformance)
3481
0
    return num - 1;
3482
0
  return num;
3483
0
}
3484
3485
static bool
3486
elf32_tic6x_obj_attrs_handle_unknown (bfd *abfd, int tag)
3487
0
{
3488
0
  if ((tag & 127) < 64)
3489
0
    {
3490
0
      _bfd_error_handler
3491
  /* xgettext:c-format */
3492
0
  (_("%pB: error: unknown mandatory EABI object attribute %d"),
3493
0
   abfd, tag);
3494
0
      bfd_set_error (bfd_error_bad_value);
3495
0
      return false;
3496
0
    }
3497
0
  else
3498
0
    {
3499
0
      _bfd_error_handler
3500
  /* xgettext:c-format */
3501
0
  (_("%pB: warning: unknown EABI object attribute %d"),
3502
0
   abfd, tag);
3503
0
      return true;
3504
0
    }
3505
0
}
3506
3507
/* Merge the Tag_ISA attribute values ARCH1 and ARCH2
3508
   and return the merged value.  At present, all merges succeed, so no
3509
   return value for errors is defined.  */
3510
3511
int
3512
elf32_tic6x_merge_arch_attributes (int arch1, int arch2)
3513
0
{
3514
0
  int min_arch, max_arch;
3515
3516
0
  min_arch = (arch1 < arch2 ? arch1 : arch2);
3517
0
  max_arch = (arch1 > arch2 ? arch1 : arch2);
3518
3519
  /* In most cases, the numerically greatest value is the correct
3520
     merged value, but merging C64 and C67 results in C674X.  */
3521
0
  if ((min_arch == C6XABI_Tag_ISA_C67X
3522
0
       || min_arch == C6XABI_Tag_ISA_C67XP)
3523
0
      && (max_arch == C6XABI_Tag_ISA_C64X
3524
0
    || max_arch == C6XABI_Tag_ISA_C64XP))
3525
0
    return C6XABI_Tag_ISA_C674X;
3526
3527
0
  return max_arch;
3528
0
}
3529
3530
/* Convert a Tag_ABI_array_object_alignment or
3531
   Tag_ABI_array_object_align_expected tag value TAG to a
3532
   corresponding alignment value; return the alignment, or -1 for an
3533
   unknown tag value.  */
3534
3535
static int
3536
elf32_tic6x_tag_to_array_alignment (int tag)
3537
0
{
3538
0
  switch (tag)
3539
0
    {
3540
0
    case 0:
3541
0
      return 8;
3542
3543
0
    case 1:
3544
0
      return 4;
3545
3546
0
    case 2:
3547
0
      return 16;
3548
3549
0
    default:
3550
0
      return -1;
3551
0
    }
3552
0
}
3553
3554
/* Convert a Tag_ABI_array_object_alignment or
3555
   Tag_ABI_array_object_align_expected alignment ALIGN to a
3556
   corresponding tag value; return the tag value.  */
3557
3558
static int
3559
elf32_tic6x_array_alignment_to_tag (int align)
3560
0
{
3561
0
  switch (align)
3562
0
    {
3563
0
    case 8:
3564
0
      return 0;
3565
3566
0
    case 4:
3567
0
      return 1;
3568
3569
0
    case 16:
3570
0
      return 2;
3571
3572
0
    default:
3573
0
      abort ();
3574
0
    }
3575
0
}
3576
3577
/* Merge attributes from IBFD and OBFD, returning TRUE if the merge
3578
   succeeded, FALSE otherwise.  */
3579
3580
static bool
3581
elf32_tic6x_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
3582
0
{
3583
0
  bfd *obfd = info->output_bfd;
3584
0
  bool result = true;
3585
0
  obj_attribute *in_attr;
3586
0
  obj_attribute *out_attr;
3587
0
  int i;
3588
0
  int array_align_in, array_align_out, array_expect_in, array_expect_out;
3589
3590
  /* FIXME: What should be checked when linking shared libraries?  */
3591
0
  if ((ibfd->flags & DYNAMIC) != 0)
3592
0
    return true;
3593
3594
0
  if (!elf_known_obj_attributes_proc (obfd)[0].i)
3595
0
    {
3596
      /* This is the first object.  Copy the attributes.  */
3597
0
      _bfd_elf_copy_obj_attributes (ibfd, obfd);
3598
3599
0
      out_attr = elf_known_obj_attributes_proc (obfd);
3600
3601
      /* Use the Tag_null value to indicate the attributes have been
3602
   initialized.  */
3603
0
      out_attr[0].i = 1;
3604
3605
0
      return true;
3606
0
    }
3607
3608
0
  in_attr = elf_known_obj_attributes_proc (ibfd);
3609
0
  out_attr = elf_known_obj_attributes_proc (obfd);
3610
3611
  /* No specification yet for handling of unknown attributes, so just
3612
     ignore them and handle known ones.  */
3613
3614
0
  if (out_attr[Tag_ABI_stack_align_preserved].i
3615
0
      < in_attr[Tag_ABI_stack_align_needed].i)
3616
0
    {
3617
0
      _bfd_error_handler
3618
  /* xgettext:c-format */
3619
0
  (_("error: %pB requires more stack alignment than %pB preserves"),
3620
0
   ibfd, obfd);
3621
0
      result = false;
3622
0
    }
3623
0
  if (in_attr[Tag_ABI_stack_align_preserved].i
3624
0
      < out_attr[Tag_ABI_stack_align_needed].i)
3625
0
    {
3626
0
      _bfd_error_handler
3627
  /* xgettext:c-format */
3628
0
  (_("error: %pB requires more stack alignment than %pB preserves"),
3629
0
   obfd, ibfd);
3630
0
      result = false;
3631
0
    }
3632
3633
0
  array_align_in = elf32_tic6x_tag_to_array_alignment
3634
0
    (in_attr[Tag_ABI_array_object_alignment].i);
3635
0
  if (array_align_in == -1)
3636
0
    {
3637
0
      _bfd_error_handler
3638
0
  (_("error: unknown Tag_ABI_array_object_alignment value in %pB"),
3639
0
   ibfd);
3640
0
      result = false;
3641
0
    }
3642
0
  array_align_out = elf32_tic6x_tag_to_array_alignment
3643
0
    (out_attr[Tag_ABI_array_object_alignment].i);
3644
0
  if (array_align_out == -1)
3645
0
    {
3646
0
      _bfd_error_handler
3647
0
  (_("error: unknown Tag_ABI_array_object_alignment value in %pB"),
3648
0
   obfd);
3649
0
      result = false;
3650
0
    }
3651
0
  array_expect_in = elf32_tic6x_tag_to_array_alignment
3652
0
    (in_attr[Tag_ABI_array_object_align_expected].i);
3653
0
  if (array_expect_in == -1)
3654
0
    {
3655
0
      _bfd_error_handler
3656
0
  (_("error: unknown Tag_ABI_array_object_align_expected value in %pB"),
3657
0
   ibfd);
3658
0
      result = false;
3659
0
    }
3660
0
  array_expect_out = elf32_tic6x_tag_to_array_alignment
3661
0
    (out_attr[Tag_ABI_array_object_align_expected].i);
3662
0
  if (array_expect_out == -1)
3663
0
    {
3664
0
      _bfd_error_handler
3665
0
  (_("error: unknown Tag_ABI_array_object_align_expected value in %pB"),
3666
0
   obfd);
3667
0
      result = false;
3668
0
    }
3669
3670
0
  if (array_align_out < array_expect_in)
3671
0
    {
3672
0
      _bfd_error_handler
3673
  /* xgettext:c-format */
3674
0
  (_("error: %pB requires more array alignment than %pB preserves"),
3675
0
   ibfd, obfd);
3676
0
      result = false;
3677
0
    }
3678
0
  if (array_align_in < array_expect_out)
3679
0
    {
3680
0
      _bfd_error_handler
3681
  /* xgettext:c-format */
3682
0
  (_("error: %pB requires more array alignment than %pB preserves"),
3683
0
   obfd, ibfd);
3684
0
      result = false;
3685
0
    }
3686
3687
0
  for (i = LEAST_KNOWN_OBJ_ATTRIBUTE; i < NUM_KNOWN_OBJ_ATTRIBUTES; i++)
3688
0
    {
3689
0
      switch (i)
3690
0
  {
3691
0
  case Tag_ISA:
3692
0
    out_attr[i].i = elf32_tic6x_merge_arch_attributes (in_attr[i].i,
3693
0
                   out_attr[i].i);
3694
0
    break;
3695
3696
0
  case Tag_ABI_wchar_t:
3697
0
    if (out_attr[i].i == 0)
3698
0
      out_attr[i].i = in_attr[i].i;
3699
0
    if (out_attr[i].i != 0
3700
0
        && in_attr[i].i != 0
3701
0
        && out_attr[i].i != in_attr[i].i)
3702
0
      {
3703
0
        _bfd_error_handler
3704
    /* xgettext:c-format */
3705
0
    (_("warning: %pB and %pB differ in wchar_t size"), obfd, ibfd);
3706
0
      }
3707
0
    break;
3708
3709
0
  case Tag_ABI_stack_align_needed:
3710
0
    if (out_attr[i].i < in_attr[i].i)
3711
0
      out_attr[i].i = in_attr[i].i;
3712
0
    break;
3713
3714
0
  case Tag_ABI_stack_align_preserved:
3715
0
    if (out_attr[i].i > in_attr[i].i)
3716
0
      out_attr[i].i = in_attr[i].i;
3717
0
    break;
3718
3719
0
  case Tag_ABI_DSBT:
3720
0
    if (out_attr[i].i != in_attr[i].i)
3721
0
      {
3722
0
        _bfd_error_handler
3723
    /* xgettext:c-format */
3724
0
    (_("warning: %pB and %pB differ in whether code is "
3725
0
       "compiled for DSBT"),
3726
0
     obfd, ibfd);
3727
0
      }
3728
0
    break;
3729
3730
0
  case Tag_ABI_PIC:
3731
0
  case Tag_ABI_PID:
3732
    /* Don't transfer these tags from dynamic objects.  */
3733
0
    if ((ibfd->flags & DYNAMIC) != 0)
3734
0
      continue;
3735
0
    if (out_attr[i].i > in_attr[i].i)
3736
0
      out_attr[i].i = in_attr[i].i;
3737
0
    break;
3738
3739
0
  case Tag_ABI_array_object_alignment:
3740
0
    if (array_align_out != -1
3741
0
        && array_align_in != -1
3742
0
        && array_align_out > array_align_in)
3743
0
      out_attr[i].i
3744
0
        = elf32_tic6x_array_alignment_to_tag (array_align_in);
3745
0
    break;
3746
3747
0
  case Tag_ABI_array_object_align_expected:
3748
0
    if (array_expect_out != -1
3749
0
        && array_expect_in != -1
3750
0
        && array_expect_out < array_expect_in)
3751
0
      out_attr[i].i
3752
0
        = elf32_tic6x_array_alignment_to_tag (array_expect_in);
3753
0
    break;
3754
3755
0
  case Tag_ABI_conformance:
3756
    /* Merging for this attribute is not specified.  As on ARM,
3757
       treat a missing attribute as no claim to conform and only
3758
       merge identical values.  */
3759
0
    if (out_attr[i].s == NULL
3760
0
        || in_attr[i].s == NULL
3761
0
        || strcmp (out_attr[i].s,
3762
0
       in_attr[i].s) != 0)
3763
0
      out_attr[i].s = NULL;
3764
0
    break;
3765
3766
0
  case Tag_ABI_compatibility:
3767
    /* Merged in _bfd_elf_merge_object_attributes.  */
3768
0
    break;
3769
3770
0
  default:
3771
0
    result
3772
0
      = result && _bfd_elf_merge_unknown_attribute_low (ibfd, obfd, i);
3773
0
    break;
3774
0
  }
3775
3776
0
      if (in_attr[i].type && !out_attr[i].type)
3777
0
  out_attr[i].type = in_attr[i].type;
3778
0
    }
3779
3780
  /* Merge Tag_ABI_compatibility attributes and any common GNU ones.  */
3781
0
  if (!_bfd_elf_merge_object_attributes (ibfd, info))
3782
0
    return false;
3783
3784
0
  result &= _bfd_elf_merge_unknown_attribute_list (ibfd, obfd);
3785
3786
0
  return result;
3787
0
}
3788
3789
static bool
3790
elf32_tic6x_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
3791
0
{
3792
0
  if (!_bfd_generic_verify_endian_match (ibfd, info))
3793
0
    return false;
3794
3795
0
  if (! is_tic6x_elf (ibfd) || ! is_tic6x_elf (info->output_bfd))
3796
0
    return true;
3797
3798
0
  if (!elf32_tic6x_merge_attributes (ibfd, info))
3799
0
    return false;
3800
3801
0
  return true;
3802
0
}
3803
3804
/* Add a new unwind edit to the list described by HEAD, TAIL.  If TINDEX is zero,
3805
   adds the edit to the start of the list.  (The list must be built in order of
3806
   ascending TINDEX: the function's callers are primarily responsible for
3807
   maintaining that condition).  */
3808
3809
static void
3810
elf32_tic6x_add_unwind_table_edit (tic6x_unwind_table_edit **head,
3811
           tic6x_unwind_table_edit **tail,
3812
           tic6x_unwind_edit_type type,
3813
           asection *linked_section,
3814
           unsigned int tindex)
3815
0
{
3816
0
  tic6x_unwind_table_edit *new_edit = (tic6x_unwind_table_edit *)
3817
0
      xmalloc (sizeof (tic6x_unwind_table_edit));
3818
3819
0
  new_edit->type = type;
3820
0
  new_edit->linked_section = linked_section;
3821
0
  new_edit->index = tindex;
3822
3823
0
  if (tindex > 0)
3824
0
    {
3825
0
      new_edit->next = NULL;
3826
3827
0
      if (*tail)
3828
0
  (*tail)->next = new_edit;
3829
3830
0
      (*tail) = new_edit;
3831
3832
0
      if (!*head)
3833
0
  (*head) = new_edit;
3834
0
    }
3835
0
  else
3836
0
    {
3837
0
      new_edit->next = *head;
3838
3839
0
      if (!*tail)
3840
0
  *tail = new_edit;
3841
3842
0
      *head = new_edit;
3843
0
    }
3844
0
}
3845
3846
static _tic6x_elf_section_data *
3847
get_tic6x_elf_section_data (asection * sec)
3848
0
{
3849
0
  if (sec && sec->owner && is_tic6x_elf (sec->owner))
3850
0
    return elf32_tic6x_section_data (sec);
3851
0
  else
3852
0
    return NULL;
3853
0
}
3854
3855
3856
/* Increase the size of EXIDX_SEC by ADJUST bytes.  ADJUST must be negative.  */
3857
static void
3858
elf32_tic6x_adjust_exidx_size (asection *exidx_sec, int adjust)
3859
0
{
3860
0
  asection *out_sec;
3861
3862
0
  if (!exidx_sec->rawsize)
3863
0
    exidx_sec->rawsize = exidx_sec->size;
3864
3865
0
  bfd_set_section_size (exidx_sec, exidx_sec->size + adjust);
3866
0
  out_sec = exidx_sec->output_section;
3867
  /* Adjust size of output section.  */
3868
0
  bfd_set_section_size (out_sec, out_sec->size +adjust);
3869
0
}
3870
3871
/* Insert an EXIDX_CANTUNWIND marker at the end of a section.  */
3872
static void
3873
elf32_tic6x_insert_cantunwind_after (asection *text_sec, asection *exidx_sec)
3874
0
{
3875
0
  struct _tic6x_elf_section_data *exidx_data;
3876
3877
0
  exidx_data = get_tic6x_elf_section_data (exidx_sec);
3878
0
  elf32_tic6x_add_unwind_table_edit (
3879
0
    &exidx_data->u.exidx.unwind_edit_list,
3880
0
    &exidx_data->u.exidx.unwind_edit_tail,
3881
0
    INSERT_EXIDX_CANTUNWIND_AT_END, text_sec, UINT_MAX);
3882
3883
0
  elf32_tic6x_adjust_exidx_size (exidx_sec, 8);
3884
0
}
3885
3886
/* Scan .cx6abi.exidx tables, and create a list describing edits which
3887
   should be made to those tables, such that:
3888
3889
     1. Regions without unwind data are marked with EXIDX_CANTUNWIND entries.
3890
     2. Duplicate entries are merged together (EXIDX_CANTUNWIND, or unwind
3891
  codes which have been inlined into the index).
3892
3893
   If MERGE_EXIDX_ENTRIES is false, duplicate entries are not merged.
3894
3895
   The edits are applied when the tables are written
3896
   (in elf32_tic6x_write_section).
3897
*/
3898
3899
bool
3900
elf32_tic6x_fix_exidx_coverage (asection **text_section_order,
3901
        unsigned int num_text_sections,
3902
        struct bfd_link_info *info,
3903
        bool merge_exidx_entries)
3904
0
{
3905
0
  bfd *inp;
3906
0
  unsigned int last_second_word = 0, i;
3907
0
  asection *last_exidx_sec = NULL;
3908
0
  asection *last_text_sec = NULL;
3909
0
  int last_unwind_type = -1;
3910
3911
  /* Walk over all EXIDX sections, and create backlinks from the corrsponding
3912
     text sections.  */
3913
0
  for (inp = info->input_bfds; inp != NULL; inp = inp->link.next)
3914
0
    {
3915
0
      asection *sec;
3916
3917
0
      for (sec = inp->sections; sec != NULL; sec = sec->next)
3918
0
  {
3919
0
    struct bfd_elf_section_data *elf_sec = elf_section_data (sec);
3920
0
    Elf_Internal_Shdr *hdr = &elf_sec->this_hdr;
3921
3922
0
    if (!hdr || hdr->sh_type != SHT_C6000_UNWIND)
3923
0
      continue;
3924
3925
0
    if (elf_sec->linked_to)
3926
0
      {
3927
0
        Elf_Internal_Shdr *linked_hdr
3928
0
    = &elf_section_data (elf_sec->linked_to)->this_hdr;
3929
0
        struct _tic6x_elf_section_data *linked_sec_tic6x_data
3930
0
    = get_tic6x_elf_section_data (linked_hdr->bfd_section);
3931
3932
0
        if (linked_sec_tic6x_data == NULL)
3933
0
    continue;
3934
3935
        /* Link this .c6xabi.exidx section back from the
3936
     text section it describes.  */
3937
0
        linked_sec_tic6x_data->u.text.tic6x_exidx_sec = sec;
3938
0
      }
3939
0
  }
3940
0
    }
3941
3942
  /* Walk all text sections in order of increasing VMA.  Eilminate duplicate
3943
     index table entries (EXIDX_CANTUNWIND and inlined unwind opcodes),
3944
     and add EXIDX_CANTUNWIND entries for sections with no unwind table data.  */
3945
3946
0
  for (i = 0; i < num_text_sections; i++)
3947
0
    {
3948
0
      asection *sec = text_section_order[i];
3949
0
      asection *exidx_sec;
3950
0
      struct _tic6x_elf_section_data *tic6x_data
3951
0
  = get_tic6x_elf_section_data (sec);
3952
0
      struct _tic6x_elf_section_data *exidx_data;
3953
0
      bfd_byte *contents = NULL;
3954
0
      int deleted_exidx_bytes = 0;
3955
0
      bfd_vma j;
3956
0
      tic6x_unwind_table_edit *unwind_edit_head = NULL;
3957
0
      tic6x_unwind_table_edit *unwind_edit_tail = NULL;
3958
0
      Elf_Internal_Shdr *hdr;
3959
0
      bfd *ibfd;
3960
3961
0
      if (tic6x_data == NULL)
3962
0
  continue;
3963
3964
0
      exidx_sec = tic6x_data->u.text.tic6x_exidx_sec;
3965
0
      if (exidx_sec == NULL)
3966
0
  {
3967
    /* Section has no unwind data.  */
3968
0
    if (last_unwind_type == 0 || !last_exidx_sec)
3969
0
      continue;
3970
3971
    /* Ignore zero sized sections.  */
3972
0
    if (sec->size == 0)
3973
0
      continue;
3974
3975
0
    elf32_tic6x_insert_cantunwind_after (last_text_sec, last_exidx_sec);
3976
0
    last_unwind_type = 0;
3977
0
    continue;
3978
0
  }
3979
3980
      /* Skip /DISCARD/ sections.  */
3981
0
      if (bfd_is_abs_section (exidx_sec->output_section))
3982
0
  continue;
3983
3984
0
      hdr = &elf_section_data (exidx_sec)->this_hdr;
3985
0
      if (hdr->sh_type != SHT_C6000_UNWIND)
3986
0
  continue;
3987
3988
0
      exidx_data = get_tic6x_elf_section_data (exidx_sec);
3989
0
      if (exidx_data == NULL)
3990
0
  continue;
3991
3992
0
      ibfd = exidx_sec->owner;
3993
3994
0
      if (hdr->contents != NULL)
3995
0
  contents = hdr->contents;
3996
0
      else if (! bfd_malloc_and_get_section (ibfd, exidx_sec, &contents))
3997
  /* An error?  */
3998
0
  continue;
3999
4000
0
      for (j = 0; j < hdr->sh_size; j += 8)
4001
0
  {
4002
0
    unsigned int second_word = bfd_get_32 (ibfd, contents + j + 4);
4003
0
    int unwind_type;
4004
0
    int elide = 0;
4005
4006
    /* An EXIDX_CANTUNWIND entry.  */
4007
0
    if (second_word == 1)
4008
0
      {
4009
0
        if (last_unwind_type == 0)
4010
0
    elide = 1;
4011
0
        unwind_type = 0;
4012
0
      }
4013
    /* Inlined unwinding data.  Merge if equal to previous.  */
4014
0
    else if ((second_word & 0x80000000) != 0)
4015
0
      {
4016
0
        if (merge_exidx_entries
4017
0
      && last_second_word == second_word
4018
0
      && last_unwind_type == 1)
4019
0
    elide = 1;
4020
0
        unwind_type = 1;
4021
0
        last_second_word = second_word;
4022
0
      }
4023
    /* Normal table entry.  In theory we could merge these too,
4024
       but duplicate entries are likely to be much less common.  */
4025
0
    else
4026
0
      unwind_type = 2;
4027
4028
0
    if (elide)
4029
0
      {
4030
0
        elf32_tic6x_add_unwind_table_edit (&unwind_edit_head,
4031
0
      &unwind_edit_tail, DELETE_EXIDX_ENTRY, NULL, j / 8);
4032
4033
0
        deleted_exidx_bytes += 8;
4034
0
      }
4035
4036
0
    last_unwind_type = unwind_type;
4037
0
  }
4038
4039
      /* Free contents if we allocated it ourselves.  */
4040
0
      if (contents != hdr->contents)
4041
0
  free (contents);
4042
4043
      /* Record edits to be applied later (in elf32_tic6x_write_section).  */
4044
0
      exidx_data->u.exidx.unwind_edit_list = unwind_edit_head;
4045
0
      exidx_data->u.exidx.unwind_edit_tail = unwind_edit_tail;
4046
4047
0
      if (deleted_exidx_bytes > 0)
4048
0
  elf32_tic6x_adjust_exidx_size (exidx_sec, -deleted_exidx_bytes);
4049
4050
0
      last_exidx_sec = exidx_sec;
4051
0
      last_text_sec = sec;
4052
0
    }
4053
4054
  /* Add terminating CANTUNWIND entry.  */
4055
0
  if (last_exidx_sec && last_unwind_type != 0)
4056
0
    elf32_tic6x_insert_cantunwind_after (last_text_sec, last_exidx_sec);
4057
4058
0
  return true;
4059
0
}
4060
4061
/* Add ADDEND to lower 31 bits of VAL, leaving other bits unmodified.  */
4062
4063
static unsigned long
4064
elf32_tic6x_add_low31 (unsigned long val, bfd_vma addend)
4065
0
{
4066
0
  return (val & ~0x7ffffffful) | ((val + addend) & 0x7ffffffful);
4067
0
}
4068
4069
/* Copy an .c6xabi.exidx table entry, adding OFFSET to (applied) PREL31
4070
   relocations.  OFFSET is in bytes, and will be scaled before encoding.  */
4071
4072
4073
static void
4074
elf32_tic6x_copy_exidx_entry (bfd *output_bfd, bfd_byte *to, bfd_byte *from,
4075
            bfd_vma offset)
4076
0
{
4077
0
  unsigned long first_word = bfd_get_32 (output_bfd, from);
4078
0
  unsigned long second_word = bfd_get_32 (output_bfd, from + 4);
4079
4080
0
  offset >>= 1;
4081
  /* High bit of first word is supposed to be zero.  */
4082
0
  if ((first_word & 0x80000000ul) == 0)
4083
0
    first_word = elf32_tic6x_add_low31 (first_word, offset);
4084
4085
  /* If the high bit of the first word is clear, and the bit pattern is not 0x1
4086
     (EXIDX_CANTUNWIND), this is an offset to an .c6xabi.extab entry.  */
4087
0
  if ((second_word != 0x1) && ((second_word & 0x80000000ul) == 0))
4088
0
    second_word = elf32_tic6x_add_low31 (second_word, offset);
4089
4090
0
  bfd_put_32 (output_bfd, first_word, to);
4091
0
  bfd_put_32 (output_bfd, second_word, to + 4);
4092
0
}
4093
4094
/* Do the actual mangling of exception index tables.  */
4095
4096
static bool
4097
elf32_tic6x_write_section (bfd *output_bfd,
4098
       struct bfd_link_info *link_info,
4099
       asection *sec,
4100
       bfd_byte *contents)
4101
0
{
4102
0
  _tic6x_elf_section_data *tic6x_data;
4103
0
  struct elf32_tic6x_link_hash_table *globals
4104
0
    = elf32_tic6x_hash_table (link_info);
4105
0
  bfd_vma offset = sec->output_section->vma + sec->output_offset;
4106
4107
0
  if (globals == NULL)
4108
0
    return false;
4109
4110
  /* If this section has not been allocated an _tic6x_elf_section_data
4111
     structure then we cannot record anything.  */
4112
0
  tic6x_data = get_tic6x_elf_section_data (sec);
4113
0
  if (tic6x_data == NULL)
4114
0
    return false;
4115
4116
0
  if (tic6x_data->elf.this_hdr.sh_type != SHT_C6000_UNWIND)
4117
0
    return false;
4118
4119
0
  tic6x_unwind_table_edit *edit_node
4120
0
    = tic6x_data->u.exidx.unwind_edit_list;
4121
  /* Now, sec->size is the size of the section we will write.  The original
4122
     size (before we merged duplicate entries and inserted EXIDX_CANTUNWIND
4123
     markers) was sec->rawsize.  (This isn't the case if we perform no
4124
     edits, then rawsize will be zero and we should use size).  */
4125
0
  bfd_byte *edited_contents = (bfd_byte *) bfd_malloc (sec->size);
4126
0
  unsigned int input_size = sec->rawsize ? sec->rawsize : sec->size;
4127
0
  unsigned int in_index, out_index;
4128
0
  bfd_vma add_to_offsets = 0;
4129
4130
0
  for (in_index = 0, out_index = 0; in_index * 8 < input_size || edit_node;)
4131
0
    {
4132
0
      if (edit_node)
4133
0
  {
4134
0
    unsigned int edit_index = edit_node->index;
4135
4136
0
    if (in_index < edit_index && in_index * 8 < input_size)
4137
0
      {
4138
0
        elf32_tic6x_copy_exidx_entry (output_bfd,
4139
0
      edited_contents + out_index * 8,
4140
0
      contents + in_index * 8, add_to_offsets);
4141
0
        out_index++;
4142
0
        in_index++;
4143
0
      }
4144
0
    else if (in_index == edit_index
4145
0
       || (in_index * 8 >= input_size
4146
0
           && edit_index == UINT_MAX))
4147
0
      {
4148
0
        switch (edit_node->type)
4149
0
    {
4150
0
    case DELETE_EXIDX_ENTRY:
4151
0
      in_index++;
4152
0
      add_to_offsets += 8;
4153
0
      break;
4154
4155
0
    case INSERT_EXIDX_CANTUNWIND_AT_END:
4156
0
      {
4157
0
        asection *text_sec = edit_node->linked_section;
4158
0
        bfd_vma text_offset = text_sec->output_section->vma
4159
0
            + text_sec->output_offset
4160
0
            + text_sec->size;
4161
0
        bfd_vma exidx_offset = offset + out_index * 8;
4162
0
        unsigned long prel31_offset;
4163
4164
        /* Note: this is meant to be equivalent to an
4165
           R_C6000_PREL31 relocation.  These synthetic
4166
           EXIDX_CANTUNWIND markers are not relocated by the
4167
           usual BFD method.  */
4168
0
        prel31_offset = ((text_offset - exidx_offset) >> 1)
4169
0
            & 0x7ffffffful;
4170
4171
        /* First address we can't unwind.  */
4172
0
        bfd_put_32 (output_bfd, prel31_offset,
4173
0
        &edited_contents[out_index * 8]);
4174
4175
        /* Code for EXIDX_CANTUNWIND.  */
4176
0
        bfd_put_32 (output_bfd, 0x1,
4177
0
        &edited_contents[out_index * 8 + 4]);
4178
4179
0
        out_index++;
4180
0
        add_to_offsets -= 8;
4181
0
      }
4182
0
      break;
4183
0
    }
4184
4185
0
        edit_node = edit_node->next;
4186
0
      }
4187
0
  }
4188
0
      else
4189
0
  {
4190
    /* No more edits, copy remaining entries verbatim.  */
4191
0
    elf32_tic6x_copy_exidx_entry (output_bfd,
4192
0
        edited_contents + out_index * 8,
4193
0
        contents + in_index * 8, add_to_offsets);
4194
0
    out_index++;
4195
0
    in_index++;
4196
0
  }
4197
0
    }
4198
4199
0
  if (!(sec->flags & SEC_EXCLUDE) && !(sec->flags & SEC_NEVER_LOAD))
4200
0
    bfd_set_section_contents (output_bfd, sec->output_section,
4201
0
            edited_contents,
4202
0
            (file_ptr) sec->output_offset, sec->size);
4203
4204
0
  return true;
4205
0
}
4206
4207
#define elf32_bed   elf32_tic6x_bed
4208
4209
#define TARGET_LITTLE_SYM tic6x_elf32_le_vec
4210
#define TARGET_LITTLE_NAME  "elf32-tic6x-le"
4211
#define TARGET_BIG_SYM    tic6x_elf32_be_vec
4212
#define TARGET_BIG_NAME   "elf32-tic6x-be"
4213
#define ELF_ARCH    bfd_arch_tic6x
4214
#define ELF_TARGET_ID   TIC6X_ELF_DATA
4215
#define ELF_MACHINE_CODE  EM_TI_C6000
4216
#define ELF_MAXPAGESIZE   0x1000
4217
#define bfd_elf32_bfd_reloc_type_lookup elf32_tic6x_reloc_type_lookup
4218
#define bfd_elf32_bfd_reloc_name_lookup elf32_tic6x_reloc_name_lookup
4219
#define bfd_elf32_bfd_merge_private_bfd_data  elf32_tic6x_merge_private_bfd_data
4220
#define bfd_elf32_mkobject    elf32_tic6x_mkobject
4221
#define bfd_elf32_bfd_link_hash_table_create  elf32_tic6x_link_hash_table_create
4222
#define bfd_elf32_new_section_hook  elf32_tic6x_new_section_hook
4223
#define elf_backend_stack_align   8
4224
#define elf_backend_can_gc_sections 1
4225
#define elf_backend_default_use_rela_p  1
4226
#define elf_backend_may_use_rel_p 1
4227
#define elf_backend_may_use_rela_p  1
4228
#define elf_backend_obj_attrs_arg_type  elf32_tic6x_obj_attrs_arg_type
4229
#define elf_backend_obj_attrs_handle_unknown  elf32_tic6x_obj_attrs_handle_unknown
4230
#define elf_backend_obj_attrs_order elf32_tic6x_obj_attrs_order
4231
#define elf_backend_obj_attrs_section ".c6xabi.attributes"
4232
#define elf_backend_obj_attrs_section_type  SHT_C6000_ATTRIBUTES
4233
#define elf_backend_obj_attrs_vendor  "c6xabi"
4234
#define elf_backend_can_refcount  1
4235
#define elf_backend_want_got_plt  1
4236
#define elf_backend_want_dynbss   1
4237
#define elf_backend_want_dynrelro 1
4238
#define elf_backend_plt_readonly  1
4239
#define elf_backend_rela_normal   1
4240
#define elf_backend_got_header_size     8
4241
#define elf_backend_fake_sections       elf32_tic6x_fake_sections
4242
#define elf_backend_gc_mark_extra_sections elf32_tic6x_gc_mark_extra_sections
4243
#define elf_backend_create_dynamic_sections \
4244
  elf32_tic6x_create_dynamic_sections
4245
#define elf_backend_adjust_dynamic_symbol \
4246
  elf32_tic6x_adjust_dynamic_symbol
4247
#define elf_backend_check_relocs  elf32_tic6x_check_relocs
4248
#define elf_backend_add_symbol_hook     elf32_tic6x_add_symbol_hook
4249
#define elf_backend_symbol_processing   elf32_tic6x_symbol_processing
4250
#define elf_backend_link_output_symbol_hook \
4251
  elf32_tic6x_link_output_symbol_hook
4252
#define elf_backend_section_from_bfd_section \
4253
  elf32_tic6x_section_from_bfd_section
4254
#define elf_backend_relocate_section  elf32_tic6x_relocate_section
4255
#define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
4256
#define elf_backend_finish_dynamic_symbol \
4257
  elf32_tic6x_finish_dynamic_symbol
4258
#define elf_backend_early_size_sections \
4259
  elf32_tic6x_early_size_sections
4260
#define elf_backend_late_size_sections \
4261
  elf32_tic6x_late_size_sections
4262
#define elf_backend_finish_dynamic_sections \
4263
  elf32_tic6x_finish_dynamic_sections
4264
#define bfd_elf32_bfd_final_link \
4265
  elf32_tic6x_final_link
4266
#define elf_backend_write_section elf32_tic6x_write_section
4267
#define elf_info_to_howto   elf32_tic6x_info_to_howto
4268
#define elf_info_to_howto_rel   elf32_tic6x_info_to_howto_rel
4269
4270
#undef elf_backend_omit_section_dynsym
4271
#define elf_backend_omit_section_dynsym elf32_tic6x_link_omit_section_dynsym
4272
#define elf_backend_plt_sym_val   elf32_tic6x_plt_sym_val
4273
4274
#include "elf32-target.h"
4275
4276
#undef elf32_bed
4277
#define elf32_bed   elf32_tic6x_linux_bed
4278
4279
#undef TARGET_LITTLE_SYM
4280
#define TARGET_LITTLE_SYM   tic6x_elf32_linux_le_vec
4281
#undef TARGET_LITTLE_NAME
4282
#define TARGET_LITTLE_NAME    "elf32-tic6x-linux-le"
4283
#undef TARGET_BIG_SYM
4284
#define TARGET_BIG_SYM      tic6x_elf32_linux_be_vec
4285
#undef TARGET_BIG_NAME
4286
#define TARGET_BIG_NAME     "elf32-tic6x-linux-be"
4287
#undef ELF_OSABI
4288
#define ELF_OSABI     ELFOSABI_C6000_LINUX
4289
4290
#include "elf32-target.h"
4291
4292
#undef elf32_bed
4293
#define elf32_bed   elf32_tic6x_elf_bed
4294
4295
#undef TARGET_LITTLE_SYM
4296
#define TARGET_LITTLE_SYM   tic6x_elf32_c6000_le_vec
4297
#undef TARGET_LITTLE_NAME
4298
#define TARGET_LITTLE_NAME    "elf32-tic6x-elf-le"
4299
#undef TARGET_BIG_SYM
4300
#define TARGET_BIG_SYM      tic6x_elf32_c6000_be_vec
4301
#undef TARGET_BIG_NAME
4302
#define TARGET_BIG_NAME     "elf32-tic6x-elf-be"
4303
#undef ELF_OSABI
4304
#define ELF_OSABI     ELFOSABI_C6000_ELFABI
4305
4306
#include "elf32-target.h"