PR ld/15323
[external/binutils.git] / bfd / elf32-tic6x.c
1 /* 32-bit ELF support for TI C6X
2    Copyright 2010, 2011, 2012
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_zmalloc (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->obfd = abfd;
1587   ret->elf.is_relocatable_executable = 1;
1588
1589   return &ret->elf.root;
1590 }
1591
1592 static bfd_boolean
1593 elf32_tic6x_final_link (bfd *abfd, struct bfd_link_info *info)
1594 {
1595   if (info->shared)
1596     {
1597       obj_attribute *out_attr;
1598       out_attr = elf_known_obj_attributes_proc (abfd);
1599       if (out_attr[Tag_ABI_PIC].i == 0)
1600         {
1601           _bfd_error_handler (_("warning: generating a shared library "
1602                                 "containing non-PIC code"));
1603         }
1604       if (out_attr[Tag_ABI_PID].i == 0)
1605         {
1606           _bfd_error_handler (_("warning: generating a shared library "
1607                                 "containing non-PID code"));
1608         }
1609     }
1610   /* Invoke the regular ELF backend linker to do all the work.  */
1611   if (!bfd_elf_final_link (abfd, info))
1612     return FALSE;
1613
1614   return TRUE;
1615 }
1616
1617 /* Called to pass PARAMS to the backend.  We store them in the hash table
1618    associated with INFO.  */
1619
1620 void
1621 elf32_tic6x_setup (struct bfd_link_info *info,
1622                    struct elf32_tic6x_params *params)
1623 {
1624   struct elf32_tic6x_link_hash_table *htab = elf32_tic6x_hash_table (info);
1625   htab->params = *params;
1626 }
1627
1628 /* Determine if we're dealing with a DSBT object.  */
1629
1630 static bfd_boolean
1631 elf32_tic6x_using_dsbt (bfd *abfd)
1632 {
1633   return bfd_elf_get_obj_attr_int (abfd, OBJ_ATTR_PROC,
1634                                    Tag_ABI_DSBT);
1635 }
1636
1637 /* Create .plt, .rela.plt, .got, .got.plt, .rela.got and .dsbt
1638    sections in DYNOBJ, and set up shortcuts to them in our hash
1639    table.  */
1640
1641 static bfd_boolean
1642 elf32_tic6x_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
1643 {
1644   struct elf32_tic6x_link_hash_table *htab;
1645   flagword flags;
1646
1647   htab = elf32_tic6x_hash_table (info);
1648   if (htab == NULL)
1649     return FALSE;
1650
1651   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
1652     return FALSE;
1653
1654   /* Create .dsbt  */
1655   flags = (SEC_ALLOC | SEC_LOAD
1656            | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
1657   htab->dsbt = bfd_make_section_anyway_with_flags (dynobj, ".dsbt",
1658                                                    flags);
1659   if (htab->dsbt == NULL
1660       || ! bfd_set_section_alignment (dynobj, htab->dsbt, 2)
1661       || ! bfd_set_section_alignment (dynobj, htab->elf.splt, 5))
1662     return FALSE;
1663
1664   htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss");
1665   if (!info->shared)
1666     htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss");
1667
1668   if (!htab->sdynbss
1669       || (!info->shared && !htab->srelbss))
1670     abort ();
1671
1672   return TRUE;
1673 }
1674
1675 static bfd_boolean
1676 elf32_tic6x_mkobject (bfd *abfd)
1677 {
1678   bfd_boolean ret;
1679
1680   ret = bfd_elf_allocate_object (abfd, sizeof (struct elf32_tic6x_obj_tdata),
1681                                  TIC6X_ELF_DATA);
1682   if (ret)
1683     elf32_tic6x_set_use_rela_p (abfd, TRUE);
1684   return ret;
1685 }
1686
1687 /* Install relocation RELA into section SRELA, incrementing its
1688    reloc_count.  */
1689
1690 static void
1691 elf32_tic6x_install_rela (bfd *output_bfd, asection *srela,
1692                           Elf_Internal_Rela *rela)
1693 {
1694   bfd_byte *loc;
1695   bfd_vma off = srela->reloc_count++ * sizeof (Elf32_External_Rela);
1696   loc = srela->contents + off;
1697   BFD_ASSERT (off < srela->size);
1698   bfd_elf32_swap_reloca_out (output_bfd, rela, loc);
1699 }
1700
1701 /* Create a dynamic reloc against the GOT at offset OFFSET.  The contents
1702    of the GOT at this offset have been initialized with the relocation.  */
1703
1704 static void
1705 elf32_tic6x_make_got_dynreloc (bfd *output_bfd,
1706                                struct elf32_tic6x_link_hash_table *htab,
1707                                asection *sym_sec, bfd_vma offset)
1708 {
1709   asection *sgot = htab->elf.sgot;
1710   Elf_Internal_Rela outrel;
1711   int dynindx;
1712
1713   outrel.r_offset = sgot->output_section->vma + sgot->output_offset + offset;
1714   outrel.r_addend = bfd_get_32 (output_bfd, sgot->contents + offset);
1715   if (sym_sec && sym_sec->output_section
1716       && ! bfd_is_abs_section (sym_sec->output_section)
1717       && ! bfd_is_und_section (sym_sec->output_section))
1718     {
1719       dynindx = elf_section_data (sym_sec->output_section)->dynindx;
1720       outrel.r_addend -= sym_sec->output_section->vma;
1721     }
1722   else
1723     {
1724       dynindx = 0;
1725     }
1726   outrel.r_info = ELF32_R_INFO (dynindx, R_C6000_ABS32);
1727   elf32_tic6x_install_rela (output_bfd, htab->elf.srelgot, &outrel);
1728 }
1729
1730 /* Finish up dynamic symbol handling.  We set the contents of various
1731    dynamic sections here.  */
1732
1733 static bfd_boolean
1734 elf32_tic6x_finish_dynamic_symbol (bfd * output_bfd,
1735                                    struct bfd_link_info *info,
1736                                    struct elf_link_hash_entry *h,
1737                                    Elf_Internal_Sym * sym)
1738 {
1739   bfd *dynobj;
1740   struct elf32_tic6x_link_hash_table *htab;
1741
1742   htab = elf32_tic6x_hash_table (info);
1743   dynobj = htab->elf.dynobj;
1744
1745   if (h->plt.offset != (bfd_vma) -1)
1746     {
1747       bfd_vma plt_index;
1748       bfd_vma got_section_offset, got_dp_offset, rela_offset;
1749       Elf_Internal_Rela rela;
1750       bfd_byte *loc;
1751       asection *plt, *gotplt, *relplt;
1752       const struct elf_backend_data *bed;
1753
1754       bed = get_elf_backend_data (output_bfd);
1755
1756       BFD_ASSERT (htab->elf.splt != NULL);
1757       plt = htab->elf.splt;
1758       gotplt = htab->elf.sgotplt;
1759       relplt = htab->elf.srelplt;
1760
1761       /* This symbol has an entry in the procedure linkage table.  Set
1762          it up.  */
1763
1764       if ((h->dynindx == -1
1765            && !((h->forced_local || info->executable)
1766                 && h->def_regular
1767                 && h->type == STT_GNU_IFUNC))
1768           || plt == NULL
1769           || gotplt == NULL
1770           || relplt == NULL)
1771         abort ();
1772
1773       /* Get the index in the procedure linkage table which
1774          corresponds to this symbol.  This is the index of this symbol
1775          in all the symbols for which we are making plt entries.  The
1776          first entry in the procedure linkage table is reserved.
1777
1778          Get the offset into the .got table of the entry that
1779          corresponds to this function.  Each .got entry is 4 bytes.
1780          The first three are reserved.
1781
1782          For static executables, we don't reserve anything.  */
1783
1784       plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
1785       got_section_offset = plt_index + bed->got_header_size / 4;
1786       got_dp_offset = got_section_offset + htab->params.dsbt_size;
1787       rela_offset = plt_index * sizeof (Elf32_External_Rela);
1788
1789       got_section_offset *= 4;
1790
1791       /* Fill in the entry in the procedure linkage table.  */
1792
1793       /* ldw .d2t2 *+B14($GOT(f)), b2 */
1794       bfd_put_32 (output_bfd, got_dp_offset << 8 | 0x0100006e,
1795                   plt->contents + h->plt.offset);
1796       /* mvk .s2 low(rela_offset), b0 */
1797       bfd_put_32 (output_bfd, (rela_offset & 0xffff) << 7 | 0x0000002a,
1798                   plt->contents + h->plt.offset + 4);
1799       /* mvkh .s2 high(rela_offset), b0 */
1800       bfd_put_32 (output_bfd, ((rela_offset >> 16) & 0xffff) << 7 | 0x0000006a,
1801                   plt->contents + h->plt.offset + 8);
1802       /* nop 2 */
1803       bfd_put_32 (output_bfd, 0x00002000,
1804                   plt->contents + h->plt.offset + 12);
1805       /* b .s2 b2 */
1806       bfd_put_32 (output_bfd, 0x00080362,
1807                   plt->contents + h->plt.offset + 16);
1808       /* nop 5 */
1809       bfd_put_32 (output_bfd, 0x00008000,
1810                   plt->contents + h->plt.offset + 20);
1811
1812       /* Fill in the entry in the global offset table.  */
1813       bfd_put_32 (output_bfd,
1814                   (plt->output_section->vma + plt->output_offset),
1815                   gotplt->contents + got_section_offset);
1816
1817       /* Fill in the entry in the .rel.plt section.  */
1818       rela.r_offset = (gotplt->output_section->vma
1819                        + gotplt->output_offset
1820                        + got_section_offset);
1821       rela.r_info = ELF32_R_INFO (h->dynindx, R_C6000_JUMP_SLOT);
1822       rela.r_addend = 0;
1823       loc = relplt->contents + rela_offset;
1824       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1825
1826       if (!h->def_regular)
1827         {
1828           /* Mark the symbol as undefined, rather than as defined in
1829              the .plt section.  */
1830           sym->st_shndx = SHN_UNDEF;
1831           sym->st_value = 0;
1832         }
1833     }
1834
1835   if (h->got.offset != (bfd_vma) -1)
1836     {
1837       asection *sgot;
1838       asection *srela;
1839
1840       /* This symbol has an entry in the global offset table.
1841          Set it up.  */
1842
1843       sgot = bfd_get_linker_section (dynobj, ".got");
1844       srela = bfd_get_linker_section (dynobj, ".rela.got");
1845       BFD_ASSERT (sgot != NULL && srela != NULL);
1846
1847       /* If this is a -Bsymbolic link, and the symbol is defined
1848          locally, we just want to emit a RELATIVE reloc.  Likewise if
1849          the symbol was forced to be local because of a version file.
1850          The entry in the global offset table will already have been
1851          initialized in the relocate_section function.  */
1852       if (info->shared
1853           && (info->symbolic
1854               || h->dynindx == -1 || h->forced_local) && h->def_regular)
1855         {
1856           asection *s = h->root.u.def.section;
1857           elf32_tic6x_make_got_dynreloc (output_bfd, htab, s,
1858                              h->got.offset & ~(bfd_vma) 1);
1859         }
1860       else
1861         {
1862           Elf_Internal_Rela outrel;
1863           bfd_put_32 (output_bfd, (bfd_vma) 0,
1864                       sgot->contents + (h->got.offset & ~(bfd_vma) 1));
1865           outrel.r_offset = (sgot->output_section->vma
1866                            + sgot->output_offset
1867                            + (h->got.offset & ~(bfd_vma) 1));
1868           outrel.r_info = ELF32_R_INFO (h->dynindx, R_C6000_ABS32);
1869           outrel.r_addend = 0;
1870
1871           elf32_tic6x_install_rela (output_bfd, srela, &outrel);
1872         }
1873     }
1874
1875   if (h->needs_copy)
1876     {
1877       Elf_Internal_Rela rel;
1878
1879       /* This symbol needs a copy reloc.  Set it up.  */
1880
1881       if (h->dynindx == -1
1882           || (h->root.type != bfd_link_hash_defined
1883               && h->root.type != bfd_link_hash_defweak)
1884           || htab->srelbss == NULL)
1885         abort ();
1886
1887       rel.r_offset = (h->root.u.def.value
1888                       + h->root.u.def.section->output_section->vma
1889                       + h->root.u.def.section->output_offset);
1890       rel.r_info = ELF32_R_INFO (h->dynindx, R_C6000_COPY);
1891       rel.r_addend = 0;
1892
1893       elf32_tic6x_install_rela (output_bfd, htab->srelbss, &rel);
1894     }
1895
1896   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
1897   if (h == elf_hash_table (info)->hdynamic
1898       || h == elf_hash_table (info)->hgot)
1899     sym->st_shndx = SHN_ABS;
1900
1901   return TRUE;
1902 }
1903
1904 /* Unwinding tables are not referenced directly.  This pass marks them as
1905    required if the corresponding code section is marked.  */
1906
1907 static bfd_boolean
1908 elf32_tic6x_gc_mark_extra_sections (struct bfd_link_info *info,
1909                                     elf_gc_mark_hook_fn gc_mark_hook)
1910 {
1911   bfd *sub;
1912   Elf_Internal_Shdr **elf_shdrp;
1913   bfd_boolean again;
1914
1915   _bfd_elf_gc_mark_extra_sections (info, gc_mark_hook);
1916
1917   /* Marking EH data may cause additional code sections to be marked,
1918      requiring multiple passes.  */
1919   again = TRUE;
1920   while (again)
1921     {
1922       again = FALSE;
1923       for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
1924         {
1925           asection *o;
1926
1927           if (! is_tic6x_elf (sub))
1928             continue;
1929
1930           elf_shdrp = elf_elfsections (sub);
1931           for (o = sub->sections; o != NULL; o = o->next)
1932             {
1933               Elf_Internal_Shdr *hdr;
1934
1935               hdr = &elf_section_data (o)->this_hdr;
1936               if (hdr->sh_type == SHT_C6000_UNWIND
1937                   && hdr->sh_link
1938                   && hdr->sh_link < elf_numsections (sub)
1939                   && !o->gc_mark
1940                   && elf_shdrp[hdr->sh_link]->bfd_section->gc_mark)
1941                 {
1942                   again = TRUE;
1943                   if (!_bfd_elf_gc_mark (info, o, gc_mark_hook))
1944                     return FALSE;
1945                 }
1946             }
1947         }
1948     }
1949
1950   return TRUE;
1951 }
1952
1953 /* Return TRUE if this is an unwinding table index.  */
1954
1955 static bfd_boolean
1956 is_tic6x_elf_unwind_section_name (const char *name)
1957 {
1958   return (CONST_STRNEQ (name, ELF_STRING_C6000_unwind)
1959           || CONST_STRNEQ (name, ELF_STRING_C6000_unwind_once));
1960 }
1961
1962
1963 /* Set the type and flags for an unwinding index table.  We do this by
1964    the section name, which is a hack, but ought to work.  */
1965
1966 static bfd_boolean
1967 elf32_tic6x_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
1968                            Elf_Internal_Shdr *hdr, asection *sec)
1969 {
1970   const char * name;
1971
1972   name = bfd_get_section_name (abfd, sec);
1973
1974   if (is_tic6x_elf_unwind_section_name (name))
1975     {
1976       hdr->sh_type = SHT_C6000_UNWIND;
1977       hdr->sh_flags |= SHF_LINK_ORDER;
1978     }
1979
1980   return TRUE;
1981 }
1982
1983 /* Update the got entry reference counts for the section being removed.  */
1984
1985 static bfd_boolean
1986 elf32_tic6x_gc_sweep_hook (bfd *abfd,
1987                            struct bfd_link_info *info,
1988                            asection *sec,
1989                            const Elf_Internal_Rela *relocs)
1990 {
1991   struct elf32_tic6x_link_hash_table *htab;
1992   Elf_Internal_Shdr *symtab_hdr;
1993   struct elf_link_hash_entry **sym_hashes;
1994   bfd_signed_vma *local_got_refcounts;
1995   const Elf_Internal_Rela *rel, *relend;
1996
1997   if (info->relocatable)
1998     return TRUE;
1999
2000   htab = elf32_tic6x_hash_table (info);
2001   if (htab == NULL)
2002     return FALSE;
2003
2004   elf_section_data (sec)->local_dynrel = NULL;
2005
2006   symtab_hdr = &elf_symtab_hdr (abfd);
2007   sym_hashes = elf_sym_hashes (abfd);
2008   local_got_refcounts = elf_local_got_refcounts (abfd);
2009
2010   relend = relocs + sec->reloc_count;
2011   for (rel = relocs; rel < relend; rel++)
2012     {
2013       unsigned long r_symndx;
2014       unsigned int r_type;
2015       struct elf_link_hash_entry *h = NULL;
2016
2017       r_symndx = ELF32_R_SYM (rel->r_info);
2018       if (r_symndx >= symtab_hdr->sh_info)
2019         {
2020           struct elf32_tic6x_link_hash_entry *eh;
2021           struct elf_dyn_relocs **pp;
2022           struct elf_dyn_relocs *p;
2023
2024           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2025           while (h->root.type == bfd_link_hash_indirect
2026                  || h->root.type == bfd_link_hash_warning)
2027             h = (struct elf_link_hash_entry *) h->root.u.i.link;
2028           eh = (struct elf32_tic6x_link_hash_entry *) h;
2029
2030           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
2031             if (p->sec == sec)
2032               {
2033                 /* Everything must go for SEC.  */
2034                 *pp = p->next;
2035                 break;
2036               }
2037         }
2038
2039       r_type = ELF32_R_TYPE (rel->r_info);
2040
2041       switch (r_type)
2042         {
2043         case R_C6000_SBR_GOT_U15_W:
2044         case R_C6000_SBR_GOT_L16_W:
2045         case R_C6000_SBR_GOT_H16_W:
2046         case R_C6000_EHTYPE:
2047           if (h != NULL)
2048             {
2049               if (h->got.refcount > 0)
2050                 h->got.refcount -= 1;
2051             }
2052           else if (local_got_refcounts != NULL)
2053             {
2054               if (local_got_refcounts[r_symndx] > 0)
2055                 local_got_refcounts[r_symndx] -= 1;
2056             }
2057           break;
2058
2059         default:
2060           break;
2061         }
2062     }
2063
2064   return TRUE;
2065 }
2066
2067 /* Adjust a symbol defined by a dynamic object and referenced by a
2068    regular object.  The current definition is in some section of the
2069    dynamic object, but we're not including those sections.  We have to
2070    change the definition to something the rest of the link can
2071    understand.  */
2072
2073 static bfd_boolean
2074 elf32_tic6x_adjust_dynamic_symbol (struct bfd_link_info *info,
2075                                    struct elf_link_hash_entry *h)
2076 {
2077   struct elf32_tic6x_link_hash_table *htab;
2078   bfd *dynobj;
2079   asection *s;
2080
2081   dynobj = elf_hash_table (info)->dynobj;
2082
2083   /* Make sure we know what is going on here.  */
2084   BFD_ASSERT (dynobj != NULL
2085               && (h->needs_plt
2086                   || h->u.weakdef != NULL
2087                   || (h->def_dynamic && h->ref_regular && !h->def_regular)));
2088
2089   /* If this is a function, put it in the procedure linkage table.  We
2090      will fill in the contents of the procedure linkage table later,
2091      when we know the address of the .got section.  */
2092   if (h->type == STT_FUNC
2093       || h->needs_plt)
2094     {
2095       if (h->plt.refcount <= 0
2096           || SYMBOL_CALLS_LOCAL (info, h)
2097           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2098               && h->root.type == bfd_link_hash_undefweak))
2099         {
2100           /* This case can occur if we saw a PLT32 reloc in an input
2101              file, but the symbol was never referred to by a dynamic
2102              object, or if all references were garbage collected.  In
2103              such a case, we don't actually need to build a procedure
2104              linkage table, and we can just do a PC32 reloc instead.  */
2105           h->plt.offset = (bfd_vma) -1;
2106           h->needs_plt = 0;
2107         }
2108
2109       return TRUE;
2110     }
2111
2112   /* If this is a weak symbol, and there is a real definition, the
2113      processor independent code will have arranged for us to see the
2114      real definition first, and we can just use the same value.  */
2115   if (h->u.weakdef != NULL)
2116     {
2117       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2118                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
2119       h->root.u.def.section = h->u.weakdef->root.u.def.section;
2120       h->root.u.def.value = h->u.weakdef->root.u.def.value;
2121       h->non_got_ref = h->u.weakdef->non_got_ref;
2122       return TRUE;
2123     }
2124
2125   /* This is a reference to a symbol defined by a dynamic object which
2126      is not a function.  */
2127
2128   /* If we are creating a shared library, we must presume that the
2129      only references to the symbol are via the global offset table.
2130      For such cases we need not do anything here; the relocations will
2131      be handled correctly by relocate_section.  */
2132   if (info->shared)
2133     return TRUE;
2134
2135   /* If there are no references to this symbol that do not use the
2136      GOT, we don't need to generate a copy reloc.  */
2137   if (!h->non_got_ref)
2138     return TRUE;
2139
2140   /* If -z nocopyreloc was given, we won't generate them either.  */
2141   if (info->nocopyreloc)
2142     {
2143       h->non_got_ref = 0;
2144       return TRUE;
2145     }
2146
2147   htab = elf32_tic6x_hash_table (info);
2148   if (htab == NULL)
2149     return FALSE;
2150
2151   /* We must allocate the symbol in our .dynbss section, which will
2152      become part of the .bss section of the executable.  There will be
2153      an entry for this symbol in the .dynsym section.  The dynamic
2154      object will contain position independent code, so all references
2155      from the dynamic object to this symbol will go through the global
2156      offset table.  The dynamic linker will use the .dynsym entry to
2157      determine the address it must put in the global offset table, so
2158      both the dynamic object and the regular object will refer to the
2159      same memory location for the variable.  */
2160
2161   /* We must generate a R_C6000_COPY reloc to tell the dynamic linker to
2162      copy the initial value out of the dynamic object and into the
2163      runtime process image.  */
2164   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
2165     {
2166       htab->srelbss->size += sizeof (Elf32_External_Rela);
2167       h->needs_copy = 1;
2168     }
2169
2170   s = htab->sdynbss;
2171
2172   return _bfd_elf_adjust_dynamic_copy (h, s);
2173 }
2174
2175 static bfd_boolean
2176 elf32_tic6x_new_section_hook (bfd *abfd, asection *sec)
2177 {
2178   bfd_boolean ret;
2179
2180   /* Allocate target specific section data.  */
2181   if (!sec->used_by_bfd)
2182     {
2183       _tic6x_elf_section_data *sdata;
2184       bfd_size_type amt = sizeof (*sdata);
2185
2186       sdata = (_tic6x_elf_section_data *) bfd_zalloc (abfd, amt);
2187       if (sdata == NULL)
2188         return FALSE;
2189       sec->used_by_bfd = sdata;
2190     }
2191
2192   ret = _bfd_elf_new_section_hook (abfd, sec);
2193   sec->use_rela_p = elf32_tic6x_tdata (abfd)->use_rela_p;
2194
2195   return ret;
2196 }
2197
2198 /* Return true if relocation REL against section SEC is a REL rather
2199    than RELA relocation.  RELOCS is the first relocation in the
2200    section and ABFD is the bfd that contains SEC.  */
2201
2202 static bfd_boolean
2203 elf32_tic6x_rel_relocation_p (bfd *abfd, asection *sec,
2204                               const Elf_Internal_Rela *relocs,
2205                               const Elf_Internal_Rela *rel)
2206 {
2207   Elf_Internal_Shdr *rel_hdr;
2208   const struct elf_backend_data *bed;
2209
2210   /* To determine which flavor of relocation this is, we depend on the
2211      fact that the INPUT_SECTION's REL_HDR is read before RELA_HDR.  */
2212   rel_hdr = elf_section_data (sec)->rel.hdr;
2213   if (rel_hdr == NULL)
2214     return FALSE;
2215   bed = get_elf_backend_data (abfd);
2216   return ((size_t) (rel - relocs)
2217           < NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel);
2218 }
2219
2220 /* We need dynamic symbols for every section, since segments can
2221    relocate independently.  */
2222 static bfd_boolean
2223 elf32_tic6x_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
2224                                       struct bfd_link_info *info ATTRIBUTE_UNUSED,
2225                                       asection *p)
2226 {
2227   switch (elf_section_data (p)->this_hdr.sh_type)
2228     {
2229     case SHT_PROGBITS:
2230     case SHT_NOBITS:
2231       /* If sh_type is yet undecided, assume it could be
2232          SHT_PROGBITS/SHT_NOBITS.  */
2233     case SHT_NULL:
2234       return FALSE;
2235
2236       /* There shouldn't be section relative relocations
2237          against any other section.  */
2238     default:
2239       return TRUE;
2240     }
2241 }
2242
2243 static bfd_boolean
2244 elf32_tic6x_relocate_section (bfd *output_bfd,
2245                               struct bfd_link_info *info,
2246                               bfd *input_bfd,
2247                               asection *input_section,
2248                               bfd_byte *contents,
2249                               Elf_Internal_Rela *relocs,
2250                               Elf_Internal_Sym *local_syms,
2251                               asection **local_sections)
2252 {
2253   struct elf32_tic6x_link_hash_table *htab;
2254   Elf_Internal_Shdr *symtab_hdr;
2255   struct elf_link_hash_entry **sym_hashes;
2256   bfd_vma *local_got_offsets;
2257   Elf_Internal_Rela *rel;
2258   Elf_Internal_Rela *relend;
2259   bfd_boolean ok = TRUE;
2260
2261   htab = elf32_tic6x_hash_table (info);
2262   symtab_hdr = & elf_symtab_hdr (input_bfd);
2263   sym_hashes = elf_sym_hashes (input_bfd);
2264   local_got_offsets = elf_local_got_offsets (input_bfd);
2265
2266   relend = relocs + input_section->reloc_count;
2267
2268   for (rel = relocs; rel < relend; rel ++)
2269     {
2270       int r_type;
2271       unsigned long r_symndx;
2272       arelent bfd_reloc;
2273       reloc_howto_type *howto;
2274       Elf_Internal_Sym *sym;
2275       asection *sec;
2276       struct elf_link_hash_entry *h;
2277       bfd_vma off, off2, relocation;
2278       bfd_boolean unresolved_reloc;
2279       bfd_reloc_status_type r;
2280       struct bfd_link_hash_entry *sbh;
2281       bfd_boolean is_rel;
2282
2283       r_type = ELF32_R_TYPE (rel->r_info);
2284       r_symndx = ELF32_R_SYM (rel->r_info);
2285
2286       is_rel = elf32_tic6x_rel_relocation_p (input_bfd, input_section,
2287                                              relocs, rel);
2288
2289       if (is_rel)
2290         elf32_tic6x_info_to_howto_rel (input_bfd, &bfd_reloc, rel);
2291       else
2292         elf32_tic6x_info_to_howto (input_bfd, &bfd_reloc, rel);
2293       howto = bfd_reloc.howto;
2294       if (howto == NULL)
2295         {
2296           bfd_set_error (bfd_error_bad_value);
2297           return FALSE;
2298         }
2299
2300       h = NULL;
2301       sym = NULL;
2302       sec = NULL;
2303       unresolved_reloc = FALSE;
2304
2305       if (r_symndx < symtab_hdr->sh_info)
2306         {
2307           sym = local_syms + r_symndx;
2308           sec = local_sections[r_symndx];
2309           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2310         }
2311       else
2312         {
2313           bfd_boolean warned;
2314
2315           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2316                                    r_symndx, symtab_hdr, sym_hashes,
2317                                    h, sec, relocation,
2318                                    unresolved_reloc, warned);
2319         }
2320
2321       if (sec != NULL && discarded_section (sec))
2322         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2323                                          rel, 1, relend, howto, 0, contents);
2324
2325       if (info->relocatable)
2326         {
2327           if (is_rel
2328               && sym != NULL
2329               && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
2330             {
2331               rel->r_addend = 0;
2332               relocation = sec->output_offset + sym->st_value;
2333               r = _bfd_relocate_contents (howto, input_bfd, relocation,
2334                                           contents + rel->r_offset);
2335               goto done_reloc;
2336             }
2337           continue;
2338         }
2339
2340       switch (r_type)
2341         {
2342         case R_C6000_NONE:
2343         case R_C6000_ALIGN:
2344         case R_C6000_FPHEAD:
2345         case R_C6000_NOCMP:
2346           /* No action needed.  */
2347           continue;
2348
2349         case R_C6000_PCR_S21:
2350           /* A branch to an undefined weak symbol is turned into a
2351              "b .s2 B3" instruction if the existing insn is of the
2352              form "b .s2 symbol".  */
2353           if (h ? h->root.type == bfd_link_hash_undefweak
2354               && (htab->elf.splt == NULL || h->plt.offset == (bfd_vma) -1)
2355               : r_symndx != STN_UNDEF && bfd_is_und_section (sec))
2356             {
2357               unsigned long oldval;
2358               oldval = bfd_get_32 (input_bfd, contents + rel->r_offset);
2359
2360               if ((oldval & 0x7e) == 0x12)
2361                 {
2362                   oldval &= 0xF0000001;
2363                   bfd_put_32 (input_bfd, oldval | 0x000c0362,
2364                               contents + rel->r_offset);
2365                   r = bfd_reloc_ok;
2366                   goto done_reloc;
2367                 }
2368             }
2369
2370         case R_C6000_PCR_S12:
2371         case R_C6000_PCR_S10:
2372         case R_C6000_PCR_S7:
2373           if (h != NULL
2374               && h->plt.offset != (bfd_vma) -1
2375               && htab->elf.splt != NULL)
2376             {
2377               relocation = (htab->elf.splt->output_section->vma
2378                             + htab->elf.splt->output_offset
2379                             + h->plt.offset);
2380             }
2381
2382           /* Generic PC-relative handling produces a value relative to
2383              the exact location of the relocation.  Adjust it to be
2384              relative to the start of the fetch packet instead.  */
2385           relocation += (input_section->output_section->vma
2386                          + input_section->output_offset
2387                          + rel->r_offset) & 0x1f;
2388           unresolved_reloc = FALSE;
2389           break;
2390
2391         case R_C6000_PCR_H16:
2392         case R_C6000_PCR_L16:
2393           off = (input_section->output_section->vma
2394                  + input_section->output_offset
2395                  + rel->r_offset);
2396           /* These must be calculated as R = S - FP(FP(PC) - A).
2397              PC, here, is the value we just computed in OFF.  RELOCATION
2398              has the address of S + A. */
2399           relocation -= rel->r_addend;
2400           off2 = ((off & ~(bfd_vma)0x1f) - rel->r_addend) & (bfd_vma)~0x1f;
2401           off2 = relocation - off2;
2402           relocation = off + off2;
2403           break;
2404
2405         case R_C6000_DSBT_INDEX:
2406           relocation = elf32_tic6x_hash_table (info)->params.dsbt_index;
2407           if (!info->shared || relocation != 0)
2408             break;
2409
2410           /* fall through */
2411         case R_C6000_ABS32:
2412         case R_C6000_ABS16:
2413         case R_C6000_ABS8:
2414         case R_C6000_ABS_S16:
2415         case R_C6000_ABS_L16:
2416         case R_C6000_ABS_H16:
2417           /* When generating a shared object or relocatable executable, these
2418              relocations are copied into the output file to be resolved at
2419              run time.  */
2420           if ((info->shared || elf32_tic6x_using_dsbt (output_bfd))
2421               && (input_section->flags & SEC_ALLOC)
2422               && (h == NULL
2423                   || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2424                   || h->root.type != bfd_link_hash_undefweak))
2425             {
2426               Elf_Internal_Rela outrel;
2427               bfd_boolean skip, relocate;
2428               asection *sreloc;
2429
2430               unresolved_reloc = FALSE;
2431
2432               sreloc = elf_section_data (input_section)->sreloc;
2433               BFD_ASSERT (sreloc != NULL && sreloc->contents != NULL);
2434
2435               skip = FALSE;
2436               relocate = FALSE;
2437
2438               outrel.r_offset =
2439                 _bfd_elf_section_offset (output_bfd, info, input_section,
2440                                          rel->r_offset);
2441               if (outrel.r_offset == (bfd_vma) -1)
2442                 skip = TRUE;
2443               else if (outrel.r_offset == (bfd_vma) -2)
2444                 skip = TRUE, relocate = TRUE;
2445               outrel.r_offset += (input_section->output_section->vma
2446                                   + input_section->output_offset);
2447
2448               if (skip)
2449                 memset (&outrel, 0, sizeof outrel);
2450               else if (h != NULL
2451                        && h->dynindx != -1
2452                        && (!info->shared
2453                            || !info->symbolic
2454                            || !h->def_regular))
2455                 {
2456                   outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
2457                   outrel.r_addend = rel->r_addend;
2458                 }
2459               else
2460                 {
2461                   long indx;
2462
2463                   outrel.r_addend = relocation + rel->r_addend;
2464
2465                   if (bfd_is_abs_section (sec))
2466                     indx = 0;
2467                   else if (sec == NULL || sec->owner == NULL)
2468                     {
2469                       bfd_set_error (bfd_error_bad_value);
2470                       return FALSE;
2471                     }
2472                   else
2473                     {
2474                       asection *osec;
2475
2476                       osec = sec->output_section;
2477                       indx = elf_section_data (osec)->dynindx;
2478                       outrel.r_addend -= osec->vma;
2479                       BFD_ASSERT (indx != 0);
2480                     }
2481
2482                   outrel.r_info = ELF32_R_INFO (indx, r_type);
2483                 }
2484
2485               elf32_tic6x_install_rela (output_bfd, sreloc, &outrel);
2486
2487               /* If this reloc is against an external symbol, we do not want to
2488                  fiddle with the addend.  Otherwise, we need to include the symbol
2489                  value so that it becomes an addend for the dynamic reloc.  */
2490               if (! relocate)
2491                 continue;
2492             }
2493
2494           /* Generic logic OK.  */
2495           break;
2496
2497         case R_C6000_SBR_U15_B:
2498         case R_C6000_SBR_U15_H:
2499         case R_C6000_SBR_U15_W:
2500         case R_C6000_SBR_S16:
2501         case R_C6000_SBR_L16_B:
2502         case R_C6000_SBR_L16_H:
2503         case R_C6000_SBR_L16_W:
2504         case R_C6000_SBR_H16_B:
2505         case R_C6000_SBR_H16_H:
2506         case R_C6000_SBR_H16_W:
2507           sbh = bfd_link_hash_lookup (info->hash, "__c6xabi_DSBT_BASE",
2508                                       FALSE, FALSE, TRUE);
2509           if (sbh != NULL
2510               && (sbh->type == bfd_link_hash_defined
2511                   || sbh->type == bfd_link_hash_defweak))
2512             {
2513               if (h ? (h->root.type == bfd_link_hash_undefweak
2514                        && (htab->elf.splt == NULL
2515                            || h->plt.offset == (bfd_vma) -1))
2516                   : r_symndx != STN_UNDEF && bfd_is_und_section (sec))
2517                 relocation = 0;
2518               else
2519                 relocation -= (sbh->u.def.value
2520                                + sbh->u.def.section->output_section->vma
2521                                + sbh->u.def.section->output_offset);
2522             }
2523           else
2524             {
2525               (*_bfd_error_handler) (_("%B: SB-relative relocation but "
2526                                        "__c6xabi_DSBT_BASE not defined"),
2527                                      input_bfd);
2528               ok = FALSE;
2529               continue;
2530             }
2531           break;
2532
2533         case R_C6000_SBR_GOT_U15_W:
2534         case R_C6000_SBR_GOT_L16_W:
2535         case R_C6000_SBR_GOT_H16_W:
2536         case R_C6000_EHTYPE:
2537           /* Relocation is to the entry for this symbol in the global
2538              offset table.  */
2539           if (htab->elf.sgot == NULL)
2540             abort ();
2541
2542           if (h != NULL)
2543             {
2544               bfd_boolean dyn;
2545
2546               off = h->got.offset;
2547               dyn = htab->elf.dynamic_sections_created;
2548               if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
2549                   || (info->shared
2550                       && SYMBOL_REFERENCES_LOCAL (info, h))
2551                   || (ELF_ST_VISIBILITY (h->other)
2552                       && h->root.type == bfd_link_hash_undefweak))
2553                 {
2554                   /* This is actually a static link, or it is a
2555                      -Bsymbolic link and the symbol is defined
2556                      locally, or the symbol was forced to be local
2557                      because of a version file.  We must initialize
2558                      this entry in the global offset table.  Since the
2559                      offset must always be a multiple of 4, we use the
2560                      least significant bit to record whether we have
2561                      initialized it already.
2562
2563                      When doing a dynamic link, we create a .rel.got
2564                      relocation entry to initialize the value.  This
2565                      is done in the finish_dynamic_symbol routine.  */
2566                   if ((off & 1) != 0)
2567                     off &= ~1;
2568                   else
2569                     {
2570                       bfd_put_32 (output_bfd, relocation,
2571                                   htab->elf.sgot->contents + off);
2572                       h->got.offset |= 1;
2573
2574                       if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
2575                                                             h)
2576                           && !(ELF_ST_VISIBILITY (h->other)
2577                                && h->root.type == bfd_link_hash_undefweak))
2578                         elf32_tic6x_make_got_dynreloc (output_bfd, htab, sec,
2579                                                        off);
2580                     }
2581                 }
2582               else
2583                 unresolved_reloc = FALSE;
2584             }
2585           else
2586             {
2587               if (local_got_offsets == NULL)
2588                 abort ();
2589
2590               off = local_got_offsets[r_symndx];
2591
2592               /* The offset must always be a multiple of 4.  We use
2593                  the least significant bit to record whether we have
2594                  already generated the necessary reloc.  */
2595               if ((off & 1) != 0)
2596                 off &= ~1;
2597               else
2598                 {
2599                   bfd_put_32 (output_bfd, relocation,
2600                               htab->elf.sgot->contents + off);
2601
2602                   if (info->shared || elf32_tic6x_using_dsbt (output_bfd))
2603                     elf32_tic6x_make_got_dynreloc (output_bfd, htab, sec, off);
2604
2605                   local_got_offsets[r_symndx] |= 1;
2606                 }
2607             }
2608
2609           if (off >= (bfd_vma) -2)
2610             abort ();
2611
2612           if (htab->dsbt)
2613             relocation = (htab->elf.sgot->output_section->vma
2614                           + htab->elf.sgot->output_offset + off
2615                           - htab->dsbt->output_section->vma
2616                           - htab->dsbt->output_offset);
2617           else
2618             relocation = (htab->elf.sgot->output_section->vma
2619                           + htab->elf.sgot->output_offset + off
2620                           - htab->elf.sgotplt->output_section->vma
2621                           - htab->elf.sgotplt->output_offset);
2622
2623           if (rel->r_addend != 0)
2624             {
2625               /* We can't do anything for a relocation which is against
2626                  a symbol *plus offset*.  GOT holds relocations for
2627                  symbols.  Make this an error; the compiler isn't
2628                  allowed to pass us these kinds of things.  */
2629               if (h == NULL)
2630                 (*_bfd_error_handler)
2631                   (_("%B, section %A: relocation %s with non-zero addend %d"
2632                      " against local symbol"),
2633                    input_bfd,
2634                    input_section,
2635                    elf32_tic6x_howto_table[r_type].name,
2636                    rel->r_addend);
2637               else
2638                 (*_bfd_error_handler)
2639                   (_("%B, section %A: relocation %s with non-zero addend %d"
2640                      " against symbol `%s'"),
2641                    input_bfd,
2642                    input_section,
2643                    elf32_tic6x_howto_table[r_type].name,
2644                    rel->r_addend,
2645                    h->root.root.string[0] != '\0' ? h->root.root.string
2646                    : _("[whose name is lost]"));
2647
2648               bfd_set_error (bfd_error_bad_value);
2649               return FALSE;
2650             }
2651           break;
2652
2653         case R_C6000_PREL31:
2654           if (h != NULL
2655               && h->plt.offset != (bfd_vma) -1
2656               && htab->elf.splt != NULL)
2657             {
2658               relocation = (htab->elf.splt->output_section->vma
2659                             + htab->elf.splt->output_offset
2660                             + h->plt.offset);
2661             }
2662           break;
2663
2664         case R_C6000_COPY:
2665           /* Invalid in relocatable object.  */
2666         default:
2667           /* Unknown relocation.  */
2668           (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
2669                                  input_bfd, r_type);
2670           ok = FALSE;
2671           continue;
2672         }
2673
2674       r = _bfd_final_link_relocate (howto, input_bfd, input_section,
2675                                     contents, rel->r_offset,
2676                                     relocation, rel->r_addend);
2677
2678     done_reloc:
2679       if (r == bfd_reloc_ok
2680           && howto->complain_on_overflow == complain_overflow_bitfield)
2681         {
2682           /* Generic overflow handling accepts cases the ABI says
2683              should be rejected for R_C6000_ABS16 and
2684              R_C6000_ABS8.  */
2685           bfd_vma value = (relocation + rel->r_addend) & 0xffffffff;
2686           bfd_vma sbit = 1 << (howto->bitsize - 1);
2687           bfd_vma sbits = (-(bfd_vma) sbit) & 0xffffffff;
2688           bfd_vma value_sbits = value & sbits;
2689
2690           if (value_sbits != 0
2691               && value_sbits != sbit
2692               && value_sbits != sbits)
2693             r = bfd_reloc_overflow;
2694         }
2695
2696       if (r != bfd_reloc_ok)
2697         {
2698           const char *name;
2699           const char *error_message;
2700
2701           if (h != NULL)
2702             name = h->root.root.string;
2703           else
2704             {
2705               name = bfd_elf_string_from_elf_section (input_bfd,
2706                                                       symtab_hdr->sh_link,
2707                                                       sym->st_name);
2708               if (name == NULL)
2709                 return FALSE;
2710               if (*name == '\0')
2711                 name = bfd_section_name (input_bfd, sec);
2712             }
2713
2714           switch (r)
2715             {
2716             case bfd_reloc_overflow:
2717               /* If the overflowing reloc was to an undefined symbol,
2718                  we have already printed one error message and there
2719                  is no point complaining again.  */
2720               if ((! h ||
2721                    h->root.type != bfd_link_hash_undefined)
2722                   && (!((*info->callbacks->reloc_overflow)
2723                         (info, (h ? &h->root : NULL), name, howto->name,
2724                          (bfd_vma) 0, input_bfd, input_section,
2725                          rel->r_offset))))
2726                   return FALSE;
2727               break;
2728
2729             case bfd_reloc_undefined:
2730               if (!((*info->callbacks->undefined_symbol)
2731                     (info, name, input_bfd, input_section,
2732                      rel->r_offset, TRUE)))
2733                 return FALSE;
2734               break;
2735
2736             case bfd_reloc_outofrange:
2737               error_message = _("out of range");
2738               goto common_error;
2739
2740             case bfd_reloc_notsupported:
2741               error_message = _("unsupported relocation");
2742               goto common_error;
2743
2744             case bfd_reloc_dangerous:
2745               error_message = _("dangerous relocation");
2746               goto common_error;
2747
2748             default:
2749               error_message = _("unknown error");
2750               /* Fall through.  */
2751
2752             common_error:
2753               BFD_ASSERT (error_message != NULL);
2754               if (!((*info->callbacks->reloc_dangerous)
2755                     (info, error_message, input_bfd, input_section,
2756                      rel->r_offset)))
2757                 return FALSE;
2758               break;
2759             }
2760         }
2761     }
2762
2763   return ok;
2764 }
2765
2766 \f
2767 /* Look through the relocs for a section during the first phase, and
2768    calculate needed space in the global offset table, procedure linkage
2769    table, and dynamic reloc sections.  */
2770
2771 static bfd_boolean
2772 elf32_tic6x_check_relocs (bfd *abfd, struct bfd_link_info *info,
2773                           asection *sec, const Elf_Internal_Rela *relocs)
2774 {
2775   struct elf32_tic6x_link_hash_table *htab;
2776   Elf_Internal_Shdr *symtab_hdr;
2777   struct elf_link_hash_entry **sym_hashes;
2778   const Elf_Internal_Rela *rel;
2779   const Elf_Internal_Rela *rel_end;
2780   asection *sreloc;
2781
2782   if (info->relocatable)
2783     return TRUE;
2784
2785   htab = elf32_tic6x_hash_table (info);
2786   symtab_hdr = &elf_symtab_hdr (abfd);
2787   sym_hashes = elf_sym_hashes (abfd);
2788
2789   /* Create dynamic sections for relocatable executables so that we can
2790      copy relocations.  */
2791   if ((info->shared || elf32_tic6x_using_dsbt (abfd))
2792       && ! htab->elf.dynamic_sections_created)
2793     {
2794       if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
2795         return FALSE;
2796     }
2797
2798   sreloc = NULL;
2799
2800   rel_end = relocs + sec->reloc_count;
2801   for (rel = relocs; rel < rel_end; rel++)
2802     {
2803       unsigned int r_type;
2804       unsigned long r_symndx;
2805       struct elf_link_hash_entry *h;
2806       Elf_Internal_Sym *isym;
2807
2808       r_symndx = ELF32_R_SYM (rel->r_info);
2809       r_type = ELF32_R_TYPE (rel->r_info);
2810
2811       if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr))
2812         {
2813           (*_bfd_error_handler) (_("%B: bad symbol index: %d"),
2814                                  abfd,
2815                                  r_symndx);
2816           return FALSE;
2817         }
2818
2819       if (r_symndx < symtab_hdr->sh_info)
2820         {
2821           /* A local symbol.  */
2822           isym = bfd_sym_from_r_symndx (&htab->sym_cache,
2823                                         abfd, r_symndx);
2824           if (isym == NULL)
2825             return FALSE;
2826           h = NULL;
2827         }
2828       else
2829         {
2830           isym = NULL;
2831           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2832           while (h->root.type == bfd_link_hash_indirect
2833                  || h->root.type == bfd_link_hash_warning)
2834             h = (struct elf_link_hash_entry *) h->root.u.i.link;
2835
2836           /* PR15323, ref flags aren't set for references in the same
2837              object.  */
2838           h->root.non_ir_ref = 1;
2839         }
2840
2841       switch (r_type)
2842         {
2843         case R_C6000_PCR_S21:
2844         case R_C6000_PREL31:
2845           /* This symbol requires a procedure linkage table entry.  We
2846              actually build the entry in adjust_dynamic_symbol,
2847              because this might be a case of linking PIC code which is
2848              never referenced by a dynamic object, in which case we
2849              don't need to generate a procedure linkage table entry
2850              after all.  */
2851
2852           /* If this is a local symbol, we resolve it directly without
2853              creating a procedure linkage table entry.  */
2854           if (h == NULL)
2855             continue;
2856
2857           h->needs_plt = 1;
2858           h->plt.refcount += 1;
2859           break;
2860
2861         case R_C6000_SBR_GOT_U15_W:
2862         case R_C6000_SBR_GOT_L16_W:
2863         case R_C6000_SBR_GOT_H16_W:
2864         case R_C6000_EHTYPE:
2865           /* This symbol requires a global offset table entry.  */
2866           if (h != NULL)
2867             {
2868               h->got.refcount += 1;
2869             }
2870           else
2871             {
2872               bfd_signed_vma *local_got_refcounts;
2873
2874               /* This is a global offset table entry for a local symbol.  */
2875               local_got_refcounts = elf_local_got_refcounts (abfd);
2876               if (local_got_refcounts == NULL)
2877                 {
2878                   bfd_size_type size;
2879
2880                   size = symtab_hdr->sh_info;
2881                   size *= (sizeof (bfd_signed_vma)
2882                            + sizeof (bfd_vma) + sizeof(char));
2883                   local_got_refcounts = bfd_zalloc (abfd, size);
2884                   if (local_got_refcounts == NULL)
2885                     return FALSE;
2886                   elf_local_got_refcounts (abfd) = local_got_refcounts;
2887                 }
2888               local_got_refcounts[r_symndx] += 1;
2889             }
2890
2891           if (htab->elf.sgot == NULL)
2892             {
2893               if (htab->elf.dynobj == NULL)
2894                 htab->elf.dynobj = abfd;
2895               if (!_bfd_elf_create_got_section (htab->elf.dynobj, info))
2896                 return FALSE;
2897             }
2898           break;
2899
2900         case R_C6000_DSBT_INDEX:
2901           /* We'd like to check for nonzero dsbt_index here, but it's
2902              set up only after check_relocs is called.  Instead, we
2903              store the number of R_C6000_DSBT_INDEX relocs in the
2904              pc_count field, and potentially discard the extra space
2905              in elf32_tic6x_allocate_dynrelocs.  */
2906           if (!info->shared)
2907             break;
2908
2909           /* fall through */
2910         case R_C6000_ABS32:
2911         case R_C6000_ABS16:
2912         case R_C6000_ABS8:
2913         case R_C6000_ABS_S16:
2914         case R_C6000_ABS_L16:
2915         case R_C6000_ABS_H16:
2916           /* If we are creating a shared library, and this is a reloc
2917              against a global symbol, or a non PC relative reloc
2918              against a local symbol, then we need to copy the reloc
2919              into the shared library.  However, if we are linking with
2920              -Bsymbolic, we do not need to copy a reloc against a
2921              global symbol which is defined in an object we are
2922              including in the link (i.e., DEF_REGULAR is set).  At
2923              this point we have not seen all the input files, so it is
2924              possible that DEF_REGULAR is not set now but will be set
2925              later (it is never cleared).  In case of a weak definition,
2926              DEF_REGULAR may be cleared later by a strong definition in
2927              a shared library.  We account for that possibility below by
2928              storing information in the relocs_copied field of the hash
2929              table entry.  A similar situation occurs when creating
2930              shared libraries and symbol visibility changes render the
2931              symbol local.
2932
2933              If on the other hand, we are creating an executable, we
2934              may need to keep relocations for symbols satisfied by a
2935              dynamic library if we manage to avoid copy relocs for the
2936              symbol.  */
2937           if ((info->shared || elf32_tic6x_using_dsbt (abfd))
2938               && (sec->flags & SEC_ALLOC) != 0)
2939             {
2940               struct elf_dyn_relocs *p;
2941               struct elf_dyn_relocs **head;
2942
2943               /* We must copy these reloc types into the output file.
2944                  Create a reloc section in dynobj and make room for
2945                  this reloc.  */
2946               if (sreloc == NULL)
2947                 {
2948                   if (htab->elf.dynobj == NULL)
2949                     htab->elf.dynobj = abfd;
2950
2951                   sreloc = _bfd_elf_make_dynamic_reloc_section
2952                     (sec, htab->elf.dynobj, 2, abfd, /*rela? */ TRUE);
2953
2954                   if (sreloc == NULL)
2955                     return FALSE;
2956                 }
2957
2958               /* If this is a global symbol, we count the number of
2959                  relocations we need for this symbol.  */
2960               if (h != NULL)
2961                 {
2962                   head = &((struct elf32_tic6x_link_hash_entry *) h)->dyn_relocs;
2963                 }
2964               else
2965                 {
2966                   /* Track dynamic relocs needed for local syms too.
2967                      We really need local syms available to do this
2968                      easily.  Oh well.  */
2969                   void **vpp;
2970                   asection *s;
2971
2972                   s = bfd_section_from_elf_index (abfd, isym->st_shndx);
2973                   if (s == NULL)
2974                     s = sec;
2975
2976                   vpp = &elf_section_data (s)->local_dynrel;
2977                   head = (struct elf_dyn_relocs **)vpp;
2978                 }
2979
2980               p = *head;
2981               if (p == NULL || p->sec != sec)
2982                 {
2983                   bfd_size_type amt = sizeof *p;
2984                   p = bfd_alloc (htab->elf.dynobj, amt);
2985                   if (p == NULL)
2986                     return FALSE;
2987                   p->next = *head;
2988                   *head = p;
2989                   p->sec = sec;
2990                   p->count = 0;
2991                   p->pc_count = 0;
2992                 }
2993
2994               p->count += 1;
2995               if (r_type == R_C6000_DSBT_INDEX)
2996                 p->pc_count += 1;
2997             }
2998           break;
2999
3000         case R_C6000_SBR_U15_B:
3001         case R_C6000_SBR_U15_H:
3002         case R_C6000_SBR_U15_W:
3003         case R_C6000_SBR_S16:
3004         case R_C6000_SBR_L16_B:
3005         case R_C6000_SBR_L16_H:
3006         case R_C6000_SBR_L16_W:
3007         case R_C6000_SBR_H16_B:
3008         case R_C6000_SBR_H16_H:
3009         case R_C6000_SBR_H16_W:
3010           if (h != NULL && info->executable)
3011             {
3012               /* For B14-relative addresses, we might need a copy
3013                  reloc.  */
3014               h->non_got_ref = 1;
3015             }
3016           break;
3017
3018         default:
3019           break;
3020         }
3021     }
3022
3023   return TRUE;
3024 }
3025
3026 static bfd_boolean
3027 elf32_tic6x_add_symbol_hook (bfd *abfd,
3028                              struct bfd_link_info *info ATTRIBUTE_UNUSED,
3029                              Elf_Internal_Sym *sym,
3030                              const char **namep ATTRIBUTE_UNUSED,
3031                              flagword *flagsp ATTRIBUTE_UNUSED,
3032                              asection **secp,
3033                              bfd_vma *valp)
3034 {
3035   switch (sym->st_shndx)
3036     {
3037     case SHN_TIC6X_SCOMMON:
3038       *secp = bfd_make_section_old_way (abfd, ".scommon");
3039       (*secp)->flags |= SEC_IS_COMMON;
3040       *valp = sym->st_size;
3041       bfd_set_section_alignment (abfd, *secp, bfd_log2 (sym->st_value));
3042       break;
3043     }
3044
3045   return TRUE;
3046 }
3047
3048 static void
3049 elf32_tic6x_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, asymbol *asym)
3050 {
3051   elf_symbol_type *elfsym;
3052
3053   elfsym = (elf_symbol_type *) asym;
3054   switch (elfsym->internal_elf_sym.st_shndx)
3055     {
3056     case SHN_TIC6X_SCOMMON:
3057       if (tic6x_elf_scom_section.name == NULL)
3058         {
3059           /* Initialize the small common section.  */
3060           tic6x_elf_scom_section.name = ".scommon";
3061           tic6x_elf_scom_section.flags = SEC_IS_COMMON;
3062           tic6x_elf_scom_section.output_section = &tic6x_elf_scom_section;
3063           tic6x_elf_scom_section.symbol = &tic6x_elf_scom_symbol;
3064           tic6x_elf_scom_section.symbol_ptr_ptr = &tic6x_elf_scom_symbol_ptr;
3065           tic6x_elf_scom_symbol.name = ".scommon";
3066           tic6x_elf_scom_symbol.flags = BSF_SECTION_SYM;
3067           tic6x_elf_scom_symbol.section = &tic6x_elf_scom_section;
3068           tic6x_elf_scom_symbol_ptr = &tic6x_elf_scom_symbol;
3069         }
3070       asym->section = &tic6x_elf_scom_section;
3071       asym->value = elfsym->internal_elf_sym.st_size;
3072       break;
3073     }
3074 }
3075
3076 static int
3077 elf32_tic6x_link_output_symbol_hook (struct bfd_link_info *info ATTRIBUTE_UNUSED,
3078                                      const char *name ATTRIBUTE_UNUSED,
3079                                      Elf_Internal_Sym *sym,
3080                                      asection *input_sec,
3081                                      struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
3082 {
3083   /* If we see a common symbol, which implies a relocatable link, then
3084      if a symbol was small common in an input file, mark it as small
3085      common in the output file.  */
3086   if (sym->st_shndx == SHN_COMMON && strcmp (input_sec->name, ".scommon") == 0)
3087     sym->st_shndx = SHN_TIC6X_SCOMMON;
3088
3089   return 1;
3090 }
3091
3092 static bfd_boolean
3093 elf32_tic6x_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
3094                                       asection *sec,
3095                                       int *retval)
3096 {
3097   if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
3098     {
3099       *retval = SHN_TIC6X_SCOMMON;
3100       return TRUE;
3101     }
3102
3103   return FALSE;
3104 }
3105
3106 /* Allocate space in .plt, .got and associated reloc sections for
3107    dynamic relocs.  */
3108
3109 static bfd_boolean
3110 elf32_tic6x_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
3111 {
3112   struct bfd_link_info *info;
3113   struct elf32_tic6x_link_hash_table *htab;
3114   struct elf32_tic6x_link_hash_entry *eh;
3115   struct elf_dyn_relocs *p;
3116
3117   if (h->root.type == bfd_link_hash_indirect)
3118     return TRUE;
3119
3120   eh = (struct elf32_tic6x_link_hash_entry *) h;
3121   info = (struct bfd_link_info *) inf;
3122   htab = elf32_tic6x_hash_table (info);
3123
3124   if (htab->elf.dynamic_sections_created && h->plt.refcount > 0)
3125     {
3126       /* Make sure this symbol is output as a dynamic symbol.
3127          Undefined weak syms won't yet be marked as dynamic.  */
3128       if (h->dynindx == -1 && !h->forced_local)
3129         {
3130           if (! bfd_elf_link_record_dynamic_symbol (info, h))
3131             return FALSE;
3132         }
3133
3134       if (info->shared
3135           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
3136         {
3137           asection *s = htab->elf.splt;
3138
3139           /* If this is the first .plt entry, make room for the special
3140              first entry.  */
3141           if (s->size == 0)
3142             s->size += PLT_ENTRY_SIZE;
3143
3144           h->plt.offset = s->size;
3145
3146           /* If this symbol is not defined in a regular file, and we are
3147              not generating a shared library, then set the symbol to this
3148              location in the .plt.  This is required to make function
3149              pointers compare as equal between the normal executable and
3150              the shared library.  */
3151           if (! info->shared && !h->def_regular)
3152             {
3153               h->root.u.def.section = s;
3154               h->root.u.def.value = h->plt.offset;
3155             }
3156
3157           /* Make room for this entry.  */
3158           s->size += PLT_ENTRY_SIZE;
3159           /* We also need to make an entry in the .got.plt section, which
3160              will be placed in the .got section by the linker script.  */
3161           htab->elf.sgotplt->size += 4;
3162           /* We also need to make an entry in the .rel.plt section.  */
3163           htab->elf.srelplt->size += sizeof (Elf32_External_Rela);
3164         }
3165       else
3166         {
3167           h->plt.offset = (bfd_vma) -1;
3168           h->needs_plt = 0;
3169         }
3170     }
3171   else
3172     {
3173       h->plt.offset = (bfd_vma) -1;
3174       h->needs_plt = 0;
3175     }
3176
3177   if (h->got.refcount > 0)
3178     {
3179       asection *s;
3180
3181       /* Make sure this symbol is output as a dynamic symbol.
3182          Undefined weak syms won't yet be marked as dynamic.  */
3183       if (h->dynindx == -1
3184           && !h->forced_local)
3185         {
3186           if (! bfd_elf_link_record_dynamic_symbol (info, h))
3187             return FALSE;
3188         }
3189
3190       s = htab->elf.sgot;
3191       h->got.offset = s->size;
3192       s->size += 4;
3193
3194       if (!(ELF_ST_VISIBILITY (h->other)
3195             && h->root.type == bfd_link_hash_undefweak))
3196         htab->elf.srelgot->size += sizeof (Elf32_External_Rela);
3197     }
3198   else
3199     h->got.offset = (bfd_vma) -1;
3200
3201   if (eh->dyn_relocs == NULL)
3202     return TRUE;
3203
3204   /* Discard relocs on undefined weak syms with non-default
3205      visibility.  */
3206   if (info->shared || elf32_tic6x_using_dsbt (htab->obfd))
3207     {
3208       /* We use the pc_count field to hold the number of
3209          R_C6000_DSBT_INDEX relocs.  */
3210       if (htab->params.dsbt_index != 0)
3211         {
3212           struct elf_dyn_relocs **pp;
3213
3214           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
3215             {
3216               p->count -= p->pc_count;
3217               p->pc_count = 0;
3218               if (p->count == 0)
3219                 *pp = p->next;
3220               else
3221                 pp = &p->next;
3222             }
3223         }
3224
3225       if (eh->dyn_relocs != NULL
3226           && h->root.type == bfd_link_hash_undefweak)
3227         {
3228           if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
3229             eh->dyn_relocs = NULL;
3230
3231           /* Make sure undefined weak symbols are output as a dynamic
3232              symbol in PIEs.  */
3233           else if (h->dynindx == -1
3234                    && !h->forced_local)
3235             {
3236               if (! bfd_elf_link_record_dynamic_symbol (info, h))
3237                 return FALSE;
3238             }
3239         }
3240     }
3241
3242   /* Finally, allocate space.  */
3243   for (p = eh->dyn_relocs; p != NULL; p = p->next)
3244     {
3245       asection *sreloc;
3246
3247       sreloc = elf_section_data (p->sec)->sreloc;
3248
3249       BFD_ASSERT (sreloc != NULL);
3250       sreloc->size += p->count * sizeof (Elf32_External_Rela);
3251     }
3252
3253   return TRUE;
3254 }
3255
3256 /* Find any dynamic relocs that apply to read-only sections.  */
3257
3258 static bfd_boolean
3259 elf32_tic6x_readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
3260 {
3261   struct elf32_tic6x_link_hash_entry *eh;
3262   struct elf_dyn_relocs *p;
3263
3264   eh = (struct elf32_tic6x_link_hash_entry *) h;
3265   for (p = eh->dyn_relocs; p != NULL; p = p->next)
3266     {
3267       asection *s = p->sec->output_section;
3268
3269       if (s != NULL && (s->flags & SEC_READONLY) != 0)
3270         {
3271           struct bfd_link_info *info = (struct bfd_link_info *) inf;
3272
3273           info->flags |= DF_TEXTREL;
3274
3275           /* Not an error, just cut short the traversal.  */
3276           return FALSE;
3277         }
3278     }
3279   return TRUE;
3280 }
3281
3282 /* Set the sizes of the dynamic sections.  */
3283
3284 static bfd_boolean
3285 elf32_tic6x_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
3286 {
3287   struct elf32_tic6x_link_hash_table *htab;
3288   bfd *dynobj;
3289   asection *s;
3290   bfd_boolean relocs;
3291   bfd *ibfd;
3292
3293   htab = elf32_tic6x_hash_table (info);
3294   dynobj = htab->elf.dynobj;
3295   if (dynobj == NULL)
3296     abort ();
3297
3298   if (htab->elf.dynamic_sections_created)
3299     {
3300       /* Set the contents of the .interp section to the interpreter.  */
3301       if (info->executable)
3302         {
3303           s = bfd_get_linker_section (dynobj, ".interp");
3304           if (s == NULL)
3305             abort ();
3306           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3307           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3308         }
3309     }
3310
3311   /* Set up .got offsets for local syms, and space for local dynamic
3312      relocs.  */
3313   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3314     {
3315       bfd_signed_vma *local_got;
3316       bfd_signed_vma *end_local_got;
3317       char *local_tls_type;
3318       bfd_vma *local_tlsdesc_gotent;
3319       bfd_size_type locsymcount;
3320       Elf_Internal_Shdr *symtab_hdr;
3321       asection *srel;
3322
3323       for (s = ibfd->sections; s != NULL; s = s->next)
3324         {
3325           struct elf_dyn_relocs *p;
3326
3327           for (p = ((struct elf_dyn_relocs *)
3328                      elf_section_data (s)->local_dynrel);
3329                p != NULL;
3330                p = p->next)
3331             {
3332               if (!bfd_is_abs_section (p->sec)
3333                   && bfd_is_abs_section (p->sec->output_section))
3334                 {
3335                   /* Input section has been discarded, either because
3336                      it is a copy of a linkonce section or due to
3337                      linker script /DISCARD/, so we'll be discarding
3338                      the relocs too.  */
3339                 }
3340               else if (p->count != 0)
3341                 {
3342                   srel = elf_section_data (p->sec)->sreloc;
3343                   srel->size += p->count * sizeof (Elf32_External_Rela);
3344                   if ((p->sec->output_section->flags & SEC_READONLY) != 0)
3345                     info->flags |= DF_TEXTREL;
3346                 }
3347             }
3348         }
3349
3350       local_got = elf_local_got_refcounts (ibfd);
3351       if (!local_got)
3352         continue;
3353
3354       symtab_hdr = &elf_symtab_hdr (ibfd);
3355       locsymcount = symtab_hdr->sh_info;
3356       end_local_got = local_got + locsymcount;
3357       s = htab->elf.sgot;
3358       srel = htab->elf.srelgot;
3359       for (; local_got < end_local_got;
3360            ++local_got, ++local_tls_type, ++local_tlsdesc_gotent)
3361         {
3362           if (*local_got > 0)
3363             {
3364               *local_got = s->size;
3365               s->size += 4;
3366
3367               if (info->shared || elf32_tic6x_using_dsbt (output_bfd))
3368                 {
3369                   srel->size += sizeof (Elf32_External_Rela);
3370                 }
3371             }
3372           else
3373             *local_got = (bfd_vma) -1;
3374         }
3375     }
3376
3377   /* Allocate global sym .plt and .got entries, and space for global
3378      sym dynamic relocs.  */
3379   elf_link_hash_traverse (&htab->elf, elf32_tic6x_allocate_dynrelocs, info);
3380
3381   /* We now have determined the sizes of the various dynamic sections.
3382      Allocate memory for them.  */
3383   relocs = FALSE;
3384   for (s = dynobj->sections; s != NULL; s = s->next)
3385     {
3386       bfd_boolean strip_section = TRUE;
3387
3388       if ((s->flags & SEC_LINKER_CREATED) == 0)
3389         continue;
3390
3391       if (s == htab->dsbt)
3392         s->size = 4 * htab->params.dsbt_size;
3393       else if (s == htab->elf.splt
3394                || s == htab->elf.sgot
3395                || s == htab->elf.sgotplt
3396                || s == htab->sdynbss)
3397         {
3398           /* Strip this section if we don't need it; see the
3399              comment below.  */
3400           /* We'd like to strip these sections if they aren't needed, but if
3401              we've exported dynamic symbols from them we must leave them.
3402              It's too late to tell BFD to get rid of the symbols.  */
3403
3404           if (htab->elf.hplt != NULL)
3405             strip_section = FALSE;
3406
3407           /* Round up the size of the PLT section to a multiple of 32.  */
3408           if (s == htab->elf.splt && s->size > 0)
3409             s->size = (s->size + 31) & ~(bfd_vma)31;
3410         }
3411       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
3412         {
3413           if (s->size != 0
3414               && s != htab->elf.srelplt)
3415             relocs = TRUE;
3416
3417           /* We use the reloc_count field as a counter if we need
3418              to copy relocs into the output file.  */
3419           s->reloc_count = 0;
3420         }
3421       else
3422         {
3423           /* It's not one of our sections, so don't allocate space.  */
3424           continue;
3425         }
3426
3427       if (s->size == 0)
3428         {
3429           /* If we don't need this section, strip it from the
3430              output file.  This is mostly to handle .rel.bss and
3431              .rel.plt.  We must create both sections in
3432              create_dynamic_sections, because they must be created
3433              before the linker maps input sections to output
3434              sections.  The linker does that before
3435              adjust_dynamic_symbol is called, and it is that
3436              function which decides whether anything needs to go
3437              into these sections.  */
3438           if (strip_section)
3439             s->flags |= SEC_EXCLUDE;
3440           continue;
3441         }
3442
3443       if ((s->flags & SEC_HAS_CONTENTS) == 0)
3444         continue;
3445
3446       /* Allocate memory for the section contents.  We use bfd_zalloc
3447          here in case unused entries are not reclaimed before the
3448          section's contents are written out.  This should not happen,
3449          but this way if it does, we get a R_C6000_NONE reloc instead
3450          of garbage.  */
3451       s->contents = bfd_zalloc (dynobj, s->size);
3452       if (s->contents == NULL)
3453         return FALSE;
3454     }
3455
3456   if (htab->elf.dynamic_sections_created)
3457     {
3458       /* Add some entries to the .dynamic section.  We fill in the
3459          values later, in elf32_tic6x_finish_dynamic_sections, but we
3460          must add the entries now so that we get the correct size for
3461          the .dynamic section.  The DT_DEBUG entry is filled in by the
3462          dynamic linker and used by the debugger.  */
3463 #define add_dynamic_entry(TAG, VAL) \
3464   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3465
3466       if (info->executable)
3467         {
3468           if (!add_dynamic_entry (DT_DEBUG, 0))
3469             return FALSE;
3470         }
3471
3472       if (!add_dynamic_entry (DT_C6000_DSBT_BASE, 0)
3473           || !add_dynamic_entry (DT_C6000_DSBT_SIZE, htab->params.dsbt_size)
3474           || !add_dynamic_entry (DT_C6000_DSBT_INDEX,
3475                                  htab->params.dsbt_index))
3476         return FALSE;
3477
3478       if (htab->elf.splt->size != 0)
3479         {
3480           if (!add_dynamic_entry (DT_PLTGOT, 0)
3481               || !add_dynamic_entry (DT_PLTRELSZ, 0)
3482               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
3483               || !add_dynamic_entry (DT_JMPREL, 0))
3484             return FALSE;
3485         }
3486
3487       if (relocs)
3488         {
3489           if (!add_dynamic_entry (DT_RELA, 0)
3490               || !add_dynamic_entry (DT_RELASZ, 0)
3491               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
3492             return FALSE;
3493
3494           /* If any dynamic relocs apply to a read-only section,
3495              then we need a DT_TEXTREL entry.  */
3496           if ((info->flags & DF_TEXTREL) == 0)
3497             elf_link_hash_traverse (&htab->elf,
3498                                     elf32_tic6x_readonly_dynrelocs, info);
3499
3500           if ((info->flags & DF_TEXTREL) != 0)
3501             {
3502               if (!add_dynamic_entry (DT_TEXTREL, 0))
3503                 return FALSE;
3504             }
3505         }
3506     }
3507 #undef add_dynamic_entry
3508
3509   return TRUE;
3510 }
3511
3512 /* This function is called after all the input files have been read,
3513    and the input sections have been assigned to output sections.  */
3514
3515 static bfd_boolean
3516 elf32_tic6x_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
3517 {
3518   if (elf32_tic6x_using_dsbt (output_bfd) && !info->relocatable
3519       && !bfd_elf_stack_segment_size (output_bfd, info,
3520                                       "__stacksize", DEFAULT_STACK_SIZE))
3521     return FALSE;
3522
3523   return TRUE;
3524 }
3525
3526 static bfd_boolean
3527 elf32_tic6x_finish_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
3528                                      struct bfd_link_info *info)
3529 {
3530   struct elf32_tic6x_link_hash_table *htab;
3531   bfd *dynobj;
3532   asection *sdyn;
3533
3534   htab = elf32_tic6x_hash_table (info);
3535   dynobj = htab->elf.dynobj;
3536   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
3537
3538   if (elf_hash_table (info)->dynamic_sections_created)
3539     {
3540       Elf32_External_Dyn * dyncon;
3541       Elf32_External_Dyn * dynconend;
3542
3543       BFD_ASSERT (sdyn != NULL);
3544
3545       dyncon = (Elf32_External_Dyn *) sdyn->contents;
3546       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
3547
3548       for (; dyncon < dynconend; dyncon++)
3549         {
3550           Elf_Internal_Dyn dyn;
3551           asection *s;
3552
3553           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
3554
3555           switch (dyn.d_tag)
3556             {
3557             default:
3558               break;
3559
3560             case DT_C6000_DSBT_BASE:
3561               s = htab->dsbt;
3562               dyn.d_un.d_ptr = (s->output_section->vma + s->output_offset);
3563               break;
3564
3565             case DT_PLTGOT:
3566               s = htab->elf.sgotplt;
3567               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
3568               break;
3569
3570             case DT_JMPREL:
3571               s = htab->elf.srelplt;
3572               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
3573               break;
3574
3575             case DT_PLTRELSZ:
3576               s = htab->elf.srelplt;
3577               dyn.d_un.d_val = s->size;
3578               break;
3579             }
3580           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
3581         }
3582
3583       /* Fill in the first entry in the procedure linkage table.  */
3584       if (htab->elf.splt && htab->elf.splt->size > 0)
3585         {
3586           bfd_vma got_offs = (htab->elf.sgotplt->output_section->vma
3587                               + htab->elf.sgotplt->output_offset
3588                               - htab->dsbt->output_section->vma
3589                               - htab->dsbt->output_offset) / 4;
3590
3591           /* ldw .D2T2 *+b14[$GOT(0)],b2 */
3592           bfd_put_32 (output_bfd, got_offs << 8 | 0x0100006e,
3593                       htab->elf.splt->contents);
3594           /* ldw .D2T2 *+b14[$GOT(4)],b1 */
3595           bfd_put_32 (output_bfd, (got_offs + 1) << 8 | 0x0080006e,
3596                       htab->elf.splt->contents + 4);
3597           /* nop 3 */
3598           bfd_put_32 (output_bfd, 0x00004000,
3599                       htab->elf.splt->contents + 8);
3600           /* b .s2 b2 */
3601           bfd_put_32 (output_bfd, 0x00080362,
3602                       htab->elf.splt->contents + 12);
3603           /* nop 5 */
3604           bfd_put_32 (output_bfd, 0x00008000,
3605                       htab->elf.splt->contents + 16);
3606
3607           elf_section_data (htab->elf.splt->output_section)
3608             ->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
3609         }
3610     }
3611
3612   return TRUE;
3613 }
3614
3615 /* Return address for Ith PLT stub in section PLT, for relocation REL
3616    or (bfd_vma) -1 if it should not be included.  */
3617
3618 static bfd_vma
3619 elf32_tic6x_plt_sym_val (bfd_vma i, const asection *plt,
3620                          const arelent *rel ATTRIBUTE_UNUSED)
3621 {
3622   return plt->vma + (i + 1) * PLT_ENTRY_SIZE;
3623 }
3624
3625 static int
3626 elf32_tic6x_obj_attrs_arg_type (int tag)
3627 {
3628   if (tag == Tag_ABI_compatibility)
3629     return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL;
3630   else if (tag & 1)
3631     return ATTR_TYPE_FLAG_STR_VAL;
3632   else
3633     return ATTR_TYPE_FLAG_INT_VAL;
3634 }
3635
3636 static int
3637 elf32_tic6x_obj_attrs_order (int num)
3638 {
3639   if (num == LEAST_KNOWN_OBJ_ATTRIBUTE)
3640     return Tag_ABI_conformance;
3641   if ((num - 1) < Tag_ABI_conformance)
3642     return num - 1;
3643   return num;
3644 }
3645
3646 static bfd_boolean
3647 elf32_tic6x_obj_attrs_handle_unknown (bfd *abfd, int tag)
3648 {
3649   if ((tag & 127) < 64)
3650     {
3651       _bfd_error_handler
3652         (_("%B: error: unknown mandatory EABI object attribute %d"),
3653          abfd, tag);
3654       bfd_set_error (bfd_error_bad_value);
3655       return FALSE;
3656     }
3657   else
3658     {
3659       _bfd_error_handler
3660         (_("%B: warning: unknown EABI object attribute %d"),
3661          abfd, tag);
3662       return TRUE;
3663     }
3664 }
3665
3666 /* Merge the Tag_ISA attribute values ARCH1 and ARCH2
3667    and return the merged value.  At present, all merges succeed, so no
3668    return value for errors is defined.  */
3669
3670 int
3671 elf32_tic6x_merge_arch_attributes (int arch1, int arch2)
3672 {
3673   int min_arch, max_arch;
3674
3675   min_arch = (arch1 < arch2 ? arch1 : arch2);
3676   max_arch = (arch1 > arch2 ? arch1 : arch2);
3677
3678   /* In most cases, the numerically greatest value is the correct
3679      merged value, but merging C64 and C67 results in C674X.  */
3680   if ((min_arch == C6XABI_Tag_ISA_C67X
3681        || min_arch == C6XABI_Tag_ISA_C67XP)
3682       && (max_arch == C6XABI_Tag_ISA_C64X
3683           || max_arch == C6XABI_Tag_ISA_C64XP))
3684     return C6XABI_Tag_ISA_C674X;
3685
3686   return max_arch;
3687 }
3688
3689 /* Convert a Tag_ABI_array_object_alignment or
3690    Tag_ABI_array_object_align_expected tag value TAG to a
3691    corresponding alignment value; return the alignment, or -1 for an
3692    unknown tag value.  */
3693
3694 static int
3695 elf32_tic6x_tag_to_array_alignment (int tag)
3696 {
3697   switch (tag)
3698     {
3699     case 0:
3700       return 8;
3701
3702     case 1:
3703       return 4;
3704
3705     case 2:
3706       return 16;
3707
3708     default:
3709       return -1;
3710     }
3711 }
3712
3713 /* Convert a Tag_ABI_array_object_alignment or
3714    Tag_ABI_array_object_align_expected alignment ALIGN to a
3715    corresponding tag value; return the tag value.  */
3716
3717 static int
3718 elf32_tic6x_array_alignment_to_tag (int align)
3719 {
3720   switch (align)
3721     {
3722     case 8:
3723       return 0;
3724
3725     case 4:
3726       return 1;
3727
3728     case 16:
3729       return 2;
3730
3731     default:
3732       abort ();
3733     }
3734 }
3735
3736 /* Merge attributes from IBFD and OBFD, returning TRUE if the merge
3737    succeeded, FALSE otherwise.  */
3738
3739 static bfd_boolean
3740 elf32_tic6x_merge_attributes (bfd *ibfd, bfd *obfd)
3741 {
3742   bfd_boolean result = TRUE;
3743   obj_attribute *in_attr;
3744   obj_attribute *out_attr;
3745   int i;
3746   int array_align_in, array_align_out, array_expect_in, array_expect_out;
3747
3748   if (!elf_known_obj_attributes_proc (obfd)[0].i)
3749     {
3750       /* This is the first object.  Copy the attributes.  */
3751       _bfd_elf_copy_obj_attributes (ibfd, obfd);
3752
3753       out_attr = elf_known_obj_attributes_proc (obfd);
3754
3755       /* Use the Tag_null value to indicate the attributes have been
3756          initialized.  */
3757       out_attr[0].i = 1;
3758
3759       return TRUE;
3760     }
3761
3762   in_attr = elf_known_obj_attributes_proc (ibfd);
3763   out_attr = elf_known_obj_attributes_proc (obfd);
3764
3765   /* No specification yet for handling of unknown attributes, so just
3766      ignore them and handle known ones.  */
3767
3768   if (out_attr[Tag_ABI_stack_align_preserved].i
3769       < in_attr[Tag_ABI_stack_align_needed].i)
3770     {
3771       _bfd_error_handler
3772         (_("error: %B requires more stack alignment than %B preserves"),
3773          ibfd, obfd);
3774       result = FALSE;
3775     }
3776   if (in_attr[Tag_ABI_stack_align_preserved].i
3777       < out_attr[Tag_ABI_stack_align_needed].i)
3778     {
3779       _bfd_error_handler
3780         (_("error: %B requires more stack alignment than %B preserves"),
3781          obfd, ibfd);
3782       result = FALSE;
3783     }
3784
3785   array_align_in = elf32_tic6x_tag_to_array_alignment
3786     (in_attr[Tag_ABI_array_object_alignment].i);
3787   if (array_align_in == -1)
3788     {
3789       _bfd_error_handler
3790         (_("error: unknown Tag_ABI_array_object_alignment value in %B"),
3791          ibfd);
3792       result = FALSE;
3793     }
3794   array_align_out = elf32_tic6x_tag_to_array_alignment
3795     (out_attr[Tag_ABI_array_object_alignment].i);
3796   if (array_align_out == -1)
3797     {
3798       _bfd_error_handler
3799         (_("error: unknown Tag_ABI_array_object_alignment value in %B"),
3800          obfd);
3801       result = FALSE;
3802     }
3803   array_expect_in = elf32_tic6x_tag_to_array_alignment
3804     (in_attr[Tag_ABI_array_object_align_expected].i);
3805   if (array_expect_in == -1)
3806     {
3807       _bfd_error_handler
3808         (_("error: unknown Tag_ABI_array_object_align_expected value in %B"),
3809          ibfd);
3810       result = FALSE;
3811     }
3812   array_expect_out = elf32_tic6x_tag_to_array_alignment
3813     (out_attr[Tag_ABI_array_object_align_expected].i);
3814   if (array_expect_out == -1)
3815     {
3816       _bfd_error_handler
3817         (_("error: unknown Tag_ABI_array_object_align_expected value in %B"),
3818          obfd);
3819       result = FALSE;
3820     }
3821
3822   if (array_align_out < array_expect_in)
3823     {
3824       _bfd_error_handler
3825         (_("error: %B requires more array alignment than %B preserves"),
3826          ibfd, obfd);
3827       result = FALSE;
3828     }
3829   if (array_align_in < array_expect_out)
3830     {
3831       _bfd_error_handler
3832         (_("error: %B requires more array alignment than %B preserves"),
3833          obfd, ibfd);
3834       result = FALSE;
3835     }
3836
3837   for (i = LEAST_KNOWN_OBJ_ATTRIBUTE; i < NUM_KNOWN_OBJ_ATTRIBUTES; i++)
3838     {
3839       switch (i)
3840         {
3841         case Tag_ISA:
3842           out_attr[i].i = elf32_tic6x_merge_arch_attributes (in_attr[i].i,
3843                                                              out_attr[i].i);
3844           break;
3845
3846         case Tag_ABI_wchar_t:
3847           if (out_attr[i].i == 0)
3848             out_attr[i].i = in_attr[i].i;
3849           if (out_attr[i].i != 0
3850               && in_attr[i].i != 0
3851               && out_attr[i].i != in_attr[i].i)
3852             {
3853               _bfd_error_handler
3854                 (_("warning: %B and %B differ in wchar_t size"), obfd, ibfd);
3855             }
3856           break;
3857
3858         case Tag_ABI_stack_align_needed:
3859           if (out_attr[i].i < in_attr[i].i)
3860             out_attr[i].i = in_attr[i].i;
3861           break;
3862
3863         case Tag_ABI_stack_align_preserved:
3864           if (out_attr[i].i > in_attr[i].i)
3865             out_attr[i].i = in_attr[i].i;
3866           break;
3867
3868         case Tag_ABI_DSBT:
3869           if (out_attr[i].i != in_attr[i].i)
3870             {
3871               _bfd_error_handler
3872                 (_("warning: %B and %B differ in whether code is "
3873                    "compiled for DSBT"),
3874                  obfd, ibfd);
3875             }
3876           break;
3877
3878         case Tag_ABI_PIC:
3879         case Tag_ABI_PID:
3880           if (out_attr[i].i > in_attr[i].i)
3881             out_attr[i].i = in_attr[i].i;
3882           break;
3883
3884         case Tag_ABI_array_object_alignment:
3885           if (array_align_out != -1
3886               && array_align_in != -1
3887               && array_align_out > array_align_in)
3888             out_attr[i].i
3889               = elf32_tic6x_array_alignment_to_tag (array_align_in);
3890           break;
3891
3892         case Tag_ABI_array_object_align_expected:
3893           if (array_expect_out != -1
3894               && array_expect_in != -1
3895               && array_expect_out < array_expect_in)
3896             out_attr[i].i
3897               = elf32_tic6x_array_alignment_to_tag (array_expect_in);
3898           break;
3899
3900         case Tag_ABI_conformance:
3901           /* Merging for this attribute is not specified.  As on ARM,
3902              treat a missing attribute as no claim to conform and only
3903              merge identical values.  */
3904           if (out_attr[i].s == NULL
3905               || in_attr[i].s == NULL
3906               || strcmp (out_attr[i].s,
3907                          in_attr[i].s) != 0)
3908             out_attr[i].s = NULL;
3909           break;
3910
3911         case Tag_ABI_compatibility:
3912           /* Merged in _bfd_elf_merge_object_attributes.  */
3913           break;
3914
3915         default:
3916           result
3917             = result && _bfd_elf_merge_unknown_attribute_low (ibfd, obfd, i);
3918           break;
3919         }
3920
3921       if (in_attr[i].type && !out_attr[i].type)
3922         out_attr[i].type = in_attr[i].type;
3923     }
3924
3925   /* Merge Tag_ABI_compatibility attributes and any common GNU ones.  */
3926   if (!_bfd_elf_merge_object_attributes (ibfd, obfd))
3927     return FALSE;
3928
3929   result &= _bfd_elf_merge_unknown_attribute_list (ibfd, obfd);
3930
3931   return result;
3932 }
3933
3934 static bfd_boolean
3935 elf32_tic6x_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
3936 {
3937   if (!_bfd_generic_verify_endian_match (ibfd, obfd))
3938     return FALSE;
3939
3940   if (! is_tic6x_elf (ibfd) || ! is_tic6x_elf (obfd))
3941     return TRUE;
3942
3943   if (!elf32_tic6x_merge_attributes (ibfd, obfd))
3944     return FALSE;
3945
3946   return TRUE;
3947 }
3948
3949 /* Add a new unwind edit to the list described by HEAD, TAIL.  If TINDEX is zero,
3950    adds the edit to the start of the list.  (The list must be built in order of
3951    ascending TINDEX: the function's callers are primarily responsible for
3952    maintaining that condition).  */
3953
3954 static void
3955 elf32_tic6x_add_unwind_table_edit (tic6x_unwind_table_edit **head,
3956                                    tic6x_unwind_table_edit **tail,
3957                                    tic6x_unwind_edit_type type,
3958                                    asection *linked_section,
3959                                    unsigned int tindex)
3960 {
3961   tic6x_unwind_table_edit *new_edit = (tic6x_unwind_table_edit *)
3962       xmalloc (sizeof (tic6x_unwind_table_edit));
3963
3964   new_edit->type = type;
3965   new_edit->linked_section = linked_section;
3966   new_edit->index = tindex;
3967
3968   if (tindex > 0)
3969     {
3970       new_edit->next = NULL;
3971
3972       if (*tail)
3973         (*tail)->next = new_edit;
3974
3975       (*tail) = new_edit;
3976
3977       if (!*head)
3978         (*head) = new_edit;
3979     }
3980   else
3981     {
3982       new_edit->next = *head;
3983
3984       if (!*tail)
3985         *tail = new_edit;
3986
3987       *head = new_edit;
3988     }
3989 }
3990
3991 static _tic6x_elf_section_data *
3992 get_tic6x_elf_section_data (asection * sec)
3993 {
3994   if (sec && sec->owner && is_tic6x_elf (sec->owner))
3995     return elf32_tic6x_section_data (sec);
3996   else
3997     return NULL;
3998 }
3999
4000
4001 /* Increase the size of EXIDX_SEC by ADJUST bytes.  ADJUST must be negative.  */
4002 static void
4003 elf32_tic6x_adjust_exidx_size (asection *exidx_sec, int adjust)
4004 {
4005   asection *out_sec;
4006
4007   if (!exidx_sec->rawsize)
4008     exidx_sec->rawsize = exidx_sec->size;
4009
4010   bfd_set_section_size (exidx_sec->owner, exidx_sec, exidx_sec->size + adjust);
4011   out_sec = exidx_sec->output_section;
4012   /* Adjust size of output section.  */
4013   bfd_set_section_size (out_sec->owner, out_sec, out_sec->size +adjust);
4014 }
4015
4016 /* Insert an EXIDX_CANTUNWIND marker at the end of a section.  */
4017 static void
4018 elf32_tic6x_insert_cantunwind_after (asection *text_sec, asection *exidx_sec)
4019 {
4020   struct _tic6x_elf_section_data *exidx_data;
4021
4022   exidx_data = get_tic6x_elf_section_data (exidx_sec);
4023   elf32_tic6x_add_unwind_table_edit (
4024     &exidx_data->u.exidx.unwind_edit_list,
4025     &exidx_data->u.exidx.unwind_edit_tail,
4026     INSERT_EXIDX_CANTUNWIND_AT_END, text_sec, UINT_MAX);
4027
4028   elf32_tic6x_adjust_exidx_size (exidx_sec, 8);
4029 }
4030
4031 /* Scan .cx6abi.exidx tables, and create a list describing edits which
4032    should be made to those tables, such that:
4033
4034      1. Regions without unwind data are marked with EXIDX_CANTUNWIND entries.
4035      2. Duplicate entries are merged together (EXIDX_CANTUNWIND, or unwind
4036         codes which have been inlined into the index).
4037
4038    If MERGE_EXIDX_ENTRIES is false, duplicate entries are not merged.
4039
4040    The edits are applied when the tables are written
4041    (in elf32_tic6x_write_section).
4042 */
4043
4044 bfd_boolean
4045 elf32_tic6x_fix_exidx_coverage (asection **text_section_order,
4046                                 unsigned int num_text_sections,
4047                                 struct bfd_link_info *info,
4048                                 bfd_boolean merge_exidx_entries)
4049 {
4050   bfd *inp;
4051   unsigned int last_second_word = 0, i;
4052   asection *last_exidx_sec = NULL;
4053   asection *last_text_sec = NULL;
4054   int last_unwind_type = -1;
4055
4056   /* Walk over all EXIDX sections, and create backlinks from the corrsponding
4057      text sections.  */
4058   for (inp = info->input_bfds; inp != NULL; inp = inp->link_next)
4059     {
4060       asection *sec;
4061
4062       for (sec = inp->sections; sec != NULL; sec = sec->next)
4063         {
4064           struct bfd_elf_section_data *elf_sec = elf_section_data (sec);
4065           Elf_Internal_Shdr *hdr = &elf_sec->this_hdr;
4066
4067           if (!hdr || hdr->sh_type != SHT_C6000_UNWIND)
4068             continue;
4069
4070           if (elf_sec->linked_to)
4071             {
4072               Elf_Internal_Shdr *linked_hdr
4073                 = &elf_section_data (elf_sec->linked_to)->this_hdr;
4074               struct _tic6x_elf_section_data *linked_sec_tic6x_data
4075                 = get_tic6x_elf_section_data (linked_hdr->bfd_section);
4076
4077               if (linked_sec_tic6x_data == NULL)
4078                 continue;
4079
4080               /* Link this .c6xabi.exidx section back from the
4081                  text section it describes.  */
4082               linked_sec_tic6x_data->u.text.tic6x_exidx_sec = sec;
4083             }
4084         }
4085     }
4086
4087   /* Walk all text sections in order of increasing VMA.  Eilminate duplicate
4088      index table entries (EXIDX_CANTUNWIND and inlined unwind opcodes),
4089      and add EXIDX_CANTUNWIND entries for sections with no unwind table data.  */
4090
4091   for (i = 0; i < num_text_sections; i++)
4092     {
4093       asection *sec = text_section_order[i];
4094       asection *exidx_sec;
4095       struct _tic6x_elf_section_data *tic6x_data
4096         = get_tic6x_elf_section_data (sec);
4097       struct _tic6x_elf_section_data *exidx_data;
4098       bfd_byte *contents = NULL;
4099       int deleted_exidx_bytes = 0;
4100       bfd_vma j;
4101       tic6x_unwind_table_edit *unwind_edit_head = NULL;
4102       tic6x_unwind_table_edit *unwind_edit_tail = NULL;
4103       Elf_Internal_Shdr *hdr;
4104       bfd *ibfd;
4105
4106       if (tic6x_data == NULL)
4107         continue;
4108
4109       exidx_sec = tic6x_data->u.text.tic6x_exidx_sec;
4110       if (exidx_sec == NULL)
4111         {
4112           /* Section has no unwind data.  */
4113           if (last_unwind_type == 0 || !last_exidx_sec)
4114             continue;
4115
4116           /* Ignore zero sized sections.  */
4117           if (sec->size == 0)
4118             continue;
4119
4120           elf32_tic6x_insert_cantunwind_after (last_text_sec, last_exidx_sec);
4121           last_unwind_type = 0;
4122           continue;
4123         }
4124
4125       /* Skip /DISCARD/ sections.  */
4126       if (bfd_is_abs_section (exidx_sec->output_section))
4127         continue;
4128
4129       hdr = &elf_section_data (exidx_sec)->this_hdr;
4130       if (hdr->sh_type != SHT_C6000_UNWIND)
4131         continue;
4132
4133       exidx_data = get_tic6x_elf_section_data (exidx_sec);
4134       if (exidx_data == NULL)
4135         continue;
4136
4137       ibfd = exidx_sec->owner;
4138
4139       if (hdr->contents != NULL)
4140         contents = hdr->contents;
4141       else if (! bfd_malloc_and_get_section (ibfd, exidx_sec, &contents))
4142         /* An error?  */
4143         continue;
4144
4145       for (j = 0; j < hdr->sh_size; j += 8)
4146         {
4147           unsigned int second_word = bfd_get_32 (ibfd, contents + j + 4);
4148           int unwind_type;
4149           int elide = 0;
4150
4151           /* An EXIDX_CANTUNWIND entry.  */
4152           if (second_word == 1)
4153             {
4154               if (last_unwind_type == 0)
4155                 elide = 1;
4156               unwind_type = 0;
4157             }
4158           /* Inlined unwinding data.  Merge if equal to previous.  */
4159           else if ((second_word & 0x80000000) != 0)
4160             {
4161               if (merge_exidx_entries
4162                   && last_second_word == second_word
4163                   && last_unwind_type == 1)
4164                 elide = 1;
4165               unwind_type = 1;
4166               last_second_word = second_word;
4167             }
4168           /* Normal table entry.  In theory we could merge these too,
4169              but duplicate entries are likely to be much less common.  */
4170           else
4171             unwind_type = 2;
4172
4173           if (elide)
4174             {
4175               elf32_tic6x_add_unwind_table_edit (&unwind_edit_head,
4176                   &unwind_edit_tail, DELETE_EXIDX_ENTRY, NULL, j / 8);
4177
4178               deleted_exidx_bytes += 8;
4179             }
4180
4181           last_unwind_type = unwind_type;
4182         }
4183
4184       /* Free contents if we allocated it ourselves.  */
4185       if (contents != hdr->contents)
4186         free (contents);
4187
4188       /* Record edits to be applied later (in elf32_tic6x_write_section).  */
4189       exidx_data->u.exidx.unwind_edit_list = unwind_edit_head;
4190       exidx_data->u.exidx.unwind_edit_tail = unwind_edit_tail;
4191
4192       if (deleted_exidx_bytes > 0)
4193         elf32_tic6x_adjust_exidx_size (exidx_sec, -deleted_exidx_bytes);
4194
4195       last_exidx_sec = exidx_sec;
4196       last_text_sec = sec;
4197     }
4198
4199   /* Add terminating CANTUNWIND entry.  */
4200   if (last_exidx_sec && last_unwind_type != 0)
4201     elf32_tic6x_insert_cantunwind_after (last_text_sec, last_exidx_sec);
4202
4203   return TRUE;
4204 }
4205
4206 /* Add ADDEND to lower 31 bits of VAL, leaving other bits unmodified.  */
4207
4208 static unsigned long
4209 elf32_tic6x_add_low31 (unsigned long val, bfd_vma addend)
4210 {
4211   return (val & ~0x7ffffffful) | ((val + addend) & 0x7ffffffful);
4212 }
4213
4214 /* Copy an .c6xabi.exidx table entry, adding OFFSET to (applied) PREL31
4215    relocations.  OFFSET is in bytes, and will be scaled before encoding.  */
4216
4217
4218 static void
4219 elf32_tic6x_copy_exidx_entry (bfd *output_bfd, bfd_byte *to, bfd_byte *from,
4220                               bfd_vma offset)
4221 {
4222   unsigned long first_word = bfd_get_32 (output_bfd, from);
4223   unsigned long second_word = bfd_get_32 (output_bfd, from + 4);
4224
4225   offset >>= 1;
4226   /* High bit of first word is supposed to be zero.  */
4227   if ((first_word & 0x80000000ul) == 0)
4228     first_word = elf32_tic6x_add_low31 (first_word, offset);
4229
4230   /* If the high bit of the first word is clear, and the bit pattern is not 0x1
4231      (EXIDX_CANTUNWIND), this is an offset to an .c6xabi.extab entry.  */
4232   if ((second_word != 0x1) && ((second_word & 0x80000000ul) == 0))
4233     second_word = elf32_tic6x_add_low31 (second_word, offset);
4234
4235   bfd_put_32 (output_bfd, first_word, to);
4236   bfd_put_32 (output_bfd, second_word, to + 4);
4237 }
4238
4239 /* Do the actual mangling of exception index tables.  */
4240
4241 static bfd_boolean
4242 elf32_tic6x_write_section (bfd *output_bfd,
4243                          struct bfd_link_info *link_info,
4244                          asection *sec,
4245                          bfd_byte *contents)
4246 {
4247   _tic6x_elf_section_data *tic6x_data;
4248   struct elf32_tic6x_link_hash_table *globals
4249     = elf32_tic6x_hash_table (link_info);
4250   bfd_vma offset = sec->output_section->vma + sec->output_offset;
4251
4252   if (globals == NULL)
4253     return FALSE;
4254
4255   /* If this section has not been allocated an _tic6x_elf_section_data
4256      structure then we cannot record anything.  */
4257   tic6x_data = get_tic6x_elf_section_data (sec);
4258   if (tic6x_data == NULL)
4259     return FALSE;
4260
4261   if (tic6x_data->elf.this_hdr.sh_type != SHT_C6000_UNWIND)
4262     return FALSE;
4263
4264   tic6x_unwind_table_edit *edit_node
4265     = tic6x_data->u.exidx.unwind_edit_list;
4266   /* Now, sec->size is the size of the section we will write.  The original
4267      size (before we merged duplicate entries and inserted EXIDX_CANTUNWIND
4268      markers) was sec->rawsize.  (This isn't the case if we perform no
4269      edits, then rawsize will be zero and we should use size).  */
4270   bfd_byte *edited_contents = (bfd_byte *) bfd_malloc (sec->size);
4271   unsigned int input_size = sec->rawsize ? sec->rawsize : sec->size;
4272   unsigned int in_index, out_index;
4273   bfd_vma add_to_offsets = 0;
4274
4275   for (in_index = 0, out_index = 0; in_index * 8 < input_size || edit_node;)
4276     {
4277       if (edit_node)
4278         {
4279           unsigned int edit_index = edit_node->index;
4280
4281           if (in_index < edit_index && in_index * 8 < input_size)
4282             {
4283               elf32_tic6x_copy_exidx_entry (output_bfd,
4284                   edited_contents + out_index * 8,
4285                   contents + in_index * 8, add_to_offsets);
4286               out_index++;
4287               in_index++;
4288             }
4289           else if (in_index == edit_index
4290                    || (in_index * 8 >= input_size
4291                        && edit_index == UINT_MAX))
4292             {
4293               switch (edit_node->type)
4294                 {
4295                 case DELETE_EXIDX_ENTRY:
4296                   in_index++;
4297                   add_to_offsets += 8;
4298                   break;
4299
4300                 case INSERT_EXIDX_CANTUNWIND_AT_END:
4301                   {
4302                     asection *text_sec = edit_node->linked_section;
4303                     bfd_vma text_offset = text_sec->output_section->vma
4304                                           + text_sec->output_offset
4305                                           + text_sec->size;
4306                     bfd_vma exidx_offset = offset + out_index * 8;
4307                     unsigned long prel31_offset;
4308
4309                     /* Note: this is meant to be equivalent to an
4310                        R_C6000_PREL31 relocation.  These synthetic
4311                        EXIDX_CANTUNWIND markers are not relocated by the
4312                        usual BFD method.  */
4313                     prel31_offset = ((text_offset - exidx_offset) >> 1)
4314                                     & 0x7ffffffful;
4315
4316                     /* First address we can't unwind.  */
4317                     bfd_put_32 (output_bfd, prel31_offset,
4318                                 &edited_contents[out_index * 8]);
4319
4320                     /* Code for EXIDX_CANTUNWIND.  */
4321                     bfd_put_32 (output_bfd, 0x1,
4322                                 &edited_contents[out_index * 8 + 4]);
4323
4324                     out_index++;
4325                     add_to_offsets -= 8;
4326                   }
4327                   break;
4328                 }
4329
4330               edit_node = edit_node->next;
4331             }
4332         }
4333       else
4334         {
4335           /* No more edits, copy remaining entries verbatim.  */
4336           elf32_tic6x_copy_exidx_entry (output_bfd,
4337               edited_contents + out_index * 8,
4338               contents + in_index * 8, add_to_offsets);
4339           out_index++;
4340           in_index++;
4341         }
4342     }
4343
4344   if (!(sec->flags & SEC_EXCLUDE) && !(sec->flags & SEC_NEVER_LOAD))
4345     bfd_set_section_contents (output_bfd, sec->output_section,
4346                               edited_contents,
4347                               (file_ptr) sec->output_offset, sec->size);
4348
4349   return TRUE;
4350 }
4351
4352 static void
4353 elf32_tic6x_set_osabi (bfd *abfd, struct bfd_link_info *link_info)
4354 {
4355   if (link_info != NULL && link_info->relocatable)
4356     return;
4357   _bfd_elf_set_osabi (abfd, link_info);
4358 }
4359
4360 #define TARGET_LITTLE_SYM       bfd_elf32_tic6x_le_vec
4361 #define TARGET_LITTLE_NAME      "elf32-tic6x-le"
4362 #define TARGET_BIG_SYM          bfd_elf32_tic6x_be_vec
4363 #define TARGET_BIG_NAME         "elf32-tic6x-be"
4364 #define ELF_ARCH                bfd_arch_tic6x
4365 #define ELF_TARGET_ID           TIC6X_ELF_DATA
4366 #define ELF_MACHINE_CODE        EM_TI_C6000
4367 #define ELF_MAXPAGESIZE         0x1000
4368 #define bfd_elf32_bfd_reloc_type_lookup elf32_tic6x_reloc_type_lookup
4369 #define bfd_elf32_bfd_reloc_name_lookup elf32_tic6x_reloc_name_lookup
4370 #define bfd_elf32_bfd_merge_private_bfd_data    elf32_tic6x_merge_private_bfd_data
4371 #define bfd_elf32_mkobject              elf32_tic6x_mkobject
4372 #define bfd_elf32_bfd_link_hash_table_create  elf32_tic6x_link_hash_table_create
4373 #define bfd_elf32_new_section_hook      elf32_tic6x_new_section_hook
4374 #define elf_backend_stack_align         8
4375 #define elf_backend_can_gc_sections     1
4376 #define elf_backend_default_use_rela_p  1
4377 #define elf_backend_may_use_rel_p       1
4378 #define elf_backend_may_use_rela_p      1
4379 #define elf_backend_obj_attrs_arg_type  elf32_tic6x_obj_attrs_arg_type
4380 #define elf_backend_obj_attrs_handle_unknown    elf32_tic6x_obj_attrs_handle_unknown
4381 #define elf_backend_obj_attrs_order     elf32_tic6x_obj_attrs_order
4382 #define elf_backend_obj_attrs_section   ".c6xabi.attributes"
4383 #define elf_backend_obj_attrs_section_type      SHT_C6000_ATTRIBUTES
4384 #define elf_backend_obj_attrs_vendor    "c6xabi"
4385 #define elf_backend_can_refcount        1
4386 #define elf_backend_want_got_plt        1
4387 #define elf_backend_want_dynbss         1
4388 #define elf_backend_plt_readonly        1
4389 #define elf_backend_rela_normal         1
4390 #define elf_backend_got_header_size     8
4391 #define elf_backend_fake_sections       elf32_tic6x_fake_sections
4392 #define elf_backend_gc_sweep_hook       elf32_tic6x_gc_sweep_hook
4393 #define elf_backend_gc_mark_extra_sections elf32_tic6x_gc_mark_extra_sections
4394 #define elf_backend_create_dynamic_sections \
4395   elf32_tic6x_create_dynamic_sections
4396 #define elf_backend_adjust_dynamic_symbol \
4397   elf32_tic6x_adjust_dynamic_symbol
4398 #define elf_backend_check_relocs        elf32_tic6x_check_relocs
4399 #define elf_backend_add_symbol_hook     elf32_tic6x_add_symbol_hook
4400 #define elf_backend_symbol_processing   elf32_tic6x_symbol_processing
4401 #define elf_backend_link_output_symbol_hook \
4402   elf32_tic6x_link_output_symbol_hook
4403 #define elf_backend_section_from_bfd_section \
4404   elf32_tic6x_section_from_bfd_section
4405 #define elf_backend_relocate_section    elf32_tic6x_relocate_section
4406 #define elf_backend_relocs_compatible   _bfd_elf_relocs_compatible
4407 #define elf_backend_finish_dynamic_symbol \
4408   elf32_tic6x_finish_dynamic_symbol
4409 #define elf_backend_always_size_sections \
4410   elf32_tic6x_always_size_sections
4411 #define elf_backend_size_dynamic_sections \
4412   elf32_tic6x_size_dynamic_sections
4413 #define elf_backend_finish_dynamic_sections \
4414   elf32_tic6x_finish_dynamic_sections
4415 #define bfd_elf32_bfd_final_link \
4416         elf32_tic6x_final_link
4417 #define elf_backend_write_section       elf32_tic6x_write_section
4418 #define elf_info_to_howto               elf32_tic6x_info_to_howto
4419 #define elf_info_to_howto_rel           elf32_tic6x_info_to_howto_rel
4420
4421 #undef elf_backend_omit_section_dynsym
4422 #define elf_backend_omit_section_dynsym elf32_tic6x_link_omit_section_dynsym
4423 #define elf_backend_plt_sym_val         elf32_tic6x_plt_sym_val
4424
4425 #include "elf32-target.h"
4426
4427 #undef elf32_bed
4428 #define elf32_bed               elf32_tic6x_linux_bed
4429
4430 #undef TARGET_LITTLE_SYM
4431 #define TARGET_LITTLE_SYM               bfd_elf32_tic6x_linux_le_vec
4432 #undef TARGET_LITTLE_NAME
4433 #define TARGET_LITTLE_NAME              "elf32-tic6x-linux-le"
4434 #undef TARGET_BIG_SYM
4435 #define TARGET_BIG_SYM                  bfd_elf32_tic6x_linux_be_vec
4436 #undef TARGET_BIG_NAME
4437 #define TARGET_BIG_NAME                 "elf32-tic6x-linux-be"
4438 #undef ELF_OSABI
4439 #define ELF_OSABI                       ELFOSABI_C6000_LINUX
4440
4441 #undef elf_backend_post_process_headers
4442 #define elf_backend_post_process_headers        elf32_tic6x_set_osabi
4443
4444 #include "elf32-target.h"
4445
4446 #undef elf32_bed
4447 #define elf32_bed               elf32_tic6x_elf_bed
4448
4449 #undef TARGET_LITTLE_SYM
4450 #define TARGET_LITTLE_SYM               bfd_elf32_tic6x_elf_le_vec
4451 #undef TARGET_LITTLE_NAME
4452 #define TARGET_LITTLE_NAME              "elf32-tic6x-elf-le"
4453 #undef TARGET_BIG_SYM
4454 #define TARGET_BIG_SYM                  bfd_elf32_tic6x_elf_be_vec
4455 #undef TARGET_BIG_NAME
4456 #define TARGET_BIG_NAME                 "elf32-tic6x-elf-be"
4457 #undef ELF_OSABI
4458 #define ELF_OSABI                       ELFOSABI_C6000_ELFABI
4459
4460 #undef elf_backend_post_process_headers
4461 #define elf_backend_post_process_headers        elf32_tic6x_set_osabi
4462
4463 #include "elf32-target.h"