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