Fix RELOC_FOR_GLOBAL_SYMBOLS macro so that it can cope with user defined symbols...
[binutils-gdb.git] / bfd / coff-tic54x.c
blob424a3b13654f2c6b131946578c33db7ef230ba1b
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)
5 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
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"
30 #undef F_LSYMS
31 #define F_LSYMS F_LSYMS_TICOFF
33 static void
34 tic54x_reloc_processing (arelent *, struct internal_reloc *,
35 asymbol **, bfd *, asection *);
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. */
44 static bfd_vma
45 tic54x_getl32 (const void *p)
47 const bfd_byte *addr = p;
48 unsigned long v;
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;
57 static void
58 tic54x_putl32 (bfd_vma data, void *p)
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;
67 static bfd_signed_vma
68 tic54x_getl_signed_32 (const void *p)
70 const bfd_byte *addr = p;
71 unsigned long v;
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);
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
85 static void
86 bfd_ticoff_set_section_load_page (asection *sect,
87 int page)
89 sect->lma = (sect->lma & ADDR_MASK) | PG_TO_FLAG(page);
92 static int
93 bfd_ticoff_get_section_load_page (asection *sect)
95 int page;
97 /* Provide meaningful defaults for predefined sections. */
98 if (sect == bfd_com_section_ptr)
99 page = PG_DATA;
101 else if (bfd_is_und_section (sect)
102 || bfd_is_abs_section (sect)
103 || bfd_is_ind_section (sect))
104 page = PG_PROG;
106 else
107 page = FLAG_TO_PG (sect->lma);
109 return page;
112 static bfd_reloc_status_type
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)
121 if (output_bfd != (bfd *) NULL)
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;
129 return bfd_reloc_continue;
132 reloc_howto_type tic54x_howto_table[] =
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. */
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),
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),
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),
152 /* 23-bit relocation */
153 HOWTO (R_EXTWORD,0,4,23,false,0,complain_overflow_dont,
154 tic54x_relocation,"RELEXT",false,0x7FFFFF,0x7FFFFF,false),
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),
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),
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),
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),
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),
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),
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),
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),
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),
195 #define coff_bfd_reloc_type_lookup tic54x_coff_reloc_type_lookup
196 #define coff_bfd_reloc_name_lookup tic54x_coff_reloc_name_lookup
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. */
201 static reloc_howto_type *
202 tic54x_coff_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
203 bfd_reloc_code_real_type code)
205 switch (code)
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;
226 static reloc_howto_type *
227 tic54x_coff_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
228 const char *r_name)
230 unsigned int i;
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];
239 return NULL;
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. */
245 static void
246 tic54x_lookup_howto (bfd *abfd,
247 arelent *internal,
248 struct internal_reloc *dst)
250 unsigned i;
251 int bank = (dst->r_symndx == -1) ? HOWTO_BANK : 0;
253 for (i = 0; i < sizeof tic54x_howto_table/sizeof tic54x_howto_table[0]; i++)
255 if (tic54x_howto_table[i].type == dst->r_type)
257 internal->howto = tic54x_howto_table + i + bank;
258 return;
262 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
263 abfd, (unsigned int) dst->r_type);
264 internal->howto = NULL;
267 #define RELOC_PROCESSING(RELENT,RELOC,SYMS,ABFD,SECT)\
268 tic54x_reloc_processing(RELENT,RELOC,SYMS,ABFD,SECT)
270 #define coff_rtype_to_howto coff_tic54x_rtype_to_howto
272 static reloc_howto_type *
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)
280 arelent genrel;
282 if (rel->r_symndx == -1 && addendp != NULL)
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;
290 tic54x_lookup_howto (abfd, &genrel, rel);
292 return genrel.howto;
295 /* Replace the stock _bfd_coff_is_local_label_name to recognize TI COFF local
296 labels. */
298 static bool
299 ticoff_bfd_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
300 const char *name)
302 if (TICOFF_LOCAL_LABEL_P(name))
303 return true;
304 return false;
307 #define coff_bfd_is_local_label_name ticoff_bfd_is_local_label_name
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)
315 #ifndef bfd_pe_print_pdata
316 #define bfd_pe_print_pdata NULL
317 #endif
319 #include "coffcode.h"
321 static void
322 tic54x_reloc_processing (arelent *relent,
323 struct internal_reloc *reloc,
324 asymbol **symbols,
325 bfd *abfd,
326 asection *section)
328 asymbol *ptr;
330 relent->address = reloc->r_vaddr;
332 if (reloc->r_symndx != -1 && symbols != NULL)
334 if (reloc->r_symndx < 0 || reloc->r_symndx >= obj_conv_table_size (abfd))
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;
343 else
345 relent->sym_ptr_ptr = (symbols
346 + obj_convert (abfd)[reloc->r_symndx]);
347 ptr = *(relent->sym_ptr_ptr);
350 else
352 relent->sym_ptr_ptr = section->symbol_ptr_ptr;
353 ptr = *(relent->sym_ptr_ptr);
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.
361 Note that symbols which used to be common must be left alone. */
363 /* Calculate any reloc addend by looking at the symbol. */
364 CALC_ADDEND (abfd, ptr, *reloc, relent);
366 relent->address -= section->vma;
367 /* !! relent->section = (asection *) NULL;*/
369 /* Fill in the relent->howto field from reloc->r_type. */
370 tic54x_lookup_howto (abfd, relent, reloc);
373 /* TI COFF v0, DOS tools (little-endian headers). */
374 const bfd_target tic54x_coff0_vec =
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) */
381 (HAS_RELOC | EXEC_P /* object flags */
382 | HAS_LINENO | HAS_DEBUG
383 | HAS_SYMS | HAS_LOCALS | WP_TEXT ),
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 */
398 { /* bfd_check_format */
399 _bfd_dummy_target,
400 coff_object_p,
401 bfd_generic_archive_p,
402 _bfd_dummy_target
404 { /* bfd_set_format */
405 _bfd_bool_bfd_false_error,
406 coff_mkobject,
407 _bfd_generic_mkarchive,
408 _bfd_bool_bfd_false_error
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
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,
428 &ticoff0_swap_table
431 /* TI COFF v0, SPARC tools (big-endian headers). */
432 const bfd_target tic54x_coff0_beh_vec =
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 */
439 (HAS_RELOC | EXEC_P /* object flags */
440 | HAS_LINENO | HAS_DEBUG
441 | HAS_SYMS | HAS_LOCALS | WP_TEXT ),
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 */
460 { /* bfd_check_format */
461 _bfd_dummy_target,
462 coff_object_p,
463 bfd_generic_archive_p,
464 _bfd_dummy_target
466 { /* bfd_set_format */
467 _bfd_bool_bfd_false_error,
468 coff_mkobject,
469 _bfd_generic_mkarchive,
470 _bfd_bool_bfd_false_error
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
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),
489 &tic54x_coff0_vec,
491 &ticoff0_swap_table
494 /* TI COFF v1, DOS tools (little-endian headers). */
495 const bfd_target tic54x_coff1_vec =
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) */
502 (HAS_RELOC | EXEC_P /* object flags */
503 | HAS_LINENO | HAS_DEBUG
504 | HAS_SYMS | HAS_LOCALS | WP_TEXT ),
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 */
523 { /* bfd_check_format */
524 _bfd_dummy_target,
525 coff_object_p,
526 bfd_generic_archive_p,
527 _bfd_dummy_target
529 { /* bfd_set_format */
530 _bfd_bool_bfd_false_error,
531 coff_mkobject,
532 _bfd_generic_mkarchive,
533 _bfd_bool_bfd_false_error
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
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),
552 &tic54x_coff0_beh_vec,
554 &ticoff1_swap_table
557 /* TI COFF v1, SPARC tools (big-endian headers). */
558 const bfd_target tic54x_coff1_beh_vec =
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 */
565 (HAS_RELOC | EXEC_P /* object flags */
566 | HAS_LINENO | HAS_DEBUG
567 | HAS_SYMS | HAS_LOCALS | WP_TEXT ),
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 */
586 { /* bfd_check_format */
587 _bfd_dummy_target,
588 coff_object_p,
589 bfd_generic_archive_p,
590 _bfd_dummy_target
592 { /* bfd_set_format */
593 _bfd_bool_bfd_false_error,
594 coff_mkobject,
595 _bfd_generic_mkarchive,
596 _bfd_bool_bfd_false_error
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
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),
615 &tic54x_coff1_vec,
617 &ticoff1_swap_table
620 /* TI COFF v2, TI DOS tools output (little-endian headers). */
621 const bfd_target tic54x_coff2_vec =
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) */
628 (HAS_RELOC | EXEC_P /* object flags */
629 | HAS_LINENO | HAS_DEBUG
630 | HAS_SYMS | HAS_LOCALS | WP_TEXT ),
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 */
649 { /* bfd_check_format */
650 _bfd_dummy_target,
651 coff_object_p,
652 bfd_generic_archive_p,
653 _bfd_dummy_target
655 { /* bfd_set_format */
656 _bfd_bool_bfd_false_error,
657 coff_mkobject,
658 _bfd_generic_mkarchive,
659 _bfd_bool_bfd_false_error
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
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),
678 &tic54x_coff1_beh_vec,
680 COFF_SWAP_TABLE
683 /* TI COFF v2, TI SPARC tools output (big-endian headers). */
684 const bfd_target tic54x_coff2_beh_vec =
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 */
691 (HAS_RELOC | EXEC_P /* object flags */
692 | HAS_LINENO | HAS_DEBUG
693 | HAS_SYMS | HAS_LOCALS | WP_TEXT ),
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 */
712 { /* bfd_check_format */
713 _bfd_dummy_target,
714 coff_object_p,
715 bfd_generic_archive_p,
716 _bfd_dummy_target
718 { /* bfd_set_format */
719 _bfd_bool_bfd_false_error,
720 coff_mkobject,
721 _bfd_generic_mkarchive,
722 _bfd_bool_bfd_false_error
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
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),
741 &tic54x_coff2_vec,
743 COFF_SWAP_TABLE