Upload Tizen:Base source
[external/binutils.git] / bfd / coff-tic54x.c
1 /* BFD back-end for TMS320C54X coff binaries.
2    Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008
3    Free Software Foundation, Inc.
4    Contributed by Timothy Wall (twall@cygnus.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, MA
21    02110-1301, USA.  */
22
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "libbfd.h"
26 #include "bfdlink.h"
27 #include "coff/tic54x.h"
28 #include "coff/internal.h"
29 #include "libcoff.h"
30
31 #undef  F_LSYMS
32 #define F_LSYMS         F_LSYMS_TICOFF
33
34 static void tic54x_reloc_processing
35   PARAMS ((arelent *, struct internal_reloc *, asymbol **, bfd *, asection *));
36 static bfd_reloc_status_type tic54x_relocation
37   PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
38 static bfd_boolean tic54x_set_section_contents
39   PARAMS ((bfd *, sec_ptr, const PTR, file_ptr, bfd_size_type));
40 static reloc_howto_type *coff_tic54x_rtype_to_howto
41   PARAMS ((bfd *, asection *, struct internal_reloc *, struct coff_link_hash_entry *, struct internal_syment *, bfd_vma *));
42 static bfd_boolean tic54x_set_arch_mach
43   PARAMS ((bfd *, enum bfd_architecture, unsigned long));
44 static reloc_howto_type * tic54x_coff_reloc_type_lookup
45   PARAMS ((bfd *, bfd_reloc_code_real_type));
46 static void tic54x_lookup_howto
47   PARAMS ((arelent *, struct internal_reloc *));
48 static bfd_boolean ticoff_bfd_is_local_label_name
49   PARAMS ((bfd *, const char *));
50
51 /* 32-bit operations
52    The octet order is screwy.  words are LSB first (LS octet, actually), but
53    longwords are MSW first.  For example, 0x12345678 is encoded 0x5678 in the
54    first word and 0x1234 in the second.  When looking at the data as stored in
55    the COFF file, you would see the octets ordered as 0x78, 0x56, 0x34, 0x12.
56    Don't bother with 64-bits, as there aren't any.  */
57
58 static bfd_vma
59 tic54x_getl32 (const void *p)
60 {
61   const bfd_byte *addr = p;
62   unsigned long v;
63
64   v  = (unsigned long) addr[2];
65   v |= (unsigned long) addr[3] << 8;
66   v |= (unsigned long) addr[0] << 16;
67   v |= (unsigned long) addr[1] << 24;
68   return v;
69 }
70
71 static void
72 tic54x_putl32 (bfd_vma data, void *p)
73 {
74   bfd_byte *addr = p;
75   addr[2] = data & 0xff;
76   addr[3] = (data >>  8) & 0xff;
77   addr[0] = (data >> 16) & 0xff;
78   addr[1] = (data >> 24) & 0xff;
79 }
80
81 static bfd_signed_vma
82 tic54x_getl_signed_32 (const void *p)
83 {
84   const bfd_byte *addr = p;
85   unsigned long v;
86
87   v  = (unsigned long) addr[2];
88   v |= (unsigned long) addr[3] << 8;
89   v |= (unsigned long) addr[0] << 16;
90   v |= (unsigned long) addr[1] << 24;
91 #define COERCE32(x) \
92   ((bfd_signed_vma) (long) (((unsigned long) (x) ^ 0x80000000) - 0x80000000))
93   return COERCE32 (v);
94 }
95
96 #define coff_get_section_load_page bfd_ticoff_get_section_load_page
97 #define coff_set_section_load_page bfd_ticoff_set_section_load_page
98
99 void
100 bfd_ticoff_set_section_load_page (sect, page)
101   asection *sect;
102   int page;
103 {
104   sect->lma = (sect->lma & ADDR_MASK) | PG_TO_FLAG(page);
105 }
106
107 int
108 bfd_ticoff_get_section_load_page (sect)
109   asection *sect;
110 {
111   int page;
112
113   /* Provide meaningful defaults for predefined sections.  */
114   if (sect == &bfd_com_section)
115     page = PG_DATA;
116
117   else if (sect == &bfd_und_section
118       || sect == &bfd_abs_section
119       || sect == &bfd_ind_section)
120     page = PG_PROG;
121
122   else
123     page = FLAG_TO_PG (sect->lma);
124
125   return page;
126 }
127
128 /* Set the architecture appropriately.  Allow unkown architectures
129    (e.g. binary).  */
130
131 static bfd_boolean
132 tic54x_set_arch_mach (abfd, arch, machine)
133      bfd *abfd;
134      enum bfd_architecture arch;
135      unsigned long machine;
136 {
137   if (arch == bfd_arch_unknown)
138     arch = bfd_arch_tic54x;
139
140   else if (arch != bfd_arch_tic54x)
141     return FALSE;
142
143   return bfd_default_set_arch_mach (abfd, arch, machine);
144 }
145
146 static bfd_reloc_status_type
147 tic54x_relocation (abfd, reloc_entry, symbol, data, input_section,
148                    output_bfd, error_message)
149   bfd *abfd ATTRIBUTE_UNUSED;
150   arelent *reloc_entry;
151   asymbol *symbol ATTRIBUTE_UNUSED;
152   PTR data ATTRIBUTE_UNUSED;
153   asection *input_section;
154   bfd *output_bfd;
155   char **error_message ATTRIBUTE_UNUSED;
156 {
157   if (output_bfd != (bfd *) NULL)
158     {
159       /* This is a partial relocation, and we want to apply the
160          relocation to the reloc entry rather than the raw data.
161          Modify the reloc inplace to reflect what we now know.  */
162       reloc_entry->address += input_section->output_offset;
163       return bfd_reloc_ok;
164     }
165   return bfd_reloc_continue;
166 }
167
168 reloc_howto_type tic54x_howto_table[] =
169   {
170     /* type,rightshift,size (0=byte, 1=short, 2=long),
171        bit size, pc_relative, bitpos, dont complain_on_overflow,
172        special_function, name, partial_inplace, src_mask, dst_mask, pcrel_offset.  */
173
174     /* NORMAL BANK */
175     /* 16-bit direct reference to symbol's address.  */
176     HOWTO (R_RELWORD,0,1,16,FALSE,0,complain_overflow_dont,
177            tic54x_relocation,"REL16",FALSE,0xFFFF,0xFFFF,FALSE),
178
179     /* 7 LSBs of an address */
180     HOWTO (R_PARTLS7,0,1,7,FALSE,0,complain_overflow_dont,
181            tic54x_relocation,"LS7",FALSE,0x007F,0x007F,FALSE),
182
183     /* 9 MSBs of an address */
184     /* TI assembler doesn't shift its encoding, and is thus incompatible */
185     HOWTO (R_PARTMS9,7,1,9,FALSE,0,complain_overflow_dont,
186            tic54x_relocation,"MS9",FALSE,0x01FF,0x01FF,FALSE),
187
188     /* 23-bit relocation */
189     HOWTO (R_EXTWORD,0,2,23,FALSE,0,complain_overflow_dont,
190            tic54x_relocation,"RELEXT",FALSE,0x7FFFFF,0x7FFFFF,FALSE),
191
192     /* 16 bits of 23-bit extended address */
193     HOWTO (R_EXTWORD16,0,1,16,FALSE,0,complain_overflow_dont,
194            tic54x_relocation,"RELEXT16",FALSE,0x7FFFFF,0x7FFFFF,FALSE),
195
196     /* upper 7 bits of 23-bit extended address */
197     HOWTO (R_EXTWORDMS7,16,1,7,FALSE,0,complain_overflow_dont,
198            tic54x_relocation,"RELEXTMS7",FALSE,0x7F,0x7F,FALSE),
199
200     /* ABSOLUTE BANK */
201     /* 16-bit direct reference to symbol's address, absolute */
202     HOWTO (R_RELWORD,0,1,16,FALSE,0,complain_overflow_dont,
203            tic54x_relocation,"AREL16",FALSE,0xFFFF,0xFFFF,FALSE),
204
205     /* 7 LSBs of an address, absolute */
206     HOWTO (R_PARTLS7,0,1,7,FALSE,0,complain_overflow_dont,
207            tic54x_relocation,"ALS7",FALSE,0x007F,0x007F,FALSE),
208
209     /* 9 MSBs of an address, absolute */
210     /* TI assembler doesn't shift its encoding, and is thus incompatible */
211     HOWTO (R_PARTMS9,7,1,9,FALSE,0,complain_overflow_dont,
212            tic54x_relocation,"AMS9",FALSE,0x01FF,0x01FF,FALSE),
213
214     /* 23-bit direct reference, absolute */
215     HOWTO (R_EXTWORD,0,2,23,FALSE,0,complain_overflow_dont,
216            tic54x_relocation,"ARELEXT",FALSE,0x7FFFFF,0x7FFFFF,FALSE),
217
218     /* 16 bits of 23-bit extended address, absolute */
219     HOWTO (R_EXTWORD16,0,1,16,FALSE,0,complain_overflow_dont,
220            tic54x_relocation,"ARELEXT16",FALSE,0x7FFFFF,0x7FFFFF,FALSE),
221
222     /* upper 7 bits of 23-bit extended address, absolute */
223     HOWTO (R_EXTWORDMS7,16,1,7,FALSE,0,complain_overflow_dont,
224            tic54x_relocation,"ARELEXTMS7",FALSE,0x7F,0x7F,FALSE),
225
226     /* 32-bit relocation exclusively for stabs */
227     HOWTO (R_RELLONG,0,2,32,FALSE,0,complain_overflow_dont,
228            tic54x_relocation,"STAB",FALSE,0xFFFFFFFF,0xFFFFFFFF,FALSE),
229   };
230
231 #define coff_bfd_reloc_type_lookup tic54x_coff_reloc_type_lookup
232 #define coff_bfd_reloc_name_lookup tic54x_coff_reloc_name_lookup
233
234 /* For the case statement use the code values used tc_gen_reloc (defined in
235    bfd/reloc.c) to map to the howto table entries.  */
236
237 reloc_howto_type *
238 tic54x_coff_reloc_type_lookup (abfd, code)
239      bfd *abfd ATTRIBUTE_UNUSED;
240      bfd_reloc_code_real_type code;
241 {
242   switch (code)
243     {
244     case BFD_RELOC_16:
245       return &tic54x_howto_table[0];
246     case BFD_RELOC_TIC54X_PARTLS7:
247       return &tic54x_howto_table[1];
248     case BFD_RELOC_TIC54X_PARTMS9:
249       return &tic54x_howto_table[2];
250     case BFD_RELOC_TIC54X_23:
251       return &tic54x_howto_table[3];
252     case BFD_RELOC_TIC54X_16_OF_23:
253       return &tic54x_howto_table[4];
254     case BFD_RELOC_TIC54X_MS7_OF_23:
255       return &tic54x_howto_table[5];
256     case BFD_RELOC_32:
257       return &tic54x_howto_table[12];
258     default:
259       return (reloc_howto_type *) NULL;
260     }
261 }
262
263 static reloc_howto_type *
264 tic54x_coff_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
265                                const char *r_name)
266 {
267   unsigned int i;
268
269   for (i = 0;
270        i < sizeof (tic54x_howto_table) / sizeof (tic54x_howto_table[0]);
271        i++)
272     if (tic54x_howto_table[i].name != NULL
273         && strcasecmp (tic54x_howto_table[i].name, r_name) == 0)
274       return &tic54x_howto_table[i];
275
276   return NULL;
277 }
278
279 /* Code to turn a r_type into a howto ptr, uses the above howto table.
280    Called after some initial checking by the tic54x_rtype_to_howto fn below.  */
281
282 static void
283 tic54x_lookup_howto (internal, dst)
284      arelent *internal;
285      struct internal_reloc *dst;
286 {
287   unsigned i;
288   int bank = (dst->r_symndx == -1) ? HOWTO_BANK : 0;
289
290   for (i = 0; i < sizeof tic54x_howto_table/sizeof tic54x_howto_table[0]; i++)
291     {
292       if (tic54x_howto_table[i].type == dst->r_type)
293         {
294           internal->howto = tic54x_howto_table + i + bank;
295           return;
296         }
297     }
298
299   (*_bfd_error_handler) (_("Unrecognized reloc type 0x%x"),
300                          (unsigned int) dst->r_type);
301   abort ();
302 }
303
304 #define RELOC_PROCESSING(RELENT,RELOC,SYMS,ABFD,SECT)\
305  tic54x_reloc_processing(RELENT,RELOC,SYMS,ABFD,SECT)
306
307 #define coff_rtype_to_howto coff_tic54x_rtype_to_howto
308
309 static reloc_howto_type *
310 coff_tic54x_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
311      bfd *abfd ATTRIBUTE_UNUSED;
312      asection *sec;
313      struct internal_reloc *rel;
314      struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
315      struct internal_syment *sym ATTRIBUTE_UNUSED;
316      bfd_vma *addendp;
317 {
318   arelent genrel;
319
320   if (rel->r_symndx == -1 && addendp != NULL)
321     {
322       /* This is a TI "internal relocation", which means that the relocation
323          amount is the amount by which the current section is being relocated
324          in the output section.  */
325       *addendp = (sec->output_section->vma + sec->output_offset) - sec->vma;
326     }
327
328   tic54x_lookup_howto (&genrel, rel);
329
330   return genrel.howto;
331 }
332
333 /* Replace the stock _bfd_coff_is_local_label_name to recognize TI COFF local
334    labels.  */
335
336 static bfd_boolean
337 ticoff_bfd_is_local_label_name (abfd, name)
338   bfd *abfd ATTRIBUTE_UNUSED;
339   const char *name;
340 {
341   if (TICOFF_LOCAL_LABEL_P(name))
342     return TRUE;
343   return FALSE;
344 }
345
346 #define coff_bfd_is_local_label_name ticoff_bfd_is_local_label_name
347
348 /* Clear the r_reserved field in relocs.  */
349 #define SWAP_OUT_RELOC_EXTRA(abfd,src,dst) \
350   do \
351     { \
352       dst->r_reserved[0] = 0; \
353       dst->r_reserved[1] = 0; \
354     } \
355   while (0)
356
357 /* Customize coffcode.h; the default coff_ functions are set up to use COFF2;
358    coff_bad_format_hook uses BADMAG, so set that for COFF2.  The COFF1
359    and COFF0 vectors use custom _bad_format_hook procs instead of setting
360    BADMAG.  */
361 #define BADMAG(x) COFF2_BADMAG(x)
362
363 #ifndef bfd_pe_print_pdata
364 #define bfd_pe_print_pdata      NULL
365 #endif
366
367 #include "coffcode.h"
368
369 static bfd_boolean
370 tic54x_set_section_contents (abfd, section, location, offset, bytes_to_do)
371      bfd *abfd;
372      sec_ptr section;
373      const PTR location;
374      file_ptr offset;
375      bfd_size_type bytes_to_do;
376 {
377   return coff_set_section_contents (abfd, section, location,
378                                     offset, bytes_to_do);
379 }
380
381 static void
382 tic54x_reloc_processing (relent, reloc, symbols, abfd, section)
383      arelent *relent;
384      struct internal_reloc *reloc;
385      asymbol **symbols;
386      bfd *abfd;
387      asection *section;
388 {
389   asymbol *ptr;
390
391   relent->address = reloc->r_vaddr;
392
393   if (reloc->r_symndx != -1)
394     {
395       if (reloc->r_symndx < 0 || reloc->r_symndx >= obj_conv_table_size (abfd))
396         {
397           (*_bfd_error_handler)
398             (_("%B: warning: illegal symbol index %ld in relocs"),
399              abfd, reloc->r_symndx);
400           relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
401           ptr = NULL;
402         }
403       else
404         {
405           relent->sym_ptr_ptr = (symbols
406                                  + obj_convert (abfd)[reloc->r_symndx]);
407           ptr = *(relent->sym_ptr_ptr);
408         }
409     }
410   else
411     {
412       relent->sym_ptr_ptr = section->symbol_ptr_ptr;
413       ptr = *(relent->sym_ptr_ptr);
414     }
415
416   /* The symbols definitions that we have read in have been
417      relocated as if their sections started at 0. But the offsets
418      refering to the symbols in the raw data have not been
419      modified, so we have to have a negative addend to compensate.
420
421      Note that symbols which used to be common must be left alone.  */
422
423   /* Calculate any reloc addend by looking at the symbol.  */
424   CALC_ADDEND (abfd, ptr, *reloc, relent);
425
426   relent->address -= section->vma;
427   /* !!     relent->section = (asection *) NULL;*/
428
429   /* Fill in the relent->howto field from reloc->r_type.  */
430   tic54x_lookup_howto (relent, reloc);
431 }
432
433 /* TI COFF v0, DOS tools (little-endian headers).  */
434 const bfd_target tic54x_coff0_vec =
435   {
436     "coff0-c54x",                       /* name */
437     bfd_target_coff_flavour,
438     BFD_ENDIAN_LITTLE,          /* data byte order is little */
439     BFD_ENDIAN_LITTLE,          /* header byte order is little (DOS tools) */
440
441     (HAS_RELOC | EXEC_P |               /* object flags */
442      HAS_LINENO | HAS_DEBUG |
443      HAS_SYMS | HAS_LOCALS | WP_TEXT ),
444
445     (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
446     '_',                                /* leading symbol underscore */
447     '/',                                /* ar_pad_char */
448     15,                         /* ar_max_namelen */
449     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
450     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
451     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
452     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
453     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
454     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
455
456     {_bfd_dummy_target, coff_object_p,  /* bfd_check_format */
457      bfd_generic_archive_p, _bfd_dummy_target},
458     {bfd_false, coff_mkobject, _bfd_generic_mkarchive,  /* bfd_set_format */
459      bfd_false},
460     {bfd_false, coff_write_object_contents,     /* bfd_write_contents */
461      _bfd_write_archive_contents, bfd_false},
462
463     BFD_JUMP_TABLE_GENERIC (coff),
464     BFD_JUMP_TABLE_COPY (coff),
465     BFD_JUMP_TABLE_CORE (_bfd_nocore),
466     BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
467     BFD_JUMP_TABLE_SYMBOLS (coff),
468     BFD_JUMP_TABLE_RELOCS (coff),
469     BFD_JUMP_TABLE_WRITE (tic54x),
470     BFD_JUMP_TABLE_LINK (coff),
471     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
472     NULL,
473
474     (PTR) & ticoff0_swap_table
475   };
476
477 /* TI COFF v0, SPARC tools (big-endian headers).  */
478 const bfd_target tic54x_coff0_beh_vec =
479   {
480     "coff0-beh-c54x",                   /* name */
481     bfd_target_coff_flavour,
482     BFD_ENDIAN_LITTLE,          /* data byte order is little */
483     BFD_ENDIAN_BIG,             /* header byte order is big */
484
485     (HAS_RELOC | EXEC_P |               /* object flags */
486      HAS_LINENO | HAS_DEBUG |
487      HAS_SYMS | HAS_LOCALS | WP_TEXT ),
488
489     (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
490     '_',                                /* leading symbol underscore */
491     '/',                                /* ar_pad_char */
492     15,                         /* ar_max_namelen */
493     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
494     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
495     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
496     bfd_getb64, bfd_getb_signed_64, bfd_putb64,
497     bfd_getb32, bfd_getb_signed_32, bfd_putb32,
498     bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
499
500     {_bfd_dummy_target, coff_object_p,  /* bfd_check_format */
501      bfd_generic_archive_p, _bfd_dummy_target},
502     {bfd_false, coff_mkobject, _bfd_generic_mkarchive,  /* bfd_set_format */
503      bfd_false},
504     {bfd_false, coff_write_object_contents,     /* bfd_write_contents */
505      _bfd_write_archive_contents, bfd_false},
506
507     BFD_JUMP_TABLE_GENERIC (coff),
508     BFD_JUMP_TABLE_COPY (coff),
509     BFD_JUMP_TABLE_CORE (_bfd_nocore),
510     BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
511     BFD_JUMP_TABLE_SYMBOLS (coff),
512     BFD_JUMP_TABLE_RELOCS (coff),
513     BFD_JUMP_TABLE_WRITE (tic54x),
514     BFD_JUMP_TABLE_LINK (coff),
515     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
516
517     & tic54x_coff0_vec,
518
519     (PTR) & ticoff0_swap_table
520   };
521
522 /* TI COFF v1, DOS tools (little-endian headers).  */
523 const bfd_target tic54x_coff1_vec =
524   {
525     "coff1-c54x",                       /* name */
526     bfd_target_coff_flavour,
527     BFD_ENDIAN_LITTLE,          /* data byte order is little */
528     BFD_ENDIAN_LITTLE,          /* header byte order is little (DOS tools) */
529
530     (HAS_RELOC | EXEC_P |               /* object flags */
531      HAS_LINENO | HAS_DEBUG |
532      HAS_SYMS | HAS_LOCALS | WP_TEXT ),
533
534     (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
535     '_',                                /* leading symbol underscore */
536     '/',                                /* ar_pad_char */
537     15,                         /* ar_max_namelen */
538     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
539     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
540     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
541     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
542     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
543     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
544
545     {_bfd_dummy_target, coff_object_p,  /* bfd_check_format */
546      bfd_generic_archive_p, _bfd_dummy_target},
547     {bfd_false, coff_mkobject, _bfd_generic_mkarchive,  /* bfd_set_format */
548      bfd_false},
549     {bfd_false, coff_write_object_contents,     /* bfd_write_contents */
550      _bfd_write_archive_contents, bfd_false},
551
552     BFD_JUMP_TABLE_GENERIC (coff),
553     BFD_JUMP_TABLE_COPY (coff),
554     BFD_JUMP_TABLE_CORE (_bfd_nocore),
555     BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
556     BFD_JUMP_TABLE_SYMBOLS (coff),
557     BFD_JUMP_TABLE_RELOCS (coff),
558     BFD_JUMP_TABLE_WRITE (tic54x),
559     BFD_JUMP_TABLE_LINK (coff),
560     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
561
562     & tic54x_coff0_beh_vec,
563
564     (PTR) & ticoff1_swap_table
565 };
566
567 /* TI COFF v1, SPARC tools (big-endian headers).  */
568 const bfd_target tic54x_coff1_beh_vec =
569   {
570     "coff1-beh-c54x",                   /* name */
571     bfd_target_coff_flavour,
572     BFD_ENDIAN_LITTLE,          /* data byte order is little */
573     BFD_ENDIAN_BIG,             /* header byte order is big */
574
575     (HAS_RELOC | EXEC_P |               /* object flags */
576      HAS_LINENO | HAS_DEBUG |
577      HAS_SYMS | HAS_LOCALS | WP_TEXT ),
578
579     (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
580     '_',                                /* leading symbol underscore */
581     '/',                                /* ar_pad_char */
582     15,                         /* ar_max_namelen */
583     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
584     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
585     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
586     bfd_getb64, bfd_getb_signed_64, bfd_putb64,
587     bfd_getb32, bfd_getb_signed_32, bfd_putb32,
588     bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
589
590     {_bfd_dummy_target, coff_object_p,  /* bfd_check_format */
591      bfd_generic_archive_p, _bfd_dummy_target},
592     {bfd_false, coff_mkobject, _bfd_generic_mkarchive,  /* bfd_set_format */
593      bfd_false},
594     {bfd_false, coff_write_object_contents,     /* bfd_write_contents */
595      _bfd_write_archive_contents, bfd_false},
596
597     BFD_JUMP_TABLE_GENERIC (coff),
598     BFD_JUMP_TABLE_COPY (coff),
599     BFD_JUMP_TABLE_CORE (_bfd_nocore),
600     BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
601     BFD_JUMP_TABLE_SYMBOLS (coff),
602     BFD_JUMP_TABLE_RELOCS (coff),
603     BFD_JUMP_TABLE_WRITE (tic54x),
604     BFD_JUMP_TABLE_LINK (coff),
605     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
606
607     & tic54x_coff1_vec,
608
609     (PTR) & ticoff1_swap_table
610   };
611
612 /* TI COFF v2, TI DOS tools output (little-endian headers).  */
613 const bfd_target tic54x_coff2_vec =
614   {
615     "coff2-c54x",                       /* name */
616     bfd_target_coff_flavour,
617     BFD_ENDIAN_LITTLE,          /* data byte order is little */
618     BFD_ENDIAN_LITTLE,          /* header byte order is little (DOS tools) */
619
620     (HAS_RELOC | EXEC_P |               /* object flags */
621      HAS_LINENO | HAS_DEBUG |
622      HAS_SYMS | HAS_LOCALS | WP_TEXT ),
623
624     (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
625     '_',                                /* leading symbol underscore */
626     '/',                                /* ar_pad_char */
627     15,                         /* ar_max_namelen */
628     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
629     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
630     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
631     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
632     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
633     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
634
635     {_bfd_dummy_target, coff_object_p,  /* bfd_check_format */
636      bfd_generic_archive_p, _bfd_dummy_target},
637     {bfd_false, coff_mkobject, _bfd_generic_mkarchive,  /* bfd_set_format */
638      bfd_false},
639     {bfd_false, coff_write_object_contents,     /* bfd_write_contents */
640      _bfd_write_archive_contents, bfd_false},
641
642     BFD_JUMP_TABLE_GENERIC (coff),
643     BFD_JUMP_TABLE_COPY (coff),
644     BFD_JUMP_TABLE_CORE (_bfd_nocore),
645     BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
646     BFD_JUMP_TABLE_SYMBOLS (coff),
647     BFD_JUMP_TABLE_RELOCS (coff),
648     BFD_JUMP_TABLE_WRITE (tic54x),
649     BFD_JUMP_TABLE_LINK (coff),
650     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
651
652     & tic54x_coff1_beh_vec,
653
654     COFF_SWAP_TABLE
655   };
656
657 /* TI COFF v2, TI SPARC tools output (big-endian headers).  */
658 const bfd_target tic54x_coff2_beh_vec =
659   {
660     "coff2-beh-c54x",                   /* name */
661     bfd_target_coff_flavour,
662     BFD_ENDIAN_LITTLE,          /* data byte order is little */
663     BFD_ENDIAN_BIG,             /* header byte order is big */
664
665     (HAS_RELOC | EXEC_P |               /* object flags */
666      HAS_LINENO | HAS_DEBUG |
667      HAS_SYMS | HAS_LOCALS | WP_TEXT ),
668
669     (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
670     '_',                                /* leading symbol underscore */
671     '/',                                /* ar_pad_char */
672     15,                         /* ar_max_namelen */
673     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
674     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
675     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
676     bfd_getb64, bfd_getb_signed_64, bfd_putb64,
677     bfd_getb32, bfd_getb_signed_32, bfd_putb32,
678     bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
679
680     {_bfd_dummy_target, coff_object_p,  /* bfd_check_format */
681      bfd_generic_archive_p, _bfd_dummy_target},
682     {bfd_false, coff_mkobject, _bfd_generic_mkarchive,  /* bfd_set_format */
683      bfd_false},
684     {bfd_false, coff_write_object_contents,     /* bfd_write_contents */
685      _bfd_write_archive_contents, bfd_false},
686
687     BFD_JUMP_TABLE_GENERIC (coff),
688     BFD_JUMP_TABLE_COPY (coff),
689     BFD_JUMP_TABLE_CORE (_bfd_nocore),
690     BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
691     BFD_JUMP_TABLE_SYMBOLS (coff),
692     BFD_JUMP_TABLE_RELOCS (coff),
693     BFD_JUMP_TABLE_WRITE (tic54x),
694     BFD_JUMP_TABLE_LINK (coff),
695     BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
696
697     & tic54x_coff2_vec,
698
699     COFF_SWAP_TABLE
700   };