1 /* BFD back-end for ieee-695 objects.
2 Copyright (C) 1990-2014 Free Software Foundation, Inc.
4 Written by Steve Chamberlain of Cygnus Support.
6 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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,
21 MA 02110-1301, USA. */
24 #define KEEPMINUSPCININST 0
26 /* IEEE 695 format is a stream of records, which we parse using a simple one-
27 token (which is one byte in this lexicon) lookahead recursive decent
35 #include "safe-ctype.h"
36 #include "libiberty.h"
38 struct output_buffer_struct
44 static unsigned char *output_ptr_start;
45 static unsigned char *output_ptr;
46 static unsigned char *output_ptr_end;
47 static unsigned char *input_ptr_start;
48 static unsigned char *input_ptr;
49 static unsigned char *input_ptr_end;
50 static bfd *input_bfd;
51 static bfd *output_bfd;
52 static int output_buffer;
55 static void block (void);
57 /* Functions for writing to ieee files in the strange way that the
61 ieee_write_byte (bfd *abfd, int barg)
66 if (bfd_bwrite ((void *) &byte, (bfd_size_type) 1, abfd) != 1)
72 ieee_write_2bytes (bfd *abfd, int bytes)
76 buffer[0] = bytes >> 8;
77 buffer[1] = bytes & 0xff;
78 if (bfd_bwrite ((void *) buffer, (bfd_size_type) 2, abfd) != 2)
84 ieee_write_int (bfd *abfd, bfd_vma value)
88 if (! ieee_write_byte (abfd, (bfd_byte) value))
95 /* How many significant bytes ? */
96 /* FIXME FOR LONGER INTS. */
97 if (value & 0xff000000)
99 else if (value & 0x00ff0000)
101 else if (value & 0x0000ff00)
106 if (! ieee_write_byte (abfd,
107 (bfd_byte) ((int) ieee_number_repeat_start_enum
113 if (! ieee_write_byte (abfd, (bfd_byte) (value >> 24)))
117 if (! ieee_write_byte (abfd, (bfd_byte) (value >> 16)))
121 if (! ieee_write_byte (abfd, (bfd_byte) (value >> 8)))
125 if (! ieee_write_byte (abfd, (bfd_byte) (value)))
134 ieee_write_id (bfd *abfd, const char *id)
136 size_t length = strlen (id);
140 if (! ieee_write_byte (abfd, (bfd_byte) length))
143 else if (length < 255)
145 if (! ieee_write_byte (abfd, ieee_extension_length_1_enum)
146 || ! ieee_write_byte (abfd, (bfd_byte) length))
149 else if (length < 65535)
151 if (! ieee_write_byte (abfd, ieee_extension_length_2_enum)
152 || ! ieee_write_2bytes (abfd, (int) length))
157 (*_bfd_error_handler)
158 (_("%s: string too long (%d chars, max 65535)"),
159 bfd_get_filename (abfd), length);
160 bfd_set_error (bfd_error_invalid_operation);
164 if (bfd_bwrite ((void *) id, (bfd_size_type) length, abfd) != length)
169 /* Functions for reading from ieee files in the strange way that the
170 standard requires. */
172 #define this_byte(ieee) *((ieee)->input_p)
173 #define next_byte(ieee) ((ieee)->input_p++)
174 #define this_byte_and_next(ieee) (*((ieee)->input_p++))
176 static unsigned short
177 read_2bytes (common_header_type *ieee)
179 unsigned char c1 = this_byte_and_next (ieee);
180 unsigned char c2 = this_byte_and_next (ieee);
182 return (c1 << 8) | c2;
186 bfd_get_string (common_header_type *ieee, char *string, size_t length)
190 for (i = 0; i < length; i++)
191 string[i] = this_byte_and_next (ieee);
195 read_id (common_header_type *ieee)
200 length = this_byte_and_next (ieee);
202 /* Simple string of length 0 to 127. */
205 else if (length == 0xde)
206 /* Length is next byte, allowing 0..255. */
207 length = this_byte_and_next (ieee);
209 else if (length == 0xdf)
211 /* Length is next two bytes, allowing 0..65535. */
212 length = this_byte_and_next (ieee);
213 length = (length * 256) + this_byte_and_next (ieee);
216 /* Buy memory and read string. */
217 string = bfd_alloc (ieee->abfd, (bfd_size_type) length + 1);
220 bfd_get_string (ieee, string, length);
226 ieee_write_expression (bfd *abfd,
232 unsigned int term_count = 0;
236 if (! ieee_write_int (abfd, value))
241 /* Badly formatted binaries can have a missing symbol,
242 so test here to prevent a seg fault. */
245 if (bfd_is_com_section (symbol->section)
246 || bfd_is_und_section (symbol->section))
248 /* Def of a common symbol. */
249 if (! ieee_write_byte (abfd, ieee_variable_X_enum)
250 || ! ieee_write_int (abfd, symbol->value))
254 else if (! bfd_is_abs_section (symbol->section))
256 /* Ref to defined symbol - */
257 if (symbol->flags & BSF_GLOBAL)
259 if (! ieee_write_byte (abfd, ieee_variable_I_enum)
260 || ! ieee_write_int (abfd, symbol->value))
264 else if (symbol->flags & (BSF_LOCAL | BSF_SECTION_SYM))
266 /* This is a reference to a defined local symbol. We can
267 easily do a local as a section+offset. */
268 if (! ieee_write_byte (abfd, ieee_variable_R_enum)
269 || ! ieee_write_byte (abfd,
270 (bfd_byte) (symbol->section->index
271 + IEEE_SECTION_NUMBER_BASE)))
275 if (symbol->value != 0)
277 if (! ieee_write_int (abfd, symbol->value))
284 (*_bfd_error_handler)
285 (_("%s: unrecognized symbol `%s' flags 0x%x"),
286 bfd_get_filename (abfd), bfd_asymbol_name (symbol),
288 bfd_set_error (bfd_error_invalid_operation);
296 /* Subtract the pc from here by asking for PC of this section. */
297 if (! ieee_write_byte (abfd, ieee_variable_P_enum)
298 || ! ieee_write_byte (abfd,
299 (bfd_byte) (sindex + IEEE_SECTION_NUMBER_BASE))
300 || ! ieee_write_byte (abfd, ieee_function_minus_enum))
304 /* Handle the degenerate case of a 0 address. */
306 if (! ieee_write_int (abfd, (bfd_vma) 0))
309 while (term_count > 1)
311 if (! ieee_write_byte (abfd, ieee_function_plus_enum))
319 /* Writes any integer into the buffer supplied and always takes 5 bytes. */
322 ieee_write_int5 (bfd_byte *buffer, bfd_vma value)
324 buffer[0] = (bfd_byte) ieee_number_repeat_4_enum;
325 buffer[1] = (value >> 24) & 0xff;
326 buffer[2] = (value >> 16) & 0xff;
327 buffer[3] = (value >> 8) & 0xff;
328 buffer[4] = (value >> 0) & 0xff;
332 ieee_write_int5_out (bfd *abfd, bfd_vma value)
336 ieee_write_int5 (b, value);
337 if (bfd_bwrite ((void *) b, (bfd_size_type) 5, abfd) != 5)
343 parse_int (common_header_type *ieee, bfd_vma *value_ptr)
345 int value = this_byte (ieee);
348 if (value >= 0 && value <= 127)
354 else if (value >= 0x80 && value <= 0x88)
356 unsigned int count = value & 0xf;
362 result = (result << 8) | this_byte_and_next (ieee);
372 parse_i (common_header_type *ieee, bfd_boolean *ok)
375 *ok = parse_int (ieee, &x);
380 must_parse_int (common_header_type *ieee)
383 BFD_ASSERT (parse_int (ieee, &result));
391 ieee_symbol_index_type symbol;
395 #if KEEPMINUSPCININST
397 #define SRC_MASK(arg) arg
398 #define PCREL_OFFSET FALSE
402 #define SRC_MASK(arg) 0
403 #define PCREL_OFFSET TRUE
407 static reloc_howto_type abs32_howto =
414 complain_overflow_bitfield,
422 static reloc_howto_type abs16_howto =
429 complain_overflow_bitfield,
437 static reloc_howto_type abs8_howto =
444 complain_overflow_bitfield,
452 static reloc_howto_type rel32_howto =
459 complain_overflow_signed,
463 SRC_MASK (0xffffffff),
467 static reloc_howto_type rel16_howto =
474 complain_overflow_signed,
478 SRC_MASK (0x0000ffff),
482 static reloc_howto_type rel8_howto =
489 complain_overflow_signed,
493 SRC_MASK (0x000000ff),
497 static ieee_symbol_index_type NOSYMBOL = {0, 0};
500 parse_expression (ieee_data_type *ieee,
502 ieee_symbol_index_type *symbol,
508 bfd_boolean loop = TRUE;
509 ieee_value_type stack[10];
510 ieee_value_type *sp = stack;
519 /* The stack pointer always points to the next unused location. */
520 #define PUSH(x,y,z) TOS.symbol = x; TOS.section = y; TOS.value = z; INC;
521 #define POP(x,y,z) DEC; x = TOS.symbol; y = TOS.section; z = TOS.value;
523 while (loop && ieee->h.input_p < ieee->h.last_byte)
525 switch (this_byte (&(ieee->h)))
527 case ieee_variable_P_enum:
528 /* P variable, current program counter for section n. */
532 next_byte (&(ieee->h));
534 section_n = must_parse_int (&(ieee->h));
536 PUSH (NOSYMBOL, bfd_abs_section_ptr, 0);
539 case ieee_variable_L_enum:
540 /* L variable address of section N. */
541 next_byte (&(ieee->h));
542 PUSH (NOSYMBOL, ieee->section_table[must_parse_int (&(ieee->h))], 0);
544 case ieee_variable_R_enum:
545 /* R variable, logical address of section module. */
546 /* FIXME, this should be different to L. */
547 next_byte (&(ieee->h));
548 PUSH (NOSYMBOL, ieee->section_table[must_parse_int (&(ieee->h))], 0);
550 case ieee_variable_S_enum:
551 /* S variable, size in MAUS of section module. */
552 next_byte (&(ieee->h));
555 ieee->section_table[must_parse_int (&(ieee->h))]->size);
557 case ieee_variable_I_enum:
558 /* Push the address of variable n. */
560 ieee_symbol_index_type sy;
562 next_byte (&(ieee->h));
563 sy.index = (int) must_parse_int (&(ieee->h));
566 PUSH (sy, bfd_abs_section_ptr, 0);
569 case ieee_variable_X_enum:
570 /* Push the address of external variable n. */
572 ieee_symbol_index_type sy;
574 next_byte (&(ieee->h));
575 sy.index = (int) (must_parse_int (&(ieee->h)));
578 PUSH (sy, bfd_und_section_ptr, 0);
581 case ieee_function_minus_enum:
583 bfd_vma value1, value2;
584 asection *section1, *section_dummy;
585 ieee_symbol_index_type sy;
587 next_byte (&(ieee->h));
589 POP (sy, section1, value1);
590 POP (sy, section_dummy, value2);
591 PUSH (sy, section1 ? section1 : section_dummy, value2 - value1);
594 case ieee_function_plus_enum:
596 bfd_vma value1, value2;
599 ieee_symbol_index_type sy1;
600 ieee_symbol_index_type sy2;
602 next_byte (&(ieee->h));
604 POP (sy1, section1, value1);
605 POP (sy2, section2, value2);
606 PUSH (sy1.letter ? sy1 : sy2,
607 bfd_is_abs_section (section1) ? section2 : section1,
615 BFD_ASSERT (this_byte (&(ieee->h)) < (int) ieee_variable_A_enum
616 || this_byte (&(ieee->h)) > (int) ieee_variable_Z_enum);
617 if (parse_int (&(ieee->h), &va))
619 PUSH (NOSYMBOL, bfd_abs_section_ptr, va);
622 /* Thats all that we can understand. */
628 /* As far as I can see there is a bug in the Microtec IEEE output
629 which I'm using to scan, whereby the comma operator is omitted
630 sometimes in an expression, giving expressions with too many
631 terms. We can tell if that's the case by ensuring that
632 sp == stack here. If not, then we've pushed something too far,
633 so we keep adding. */
634 while (sp != stack + 1)
637 ieee_symbol_index_type sy1;
639 POP (sy1, section1, *extra);
644 POP (*symbol, dummy, *value);
650 #define ieee_seek(ieee, offset) \
653 ieee->h.input_p = ieee->h.first_byte + offset; \
654 ieee->h.last_byte = (ieee->h.first_byte \
655 + ieee_part_after (ieee, offset)); \
659 #define ieee_pos(ieee) \
660 (ieee->h.input_p - ieee->h.first_byte)
662 /* Find the first part of the ieee file after HERE. */
665 ieee_part_after (ieee_data_type *ieee, file_ptr here)
668 file_ptr after = ieee->w.r.me_record;
670 /* File parts can come in any order, except that module end is
671 guaranteed to be last (and the header first). */
672 for (part = 0; part < N_W_VARIABLES; part++)
673 if (ieee->w.offset[part] > here && after > ieee->w.offset[part])
674 after = ieee->w.offset[part];
679 static unsigned int last_index;
680 static char last_type; /* Is the index for an X or a D. */
682 static ieee_symbol_type *
683 get_symbol (bfd *abfd ATTRIBUTE_UNUSED,
684 ieee_data_type *ieee,
685 ieee_symbol_type *last_symbol,
686 unsigned int *symbol_count,
687 ieee_symbol_type ***pptr,
688 unsigned int *max_index,
691 /* Need a new symbol. */
692 unsigned int new_index = must_parse_int (&(ieee->h));
694 if (new_index != last_index || this_type != last_type)
696 ieee_symbol_type *new_symbol;
697 bfd_size_type amt = sizeof (ieee_symbol_type);
699 new_symbol = bfd_alloc (ieee->h.abfd, amt);
703 new_symbol->index = new_index;
704 last_index = new_index;
707 *pptr = &new_symbol->next;
708 if (new_index > *max_index)
709 *max_index = new_index;
711 last_type = this_type;
712 new_symbol->symbol.section = bfd_abs_section_ptr;
719 ieee_slurp_external_symbols (bfd *abfd)
721 ieee_data_type *ieee = IEEE_DATA (abfd);
722 file_ptr offset = ieee->w.r.external_part;
724 ieee_symbol_type **prev_symbols_ptr = &ieee->external_symbols;
725 ieee_symbol_type **prev_reference_ptr = &ieee->external_reference;
726 ieee_symbol_type *symbol = NULL;
727 unsigned int symbol_count = 0;
728 bfd_boolean loop = TRUE;
730 last_index = 0xffffff;
731 ieee->symbol_table_full = TRUE;
733 ieee_seek (ieee, offset);
737 switch (this_byte (&(ieee->h)))
740 next_byte (&(ieee->h));
742 symbol = get_symbol (abfd, ieee, symbol, &symbol_count,
744 & ieee->external_symbol_max_index, 'I');
748 symbol->symbol.the_bfd = abfd;
749 symbol->symbol.name = read_id (&(ieee->h));
750 symbol->symbol.udata.p = NULL;
751 symbol->symbol.flags = BSF_NO_FLAGS;
753 case ieee_external_symbol_enum:
754 next_byte (&(ieee->h));
756 symbol = get_symbol (abfd, ieee, symbol, &symbol_count,
758 &ieee->external_symbol_max_index, 'D');
762 BFD_ASSERT (symbol->index >= ieee->external_symbol_min_index);
764 symbol->symbol.the_bfd = abfd;
765 symbol->symbol.name = read_id (&(ieee->h));
766 symbol->symbol.udata.p = NULL;
767 symbol->symbol.flags = BSF_NO_FLAGS;
769 case ieee_attribute_record_enum >> 8:
771 unsigned int symbol_name_index;
772 unsigned int symbol_type_index;
773 unsigned int symbol_attribute_def;
776 switch (read_2bytes (&ieee->h))
778 case ieee_attribute_record_enum:
779 symbol_name_index = must_parse_int (&(ieee->h));
780 symbol_type_index = must_parse_int (&(ieee->h));
781 (void) symbol_type_index;
782 symbol_attribute_def = must_parse_int (&(ieee->h));
783 switch (symbol_attribute_def)
787 parse_int (&ieee->h, &value);
790 (*_bfd_error_handler)
791 (_("%B: unimplemented ATI record %u for symbol %u"),
792 abfd, symbol_attribute_def, symbol_name_index);
793 bfd_set_error (bfd_error_bad_value);
798 case ieee_external_reference_info_record_enum:
799 /* Skip over ATX record. */
800 parse_int (&(ieee->h), &value);
801 parse_int (&(ieee->h), &value);
802 parse_int (&(ieee->h), &value);
803 parse_int (&(ieee->h), &value);
805 case ieee_atn_record_enum:
806 /* We may get call optimization information here,
807 which we just ignore. The format is
808 {$F1}${CE}{index}{$00}{$3F}{$3F}{#_of_ASNs}. */
809 parse_int (&ieee->h, &value);
810 parse_int (&ieee->h, &value);
811 parse_int (&ieee->h, &value);
814 (*_bfd_error_handler)
815 (_("%B: unexpected ATN type %d in external part"),
817 bfd_set_error (bfd_error_bad_value);
820 parse_int (&ieee->h, &value);
821 parse_int (&ieee->h, &value);
828 switch (read_2bytes (&ieee->h))
830 case ieee_asn_record_enum:
831 parse_int (&ieee->h, &val1);
832 parse_int (&ieee->h, &val1);
836 (*_bfd_error_handler)
837 (_("%B: unexpected type after ATN"), abfd);
838 bfd_set_error (bfd_error_bad_value);
845 case ieee_value_record_enum >> 8:
847 unsigned int symbol_name_index;
848 ieee_symbol_index_type symbol_ignore;
849 bfd_boolean pcrel_ignore;
852 next_byte (&(ieee->h));
853 next_byte (&(ieee->h));
855 symbol_name_index = must_parse_int (&(ieee->h));
856 (void) symbol_name_index;
857 parse_expression (ieee,
858 &symbol->symbol.value,
862 &symbol->symbol.section);
864 /* Fully linked IEEE-695 files tend to give every symbol
865 an absolute value. Try to convert that back into a
866 section relative value. FIXME: This won't always to
868 if (bfd_is_abs_section (symbol->symbol.section)
869 && (abfd->flags & HAS_RELOC) == 0)
874 val = symbol->symbol.value;
875 for (s = abfd->sections; s != NULL; s = s->next)
877 if (val >= s->vma && val < s->vma + s->size)
879 symbol->symbol.section = s;
880 symbol->symbol.value -= s->vma;
886 symbol->symbol.flags = BSF_GLOBAL | BSF_EXPORT;
890 case ieee_weak_external_reference_enum:
895 next_byte (&(ieee->h));
896 /* Throw away the external reference index. */
897 (void) must_parse_int (&(ieee->h));
898 /* Fetch the default size if not resolved. */
899 size = must_parse_int (&(ieee->h));
900 /* Fetch the default value if available. */
901 if (! parse_int (&(ieee->h), &value))
903 /* This turns into a common. */
904 symbol->symbol.section = bfd_com_section_ptr;
905 symbol->symbol.value = size;
909 case ieee_external_reference_enum:
910 next_byte (&(ieee->h));
912 symbol = get_symbol (abfd, ieee, symbol, &symbol_count,
914 &ieee->external_reference_max_index, 'X');
918 symbol->symbol.the_bfd = abfd;
919 symbol->symbol.name = read_id (&(ieee->h));
920 symbol->symbol.udata.p = NULL;
921 symbol->symbol.section = bfd_und_section_ptr;
922 symbol->symbol.value = (bfd_vma) 0;
923 symbol->symbol.flags = 0;
925 BFD_ASSERT (symbol->index >= ieee->external_reference_min_index);
933 if (ieee->external_symbol_max_index != 0)
935 ieee->external_symbol_count =
936 ieee->external_symbol_max_index -
937 ieee->external_symbol_min_index + 1;
940 ieee->external_symbol_count = 0;
942 if (ieee->external_reference_max_index != 0)
944 ieee->external_reference_count =
945 ieee->external_reference_max_index -
946 ieee->external_reference_min_index + 1;
949 ieee->external_reference_count = 0;
952 ieee->external_reference_count + ieee->external_symbol_count;
954 if (symbol_count != abfd->symcount)
955 /* There are gaps in the table -- */
956 ieee->symbol_table_full = FALSE;
958 *prev_symbols_ptr = NULL;
959 *prev_reference_ptr = NULL;
965 ieee_slurp_symbol_table (bfd *abfd)
967 if (! IEEE_DATA (abfd)->read_symbols)
969 if (! ieee_slurp_external_symbols (abfd))
971 IEEE_DATA (abfd)->read_symbols = TRUE;
977 ieee_get_symtab_upper_bound (bfd *abfd)
979 if (! ieee_slurp_symbol_table (abfd))
982 return (abfd->symcount != 0) ?
983 (abfd->symcount + 1) * (sizeof (ieee_symbol_type *)) : 0;
986 /* Move from our internal lists to the canon table, and insert in
987 symbol index order. */
989 extern const bfd_target ieee_vec;
992 ieee_canonicalize_symtab (bfd *abfd, asymbol **location)
994 ieee_symbol_type *symp;
995 static bfd dummy_bfd;
996 static asymbol empty_symbol =
1004 /* K&R compilers can't initialise unions. */
1011 ieee_data_type *ieee = IEEE_DATA (abfd);
1013 dummy_bfd.xvec = &ieee_vec;
1014 if (! ieee_slurp_symbol_table (abfd))
1017 if (! ieee->symbol_table_full)
1019 /* Arrgh - there are gaps in the table, run through and fill them
1020 up with pointers to a null place. */
1023 for (i = 0; i < abfd->symcount; i++)
1024 location[i] = &empty_symbol;
1027 ieee->external_symbol_base_offset = -ieee->external_symbol_min_index;
1028 for (symp = IEEE_DATA (abfd)->external_symbols;
1029 symp != (ieee_symbol_type *) NULL;
1031 /* Place into table at correct index locations. */
1032 location[symp->index + ieee->external_symbol_base_offset] = &symp->symbol;
1034 /* The external refs are indexed in a bit. */
1035 ieee->external_reference_base_offset =
1036 -ieee->external_reference_min_index + ieee->external_symbol_count;
1038 for (symp = IEEE_DATA (abfd)->external_reference;
1039 symp != (ieee_symbol_type *) NULL;
1041 location[symp->index + ieee->external_reference_base_offset] =
1046 location[abfd->symcount] = (asymbol *) NULL;
1048 return abfd->symcount;
1052 get_section_entry (bfd *abfd, ieee_data_type *ieee, unsigned int sindex)
1054 if (sindex >= ieee->section_table_size)
1060 c = ieee->section_table_size;
1067 amt *= sizeof (asection *);
1068 n = bfd_realloc (ieee->section_table, amt);
1072 for (i = ieee->section_table_size; i < c; i++)
1075 ieee->section_table = n;
1076 ieee->section_table_size = c;
1079 if (ieee->section_table[sindex] == (asection *) NULL)
1081 char *tmp = bfd_alloc (abfd, (bfd_size_type) 11);
1086 sprintf (tmp, " fsec%4d", sindex);
1087 section = bfd_make_section (abfd, tmp);
1088 ieee->section_table[sindex] = section;
1089 section->target_index = sindex;
1090 ieee->section_table[sindex] = section;
1092 return ieee->section_table[sindex];
1096 ieee_slurp_sections (bfd *abfd)
1098 ieee_data_type *ieee = IEEE_DATA (abfd);
1099 file_ptr offset = ieee->w.r.section_part;
1104 bfd_byte section_type[3];
1106 ieee_seek (ieee, offset);
1109 switch (this_byte (&(ieee->h)))
1111 case ieee_section_type_enum:
1114 unsigned int section_index;
1116 next_byte (&(ieee->h));
1117 section_index = must_parse_int (&(ieee->h));
1119 section = get_section_entry (abfd, ieee, section_index);
1121 section_type[0] = this_byte_and_next (&(ieee->h));
1123 /* Set minimal section attributes. Attributes are
1124 extended later, based on section contents. */
1125 switch (section_type[0])
1128 /* Normal attributes for absolute sections. */
1129 section_type[1] = this_byte (&(ieee->h));
1130 section->flags = SEC_ALLOC;
1131 switch (section_type[1])
1133 /* AS Absolute section attributes. */
1135 next_byte (&(ieee->h));
1136 section_type[2] = this_byte (&(ieee->h));
1137 switch (section_type[2])
1141 next_byte (&(ieee->h));
1142 section->flags |= SEC_CODE;
1146 next_byte (&(ieee->h));
1147 section->flags |= SEC_DATA;
1150 next_byte (&(ieee->h));
1151 /* Normal rom data. */
1152 section->flags |= SEC_ROM | SEC_DATA;
1160 /* Named relocatable sections (type C). */
1162 section_type[1] = this_byte (&(ieee->h));
1163 section->flags = SEC_ALLOC;
1164 switch (section_type[1])
1166 case 0xD0: /* Normal code (CP). */
1167 next_byte (&(ieee->h));
1168 section->flags |= SEC_CODE;
1170 case 0xC4: /* Normal data (CD). */
1171 next_byte (&(ieee->h));
1172 section->flags |= SEC_DATA;
1174 case 0xD2: /* Normal rom data (CR). */
1175 next_byte (&(ieee->h));
1176 section->flags |= SEC_ROM | SEC_DATA;
1183 /* Read section name, use it if non empty. */
1184 name = read_id (&ieee->h);
1186 section->name = name;
1188 /* Skip these fields, which we don't care about. */
1190 bfd_vma parent, brother, context;
1192 parse_int (&(ieee->h), &parent);
1193 parse_int (&(ieee->h), &brother);
1194 parse_int (&(ieee->h), &context);
1198 case ieee_section_alignment_enum:
1200 unsigned int section_index;
1204 next_byte (&(ieee->h));
1205 section_index = must_parse_int (&ieee->h);
1206 section = get_section_entry (abfd, ieee, section_index);
1207 if (section_index > ieee->section_count)
1208 ieee->section_count = section_index;
1210 section->alignment_power =
1211 bfd_log2 (must_parse_int (&ieee->h));
1212 (void) parse_int (&(ieee->h), &value);
1215 case ieee_e2_first_byte_enum:
1218 ieee_record_enum_type t;
1220 t = (ieee_record_enum_type) (read_2bytes (&(ieee->h)));
1223 case ieee_section_size_enum:
1224 section = ieee->section_table[must_parse_int (&(ieee->h))];
1225 section->size = must_parse_int (&(ieee->h));
1227 case ieee_physical_region_size_enum:
1228 section = ieee->section_table[must_parse_int (&(ieee->h))];
1229 section->size = must_parse_int (&(ieee->h));
1231 case ieee_region_base_address_enum:
1232 section = ieee->section_table[must_parse_int (&(ieee->h))];
1233 section->vma = must_parse_int (&(ieee->h));
1234 section->lma = section->vma;
1236 case ieee_mau_size_enum:
1237 must_parse_int (&(ieee->h));
1238 must_parse_int (&(ieee->h));
1240 case ieee_m_value_enum:
1241 must_parse_int (&(ieee->h));
1242 must_parse_int (&(ieee->h));
1244 case ieee_section_base_address_enum:
1245 section = ieee->section_table[must_parse_int (&(ieee->h))];
1246 section->vma = must_parse_int (&(ieee->h));
1247 section->lma = section->vma;
1249 case ieee_section_offset_enum:
1250 (void) must_parse_int (&(ieee->h));
1251 (void) must_parse_int (&(ieee->h));
1265 /* Make a section for the debugging information, if any. We don't try
1266 to interpret the debugging information; we just point the section
1267 at the area in the file so that program which understand can dig it
1271 ieee_slurp_debug (bfd *abfd)
1273 ieee_data_type *ieee = IEEE_DATA (abfd);
1278 if (ieee->w.r.debug_information_part == 0)
1281 flags = SEC_DEBUGGING | SEC_HAS_CONTENTS;
1282 sec = bfd_make_section_with_flags (abfd, ".debug", flags);
1285 sec->filepos = ieee->w.r.debug_information_part;
1287 debug_end = ieee_part_after (ieee, ieee->w.r.debug_information_part);
1288 sec->size = debug_end - ieee->w.r.debug_information_part;
1293 /* Archive stuff. */
1295 static const bfd_target *
1296 ieee_archive_p (bfd *abfd)
1300 unsigned char buffer[512];
1301 file_ptr buffer_offset = 0;
1302 ieee_ar_data_type *save = abfd->tdata.ieee_ar_data;
1303 ieee_ar_data_type *ieee;
1304 bfd_size_type alc_elts;
1305 ieee_ar_obstack_type *elts = NULL;
1306 bfd_size_type amt = sizeof (ieee_ar_data_type);
1308 abfd->tdata.ieee_ar_data = bfd_alloc (abfd, amt);
1309 if (!abfd->tdata.ieee_ar_data)
1310 goto error_ret_restore;
1311 ieee = IEEE_AR_DATA (abfd);
1313 /* Ignore the return value here. It doesn't matter if we don't read
1314 the entire buffer. We might have a very small ieee file. */
1315 if (bfd_bread ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd) <= 0)
1316 goto got_wrong_format_error;
1318 ieee->h.first_byte = buffer;
1319 ieee->h.input_p = buffer;
1321 ieee->h.abfd = abfd;
1323 if (this_byte (&(ieee->h)) != Module_Beginning)
1324 goto got_wrong_format_error;
1326 next_byte (&(ieee->h));
1327 library = read_id (&(ieee->h));
1328 if (strcmp (library, "LIBRARY") != 0)
1329 goto got_wrong_format_error;
1331 /* Throw away the filename. */
1332 read_id (&(ieee->h));
1334 ieee->element_count = 0;
1335 ieee->element_index = 0;
1337 next_byte (&(ieee->h)); /* Drop the ad part. */
1338 must_parse_int (&(ieee->h)); /* And the two dummy numbers. */
1339 must_parse_int (&(ieee->h));
1342 elts = bfd_malloc (alc_elts * sizeof *elts);
1346 /* Read the index of the BB table. */
1350 ieee_ar_obstack_type *t;
1352 rec = read_2bytes (&(ieee->h));
1353 if (rec != (int) ieee_assign_value_to_variable_enum)
1356 if (ieee->element_count >= alc_elts)
1358 ieee_ar_obstack_type *n;
1361 n = bfd_realloc (elts, alc_elts * sizeof (* elts));
1367 t = &elts[ieee->element_count];
1368 ieee->element_count++;
1370 must_parse_int (&(ieee->h));
1371 t->file_offset = must_parse_int (&(ieee->h));
1372 t->abfd = (bfd *) NULL;
1374 /* Make sure that we don't go over the end of the buffer. */
1375 if ((size_t) ieee_pos (IEEE_DATA (abfd)) > sizeof (buffer) / 2)
1377 /* Past half way, reseek and reprime. */
1378 buffer_offset += ieee_pos (IEEE_DATA (abfd));
1379 if (bfd_seek (abfd, buffer_offset, SEEK_SET) != 0)
1382 /* Again ignore return value of bfd_bread. */
1383 bfd_bread ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd);
1384 ieee->h.first_byte = buffer;
1385 ieee->h.input_p = buffer;
1389 amt = ieee->element_count;
1390 amt *= sizeof *ieee->elements;
1391 ieee->elements = bfd_alloc (abfd, amt);
1392 if (ieee->elements == NULL)
1395 memcpy (ieee->elements, elts, (size_t) amt);
1399 /* Now scan the area again, and replace BB offsets with file offsets. */
1400 for (i = 2; i < ieee->element_count; i++)
1402 if (bfd_seek (abfd, ieee->elements[i].file_offset, SEEK_SET) != 0)
1405 /* Again ignore return value of bfd_bread. */
1406 bfd_bread ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd);
1407 ieee->h.first_byte = buffer;
1408 ieee->h.input_p = buffer;
1410 next_byte (&(ieee->h)); /* Drop F8. */
1411 next_byte (&(ieee->h)); /* Drop 14. */
1412 must_parse_int (&(ieee->h)); /* Drop size of block. */
1414 if (must_parse_int (&(ieee->h)) != 0)
1415 /* This object has been deleted. */
1416 ieee->elements[i].file_offset = 0;
1418 ieee->elements[i].file_offset = must_parse_int (&(ieee->h));
1421 /* abfd->has_armap = ;*/
1425 got_wrong_format_error:
1426 bfd_set_error (bfd_error_wrong_format);
1430 bfd_release (abfd, ieee);
1432 abfd->tdata.ieee_ar_data = save;
1438 ieee_mkobject (bfd *abfd)
1442 output_ptr_start = NULL;
1444 output_ptr_end = NULL;
1445 input_ptr_start = NULL;
1447 input_ptr_end = NULL;
1451 amt = sizeof (ieee_data_type);
1452 abfd->tdata.ieee_data = bfd_zalloc (abfd, amt);
1453 return abfd->tdata.ieee_data != NULL;
1457 do_one (ieee_data_type *ieee,
1458 ieee_per_section_type *current_map,
1459 unsigned char *location_ptr,
1463 switch (this_byte (&(ieee->h)))
1465 case ieee_load_constant_bytes_enum:
1467 unsigned int number_of_maus;
1470 next_byte (&(ieee->h));
1471 number_of_maus = must_parse_int (&(ieee->h));
1473 for (i = 0; i < number_of_maus; i++)
1475 location_ptr[current_map->pc++] = this_byte (&(ieee->h));
1476 next_byte (&(ieee->h));
1481 case ieee_load_with_relocation_enum:
1483 bfd_boolean loop = TRUE;
1485 next_byte (&(ieee->h));
1488 switch (this_byte (&(ieee->h)))
1490 case ieee_variable_R_enum:
1492 case ieee_function_signed_open_b_enum:
1493 case ieee_function_unsigned_open_b_enum:
1494 case ieee_function_either_open_b_enum:
1496 unsigned int extra = 4;
1497 bfd_boolean pcrel = FALSE;
1501 r = bfd_alloc (ieee->h.abfd, sizeof (* r));
1505 *(current_map->reloc_tail_ptr) = r;
1506 current_map->reloc_tail_ptr = &r->next;
1507 r->next = (ieee_reloc_type *) NULL;
1508 next_byte (&(ieee->h));
1510 r->relent.sym_ptr_ptr = 0;
1511 parse_expression (ieee,
1514 &pcrel, &extra, §ion);
1515 r->relent.address = current_map->pc;
1516 s->flags |= SEC_RELOC;
1517 s->owner->flags |= HAS_RELOC;
1519 if (r->relent.sym_ptr_ptr == NULL && section != NULL)
1520 r->relent.sym_ptr_ptr = section->symbol_ptr_ptr;
1522 if (this_byte (&(ieee->h)) == (int) ieee_comma)
1524 next_byte (&(ieee->h));
1525 /* Fetch number of bytes to pad. */
1526 extra = must_parse_int (&(ieee->h));
1529 switch (this_byte (&(ieee->h)))
1531 case ieee_function_signed_close_b_enum:
1532 next_byte (&(ieee->h));
1534 case ieee_function_unsigned_close_b_enum:
1535 next_byte (&(ieee->h));
1537 case ieee_function_either_close_b_enum:
1538 next_byte (&(ieee->h));
1543 /* Build a relocation entry for this type. */
1544 /* If pc rel then stick -ve pc into instruction
1545 and take out of reloc ..
1547 I've changed this. It's all too complicated. I
1548 keep 0 in the instruction now. */
1557 #if KEEPMINUSPCININST
1558 bfd_put_32 (ieee->h.abfd, -current_map->pc,
1559 location_ptr + current_map->pc);
1560 r->relent.howto = &rel32_howto;
1561 r->relent.addend -= current_map->pc;
1563 bfd_put_32 (ieee->h.abfd, (bfd_vma) 0, location_ptr +
1565 r->relent.howto = &rel32_howto;
1570 bfd_put_32 (ieee->h.abfd, (bfd_vma) 0,
1571 location_ptr + current_map->pc);
1572 r->relent.howto = &abs32_howto;
1574 current_map->pc += 4;
1579 #if KEEPMINUSPCININST
1580 bfd_put_16 (ieee->h.abfd, (bfd_vma) -current_map->pc,
1581 location_ptr + current_map->pc);
1582 r->relent.addend -= current_map->pc;
1583 r->relent.howto = &rel16_howto;
1586 bfd_put_16 (ieee->h.abfd, (bfd_vma) 0,
1587 location_ptr + current_map->pc);
1588 r->relent.howto = &rel16_howto;
1594 bfd_put_16 (ieee->h.abfd, (bfd_vma) 0,
1595 location_ptr + current_map->pc);
1596 r->relent.howto = &abs16_howto;
1598 current_map->pc += 2;
1603 #if KEEPMINUSPCININST
1604 bfd_put_8 (ieee->h.abfd, (int) (-current_map->pc), location_ptr + current_map->pc);
1605 r->relent.addend -= current_map->pc;
1606 r->relent.howto = &rel8_howto;
1608 bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1609 r->relent.howto = &rel8_howto;
1614 bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1615 r->relent.howto = &abs8_howto;
1617 current_map->pc += 1;
1630 if (parse_int (&(ieee->h), &this_size))
1634 for (i = 0; i < this_size; i++)
1636 location_ptr[current_map->pc++] = this_byte (&(ieee->h));
1637 next_byte (&(ieee->h));
1645 /* Prevent more than the first load-item of an LR record
1646 from being repeated (MRI convention). */
1647 if (iterations != 1)
1655 /* Read in all the section data and relocation stuff too. */
1658 ieee_slurp_section_data (bfd *abfd)
1660 bfd_byte *location_ptr = (bfd_byte *) NULL;
1661 ieee_data_type *ieee = IEEE_DATA (abfd);
1662 unsigned int section_number;
1663 ieee_per_section_type *current_map = NULL;
1666 /* Seek to the start of the data area. */
1667 if (ieee->read_data)
1669 ieee->read_data = TRUE;
1670 ieee_seek (ieee, ieee->w.r.data_part);
1672 /* Allocate enough space for all the section contents. */
1673 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
1675 ieee_per_section_type *per = ieee_per_section (s);
1678 if ((s->flags & SEC_DEBUGGING) != 0)
1680 per->data = bfd_alloc (ieee->h.abfd, s->size);
1683 relpp = &s->relocation;
1684 per->reloc_tail_ptr = (ieee_reloc_type **) relpp;
1689 switch (this_byte (&(ieee->h)))
1691 /* IF we see anything strange then quit. */
1695 case ieee_set_current_section_enum:
1696 next_byte (&(ieee->h));
1697 section_number = must_parse_int (&(ieee->h));
1698 s = ieee->section_table[section_number];
1699 s->flags |= SEC_LOAD | SEC_HAS_CONTENTS;
1700 current_map = ieee_per_section (s);
1701 location_ptr = current_map->data - s->vma;
1702 /* The document I have says that Microtec's compilers reset
1703 this after a sec section, even though the standard says not
1705 current_map->pc = s->vma;
1708 case ieee_e2_first_byte_enum:
1709 next_byte (&(ieee->h));
1710 switch (this_byte (&(ieee->h)))
1712 case ieee_set_current_pc_enum & 0xff:
1715 ieee_symbol_index_type symbol;
1719 next_byte (&(ieee->h));
1720 must_parse_int (&(ieee->h)); /* Throw away section #. */
1721 parse_expression (ieee, &value,
1725 current_map->pc = value;
1726 BFD_ASSERT ((unsigned) (value - s->vma) <= s->size);
1730 case ieee_value_starting_address_enum & 0xff:
1731 next_byte (&(ieee->h));
1732 if (this_byte (&(ieee->h)) == ieee_function_either_open_b_enum)
1733 next_byte (&(ieee->h));
1734 abfd->start_address = must_parse_int (&(ieee->h));
1735 /* We've got to the end of the data now - */
1742 case ieee_repeat_data_enum:
1744 /* Repeat the following LD or LR n times - we do this by
1745 remembering the stream pointer before running it and
1746 resetting it and running it n times. We special case
1747 the repetition of a repeat_data/load_constant. */
1748 unsigned int iterations;
1749 unsigned char *start;
1751 next_byte (&(ieee->h));
1752 iterations = must_parse_int (&(ieee->h));
1753 start = ieee->h.input_p;
1754 if (start[0] == (int) ieee_load_constant_bytes_enum
1757 while (iterations != 0)
1759 location_ptr[current_map->pc++] = start[2];
1762 next_byte (&(ieee->h));
1763 next_byte (&(ieee->h));
1764 next_byte (&(ieee->h));
1768 while (iterations != 0)
1770 ieee->h.input_p = start;
1771 if (!do_one (ieee, current_map, location_ptr, s,
1779 case ieee_load_constant_bytes_enum:
1780 case ieee_load_with_relocation_enum:
1781 if (!do_one (ieee, current_map, location_ptr, s, 1))
1787 static const bfd_target *
1788 ieee_object_p (bfd *abfd)
1792 ieee_data_type *ieee;
1793 unsigned char buffer[300];
1794 ieee_data_type *save = IEEE_DATA (abfd);
1797 abfd->tdata.ieee_data = 0;
1798 ieee_mkobject (abfd);
1800 ieee = IEEE_DATA (abfd);
1801 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
1803 /* Read the first few bytes in to see if it makes sense. Ignore
1804 bfd_bread return value; The file might be very small. */
1805 if (bfd_bread ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd) <= 0)
1806 goto got_wrong_format;
1808 ieee->h.input_p = buffer;
1809 if (this_byte_and_next (&(ieee->h)) != Module_Beginning)
1810 goto got_wrong_format;
1812 ieee->read_symbols = FALSE;
1813 ieee->read_data = FALSE;
1814 ieee->section_count = 0;
1815 ieee->external_symbol_max_index = 0;
1816 ieee->external_symbol_min_index = IEEE_PUBLIC_BASE;
1817 ieee->external_reference_min_index = IEEE_REFERENCE_BASE;
1818 ieee->external_reference_max_index = 0;
1819 ieee->h.abfd = abfd;
1820 ieee->section_table = NULL;
1821 ieee->section_table_size = 0;
1823 processor = ieee->mb.processor = read_id (&(ieee->h));
1824 if (strcmp (processor, "LIBRARY") == 0)
1825 goto got_wrong_format;
1826 ieee->mb.module_name = read_id (&(ieee->h));
1827 if (abfd->filename == (const char *) NULL)
1828 abfd->filename = xstrdup (ieee->mb.module_name);
1830 /* Determine the architecture and machine type of the object file. */
1832 const bfd_arch_info_type *arch;
1835 /* IEEE does not specify the format of the processor identification
1836 string, so the compiler is free to put in it whatever it wants.
1837 We try here to recognize different processors belonging to the
1838 m68k family. Code for other processors can be added here. */
1839 if ((processor[0] == '6') && (processor[1] == '8'))
1841 if (processor[2] == '3') /* 683xx integrated processors. */
1843 switch (processor[3])
1845 case '0': /* 68302, 68306, 68307 */
1846 case '2': /* 68322, 68328 */
1847 case '5': /* 68356 */
1848 strcpy (family, "68000"); /* MC68000-based controllers. */
1851 case '3': /* 68330, 68331, 68332, 68333,
1852 68334, 68335, 68336, 68338 */
1853 case '6': /* 68360 */
1854 case '7': /* 68376 */
1855 strcpy (family, "68332"); /* CPU32 and CPU32+ */
1859 if (processor[4] == '9') /* 68349 */
1860 strcpy (family, "68030"); /* CPU030 */
1861 else /* 68340, 68341 */
1862 strcpy (family, "68332"); /* CPU32 and CPU32+ */
1865 default: /* Does not exist yet. */
1866 strcpy (family, "68332"); /* Guess it will be CPU32 */
1869 else if (TOUPPER (processor[3]) == 'F') /* 68F333 */
1870 strcpy (family, "68332"); /* CPU32 */
1871 else if ((TOUPPER (processor[3]) == 'C') /* Embedded controllers. */
1872 && ((TOUPPER (processor[2]) == 'E')
1873 || (TOUPPER (processor[2]) == 'H')
1874 || (TOUPPER (processor[2]) == 'L')))
1876 strcpy (family, "68");
1877 strncat (family, processor + 4, 7);
1880 else /* "Regular" processors. */
1882 strncpy (family, processor, 9);
1886 else if ((CONST_STRNEQ (processor, "cpu32")) /* CPU32 and CPU32+ */
1887 || (CONST_STRNEQ (processor, "CPU32")))
1888 strcpy (family, "68332");
1891 strncpy (family, processor, 9);
1895 arch = bfd_scan_arch (family);
1897 goto got_wrong_format;
1898 abfd->arch_info = arch;
1901 if (this_byte (&(ieee->h)) != (int) ieee_address_descriptor_enum)
1904 next_byte (&(ieee->h));
1906 if (! parse_int (&(ieee->h), &ieee->ad.number_of_bits_mau))
1909 if (! parse_int (&(ieee->h), &ieee->ad.number_of_maus_in_address))
1912 /* If there is a byte order info, take it. */
1913 if (this_byte (&(ieee->h)) == (int) ieee_variable_L_enum
1914 || this_byte (&(ieee->h)) == (int) ieee_variable_M_enum)
1915 next_byte (&(ieee->h));
1917 for (part = 0; part < N_W_VARIABLES; part++)
1921 if (read_2bytes (&(ieee->h)) != (int) ieee_assign_value_to_variable_enum)
1924 if (this_byte_and_next (&(ieee->h)) != part)
1927 ieee->w.offset[part] = parse_i (&(ieee->h), &ok);
1932 if (ieee->w.r.external_part != 0)
1933 abfd->flags = HAS_SYMS;
1935 /* By now we know that this is a real IEEE file, we're going to read
1936 the whole thing into memory so that we can run up and down it
1937 quickly. We can work out how big the file is from the trailer
1940 amt = ieee->w.r.me_record + 1;
1941 IEEE_DATA (abfd)->h.first_byte = bfd_alloc (ieee->h.abfd, amt);
1942 if (!IEEE_DATA (abfd)->h.first_byte)
1944 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
1946 /* FIXME: Check return value. I'm not sure whether it needs to read
1947 the entire buffer or not. */
1948 bfd_bread ((void *) (IEEE_DATA (abfd)->h.first_byte),
1949 (bfd_size_type) ieee->w.r.me_record + 1, abfd);
1951 ieee_slurp_sections (abfd);
1953 if (! ieee_slurp_debug (abfd))
1956 /* Parse section data to activate file and section flags implied by
1957 section contents. */
1958 if (! ieee_slurp_section_data (abfd))
1963 bfd_set_error (bfd_error_wrong_format);
1965 bfd_release (abfd, ieee);
1966 abfd->tdata.ieee_data = save;
1967 return (const bfd_target *) NULL;
1971 ieee_get_symbol_info (bfd *ignore_abfd ATTRIBUTE_UNUSED,
1975 bfd_symbol_info (symbol, ret);
1976 if (symbol->name[0] == ' ')
1977 ret->name = "* empty table entry ";
1978 if (!symbol->section)
1979 ret->type = (symbol->flags & BSF_LOCAL) ? 'a' : 'A';
1983 ieee_print_symbol (bfd *abfd,
1986 bfd_print_symbol_type how)
1988 FILE *file = (FILE *) afile;
1992 case bfd_print_symbol_name:
1993 fprintf (file, "%s", symbol->name);
1995 case bfd_print_symbol_more:
1998 case bfd_print_symbol_all:
2000 const char *section_name =
2001 (symbol->section == (asection *) NULL
2003 : symbol->section->name);
2005 if (symbol->name[0] == ' ')
2006 fprintf (file, "* empty table entry ");
2009 bfd_print_symbol_vandf (abfd, (void *) file, symbol);
2011 fprintf (file, " %-5s %04x %02x %s",
2013 (unsigned) ieee_symbol (symbol)->index,
2023 ieee_new_section_hook (bfd *abfd, asection *newsect)
2025 if (!newsect->used_by_bfd)
2027 newsect->used_by_bfd = bfd_alloc (abfd, sizeof (ieee_per_section_type));
2028 if (!newsect->used_by_bfd)
2031 ieee_per_section (newsect)->data = NULL;
2032 ieee_per_section (newsect)->section = newsect;
2033 return _bfd_generic_new_section_hook (abfd, newsect);
2037 ieee_get_reloc_upper_bound (bfd *abfd, sec_ptr asect)
2039 if ((asect->flags & SEC_DEBUGGING) != 0)
2041 if (! ieee_slurp_section_data (abfd))
2043 return (asect->reloc_count + 1) * sizeof (arelent *);
2047 ieee_get_section_contents (bfd *abfd,
2051 bfd_size_type count)
2053 ieee_per_section_type *p = ieee_per_section (section);
2054 if ((section->flags & SEC_DEBUGGING) != 0)
2055 return _bfd_generic_get_section_contents (abfd, section, location,
2057 ieee_slurp_section_data (abfd);
2058 (void) memcpy ((void *) location, (void *) (p->data + offset), (unsigned) count);
2063 ieee_canonicalize_reloc (bfd *abfd,
2068 ieee_reloc_type *src = (ieee_reloc_type *) (section->relocation);
2069 ieee_data_type *ieee = IEEE_DATA (abfd);
2071 if ((section->flags & SEC_DEBUGGING) != 0)
2074 while (src != (ieee_reloc_type *) NULL)
2076 /* Work out which symbol to attach it this reloc to. */
2077 switch (src->symbol.letter)
2080 src->relent.sym_ptr_ptr =
2081 symbols + src->symbol.index + ieee->external_symbol_base_offset;
2084 src->relent.sym_ptr_ptr =
2085 symbols + src->symbol.index + ieee->external_reference_base_offset;
2088 if (src->relent.sym_ptr_ptr != NULL)
2089 src->relent.sym_ptr_ptr =
2090 src->relent.sym_ptr_ptr[0]->section->symbol_ptr_ptr;
2096 *relptr++ = &src->relent;
2100 return section->reloc_count;
2104 comp (const void * ap, const void * bp)
2106 arelent *a = *((arelent **) ap);
2107 arelent *b = *((arelent **) bp);
2108 return a->address - b->address;
2111 /* Write the section headers. */
2114 ieee_write_section_part (bfd *abfd)
2116 ieee_data_type *ieee = IEEE_DATA (abfd);
2119 ieee->w.r.section_part = bfd_tell (abfd);
2120 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
2122 if (! bfd_is_abs_section (s)
2123 && (s->flags & SEC_DEBUGGING) == 0)
2125 if (! ieee_write_byte (abfd, ieee_section_type_enum)
2126 || ! ieee_write_byte (abfd,
2127 (bfd_byte) (s->index
2128 + IEEE_SECTION_NUMBER_BASE)))
2131 if (abfd->flags & EXEC_P)
2133 /* This image is executable, so output absolute sections. */
2134 if (! ieee_write_byte (abfd, ieee_variable_A_enum)
2135 || ! ieee_write_byte (abfd, ieee_variable_S_enum))
2140 if (! ieee_write_byte (abfd, ieee_variable_C_enum))
2144 switch (s->flags & (SEC_CODE | SEC_DATA | SEC_ROM))
2146 case SEC_CODE | SEC_LOAD:
2148 if (! ieee_write_byte (abfd, ieee_variable_P_enum))
2153 if (! ieee_write_byte (abfd, ieee_variable_D_enum))
2157 case SEC_ROM | SEC_DATA:
2158 case SEC_ROM | SEC_LOAD:
2159 case SEC_ROM | SEC_DATA | SEC_LOAD:
2160 if (! ieee_write_byte (abfd, ieee_variable_R_enum))
2165 if (! ieee_write_id (abfd, s->name))
2168 if (! ieee_write_byte (abfd, ieee_section_alignment_enum)
2169 || ! ieee_write_byte (abfd,
2170 (bfd_byte) (s->index
2171 + IEEE_SECTION_NUMBER_BASE))
2172 || ! ieee_write_int (abfd, (bfd_vma) 1 << s->alignment_power))
2176 if (! ieee_write_2bytes (abfd, ieee_section_size_enum)
2177 || ! ieee_write_byte (abfd,
2178 (bfd_byte) (s->index
2179 + IEEE_SECTION_NUMBER_BASE))
2180 || ! ieee_write_int (abfd, s->size))
2182 if (abfd->flags & EXEC_P)
2184 /* Relocateable sections don't have asl records. */
2186 if (! ieee_write_2bytes (abfd, ieee_section_base_address_enum)
2187 || ! ieee_write_byte (abfd,
2190 + IEEE_SECTION_NUMBER_BASE)))
2191 || ! ieee_write_int (abfd, s->lma))
2201 do_with_relocs (bfd *abfd, asection *s)
2203 unsigned int number_of_maus_in_address =
2204 bfd_arch_bits_per_address (abfd) / bfd_arch_bits_per_byte (abfd);
2205 unsigned int relocs_to_go = s->reloc_count;
2206 bfd_byte *stream = ieee_per_section (s)->data;
2207 arelent **p = s->orelocation;
2208 bfd_size_type current_byte_index = 0;
2210 qsort (s->orelocation,
2212 sizeof (arelent **),
2215 /* Output the section preheader. */
2216 if (! ieee_write_byte (abfd, ieee_set_current_section_enum)
2217 || ! ieee_write_byte (abfd,
2218 (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE))
2219 || ! ieee_write_2bytes (abfd, ieee_set_current_pc_enum)
2220 || ! ieee_write_byte (abfd,
2221 (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE)))
2224 if ((abfd->flags & EXEC_P) != 0 && relocs_to_go == 0)
2226 if (! ieee_write_int (abfd, s->lma))
2231 if (! ieee_write_expression (abfd, (bfd_vma) 0, s->symbol, 0, 0))
2235 if (relocs_to_go == 0)
2237 /* If there aren't any relocations then output the load constant
2238 byte opcode rather than the load with relocation opcode. */
2239 while (current_byte_index < s->size)
2242 unsigned int MAXRUN = 127;
2245 if (run > s->size - current_byte_index)
2246 run = s->size - current_byte_index;
2250 if (! ieee_write_byte (abfd, ieee_load_constant_bytes_enum))
2252 /* Output a stream of bytes. */
2253 if (! ieee_write_int (abfd, run))
2255 if (bfd_bwrite ((void *) (stream + current_byte_index), run, abfd)
2258 current_byte_index += run;
2264 if (! ieee_write_byte (abfd, ieee_load_with_relocation_enum))
2267 /* Output the data stream as the longest sequence of bytes
2268 possible, allowing for the a reasonable packet size and
2269 relocation stuffs. */
2272 /* Outputting a section without data, fill it up. */
2273 stream = bfd_zalloc (abfd, s->size);
2277 while (current_byte_index < s->size)
2280 unsigned int MAXRUN = 127;
2284 run = (*p)->address - current_byte_index;
2291 if (run > s->size - current_byte_index)
2292 run = s->size - current_byte_index;
2296 /* Output a stream of bytes. */
2297 if (! ieee_write_int (abfd, run))
2299 if (bfd_bwrite ((void *) (stream + current_byte_index), run, abfd)
2302 current_byte_index += run;
2305 /* Output any relocations here. */
2306 if (relocs_to_go && (*p) && (*p)->address == current_byte_index)
2309 && (*p) && (*p)->address == current_byte_index)
2313 switch (r->howto->size)
2316 ov = bfd_get_signed_32 (abfd,
2317 stream + current_byte_index);
2318 current_byte_index += 4;
2321 ov = bfd_get_signed_16 (abfd,
2322 stream + current_byte_index);
2323 current_byte_index += 2;
2326 ov = bfd_get_signed_8 (abfd,
2327 stream + current_byte_index);
2328 current_byte_index++;
2336 ov &= r->howto->src_mask;
2338 if (r->howto->pc_relative
2339 && ! r->howto->pcrel_offset)
2342 if (! ieee_write_byte (abfd,
2343 ieee_function_either_open_b_enum))
2346 if (r->sym_ptr_ptr != (asymbol **) NULL)
2348 if (! ieee_write_expression (abfd, r->addend + ov,
2350 r->howto->pc_relative,
2351 (unsigned) s->index))
2356 if (! ieee_write_expression (abfd, r->addend + ov,
2358 r->howto->pc_relative,
2359 (unsigned) s->index))
2363 if (number_of_maus_in_address
2364 != bfd_get_reloc_size (r->howto))
2366 bfd_vma rsize = bfd_get_reloc_size (r->howto);
2367 if (! ieee_write_int (abfd, rsize))
2370 if (! ieee_write_byte (abfd,
2371 ieee_function_either_close_b_enum))
2385 /* If there are no relocations in the output section then we can be
2386 clever about how we write. We block items up into a max of 127
2390 do_as_repeat (bfd *abfd, asection *s)
2394 if (! ieee_write_byte (abfd, ieee_set_current_section_enum)
2395 || ! ieee_write_byte (abfd,
2396 (bfd_byte) (s->index
2397 + IEEE_SECTION_NUMBER_BASE))
2398 || ! ieee_write_byte (abfd, ieee_set_current_pc_enum >> 8)
2399 || ! ieee_write_byte (abfd, ieee_set_current_pc_enum & 0xff)
2400 || ! ieee_write_byte (abfd,
2401 (bfd_byte) (s->index
2402 + IEEE_SECTION_NUMBER_BASE)))
2405 if ((abfd->flags & EXEC_P) != 0)
2407 if (! ieee_write_int (abfd, s->lma))
2412 if (! ieee_write_expression (abfd, (bfd_vma) 0, s->symbol, 0, 0))
2416 if (! ieee_write_byte (abfd, ieee_repeat_data_enum)
2417 || ! ieee_write_int (abfd, s->size)
2418 || ! ieee_write_byte (abfd, ieee_load_constant_bytes_enum)
2419 || ! ieee_write_byte (abfd, 1)
2420 || ! ieee_write_byte (abfd, 0))
2428 do_without_relocs (bfd *abfd, asection *s)
2430 bfd_byte *stream = ieee_per_section (s)->data;
2432 if (stream == 0 || ((s->flags & SEC_LOAD) == 0))
2434 if (! do_as_repeat (abfd, s))
2441 for (i = 0; i < s->size; i++)
2445 if (! do_with_relocs (abfd, s))
2450 if (! do_as_repeat (abfd, s))
2460 bfd_size_type amt = input_ptr_end - input_ptr_start;
2461 /* FIXME: Check return value. I'm not sure whether it needs to read
2462 the entire buffer or not. */
2463 bfd_bread ((void *) input_ptr_start, amt, input_bfd);
2464 input_ptr = input_ptr_start;
2470 bfd_size_type amt = output_ptr - output_ptr_start;
2472 if (bfd_bwrite ((void *) (output_ptr_start), amt, output_bfd) != amt)
2474 output_ptr = output_ptr_start;
2478 #define THIS() ( *input_ptr )
2479 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill (); }
2480 #define OUT(x) { *output_ptr++ = (x); if (output_ptr == output_ptr_end) flush (); }
2483 write_int (int value)
2485 if (value >= 0 && value <= 127)
2491 unsigned int length;
2493 /* How many significant bytes ? */
2494 /* FIXME FOR LONGER INTS. */
2495 if (value & 0xff000000)
2497 else if (value & 0x00ff0000)
2499 else if (value & 0x0000ff00)
2504 OUT ((int) ieee_number_repeat_start_enum + length);
2522 int length = THIS ();
2535 #define VAR(x) ((x | 0x80))
2537 copy_expression (void)
2551 value = (value << 8) | THIS ();
2553 value = (value << 8) | THIS ();
2555 value = (value << 8) | THIS ();
2563 value = (value << 8) | THIS ();
2565 value = (value << 8) | THIS ();
2573 value = (value << 8) | THIS ();
2590 /* Not a number, just bug out with the answer. */
2591 write_int (*(--tos));
2598 /* PLUS anything. */
2607 ieee_data_type *ieee;
2611 section_number = THIS ();
2614 ieee = IEEE_DATA (input_bfd);
2615 s = ieee->section_table[section_number];
2617 if (s->output_section)
2618 value = s->output_section->lma;
2619 value += s->output_offset;
2626 write_int (*(--tos));
2634 /* Drop the int in the buffer, and copy a null into the gap, which we
2635 will overwrite later. */
2638 fill_int (struct output_buffer_struct *buf)
2640 if (buf->buffer == output_buffer)
2642 /* Still a chance to output the size. */
2643 int value = output_ptr - buf->ptrp + 3;
2644 buf->ptrp[0] = value >> 24;
2645 buf->ptrp[1] = value >> 16;
2646 buf->ptrp[2] = value >> 8;
2647 buf->ptrp[3] = value >> 0;
2652 drop_int (struct output_buffer_struct *buf)
2680 buf->ptrp = output_ptr;
2681 buf->buffer = output_buffer;
2721 #define ID copy_id ()
2722 #define INT copy_int ()
2723 #define EXP copy_expression ()
2724 #define INTn(q) copy_int ()
2725 #define EXPn(q) copy_expression ()
2728 copy_till_end (void)
2804 EXPn (instruction address);
2838 EXPn (external function);
2848 INTn (locked register);
2870 /* Attribute record. */
2900 /* Unique typedefs for module. */
2901 /* GLobal typedefs. */
2902 /* High level module scope beginning. */
2904 struct output_buffer_struct ob;
2920 /* Global function. */
2922 struct output_buffer_struct ob;
2937 EXPn (size of block);
2943 /* File name for source line numbers. */
2945 struct output_buffer_struct ob;
2966 /* Local function. */
2968 struct output_buffer_struct ob;
2987 /* Assembler module scope beginning - */
2989 struct output_buffer_struct ob;
3015 struct output_buffer_struct ob;
3023 INTn (section index);
3031 EXPn (Size in Maus);
3084 /* Moves all the debug information from the source bfd to the output
3085 bfd, and relocates any expressions it finds. */
3088 relocate_debug (bfd *output ATTRIBUTE_UNUSED,
3093 unsigned char input_buffer[IBS];
3095 input_ptr_start = input_ptr = input_buffer;
3096 input_ptr_end = input_buffer + IBS;
3098 /* FIXME: Check return value. I'm not sure whether it needs to read
3099 the entire buffer or not. */
3100 bfd_bread ((void *) input_ptr_start, (bfd_size_type) IBS, input);
3104 /* Gather together all the debug information from each input BFD into
3105 one place, relocating it and emitting it as we go. */
3108 ieee_write_debug_part (bfd *abfd)
3110 ieee_data_type *ieee = IEEE_DATA (abfd);
3111 bfd_chain_type *chain = ieee->chain_root;
3112 unsigned char obuff[OBS];
3113 bfd_boolean some_debug = FALSE;
3114 file_ptr here = bfd_tell (abfd);
3116 output_ptr_start = output_ptr = obuff;
3117 output_ptr_end = obuff + OBS;
3121 if (chain == (bfd_chain_type *) NULL)
3125 for (s = abfd->sections; s != NULL; s = s->next)
3126 if ((s->flags & SEC_DEBUGGING) != 0)
3130 ieee->w.r.debug_information_part = 0;
3134 ieee->w.r.debug_information_part = here;
3135 if (bfd_bwrite (s->contents, s->size, abfd) != s->size)
3140 while (chain != (bfd_chain_type *) NULL)
3142 bfd *entry = chain->this;
3143 ieee_data_type *entry_ieee = IEEE_DATA (entry);
3145 if (entry_ieee->w.r.debug_information_part)
3147 if (bfd_seek (entry, entry_ieee->w.r.debug_information_part,
3150 relocate_debug (abfd, entry);
3153 chain = chain->next;
3157 ieee->w.r.debug_information_part = here;
3159 ieee->w.r.debug_information_part = 0;
3167 /* Write the data in an ieee way. */
3170 ieee_write_data_part (bfd *abfd)
3174 ieee_data_type *ieee = IEEE_DATA (abfd);
3175 ieee->w.r.data_part = bfd_tell (abfd);
3177 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
3179 /* Skip sections that have no loadable contents (.bss,
3181 if ((s->flags & SEC_LOAD) == 0)
3184 /* Sort the reloc records so we can insert them in the correct
3186 if (s->reloc_count != 0)
3188 if (! do_with_relocs (abfd, s))
3193 if (! do_without_relocs (abfd, s))
3202 init_for_output (bfd *abfd)
3206 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
3208 if ((s->flags & SEC_DEBUGGING) != 0)
3212 bfd_size_type size = s->size;
3213 ieee_per_section (s)->data = bfd_alloc (abfd, size);
3214 if (!ieee_per_section (s)->data)
3221 /* Exec and core file sections. */
3223 /* Set section contents is complicated with IEEE since the format is
3224 not a byte image, but a record stream. */
3227 ieee_set_section_contents (bfd *abfd,
3229 const void * location,
3231 bfd_size_type count)
3233 if ((section->flags & SEC_DEBUGGING) != 0)
3235 if (section->contents == NULL)
3237 bfd_size_type size = section->size;
3238 section->contents = bfd_alloc (abfd, size);
3239 if (section->contents == NULL)
3242 /* bfd_set_section_contents has already checked that everything
3244 memcpy (section->contents + offset, location, (size_t) count);
3248 if (ieee_per_section (section)->data == (bfd_byte *) NULL)
3250 if (!init_for_output (abfd))
3253 memcpy ((void *) (ieee_per_section (section)->data + offset),
3255 (unsigned int) count);
3259 /* Write the external symbols of a file. IEEE considers two sorts of
3260 external symbols, public, and referenced. It uses to internal
3261 forms to index them as well. When we write them out we turn their
3262 symbol values into indexes from the right base. */
3265 ieee_write_external_part (bfd *abfd)
3268 ieee_data_type *ieee = IEEE_DATA (abfd);
3269 unsigned int reference_index = IEEE_REFERENCE_BASE;
3270 unsigned int public_index = IEEE_PUBLIC_BASE + 2;
3271 file_ptr here = bfd_tell (abfd);
3272 bfd_boolean hadone = FALSE;
3274 if (abfd->outsymbols != (asymbol **) NULL)
3277 for (q = abfd->outsymbols; *q != (asymbol *) NULL; q++)
3281 if (bfd_is_und_section (p->section))
3283 /* This must be a symbol reference. */
3284 if (! ieee_write_byte (abfd, ieee_external_reference_enum)
3285 || ! ieee_write_int (abfd, (bfd_vma) reference_index)
3286 || ! ieee_write_id (abfd, p->name))
3288 p->value = reference_index;
3292 else if (bfd_is_com_section (p->section))
3294 /* This is a weak reference. */
3295 if (! ieee_write_byte (abfd, ieee_external_reference_enum)
3296 || ! ieee_write_int (abfd, (bfd_vma) reference_index)
3297 || ! ieee_write_id (abfd, p->name)
3298 || ! ieee_write_byte (abfd,
3299 ieee_weak_external_reference_enum)
3300 || ! ieee_write_int (abfd, (bfd_vma) reference_index)
3301 || ! ieee_write_int (abfd, p->value))
3303 p->value = reference_index;
3307 else if (p->flags & BSF_GLOBAL)
3309 /* This must be a symbol definition. */
3310 if (! ieee_write_byte (abfd, ieee_external_symbol_enum)
3311 || ! ieee_write_int (abfd, (bfd_vma) public_index)
3312 || ! ieee_write_id (abfd, p->name)
3313 || ! ieee_write_2bytes (abfd, ieee_attribute_record_enum)
3314 || ! ieee_write_int (abfd, (bfd_vma) public_index)
3315 || ! ieee_write_byte (abfd, 15) /* Instruction address. */
3316 || ! ieee_write_byte (abfd, 19) /* Static symbol. */
3317 || ! ieee_write_byte (abfd, 1)) /* One of them. */
3320 /* Write out the value. */
3321 if (! ieee_write_2bytes (abfd, ieee_value_record_enum)
3322 || ! ieee_write_int (abfd, (bfd_vma) public_index))
3324 if (! bfd_is_abs_section (p->section))
3326 if (abfd->flags & EXEC_P)
3328 /* If fully linked, then output all symbols
3330 if (! (ieee_write_int
3333 + p->section->output_offset
3334 + p->section->output_section->vma))))
3339 if (! (ieee_write_expression
3341 p->value + p->section->output_offset,
3342 p->section->output_section->symbol,
3349 if (! ieee_write_expression (abfd,
3351 bfd_abs_section_ptr->symbol,
3355 p->value = public_index;
3361 /* This can happen - when there are gaps in the symbols read
3362 from an input ieee file. */
3367 ieee->w.r.external_part = here;
3373 static const unsigned char exten[] =
3376 0xf1, 0xce, 0x20, 0x00, 37, 3, 3, /* Set version 3 rev 3. */
3377 0xf1, 0xce, 0x20, 0x00, 39, 2, /* Keep symbol in original case. */
3378 0xf1, 0xce, 0x20, 0x00, 38 /* Set object type relocatable to x. */
3381 static const unsigned char envi[] =
3385 /* 0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
3388 0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok. */
3390 0xf1, 0xce, 0x21, 0, 53, 0x03,/* host unix. */
3391 /* 0xf1, 0xce, 0x21, 0, 54, 2,1,1 tool & version # */
3395 ieee_write_me_part (bfd *abfd)
3397 ieee_data_type *ieee = IEEE_DATA (abfd);
3398 ieee->w.r.trailer_part = bfd_tell (abfd);
3399 if (abfd->start_address)
3401 if (! ieee_write_2bytes (abfd, ieee_value_starting_address_enum)
3402 || ! ieee_write_byte (abfd, ieee_function_either_open_b_enum)
3403 || ! ieee_write_int (abfd, abfd->start_address)
3404 || ! ieee_write_byte (abfd, ieee_function_either_close_b_enum))
3407 ieee->w.r.me_record = bfd_tell (abfd);
3408 if (! ieee_write_byte (abfd, ieee_module_end_enum))
3413 /* Write out the IEEE processor ID. */
3416 ieee_write_processor (bfd *abfd)
3418 const bfd_arch_info_type *arch;
3420 arch = bfd_get_arch_info (abfd);
3424 if (! ieee_write_id (abfd, bfd_printable_name (abfd)))
3428 case bfd_arch_h8300:
3429 if (! ieee_write_id (abfd, "H8/300"))
3433 case bfd_arch_h8500:
3434 if (! ieee_write_id (abfd, "H8/500"))
3442 case bfd_mach_i960_core:
3443 case bfd_mach_i960_ka_sa:
3444 if (! ieee_write_id (abfd, "80960KA"))
3448 case bfd_mach_i960_kb_sb:
3449 if (! ieee_write_id (abfd, "80960KB"))
3453 case bfd_mach_i960_ca:
3454 if (! ieee_write_id (abfd, "80960CA"))
3458 case bfd_mach_i960_mc:
3459 case bfd_mach_i960_xa:
3460 if (! ieee_write_id (abfd, "80960MC"))
3472 default: id = "68020"; break;
3473 case bfd_mach_m68000: id = "68000"; break;
3474 case bfd_mach_m68008: id = "68008"; break;
3475 case bfd_mach_m68010: id = "68010"; break;
3476 case bfd_mach_m68020: id = "68020"; break;
3477 case bfd_mach_m68030: id = "68030"; break;
3478 case bfd_mach_m68040: id = "68040"; break;
3479 case bfd_mach_m68060: id = "68060"; break;
3480 case bfd_mach_cpu32: id = "cpu32"; break;
3481 case bfd_mach_mcf_isa_a_nodiv: id = "isa-a:nodiv"; break;
3482 case bfd_mach_mcf_isa_a: id = "isa-a"; break;
3483 case bfd_mach_mcf_isa_a_mac: id = "isa-a:mac"; break;
3484 case bfd_mach_mcf_isa_a_emac: id = "isa-a:emac"; break;
3485 case bfd_mach_mcf_isa_aplus: id = "isa-aplus"; break;
3486 case bfd_mach_mcf_isa_aplus_mac: id = "isa-aplus:mac"; break;
3487 case bfd_mach_mcf_isa_aplus_emac: id = "isa-aplus:mac"; break;
3488 case bfd_mach_mcf_isa_b_nousp: id = "isa-b:nousp"; break;
3489 case bfd_mach_mcf_isa_b_nousp_mac: id = "isa-b:nousp:mac"; break;
3490 case bfd_mach_mcf_isa_b_nousp_emac: id = "isa-b:nousp:emac"; break;
3491 case bfd_mach_mcf_isa_b: id = "isa-b"; break;
3492 case bfd_mach_mcf_isa_b_mac: id = "isa-b:mac"; break;
3493 case bfd_mach_mcf_isa_b_emac: id = "isa-b:emac"; break;
3494 case bfd_mach_mcf_isa_b_float: id = "isa-b:float"; break;
3495 case bfd_mach_mcf_isa_b_float_mac: id = "isa-b:float:mac"; break;
3496 case bfd_mach_mcf_isa_b_float_emac: id = "isa-b:float:emac"; break;
3497 case bfd_mach_mcf_isa_c: id = "isa-c"; break;
3498 case bfd_mach_mcf_isa_c_mac: id = "isa-c:mac"; break;
3499 case bfd_mach_mcf_isa_c_emac: id = "isa-c:emac"; break;
3500 case bfd_mach_mcf_isa_c_nodiv: id = "isa-c:nodiv"; break;
3501 case bfd_mach_mcf_isa_c_nodiv_mac: id = "isa-c:nodiv:mac"; break;
3502 case bfd_mach_mcf_isa_c_nodiv_emac: id = "isa-c:nodiv:emac"; break;
3505 if (! ieee_write_id (abfd, id))
3515 ieee_write_object_contents (bfd *abfd)
3517 ieee_data_type *ieee = IEEE_DATA (abfd);
3521 /* Fast forward over the header area. */
3522 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
3525 if (! ieee_write_byte (abfd, ieee_module_beginning_enum)
3526 || ! ieee_write_processor (abfd)
3527 || ! ieee_write_id (abfd, abfd->filename))
3530 /* Fast forward over the variable bits. */
3531 if (! ieee_write_byte (abfd, ieee_address_descriptor_enum))
3535 if (! ieee_write_byte (abfd, (bfd_byte) (bfd_arch_bits_per_byte (abfd))))
3537 /* MAU's per address. */
3538 if (! ieee_write_byte (abfd,
3539 (bfd_byte) (bfd_arch_bits_per_address (abfd)
3540 / bfd_arch_bits_per_byte (abfd))))
3543 old = bfd_tell (abfd);
3544 if (bfd_seek (abfd, (file_ptr) (8 * N_W_VARIABLES), SEEK_CUR) != 0)
3547 ieee->w.r.extension_record = bfd_tell (abfd);
3548 if (bfd_bwrite ((char *) exten, (bfd_size_type) sizeof (exten), abfd)
3551 if (abfd->flags & EXEC_P)
3553 if (! ieee_write_byte (abfd, 0x1)) /* Absolute. */
3558 if (! ieee_write_byte (abfd, 0x2)) /* Relocateable. */
3562 ieee->w.r.environmental_record = bfd_tell (abfd);
3563 if (bfd_bwrite ((char *) envi, (bfd_size_type) sizeof (envi), abfd)
3567 /* The HP emulator database requires a timestamp in the file. */
3573 t = (struct tm *) localtime (&now);
3574 if (! ieee_write_2bytes (abfd, (int) ieee_atn_record_enum)
3575 || ! ieee_write_byte (abfd, 0x21)
3576 || ! ieee_write_byte (abfd, 0)
3577 || ! ieee_write_byte (abfd, 50)
3578 || ! ieee_write_int (abfd, (bfd_vma) (t->tm_year + 1900))
3579 || ! ieee_write_int (abfd, (bfd_vma) (t->tm_mon + 1))
3580 || ! ieee_write_int (abfd, (bfd_vma) t->tm_mday)
3581 || ! ieee_write_int (abfd, (bfd_vma) t->tm_hour)
3582 || ! ieee_write_int (abfd, (bfd_vma) t->tm_min)
3583 || ! ieee_write_int (abfd, (bfd_vma) t->tm_sec))
3591 if (! ieee_write_section_part (abfd))
3593 /* First write the symbols. This changes their values into table
3594 indeces so we cant use it after this point. */
3595 if (! ieee_write_external_part (abfd))
3598 /* Write any debugs we have been told about. */
3599 if (! ieee_write_debug_part (abfd))
3602 /* Can only write the data once the symbols have been written, since
3603 the data contains relocation information which points to the
3605 if (! ieee_write_data_part (abfd))
3608 /* At the end we put the end! */
3609 if (! ieee_write_me_part (abfd))
3612 /* Generate the header. */
3613 if (bfd_seek (abfd, old, SEEK_SET) != 0)
3616 for (i = 0; i < N_W_VARIABLES; i++)
3618 if (! ieee_write_2bytes (abfd, ieee_assign_value_to_variable_enum)
3619 || ! ieee_write_byte (abfd, (bfd_byte) i)
3620 || ! ieee_write_int5_out (abfd, (bfd_vma) ieee->w.offset[i]))
3627 /* Native-level interface to symbols. */
3629 /* We read the symbols into a buffer, which is discarded when this
3630 function exits. We read the strings into a buffer large enough to
3631 hold them all plus all the cached symbol entries. */
3634 ieee_make_empty_symbol (bfd *abfd)
3636 bfd_size_type amt = sizeof (ieee_symbol_type);
3637 ieee_symbol_type *new_symbol = (ieee_symbol_type *) bfd_zalloc (abfd, amt);
3641 new_symbol->symbol.the_bfd = abfd;
3642 return &new_symbol->symbol;
3646 ieee_openr_next_archived_file (bfd *arch, bfd *prev)
3648 ieee_ar_data_type *ar = IEEE_AR_DATA (arch);
3650 /* Take the next one from the arch state, or reset. */
3651 if (prev == (bfd *) NULL)
3652 /* Reset the index - the first two entries are bogus. */
3653 ar->element_index = 2;
3657 ieee_ar_obstack_type *p = ar->elements + ar->element_index;
3659 ar->element_index++;
3660 if (ar->element_index <= ar->element_count)
3662 if (p->file_offset != (file_ptr) 0)
3664 if (p->abfd == (bfd *) NULL)
3666 p->abfd = _bfd_create_empty_archive_element_shell (arch);
3667 p->abfd->origin = p->file_offset;
3674 bfd_set_error (bfd_error_no_more_archived_files);
3680 #define ieee_find_nearest_line _bfd_nosymbols_find_nearest_line
3681 #define ieee_find_line _bfd_nosymbols_find_line
3682 #define ieee_find_inliner_info _bfd_nosymbols_find_inliner_info
3685 ieee_generic_stat_arch_elt (bfd *abfd, struct stat *buf)
3687 ieee_ar_data_type *ar = (ieee_ar_data_type *) NULL;
3688 ieee_data_type *ieee;
3690 if (abfd->my_archive != NULL)
3691 ar = abfd->my_archive->tdata.ieee_ar_data;
3692 if (ar == (ieee_ar_data_type *) NULL)
3694 bfd_set_error (bfd_error_invalid_operation);
3698 if (IEEE_DATA (abfd) == NULL)
3700 if (ieee_object_p (abfd) == NULL)
3702 bfd_set_error (bfd_error_wrong_format);
3707 ieee = IEEE_DATA (abfd);
3709 buf->st_size = ieee->w.r.me_record + 1;
3710 buf->st_mode = 0644;
3715 ieee_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
3716 struct bfd_link_info *info ATTRIBUTE_UNUSED)
3721 #define ieee_close_and_cleanup _bfd_generic_close_and_cleanup
3722 #define ieee_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
3724 #define ieee_slurp_armap bfd_true
3725 #define ieee_slurp_extended_name_table bfd_true
3726 #define ieee_construct_extended_name_table \
3728 (bfd *, char **, bfd_size_type *, const char **)) \
3730 #define ieee_truncate_arname bfd_dont_truncate_arname
3731 #define ieee_write_armap \
3733 (bfd *, unsigned int, struct orl *, unsigned int, int)) \
3735 #define ieee_read_ar_hdr bfd_nullvoidptr
3736 #define ieee_write_ar_hdr ((bfd_boolean (*) (bfd *, bfd *)) bfd_false)
3737 #define ieee_update_armap_timestamp bfd_true
3738 #define ieee_get_elt_at_index _bfd_generic_get_elt_at_index
3740 #define ieee_bfd_is_target_special_symbol \
3741 ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
3742 #define ieee_bfd_is_local_label_name bfd_generic_is_local_label_name
3743 #define ieee_get_lineno _bfd_nosymbols_get_lineno
3744 #define ieee_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
3745 #define ieee_read_minisymbols _bfd_generic_read_minisymbols
3746 #define ieee_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
3748 #define ieee_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
3749 #define ieee_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
3751 #define ieee_set_arch_mach _bfd_generic_set_arch_mach
3753 #define ieee_get_section_contents_in_window \
3754 _bfd_generic_get_section_contents_in_window
3755 #define ieee_bfd_get_relocated_section_contents \
3756 bfd_generic_get_relocated_section_contents
3757 #define ieee_bfd_relax_section bfd_generic_relax_section
3758 #define ieee_bfd_gc_sections bfd_generic_gc_sections
3759 #define ieee_bfd_lookup_section_flags bfd_generic_lookup_section_flags
3760 #define ieee_bfd_merge_sections bfd_generic_merge_sections
3761 #define ieee_bfd_is_group_section bfd_generic_is_group_section
3762 #define ieee_bfd_discard_group bfd_generic_discard_group
3763 #define ieee_section_already_linked \
3764 _bfd_generic_section_already_linked
3765 #define ieee_bfd_define_common_symbol bfd_generic_define_common_symbol
3766 #define ieee_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
3767 #define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols
3768 #define ieee_bfd_link_just_syms _bfd_generic_link_just_syms
3769 #define ieee_bfd_copy_link_hash_symbol_type \
3770 _bfd_generic_copy_link_hash_symbol_type
3771 #define ieee_bfd_final_link _bfd_generic_final_link
3772 #define ieee_bfd_link_split_section _bfd_generic_link_split_section
3774 const bfd_target ieee_vec =
3777 bfd_target_ieee_flavour,
3778 BFD_ENDIAN_UNKNOWN, /* Target byte order. */
3779 BFD_ENDIAN_UNKNOWN, /* Target headers byte order. */
3780 (HAS_RELOC | EXEC_P | /* Object flags. */
3781 HAS_LINENO | HAS_DEBUG |
3782 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
3783 (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
3784 | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* Section flags. */
3785 '_', /* Leading underscore. */
3786 ' ', /* AR_pad_char. */
3787 16, /* AR_max_namelen. */
3788 0, /* match priority. */
3789 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
3790 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
3791 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* Data. */
3792 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
3793 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
3794 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* Headers. */
3797 ieee_object_p, /* bfd_check_format. */
3804 _bfd_generic_mkarchive,
3809 ieee_write_object_contents,
3810 _bfd_write_archive_contents,
3814 /* ieee_close_and_cleanup, ieee_bfd_free_cached_info, ieee_new_section_hook,
3815 ieee_get_section_contents, ieee_get_section_contents_in_window. */
3816 BFD_JUMP_TABLE_GENERIC (ieee),
3818 BFD_JUMP_TABLE_COPY (_bfd_generic),
3819 BFD_JUMP_TABLE_CORE (_bfd_nocore),
3821 /* ieee_slurp_armap, ieee_slurp_extended_name_table,
3822 ieee_construct_extended_name_table, ieee_truncate_arname,
3823 ieee_write_armap, ieee_read_ar_hdr, ieee_openr_next_archived_file,
3824 ieee_get_elt_at_index, ieee_generic_stat_arch_elt,
3825 ieee_update_armap_timestamp. */
3826 BFD_JUMP_TABLE_ARCHIVE (ieee),
3828 /* ieee_get_symtab_upper_bound, ieee_canonicalize_symtab,
3829 ieee_make_empty_symbol, ieee_print_symbol, ieee_get_symbol_info,
3830 ieee_bfd_is_local_label_name, ieee_get_lineno,
3831 ieee_find_nearest_line, ieee_bfd_make_debug_symbol,
3832 ieee_read_minisymbols, ieee_minisymbol_to_symbol. */
3833 BFD_JUMP_TABLE_SYMBOLS (ieee),
3835 /* ieee_get_reloc_upper_bound, ieee_canonicalize_reloc,
3836 ieee_bfd_reloc_type_lookup. */
3837 BFD_JUMP_TABLE_RELOCS (ieee),
3839 /* ieee_set_arch_mach, ieee_set_section_contents. */
3840 BFD_JUMP_TABLE_WRITE (ieee),
3842 /* ieee_sizeof_headers, ieee_bfd_get_relocated_section_contents,
3843 ieee_bfd_relax_section, ieee_bfd_link_hash_table_create,
3844 ieee_bfd_link_add_symbols, ieee_bfd_final_link,
3845 ieee_bfd_link_split_section, ieee_bfd_gc_sections,
3846 ieee_bfd_merge_sections. */
3847 BFD_JUMP_TABLE_LINK (ieee),
3849 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),