1/* BFD back-end for TMS320C54X coff binaries.
2   Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005
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 2 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 "bfd.h"
24#include "sysdep.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
34static void tic54x_reloc_processing
35  PARAMS ((arelent *, struct internal_reloc *, asymbol **, bfd *, asection *));
36static bfd_reloc_status_type tic54x_relocation
37  PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
38static bfd_boolean tic54x_set_section_contents
39  PARAMS ((bfd *, sec_ptr, const PTR, file_ptr, bfd_size_type));
40static 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 *));
42static bfd_boolean tic54x_set_arch_mach
43  PARAMS ((bfd *, enum bfd_architecture, unsigned long));
44static reloc_howto_type * tic54x_coff_reloc_type_lookup
45  PARAMS ((bfd *, bfd_reloc_code_real_type));
46static void tic54x_lookup_howto
47  PARAMS ((arelent *, struct internal_reloc *));
48static 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
58static bfd_vma
59tic54x_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
71static void
72tic54x_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
81static bfd_signed_vma
82tic54x_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
99void
100bfd_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
107int
108bfd_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
131static bfd_boolean
132tic54x_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
146static bfd_reloc_status_type
147tic54x_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
168reloc_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
233/* For the case statement use the code values used tc_gen_reloc (defined in
234   bfd/reloc.c) to map to the howto table entries.  */
235
236reloc_howto_type *
237tic54x_coff_reloc_type_lookup (abfd, code)
238     bfd *abfd ATTRIBUTE_UNUSED;
239     bfd_reloc_code_real_type code;
240{
241  switch (code)
242    {
243    case BFD_RELOC_16:
244      return &tic54x_howto_table[0];
245    case BFD_RELOC_TIC54X_PARTLS7:
246      return &tic54x_howto_table[1];
247    case BFD_RELOC_TIC54X_PARTMS9:
248      return &tic54x_howto_table[2];
249    case BFD_RELOC_TIC54X_23:
250      return &tic54x_howto_table[3];
251    case BFD_RELOC_TIC54X_16_OF_23:
252      return &tic54x_howto_table[4];
253    case BFD_RELOC_TIC54X_MS7_OF_23:
254      return &tic54x_howto_table[5];
255    case BFD_RELOC_32:
256      return &tic54x_howto_table[12];
257    default:
258      return (reloc_howto_type *) NULL;
259    }
260}
261
262/* Code to turn a r_type into a howto ptr, uses the above howto table.
263   Called after some initial checking by the tic54x_rtype_to_howto fn below.  */
264
265static void
266tic54x_lookup_howto (internal, dst)
267     arelent *internal;
268     struct internal_reloc *dst;
269{
270  unsigned i;
271  int bank = (dst->r_symndx == -1) ? HOWTO_BANK : 0;
272
273  for (i = 0; i < sizeof tic54x_howto_table/sizeof tic54x_howto_table[0]; i++)
274    {
275      if (tic54x_howto_table[i].type == dst->r_type)
276	{
277	  internal->howto = tic54x_howto_table + i + bank;
278	  return;
279	}
280    }
281
282  (*_bfd_error_handler) (_("Unrecognized reloc type 0x%x"),
283			 (unsigned int) dst->r_type);
284  abort ();
285}
286
287#define RELOC_PROCESSING(RELENT,RELOC,SYMS,ABFD,SECT)\
288 tic54x_reloc_processing(RELENT,RELOC,SYMS,ABFD,SECT)
289
290#define coff_rtype_to_howto coff_tic54x_rtype_to_howto
291
292static reloc_howto_type *
293coff_tic54x_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
294     bfd *abfd ATTRIBUTE_UNUSED;
295     asection *sec;
296     struct internal_reloc *rel;
297     struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
298     struct internal_syment *sym ATTRIBUTE_UNUSED;
299     bfd_vma *addendp;
300{
301  arelent genrel;
302
303  if (rel->r_symndx == -1 && addendp != NULL)
304    {
305      /* This is a TI "internal relocation", which means that the relocation
306	 amount is the amount by which the current section is being relocated
307	 in the output section.  */
308      *addendp = (sec->output_section->vma + sec->output_offset) - sec->vma;
309    }
310
311  tic54x_lookup_howto (&genrel, rel);
312
313  return genrel.howto;
314}
315
316/* Replace the stock _bfd_coff_is_local_label_name to recognize TI COFF local
317   labels.  */
318
319static bfd_boolean
320ticoff_bfd_is_local_label_name (abfd, name)
321  bfd *abfd ATTRIBUTE_UNUSED;
322  const char *name;
323{
324  if (TICOFF_LOCAL_LABEL_P(name))
325    return TRUE;
326  return FALSE;
327}
328
329#define coff_bfd_is_local_label_name ticoff_bfd_is_local_label_name
330
331/* Clear the r_reserved field in relocs.  */
332#define SWAP_OUT_RELOC_EXTRA(abfd,src,dst) \
333  do \
334    { \
335      dst->r_reserved[0] = 0; \
336      dst->r_reserved[1] = 0; \
337    } \
338  while (0)
339
340/* Customize coffcode.h; the default coff_ functions are set up to use COFF2;
341   coff_bad_format_hook uses BADMAG, so set that for COFF2.  The COFF1
342   and COFF0 vectors use custom _bad_format_hook procs instead of setting
343   BADMAG.  */
344#define BADMAG(x) COFF2_BADMAG(x)
345#include "coffcode.h"
346
347static bfd_boolean
348tic54x_set_section_contents (abfd, section, location, offset, bytes_to_do)
349     bfd *abfd;
350     sec_ptr section;
351     const PTR location;
352     file_ptr offset;
353     bfd_size_type bytes_to_do;
354{
355  return coff_set_section_contents (abfd, section, location,
356                                    offset, bytes_to_do);
357}
358
359static void
360tic54x_reloc_processing (relent, reloc, symbols, abfd, section)
361     arelent *relent;
362     struct internal_reloc *reloc;
363     asymbol **symbols;
364     bfd *abfd;
365     asection *section;
366{
367  asymbol *ptr;
368
369  relent->address = reloc->r_vaddr;
370
371  if (reloc->r_symndx != -1)
372    {
373      if (reloc->r_symndx < 0 || reloc->r_symndx >= obj_conv_table_size (abfd))
374        {
375          (*_bfd_error_handler)
376            (_("%B: warning: illegal symbol index %ld in relocs"),
377             abfd, reloc->r_symndx);
378          relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
379          ptr = NULL;
380        }
381      else
382        {
383          relent->sym_ptr_ptr = (symbols
384                                 + obj_convert (abfd)[reloc->r_symndx]);
385          ptr = *(relent->sym_ptr_ptr);
386        }
387    }
388  else
389    {
390      relent->sym_ptr_ptr = section->symbol_ptr_ptr;
391      ptr = *(relent->sym_ptr_ptr);
392    }
393
394  /* The symbols definitions that we have read in have been
395     relocated as if their sections started at 0. But the offsets
396     refering to the symbols in the raw data have not been
397     modified, so we have to have a negative addend to compensate.
398
399     Note that symbols which used to be common must be left alone.  */
400
401  /* Calculate any reloc addend by looking at the symbol.  */
402  CALC_ADDEND (abfd, ptr, *reloc, relent);
403
404  relent->address -= section->vma;
405  /* !!     relent->section = (asection *) NULL;*/
406
407  /* Fill in the relent->howto field from reloc->r_type.  */
408  tic54x_lookup_howto (relent, reloc);
409}
410
411/* TI COFF v0, DOS tools (little-endian headers).  */
412const bfd_target tic54x_coff0_vec =
413  {
414    "coff0-c54x",			/* name */
415    bfd_target_coff_flavour,
416    BFD_ENDIAN_LITTLE,		/* data byte order is little */
417    BFD_ENDIAN_LITTLE,		/* header byte order is little (DOS tools) */
418
419    (HAS_RELOC | EXEC_P |		/* object flags */
420     HAS_LINENO | HAS_DEBUG |
421     HAS_SYMS | HAS_LOCALS | WP_TEXT ),
422
423    (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
424    '_',				/* leading symbol underscore */
425    '/',				/* ar_pad_char */
426    15,				/* ar_max_namelen */
427    bfd_getl64, bfd_getl_signed_64, bfd_putl64,
428    tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
429    bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* data */
430    bfd_getl64, bfd_getl_signed_64, bfd_putl64,
431    bfd_getl32, bfd_getl_signed_32, bfd_putl32,
432    bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* hdrs */
433
434    {_bfd_dummy_target, coff_object_p,	/* bfd_check_format */
435     bfd_generic_archive_p, _bfd_dummy_target},
436    {bfd_false, coff_mkobject, _bfd_generic_mkarchive,	/* bfd_set_format */
437     bfd_false},
438    {bfd_false, coff_write_object_contents,	/* bfd_write_contents */
439     _bfd_write_archive_contents, bfd_false},
440
441    BFD_JUMP_TABLE_GENERIC (coff),
442    BFD_JUMP_TABLE_COPY (coff),
443    BFD_JUMP_TABLE_CORE (_bfd_nocore),
444    BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
445    BFD_JUMP_TABLE_SYMBOLS (coff),
446    BFD_JUMP_TABLE_RELOCS (coff),
447    BFD_JUMP_TABLE_WRITE (tic54x),
448    BFD_JUMP_TABLE_LINK (coff),
449    BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
450    NULL,
451
452    (PTR) & ticoff0_swap_table
453  };
454
455/* TI COFF v0, SPARC tools (big-endian headers).  */
456const bfd_target tic54x_coff0_beh_vec =
457  {
458    "coff0-beh-c54x",			/* name */
459    bfd_target_coff_flavour,
460    BFD_ENDIAN_LITTLE,		/* data byte order is little */
461    BFD_ENDIAN_BIG,		/* header byte order is big */
462
463    (HAS_RELOC | EXEC_P |		/* object flags */
464     HAS_LINENO | HAS_DEBUG |
465     HAS_SYMS | HAS_LOCALS | WP_TEXT ),
466
467    (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
468    '_',				/* leading symbol underscore */
469    '/',				/* ar_pad_char */
470    15,				/* ar_max_namelen */
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    (PTR) & ticoff0_swap_table
498  };
499
500/* TI COFF v1, DOS tools (little-endian headers).  */
501const 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    bfd_getl64, bfd_getl_signed_64, bfd_putl64,
517    tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
518    bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* data */
519    bfd_getl64, bfd_getl_signed_64, bfd_putl64,
520    bfd_getl32, bfd_getl_signed_32, bfd_putl32,
521    bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* hdrs */
522
523    {_bfd_dummy_target, coff_object_p,	/* bfd_check_format */
524     bfd_generic_archive_p, _bfd_dummy_target},
525    {bfd_false, coff_mkobject, _bfd_generic_mkarchive,	/* bfd_set_format */
526     bfd_false},
527    {bfd_false, coff_write_object_contents,	/* bfd_write_contents */
528     _bfd_write_archive_contents, bfd_false},
529
530    BFD_JUMP_TABLE_GENERIC (coff),
531    BFD_JUMP_TABLE_COPY (coff),
532    BFD_JUMP_TABLE_CORE (_bfd_nocore),
533    BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
534    BFD_JUMP_TABLE_SYMBOLS (coff),
535    BFD_JUMP_TABLE_RELOCS (coff),
536    BFD_JUMP_TABLE_WRITE (tic54x),
537    BFD_JUMP_TABLE_LINK (coff),
538    BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
539
540    & tic54x_coff0_beh_vec,
541
542    (PTR) & ticoff1_swap_table
543};
544
545/* TI COFF v1, SPARC tools (big-endian headers).  */
546const bfd_target tic54x_coff1_beh_vec =
547  {
548    "coff1-beh-c54x",			/* name */
549    bfd_target_coff_flavour,
550    BFD_ENDIAN_LITTLE,		/* data byte order is little */
551    BFD_ENDIAN_BIG,		/* header byte order is big */
552
553    (HAS_RELOC | EXEC_P |		/* object flags */
554     HAS_LINENO | HAS_DEBUG |
555     HAS_SYMS | HAS_LOCALS | WP_TEXT ),
556
557    (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
558    '_',				/* leading symbol underscore */
559    '/',				/* ar_pad_char */
560    15,				/* ar_max_namelen */
561    bfd_getl64, bfd_getl_signed_64, bfd_putl64,
562    tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
563    bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* data */
564    bfd_getb64, bfd_getb_signed_64, bfd_putb64,
565    bfd_getb32, bfd_getb_signed_32, bfd_putb32,
566    bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* hdrs */
567
568    {_bfd_dummy_target, coff_object_p,	/* bfd_check_format */
569     bfd_generic_archive_p, _bfd_dummy_target},
570    {bfd_false, coff_mkobject, _bfd_generic_mkarchive,	/* bfd_set_format */
571     bfd_false},
572    {bfd_false, coff_write_object_contents,	/* bfd_write_contents */
573     _bfd_write_archive_contents, bfd_false},
574
575    BFD_JUMP_TABLE_GENERIC (coff),
576    BFD_JUMP_TABLE_COPY (coff),
577    BFD_JUMP_TABLE_CORE (_bfd_nocore),
578    BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
579    BFD_JUMP_TABLE_SYMBOLS (coff),
580    BFD_JUMP_TABLE_RELOCS (coff),
581    BFD_JUMP_TABLE_WRITE (tic54x),
582    BFD_JUMP_TABLE_LINK (coff),
583    BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
584
585    & tic54x_coff1_vec,
586
587    (PTR) & ticoff1_swap_table
588  };
589
590/* TI COFF v2, TI DOS tools output (little-endian headers).  */
591const bfd_target tic54x_coff2_vec =
592  {
593    "coff2-c54x",			/* name */
594    bfd_target_coff_flavour,
595    BFD_ENDIAN_LITTLE,		/* data byte order is little */
596    BFD_ENDIAN_LITTLE,		/* header byte order is little (DOS tools) */
597
598    (HAS_RELOC | EXEC_P |		/* object flags */
599     HAS_LINENO | HAS_DEBUG |
600     HAS_SYMS | HAS_LOCALS | WP_TEXT ),
601
602    (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
603    '_',				/* leading symbol underscore */
604    '/',				/* ar_pad_char */
605    15,				/* ar_max_namelen */
606    bfd_getl64, bfd_getl_signed_64, bfd_putl64,
607    tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
608    bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* data */
609    bfd_getl64, bfd_getl_signed_64, bfd_putl64,
610    bfd_getl32, bfd_getl_signed_32, bfd_putl32,
611    bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* hdrs */
612
613    {_bfd_dummy_target, coff_object_p,	/* bfd_check_format */
614     bfd_generic_archive_p, _bfd_dummy_target},
615    {bfd_false, coff_mkobject, _bfd_generic_mkarchive,	/* bfd_set_format */
616     bfd_false},
617    {bfd_false, coff_write_object_contents,	/* bfd_write_contents */
618     _bfd_write_archive_contents, bfd_false},
619
620    BFD_JUMP_TABLE_GENERIC (coff),
621    BFD_JUMP_TABLE_COPY (coff),
622    BFD_JUMP_TABLE_CORE (_bfd_nocore),
623    BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
624    BFD_JUMP_TABLE_SYMBOLS (coff),
625    BFD_JUMP_TABLE_RELOCS (coff),
626    BFD_JUMP_TABLE_WRITE (tic54x),
627    BFD_JUMP_TABLE_LINK (coff),
628    BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
629
630    & tic54x_coff1_beh_vec,
631
632    COFF_SWAP_TABLE
633  };
634
635/* TI COFF v2, TI SPARC tools output (big-endian headers).  */
636const bfd_target tic54x_coff2_beh_vec =
637  {
638    "coff2-beh-c54x",			/* name */
639    bfd_target_coff_flavour,
640    BFD_ENDIAN_LITTLE,		/* data byte order is little */
641    BFD_ENDIAN_BIG,		/* header byte order is big */
642
643    (HAS_RELOC | EXEC_P |		/* object flags */
644     HAS_LINENO | HAS_DEBUG |
645     HAS_SYMS | HAS_LOCALS | WP_TEXT ),
646
647    (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
648    '_',				/* leading symbol underscore */
649    '/',				/* ar_pad_char */
650    15,				/* ar_max_namelen */
651    bfd_getl64, bfd_getl_signed_64, bfd_putl64,
652    tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
653    bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* data */
654    bfd_getb64, bfd_getb_signed_64, bfd_putb64,
655    bfd_getb32, bfd_getb_signed_32, bfd_putb32,
656    bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* hdrs */
657
658    {_bfd_dummy_target, coff_object_p,	/* bfd_check_format */
659     bfd_generic_archive_p, _bfd_dummy_target},
660    {bfd_false, coff_mkobject, _bfd_generic_mkarchive,	/* bfd_set_format */
661     bfd_false},
662    {bfd_false, coff_write_object_contents,	/* bfd_write_contents */
663     _bfd_write_archive_contents, bfd_false},
664
665    BFD_JUMP_TABLE_GENERIC (coff),
666    BFD_JUMP_TABLE_COPY (coff),
667    BFD_JUMP_TABLE_CORE (_bfd_nocore),
668    BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
669    BFD_JUMP_TABLE_SYMBOLS (coff),
670    BFD_JUMP_TABLE_RELOCS (coff),
671    BFD_JUMP_TABLE_WRITE (tic54x),
672    BFD_JUMP_TABLE_LINK (coff),
673    BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
674
675    & tic54x_coff2_vec,
676
677    COFF_SWAP_TABLE
678  };
679