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