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