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