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