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