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