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

Subversion Repositories open8_urisc

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

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

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

powered by: WebSVN 2.1.0

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