bfd/
[binutils.git] / bfd / ieee.c
blobd3911e2605760279fefa95a1390fda9c5091b8b1
1 /* BFD back-end for ieee-695 objects.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005
4 Free Software Foundation, Inc.
6 Written by Steve Chamberlain of Cygnus Support.
8 This file is part of BFD, the Binary File Descriptor library.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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
28 parser. */
30 #include "bfd.h"
31 #include "sysdep.h"
32 #include "libbfd.h"
33 #include "ieee.h"
34 #include "libieee.h"
35 #include "safe-ctype.h"
37 struct output_buffer_struct
39 unsigned char *ptrp;
40 int buffer;
43 static unsigned char *output_ptr_start;
44 static unsigned char *output_ptr;
45 static unsigned char *output_ptr_end;
46 static unsigned char *input_ptr_start;
47 static unsigned char *input_ptr;
48 static unsigned char *input_ptr_end;
49 static bfd *input_bfd;
50 static bfd *output_bfd;
51 static int output_buffer;
54 static void block (void);
56 /* Functions for writing to ieee files in the strange way that the
57 standard requires. */
59 static bfd_boolean
60 ieee_write_byte (bfd *abfd, int barg)
62 bfd_byte byte;
64 byte = barg;
65 if (bfd_bwrite ((void *) &byte, (bfd_size_type) 1, abfd) != 1)
66 return FALSE;
67 return TRUE;
70 static bfd_boolean
71 ieee_write_2bytes (bfd *abfd, int bytes)
73 bfd_byte buffer[2];
75 buffer[0] = bytes >> 8;
76 buffer[1] = bytes & 0xff;
77 if (bfd_bwrite ((void *) buffer, (bfd_size_type) 2, abfd) != 2)
78 return FALSE;
79 return TRUE;
82 static bfd_boolean
83 ieee_write_int (bfd *abfd, bfd_vma value)
85 if (value <= 127)
87 if (! ieee_write_byte (abfd, (bfd_byte) value))
88 return FALSE;
90 else
92 unsigned int length;
94 /* How many significant bytes ? */
95 /* FIXME FOR LONGER INTS. */
96 if (value & 0xff000000)
97 length = 4;
98 else if (value & 0x00ff0000)
99 length = 3;
100 else if (value & 0x0000ff00)
101 length = 2;
102 else
103 length = 1;
105 if (! ieee_write_byte (abfd,
106 (bfd_byte) ((int) ieee_number_repeat_start_enum
107 + length)))
108 return FALSE;
109 switch (length)
111 case 4:
112 if (! ieee_write_byte (abfd, (bfd_byte) (value >> 24)))
113 return FALSE;
114 /* Fall through. */
115 case 3:
116 if (! ieee_write_byte (abfd, (bfd_byte) (value >> 16)))
117 return FALSE;
118 /* Fall through. */
119 case 2:
120 if (! ieee_write_byte (abfd, (bfd_byte) (value >> 8)))
121 return FALSE;
122 /* Fall through. */
123 case 1:
124 if (! ieee_write_byte (abfd, (bfd_byte) (value)))
125 return FALSE;
129 return TRUE;
132 static bfd_boolean
133 ieee_write_id (bfd *abfd, const char *id)
135 size_t length = strlen (id);
137 if (length <= 127)
139 if (! ieee_write_byte (abfd, (bfd_byte) length))
140 return FALSE;
142 else if (length < 255)
144 if (! ieee_write_byte (abfd, ieee_extension_length_1_enum)
145 || ! ieee_write_byte (abfd, (bfd_byte) length))
146 return FALSE;
148 else if (length < 65535)
150 if (! ieee_write_byte (abfd, ieee_extension_length_2_enum)
151 || ! ieee_write_2bytes (abfd, (int) length))
152 return FALSE;
154 else
156 (*_bfd_error_handler)
157 (_("%s: string too long (%d chars, max 65535)"),
158 bfd_get_filename (abfd), length);
159 bfd_set_error (bfd_error_invalid_operation);
160 return FALSE;
163 if (bfd_bwrite ((void *) id, (bfd_size_type) length, abfd) != length)
164 return FALSE;
165 return TRUE;
168 /* Functions for reading from ieee files in the strange way that the
169 standard requires. */
171 #define this_byte(ieee) *((ieee)->input_p)
172 #define next_byte(ieee) ((ieee)->input_p++)
173 #define this_byte_and_next(ieee) (*((ieee)->input_p++))
175 static unsigned short
176 read_2bytes (common_header_type *ieee)
178 unsigned char c1 = this_byte_and_next (ieee);
179 unsigned char c2 = this_byte_and_next (ieee);
181 return (c1 << 8) | c2;
184 static void
185 bfd_get_string (common_header_type *ieee, char *string, size_t length)
187 size_t i;
189 for (i = 0; i < length; i++)
190 string[i] = this_byte_and_next (ieee);
193 static char *
194 read_id (common_header_type *ieee)
196 size_t length;
197 char *string;
199 length = this_byte_and_next (ieee);
200 if (length <= 0x7f)
201 /* Simple string of length 0 to 127. */
204 else if (length == 0xde)
205 /* Length is next byte, allowing 0..255. */
206 length = this_byte_and_next (ieee);
208 else if (length == 0xdf)
210 /* Length is next two bytes, allowing 0..65535. */
211 length = this_byte_and_next (ieee);
212 length = (length * 256) + this_byte_and_next (ieee);
215 /* Buy memory and read string. */
216 string = bfd_alloc (ieee->abfd, (bfd_size_type) length + 1);
217 if (!string)
218 return NULL;
219 bfd_get_string (ieee, string, length);
220 string[length] = 0;
221 return string;
224 static bfd_boolean
225 ieee_write_expression (bfd *abfd,
226 bfd_vma value,
227 asymbol *symbol,
228 bfd_boolean pcrel,
229 unsigned int index)
231 unsigned int term_count = 0;
233 if (value != 0)
235 if (! ieee_write_int (abfd, value))
236 return FALSE;
237 term_count++;
240 /* Badly formatted binaries can have a missing symbol,
241 so test here to prevent a seg fault. */
242 if (symbol != NULL)
244 if (bfd_is_com_section (symbol->section)
245 || bfd_is_und_section (symbol->section))
247 /* Def of a common symbol. */
248 if (! ieee_write_byte (abfd, ieee_variable_X_enum)
249 || ! ieee_write_int (abfd, symbol->value))
250 return FALSE;
251 term_count ++;
253 else if (! bfd_is_abs_section (symbol->section))
255 /* Ref to defined symbol - */
256 if (symbol->flags & BSF_GLOBAL)
258 if (! ieee_write_byte (abfd, ieee_variable_I_enum)
259 || ! ieee_write_int (abfd, symbol->value))
260 return FALSE;
261 term_count++;
263 else if (symbol->flags & (BSF_LOCAL | BSF_SECTION_SYM))
265 /* This is a reference to a defined local symbol. We can
266 easily do a local as a section+offset. */
267 if (! ieee_write_byte (abfd, ieee_variable_R_enum)
268 || ! ieee_write_byte (abfd,
269 (bfd_byte) (symbol->section->index
270 + IEEE_SECTION_NUMBER_BASE)))
271 return FALSE;
273 term_count++;
274 if (symbol->value != 0)
276 if (! ieee_write_int (abfd, symbol->value))
277 return FALSE;
278 term_count++;
281 else
283 (*_bfd_error_handler)
284 (_("%s: unrecognized symbol `%s' flags 0x%x"),
285 bfd_get_filename (abfd), bfd_asymbol_name (symbol),
286 symbol->flags);
287 bfd_set_error (bfd_error_invalid_operation);
288 return FALSE;
293 if (pcrel)
295 /* Subtract the pc from here by asking for PC of this section. */
296 if (! ieee_write_byte (abfd, ieee_variable_P_enum)
297 || ! ieee_write_byte (abfd,
298 (bfd_byte) (index + IEEE_SECTION_NUMBER_BASE))
299 || ! ieee_write_byte (abfd, ieee_function_minus_enum))
300 return FALSE;
303 /* Handle the degenerate case of a 0 address. */
304 if (term_count == 0)
305 if (! ieee_write_int (abfd, (bfd_vma) 0))
306 return FALSE;
308 while (term_count > 1)
310 if (! ieee_write_byte (abfd, ieee_function_plus_enum))
311 return FALSE;
312 term_count--;
315 return TRUE;
318 /* Writes any integer into the buffer supplied and always takes 5 bytes. */
320 static void
321 ieee_write_int5 (bfd_byte *buffer, bfd_vma value)
323 buffer[0] = (bfd_byte) ieee_number_repeat_4_enum;
324 buffer[1] = (value >> 24) & 0xff;
325 buffer[2] = (value >> 16) & 0xff;
326 buffer[3] = (value >> 8) & 0xff;
327 buffer[4] = (value >> 0) & 0xff;
330 static bfd_boolean
331 ieee_write_int5_out (bfd *abfd, bfd_vma value)
333 bfd_byte b[5];
335 ieee_write_int5 (b, value);
336 if (bfd_bwrite ((void *) b, (bfd_size_type) 5, abfd) != 5)
337 return FALSE;
338 return TRUE;
341 static bfd_boolean
342 parse_int (common_header_type *ieee, bfd_vma *value_ptr)
344 int value = this_byte (ieee);
345 int result;
347 if (value >= 0 && value <= 127)
349 *value_ptr = value;
350 next_byte (ieee);
351 return TRUE;
353 else if (value >= 0x80 && value <= 0x88)
355 unsigned int count = value & 0xf;
357 result = 0;
358 next_byte (ieee);
359 while (count)
361 result = (result << 8) | this_byte_and_next (ieee);
362 count--;
364 *value_ptr = result;
365 return TRUE;
367 return FALSE;
370 static int
371 parse_i (common_header_type *ieee, bfd_boolean *ok)
373 bfd_vma x;
374 *ok = parse_int (ieee, &x);
375 return x;
378 static bfd_vma
379 must_parse_int (common_header_type *ieee)
381 bfd_vma result;
382 BFD_ASSERT (parse_int (ieee, &result));
383 return result;
386 typedef struct
388 bfd_vma value;
389 asection *section;
390 ieee_symbol_index_type symbol;
391 } ieee_value_type;
394 #if KEEPMINUSPCININST
396 #define SRC_MASK(arg) arg
397 #define PCREL_OFFSET FALSE
399 #else
401 #define SRC_MASK(arg) 0
402 #define PCREL_OFFSET TRUE
404 #endif
406 static reloc_howto_type abs32_howto =
407 HOWTO (1,
411 FALSE,
413 complain_overflow_bitfield,
415 "abs32",
416 TRUE,
417 0xffffffff,
418 0xffffffff,
419 FALSE);
421 static reloc_howto_type abs16_howto =
422 HOWTO (1,
426 FALSE,
428 complain_overflow_bitfield,
430 "abs16",
431 TRUE,
432 0x0000ffff,
433 0x0000ffff,
434 FALSE);
436 static reloc_howto_type abs8_howto =
437 HOWTO (1,
441 FALSE,
443 complain_overflow_bitfield,
445 "abs8",
446 TRUE,
447 0x000000ff,
448 0x000000ff,
449 FALSE);
451 static reloc_howto_type rel32_howto =
452 HOWTO (1,
456 TRUE,
458 complain_overflow_signed,
460 "rel32",
461 TRUE,
462 SRC_MASK (0xffffffff),
463 0xffffffff,
464 PCREL_OFFSET);
466 static reloc_howto_type rel16_howto =
467 HOWTO (1,
471 TRUE,
473 complain_overflow_signed,
475 "rel16",
476 TRUE,
477 SRC_MASK (0x0000ffff),
478 0x0000ffff,
479 PCREL_OFFSET);
481 static reloc_howto_type rel8_howto =
482 HOWTO (1,
486 TRUE,
488 complain_overflow_signed,
490 "rel8",
491 TRUE,
492 SRC_MASK (0x000000ff),
493 0x000000ff,
494 PCREL_OFFSET);
496 static ieee_symbol_index_type NOSYMBOL = {0, 0};
498 static void
499 parse_expression (ieee_data_type *ieee,
500 bfd_vma *value,
501 ieee_symbol_index_type *symbol,
502 bfd_boolean *pcrel,
503 unsigned int *extra,
504 asection **section)
507 bfd_boolean loop = TRUE;
508 ieee_value_type stack[10];
509 ieee_value_type *sp = stack;
510 asection *dummy;
512 #define POS sp[1]
513 #define TOS sp[0]
514 #define NOS sp[-1]
515 #define INC sp++;
516 #define DEC sp--;
518 /* The stack pointer always points to the next unused location. */
519 #define PUSH(x,y,z) TOS.symbol = x; TOS.section = y; TOS.value = z; INC;
520 #define POP(x,y,z) DEC; x = TOS.symbol; y = TOS.section; z = TOS.value;
522 while (loop && ieee->h.input_p < ieee->h.last_byte)
524 switch (this_byte (&(ieee->h)))
526 case ieee_variable_P_enum:
527 /* P variable, current program counter for section n. */
529 int section_n;
531 next_byte (&(ieee->h));
532 *pcrel = TRUE;
533 section_n = must_parse_int (&(ieee->h));
534 PUSH (NOSYMBOL, bfd_abs_section_ptr, 0);
535 break;
537 case ieee_variable_L_enum:
538 /* L variable address of section N. */
539 next_byte (&(ieee->h));
540 PUSH (NOSYMBOL, ieee->section_table[must_parse_int (&(ieee->h))], 0);
541 break;
542 case ieee_variable_R_enum:
543 /* R variable, logical address of section module. */
544 /* FIXME, this should be different to L. */
545 next_byte (&(ieee->h));
546 PUSH (NOSYMBOL, ieee->section_table[must_parse_int (&(ieee->h))], 0);
547 break;
548 case ieee_variable_S_enum:
549 /* S variable, size in MAUS of section module. */
550 next_byte (&(ieee->h));
551 PUSH (NOSYMBOL,
553 ieee->section_table[must_parse_int (&(ieee->h))]->size);
554 break;
555 case ieee_variable_I_enum:
556 /* Push the address of variable n. */
558 ieee_symbol_index_type sy;
560 next_byte (&(ieee->h));
561 sy.index = (int) must_parse_int (&(ieee->h));
562 sy.letter = 'I';
564 PUSH (sy, bfd_abs_section_ptr, 0);
566 break;
567 case ieee_variable_X_enum:
568 /* Push the address of external variable n. */
570 ieee_symbol_index_type sy;
572 next_byte (&(ieee->h));
573 sy.index = (int) (must_parse_int (&(ieee->h)));
574 sy.letter = 'X';
576 PUSH (sy, bfd_und_section_ptr, 0);
578 break;
579 case ieee_function_minus_enum:
581 bfd_vma value1, value2;
582 asection *section1, *section_dummy;
583 ieee_symbol_index_type sy;
585 next_byte (&(ieee->h));
587 POP (sy, section1, value1);
588 POP (sy, section_dummy, value2);
589 PUSH (sy, section1 ? section1 : section_dummy, value2 - value1);
591 break;
592 case ieee_function_plus_enum:
594 bfd_vma value1, value2;
595 asection *section1;
596 asection *section2;
597 ieee_symbol_index_type sy1;
598 ieee_symbol_index_type sy2;
600 next_byte (&(ieee->h));
602 POP (sy1, section1, value1);
603 POP (sy2, section2, value2);
604 PUSH (sy1.letter ? sy1 : sy2,
605 bfd_is_abs_section (section1) ? section2 : section1,
606 value1 + value2);
608 break;
609 default:
611 bfd_vma va;
613 BFD_ASSERT (this_byte (&(ieee->h)) < (int) ieee_variable_A_enum
614 || this_byte (&(ieee->h)) > (int) ieee_variable_Z_enum);
615 if (parse_int (&(ieee->h), &va))
617 PUSH (NOSYMBOL, bfd_abs_section_ptr, va);
619 else
620 /* Thats all that we can understand. */
621 loop = FALSE;
626 /* As far as I can see there is a bug in the Microtec IEEE output
627 which I'm using to scan, whereby the comma operator is omitted
628 sometimes in an expression, giving expressions with too many
629 terms. We can tell if that's the case by ensuring that
630 sp == stack here. If not, then we've pushed something too far,
631 so we keep adding. */
632 while (sp != stack + 1)
634 asection *section1;
635 ieee_symbol_index_type sy1;
637 POP (sy1, section1, *extra);
640 POP (*symbol, dummy, *value);
641 if (section)
642 *section = dummy;
646 #define ieee_seek(ieee, offset) \
647 do \
649 ieee->h.input_p = ieee->h.first_byte + offset; \
650 ieee->h.last_byte = (ieee->h.first_byte \
651 + ieee_part_after (ieee, offset)); \
653 while (0)
655 #define ieee_pos(ieee) \
656 (ieee->h.input_p - ieee->h.first_byte)
658 /* Find the first part of the ieee file after HERE. */
660 static file_ptr
661 ieee_part_after (ieee_data_type *ieee, file_ptr here)
663 int part;
664 file_ptr after = ieee->w.r.me_record;
666 /* File parts can come in any order, except that module end is
667 guaranteed to be last (and the header first). */
668 for (part = 0; part < N_W_VARIABLES; part++)
669 if (ieee->w.offset[part] > here && after > ieee->w.offset[part])
670 after = ieee->w.offset[part];
672 return after;
675 static unsigned int last_index;
676 static char last_type; /* Is the index for an X or a D. */
678 static ieee_symbol_type *
679 get_symbol (bfd *abfd ATTRIBUTE_UNUSED,
680 ieee_data_type *ieee,
681 ieee_symbol_type *last_symbol,
682 unsigned int *symbol_count,
683 ieee_symbol_type ***pptr,
684 unsigned int *max_index,
685 int this_type)
687 /* Need a new symbol. */
688 unsigned int new_index = must_parse_int (&(ieee->h));
690 if (new_index != last_index || this_type != last_type)
692 ieee_symbol_type *new_symbol;
693 bfd_size_type amt = sizeof (ieee_symbol_type);
695 new_symbol = bfd_alloc (ieee->h.abfd, amt);
696 if (!new_symbol)
697 return NULL;
699 new_symbol->index = new_index;
700 last_index = new_index;
701 (*symbol_count)++;
702 **pptr = new_symbol;
703 *pptr = &new_symbol->next;
704 if (new_index > *max_index)
705 *max_index = new_index;
707 last_type = this_type;
708 new_symbol->symbol.section = bfd_abs_section_ptr;
709 return new_symbol;
711 return last_symbol;
714 static bfd_boolean
715 ieee_slurp_external_symbols (bfd *abfd)
717 ieee_data_type *ieee = IEEE_DATA (abfd);
718 file_ptr offset = ieee->w.r.external_part;
720 ieee_symbol_type **prev_symbols_ptr = &ieee->external_symbols;
721 ieee_symbol_type **prev_reference_ptr = &ieee->external_reference;
722 ieee_symbol_type *symbol = NULL;
723 unsigned int symbol_count = 0;
724 bfd_boolean loop = TRUE;
726 last_index = 0xffffff;
727 ieee->symbol_table_full = TRUE;
729 ieee_seek (ieee, offset);
731 while (loop)
733 switch (this_byte (&(ieee->h)))
735 case ieee_nn_record:
736 next_byte (&(ieee->h));
738 symbol = get_symbol (abfd, ieee, symbol, &symbol_count,
739 & prev_symbols_ptr,
740 & ieee->external_symbol_max_index, 'I');
741 if (symbol == NULL)
742 return FALSE;
744 symbol->symbol.the_bfd = abfd;
745 symbol->symbol.name = read_id (&(ieee->h));
746 symbol->symbol.udata.p = NULL;
747 symbol->symbol.flags = BSF_NO_FLAGS;
748 break;
749 case ieee_external_symbol_enum:
750 next_byte (&(ieee->h));
752 symbol = get_symbol (abfd, ieee, symbol, &symbol_count,
753 &prev_symbols_ptr,
754 &ieee->external_symbol_max_index, 'D');
755 if (symbol == NULL)
756 return FALSE;
758 BFD_ASSERT (symbol->index >= ieee->external_symbol_min_index);
760 symbol->symbol.the_bfd = abfd;
761 symbol->symbol.name = read_id (&(ieee->h));
762 symbol->symbol.udata.p = NULL;
763 symbol->symbol.flags = BSF_NO_FLAGS;
764 break;
765 case ieee_attribute_record_enum >> 8:
767 unsigned int symbol_name_index;
768 unsigned int symbol_type_index;
769 unsigned int symbol_attribute_def;
770 bfd_vma value;
772 switch (read_2bytes (&ieee->h))
774 case ieee_attribute_record_enum:
775 symbol_name_index = must_parse_int (&(ieee->h));
776 symbol_type_index = must_parse_int (&(ieee->h));
777 symbol_attribute_def = must_parse_int (&(ieee->h));
778 switch (symbol_attribute_def)
780 case 8:
781 case 19:
782 parse_int (&ieee->h, &value);
783 break;
784 default:
785 (*_bfd_error_handler)
786 (_("%B: unimplemented ATI record %u for symbol %u"),
787 abfd, symbol_attribute_def, symbol_name_index);
788 bfd_set_error (bfd_error_bad_value);
789 return FALSE;
790 break;
792 break;
793 case ieee_external_reference_info_record_enum:
794 /* Skip over ATX record. */
795 parse_int (&(ieee->h), &value);
796 parse_int (&(ieee->h), &value);
797 parse_int (&(ieee->h), &value);
798 parse_int (&(ieee->h), &value);
799 break;
800 case ieee_atn_record_enum:
801 /* We may get call optimization information here,
802 which we just ignore. The format is
803 {$F1}${CE}{index}{$00}{$3F}{$3F}{#_of_ASNs}. */
804 parse_int (&ieee->h, &value);
805 parse_int (&ieee->h, &value);
806 parse_int (&ieee->h, &value);
807 if (value != 0x3f)
809 (*_bfd_error_handler)
810 (_("%B: unexpected ATN type %d in external part"),
811 abfd, (int) value);
812 bfd_set_error (bfd_error_bad_value);
813 return FALSE;
815 parse_int (&ieee->h, &value);
816 parse_int (&ieee->h, &value);
817 while (value > 0)
819 bfd_vma val1;
821 --value;
823 switch (read_2bytes (&ieee->h))
825 case ieee_asn_record_enum:
826 parse_int (&ieee->h, &val1);
827 parse_int (&ieee->h, &val1);
828 break;
830 default:
831 (*_bfd_error_handler)
832 (_("%B: unexpected type after ATN"), abfd);
833 bfd_set_error (bfd_error_bad_value);
834 return FALSE;
839 break;
840 case ieee_value_record_enum >> 8:
842 unsigned int symbol_name_index;
843 ieee_symbol_index_type symbol_ignore;
844 bfd_boolean pcrel_ignore;
845 unsigned int extra;
847 next_byte (&(ieee->h));
848 next_byte (&(ieee->h));
850 symbol_name_index = must_parse_int (&(ieee->h));
851 parse_expression (ieee,
852 &symbol->symbol.value,
853 &symbol_ignore,
854 &pcrel_ignore,
855 &extra,
856 &symbol->symbol.section);
858 /* Fully linked IEEE-695 files tend to give every symbol
859 an absolute value. Try to convert that back into a
860 section relative value. FIXME: This won't always to
861 the right thing. */
862 if (bfd_is_abs_section (symbol->symbol.section)
863 && (abfd->flags & HAS_RELOC) == 0)
865 bfd_vma val;
866 asection *s;
868 val = symbol->symbol.value;
869 for (s = abfd->sections; s != NULL; s = s->next)
871 if (val >= s->vma && val < s->vma + s->size)
873 symbol->symbol.section = s;
874 symbol->symbol.value -= s->vma;
875 break;
880 symbol->symbol.flags = BSF_GLOBAL | BSF_EXPORT;
883 break;
884 case ieee_weak_external_reference_enum:
886 bfd_vma size;
887 bfd_vma value;
889 next_byte (&(ieee->h));
890 /* Throw away the external reference index. */
891 (void) must_parse_int (&(ieee->h));
892 /* Fetch the default size if not resolved. */
893 size = must_parse_int (&(ieee->h));
894 /* Fetch the default value if available. */
895 if (! parse_int (&(ieee->h), &value))
896 value = 0;
897 /* This turns into a common. */
898 symbol->symbol.section = bfd_com_section_ptr;
899 symbol->symbol.value = size;
901 break;
903 case ieee_external_reference_enum:
904 next_byte (&(ieee->h));
906 symbol = get_symbol (abfd, ieee, symbol, &symbol_count,
907 &prev_reference_ptr,
908 &ieee->external_reference_max_index, 'X');
909 if (symbol == NULL)
910 return FALSE;
912 symbol->symbol.the_bfd = abfd;
913 symbol->symbol.name = read_id (&(ieee->h));
914 symbol->symbol.udata.p = NULL;
915 symbol->symbol.section = bfd_und_section_ptr;
916 symbol->symbol.value = (bfd_vma) 0;
917 symbol->symbol.flags = 0;
919 BFD_ASSERT (symbol->index >= ieee->external_reference_min_index);
920 break;
922 default:
923 loop = FALSE;
927 if (ieee->external_symbol_max_index != 0)
929 ieee->external_symbol_count =
930 ieee->external_symbol_max_index -
931 ieee->external_symbol_min_index + 1;
933 else
934 ieee->external_symbol_count = 0;
936 if (ieee->external_reference_max_index != 0)
938 ieee->external_reference_count =
939 ieee->external_reference_max_index -
940 ieee->external_reference_min_index + 1;
942 else
943 ieee->external_reference_count = 0;
945 abfd->symcount =
946 ieee->external_reference_count + ieee->external_symbol_count;
948 if (symbol_count != abfd->symcount)
949 /* There are gaps in the table -- */
950 ieee->symbol_table_full = FALSE;
952 *prev_symbols_ptr = NULL;
953 *prev_reference_ptr = NULL;
955 return TRUE;
958 static bfd_boolean
959 ieee_slurp_symbol_table (bfd *abfd)
961 if (! IEEE_DATA (abfd)->read_symbols)
963 if (! ieee_slurp_external_symbols (abfd))
964 return FALSE;
965 IEEE_DATA (abfd)->read_symbols = TRUE;
967 return TRUE;
970 static long
971 ieee_get_symtab_upper_bound (bfd *abfd)
973 if (! ieee_slurp_symbol_table (abfd))
974 return -1;
976 return (abfd->symcount != 0) ?
977 (abfd->symcount + 1) * (sizeof (ieee_symbol_type *)) : 0;
980 /* Move from our internal lists to the canon table, and insert in
981 symbol index order. */
983 extern const bfd_target ieee_vec;
985 static long
986 ieee_canonicalize_symtab (bfd *abfd, asymbol **location)
988 ieee_symbol_type *symp;
989 static bfd dummy_bfd;
990 static asymbol empty_symbol =
992 &dummy_bfd,
993 " ieee empty",
994 (symvalue) 0,
995 BSF_DEBUGGING,
996 bfd_abs_section_ptr
997 #ifdef __STDC__
998 /* K&R compilers can't initialise unions. */
999 , { 0 }
1000 #endif
1003 if (abfd->symcount)
1005 ieee_data_type *ieee = IEEE_DATA (abfd);
1007 dummy_bfd.xvec = &ieee_vec;
1008 if (! ieee_slurp_symbol_table (abfd))
1009 return -1;
1011 if (! ieee->symbol_table_full)
1013 /* Arrgh - there are gaps in the table, run through and fill them
1014 up with pointers to a null place. */
1015 unsigned int i;
1017 for (i = 0; i < abfd->symcount; i++)
1018 location[i] = &empty_symbol;
1021 ieee->external_symbol_base_offset = -ieee->external_symbol_min_index;
1022 for (symp = IEEE_DATA (abfd)->external_symbols;
1023 symp != (ieee_symbol_type *) NULL;
1024 symp = symp->next)
1025 /* Place into table at correct index locations. */
1026 location[symp->index + ieee->external_symbol_base_offset] = &symp->symbol;
1028 /* The external refs are indexed in a bit. */
1029 ieee->external_reference_base_offset =
1030 -ieee->external_reference_min_index + ieee->external_symbol_count;
1032 for (symp = IEEE_DATA (abfd)->external_reference;
1033 symp != (ieee_symbol_type *) NULL;
1034 symp = symp->next)
1035 location[symp->index + ieee->external_reference_base_offset] =
1036 &symp->symbol;
1039 if (abfd->symcount)
1040 location[abfd->symcount] = (asymbol *) NULL;
1042 return abfd->symcount;
1045 static asection *
1046 get_section_entry (bfd *abfd, ieee_data_type *ieee, unsigned int index)
1048 if (index >= ieee->section_table_size)
1050 unsigned int c, i;
1051 asection **n;
1052 bfd_size_type amt;
1054 c = ieee->section_table_size;
1055 if (c == 0)
1056 c = 20;
1057 while (c <= index)
1058 c *= 2;
1060 amt = c;
1061 amt *= sizeof (asection *);
1062 n = bfd_realloc (ieee->section_table, amt);
1063 if (n == NULL)
1064 return NULL;
1066 for (i = ieee->section_table_size; i < c; i++)
1067 n[i] = NULL;
1069 ieee->section_table = n;
1070 ieee->section_table_size = c;
1073 if (ieee->section_table[index] == (asection *) NULL)
1075 char *tmp = bfd_alloc (abfd, (bfd_size_type) 11);
1076 asection *section;
1078 if (!tmp)
1079 return NULL;
1080 sprintf (tmp, " fsec%4d", index);
1081 section = bfd_make_section (abfd, tmp);
1082 ieee->section_table[index] = section;
1083 section->flags = SEC_NO_FLAGS;
1084 section->target_index = index;
1085 ieee->section_table[index] = section;
1087 return ieee->section_table[index];
1090 static void
1091 ieee_slurp_sections (bfd *abfd)
1093 ieee_data_type *ieee = IEEE_DATA (abfd);
1094 file_ptr offset = ieee->w.r.section_part;
1095 char *name;
1097 if (offset != 0)
1099 bfd_byte section_type[3];
1101 ieee_seek (ieee, offset);
1102 while (TRUE)
1104 switch (this_byte (&(ieee->h)))
1106 case ieee_section_type_enum:
1108 asection *section;
1109 unsigned int section_index;
1111 next_byte (&(ieee->h));
1112 section_index = must_parse_int (&(ieee->h));
1114 section = get_section_entry (abfd, ieee, section_index);
1116 section_type[0] = this_byte_and_next (&(ieee->h));
1118 /* Set minimal section attributes. Attributes are
1119 extended later, based on section contents. */
1120 switch (section_type[0])
1122 case 0xC1:
1123 /* Normal attributes for absolute sections. */
1124 section_type[1] = this_byte (&(ieee->h));
1125 section->flags = SEC_ALLOC;
1126 switch (section_type[1])
1128 /* AS Absolute section attributes. */
1129 case 0xD3:
1130 next_byte (&(ieee->h));
1131 section_type[2] = this_byte (&(ieee->h));
1132 switch (section_type[2])
1134 case 0xD0:
1135 /* Normal code. */
1136 next_byte (&(ieee->h));
1137 section->flags |= SEC_CODE;
1138 break;
1139 case 0xC4:
1140 /* Normal data. */
1141 next_byte (&(ieee->h));
1142 section->flags |= SEC_DATA;
1143 break;
1144 case 0xD2:
1145 next_byte (&(ieee->h));
1146 /* Normal rom data. */
1147 section->flags |= SEC_ROM | SEC_DATA;
1148 break;
1149 default:
1150 break;
1153 break;
1155 /* Named relocatable sections (type C). */
1156 case 0xC3:
1157 section_type[1] = this_byte (&(ieee->h));
1158 section->flags = SEC_ALLOC;
1159 switch (section_type[1])
1161 case 0xD0: /* Normal code (CP). */
1162 next_byte (&(ieee->h));
1163 section->flags |= SEC_CODE;
1164 break;
1165 case 0xC4: /* Normal data (CD). */
1166 next_byte (&(ieee->h));
1167 section->flags |= SEC_DATA;
1168 break;
1169 case 0xD2: /* Normal rom data (CR). */
1170 next_byte (&(ieee->h));
1171 section->flags |= SEC_ROM | SEC_DATA;
1172 break;
1173 default:
1174 break;
1178 /* Read section name, use it if non empty. */
1179 name = read_id (&ieee->h);
1180 if (name[0])
1181 section->name = name;
1183 /* Skip these fields, which we don't care about. */
1185 bfd_vma parent, brother, context;
1187 parse_int (&(ieee->h), &parent);
1188 parse_int (&(ieee->h), &brother);
1189 parse_int (&(ieee->h), &context);
1192 break;
1193 case ieee_section_alignment_enum:
1195 unsigned int section_index;
1196 bfd_vma value;
1197 asection *section;
1199 next_byte (&(ieee->h));
1200 section_index = must_parse_int (&ieee->h);
1201 section = get_section_entry (abfd, ieee, section_index);
1202 if (section_index > ieee->section_count)
1203 ieee->section_count = section_index;
1205 section->alignment_power =
1206 bfd_log2 (must_parse_int (&ieee->h));
1207 (void) parse_int (&(ieee->h), &value);
1209 break;
1210 case ieee_e2_first_byte_enum:
1212 asection *section;
1213 ieee_record_enum_type t;
1215 t = (ieee_record_enum_type) (read_2bytes (&(ieee->h)));
1216 switch (t)
1218 case ieee_section_size_enum:
1219 section = ieee->section_table[must_parse_int (&(ieee->h))];
1220 section->size = must_parse_int (&(ieee->h));
1221 break;
1222 case ieee_physical_region_size_enum:
1223 section = ieee->section_table[must_parse_int (&(ieee->h))];
1224 section->size = must_parse_int (&(ieee->h));
1225 break;
1226 case ieee_region_base_address_enum:
1227 section = ieee->section_table[must_parse_int (&(ieee->h))];
1228 section->vma = must_parse_int (&(ieee->h));
1229 section->lma = section->vma;
1230 break;
1231 case ieee_mau_size_enum:
1232 must_parse_int (&(ieee->h));
1233 must_parse_int (&(ieee->h));
1234 break;
1235 case ieee_m_value_enum:
1236 must_parse_int (&(ieee->h));
1237 must_parse_int (&(ieee->h));
1238 break;
1239 case ieee_section_base_address_enum:
1240 section = ieee->section_table[must_parse_int (&(ieee->h))];
1241 section->vma = must_parse_int (&(ieee->h));
1242 section->lma = section->vma;
1243 break;
1244 case ieee_section_offset_enum:
1245 (void) must_parse_int (&(ieee->h));
1246 (void) must_parse_int (&(ieee->h));
1247 break;
1248 default:
1249 return;
1252 break;
1253 default:
1254 return;
1260 /* Make a section for the debugging information, if any. We don't try
1261 to interpret the debugging information; we just point the section
1262 at the area in the file so that program which understand can dig it
1263 out. */
1265 static bfd_boolean
1266 ieee_slurp_debug (bfd *abfd)
1268 ieee_data_type *ieee = IEEE_DATA (abfd);
1269 asection *sec;
1270 file_ptr debug_end;
1272 if (ieee->w.r.debug_information_part == 0)
1273 return TRUE;
1275 sec = bfd_make_section (abfd, ".debug");
1276 if (sec == NULL)
1277 return FALSE;
1278 sec->flags |= SEC_DEBUGGING | SEC_HAS_CONTENTS;
1279 sec->filepos = ieee->w.r.debug_information_part;
1281 debug_end = ieee_part_after (ieee, ieee->w.r.debug_information_part);
1282 sec->size = debug_end - ieee->w.r.debug_information_part;
1284 return TRUE;
1287 /* Archive stuff. */
1289 static const bfd_target *
1290 ieee_archive_p (bfd *abfd)
1292 char *library;
1293 unsigned int i;
1294 unsigned char buffer[512];
1295 file_ptr buffer_offset = 0;
1296 ieee_ar_data_type *save = abfd->tdata.ieee_ar_data;
1297 ieee_ar_data_type *ieee;
1298 bfd_size_type alc_elts;
1299 ieee_ar_obstack_type *elts = NULL;
1300 bfd_size_type amt = sizeof (ieee_ar_data_type);
1302 abfd->tdata.ieee_ar_data = bfd_alloc (abfd, amt);
1303 if (!abfd->tdata.ieee_ar_data)
1304 goto error_ret_restore;
1305 ieee = IEEE_AR_DATA (abfd);
1307 /* Ignore the return value here. It doesn't matter if we don't read
1308 the entire buffer. We might have a very small ieee file. */
1309 bfd_bread ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd);
1311 ieee->h.first_byte = buffer;
1312 ieee->h.input_p = buffer;
1314 ieee->h.abfd = abfd;
1316 if (this_byte (&(ieee->h)) != Module_Beginning)
1317 goto got_wrong_format_error;
1319 next_byte (&(ieee->h));
1320 library = read_id (&(ieee->h));
1321 if (strcmp (library, "LIBRARY") != 0)
1322 goto got_wrong_format_error;
1324 /* Throw away the filename. */
1325 read_id (&(ieee->h));
1327 ieee->element_count = 0;
1328 ieee->element_index = 0;
1330 next_byte (&(ieee->h)); /* Drop the ad part. */
1331 must_parse_int (&(ieee->h)); /* And the two dummy numbers. */
1332 must_parse_int (&(ieee->h));
1334 alc_elts = 10;
1335 elts = bfd_malloc (alc_elts * sizeof *elts);
1336 if (elts == NULL)
1337 goto error_return;
1339 /* Read the index of the BB table. */
1340 while (1)
1342 int rec;
1343 ieee_ar_obstack_type *t;
1345 rec = read_2bytes (&(ieee->h));
1346 if (rec != (int) ieee_assign_value_to_variable_enum)
1347 break;
1349 if (ieee->element_count >= alc_elts)
1351 ieee_ar_obstack_type *n;
1353 alc_elts *= 2;
1354 n = bfd_realloc (elts, alc_elts * sizeof (* elts));
1355 if (n == NULL)
1356 goto error_return;
1357 elts = n;
1360 t = &elts[ieee->element_count];
1361 ieee->element_count++;
1363 must_parse_int (&(ieee->h));
1364 t->file_offset = must_parse_int (&(ieee->h));
1365 t->abfd = (bfd *) NULL;
1367 /* Make sure that we don't go over the end of the buffer. */
1368 if ((size_t) ieee_pos (IEEE_DATA (abfd)) > sizeof (buffer) / 2)
1370 /* Past half way, reseek and reprime. */
1371 buffer_offset += ieee_pos (IEEE_DATA (abfd));
1372 if (bfd_seek (abfd, buffer_offset, SEEK_SET) != 0)
1373 goto error_return;
1375 /* Again ignore return value of bfd_bread. */
1376 bfd_bread ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd);
1377 ieee->h.first_byte = buffer;
1378 ieee->h.input_p = buffer;
1382 amt = ieee->element_count;
1383 amt *= sizeof *ieee->elements;
1384 ieee->elements = bfd_alloc (abfd, amt);
1385 if (ieee->elements == NULL)
1386 goto error_return;
1388 memcpy (ieee->elements, elts, (size_t) amt);
1389 free (elts);
1390 elts = NULL;
1392 /* Now scan the area again, and replace BB offsets with file offsets. */
1393 for (i = 2; i < ieee->element_count; i++)
1395 if (bfd_seek (abfd, ieee->elements[i].file_offset, SEEK_SET) != 0)
1396 goto error_return;
1398 /* Again ignore return value of bfd_bread. */
1399 bfd_bread ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd);
1400 ieee->h.first_byte = buffer;
1401 ieee->h.input_p = buffer;
1403 next_byte (&(ieee->h)); /* Drop F8. */
1404 next_byte (&(ieee->h)); /* Drop 14. */
1405 must_parse_int (&(ieee->h)); /* Drop size of block. */
1407 if (must_parse_int (&(ieee->h)) != 0)
1408 /* This object has been deleted. */
1409 ieee->elements[i].file_offset = 0;
1410 else
1411 ieee->elements[i].file_offset = must_parse_int (&(ieee->h));
1414 /* abfd->has_armap = ;*/
1416 return abfd->xvec;
1418 got_wrong_format_error:
1419 bfd_set_error (bfd_error_wrong_format);
1420 error_return:
1421 if (elts != NULL)
1422 free (elts);
1423 bfd_release (abfd, ieee);
1424 error_ret_restore:
1425 abfd->tdata.ieee_ar_data = save;
1427 return NULL;
1430 static bfd_boolean
1431 ieee_mkobject (bfd *abfd)
1433 bfd_size_type amt;
1435 output_ptr_start = NULL;
1436 output_ptr = NULL;
1437 output_ptr_end = NULL;
1438 input_ptr_start = NULL;
1439 input_ptr = NULL;
1440 input_ptr_end = NULL;
1441 input_bfd = NULL;
1442 output_bfd = NULL;
1443 output_buffer = 0;
1444 amt = sizeof (ieee_data_type);
1445 abfd->tdata.ieee_data = bfd_zalloc (abfd, amt);
1446 return abfd->tdata.ieee_data != NULL;
1449 static bfd_boolean
1450 do_one (ieee_data_type *ieee,
1451 ieee_per_section_type *current_map,
1452 unsigned char *location_ptr,
1453 asection *s,
1454 int iterations)
1456 switch (this_byte (&(ieee->h)))
1458 case ieee_load_constant_bytes_enum:
1460 unsigned int number_of_maus;
1461 unsigned int i;
1463 next_byte (&(ieee->h));
1464 number_of_maus = must_parse_int (&(ieee->h));
1466 for (i = 0; i < number_of_maus; i++)
1468 location_ptr[current_map->pc++] = this_byte (&(ieee->h));
1469 next_byte (&(ieee->h));
1472 break;
1474 case ieee_load_with_relocation_enum:
1476 bfd_boolean loop = TRUE;
1478 next_byte (&(ieee->h));
1479 while (loop)
1481 switch (this_byte (&(ieee->h)))
1483 case ieee_variable_R_enum:
1485 case ieee_function_signed_open_b_enum:
1486 case ieee_function_unsigned_open_b_enum:
1487 case ieee_function_either_open_b_enum:
1489 unsigned int extra = 4;
1490 bfd_boolean pcrel = FALSE;
1491 asection *section;
1492 ieee_reloc_type *r;
1494 r = bfd_alloc (ieee->h.abfd, sizeof (* r));
1495 if (!r)
1496 return FALSE;
1498 *(current_map->reloc_tail_ptr) = r;
1499 current_map->reloc_tail_ptr = &r->next;
1500 r->next = (ieee_reloc_type *) NULL;
1501 next_byte (&(ieee->h));
1502 /* abort();*/
1503 r->relent.sym_ptr_ptr = 0;
1504 parse_expression (ieee,
1505 &r->relent.addend,
1506 &r->symbol,
1507 &pcrel, &extra, &section);
1508 r->relent.address = current_map->pc;
1509 s->flags |= SEC_RELOC;
1510 s->owner->flags |= HAS_RELOC;
1511 s->reloc_count++;
1512 if (r->relent.sym_ptr_ptr == NULL && section != NULL)
1513 r->relent.sym_ptr_ptr = section->symbol_ptr_ptr;
1515 if (this_byte (&(ieee->h)) == (int) ieee_comma)
1517 next_byte (&(ieee->h));
1518 /* Fetch number of bytes to pad. */
1519 extra = must_parse_int (&(ieee->h));
1522 switch (this_byte (&(ieee->h)))
1524 case ieee_function_signed_close_b_enum:
1525 next_byte (&(ieee->h));
1526 break;
1527 case ieee_function_unsigned_close_b_enum:
1528 next_byte (&(ieee->h));
1529 break;
1530 case ieee_function_either_close_b_enum:
1531 next_byte (&(ieee->h));
1532 break;
1533 default:
1534 break;
1536 /* Build a relocation entry for this type. */
1537 /* If pc rel then stick -ve pc into instruction
1538 and take out of reloc ..
1540 I've changed this. It's all too complicated. I
1541 keep 0 in the instruction now. */
1543 switch (extra)
1545 case 0:
1546 case 4:
1548 if (pcrel)
1550 #if KEEPMINUSPCININST
1551 bfd_put_32 (ieee->h.abfd, -current_map->pc,
1552 location_ptr + current_map->pc);
1553 r->relent.howto = &rel32_howto;
1554 r->relent.addend -= current_map->pc;
1555 #else
1556 bfd_put_32 (ieee->h.abfd, (bfd_vma) 0, location_ptr +
1557 current_map->pc);
1558 r->relent.howto = &rel32_howto;
1559 #endif
1561 else
1563 bfd_put_32 (ieee->h.abfd, (bfd_vma) 0,
1564 location_ptr + current_map->pc);
1565 r->relent.howto = &abs32_howto;
1567 current_map->pc += 4;
1568 break;
1569 case 2:
1570 if (pcrel)
1572 #if KEEPMINUSPCININST
1573 bfd_put_16 (ieee->h.abfd, (bfd_vma) -current_map->pc,
1574 location_ptr + current_map->pc);
1575 r->relent.addend -= current_map->pc;
1576 r->relent.howto = &rel16_howto;
1577 #else
1579 bfd_put_16 (ieee->h.abfd, (bfd_vma) 0,
1580 location_ptr + current_map->pc);
1581 r->relent.howto = &rel16_howto;
1582 #endif
1585 else
1587 bfd_put_16 (ieee->h.abfd, (bfd_vma) 0,
1588 location_ptr + current_map->pc);
1589 r->relent.howto = &abs16_howto;
1591 current_map->pc += 2;
1592 break;
1593 case 1:
1594 if (pcrel)
1596 #if KEEPMINUSPCININST
1597 bfd_put_8 (ieee->h.abfd, (int) (-current_map->pc), location_ptr + current_map->pc);
1598 r->relent.addend -= current_map->pc;
1599 r->relent.howto = &rel8_howto;
1600 #else
1601 bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1602 r->relent.howto = &rel8_howto;
1603 #endif
1605 else
1607 bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1608 r->relent.howto = &abs8_howto;
1610 current_map->pc += 1;
1611 break;
1613 default:
1614 BFD_FAIL ();
1615 return FALSE;
1618 break;
1619 default:
1621 bfd_vma this_size;
1623 if (parse_int (&(ieee->h), &this_size))
1625 unsigned int i;
1627 for (i = 0; i < this_size; i++)
1629 location_ptr[current_map->pc++] = this_byte (&(ieee->h));
1630 next_byte (&(ieee->h));
1633 else
1634 loop = FALSE;
1638 /* Prevent more than the first load-item of an LR record
1639 from being repeated (MRI convention). */
1640 if (iterations != 1)
1641 loop = FALSE;
1645 return TRUE;
1648 /* Read in all the section data and relocation stuff too. */
1650 static bfd_boolean
1651 ieee_slurp_section_data (bfd *abfd)
1653 bfd_byte *location_ptr = (bfd_byte *) NULL;
1654 ieee_data_type *ieee = IEEE_DATA (abfd);
1655 unsigned int section_number;
1656 ieee_per_section_type *current_map = NULL;
1657 asection *s;
1659 /* Seek to the start of the data area. */
1660 if (ieee->read_data)
1661 return TRUE;
1662 ieee->read_data = TRUE;
1663 ieee_seek (ieee, ieee->w.r.data_part);
1665 /* Allocate enough space for all the section contents. */
1666 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
1668 ieee_per_section_type *per = ieee_per_section (s);
1670 if ((s->flags & SEC_DEBUGGING) != 0)
1671 continue;
1672 per->data = bfd_alloc (ieee->h.abfd, s->size);
1673 if (!per->data)
1674 return FALSE;
1675 per->reloc_tail_ptr =
1676 (ieee_reloc_type **) & (s->relocation);
1679 while (TRUE)
1681 switch (this_byte (&(ieee->h)))
1683 /* IF we see anything strange then quit. */
1684 default:
1685 return TRUE;
1687 case ieee_set_current_section_enum:
1688 next_byte (&(ieee->h));
1689 section_number = must_parse_int (&(ieee->h));
1690 s = ieee->section_table[section_number];
1691 s->flags |= SEC_LOAD | SEC_HAS_CONTENTS;
1692 current_map = ieee_per_section (s);
1693 location_ptr = current_map->data - s->vma;
1694 /* The document I have says that Microtec's compilers reset
1695 this after a sec section, even though the standard says not
1696 to, SO... */
1697 current_map->pc = s->vma;
1698 break;
1700 case ieee_e2_first_byte_enum:
1701 next_byte (&(ieee->h));
1702 switch (this_byte (&(ieee->h)))
1704 case ieee_set_current_pc_enum & 0xff:
1706 bfd_vma value;
1707 ieee_symbol_index_type symbol;
1708 unsigned int extra;
1709 bfd_boolean pcrel;
1711 next_byte (&(ieee->h));
1712 must_parse_int (&(ieee->h)); /* Throw away section #. */
1713 parse_expression (ieee, &value,
1714 &symbol,
1715 &pcrel, &extra,
1717 current_map->pc = value;
1718 BFD_ASSERT ((unsigned) (value - s->vma) <= s->size);
1720 break;
1722 case ieee_value_starting_address_enum & 0xff:
1723 next_byte (&(ieee->h));
1724 if (this_byte (&(ieee->h)) == ieee_function_either_open_b_enum)
1725 next_byte (&(ieee->h));
1726 abfd->start_address = must_parse_int (&(ieee->h));
1727 /* We've got to the end of the data now - */
1728 return TRUE;
1729 default:
1730 BFD_FAIL ();
1731 return FALSE;
1733 break;
1734 case ieee_repeat_data_enum:
1736 /* Repeat the following LD or LR n times - we do this by
1737 remembering the stream pointer before running it and
1738 resetting it and running it n times. We special case
1739 the repetition of a repeat_data/load_constant. */
1740 unsigned int iterations;
1741 unsigned char *start;
1743 next_byte (&(ieee->h));
1744 iterations = must_parse_int (&(ieee->h));
1745 start = ieee->h.input_p;
1746 if (start[0] == (int) ieee_load_constant_bytes_enum
1747 && start[1] == 1)
1749 while (iterations != 0)
1751 location_ptr[current_map->pc++] = start[2];
1752 iterations--;
1754 next_byte (&(ieee->h));
1755 next_byte (&(ieee->h));
1756 next_byte (&(ieee->h));
1758 else
1760 while (iterations != 0)
1762 ieee->h.input_p = start;
1763 if (!do_one (ieee, current_map, location_ptr, s,
1764 (int) iterations))
1765 return FALSE;
1766 iterations--;
1770 break;
1771 case ieee_load_constant_bytes_enum:
1772 case ieee_load_with_relocation_enum:
1773 if (!do_one (ieee, current_map, location_ptr, s, 1))
1774 return FALSE;
1779 static const bfd_target *
1780 ieee_object_p (bfd *abfd)
1782 char *processor;
1783 unsigned int part;
1784 ieee_data_type *ieee;
1785 unsigned char buffer[300];
1786 ieee_data_type *save = IEEE_DATA (abfd);
1787 bfd_size_type amt;
1789 abfd->tdata.ieee_data = 0;
1790 ieee_mkobject (abfd);
1792 ieee = IEEE_DATA (abfd);
1793 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
1794 goto fail;
1795 /* Read the first few bytes in to see if it makes sense. Ignore
1796 bfd_bread return value; The file might be very small. */
1797 bfd_bread ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd);
1799 ieee->h.input_p = buffer;
1800 if (this_byte_and_next (&(ieee->h)) != Module_Beginning)
1801 goto got_wrong_format;
1803 ieee->read_symbols = FALSE;
1804 ieee->read_data = FALSE;
1805 ieee->section_count = 0;
1806 ieee->external_symbol_max_index = 0;
1807 ieee->external_symbol_min_index = IEEE_PUBLIC_BASE;
1808 ieee->external_reference_min_index = IEEE_REFERENCE_BASE;
1809 ieee->external_reference_max_index = 0;
1810 ieee->h.abfd = abfd;
1811 ieee->section_table = NULL;
1812 ieee->section_table_size = 0;
1814 processor = ieee->mb.processor = read_id (&(ieee->h));
1815 if (strcmp (processor, "LIBRARY") == 0)
1816 goto got_wrong_format;
1817 ieee->mb.module_name = read_id (&(ieee->h));
1818 if (abfd->filename == (const char *) NULL)
1819 abfd->filename = ieee->mb.module_name;
1821 /* Determine the architecture and machine type of the object file. */
1823 const bfd_arch_info_type *arch;
1824 char family[10];
1826 /* IEEE does not specify the format of the processor identification
1827 string, so the compiler is free to put in it whatever it wants.
1828 We try here to recognize different processors belonging to the
1829 m68k family. Code for other processors can be added here. */
1830 if ((processor[0] == '6') && (processor[1] == '8'))
1832 if (processor[2] == '3') /* 683xx integrated processors. */
1834 switch (processor[3])
1836 case '0': /* 68302, 68306, 68307 */
1837 case '2': /* 68322, 68328 */
1838 case '5': /* 68356 */
1839 strcpy (family, "68000"); /* MC68000-based controllers. */
1840 break;
1842 case '3': /* 68330, 68331, 68332, 68333,
1843 68334, 68335, 68336, 68338 */
1844 case '6': /* 68360 */
1845 case '7': /* 68376 */
1846 strcpy (family, "68332"); /* CPU32 and CPU32+ */
1847 break;
1849 case '4':
1850 if (processor[4] == '9') /* 68349 */
1851 strcpy (family, "68030"); /* CPU030 */
1852 else /* 68340, 68341 */
1853 strcpy (family, "68332"); /* CPU32 and CPU32+ */
1854 break;
1856 default: /* Does not exist yet. */
1857 strcpy (family, "68332"); /* Guess it will be CPU32 */
1860 else if (TOUPPER (processor[3]) == 'F') /* 68F333 */
1861 strcpy (family, "68332"); /* CPU32 */
1862 else if ((TOUPPER (processor[3]) == 'C') /* Embedded controllers. */
1863 && ((TOUPPER (processor[2]) == 'E')
1864 || (TOUPPER (processor[2]) == 'H')
1865 || (TOUPPER (processor[2]) == 'L')))
1867 strcpy (family, "68");
1868 strncat (family, processor + 4, 7);
1869 family[9] = '\0';
1871 else /* "Regular" processors. */
1873 strncpy (family, processor, 9);
1874 family[9] = '\0';
1877 else if ((strncmp (processor, "cpu32", 5) == 0) /* CPU32 and CPU32+ */
1878 || (strncmp (processor, "CPU32", 5) == 0))
1879 strcpy (family, "68332");
1880 else
1882 strncpy (family, processor, 9);
1883 family[9] = '\0';
1886 arch = bfd_scan_arch (family);
1887 if (arch == 0)
1888 goto got_wrong_format;
1889 abfd->arch_info = arch;
1892 if (this_byte (&(ieee->h)) != (int) ieee_address_descriptor_enum)
1893 goto fail;
1895 next_byte (&(ieee->h));
1897 if (! parse_int (&(ieee->h), &ieee->ad.number_of_bits_mau))
1898 goto fail;
1900 if (! parse_int (&(ieee->h), &ieee->ad.number_of_maus_in_address))
1901 goto fail;
1903 /* If there is a byte order info, take it. */
1904 if (this_byte (&(ieee->h)) == (int) ieee_variable_L_enum
1905 || this_byte (&(ieee->h)) == (int) ieee_variable_M_enum)
1906 next_byte (&(ieee->h));
1908 for (part = 0; part < N_W_VARIABLES; part++)
1910 bfd_boolean ok;
1912 if (read_2bytes (&(ieee->h)) != (int) ieee_assign_value_to_variable_enum)
1913 goto fail;
1915 if (this_byte_and_next (&(ieee->h)) != part)
1916 goto fail;
1918 ieee->w.offset[part] = parse_i (&(ieee->h), &ok);
1919 if (! ok)
1920 goto fail;
1923 if (ieee->w.r.external_part != 0)
1924 abfd->flags = HAS_SYMS;
1926 /* By now we know that this is a real IEEE file, we're going to read
1927 the whole thing into memory so that we can run up and down it
1928 quickly. We can work out how big the file is from the trailer
1929 record. */
1931 amt = ieee->w.r.me_record + 1;
1932 IEEE_DATA (abfd)->h.first_byte = bfd_alloc (ieee->h.abfd, amt);
1933 if (!IEEE_DATA (abfd)->h.first_byte)
1934 goto fail;
1935 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
1936 goto fail;
1937 /* FIXME: Check return value. I'm not sure whether it needs to read
1938 the entire buffer or not. */
1939 bfd_bread ((void *) (IEEE_DATA (abfd)->h.first_byte),
1940 (bfd_size_type) ieee->w.r.me_record + 1, abfd);
1942 ieee_slurp_sections (abfd);
1944 if (! ieee_slurp_debug (abfd))
1945 goto fail;
1947 /* Parse section data to activate file and section flags implied by
1948 section contents. */
1949 if (! ieee_slurp_section_data (abfd))
1950 goto fail;
1952 return abfd->xvec;
1953 got_wrong_format:
1954 bfd_set_error (bfd_error_wrong_format);
1955 fail:
1956 bfd_release (abfd, ieee);
1957 abfd->tdata.ieee_data = save;
1958 return (const bfd_target *) NULL;
1961 static void
1962 ieee_get_symbol_info (bfd *ignore_abfd ATTRIBUTE_UNUSED,
1963 asymbol *symbol,
1964 symbol_info *ret)
1966 bfd_symbol_info (symbol, ret);
1967 if (symbol->name[0] == ' ')
1968 ret->name = "* empty table entry ";
1969 if (!symbol->section)
1970 ret->type = (symbol->flags & BSF_LOCAL) ? 'a' : 'A';
1973 static void
1974 ieee_print_symbol (bfd *abfd,
1975 void * afile,
1976 asymbol *symbol,
1977 bfd_print_symbol_type how)
1979 FILE *file = (FILE *) afile;
1981 switch (how)
1983 case bfd_print_symbol_name:
1984 fprintf (file, "%s", symbol->name);
1985 break;
1986 case bfd_print_symbol_more:
1987 BFD_FAIL ();
1988 break;
1989 case bfd_print_symbol_all:
1991 const char *section_name =
1992 (symbol->section == (asection *) NULL
1993 ? "*abs"
1994 : symbol->section->name);
1996 if (symbol->name[0] == ' ')
1997 fprintf (file, "* empty table entry ");
1998 else
2000 bfd_print_symbol_vandf (abfd, (void *) file, symbol);
2002 fprintf (file, " %-5s %04x %02x %s",
2003 section_name,
2004 (unsigned) ieee_symbol (symbol)->index,
2005 (unsigned) 0,
2006 symbol->name);
2009 break;
2013 static bfd_boolean
2014 ieee_new_section_hook (bfd *abfd, asection *newsect)
2016 newsect->used_by_bfd = bfd_alloc (abfd, (bfd_size_type) sizeof (ieee_per_section_type));
2017 if (!newsect->used_by_bfd)
2018 return FALSE;
2019 ieee_per_section (newsect)->data = NULL;
2020 ieee_per_section (newsect)->section = newsect;
2021 return TRUE;
2024 static long
2025 ieee_get_reloc_upper_bound (bfd *abfd, sec_ptr asect)
2027 if ((asect->flags & SEC_DEBUGGING) != 0)
2028 return 0;
2029 if (! ieee_slurp_section_data (abfd))
2030 return -1;
2031 return (asect->reloc_count + 1) * sizeof (arelent *);
2034 static bfd_boolean
2035 ieee_get_section_contents (bfd *abfd,
2036 sec_ptr section,
2037 void * location,
2038 file_ptr offset,
2039 bfd_size_type count)
2041 ieee_per_section_type *p = ieee_per_section (section);
2042 if ((section->flags & SEC_DEBUGGING) != 0)
2043 return _bfd_generic_get_section_contents (abfd, section, location,
2044 offset, count);
2045 ieee_slurp_section_data (abfd);
2046 (void) memcpy ((void *) location, (void *) (p->data + offset), (unsigned) count);
2047 return TRUE;
2050 static long
2051 ieee_canonicalize_reloc (bfd *abfd,
2052 sec_ptr section,
2053 arelent **relptr,
2054 asymbol **symbols)
2056 ieee_reloc_type *src = (ieee_reloc_type *) (section->relocation);
2057 ieee_data_type *ieee = IEEE_DATA (abfd);
2059 if ((section->flags & SEC_DEBUGGING) != 0)
2060 return 0;
2062 while (src != (ieee_reloc_type *) NULL)
2064 /* Work out which symbol to attach it this reloc to. */
2065 switch (src->symbol.letter)
2067 case 'I':
2068 src->relent.sym_ptr_ptr =
2069 symbols + src->symbol.index + ieee->external_symbol_base_offset;
2070 break;
2071 case 'X':
2072 src->relent.sym_ptr_ptr =
2073 symbols + src->symbol.index + ieee->external_reference_base_offset;
2074 break;
2075 case 0:
2076 if (src->relent.sym_ptr_ptr != NULL)
2077 src->relent.sym_ptr_ptr =
2078 src->relent.sym_ptr_ptr[0]->section->symbol_ptr_ptr;
2079 break;
2080 default:
2082 BFD_FAIL ();
2084 *relptr++ = &src->relent;
2085 src = src->next;
2087 *relptr = NULL;
2088 return section->reloc_count;
2091 static int
2092 comp (const void * ap, const void * bp)
2094 arelent *a = *((arelent **) ap);
2095 arelent *b = *((arelent **) bp);
2096 return a->address - b->address;
2099 /* Write the section headers. */
2101 static bfd_boolean
2102 ieee_write_section_part (bfd *abfd)
2104 ieee_data_type *ieee = IEEE_DATA (abfd);
2105 asection *s;
2107 ieee->w.r.section_part = bfd_tell (abfd);
2108 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
2110 if (! bfd_is_abs_section (s)
2111 && (s->flags & SEC_DEBUGGING) == 0)
2113 if (! ieee_write_byte (abfd, ieee_section_type_enum)
2114 || ! ieee_write_byte (abfd,
2115 (bfd_byte) (s->index
2116 + IEEE_SECTION_NUMBER_BASE)))
2117 return FALSE;
2119 if (abfd->flags & EXEC_P)
2121 /* This image is executable, so output absolute sections. */
2122 if (! ieee_write_byte (abfd, ieee_variable_A_enum)
2123 || ! ieee_write_byte (abfd, ieee_variable_S_enum))
2124 return FALSE;
2126 else
2128 if (! ieee_write_byte (abfd, ieee_variable_C_enum))
2129 return FALSE;
2132 switch (s->flags & (SEC_CODE | SEC_DATA | SEC_ROM))
2134 case SEC_CODE | SEC_LOAD:
2135 case SEC_CODE:
2136 if (! ieee_write_byte (abfd, ieee_variable_P_enum))
2137 return FALSE;
2138 break;
2139 case SEC_DATA:
2140 default:
2141 if (! ieee_write_byte (abfd, ieee_variable_D_enum))
2142 return FALSE;
2143 break;
2144 case SEC_ROM:
2145 case SEC_ROM | SEC_DATA:
2146 case SEC_ROM | SEC_LOAD:
2147 case SEC_ROM | SEC_DATA | SEC_LOAD:
2148 if (! ieee_write_byte (abfd, ieee_variable_R_enum))
2149 return FALSE;
2153 if (! ieee_write_id (abfd, s->name))
2154 return FALSE;
2155 /* Alignment. */
2156 if (! ieee_write_byte (abfd, ieee_section_alignment_enum)
2157 || ! ieee_write_byte (abfd,
2158 (bfd_byte) (s->index
2159 + IEEE_SECTION_NUMBER_BASE))
2160 || ! ieee_write_int (abfd, (bfd_vma) 1 << s->alignment_power))
2161 return FALSE;
2163 /* Size. */
2164 if (! ieee_write_2bytes (abfd, ieee_section_size_enum)
2165 || ! ieee_write_byte (abfd,
2166 (bfd_byte) (s->index
2167 + IEEE_SECTION_NUMBER_BASE))
2168 || ! ieee_write_int (abfd, s->size))
2169 return FALSE;
2170 if (abfd->flags & EXEC_P)
2172 /* Relocateable sections don't have asl records. */
2173 /* Vma. */
2174 if (! ieee_write_2bytes (abfd, ieee_section_base_address_enum)
2175 || ! ieee_write_byte (abfd,
2176 ((bfd_byte)
2177 (s->index
2178 + IEEE_SECTION_NUMBER_BASE)))
2179 || ! ieee_write_int (abfd, s->lma))
2180 return FALSE;
2185 return TRUE;
2188 static bfd_boolean
2189 do_with_relocs (bfd *abfd, asection *s)
2191 unsigned int number_of_maus_in_address =
2192 bfd_arch_bits_per_address (abfd) / bfd_arch_bits_per_byte (abfd);
2193 unsigned int relocs_to_go = s->reloc_count;
2194 bfd_byte *stream = ieee_per_section (s)->data;
2195 arelent **p = s->orelocation;
2196 bfd_size_type current_byte_index = 0;
2198 qsort (s->orelocation,
2199 relocs_to_go,
2200 sizeof (arelent **),
2201 comp);
2203 /* Output the section preheader. */
2204 if (! ieee_write_byte (abfd, ieee_set_current_section_enum)
2205 || ! ieee_write_byte (abfd,
2206 (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE))
2207 || ! ieee_write_2bytes (abfd, ieee_set_current_pc_enum)
2208 || ! ieee_write_byte (abfd,
2209 (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE)))
2210 return FALSE;
2212 if ((abfd->flags & EXEC_P) != 0 && relocs_to_go == 0)
2214 if (! ieee_write_int (abfd, s->lma))
2215 return FALSE;
2217 else
2219 if (! ieee_write_expression (abfd, (bfd_vma) 0, s->symbol, 0, 0))
2220 return FALSE;
2223 if (relocs_to_go == 0)
2225 /* If there aren't any relocations then output the load constant
2226 byte opcode rather than the load with relocation opcode. */
2227 while (current_byte_index < s->size)
2229 bfd_size_type run;
2230 unsigned int MAXRUN = 127;
2232 run = MAXRUN;
2233 if (run > s->size - current_byte_index)
2234 run = s->size - current_byte_index;
2236 if (run != 0)
2238 if (! ieee_write_byte (abfd, ieee_load_constant_bytes_enum))
2239 return FALSE;
2240 /* Output a stream of bytes. */
2241 if (! ieee_write_int (abfd, run))
2242 return FALSE;
2243 if (bfd_bwrite ((void *) (stream + current_byte_index), run, abfd)
2244 != run)
2245 return FALSE;
2246 current_byte_index += run;
2250 else
2252 if (! ieee_write_byte (abfd, ieee_load_with_relocation_enum))
2253 return FALSE;
2255 /* Output the data stream as the longest sequence of bytes
2256 possible, allowing for the a reasonable packet size and
2257 relocation stuffs. */
2258 if (stream == NULL)
2260 /* Outputting a section without data, fill it up. */
2261 stream = bfd_zalloc (abfd, s->size);
2262 if (!stream)
2263 return FALSE;
2265 while (current_byte_index < s->size)
2267 bfd_size_type run;
2268 unsigned int MAXRUN = 127;
2270 if (relocs_to_go)
2272 run = (*p)->address - current_byte_index;
2273 if (run > MAXRUN)
2274 run = MAXRUN;
2276 else
2277 run = MAXRUN;
2279 if (run > s->size - current_byte_index)
2280 run = s->size - current_byte_index;
2282 if (run != 0)
2284 /* Output a stream of bytes. */
2285 if (! ieee_write_int (abfd, run))
2286 return FALSE;
2287 if (bfd_bwrite ((void *) (stream + current_byte_index), run, abfd)
2288 != run)
2289 return FALSE;
2290 current_byte_index += run;
2293 /* Output any relocations here. */
2294 if (relocs_to_go && (*p) && (*p)->address == current_byte_index)
2296 while (relocs_to_go
2297 && (*p) && (*p)->address == current_byte_index)
2299 arelent *r = *p;
2300 bfd_signed_vma ov;
2301 switch (r->howto->size)
2303 case 2:
2304 ov = bfd_get_signed_32 (abfd,
2305 stream + current_byte_index);
2306 current_byte_index += 4;
2307 break;
2308 case 1:
2309 ov = bfd_get_signed_16 (abfd,
2310 stream + current_byte_index);
2311 current_byte_index += 2;
2312 break;
2313 case 0:
2314 ov = bfd_get_signed_8 (abfd,
2315 stream + current_byte_index);
2316 current_byte_index++;
2317 break;
2318 default:
2319 ov = 0;
2320 BFD_FAIL ();
2321 return FALSE;
2324 ov &= r->howto->src_mask;
2326 if (r->howto->pc_relative
2327 && ! r->howto->pcrel_offset)
2328 ov += r->address;
2330 if (! ieee_write_byte (abfd,
2331 ieee_function_either_open_b_enum))
2332 return FALSE;
2334 if (r->sym_ptr_ptr != (asymbol **) NULL)
2336 if (! ieee_write_expression (abfd, r->addend + ov,
2337 *(r->sym_ptr_ptr),
2338 r->howto->pc_relative,
2339 (unsigned) s->index))
2340 return FALSE;
2342 else
2344 if (! ieee_write_expression (abfd, r->addend + ov,
2345 (asymbol *) NULL,
2346 r->howto->pc_relative,
2347 (unsigned) s->index))
2348 return FALSE;
2351 if (number_of_maus_in_address
2352 != bfd_get_reloc_size (r->howto))
2354 bfd_vma rsize = bfd_get_reloc_size (r->howto);
2355 if (! ieee_write_int (abfd, rsize))
2356 return FALSE;
2358 if (! ieee_write_byte (abfd,
2359 ieee_function_either_close_b_enum))
2360 return FALSE;
2362 relocs_to_go--;
2363 p++;
2370 return TRUE;
2373 /* If there are no relocations in the output section then we can be
2374 clever about how we write. We block items up into a max of 127
2375 bytes. */
2377 static bfd_boolean
2378 do_as_repeat (bfd *abfd, asection *s)
2380 if (s->size)
2382 if (! ieee_write_byte (abfd, ieee_set_current_section_enum)
2383 || ! ieee_write_byte (abfd,
2384 (bfd_byte) (s->index
2385 + IEEE_SECTION_NUMBER_BASE))
2386 || ! ieee_write_byte (abfd, ieee_set_current_pc_enum >> 8)
2387 || ! ieee_write_byte (abfd, ieee_set_current_pc_enum & 0xff)
2388 || ! ieee_write_byte (abfd,
2389 (bfd_byte) (s->index
2390 + IEEE_SECTION_NUMBER_BASE)))
2391 return FALSE;
2393 if ((abfd->flags & EXEC_P) != 0)
2395 if (! ieee_write_int (abfd, s->lma))
2396 return FALSE;
2398 else
2400 if (! ieee_write_expression (abfd, (bfd_vma) 0, s->symbol, 0, 0))
2401 return FALSE;
2404 if (! ieee_write_byte (abfd, ieee_repeat_data_enum)
2405 || ! ieee_write_int (abfd, s->size)
2406 || ! ieee_write_byte (abfd, ieee_load_constant_bytes_enum)
2407 || ! ieee_write_byte (abfd, 1)
2408 || ! ieee_write_byte (abfd, 0))
2409 return FALSE;
2412 return TRUE;
2415 static bfd_boolean
2416 do_without_relocs (bfd *abfd, asection *s)
2418 bfd_byte *stream = ieee_per_section (s)->data;
2420 if (stream == 0 || ((s->flags & SEC_LOAD) == 0))
2422 if (! do_as_repeat (abfd, s))
2423 return FALSE;
2425 else
2427 unsigned int i;
2429 for (i = 0; i < s->size; i++)
2431 if (stream[i] != 0)
2433 if (! do_with_relocs (abfd, s))
2434 return FALSE;
2435 return TRUE;
2438 if (! do_as_repeat (abfd, s))
2439 return FALSE;
2442 return TRUE;
2445 static void
2446 fill (void)
2448 bfd_size_type amt = input_ptr_end - input_ptr_start;
2449 /* FIXME: Check return value. I'm not sure whether it needs to read
2450 the entire buffer or not. */
2451 bfd_bread ((void *) input_ptr_start, amt, input_bfd);
2452 input_ptr = input_ptr_start;
2455 static void
2456 flush (void)
2458 bfd_size_type amt = output_ptr - output_ptr_start;
2460 if (bfd_bwrite ((void *) (output_ptr_start), amt, output_bfd) != amt)
2461 abort ();
2462 output_ptr = output_ptr_start;
2463 output_buffer++;
2466 #define THIS() ( *input_ptr )
2467 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill (); }
2468 #define OUT(x) { *output_ptr++ = (x); if (output_ptr == output_ptr_end) flush (); }
2470 static void
2471 write_int (int value)
2473 if (value >= 0 && value <= 127)
2475 OUT (value);
2477 else
2479 unsigned int length;
2481 /* How many significant bytes ? */
2482 /* FIXME FOR LONGER INTS. */
2483 if (value & 0xff000000)
2484 length = 4;
2485 else if (value & 0x00ff0000)
2486 length = 3;
2487 else if (value & 0x0000ff00)
2488 length = 2;
2489 else
2490 length = 1;
2492 OUT ((int) ieee_number_repeat_start_enum + length);
2493 switch (length)
2495 case 4:
2496 OUT (value >> 24);
2497 case 3:
2498 OUT (value >> 16);
2499 case 2:
2500 OUT (value >> 8);
2501 case 1:
2502 OUT (value);
2507 static void
2508 copy_id (void)
2510 int length = THIS ();
2511 char ch;
2513 OUT (length);
2514 NEXT ();
2515 while (length--)
2517 ch = THIS ();
2518 OUT (ch);
2519 NEXT ();
2523 #define VAR(x) ((x | 0x80))
2524 static void
2525 copy_expression (void)
2527 int stack[10];
2528 int *tos = stack;
2529 int value;
2531 while (1)
2533 switch (THIS ())
2535 case 0x84:
2536 NEXT ();
2537 value = THIS ();
2538 NEXT ();
2539 value = (value << 8) | THIS ();
2540 NEXT ();
2541 value = (value << 8) | THIS ();
2542 NEXT ();
2543 value = (value << 8) | THIS ();
2544 NEXT ();
2545 *tos++ = value;
2546 break;
2547 case 0x83:
2548 NEXT ();
2549 value = THIS ();
2550 NEXT ();
2551 value = (value << 8) | THIS ();
2552 NEXT ();
2553 value = (value << 8) | THIS ();
2554 NEXT ();
2555 *tos++ = value;
2556 break;
2557 case 0x82:
2558 NEXT ();
2559 value = THIS ();
2560 NEXT ();
2561 value = (value << 8) | THIS ();
2562 NEXT ();
2563 *tos++ = value;
2564 break;
2565 case 0x81:
2566 NEXT ();
2567 value = THIS ();
2568 NEXT ();
2569 *tos++ = value;
2570 break;
2571 case 0x80:
2572 NEXT ();
2573 *tos++ = 0;
2574 break;
2575 default:
2576 if (THIS () > 0x84)
2578 /* Not a number, just bug out with the answer. */
2579 write_int (*(--tos));
2580 return;
2582 *tos++ = THIS ();
2583 NEXT ();
2584 break;
2585 case 0xa5:
2586 /* PLUS anything. */
2587 value = *(--tos);
2588 value += *(--tos);
2589 *tos++ = value;
2590 NEXT ();
2591 break;
2592 case VAR ('R'):
2594 int section_number;
2595 ieee_data_type *ieee;
2596 asection *s;
2598 NEXT ();
2599 section_number = THIS ();
2601 NEXT ();
2602 ieee = IEEE_DATA (input_bfd);
2603 s = ieee->section_table[section_number];
2604 value = 0;
2605 if (s->output_section)
2606 value = s->output_section->lma;
2607 value += s->output_offset;
2608 *tos++ = value;
2610 break;
2611 case 0x90:
2613 NEXT ();
2614 write_int (*(--tos));
2615 OUT (0x90);
2616 return;
2622 /* Drop the int in the buffer, and copy a null into the gap, which we
2623 will overwrite later. */
2625 static void
2626 fill_int (struct output_buffer_struct *buf)
2628 if (buf->buffer == output_buffer)
2630 /* Still a chance to output the size. */
2631 int value = output_ptr - buf->ptrp + 3;
2632 buf->ptrp[0] = value >> 24;
2633 buf->ptrp[1] = value >> 16;
2634 buf->ptrp[2] = value >> 8;
2635 buf->ptrp[3] = value >> 0;
2639 static void
2640 drop_int (struct output_buffer_struct *buf)
2642 int type = THIS ();
2643 int ch;
2645 if (type <= 0x84)
2647 NEXT ();
2648 switch (type)
2650 case 0x84:
2651 ch = THIS ();
2652 NEXT ();
2653 case 0x83:
2654 ch = THIS ();
2655 NEXT ();
2656 case 0x82:
2657 ch = THIS ();
2658 NEXT ();
2659 case 0x81:
2660 ch = THIS ();
2661 NEXT ();
2662 case 0x80:
2663 break;
2666 OUT (0x84);
2667 buf->ptrp = output_ptr;
2668 buf->buffer = output_buffer;
2669 OUT (0);
2670 OUT (0);
2671 OUT (0);
2672 OUT (0);
2675 static void
2676 copy_int (void)
2678 int type = THIS ();
2679 int ch;
2680 if (type <= 0x84)
2682 OUT (type);
2683 NEXT ();
2684 switch (type)
2686 case 0x84:
2687 ch = THIS ();
2688 NEXT ();
2689 OUT (ch);
2690 case 0x83:
2691 ch = THIS ();
2692 NEXT ();
2693 OUT (ch);
2694 case 0x82:
2695 ch = THIS ();
2696 NEXT ();
2697 OUT (ch);
2698 case 0x81:
2699 ch = THIS ();
2700 NEXT ();
2701 OUT (ch);
2702 case 0x80:
2703 break;
2708 #define ID copy_id ()
2709 #define INT copy_int ()
2710 #define EXP copy_expression ()
2711 #define INTn(q) copy_int ()
2712 #define EXPn(q) copy_expression ()
2714 static void
2715 copy_till_end (void)
2717 int ch = THIS ();
2719 while (1)
2721 while (ch <= 0x80)
2723 OUT (ch);
2724 NEXT ();
2725 ch = THIS ();
2727 switch (ch)
2729 case 0x84:
2730 OUT (THIS ());
2731 NEXT ();
2732 case 0x83:
2733 OUT (THIS ());
2734 NEXT ();
2735 case 0x82:
2736 OUT (THIS ());
2737 NEXT ();
2738 case 0x81:
2739 OUT (THIS ());
2740 NEXT ();
2741 OUT (THIS ());
2742 NEXT ();
2744 ch = THIS ();
2745 break;
2746 default:
2747 return;
2753 static void
2754 f1_record (void)
2756 int ch;
2758 /* ATN record. */
2759 NEXT ();
2760 ch = THIS ();
2761 switch (ch)
2763 default:
2764 OUT (0xf1);
2765 OUT (ch);
2766 break;
2767 case 0xc9:
2768 NEXT ();
2769 OUT (0xf1);
2770 OUT (0xc9);
2771 INT;
2772 INT;
2773 ch = THIS ();
2774 switch (ch)
2776 case 0x16:
2777 NEXT ();
2778 break;
2779 case 0x01:
2780 NEXT ();
2781 break;
2782 case 0x00:
2783 NEXT ();
2784 INT;
2785 break;
2786 case 0x03:
2787 NEXT ();
2788 INT;
2789 break;
2790 case 0x13:
2791 EXPn (instruction address);
2792 break;
2793 default:
2794 break;
2796 break;
2797 case 0xd8:
2798 /* EXternal ref. */
2799 NEXT ();
2800 OUT (0xf1);
2801 OUT (0xd8);
2802 EXP;
2803 EXP;
2804 EXP;
2805 EXP;
2806 break;
2807 case 0xce:
2808 NEXT ();
2809 OUT (0xf1);
2810 OUT (0xce);
2811 INT;
2812 INT;
2813 ch = THIS ();
2814 INT;
2815 switch (ch)
2817 case 0x01:
2818 INT;
2819 INT;
2820 break;
2821 case 0x02:
2822 INT;
2823 break;
2824 case 0x04:
2825 EXPn (external function);
2826 break;
2827 case 0x05:
2828 break;
2829 case 0x07:
2830 INTn (line number);
2831 INT;
2832 case 0x08:
2833 break;
2834 case 0x0a:
2835 INTn (locked register);
2836 INT;
2837 break;
2838 case 0x3f:
2839 copy_till_end ();
2840 break;
2841 case 0x3e:
2842 copy_till_end ();
2843 break;
2844 case 0x40:
2845 copy_till_end ();
2846 break;
2847 case 0x41:
2849 break;
2854 static void
2855 f0_record (void)
2857 /* Attribute record. */
2858 NEXT ();
2859 OUT (0xf0);
2860 INTn (Symbol name);
2864 static void
2865 f2_record (void)
2867 NEXT ();
2868 OUT (0xf2);
2869 INT;
2870 NEXT ();
2871 OUT (0xce);
2872 INT;
2873 copy_till_end ();
2876 static void
2877 f8_record (void)
2879 int ch;
2880 NEXT ();
2881 ch = THIS ();
2882 switch (ch)
2884 case 0x01:
2885 case 0x02:
2886 case 0x03:
2887 /* Unique typedefs for module. */
2888 /* GLobal typedefs. */
2889 /* High level module scope beginning. */
2891 struct output_buffer_struct ob;
2893 NEXT ();
2894 OUT (0xf8);
2895 OUT (ch);
2896 drop_int (&ob);
2899 block ();
2901 NEXT ();
2902 fill_int (&ob);
2903 OUT (0xf9);
2905 break;
2906 case 0x04:
2907 /* Global function. */
2909 struct output_buffer_struct ob;
2911 NEXT ();
2912 OUT (0xf8);
2913 OUT (0x04);
2914 drop_int (&ob);
2916 INTn (stack size);
2917 INTn (ret val);
2918 EXPn (offset);
2920 block ();
2922 NEXT ();
2923 OUT (0xf9);
2924 EXPn (size of block);
2925 fill_int (&ob);
2927 break;
2929 case 0x05:
2930 /* File name for source line numbers. */
2932 struct output_buffer_struct ob;
2934 NEXT ();
2935 OUT (0xf8);
2936 OUT (0x05);
2937 drop_int (&ob);
2939 INTn (year);
2940 INTn (month);
2941 INTn (day);
2942 INTn (hour);
2943 INTn (monute);
2944 INTn (second);
2945 block ();
2946 NEXT ();
2947 OUT (0xf9);
2948 fill_int (&ob);
2950 break;
2952 case 0x06:
2953 /* Local function. */
2955 struct output_buffer_struct ob;
2957 NEXT ();
2958 OUT (0xf8);
2959 OUT (0x06);
2960 drop_int (&ob);
2962 INTn (stack size);
2963 INTn (type return);
2964 EXPn (offset);
2965 block ();
2966 NEXT ();
2967 OUT (0xf9);
2968 EXPn (size);
2969 fill_int (&ob);
2971 break;
2973 case 0x0a:
2974 /* Assembler module scope beginning - */
2976 struct output_buffer_struct ob;
2978 NEXT ();
2979 OUT (0xf8);
2980 OUT (0x0a);
2981 drop_int (&ob);
2984 INT;
2986 INT;
2987 INT;
2988 INT;
2989 INT;
2990 INT;
2991 INT;
2993 block ();
2995 NEXT ();
2996 OUT (0xf9);
2997 fill_int (&ob);
2999 break;
3000 case 0x0b:
3002 struct output_buffer_struct ob;
3004 NEXT ();
3005 OUT (0xf8);
3006 OUT (0x0b);
3007 drop_int (&ob);
3009 INT;
3010 INTn (section index);
3011 EXPn (offset);
3012 INTn (stuff);
3014 block ();
3016 OUT (0xf9);
3017 NEXT ();
3018 EXPn (Size in Maus);
3019 fill_int (&ob);
3021 break;
3025 static void
3026 e2_record (void)
3028 OUT (0xe2);
3029 NEXT ();
3030 OUT (0xce);
3031 NEXT ();
3032 INT;
3033 EXP;
3036 static void
3037 block (void)
3039 int ch;
3041 while (1)
3043 ch = THIS ();
3044 switch (ch)
3046 case 0xe1:
3047 case 0xe5:
3048 return;
3049 case 0xf9:
3050 return;
3051 case 0xf0:
3052 f0_record ();
3053 break;
3054 case 0xf1:
3055 f1_record ();
3056 break;
3057 case 0xf2:
3058 f2_record ();
3059 break;
3060 case 0xf8:
3061 f8_record ();
3062 break;
3063 case 0xe2:
3064 e2_record ();
3065 break;
3071 /* Moves all the debug information from the source bfd to the output
3072 bfd, and relocates any expressions it finds. */
3074 static void
3075 relocate_debug (bfd *output ATTRIBUTE_UNUSED,
3076 bfd *input)
3078 #define IBS 400
3079 #define OBS 400
3080 unsigned char input_buffer[IBS];
3082 input_ptr_start = input_ptr = input_buffer;
3083 input_ptr_end = input_buffer + IBS;
3084 input_bfd = input;
3085 /* FIXME: Check return value. I'm not sure whether it needs to read
3086 the entire buffer or not. */
3087 bfd_bread ((void *) input_ptr_start, (bfd_size_type) IBS, input);
3088 block ();
3091 /* Gather together all the debug information from each input BFD into
3092 one place, relocating it and emitting it as we go. */
3094 static bfd_boolean
3095 ieee_write_debug_part (bfd *abfd)
3097 ieee_data_type *ieee = IEEE_DATA (abfd);
3098 bfd_chain_type *chain = ieee->chain_root;
3099 unsigned char obuff[OBS];
3100 bfd_boolean some_debug = FALSE;
3101 file_ptr here = bfd_tell (abfd);
3103 output_ptr_start = output_ptr = obuff;
3104 output_ptr_end = obuff + OBS;
3105 output_ptr = obuff;
3106 output_bfd = abfd;
3108 if (chain == (bfd_chain_type *) NULL)
3110 asection *s;
3112 for (s = abfd->sections; s != NULL; s = s->next)
3113 if ((s->flags & SEC_DEBUGGING) != 0)
3114 break;
3115 if (s == NULL)
3117 ieee->w.r.debug_information_part = 0;
3118 return TRUE;
3121 ieee->w.r.debug_information_part = here;
3122 if (bfd_bwrite (s->contents, s->size, abfd) != s->size)
3123 return FALSE;
3125 else
3127 while (chain != (bfd_chain_type *) NULL)
3129 bfd *entry = chain->this;
3130 ieee_data_type *entry_ieee = IEEE_DATA (entry);
3132 if (entry_ieee->w.r.debug_information_part)
3134 if (bfd_seek (entry, entry_ieee->w.r.debug_information_part,
3135 SEEK_SET) != 0)
3136 return FALSE;
3137 relocate_debug (abfd, entry);
3140 chain = chain->next;
3143 if (some_debug)
3144 ieee->w.r.debug_information_part = here;
3145 else
3146 ieee->w.r.debug_information_part = 0;
3148 flush ();
3151 return TRUE;
3154 /* Write the data in an ieee way. */
3156 static bfd_boolean
3157 ieee_write_data_part (bfd *abfd)
3159 asection *s;
3161 ieee_data_type *ieee = IEEE_DATA (abfd);
3162 ieee->w.r.data_part = bfd_tell (abfd);
3164 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
3166 /* Skip sections that have no loadable contents (.bss,
3167 debugging, etc.) */
3168 if ((s->flags & SEC_LOAD) == 0)
3169 continue;
3171 /* Sort the reloc records so we can insert them in the correct
3172 places. */
3173 if (s->reloc_count != 0)
3175 if (! do_with_relocs (abfd, s))
3176 return FALSE;
3178 else
3180 if (! do_without_relocs (abfd, s))
3181 return FALSE;
3185 return TRUE;
3188 static bfd_boolean
3189 init_for_output (bfd *abfd)
3191 asection *s;
3193 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
3195 if ((s->flags & SEC_DEBUGGING) != 0)
3196 continue;
3197 if (s->size != 0)
3199 bfd_size_type size = s->size;
3200 ieee_per_section (s)->data = bfd_alloc (abfd, size);
3201 if (!ieee_per_section (s)->data)
3202 return FALSE;
3205 return TRUE;
3208 /* Exec and core file sections. */
3210 /* Set section contents is complicated with IEEE since the format is
3211 not a byte image, but a record stream. */
3213 static bfd_boolean
3214 ieee_set_section_contents (bfd *abfd,
3215 sec_ptr section,
3216 const void * location,
3217 file_ptr offset,
3218 bfd_size_type count)
3220 if ((section->flags & SEC_DEBUGGING) != 0)
3222 if (section->contents == NULL)
3224 bfd_size_type size = section->size;
3225 section->contents = bfd_alloc (abfd, size);
3226 if (section->contents == NULL)
3227 return FALSE;
3229 /* bfd_set_section_contents has already checked that everything
3230 is within range. */
3231 memcpy (section->contents + offset, location, (size_t) count);
3232 return TRUE;
3235 if (ieee_per_section (section)->data == (bfd_byte *) NULL)
3237 if (!init_for_output (abfd))
3238 return FALSE;
3240 memcpy ((void *) (ieee_per_section (section)->data + offset),
3241 (void *) location,
3242 (unsigned int) count);
3243 return TRUE;
3246 /* Write the external symbols of a file. IEEE considers two sorts of
3247 external symbols, public, and referenced. It uses to internal
3248 forms to index them as well. When we write them out we turn their
3249 symbol values into indexes from the right base. */
3251 static bfd_boolean
3252 ieee_write_external_part (bfd *abfd)
3254 asymbol **q;
3255 ieee_data_type *ieee = IEEE_DATA (abfd);
3256 unsigned int reference_index = IEEE_REFERENCE_BASE;
3257 unsigned int public_index = IEEE_PUBLIC_BASE + 2;
3258 file_ptr here = bfd_tell (abfd);
3259 bfd_boolean hadone = FALSE;
3261 if (abfd->outsymbols != (asymbol **) NULL)
3264 for (q = abfd->outsymbols; *q != (asymbol *) NULL; q++)
3266 asymbol *p = *q;
3268 if (bfd_is_und_section (p->section))
3270 /* This must be a symbol reference. */
3271 if (! ieee_write_byte (abfd, ieee_external_reference_enum)
3272 || ! ieee_write_int (abfd, (bfd_vma) reference_index)
3273 || ! ieee_write_id (abfd, p->name))
3274 return FALSE;
3275 p->value = reference_index;
3276 reference_index++;
3277 hadone = TRUE;
3279 else if (bfd_is_com_section (p->section))
3281 /* This is a weak reference. */
3282 if (! ieee_write_byte (abfd, ieee_external_reference_enum)
3283 || ! ieee_write_int (abfd, (bfd_vma) reference_index)
3284 || ! ieee_write_id (abfd, p->name)
3285 || ! ieee_write_byte (abfd,
3286 ieee_weak_external_reference_enum)
3287 || ! ieee_write_int (abfd, (bfd_vma) reference_index)
3288 || ! ieee_write_int (abfd, p->value))
3289 return FALSE;
3290 p->value = reference_index;
3291 reference_index++;
3292 hadone = TRUE;
3294 else if (p->flags & BSF_GLOBAL)
3296 /* This must be a symbol definition. */
3297 if (! ieee_write_byte (abfd, ieee_external_symbol_enum)
3298 || ! ieee_write_int (abfd, (bfd_vma) public_index)
3299 || ! ieee_write_id (abfd, p->name)
3300 || ! ieee_write_2bytes (abfd, ieee_attribute_record_enum)
3301 || ! ieee_write_int (abfd, (bfd_vma) public_index)
3302 || ! ieee_write_byte (abfd, 15) /* Instruction address. */
3303 || ! ieee_write_byte (abfd, 19) /* Static symbol. */
3304 || ! ieee_write_byte (abfd, 1)) /* One of them. */
3305 return FALSE;
3307 /* Write out the value. */
3308 if (! ieee_write_2bytes (abfd, ieee_value_record_enum)
3309 || ! ieee_write_int (abfd, (bfd_vma) public_index))
3310 return FALSE;
3311 if (! bfd_is_abs_section (p->section))
3313 if (abfd->flags & EXEC_P)
3315 /* If fully linked, then output all symbols
3316 relocated. */
3317 if (! (ieee_write_int
3318 (abfd,
3319 (p->value
3320 + p->section->output_offset
3321 + p->section->output_section->vma))))
3322 return FALSE;
3324 else
3326 if (! (ieee_write_expression
3327 (abfd,
3328 p->value + p->section->output_offset,
3329 p->section->output_section->symbol,
3330 FALSE, 0)))
3331 return FALSE;
3334 else
3336 if (! ieee_write_expression (abfd,
3337 p->value,
3338 bfd_abs_section_ptr->symbol,
3339 FALSE, 0))
3340 return FALSE;
3342 p->value = public_index;
3343 public_index++;
3344 hadone = TRUE;
3346 else
3348 /* This can happen - when there are gaps in the symbols read
3349 from an input ieee file. */
3353 if (hadone)
3354 ieee->w.r.external_part = here;
3356 return TRUE;
3360 static const unsigned char exten[] =
3362 0xf0, 0x20, 0x00,
3363 0xf1, 0xce, 0x20, 0x00, 37, 3, 3, /* Set version 3 rev 3. */
3364 0xf1, 0xce, 0x20, 0x00, 39, 2, /* Keep symbol in original case. */
3365 0xf1, 0xce, 0x20, 0x00, 38 /* Set object type relocatable to x. */
3368 static const unsigned char envi[] =
3370 0xf0, 0x21, 0x00,
3372 /* 0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
3373 0x19, 0x2c,
3375 0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok. */
3377 0xf1, 0xce, 0x21, 0, 53, 0x03,/* host unix. */
3378 /* 0xf1, 0xce, 0x21, 0, 54, 2,1,1 tool & version # */
3381 static bfd_boolean
3382 ieee_write_me_part (bfd *abfd)
3384 ieee_data_type *ieee = IEEE_DATA (abfd);
3385 ieee->w.r.trailer_part = bfd_tell (abfd);
3386 if (abfd->start_address)
3388 if (! ieee_write_2bytes (abfd, ieee_value_starting_address_enum)
3389 || ! ieee_write_byte (abfd, ieee_function_either_open_b_enum)
3390 || ! ieee_write_int (abfd, abfd->start_address)
3391 || ! ieee_write_byte (abfd, ieee_function_either_close_b_enum))
3392 return FALSE;
3394 ieee->w.r.me_record = bfd_tell (abfd);
3395 if (! ieee_write_byte (abfd, ieee_module_end_enum))
3396 return FALSE;
3397 return TRUE;
3400 /* Write out the IEEE processor ID. */
3402 static bfd_boolean
3403 ieee_write_processor (bfd *abfd)
3405 const bfd_arch_info_type *arch;
3407 arch = bfd_get_arch_info (abfd);
3408 switch (arch->arch)
3410 default:
3411 if (! ieee_write_id (abfd, bfd_printable_name (abfd)))
3412 return FALSE;
3413 break;
3415 case bfd_arch_a29k:
3416 if (! ieee_write_id (abfd, "29000"))
3417 return FALSE;
3418 break;
3420 case bfd_arch_h8300:
3421 if (! ieee_write_id (abfd, "H8/300"))
3422 return FALSE;
3423 break;
3425 case bfd_arch_h8500:
3426 if (! ieee_write_id (abfd, "H8/500"))
3427 return FALSE;
3428 break;
3430 case bfd_arch_i960:
3431 switch (arch->mach)
3433 default:
3434 case bfd_mach_i960_core:
3435 case bfd_mach_i960_ka_sa:
3436 if (! ieee_write_id (abfd, "80960KA"))
3437 return FALSE;
3438 break;
3440 case bfd_mach_i960_kb_sb:
3441 if (! ieee_write_id (abfd, "80960KB"))
3442 return FALSE;
3443 break;
3445 case bfd_mach_i960_ca:
3446 if (! ieee_write_id (abfd, "80960CA"))
3447 return FALSE;
3448 break;
3450 case bfd_mach_i960_mc:
3451 case bfd_mach_i960_xa:
3452 if (! ieee_write_id (abfd, "80960MC"))
3453 return FALSE;
3454 break;
3456 break;
3458 case bfd_arch_m68k:
3460 const char *id;
3462 switch (arch->mach)
3464 default: id = "68020"; break;
3465 case bfd_mach_m68000: id = "68000"; break;
3466 case bfd_mach_m68008: id = "68008"; break;
3467 case bfd_mach_m68010: id = "68010"; break;
3468 case bfd_mach_m68020: id = "68020"; break;
3469 case bfd_mach_m68030: id = "68030"; break;
3470 case bfd_mach_m68040: id = "68040"; break;
3471 case bfd_mach_m68060: id = "68060"; break;
3472 case bfd_mach_cpu32: id = "cpu32"; break;
3473 case bfd_mach_mcf5200:id = "5200"; break;
3474 case bfd_mach_mcf5206e:id = "5206e"; break;
3475 case bfd_mach_mcf5307:id = "5307"; break;
3476 case bfd_mach_mcf5407:id = "5407"; break;
3477 case bfd_mach_mcf528x:id = "5282"; break;
3480 if (! ieee_write_id (abfd, id))
3481 return FALSE;
3483 break;
3486 return TRUE;
3489 static bfd_boolean
3490 ieee_write_object_contents (bfd *abfd)
3492 ieee_data_type *ieee = IEEE_DATA (abfd);
3493 unsigned int i;
3494 file_ptr old;
3496 /* Fast forward over the header area. */
3497 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
3498 return FALSE;
3500 if (! ieee_write_byte (abfd, ieee_module_beginning_enum)
3501 || ! ieee_write_processor (abfd)
3502 || ! ieee_write_id (abfd, abfd->filename))
3503 return FALSE;
3505 /* Fast forward over the variable bits. */
3506 if (! ieee_write_byte (abfd, ieee_address_descriptor_enum))
3507 return FALSE;
3509 /* Bits per MAU. */
3510 if (! ieee_write_byte (abfd, (bfd_byte) (bfd_arch_bits_per_byte (abfd))))
3511 return FALSE;
3512 /* MAU's per address. */
3513 if (! ieee_write_byte (abfd,
3514 (bfd_byte) (bfd_arch_bits_per_address (abfd)
3515 / bfd_arch_bits_per_byte (abfd))))
3516 return FALSE;
3518 old = bfd_tell (abfd);
3519 if (bfd_seek (abfd, (file_ptr) (8 * N_W_VARIABLES), SEEK_CUR) != 0)
3520 return FALSE;
3522 ieee->w.r.extension_record = bfd_tell (abfd);
3523 if (bfd_bwrite ((char *) exten, (bfd_size_type) sizeof (exten), abfd)
3524 != sizeof (exten))
3525 return FALSE;
3526 if (abfd->flags & EXEC_P)
3528 if (! ieee_write_byte (abfd, 0x1)) /* Absolute. */
3529 return FALSE;
3531 else
3533 if (! ieee_write_byte (abfd, 0x2)) /* Relocateable. */
3534 return FALSE;
3537 ieee->w.r.environmental_record = bfd_tell (abfd);
3538 if (bfd_bwrite ((char *) envi, (bfd_size_type) sizeof (envi), abfd)
3539 != sizeof (envi))
3540 return FALSE;
3542 /* The HP emulator database requires a timestamp in the file. */
3544 time_t now;
3545 const struct tm *t;
3547 time (&now);
3548 t = (struct tm *) localtime (&now);
3549 if (! ieee_write_2bytes (abfd, (int) ieee_atn_record_enum)
3550 || ! ieee_write_byte (abfd, 0x21)
3551 || ! ieee_write_byte (abfd, 0)
3552 || ! ieee_write_byte (abfd, 50)
3553 || ! ieee_write_int (abfd, (bfd_vma) (t->tm_year + 1900))
3554 || ! ieee_write_int (abfd, (bfd_vma) (t->tm_mon + 1))
3555 || ! ieee_write_int (abfd, (bfd_vma) t->tm_mday)
3556 || ! ieee_write_int (abfd, (bfd_vma) t->tm_hour)
3557 || ! ieee_write_int (abfd, (bfd_vma) t->tm_min)
3558 || ! ieee_write_int (abfd, (bfd_vma) t->tm_sec))
3559 return FALSE;
3562 output_bfd = abfd;
3564 flush ();
3566 if (! ieee_write_section_part (abfd))
3567 return FALSE;
3568 /* First write the symbols. This changes their values into table
3569 indeces so we cant use it after this point. */
3570 if (! ieee_write_external_part (abfd))
3571 return FALSE;
3573 /* Write any debugs we have been told about. */
3574 if (! ieee_write_debug_part (abfd))
3575 return FALSE;
3577 /* Can only write the data once the symbols have been written, since
3578 the data contains relocation information which points to the
3579 symbols. */
3580 if (! ieee_write_data_part (abfd))
3581 return FALSE;
3583 /* At the end we put the end! */
3584 if (! ieee_write_me_part (abfd))
3585 return FALSE;
3587 /* Generate the header. */
3588 if (bfd_seek (abfd, old, SEEK_SET) != 0)
3589 return FALSE;
3591 for (i = 0; i < N_W_VARIABLES; i++)
3593 if (! ieee_write_2bytes (abfd, ieee_assign_value_to_variable_enum)
3594 || ! ieee_write_byte (abfd, (bfd_byte) i)
3595 || ! ieee_write_int5_out (abfd, (bfd_vma) ieee->w.offset[i]))
3596 return FALSE;
3599 return TRUE;
3602 /* Native-level interface to symbols. */
3604 /* We read the symbols into a buffer, which is discarded when this
3605 function exits. We read the strings into a buffer large enough to
3606 hold them all plus all the cached symbol entries. */
3608 static asymbol *
3609 ieee_make_empty_symbol (bfd *abfd)
3611 bfd_size_type amt = sizeof (ieee_symbol_type);
3612 ieee_symbol_type *new = bfd_zalloc (abfd, amt);
3614 if (!new)
3615 return NULL;
3616 new->symbol.the_bfd = abfd;
3617 return &new->symbol;
3620 static bfd *
3621 ieee_openr_next_archived_file (bfd *arch, bfd *prev)
3623 ieee_ar_data_type *ar = IEEE_AR_DATA (arch);
3625 /* Take the next one from the arch state, or reset. */
3626 if (prev == (bfd *) NULL)
3627 /* Reset the index - the first two entries are bogus. */
3628 ar->element_index = 2;
3630 while (TRUE)
3632 ieee_ar_obstack_type *p = ar->elements + ar->element_index;
3634 ar->element_index++;
3635 if (ar->element_index <= ar->element_count)
3637 if (p->file_offset != (file_ptr) 0)
3639 if (p->abfd == (bfd *) NULL)
3641 p->abfd = _bfd_create_empty_archive_element_shell (arch);
3642 p->abfd->origin = p->file_offset;
3644 return p->abfd;
3647 else
3649 bfd_set_error (bfd_error_no_more_archived_files);
3650 return NULL;
3655 static bfd_boolean
3656 ieee_find_nearest_line (bfd *abfd ATTRIBUTE_UNUSED,
3657 asection *section ATTRIBUTE_UNUSED,
3658 asymbol **symbols ATTRIBUTE_UNUSED,
3659 bfd_vma offset ATTRIBUTE_UNUSED,
3660 const char **filename_ptr ATTRIBUTE_UNUSED,
3661 const char **functionname_ptr ATTRIBUTE_UNUSED,
3662 unsigned int *line_ptr ATTRIBUTE_UNUSED)
3664 return FALSE;
3667 static int
3668 ieee_generic_stat_arch_elt (bfd *abfd, struct stat *buf)
3670 ieee_ar_data_type *ar = (ieee_ar_data_type *) NULL;
3671 ieee_data_type *ieee;
3673 if (abfd->my_archive != NULL)
3674 ar = abfd->my_archive->tdata.ieee_ar_data;
3675 if (ar == (ieee_ar_data_type *) NULL)
3677 bfd_set_error (bfd_error_invalid_operation);
3678 return -1;
3681 if (IEEE_DATA (abfd) == NULL)
3683 if (ieee_object_p (abfd) == NULL)
3685 bfd_set_error (bfd_error_wrong_format);
3686 return -1;
3690 ieee = IEEE_DATA (abfd);
3692 buf->st_size = ieee->w.r.me_record + 1;
3693 buf->st_mode = 0644;
3694 return 0;
3697 static int
3698 ieee_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
3699 bfd_boolean x ATTRIBUTE_UNUSED)
3701 return 0;
3704 #define ieee_close_and_cleanup _bfd_generic_close_and_cleanup
3705 #define ieee_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
3707 #define ieee_slurp_armap bfd_true
3708 #define ieee_slurp_extended_name_table bfd_true
3709 #define ieee_construct_extended_name_table \
3710 ((bfd_boolean (*) \
3711 (bfd *, char **, bfd_size_type *, const char **)) \
3712 bfd_true)
3713 #define ieee_truncate_arname bfd_dont_truncate_arname
3714 #define ieee_write_armap \
3715 ((bfd_boolean (*) \
3716 (bfd *, unsigned int, struct orl *, unsigned int, int)) \
3717 bfd_true)
3718 #define ieee_read_ar_hdr bfd_nullvoidptr
3719 #define ieee_update_armap_timestamp bfd_true
3720 #define ieee_get_elt_at_index _bfd_generic_get_elt_at_index
3722 #define ieee_bfd_is_target_special_symbol \
3723 ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
3724 #define ieee_bfd_is_local_label_name bfd_generic_is_local_label_name
3725 #define ieee_get_lineno _bfd_nosymbols_get_lineno
3726 #define ieee_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
3727 #define ieee_read_minisymbols _bfd_generic_read_minisymbols
3728 #define ieee_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
3730 #define ieee_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
3732 #define ieee_set_arch_mach _bfd_generic_set_arch_mach
3734 #define ieee_get_section_contents_in_window \
3735 _bfd_generic_get_section_contents_in_window
3736 #define ieee_bfd_get_relocated_section_contents \
3737 bfd_generic_get_relocated_section_contents
3738 #define ieee_bfd_relax_section bfd_generic_relax_section
3739 #define ieee_bfd_gc_sections bfd_generic_gc_sections
3740 #define ieee_bfd_merge_sections bfd_generic_merge_sections
3741 #define ieee_bfd_is_group_section bfd_generic_is_group_section
3742 #define ieee_bfd_discard_group bfd_generic_discard_group
3743 #define ieee_section_already_linked \
3744 _bfd_generic_section_already_linked
3745 #define ieee_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
3746 #define ieee_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
3747 #define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols
3748 #define ieee_bfd_link_just_syms _bfd_generic_link_just_syms
3749 #define ieee_bfd_final_link _bfd_generic_final_link
3750 #define ieee_bfd_link_split_section _bfd_generic_link_split_section
3752 const bfd_target ieee_vec =
3754 "ieee", /* Name. */
3755 bfd_target_ieee_flavour,
3756 BFD_ENDIAN_UNKNOWN, /* Target byte order. */
3757 BFD_ENDIAN_UNKNOWN, /* Target headers byte order. */
3758 (HAS_RELOC | EXEC_P | /* Object flags. */
3759 HAS_LINENO | HAS_DEBUG |
3760 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
3761 (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
3762 | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* Section flags. */
3763 '_', /* Leading underscore. */
3764 ' ', /* AR_pad_char. */
3765 16, /* AR_max_namelen. */
3766 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
3767 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
3768 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* Data. */
3769 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
3770 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
3771 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* Headers. */
3773 {_bfd_dummy_target,
3774 ieee_object_p, /* bfd_check_format. */
3775 ieee_archive_p,
3776 _bfd_dummy_target,
3779 bfd_false,
3780 ieee_mkobject,
3781 _bfd_generic_mkarchive,
3782 bfd_false
3785 bfd_false,
3786 ieee_write_object_contents,
3787 _bfd_write_archive_contents,
3788 bfd_false,
3791 /* ieee_close_and_cleanup, ieee_bfd_free_cached_info, ieee_new_section_hook,
3792 ieee_get_section_contents, ieee_get_section_contents_in_window. */
3793 BFD_JUMP_TABLE_GENERIC (ieee),
3795 BFD_JUMP_TABLE_COPY (_bfd_generic),
3796 BFD_JUMP_TABLE_CORE (_bfd_nocore),
3798 /* ieee_slurp_armap, ieee_slurp_extended_name_table,
3799 ieee_construct_extended_name_table, ieee_truncate_arname,
3800 ieee_write_armap, ieee_read_ar_hdr, ieee_openr_next_archived_file,
3801 ieee_get_elt_at_index, ieee_generic_stat_arch_elt,
3802 ieee_update_armap_timestamp. */
3803 BFD_JUMP_TABLE_ARCHIVE (ieee),
3805 /* ieee_get_symtab_upper_bound, ieee_canonicalize_symtab,
3806 ieee_make_empty_symbol, ieee_print_symbol, ieee_get_symbol_info,
3807 ieee_bfd_is_local_label_name, ieee_get_lineno,
3808 ieee_find_nearest_line, ieee_bfd_make_debug_symbol,
3809 ieee_read_minisymbols, ieee_minisymbol_to_symbol. */
3810 BFD_JUMP_TABLE_SYMBOLS (ieee),
3812 /* ieee_get_reloc_upper_bound, ieee_canonicalize_reloc,
3813 ieee_bfd_reloc_type_lookup. */
3814 BFD_JUMP_TABLE_RELOCS (ieee),
3816 /* ieee_set_arch_mach, ieee_set_section_contents. */
3817 BFD_JUMP_TABLE_WRITE (ieee),
3819 /* ieee_sizeof_headers, ieee_bfd_get_relocated_section_contents,
3820 ieee_bfd_relax_section, ieee_bfd_link_hash_table_create,
3821 _bfd_generic_link_hash_table_free,
3822 ieee_bfd_link_add_symbols, ieee_bfd_final_link,
3823 ieee_bfd_link_split_section, ieee_bfd_gc_sections,
3824 ieee_bfd_merge_sections. */
3825 BFD_JUMP_TABLE_LINK (ieee),
3827 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
3829 NULL,
3831 NULL