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