(_bfd_elf_compute_section_file_positions): Initialise strtab to avoid compile
[binutils.git] / bfd / ieee.c
blob2b1ed532fe9d3691946dbb23cb9bac8ff34cf3cb
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
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 bfd_boolean ieee_write_byte
44 PARAMS ((bfd *, int));
45 static bfd_boolean ieee_write_2bytes
46 PARAMS ((bfd *, int));
47 static bfd_boolean ieee_write_int
48 PARAMS ((bfd *, bfd_vma));
49 static bfd_boolean ieee_write_id
50 PARAMS ((bfd *, const char *));
51 static unsigned short read_2bytes
52 PARAMS ((common_header_type *));
53 static void bfd_get_string
54 PARAMS ((common_header_type *, char *, size_t));
55 static char *read_id
56 PARAMS ((common_header_type *));
57 static bfd_boolean ieee_write_expression
58 PARAMS ((bfd *, bfd_vma, asymbol *, bfd_boolean, unsigned int));
59 static void ieee_write_int5
60 PARAMS ((bfd_byte *, bfd_vma));
61 static bfd_boolean ieee_write_int5_out
62 PARAMS ((bfd *, bfd_vma));
63 static bfd_boolean parse_int
64 PARAMS ((common_header_type *, bfd_vma *));
65 static int parse_i
66 PARAMS ((common_header_type *, bfd_boolean *));
67 static bfd_vma must_parse_int
68 PARAMS ((common_header_type *));
69 static void parse_expression
70 PARAMS ((ieee_data_type *, bfd_vma *, ieee_symbol_index_type *,
71 bfd_boolean *, unsigned int *, asection **));
72 static file_ptr ieee_part_after
73 PARAMS ((ieee_data_type *, file_ptr));
74 static ieee_symbol_type *get_symbol
75 PARAMS ((bfd *, ieee_data_type *, ieee_symbol_type *, unsigned int *,
76 ieee_symbol_type ***, unsigned int *, int));
77 static bfd_boolean ieee_slurp_external_symbols
78 PARAMS ((bfd *));
79 static bfd_boolean ieee_slurp_symbol_table
80 PARAMS ((bfd *));
81 static long ieee_get_symtab_upper_bound
82 PARAMS ((bfd *));
83 static long ieee_canonicalize_symtab
84 PARAMS ((bfd *, asymbol **));
85 static asection *get_section_entry
86 PARAMS ((bfd *, ieee_data_type *i, unsigned int));
87 static void ieee_slurp_sections
88 PARAMS ((bfd *));
89 static bfd_boolean ieee_slurp_debug
90 PARAMS ((bfd *));
91 const bfd_target *ieee_archive_p
92 PARAMS ((bfd *));
93 const bfd_target *ieee_object_p
94 PARAMS ((bfd *));
95 static void ieee_get_symbol_info
96 PARAMS ((bfd *, asymbol *, symbol_info *));
97 static void ieee_print_symbol
98 PARAMS ((bfd *, PTR, asymbol *, bfd_print_symbol_type));
99 static bfd_boolean do_one
100 PARAMS ((ieee_data_type *, ieee_per_section_type *, unsigned char *,
101 asection *, int));
102 static bfd_boolean ieee_slurp_section_data
103 PARAMS ((bfd *));
104 static bfd_boolean ieee_new_section_hook
105 PARAMS ((bfd *, asection *));
106 static long ieee_get_reloc_upper_bound
107 PARAMS ((bfd *, sec_ptr));
108 static bfd_boolean ieee_get_section_contents
109 PARAMS ((bfd *, sec_ptr, PTR, file_ptr, bfd_size_type));
110 static long ieee_canonicalize_reloc
111 PARAMS ((bfd *, sec_ptr, arelent **, asymbol **));
112 static int comp
113 PARAMS ((const PTR, const PTR));
114 static bfd_boolean ieee_write_section_part
115 PARAMS ((bfd *));
116 static bfd_boolean do_with_relocs
117 PARAMS ((bfd *, asection *));
118 static bfd_boolean do_as_repeat
119 PARAMS ((bfd *, asection *));
120 static bfd_boolean do_without_relocs
121 PARAMS ((bfd *, asection *));
122 static bfd_boolean ieee_mkobject
123 PARAMS ((bfd *));
124 static void fill
125 PARAMS ((void));
126 static void flush
127 PARAMS ((void));
128 static void write_int
129 PARAMS ((int));
130 static void copy_id
131 PARAMS ((void));
132 static void copy_expression
133 PARAMS ((void));
134 static void fill_int
135 PARAMS ((struct output_buffer_struct *));
136 static void drop_int
137 PARAMS ((struct output_buffer_struct *));
138 static void copy_int
139 PARAMS ((void));
140 static void f1_record
141 PARAMS ((void));
142 static void f0_record
143 PARAMS ((void));
144 static void copy_till_end
145 PARAMS ((void));
146 static void f2_record
147 PARAMS ((void));
148 static void f8_record
149 PARAMS ((void));
150 static void e2_record
151 PARAMS ((void));
152 static void block
153 PARAMS ((void));
154 static void relocate_debug
155 PARAMS ((bfd *, bfd *));
156 static bfd_boolean ieee_write_debug_part
157 PARAMS ((bfd *));
158 static bfd_boolean ieee_write_data_part
159 PARAMS ((bfd *));
160 static bfd_boolean init_for_output
161 PARAMS ((bfd *));
162 static bfd_boolean ieee_set_section_contents
163 PARAMS ((bfd *, sec_ptr, const PTR, file_ptr, bfd_size_type));
164 static bfd_boolean ieee_write_external_part
165 PARAMS ((bfd *));
166 static bfd_boolean ieee_write_me_part
167 PARAMS ((bfd *));
168 static bfd_boolean ieee_write_processor
169 PARAMS ((bfd *));
170 static bfd_boolean ieee_write_object_contents
171 PARAMS ((bfd *));
172 static asymbol *ieee_make_empty_symbol
173 PARAMS ((bfd *));
174 static bfd *ieee_openr_next_archived_file
175 PARAMS ((bfd *, bfd *));
176 static bfd_boolean ieee_find_nearest_line
177 PARAMS ((bfd *, asection *, asymbol **, bfd_vma, const char **,
178 const char **, unsigned int *));
179 static int ieee_generic_stat_arch_elt
180 PARAMS ((bfd *, struct stat *));
181 static int ieee_sizeof_headers
182 PARAMS ((bfd *, bfd_boolean));
184 /* Functions for writing to ieee files in the strange way that the
185 standard requires. */
187 static bfd_boolean
188 ieee_write_byte (abfd, barg)
189 bfd *abfd;
190 int barg;
192 bfd_byte byte;
194 byte = barg;
195 if (bfd_bwrite ((PTR) &byte, (bfd_size_type) 1, abfd) != 1)
196 return FALSE;
197 return TRUE;
200 static bfd_boolean
201 ieee_write_2bytes (abfd, bytes)
202 bfd *abfd;
203 int bytes;
205 bfd_byte buffer[2];
207 buffer[0] = bytes >> 8;
208 buffer[1] = bytes & 0xff;
209 if (bfd_bwrite ((PTR) buffer, (bfd_size_type) 2, abfd) != 2)
210 return FALSE;
211 return TRUE;
214 static bfd_boolean
215 ieee_write_int (abfd, value)
216 bfd *abfd;
217 bfd_vma value;
219 if (value <= 127)
221 if (! ieee_write_byte (abfd, (bfd_byte) value))
222 return FALSE;
224 else
226 unsigned int length;
228 /* How many significant bytes ? */
229 /* FIXME FOR LONGER INTS. */
230 if (value & 0xff000000)
231 length = 4;
232 else if (value & 0x00ff0000)
233 length = 3;
234 else if (value & 0x0000ff00)
235 length = 2;
236 else
237 length = 1;
239 if (! ieee_write_byte (abfd,
240 (bfd_byte) ((int) ieee_number_repeat_start_enum
241 + length)))
242 return FALSE;
243 switch (length)
245 case 4:
246 if (! ieee_write_byte (abfd, (bfd_byte) (value >> 24)))
247 return FALSE;
248 /* Fall through. */
249 case 3:
250 if (! ieee_write_byte (abfd, (bfd_byte) (value >> 16)))
251 return FALSE;
252 /* Fall through. */
253 case 2:
254 if (! ieee_write_byte (abfd, (bfd_byte) (value >> 8)))
255 return FALSE;
256 /* Fall through. */
257 case 1:
258 if (! ieee_write_byte (abfd, (bfd_byte) (value)))
259 return FALSE;
263 return TRUE;
266 static bfd_boolean
267 ieee_write_id (abfd, id)
268 bfd *abfd;
269 const char *id;
271 size_t length = strlen (id);
273 if (length <= 127)
275 if (! ieee_write_byte (abfd, (bfd_byte) length))
276 return FALSE;
278 else if (length < 255)
280 if (! ieee_write_byte (abfd, ieee_extension_length_1_enum)
281 || ! ieee_write_byte (abfd, (bfd_byte) length))
282 return FALSE;
284 else if (length < 65535)
286 if (! ieee_write_byte (abfd, ieee_extension_length_2_enum)
287 || ! ieee_write_2bytes (abfd, (int) length))
288 return FALSE;
290 else
292 (*_bfd_error_handler)
293 (_("%s: string too long (%d chars, max 65535)"),
294 bfd_get_filename (abfd), length);
295 bfd_set_error (bfd_error_invalid_operation);
296 return FALSE;
299 if (bfd_bwrite ((PTR) id, (bfd_size_type) length, abfd) != length)
300 return FALSE;
301 return TRUE;
304 /* Functions for reading from ieee files in the strange way that the
305 standard requires. */
307 #define this_byte(ieee) *((ieee)->input_p)
308 #define next_byte(ieee) ((ieee)->input_p++)
309 #define this_byte_and_next(ieee) (*((ieee)->input_p++))
311 static unsigned short
312 read_2bytes (ieee)
313 common_header_type *ieee;
315 unsigned char c1 = this_byte_and_next (ieee);
316 unsigned char c2 = this_byte_and_next (ieee);
318 return (c1 << 8) | c2;
321 static void
322 bfd_get_string (ieee, string, length)
323 common_header_type *ieee;
324 char *string;
325 size_t length;
327 size_t i;
329 for (i = 0; i < length; i++)
330 string[i] = this_byte_and_next (ieee);
333 static char *
334 read_id (ieee)
335 common_header_type *ieee;
337 size_t length;
338 char *string;
340 length = this_byte_and_next (ieee);
341 if (length <= 0x7f)
343 /* Simple string of length 0 to 127. */
345 else if (length == 0xde)
347 /* Length is next byte, allowing 0..255. */
348 length = this_byte_and_next (ieee);
350 else if (length == 0xdf)
352 /* Length is next two bytes, allowing 0..65535. */
353 length = this_byte_and_next (ieee);
354 length = (length * 256) + this_byte_and_next (ieee);
357 /* Buy memory and read string. */
358 string = bfd_alloc (ieee->abfd, (bfd_size_type) length + 1);
359 if (!string)
360 return NULL;
361 bfd_get_string (ieee, string, length);
362 string[length] = 0;
363 return string;
366 static bfd_boolean
367 ieee_write_expression (abfd, value, symbol, pcrel, index)
368 bfd *abfd;
369 bfd_vma value;
370 asymbol *symbol;
371 bfd_boolean pcrel;
372 unsigned int index;
374 unsigned int term_count = 0;
376 if (value != 0)
378 if (! ieee_write_int (abfd, value))
379 return FALSE;
380 term_count++;
383 /* Badly formatted binaries can have a missing symbol,
384 so test here to prevent a seg fault. */
385 if (symbol != NULL)
387 if (bfd_is_com_section (symbol->section)
388 || bfd_is_und_section (symbol->section))
390 /* Def of a common symbol. */
391 if (! ieee_write_byte (abfd, ieee_variable_X_enum)
392 || ! ieee_write_int (abfd, symbol->value))
393 return FALSE;
394 term_count ++;
396 else if (! bfd_is_abs_section (symbol->section))
398 /* Ref to defined symbol - */
400 if (symbol->flags & BSF_GLOBAL)
402 if (! ieee_write_byte (abfd, ieee_variable_I_enum)
403 || ! ieee_write_int (abfd, symbol->value))
404 return FALSE;
405 term_count++;
407 else if (symbol->flags & (BSF_LOCAL | BSF_SECTION_SYM))
409 /* This is a reference to a defined local symbol. We can
410 easily do a local as a section+offset. */
411 if (! ieee_write_byte (abfd, ieee_variable_R_enum)
412 || ! ieee_write_byte (abfd,
413 (bfd_byte) (symbol->section->index
414 + IEEE_SECTION_NUMBER_BASE)))
415 return FALSE;
417 term_count++;
418 if (symbol->value != 0)
420 if (! ieee_write_int (abfd, symbol->value))
421 return FALSE;
422 term_count++;
425 else
427 (*_bfd_error_handler)
428 (_("%s: unrecognized symbol `%s' flags 0x%x"),
429 bfd_get_filename (abfd), bfd_asymbol_name (symbol),
430 symbol->flags);
431 bfd_set_error (bfd_error_invalid_operation);
432 return FALSE;
437 if (pcrel)
439 /* Subtract the pc from here by asking for PC of this section. */
440 if (! ieee_write_byte (abfd, ieee_variable_P_enum)
441 || ! ieee_write_byte (abfd,
442 (bfd_byte) (index + IEEE_SECTION_NUMBER_BASE))
443 || ! ieee_write_byte (abfd, ieee_function_minus_enum))
444 return FALSE;
447 /* Handle the degenerate case of a 0 address. */
448 if (term_count == 0)
449 if (! ieee_write_int (abfd, (bfd_vma) 0))
450 return FALSE;
452 while (term_count > 1)
454 if (! ieee_write_byte (abfd, ieee_function_plus_enum))
455 return FALSE;
456 term_count--;
459 return TRUE;
462 /* Writes any integer into the buffer supplied and always takes 5 bytes. */
464 static void
465 ieee_write_int5 (buffer, value)
466 bfd_byte *buffer;
467 bfd_vma value;
469 buffer[0] = (bfd_byte) ieee_number_repeat_4_enum;
470 buffer[1] = (value >> 24) & 0xff;
471 buffer[2] = (value >> 16) & 0xff;
472 buffer[3] = (value >> 8) & 0xff;
473 buffer[4] = (value >> 0) & 0xff;
476 static bfd_boolean
477 ieee_write_int5_out (abfd, value)
478 bfd *abfd;
479 bfd_vma value;
481 bfd_byte b[5];
483 ieee_write_int5 (b, value);
484 if (bfd_bwrite ((PTR) b, (bfd_size_type) 5, abfd) != 5)
485 return FALSE;
486 return TRUE;
489 static bfd_boolean
490 parse_int (ieee, value_ptr)
491 common_header_type *ieee;
492 bfd_vma *value_ptr;
494 int value = this_byte (ieee);
495 int result;
497 if (value >= 0 && value <= 127)
499 *value_ptr = value;
500 next_byte (ieee);
501 return TRUE;
503 else if (value >= 0x80 && value <= 0x88)
505 unsigned int count = value & 0xf;
507 result = 0;
508 next_byte (ieee);
509 while (count)
511 result = (result << 8) | this_byte_and_next (ieee);
512 count--;
514 *value_ptr = result;
515 return TRUE;
517 return FALSE;
520 static int
521 parse_i (ieee, ok)
522 common_header_type *ieee;
523 bfd_boolean *ok;
525 bfd_vma x;
526 *ok = parse_int (ieee, &x);
527 return x;
530 static bfd_vma
531 must_parse_int (ieee)
532 common_header_type *ieee;
534 bfd_vma result;
535 BFD_ASSERT (parse_int (ieee, &result));
536 return result;
539 typedef struct
541 bfd_vma value;
542 asection *section;
543 ieee_symbol_index_type symbol;
544 } ieee_value_type;
547 #if KEEPMINUSPCININST
549 #define SRC_MASK(arg) arg
550 #define PCREL_OFFSET FALSE
552 #else
554 #define SRC_MASK(arg) 0
555 #define PCREL_OFFSET TRUE
557 #endif
559 static reloc_howto_type abs32_howto =
560 HOWTO (1,
564 FALSE,
566 complain_overflow_bitfield,
568 "abs32",
569 TRUE,
570 0xffffffff,
571 0xffffffff,
572 FALSE);
574 static reloc_howto_type abs16_howto =
575 HOWTO (1,
579 FALSE,
581 complain_overflow_bitfield,
583 "abs16",
584 TRUE,
585 0x0000ffff,
586 0x0000ffff,
587 FALSE);
589 static reloc_howto_type abs8_howto =
590 HOWTO (1,
594 FALSE,
596 complain_overflow_bitfield,
598 "abs8",
599 TRUE,
600 0x000000ff,
601 0x000000ff,
602 FALSE);
604 static reloc_howto_type rel32_howto =
605 HOWTO (1,
609 TRUE,
611 complain_overflow_signed,
613 "rel32",
614 TRUE,
615 SRC_MASK (0xffffffff),
616 0xffffffff,
617 PCREL_OFFSET);
619 static reloc_howto_type rel16_howto =
620 HOWTO (1,
624 TRUE,
626 complain_overflow_signed,
628 "rel16",
629 TRUE,
630 SRC_MASK (0x0000ffff),
631 0x0000ffff,
632 PCREL_OFFSET);
634 static reloc_howto_type rel8_howto =
635 HOWTO (1,
639 TRUE,
641 complain_overflow_signed,
643 "rel8",
644 TRUE,
645 SRC_MASK (0x000000ff),
646 0x000000ff,
647 PCREL_OFFSET);
649 static ieee_symbol_index_type NOSYMBOL = {0, 0};
651 static void
652 parse_expression (ieee, value, symbol, pcrel, extra, section)
653 ieee_data_type *ieee;
654 bfd_vma *value;
655 ieee_symbol_index_type *symbol;
656 bfd_boolean *pcrel;
657 unsigned int *extra;
658 asection **section;
661 #define POS sp[1]
662 #define TOS sp[0]
663 #define NOS sp[-1]
664 #define INC sp++;
665 #define DEC sp--;
667 bfd_boolean loop = TRUE;
668 ieee_value_type stack[10];
670 /* The stack pointer always points to the next unused location. */
671 #define PUSH(x,y,z) TOS.symbol=x;TOS.section=y;TOS.value=z;INC;
672 #define POP(x,y,z) DEC;x=TOS.symbol;y=TOS.section;z=TOS.value;
673 ieee_value_type *sp = stack;
674 asection *dummy;
676 while (loop && ieee->h.input_p < ieee->h.last_byte)
678 switch (this_byte (&(ieee->h)))
680 case ieee_variable_P_enum:
681 /* P variable, current program counter for section n. */
683 int section_n;
685 next_byte (&(ieee->h));
686 *pcrel = TRUE;
687 section_n = must_parse_int (&(ieee->h));
688 PUSH (NOSYMBOL, bfd_abs_section_ptr, 0);
689 break;
691 case ieee_variable_L_enum:
692 /* L variable address of section N. */
693 next_byte (&(ieee->h));
694 PUSH (NOSYMBOL, ieee->section_table[must_parse_int (&(ieee->h))], 0);
695 break;
696 case ieee_variable_R_enum:
697 /* R variable, logical address of section module. */
698 /* FIXME, this should be different to L. */
699 next_byte (&(ieee->h));
700 PUSH (NOSYMBOL, ieee->section_table[must_parse_int (&(ieee->h))], 0);
701 break;
702 case ieee_variable_S_enum:
703 /* S variable, size in MAUS of section module. */
704 next_byte (&(ieee->h));
705 PUSH (NOSYMBOL,
707 ieee->section_table[must_parse_int (&(ieee->h))]->size);
708 break;
709 case ieee_variable_I_enum:
710 /* Push the address of variable n. */
712 ieee_symbol_index_type sy;
713 next_byte (&(ieee->h));
714 sy.index = (int) must_parse_int (&(ieee->h));
715 sy.letter = 'I';
717 PUSH (sy, bfd_abs_section_ptr, 0);
719 break;
720 case ieee_variable_X_enum:
721 /* Push the address of external variable n. */
723 ieee_symbol_index_type sy;
724 next_byte (&(ieee->h));
725 sy.index = (int) (must_parse_int (&(ieee->h)));
726 sy.letter = 'X';
728 PUSH (sy, bfd_und_section_ptr, 0);
730 break;
731 case ieee_function_minus_enum:
733 bfd_vma value1, value2;
734 asection *section1, *section_dummy;
735 ieee_symbol_index_type sy;
736 next_byte (&(ieee->h));
738 POP (sy, section1, value1);
739 POP (sy, section_dummy, value2);
740 PUSH (sy, section1 ? section1 : section_dummy, value2 - value1);
742 break;
743 case ieee_function_plus_enum:
745 bfd_vma value1, value2;
746 asection *section1;
747 asection *section2;
748 ieee_symbol_index_type sy1;
749 ieee_symbol_index_type sy2;
750 next_byte (&(ieee->h));
752 POP (sy1, section1, value1);
753 POP (sy2, section2, value2);
754 PUSH (sy1.letter ? sy1 : sy2,
755 bfd_is_abs_section (section1) ? section2 : section1,
756 value1 + value2);
758 break;
759 default:
761 bfd_vma va;
762 BFD_ASSERT (this_byte (&(ieee->h)) < (int) ieee_variable_A_enum
763 || this_byte (&(ieee->h)) > (int) ieee_variable_Z_enum);
764 if (parse_int (&(ieee->h), &va))
766 PUSH (NOSYMBOL, bfd_abs_section_ptr, va);
768 else
770 /* Thats all that we can understand. */
771 loop = FALSE;
777 /* As far as I can see there is a bug in the Microtec IEEE output
778 which I'm using to scan, whereby the comma operator is omitted
779 sometimes in an expression, giving expressions with too many
780 terms. We can tell if that's the case by ensuring that
781 sp == stack here. If not, then we've pushed something too far,
782 so we keep adding. */
783 while (sp != stack + 1)
785 asection *section1;
786 ieee_symbol_index_type sy1;
787 POP (sy1, section1, *extra);
790 POP (*symbol, dummy, *value);
791 if (section)
792 *section = dummy;
796 #define ieee_seek(ieee, offset) \
797 do \
799 ieee->h.input_p = ieee->h.first_byte + offset; \
800 ieee->h.last_byte = (ieee->h.first_byte \
801 + ieee_part_after (ieee, offset)); \
803 while (0)
805 #define ieee_pos(ieee) \
806 (ieee->h.input_p - ieee->h.first_byte)
808 /* Find the first part of the ieee file after HERE. */
810 static file_ptr
811 ieee_part_after (ieee, here)
812 ieee_data_type *ieee;
813 file_ptr here;
815 int part;
816 file_ptr after = ieee->w.r.me_record;
818 /* File parts can come in any order, except that module end is
819 guaranteed to be last (and the header first). */
820 for (part = 0; part < N_W_VARIABLES; part++)
821 if (ieee->w.offset[part] > here && after > ieee->w.offset[part])
822 after = ieee->w.offset[part];
824 return after;
827 static unsigned int last_index;
828 static char last_type; /* Is the index for an X or a D. */
830 static ieee_symbol_type *
831 get_symbol (abfd, ieee, last_symbol, symbol_count, pptr, max_index, this_type)
832 bfd *abfd ATTRIBUTE_UNUSED;
833 ieee_data_type *ieee;
834 ieee_symbol_type *last_symbol;
835 unsigned int *symbol_count;
836 ieee_symbol_type ***pptr;
837 unsigned int *max_index;
838 int this_type;
840 /* Need a new symbol. */
841 unsigned int new_index = must_parse_int (&(ieee->h));
843 if (new_index != last_index || this_type != last_type)
845 ieee_symbol_type *new_symbol;
846 bfd_size_type amt = sizeof (ieee_symbol_type);
848 new_symbol = (ieee_symbol_type *) bfd_alloc (ieee->h.abfd, amt);
849 if (!new_symbol)
850 return NULL;
852 new_symbol->index = new_index;
853 last_index = new_index;
854 (*symbol_count)++;
855 **pptr = new_symbol;
856 *pptr = &new_symbol->next;
857 if (new_index > *max_index)
858 *max_index = new_index;
860 last_type = this_type;
861 new_symbol->symbol.section = bfd_abs_section_ptr;
862 return new_symbol;
864 return last_symbol;
867 static bfd_boolean
868 ieee_slurp_external_symbols (abfd)
869 bfd *abfd;
871 ieee_data_type *ieee = IEEE_DATA (abfd);
872 file_ptr offset = ieee->w.r.external_part;
874 ieee_symbol_type **prev_symbols_ptr = &ieee->external_symbols;
875 ieee_symbol_type **prev_reference_ptr = &ieee->external_reference;
876 ieee_symbol_type *symbol = (ieee_symbol_type *) NULL;
877 unsigned int symbol_count = 0;
878 bfd_boolean loop = TRUE;
879 last_index = 0xffffff;
880 ieee->symbol_table_full = TRUE;
882 ieee_seek (ieee, offset);
884 while (loop)
886 switch (this_byte (&(ieee->h)))
888 case ieee_nn_record:
889 next_byte (&(ieee->h));
891 symbol = get_symbol (abfd, ieee, symbol, &symbol_count,
892 &prev_symbols_ptr,
893 &ieee->external_symbol_max_index, 'I');
894 if (symbol == NULL)
895 return FALSE;
897 symbol->symbol.the_bfd = abfd;
898 symbol->symbol.name = read_id (&(ieee->h));
899 symbol->symbol.udata.p = (PTR) NULL;
900 symbol->symbol.flags = BSF_NO_FLAGS;
901 break;
902 case ieee_external_symbol_enum:
903 next_byte (&(ieee->h));
905 symbol = get_symbol (abfd, ieee, symbol, &symbol_count,
906 &prev_symbols_ptr,
907 &ieee->external_symbol_max_index, 'D');
908 if (symbol == NULL)
909 return FALSE;
911 BFD_ASSERT (symbol->index >= ieee->external_symbol_min_index);
913 symbol->symbol.the_bfd = abfd;
914 symbol->symbol.name = read_id (&(ieee->h));
915 symbol->symbol.udata.p = (PTR) NULL;
916 symbol->symbol.flags = BSF_NO_FLAGS;
917 break;
918 case ieee_attribute_record_enum >> 8:
920 unsigned int symbol_name_index;
921 unsigned int symbol_type_index;
922 unsigned int symbol_attribute_def;
923 bfd_vma value;
924 switch (read_2bytes (&ieee->h))
926 case ieee_attribute_record_enum:
927 symbol_name_index = must_parse_int (&(ieee->h));
928 symbol_type_index = must_parse_int (&(ieee->h));
929 symbol_attribute_def = must_parse_int (&(ieee->h));
930 switch (symbol_attribute_def)
932 case 8:
933 case 19:
934 parse_int (&ieee->h, &value);
935 break;
936 default:
937 (*_bfd_error_handler)
938 (_("%B: unimplemented ATI record %u for symbol %u"),
939 abfd, symbol_attribute_def, symbol_name_index);
940 bfd_set_error (bfd_error_bad_value);
941 return FALSE;
942 break;
944 break;
945 case ieee_external_reference_info_record_enum:
946 /* Skip over ATX record. */
947 parse_int (&(ieee->h), &value);
948 parse_int (&(ieee->h), &value);
949 parse_int (&(ieee->h), &value);
950 parse_int (&(ieee->h), &value);
951 break;
952 case ieee_atn_record_enum:
953 /* We may get call optimization information here,
954 which we just ignore. The format is
955 {$F1}${CE}{index}{$00}{$3F}{$3F}{#_of_ASNs}. */
956 parse_int (&ieee->h, &value);
957 parse_int (&ieee->h, &value);
958 parse_int (&ieee->h, &value);
959 if (value != 0x3f)
961 (*_bfd_error_handler)
962 (_("%B: unexpected ATN type %d in external part"),
963 abfd, (int) value);
964 bfd_set_error (bfd_error_bad_value);
965 return FALSE;
967 parse_int (&ieee->h, &value);
968 parse_int (&ieee->h, &value);
969 while (value > 0)
971 bfd_vma val1;
973 --value;
975 switch (read_2bytes (&ieee->h))
977 case ieee_asn_record_enum:
978 parse_int (&ieee->h, &val1);
979 parse_int (&ieee->h, &val1);
980 break;
982 default:
983 (*_bfd_error_handler)
984 (_("%B: unexpected type after ATN"), abfd);
985 bfd_set_error (bfd_error_bad_value);
986 return FALSE;
991 break;
992 case ieee_value_record_enum >> 8:
994 unsigned int symbol_name_index;
995 ieee_symbol_index_type symbol_ignore;
996 bfd_boolean pcrel_ignore;
997 unsigned int extra;
998 next_byte (&(ieee->h));
999 next_byte (&(ieee->h));
1001 symbol_name_index = must_parse_int (&(ieee->h));
1002 parse_expression (ieee,
1003 &symbol->symbol.value,
1004 &symbol_ignore,
1005 &pcrel_ignore,
1006 &extra,
1007 &symbol->symbol.section);
1009 /* Fully linked IEEE-695 files tend to give every symbol
1010 an absolute value. Try to convert that back into a
1011 section relative value. FIXME: This won't always to
1012 the right thing. */
1013 if (bfd_is_abs_section (symbol->symbol.section)
1014 && (abfd->flags & HAS_RELOC) == 0)
1016 bfd_vma val;
1017 asection *s;
1019 val = symbol->symbol.value;
1020 for (s = abfd->sections; s != NULL; s = s->next)
1022 if (val >= s->vma && val < s->vma + s->size)
1024 symbol->symbol.section = s;
1025 symbol->symbol.value -= s->vma;
1026 break;
1031 symbol->symbol.flags = BSF_GLOBAL | BSF_EXPORT;
1034 break;
1035 case ieee_weak_external_reference_enum:
1037 bfd_vma size;
1038 bfd_vma value;
1039 next_byte (&(ieee->h));
1040 /* Throw away the external reference index. */
1041 (void) must_parse_int (&(ieee->h));
1042 /* Fetch the default size if not resolved. */
1043 size = must_parse_int (&(ieee->h));
1044 /* Fetch the default value if available. */
1045 if (! parse_int (&(ieee->h), &value))
1047 value = 0;
1049 /* This turns into a common. */
1050 symbol->symbol.section = bfd_com_section_ptr;
1051 symbol->symbol.value = size;
1053 break;
1055 case ieee_external_reference_enum:
1056 next_byte (&(ieee->h));
1058 symbol = get_symbol (abfd, ieee, symbol, &symbol_count,
1059 &prev_reference_ptr,
1060 &ieee->external_reference_max_index, 'X');
1061 if (symbol == NULL)
1062 return FALSE;
1064 symbol->symbol.the_bfd = abfd;
1065 symbol->symbol.name = read_id (&(ieee->h));
1066 symbol->symbol.udata.p = (PTR) NULL;
1067 symbol->symbol.section = bfd_und_section_ptr;
1068 symbol->symbol.value = (bfd_vma) 0;
1069 symbol->symbol.flags = 0;
1071 BFD_ASSERT (symbol->index >= ieee->external_reference_min_index);
1072 break;
1074 default:
1075 loop = FALSE;
1079 if (ieee->external_symbol_max_index != 0)
1081 ieee->external_symbol_count =
1082 ieee->external_symbol_max_index -
1083 ieee->external_symbol_min_index + 1;
1085 else
1087 ieee->external_symbol_count = 0;
1090 if (ieee->external_reference_max_index != 0)
1092 ieee->external_reference_count =
1093 ieee->external_reference_max_index -
1094 ieee->external_reference_min_index + 1;
1096 else
1098 ieee->external_reference_count = 0;
1101 abfd->symcount =
1102 ieee->external_reference_count + ieee->external_symbol_count;
1104 if (symbol_count != abfd->symcount)
1106 /* There are gaps in the table -- */
1107 ieee->symbol_table_full = FALSE;
1110 *prev_symbols_ptr = (ieee_symbol_type *) NULL;
1111 *prev_reference_ptr = (ieee_symbol_type *) NULL;
1113 return TRUE;
1116 static bfd_boolean
1117 ieee_slurp_symbol_table (abfd)
1118 bfd *abfd;
1120 if (! IEEE_DATA (abfd)->read_symbols)
1122 if (! ieee_slurp_external_symbols (abfd))
1123 return FALSE;
1124 IEEE_DATA (abfd)->read_symbols = TRUE;
1126 return TRUE;
1129 static long
1130 ieee_get_symtab_upper_bound (abfd)
1131 bfd *abfd;
1133 if (! ieee_slurp_symbol_table (abfd))
1134 return -1;
1136 return (abfd->symcount != 0) ?
1137 (abfd->symcount + 1) * (sizeof (ieee_symbol_type *)) : 0;
1140 /* Move from our internal lists to the canon table, and insert in
1141 symbol index order. */
1143 extern const bfd_target ieee_vec;
1145 static long
1146 ieee_canonicalize_symtab (abfd, location)
1147 bfd *abfd;
1148 asymbol **location;
1150 ieee_symbol_type *symp;
1151 static bfd dummy_bfd;
1152 static asymbol empty_symbol =
1154 &dummy_bfd,
1155 " ieee empty",
1156 (symvalue) 0,
1157 BSF_DEBUGGING,
1158 bfd_abs_section_ptr
1159 #ifdef __STDC__
1160 /* K&R compilers can't initialise unions. */
1161 , { 0 }
1162 #endif
1165 if (abfd->symcount)
1167 ieee_data_type *ieee = IEEE_DATA (abfd);
1168 dummy_bfd.xvec = &ieee_vec;
1169 if (! ieee_slurp_symbol_table (abfd))
1170 return -1;
1172 if (! ieee->symbol_table_full)
1174 /* Arrgh - there are gaps in the table, run through and fill them
1175 up with pointers to a null place. */
1176 unsigned int i;
1178 for (i = 0; i < abfd->symcount; i++)
1179 location[i] = &empty_symbol;
1182 ieee->external_symbol_base_offset = -ieee->external_symbol_min_index;
1183 for (symp = IEEE_DATA (abfd)->external_symbols;
1184 symp != (ieee_symbol_type *) NULL;
1185 symp = symp->next)
1186 /* Place into table at correct index locations. */
1187 location[symp->index + ieee->external_symbol_base_offset] = &symp->symbol;
1189 /* The external refs are indexed in a bit. */
1190 ieee->external_reference_base_offset =
1191 -ieee->external_reference_min_index + ieee->external_symbol_count;
1193 for (symp = IEEE_DATA (abfd)->external_reference;
1194 symp != (ieee_symbol_type *) NULL;
1195 symp = symp->next)
1196 location[symp->index + ieee->external_reference_base_offset] =
1197 &symp->symbol;
1200 if (abfd->symcount)
1201 location[abfd->symcount] = (asymbol *) NULL;
1203 return abfd->symcount;
1206 static asection *
1207 get_section_entry (abfd, ieee, index)
1208 bfd *abfd;
1209 ieee_data_type *ieee;
1210 unsigned int index;
1212 if (index >= ieee->section_table_size)
1214 unsigned int c, i;
1215 asection **n;
1216 bfd_size_type amt;
1218 c = ieee->section_table_size;
1219 if (c == 0)
1220 c = 20;
1221 while (c <= index)
1222 c *= 2;
1224 amt = c;
1225 amt *= sizeof (asection *);
1226 n = (asection **) bfd_realloc (ieee->section_table, amt);
1227 if (n == NULL)
1228 return NULL;
1230 for (i = ieee->section_table_size; i < c; i++)
1231 n[i] = NULL;
1233 ieee->section_table = n;
1234 ieee->section_table_size = c;
1237 if (ieee->section_table[index] == (asection *) NULL)
1239 char *tmp = bfd_alloc (abfd, (bfd_size_type) 11);
1240 asection *section;
1242 if (!tmp)
1243 return NULL;
1244 sprintf (tmp, " fsec%4d", index);
1245 section = bfd_make_section (abfd, tmp);
1246 ieee->section_table[index] = section;
1247 section->flags = SEC_NO_FLAGS;
1248 section->target_index = index;
1249 ieee->section_table[index] = section;
1251 return ieee->section_table[index];
1254 static void
1255 ieee_slurp_sections (abfd)
1256 bfd *abfd;
1258 ieee_data_type *ieee = IEEE_DATA (abfd);
1259 file_ptr offset = ieee->w.r.section_part;
1260 char *name;
1262 if (offset != 0)
1264 bfd_byte section_type[3];
1265 ieee_seek (ieee, offset);
1266 while (TRUE)
1268 switch (this_byte (&(ieee->h)))
1270 case ieee_section_type_enum:
1272 asection *section;
1273 unsigned int section_index;
1274 next_byte (&(ieee->h));
1275 section_index = must_parse_int (&(ieee->h));
1277 section = get_section_entry (abfd, ieee, section_index);
1279 section_type[0] = this_byte_and_next (&(ieee->h));
1281 /* Set minimal section attributes. Attributes are
1282 extended later, based on section contents. */
1283 switch (section_type[0])
1285 case 0xC1:
1286 /* Normal attributes for absolute sections. */
1287 section_type[1] = this_byte (&(ieee->h));
1288 section->flags = SEC_ALLOC;
1289 switch (section_type[1])
1291 case 0xD3: /* AS Absolute section attributes. */
1292 next_byte (&(ieee->h));
1293 section_type[2] = this_byte (&(ieee->h));
1294 switch (section_type[2])
1296 case 0xD0:
1297 /* Normal code. */
1298 next_byte (&(ieee->h));
1299 section->flags |= SEC_CODE;
1300 break;
1301 case 0xC4:
1302 /* Normal data. */
1303 next_byte (&(ieee->h));
1304 section->flags |= SEC_DATA;
1305 break;
1306 case 0xD2:
1307 next_byte (&(ieee->h));
1308 /* Normal rom data. */
1309 section->flags |= SEC_ROM | SEC_DATA;
1310 break;
1311 default:
1312 break;
1315 break;
1316 case 0xC3: /* Named relocatable sections (type C). */
1317 section_type[1] = this_byte (&(ieee->h));
1318 section->flags = SEC_ALLOC;
1319 switch (section_type[1])
1321 case 0xD0: /* Normal code (CP). */
1322 next_byte (&(ieee->h));
1323 section->flags |= SEC_CODE;
1324 break;
1325 case 0xC4: /* Normal data (CD). */
1326 next_byte (&(ieee->h));
1327 section->flags |= SEC_DATA;
1328 break;
1329 case 0xD2: /* Normal rom data (CR). */
1330 next_byte (&(ieee->h));
1331 section->flags |= SEC_ROM | SEC_DATA;
1332 break;
1333 default:
1334 break;
1338 /* Read section name, use it if non empty. */
1339 name = read_id (&ieee->h);
1340 if (name[0])
1341 section->name = name;
1343 /* Skip these fields, which we don't care about. */
1345 bfd_vma parent, brother, context;
1346 parse_int (&(ieee->h), &parent);
1347 parse_int (&(ieee->h), &brother);
1348 parse_int (&(ieee->h), &context);
1351 break;
1352 case ieee_section_alignment_enum:
1354 unsigned int section_index;
1355 bfd_vma value;
1356 asection *section;
1357 next_byte (&(ieee->h));
1358 section_index = must_parse_int (&ieee->h);
1359 section = get_section_entry (abfd, ieee, section_index);
1360 if (section_index > ieee->section_count)
1362 ieee->section_count = section_index;
1364 section->alignment_power =
1365 bfd_log2 (must_parse_int (&ieee->h));
1366 (void) parse_int (&(ieee->h), &value);
1368 break;
1369 case ieee_e2_first_byte_enum:
1371 asection *section;
1372 ieee_record_enum_type t;
1374 t = (ieee_record_enum_type) (read_2bytes (&(ieee->h)));
1375 switch (t)
1377 case ieee_section_size_enum:
1378 section = ieee->section_table[must_parse_int (&(ieee->h))];
1379 section->size = must_parse_int (&(ieee->h));
1380 break;
1381 case ieee_physical_region_size_enum:
1382 section = ieee->section_table[must_parse_int (&(ieee->h))];
1383 section->size = must_parse_int (&(ieee->h));
1384 break;
1385 case ieee_region_base_address_enum:
1386 section = ieee->section_table[must_parse_int (&(ieee->h))];
1387 section->vma = must_parse_int (&(ieee->h));
1388 section->lma = section->vma;
1389 break;
1390 case ieee_mau_size_enum:
1391 must_parse_int (&(ieee->h));
1392 must_parse_int (&(ieee->h));
1393 break;
1394 case ieee_m_value_enum:
1395 must_parse_int (&(ieee->h));
1396 must_parse_int (&(ieee->h));
1397 break;
1398 case ieee_section_base_address_enum:
1399 section = ieee->section_table[must_parse_int (&(ieee->h))];
1400 section->vma = must_parse_int (&(ieee->h));
1401 section->lma = section->vma;
1402 break;
1403 case ieee_section_offset_enum:
1404 (void) must_parse_int (&(ieee->h));
1405 (void) must_parse_int (&(ieee->h));
1406 break;
1407 default:
1408 return;
1411 break;
1412 default:
1413 return;
1419 /* Make a section for the debugging information, if any. We don't try
1420 to interpret the debugging information; we just point the section
1421 at the area in the file so that program which understand can dig it
1422 out. */
1424 static bfd_boolean
1425 ieee_slurp_debug (abfd)
1426 bfd *abfd;
1428 ieee_data_type *ieee = IEEE_DATA (abfd);
1429 asection *sec;
1430 file_ptr debug_end;
1432 if (ieee->w.r.debug_information_part == 0)
1433 return TRUE;
1435 sec = bfd_make_section (abfd, ".debug");
1436 if (sec == NULL)
1437 return FALSE;
1438 sec->flags |= SEC_DEBUGGING | SEC_HAS_CONTENTS;
1439 sec->filepos = ieee->w.r.debug_information_part;
1441 debug_end = ieee_part_after (ieee, ieee->w.r.debug_information_part);
1442 sec->size = debug_end - ieee->w.r.debug_information_part;
1444 return TRUE;
1447 /* Archive stuff. */
1449 const bfd_target *
1450 ieee_archive_p (abfd)
1451 bfd *abfd;
1453 char *library;
1454 unsigned int i;
1455 unsigned char buffer[512];
1456 file_ptr buffer_offset = 0;
1457 ieee_ar_data_type *save = abfd->tdata.ieee_ar_data;
1458 ieee_ar_data_type *ieee;
1459 bfd_size_type alc_elts;
1460 ieee_ar_obstack_type *elts = NULL;
1461 bfd_size_type amt = sizeof (ieee_ar_data_type);
1463 abfd->tdata.ieee_ar_data = (ieee_ar_data_type *) bfd_alloc (abfd, amt);
1464 if (!abfd->tdata.ieee_ar_data)
1465 goto error_ret_restore;
1466 ieee = IEEE_AR_DATA (abfd);
1468 /* Ignore the return value here. It doesn't matter if we don't read
1469 the entire buffer. We might have a very small ieee file. */
1470 bfd_bread ((PTR) buffer, (bfd_size_type) sizeof (buffer), abfd);
1472 ieee->h.first_byte = buffer;
1473 ieee->h.input_p = buffer;
1475 ieee->h.abfd = abfd;
1477 if (this_byte (&(ieee->h)) != Module_Beginning)
1478 goto got_wrong_format_error;
1480 next_byte (&(ieee->h));
1481 library = read_id (&(ieee->h));
1482 if (strcmp (library, "LIBRARY") != 0)
1483 goto got_wrong_format_error;
1485 /* Throw away the filename. */
1486 read_id (&(ieee->h));
1488 ieee->element_count = 0;
1489 ieee->element_index = 0;
1491 next_byte (&(ieee->h)); /* Drop the ad part. */
1492 must_parse_int (&(ieee->h)); /* And the two dummy numbers. */
1493 must_parse_int (&(ieee->h));
1495 alc_elts = 10;
1496 elts = (ieee_ar_obstack_type *) bfd_malloc (alc_elts * sizeof *elts);
1497 if (elts == NULL)
1498 goto error_return;
1500 /* Read the index of the BB table. */
1501 while (1)
1503 int rec;
1504 ieee_ar_obstack_type *t;
1506 rec = read_2bytes (&(ieee->h));
1507 if (rec != (int) ieee_assign_value_to_variable_enum)
1508 break;
1510 if (ieee->element_count >= alc_elts)
1512 ieee_ar_obstack_type *n;
1514 alc_elts *= 2;
1515 n = ((ieee_ar_obstack_type *)
1516 bfd_realloc (elts, alc_elts * sizeof *elts));
1517 if (n == NULL)
1518 goto error_return;
1519 elts = n;
1522 t = &elts[ieee->element_count];
1523 ieee->element_count++;
1525 must_parse_int (&(ieee->h));
1526 t->file_offset = must_parse_int (&(ieee->h));
1527 t->abfd = (bfd *) NULL;
1529 /* Make sure that we don't go over the end of the buffer. */
1530 if ((size_t) ieee_pos (IEEE_DATA (abfd)) > sizeof (buffer) / 2)
1532 /* Past half way, reseek and reprime. */
1533 buffer_offset += ieee_pos (IEEE_DATA (abfd));
1534 if (bfd_seek (abfd, buffer_offset, SEEK_SET) != 0)
1535 goto error_return;
1537 /* Again ignore return value of bfd_bread. */
1538 bfd_bread ((PTR) buffer, (bfd_size_type) sizeof (buffer), abfd);
1539 ieee->h.first_byte = buffer;
1540 ieee->h.input_p = buffer;
1544 amt = ieee->element_count;
1545 amt *= sizeof *ieee->elements;
1546 ieee->elements = (ieee_ar_obstack_type *) bfd_alloc (abfd, amt);
1547 if (ieee->elements == NULL)
1548 goto error_return;
1550 memcpy (ieee->elements, elts, (size_t) amt);
1551 free (elts);
1552 elts = NULL;
1554 /* Now scan the area again, and replace BB offsets with file offsets. */
1555 for (i = 2; i < ieee->element_count; i++)
1557 if (bfd_seek (abfd, ieee->elements[i].file_offset, SEEK_SET) != 0)
1558 goto error_return;
1560 /* Again ignore return value of bfd_bread. */
1561 bfd_bread ((PTR) buffer, (bfd_size_type) sizeof (buffer), abfd);
1562 ieee->h.first_byte = buffer;
1563 ieee->h.input_p = buffer;
1565 next_byte (&(ieee->h)); /* Drop F8. */
1566 next_byte (&(ieee->h)); /* Drop 14. */
1567 must_parse_int (&(ieee->h)); /* Drop size of block. */
1569 if (must_parse_int (&(ieee->h)) != 0)
1570 /* This object has been deleted. */
1571 ieee->elements[i].file_offset = 0;
1572 else
1573 ieee->elements[i].file_offset = must_parse_int (&(ieee->h));
1576 /* abfd->has_armap = ;*/
1578 return abfd->xvec;
1580 got_wrong_format_error:
1581 bfd_set_error (bfd_error_wrong_format);
1582 error_return:
1583 if (elts != NULL)
1584 free (elts);
1585 bfd_release (abfd, ieee);
1586 error_ret_restore:
1587 abfd->tdata.ieee_ar_data = save;
1589 return NULL;
1592 const bfd_target *
1593 ieee_object_p (abfd)
1594 bfd *abfd;
1596 char *processor;
1597 unsigned int part;
1598 ieee_data_type *ieee;
1599 unsigned char buffer[300];
1600 ieee_data_type *save = IEEE_DATA (abfd);
1601 bfd_size_type amt;
1603 abfd->tdata.ieee_data = 0;
1604 ieee_mkobject (abfd);
1606 ieee = IEEE_DATA (abfd);
1607 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
1608 goto fail;
1609 /* Read the first few bytes in to see if it makes sense. Ignore
1610 bfd_bread return value; The file might be very small. */
1611 bfd_bread ((PTR) buffer, (bfd_size_type) sizeof (buffer), abfd);
1613 ieee->h.input_p = buffer;
1614 if (this_byte_and_next (&(ieee->h)) != Module_Beginning)
1615 goto got_wrong_format;
1617 ieee->read_symbols = FALSE;
1618 ieee->read_data = FALSE;
1619 ieee->section_count = 0;
1620 ieee->external_symbol_max_index = 0;
1621 ieee->external_symbol_min_index = IEEE_PUBLIC_BASE;
1622 ieee->external_reference_min_index = IEEE_REFERENCE_BASE;
1623 ieee->external_reference_max_index = 0;
1624 ieee->h.abfd = abfd;
1625 ieee->section_table = NULL;
1626 ieee->section_table_size = 0;
1628 processor = ieee->mb.processor = read_id (&(ieee->h));
1629 if (strcmp (processor, "LIBRARY") == 0)
1630 goto got_wrong_format;
1631 ieee->mb.module_name = read_id (&(ieee->h));
1632 if (abfd->filename == (const char *) NULL)
1633 abfd->filename = ieee->mb.module_name;
1635 /* Determine the architecture and machine type of the object file. */
1637 const bfd_arch_info_type *arch;
1638 char family[10];
1640 /* IEEE does not specify the format of the processor identification
1641 string, so the compiler is free to put in it whatever it wants.
1642 We try here to recognize different processors belonging to the
1643 m68k family. Code for other processors can be added here. */
1644 if ((processor[0] == '6') && (processor[1] == '8'))
1646 if (processor[2] == '3') /* 683xx integrated processors */
1648 switch (processor[3])
1650 case '0': /* 68302, 68306, 68307 */
1651 case '2': /* 68322, 68328 */
1652 case '5': /* 68356 */
1653 strcpy (family, "68000"); /* MC68000-based controllers */
1654 break;
1656 case '3': /* 68330, 68331, 68332, 68333,
1657 68334, 68335, 68336, 68338 */
1658 case '6': /* 68360 */
1659 case '7': /* 68376 */
1660 strcpy (family, "68332"); /* CPU32 and CPU32+ */
1661 break;
1663 case '4':
1664 if (processor[4] == '9') /* 68349 */
1665 strcpy (family, "68030"); /* CPU030 */
1666 else /* 68340, 68341 */
1667 strcpy (family, "68332"); /* CPU32 and CPU32+ */
1668 break;
1670 default: /* Does not exist yet */
1671 strcpy (family, "68332"); /* Guess it will be CPU32 */
1674 else if (TOUPPER (processor[3]) == 'F') /* 68F333 */
1675 strcpy (family, "68332"); /* CPU32 */
1676 else if ((TOUPPER (processor[3]) == 'C') /* Embedded controllers. */
1677 && ((TOUPPER (processor[2]) == 'E')
1678 || (TOUPPER (processor[2]) == 'H')
1679 || (TOUPPER (processor[2]) == 'L')))
1681 strcpy (family, "68");
1682 strncat (family, processor + 4, 7);
1683 family[9] = '\0';
1685 else /* "Regular" processors. */
1687 strncpy (family, processor, 9);
1688 family[9] = '\0';
1691 else if ((strncmp (processor, "cpu32", 5) == 0) /* CPU32 and CPU32+ */
1692 || (strncmp (processor, "CPU32", 5) == 0))
1693 strcpy (family, "68332");
1694 else
1696 strncpy (family, processor, 9);
1697 family[9] = '\0';
1700 arch = bfd_scan_arch (family);
1701 if (arch == 0)
1702 goto got_wrong_format;
1703 abfd->arch_info = arch;
1706 if (this_byte (&(ieee->h)) != (int) ieee_address_descriptor_enum)
1707 goto fail;
1709 next_byte (&(ieee->h));
1711 if (! parse_int (&(ieee->h), &ieee->ad.number_of_bits_mau))
1712 goto fail;
1714 if (! parse_int (&(ieee->h), &ieee->ad.number_of_maus_in_address))
1715 goto fail;
1717 /* If there is a byte order info, take it. */
1718 if (this_byte (&(ieee->h)) == (int) ieee_variable_L_enum
1719 || this_byte (&(ieee->h)) == (int) ieee_variable_M_enum)
1720 next_byte (&(ieee->h));
1722 for (part = 0; part < N_W_VARIABLES; part++)
1724 bfd_boolean ok;
1726 if (read_2bytes (&(ieee->h)) != (int) ieee_assign_value_to_variable_enum)
1727 goto fail;
1729 if (this_byte_and_next (&(ieee->h)) != part)
1730 goto fail;
1732 ieee->w.offset[part] = parse_i (&(ieee->h), &ok);
1733 if (! ok)
1734 goto fail;
1737 if (ieee->w.r.external_part != 0)
1738 abfd->flags = HAS_SYMS;
1740 /* By now we know that this is a real IEEE file, we're going to read
1741 the whole thing into memory so that we can run up and down it
1742 quickly. We can work out how big the file is from the trailer
1743 record. */
1745 amt = ieee->w.r.me_record + 1;
1746 IEEE_DATA (abfd)->h.first_byte =
1747 (unsigned char *) bfd_alloc (ieee->h.abfd, amt);
1748 if (!IEEE_DATA (abfd)->h.first_byte)
1749 goto fail;
1750 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
1751 goto fail;
1752 /* FIXME: Check return value. I'm not sure whether it needs to read
1753 the entire buffer or not. */
1754 bfd_bread ((PTR) (IEEE_DATA (abfd)->h.first_byte),
1755 (bfd_size_type) ieee->w.r.me_record + 1, abfd);
1757 ieee_slurp_sections (abfd);
1759 if (! ieee_slurp_debug (abfd))
1760 goto fail;
1762 /* Parse section data to activate file and section flags implied by
1763 section contents. */
1764 if (! ieee_slurp_section_data (abfd))
1765 goto fail;
1767 return abfd->xvec;
1768 got_wrong_format:
1769 bfd_set_error (bfd_error_wrong_format);
1770 fail:
1771 bfd_release (abfd, ieee);
1772 abfd->tdata.ieee_data = save;
1773 return (const bfd_target *) NULL;
1776 static void
1777 ieee_get_symbol_info (ignore_abfd, symbol, ret)
1778 bfd *ignore_abfd ATTRIBUTE_UNUSED;
1779 asymbol *symbol;
1780 symbol_info *ret;
1782 bfd_symbol_info (symbol, ret);
1783 if (symbol->name[0] == ' ')
1784 ret->name = "* empty table entry ";
1785 if (!symbol->section)
1786 ret->type = (symbol->flags & BSF_LOCAL) ? 'a' : 'A';
1789 static void
1790 ieee_print_symbol (abfd, afile, symbol, how)
1791 bfd *abfd;
1792 PTR afile;
1793 asymbol *symbol;
1794 bfd_print_symbol_type how;
1796 FILE *file = (FILE *) afile;
1798 switch (how)
1800 case bfd_print_symbol_name:
1801 fprintf (file, "%s", symbol->name);
1802 break;
1803 case bfd_print_symbol_more:
1804 BFD_FAIL ();
1805 break;
1806 case bfd_print_symbol_all:
1808 const char *section_name =
1809 (symbol->section == (asection *) NULL
1810 ? "*abs"
1811 : symbol->section->name);
1813 if (symbol->name[0] == ' ')
1815 fprintf (file, "* empty table entry ");
1817 else
1819 bfd_print_symbol_vandf (abfd, (PTR) file, symbol);
1821 fprintf (file, " %-5s %04x %02x %s",
1822 section_name,
1823 (unsigned) ieee_symbol (symbol)->index,
1824 (unsigned) 0,
1825 symbol->name);
1828 break;
1832 static bfd_boolean
1833 do_one (ieee, current_map, location_ptr, s, iterations)
1834 ieee_data_type *ieee;
1835 ieee_per_section_type *current_map;
1836 unsigned char *location_ptr;
1837 asection *s;
1838 int iterations;
1840 switch (this_byte (&(ieee->h)))
1842 case ieee_load_constant_bytes_enum:
1844 unsigned int number_of_maus;
1845 unsigned int i;
1847 next_byte (&(ieee->h));
1848 number_of_maus = must_parse_int (&(ieee->h));
1850 for (i = 0; i < number_of_maus; i++)
1852 location_ptr[current_map->pc++] = this_byte (&(ieee->h));
1853 next_byte (&(ieee->h));
1856 break;
1858 case ieee_load_with_relocation_enum:
1860 bfd_boolean loop = TRUE;
1862 next_byte (&(ieee->h));
1863 while (loop)
1865 switch (this_byte (&(ieee->h)))
1867 case ieee_variable_R_enum:
1869 case ieee_function_signed_open_b_enum:
1870 case ieee_function_unsigned_open_b_enum:
1871 case ieee_function_either_open_b_enum:
1873 unsigned int extra = 4;
1874 bfd_boolean pcrel = FALSE;
1875 asection *section;
1876 ieee_reloc_type *r;
1877 bfd_size_type amt = sizeof (ieee_reloc_type);
1879 r = (ieee_reloc_type *) bfd_alloc (ieee->h.abfd, amt);
1880 if (!r)
1881 return FALSE;
1883 *(current_map->reloc_tail_ptr) = r;
1884 current_map->reloc_tail_ptr = &r->next;
1885 r->next = (ieee_reloc_type *) NULL;
1886 next_byte (&(ieee->h));
1887 /* abort();*/
1888 r->relent.sym_ptr_ptr = 0;
1889 parse_expression (ieee,
1890 &r->relent.addend,
1891 &r->symbol,
1892 &pcrel, &extra, &section);
1893 r->relent.address = current_map->pc;
1894 s->flags |= SEC_RELOC;
1895 s->owner->flags |= HAS_RELOC;
1896 s->reloc_count++;
1897 if (r->relent.sym_ptr_ptr == NULL && section != NULL)
1898 r->relent.sym_ptr_ptr = section->symbol_ptr_ptr;
1900 if (this_byte (&(ieee->h)) == (int) ieee_comma)
1902 next_byte (&(ieee->h));
1903 /* Fetch number of bytes to pad. */
1904 extra = must_parse_int (&(ieee->h));
1907 switch (this_byte (&(ieee->h)))
1909 case ieee_function_signed_close_b_enum:
1910 next_byte (&(ieee->h));
1911 break;
1912 case ieee_function_unsigned_close_b_enum:
1913 next_byte (&(ieee->h));
1914 break;
1915 case ieee_function_either_close_b_enum:
1916 next_byte (&(ieee->h));
1917 break;
1918 default:
1919 break;
1921 /* Build a relocation entry for this type. */
1922 /* If pc rel then stick -ve pc into instruction
1923 and take out of reloc ..
1925 I've changed this. It's all too complicated. I
1926 keep 0 in the instruction now. */
1928 switch (extra)
1930 case 0:
1931 case 4:
1933 if (pcrel)
1935 #if KEEPMINUSPCININST
1936 bfd_put_32 (ieee->h.abfd, -current_map->pc,
1937 location_ptr + current_map->pc);
1938 r->relent.howto = &rel32_howto;
1939 r->relent.addend -= current_map->pc;
1940 #else
1941 bfd_put_32 (ieee->h.abfd, (bfd_vma) 0, location_ptr +
1942 current_map->pc);
1943 r->relent.howto = &rel32_howto;
1944 #endif
1946 else
1948 bfd_put_32 (ieee->h.abfd, (bfd_vma) 0,
1949 location_ptr + current_map->pc);
1950 r->relent.howto = &abs32_howto;
1952 current_map->pc += 4;
1953 break;
1954 case 2:
1955 if (pcrel)
1957 #if KEEPMINUSPCININST
1958 bfd_put_16 (ieee->h.abfd, (bfd_vma) -current_map->pc,
1959 location_ptr + current_map->pc);
1960 r->relent.addend -= current_map->pc;
1961 r->relent.howto = &rel16_howto;
1962 #else
1964 bfd_put_16 (ieee->h.abfd, (bfd_vma) 0,
1965 location_ptr + current_map->pc);
1966 r->relent.howto = &rel16_howto;
1967 #endif
1970 else
1972 bfd_put_16 (ieee->h.abfd, (bfd_vma) 0,
1973 location_ptr + current_map->pc);
1974 r->relent.howto = &abs16_howto;
1976 current_map->pc += 2;
1977 break;
1978 case 1:
1979 if (pcrel)
1981 #if KEEPMINUSPCININST
1982 bfd_put_8 (ieee->h.abfd, (int) (-current_map->pc), location_ptr + current_map->pc);
1983 r->relent.addend -= current_map->pc;
1984 r->relent.howto = &rel8_howto;
1985 #else
1986 bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1987 r->relent.howto = &rel8_howto;
1988 #endif
1990 else
1992 bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1993 r->relent.howto = &abs8_howto;
1995 current_map->pc += 1;
1996 break;
1998 default:
1999 BFD_FAIL ();
2000 return FALSE;
2003 break;
2004 default:
2006 bfd_vma this_size;
2007 if (parse_int (&(ieee->h), &this_size))
2009 unsigned int i;
2010 for (i = 0; i < this_size; i++)
2012 location_ptr[current_map->pc++] = this_byte (&(ieee->h));
2013 next_byte (&(ieee->h));
2016 else
2018 loop = FALSE;
2023 /* Prevent more than the first load-item of an LR record
2024 from being repeated (MRI convention). */
2025 if (iterations != 1)
2026 loop = FALSE;
2030 return TRUE;
2033 /* Read in all the section data and relocation stuff too. */
2035 static bfd_boolean
2036 ieee_slurp_section_data (abfd)
2037 bfd *abfd;
2039 bfd_byte *location_ptr = (bfd_byte *) NULL;
2040 ieee_data_type *ieee = IEEE_DATA (abfd);
2041 unsigned int section_number;
2043 ieee_per_section_type *current_map = (ieee_per_section_type *) NULL;
2044 asection *s;
2045 /* Seek to the start of the data area. */
2046 if (ieee->read_data)
2047 return TRUE;
2048 ieee->read_data = TRUE;
2049 ieee_seek (ieee, ieee->w.r.data_part);
2051 /* Allocate enough space for all the section contents. */
2052 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
2054 ieee_per_section_type *per = ieee_per_section (s);
2055 if ((s->flags & SEC_DEBUGGING) != 0)
2056 continue;
2057 per->data = (bfd_byte *) bfd_alloc (ieee->h.abfd, s->size);
2058 if (!per->data)
2059 return FALSE;
2060 per->reloc_tail_ptr =
2061 (ieee_reloc_type **) & (s->relocation);
2064 while (TRUE)
2066 switch (this_byte (&(ieee->h)))
2068 /* IF we see anything strange then quit. */
2069 default:
2070 return TRUE;
2072 case ieee_set_current_section_enum:
2073 next_byte (&(ieee->h));
2074 section_number = must_parse_int (&(ieee->h));
2075 s = ieee->section_table[section_number];
2076 s->flags |= SEC_LOAD | SEC_HAS_CONTENTS;
2077 current_map = ieee_per_section (s);
2078 location_ptr = current_map->data - s->vma;
2079 /* The document I have says that Microtec's compilers reset
2080 this after a sec section, even though the standard says not
2081 to, SO... */
2082 current_map->pc = s->vma;
2083 break;
2085 case ieee_e2_first_byte_enum:
2086 next_byte (&(ieee->h));
2087 switch (this_byte (&(ieee->h)))
2089 case ieee_set_current_pc_enum & 0xff:
2091 bfd_vma value;
2092 ieee_symbol_index_type symbol;
2093 unsigned int extra;
2094 bfd_boolean pcrel;
2096 next_byte (&(ieee->h));
2097 must_parse_int (&(ieee->h)); /* Throw away section #. */
2098 parse_expression (ieee, &value,
2099 &symbol,
2100 &pcrel, &extra,
2102 current_map->pc = value;
2103 BFD_ASSERT ((unsigned) (value - s->vma) <= s->size);
2105 break;
2107 case ieee_value_starting_address_enum & 0xff:
2108 next_byte (&(ieee->h));
2109 if (this_byte (&(ieee->h)) == ieee_function_either_open_b_enum)
2110 next_byte (&(ieee->h));
2111 abfd->start_address = must_parse_int (&(ieee->h));
2112 /* We've got to the end of the data now - */
2113 return TRUE;
2114 default:
2115 BFD_FAIL ();
2116 return FALSE;
2118 break;
2119 case ieee_repeat_data_enum:
2121 /* Repeat the following LD or LR n times - we do this by
2122 remembering the stream pointer before running it and
2123 resetting it and running it n times. We special case
2124 the repetition of a repeat_data/load_constant. */
2125 unsigned int iterations;
2126 unsigned char *start;
2128 next_byte (&(ieee->h));
2129 iterations = must_parse_int (&(ieee->h));
2130 start = ieee->h.input_p;
2131 if (start[0] == (int) ieee_load_constant_bytes_enum
2132 && start[1] == 1)
2134 while (iterations != 0)
2136 location_ptr[current_map->pc++] = start[2];
2137 iterations--;
2139 next_byte (&(ieee->h));
2140 next_byte (&(ieee->h));
2141 next_byte (&(ieee->h));
2143 else
2145 while (iterations != 0)
2147 ieee->h.input_p = start;
2148 if (!do_one (ieee, current_map, location_ptr, s,
2149 (int) iterations))
2150 return FALSE;
2151 iterations--;
2155 break;
2156 case ieee_load_constant_bytes_enum:
2157 case ieee_load_with_relocation_enum:
2158 if (!do_one (ieee, current_map, location_ptr, s, 1))
2159 return FALSE;
2164 static bfd_boolean
2165 ieee_new_section_hook (abfd, newsect)
2166 bfd *abfd;
2167 asection *newsect;
2169 newsect->used_by_bfd
2170 = (PTR) bfd_alloc (abfd, (bfd_size_type) sizeof (ieee_per_section_type));
2171 if (!newsect->used_by_bfd)
2172 return FALSE;
2173 ieee_per_section (newsect)->data = (bfd_byte *) NULL;
2174 ieee_per_section (newsect)->section = newsect;
2175 return TRUE;
2178 static long
2179 ieee_get_reloc_upper_bound (abfd, asect)
2180 bfd *abfd;
2181 sec_ptr asect;
2183 if ((asect->flags & SEC_DEBUGGING) != 0)
2184 return 0;
2185 if (! ieee_slurp_section_data (abfd))
2186 return -1;
2187 return (asect->reloc_count + 1) * sizeof (arelent *);
2190 static bfd_boolean
2191 ieee_get_section_contents (abfd, section, location, offset, count)
2192 bfd *abfd;
2193 sec_ptr section;
2194 PTR location;
2195 file_ptr offset;
2196 bfd_size_type count;
2198 ieee_per_section_type *p = ieee_per_section (section);
2199 if ((section->flags & SEC_DEBUGGING) != 0)
2200 return _bfd_generic_get_section_contents (abfd, section, location,
2201 offset, count);
2202 ieee_slurp_section_data (abfd);
2203 (void) memcpy ((PTR) location, (PTR) (p->data + offset), (unsigned) count);
2204 return TRUE;
2207 static long
2208 ieee_canonicalize_reloc (abfd, section, relptr, symbols)
2209 bfd *abfd;
2210 sec_ptr section;
2211 arelent **relptr;
2212 asymbol **symbols;
2214 ieee_reloc_type *src = (ieee_reloc_type *) (section->relocation);
2215 ieee_data_type *ieee = IEEE_DATA (abfd);
2217 if ((section->flags & SEC_DEBUGGING) != 0)
2218 return 0;
2220 while (src != (ieee_reloc_type *) NULL)
2222 /* Work out which symbol to attach it this reloc to. */
2223 switch (src->symbol.letter)
2225 case 'I':
2226 src->relent.sym_ptr_ptr =
2227 symbols + src->symbol.index + ieee->external_symbol_base_offset;
2228 break;
2229 case 'X':
2230 src->relent.sym_ptr_ptr =
2231 symbols + src->symbol.index + ieee->external_reference_base_offset;
2232 break;
2233 case 0:
2234 if (src->relent.sym_ptr_ptr != NULL)
2235 src->relent.sym_ptr_ptr =
2236 src->relent.sym_ptr_ptr[0]->section->symbol_ptr_ptr;
2237 break;
2238 default:
2240 BFD_FAIL ();
2242 *relptr++ = &src->relent;
2243 src = src->next;
2245 *relptr = (arelent *) NULL;
2246 return section->reloc_count;
2249 static int
2250 comp (ap, bp)
2251 const PTR ap;
2252 const PTR bp;
2254 arelent *a = *((arelent **) ap);
2255 arelent *b = *((arelent **) bp);
2256 return a->address - b->address;
2259 /* Write the section headers. */
2261 static bfd_boolean
2262 ieee_write_section_part (abfd)
2263 bfd *abfd;
2265 ieee_data_type *ieee = IEEE_DATA (abfd);
2266 asection *s;
2267 ieee->w.r.section_part = bfd_tell (abfd);
2268 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
2270 if (! bfd_is_abs_section (s)
2271 && (s->flags & SEC_DEBUGGING) == 0)
2273 if (! ieee_write_byte (abfd, ieee_section_type_enum)
2274 || ! ieee_write_byte (abfd,
2275 (bfd_byte) (s->index
2276 + IEEE_SECTION_NUMBER_BASE)))
2277 return FALSE;
2279 if (abfd->flags & EXEC_P)
2281 /* This image is executable, so output absolute sections. */
2282 if (! ieee_write_byte (abfd, ieee_variable_A_enum)
2283 || ! ieee_write_byte (abfd, ieee_variable_S_enum))
2284 return FALSE;
2286 else
2288 if (! ieee_write_byte (abfd, ieee_variable_C_enum))
2289 return FALSE;
2292 switch (s->flags & (SEC_CODE | SEC_DATA | SEC_ROM))
2294 case SEC_CODE | SEC_LOAD:
2295 case SEC_CODE:
2296 if (! ieee_write_byte (abfd, ieee_variable_P_enum))
2297 return FALSE;
2298 break;
2299 case SEC_DATA:
2300 default:
2301 if (! ieee_write_byte (abfd, ieee_variable_D_enum))
2302 return FALSE;
2303 break;
2304 case SEC_ROM:
2305 case SEC_ROM | SEC_DATA:
2306 case SEC_ROM | SEC_LOAD:
2307 case SEC_ROM | SEC_DATA | SEC_LOAD:
2308 if (! ieee_write_byte (abfd, ieee_variable_R_enum))
2309 return FALSE;
2313 if (! ieee_write_id (abfd, s->name))
2314 return FALSE;
2315 /* Alignment. */
2316 if (! ieee_write_byte (abfd, ieee_section_alignment_enum)
2317 || ! ieee_write_byte (abfd,
2318 (bfd_byte) (s->index
2319 + IEEE_SECTION_NUMBER_BASE))
2320 || ! ieee_write_int (abfd, (bfd_vma) 1 << s->alignment_power))
2321 return FALSE;
2323 /* Size. */
2324 if (! ieee_write_2bytes (abfd, ieee_section_size_enum)
2325 || ! ieee_write_byte (abfd,
2326 (bfd_byte) (s->index
2327 + IEEE_SECTION_NUMBER_BASE))
2328 || ! ieee_write_int (abfd, s->size))
2329 return FALSE;
2330 if (abfd->flags & EXEC_P)
2332 /* Relocateable sections don't have asl records. */
2333 /* Vma. */
2334 if (! ieee_write_2bytes (abfd, ieee_section_base_address_enum)
2335 || ! ieee_write_byte (abfd,
2336 ((bfd_byte)
2337 (s->index
2338 + IEEE_SECTION_NUMBER_BASE)))
2339 || ! ieee_write_int (abfd, s->lma))
2340 return FALSE;
2345 return TRUE;
2349 static bfd_boolean
2350 do_with_relocs (abfd, s)
2351 bfd *abfd;
2352 asection *s;
2354 unsigned int number_of_maus_in_address =
2355 bfd_arch_bits_per_address (abfd) / bfd_arch_bits_per_byte (abfd);
2356 unsigned int relocs_to_go = s->reloc_count;
2357 bfd_byte *stream = ieee_per_section (s)->data;
2358 arelent **p = s->orelocation;
2359 bfd_size_type current_byte_index = 0;
2361 qsort (s->orelocation,
2362 relocs_to_go,
2363 sizeof (arelent **),
2364 comp);
2366 /* Output the section preheader. */
2367 if (! ieee_write_byte (abfd, ieee_set_current_section_enum)
2368 || ! ieee_write_byte (abfd,
2369 (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE))
2370 || ! ieee_write_2bytes (abfd, ieee_set_current_pc_enum)
2371 || ! ieee_write_byte (abfd,
2372 (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE)))
2373 return FALSE;
2375 if ((abfd->flags & EXEC_P) != 0 && relocs_to_go == 0)
2377 if (! ieee_write_int (abfd, s->lma))
2378 return FALSE;
2380 else
2382 if (! ieee_write_expression (abfd, (bfd_vma) 0, s->symbol, 0, 0))
2383 return FALSE;
2386 if (relocs_to_go == 0)
2388 /* If there aren't any relocations then output the load constant
2389 byte opcode rather than the load with relocation opcode. */
2390 while (current_byte_index < s->size)
2392 bfd_size_type run;
2393 unsigned int MAXRUN = 127;
2395 run = MAXRUN;
2396 if (run > s->size - current_byte_index)
2397 run = s->size - current_byte_index;
2399 if (run != 0)
2401 if (! ieee_write_byte (abfd, ieee_load_constant_bytes_enum))
2402 return FALSE;
2403 /* Output a stream of bytes. */
2404 if (! ieee_write_int (abfd, run))
2405 return FALSE;
2406 if (bfd_bwrite ((PTR) (stream + current_byte_index), run, abfd)
2407 != run)
2408 return FALSE;
2409 current_byte_index += run;
2413 else
2415 if (! ieee_write_byte (abfd, ieee_load_with_relocation_enum))
2416 return FALSE;
2418 /* Output the data stream as the longest sequence of bytes
2419 possible, allowing for the a reasonable packet size and
2420 relocation stuffs. */
2422 if ((PTR) stream == (PTR) NULL)
2424 /* Outputting a section without data, fill it up. */
2425 stream = (unsigned char *) bfd_zalloc (abfd, s->size);
2426 if (!stream)
2427 return FALSE;
2429 while (current_byte_index < s->size)
2431 bfd_size_type run;
2432 unsigned int MAXRUN = 127;
2434 if (relocs_to_go)
2436 run = (*p)->address - current_byte_index;
2437 if (run > MAXRUN)
2438 run = MAXRUN;
2440 else
2441 run = MAXRUN;
2443 if (run > s->size - current_byte_index)
2444 run = s->size - current_byte_index;
2446 if (run != 0)
2448 /* Output a stream of bytes. */
2449 if (! ieee_write_int (abfd, run))
2450 return FALSE;
2451 if (bfd_bwrite ((PTR) (stream + current_byte_index), run, abfd)
2452 != run)
2453 return FALSE;
2454 current_byte_index += run;
2457 /* Output any relocations here. */
2458 if (relocs_to_go && (*p) && (*p)->address == current_byte_index)
2460 while (relocs_to_go
2461 && (*p) && (*p)->address == current_byte_index)
2463 arelent *r = *p;
2464 bfd_signed_vma ov;
2465 switch (r->howto->size)
2467 case 2:
2469 ov = bfd_get_signed_32 (abfd,
2470 stream + current_byte_index);
2471 current_byte_index += 4;
2472 break;
2473 case 1:
2474 ov = bfd_get_signed_16 (abfd,
2475 stream + current_byte_index);
2476 current_byte_index += 2;
2477 break;
2478 case 0:
2479 ov = bfd_get_signed_8 (abfd,
2480 stream + current_byte_index);
2481 current_byte_index++;
2482 break;
2483 default:
2484 ov = 0;
2485 BFD_FAIL ();
2486 return FALSE;
2489 ov &= r->howto->src_mask;
2491 if (r->howto->pc_relative
2492 && ! r->howto->pcrel_offset)
2493 ov += r->address;
2495 if (! ieee_write_byte (abfd,
2496 ieee_function_either_open_b_enum))
2497 return FALSE;
2499 /* abort();*/
2501 if (r->sym_ptr_ptr != (asymbol **) NULL)
2503 if (! ieee_write_expression (abfd, r->addend + ov,
2504 *(r->sym_ptr_ptr),
2505 r->howto->pc_relative,
2506 (unsigned) s->index))
2507 return FALSE;
2509 else
2511 if (! ieee_write_expression (abfd, r->addend + ov,
2512 (asymbol *) NULL,
2513 r->howto->pc_relative,
2514 (unsigned) s->index))
2515 return FALSE;
2518 if (number_of_maus_in_address
2519 != bfd_get_reloc_size (r->howto))
2521 bfd_vma rsize = bfd_get_reloc_size (r->howto);
2522 if (! ieee_write_int (abfd, rsize))
2523 return FALSE;
2525 if (! ieee_write_byte (abfd,
2526 ieee_function_either_close_b_enum))
2527 return FALSE;
2529 relocs_to_go--;
2530 p++;
2537 return TRUE;
2540 /* If there are no relocations in the output section then we can be
2541 clever about how we write. We block items up into a max of 127
2542 bytes. */
2544 static bfd_boolean
2545 do_as_repeat (abfd, s)
2546 bfd *abfd;
2547 asection *s;
2549 if (s->size)
2551 if (! ieee_write_byte (abfd, ieee_set_current_section_enum)
2552 || ! ieee_write_byte (abfd,
2553 (bfd_byte) (s->index
2554 + IEEE_SECTION_NUMBER_BASE))
2555 || ! ieee_write_byte (abfd, ieee_set_current_pc_enum >> 8)
2556 || ! ieee_write_byte (abfd, ieee_set_current_pc_enum & 0xff)
2557 || ! ieee_write_byte (abfd,
2558 (bfd_byte) (s->index
2559 + IEEE_SECTION_NUMBER_BASE)))
2560 return FALSE;
2562 if ((abfd->flags & EXEC_P) != 0)
2564 if (! ieee_write_int (abfd, s->lma))
2565 return FALSE;
2567 else
2569 if (! ieee_write_expression (abfd, (bfd_vma) 0, s->symbol, 0, 0))
2570 return FALSE;
2573 if (! ieee_write_byte (abfd, ieee_repeat_data_enum)
2574 || ! ieee_write_int (abfd, s->size)
2575 || ! ieee_write_byte (abfd, ieee_load_constant_bytes_enum)
2576 || ! ieee_write_byte (abfd, 1)
2577 || ! ieee_write_byte (abfd, 0))
2578 return FALSE;
2581 return TRUE;
2584 static bfd_boolean
2585 do_without_relocs (abfd, s)
2586 bfd *abfd;
2587 asection *s;
2589 bfd_byte *stream = ieee_per_section (s)->data;
2591 if (stream == 0 || ((s->flags & SEC_LOAD) == 0))
2593 if (! do_as_repeat (abfd, s))
2594 return FALSE;
2596 else
2598 unsigned int i;
2600 for (i = 0; i < s->size; i++)
2602 if (stream[i] != 0)
2604 if (! do_with_relocs (abfd, s))
2605 return FALSE;
2606 return TRUE;
2609 if (! do_as_repeat (abfd, s))
2610 return FALSE;
2613 return TRUE;
2617 static unsigned char *output_ptr_start;
2618 static unsigned char *output_ptr;
2619 static unsigned char *output_ptr_end;
2620 static unsigned char *input_ptr_start;
2621 static unsigned char *input_ptr;
2622 static unsigned char *input_ptr_end;
2623 static bfd *input_bfd;
2624 static bfd *output_bfd;
2625 static int output_buffer;
2627 static bfd_boolean
2628 ieee_mkobject (abfd)
2629 bfd *abfd;
2631 bfd_size_type amt;
2633 output_ptr_start = NULL;
2634 output_ptr = NULL;
2635 output_ptr_end = NULL;
2636 input_ptr_start = NULL;
2637 input_ptr = NULL;
2638 input_ptr_end = NULL;
2639 input_bfd = NULL;
2640 output_bfd = NULL;
2641 output_buffer = 0;
2642 amt = sizeof (ieee_data_type);
2643 abfd->tdata.ieee_data = (ieee_data_type *) bfd_zalloc (abfd, amt);
2644 return abfd->tdata.ieee_data != NULL;
2647 static void
2648 fill ()
2650 bfd_size_type amt = input_ptr_end - input_ptr_start;
2651 /* FIXME: Check return value. I'm not sure whether it needs to read
2652 the entire buffer or not. */
2653 bfd_bread ((PTR) input_ptr_start, amt, input_bfd);
2654 input_ptr = input_ptr_start;
2657 static void
2658 flush ()
2660 bfd_size_type amt = output_ptr - output_ptr_start;
2662 if (bfd_bwrite ((PTR) (output_ptr_start), amt, output_bfd) != amt)
2663 abort ();
2664 output_ptr = output_ptr_start;
2665 output_buffer++;
2668 #define THIS() ( *input_ptr )
2669 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill(); }
2670 #define OUT(x) { *output_ptr++ = (x); if(output_ptr == output_ptr_end) flush(); }
2672 static void
2673 write_int (value)
2674 int value;
2676 if (value >= 0 && value <= 127)
2678 OUT (value);
2680 else
2682 unsigned int length;
2683 /* How many significant bytes ? */
2684 /* FIXME FOR LONGER INTS. */
2685 if (value & 0xff000000)
2686 length = 4;
2687 else if (value & 0x00ff0000)
2688 length = 3;
2689 else if (value & 0x0000ff00)
2690 length = 2;
2691 else
2692 length = 1;
2694 OUT ((int) ieee_number_repeat_start_enum + length);
2695 switch (length)
2697 case 4:
2698 OUT (value >> 24);
2699 case 3:
2700 OUT (value >> 16);
2701 case 2:
2702 OUT (value >> 8);
2703 case 1:
2704 OUT (value);
2709 static void
2710 copy_id ()
2712 int length = THIS ();
2713 char ch;
2715 OUT (length);
2716 NEXT ();
2717 while (length--)
2719 ch = THIS ();
2720 OUT (ch);
2721 NEXT ();
2725 #define VAR(x) ((x | 0x80))
2726 static void
2727 copy_expression ()
2729 int stack[10];
2730 int *tos = stack;
2731 int value;
2733 while (1)
2735 switch (THIS ())
2737 case 0x84:
2738 NEXT ();
2739 value = THIS ();
2740 NEXT ();
2741 value = (value << 8) | THIS ();
2742 NEXT ();
2743 value = (value << 8) | THIS ();
2744 NEXT ();
2745 value = (value << 8) | THIS ();
2746 NEXT ();
2747 *tos++ = value;
2748 break;
2749 case 0x83:
2750 NEXT ();
2751 value = THIS ();
2752 NEXT ();
2753 value = (value << 8) | THIS ();
2754 NEXT ();
2755 value = (value << 8) | THIS ();
2756 NEXT ();
2757 *tos++ = value;
2758 break;
2759 case 0x82:
2760 NEXT ();
2761 value = THIS ();
2762 NEXT ();
2763 value = (value << 8) | THIS ();
2764 NEXT ();
2765 *tos++ = value;
2766 break;
2767 case 0x81:
2768 NEXT ();
2769 value = THIS ();
2770 NEXT ();
2771 *tos++ = value;
2772 break;
2773 case 0x80:
2774 NEXT ();
2775 *tos++ = 0;
2776 break;
2777 default:
2778 if (THIS () > 0x84)
2780 /* Not a number, just bug out with the answer. */
2781 write_int (*(--tos));
2782 return;
2784 *tos++ = THIS ();
2785 NEXT ();
2786 break;
2787 case 0xa5:
2788 /* PLUS anything. */
2789 value = *(--tos);
2790 value += *(--tos);
2791 *tos++ = value;
2792 NEXT ();
2793 break;
2794 case VAR ('R'):
2796 int section_number;
2797 ieee_data_type *ieee;
2798 asection *s;
2800 NEXT ();
2801 section_number = THIS ();
2803 NEXT ();
2804 ieee = IEEE_DATA (input_bfd);
2805 s = ieee->section_table[section_number];
2806 value = 0;
2807 if (s->output_section)
2808 value = s->output_section->lma;
2809 value += s->output_offset;
2810 *tos++ = value;
2812 break;
2813 case 0x90:
2815 NEXT ();
2816 write_int (*(--tos));
2817 OUT (0x90);
2818 return;
2824 /* Drop the int in the buffer, and copy a null into the gap, which we
2825 will overwrite later */
2827 static void
2828 fill_int (buf)
2829 struct output_buffer_struct *buf;
2831 if (buf->buffer == output_buffer)
2833 /* Still a chance to output the size. */
2834 int value = output_ptr - buf->ptrp + 3;
2835 buf->ptrp[0] = value >> 24;
2836 buf->ptrp[1] = value >> 16;
2837 buf->ptrp[2] = value >> 8;
2838 buf->ptrp[3] = value >> 0;
2842 static void
2843 drop_int (buf)
2844 struct output_buffer_struct *buf;
2846 int type = THIS ();
2847 int ch;
2849 if (type <= 0x84)
2851 NEXT ();
2852 switch (type)
2854 case 0x84:
2855 ch = THIS ();
2856 NEXT ();
2857 case 0x83:
2858 ch = THIS ();
2859 NEXT ();
2860 case 0x82:
2861 ch = THIS ();
2862 NEXT ();
2863 case 0x81:
2864 ch = THIS ();
2865 NEXT ();
2866 case 0x80:
2867 break;
2870 OUT (0x84);
2871 buf->ptrp = output_ptr;
2872 buf->buffer = output_buffer;
2873 OUT (0);
2874 OUT (0);
2875 OUT (0);
2876 OUT (0);
2879 static void
2880 copy_int ()
2882 int type = THIS ();
2883 int ch;
2884 if (type <= 0x84)
2886 OUT (type);
2887 NEXT ();
2888 switch (type)
2890 case 0x84:
2891 ch = THIS ();
2892 NEXT ();
2893 OUT (ch);
2894 case 0x83:
2895 ch = THIS ();
2896 NEXT ();
2897 OUT (ch);
2898 case 0x82:
2899 ch = THIS ();
2900 NEXT ();
2901 OUT (ch);
2902 case 0x81:
2903 ch = THIS ();
2904 NEXT ();
2905 OUT (ch);
2906 case 0x80:
2907 break;
2912 #define ID copy_id()
2913 #define INT copy_int()
2914 #define EXP copy_expression()
2915 #define INTn(q) copy_int()
2916 #define EXPn(q) copy_expression()
2918 static void
2919 f1_record ()
2921 int ch;
2923 /* ATN record. */
2924 NEXT ();
2925 ch = THIS ();
2926 switch (ch)
2928 default:
2929 OUT (0xf1);
2930 OUT (ch);
2931 break;
2932 case 0xc9:
2933 NEXT ();
2934 OUT (0xf1);
2935 OUT (0xc9);
2936 INT;
2937 INT;
2938 ch = THIS ();
2939 switch (ch)
2941 case 0x16:
2942 NEXT ();
2943 break;
2944 case 0x01:
2945 NEXT ();
2946 break;
2947 case 0x00:
2948 NEXT ();
2949 INT;
2950 break;
2951 case 0x03:
2952 NEXT ();
2953 INT;
2954 break;
2955 case 0x13:
2956 EXPn (instruction address);
2957 break;
2958 default:
2959 break;
2961 break;
2962 case 0xd8:
2963 /* EXternal ref. */
2964 NEXT ();
2965 OUT (0xf1);
2966 OUT (0xd8);
2967 EXP;
2968 EXP;
2969 EXP;
2970 EXP;
2971 break;
2972 case 0xce:
2973 NEXT ();
2974 OUT (0xf1);
2975 OUT (0xce);
2976 INT;
2977 INT;
2978 ch = THIS ();
2979 INT;
2980 switch (ch)
2982 case 0x01:
2983 INT;
2984 INT;
2985 break;
2986 case 0x02:
2987 INT;
2988 break;
2989 case 0x04:
2990 EXPn (external function);
2991 break;
2992 case 0x05:
2993 break;
2994 case 0x07:
2995 INTn (line number);
2996 INT;
2997 case 0x08:
2998 break;
2999 case 0x0a:
3000 INTn (locked register);
3001 INT;
3002 break;
3003 case 0x3f:
3004 copy_till_end ();
3005 break;
3006 case 0x3e:
3007 copy_till_end ();
3008 break;
3009 case 0x40:
3010 copy_till_end ();
3011 break;
3012 case 0x41:
3014 break;
3019 static void
3020 f0_record ()
3022 /* Attribute record. */
3023 NEXT ();
3024 OUT (0xf0);
3025 INTn (Symbol name);
3029 static void
3030 copy_till_end ()
3032 int ch = THIS ();
3034 while (1)
3036 while (ch <= 0x80)
3038 OUT (ch);
3039 NEXT ();
3040 ch = THIS ();
3042 switch (ch)
3044 case 0x84:
3045 OUT (THIS ());
3046 NEXT ();
3047 case 0x83:
3048 OUT (THIS ());
3049 NEXT ();
3050 case 0x82:
3051 OUT (THIS ());
3052 NEXT ();
3053 case 0x81:
3054 OUT (THIS ());
3055 NEXT ();
3056 OUT (THIS ());
3057 NEXT ();
3059 ch = THIS ();
3060 break;
3061 default:
3062 return;
3068 static void
3069 f2_record ()
3071 NEXT ();
3072 OUT (0xf2);
3073 INT;
3074 NEXT ();
3075 OUT (0xce);
3076 INT;
3077 copy_till_end ();
3081 static void
3082 f8_record ()
3084 int ch;
3085 NEXT ();
3086 ch = THIS ();
3087 switch (ch)
3089 case 0x01:
3090 case 0x02:
3091 case 0x03:
3092 /* Unique typedefs for module. */
3093 /* GLobal typedefs. */
3094 /* High level module scope beginning. */
3096 struct output_buffer_struct ob;
3098 NEXT ();
3099 OUT (0xf8);
3100 OUT (ch);
3101 drop_int (&ob);
3104 block ();
3106 NEXT ();
3107 fill_int (&ob);
3108 OUT (0xf9);
3110 break;
3111 case 0x04:
3112 /* Global function. */
3114 struct output_buffer_struct ob;
3116 NEXT ();
3117 OUT (0xf8);
3118 OUT (0x04);
3119 drop_int (&ob);
3121 INTn (stack size);
3122 INTn (ret val);
3123 EXPn (offset);
3125 block ();
3127 NEXT ();
3128 OUT (0xf9);
3129 EXPn (size of block);
3130 fill_int (&ob);
3132 break;
3134 case 0x05:
3135 /* File name for source line numbers. */
3137 struct output_buffer_struct ob;
3139 NEXT ();
3140 OUT (0xf8);
3141 OUT (0x05);
3142 drop_int (&ob);
3144 INTn (year);
3145 INTn (month);
3146 INTn (day);
3147 INTn (hour);
3148 INTn (monute);
3149 INTn (second);
3150 block ();
3151 NEXT ();
3152 OUT (0xf9);
3153 fill_int (&ob);
3155 break;
3157 case 0x06:
3158 /* Local function. */
3160 struct output_buffer_struct ob;
3162 NEXT ();
3163 OUT (0xf8);
3164 OUT (0x06);
3165 drop_int (&ob);
3167 INTn (stack size);
3168 INTn (type return);
3169 EXPn (offset);
3170 block ();
3171 NEXT ();
3172 OUT (0xf9);
3173 EXPn (size);
3174 fill_int (&ob);
3176 break;
3178 case 0x0a:
3179 /* Assembler module scope beginning - */
3181 struct output_buffer_struct ob;
3183 NEXT ();
3184 OUT (0xf8);
3185 OUT (0x0a);
3186 drop_int (&ob);
3189 INT;
3191 INT;
3192 INT;
3193 INT;
3194 INT;
3195 INT;
3196 INT;
3198 block ();
3200 NEXT ();
3201 OUT (0xf9);
3202 fill_int (&ob);
3204 break;
3205 case 0x0b:
3207 struct output_buffer_struct ob;
3209 NEXT ();
3210 OUT (0xf8);
3211 OUT (0x0b);
3212 drop_int (&ob);
3214 INT;
3215 INTn (section index);
3216 EXPn (offset);
3217 INTn (stuff);
3219 block ();
3221 OUT (0xf9);
3222 NEXT ();
3223 EXPn (Size in Maus);
3224 fill_int (&ob);
3226 break;
3230 static void
3231 e2_record ()
3233 OUT (0xe2);
3234 NEXT ();
3235 OUT (0xce);
3236 NEXT ();
3237 INT;
3238 EXP;
3241 static void
3242 block ()
3244 int ch;
3246 while (1)
3248 ch = THIS ();
3249 switch (ch)
3251 case 0xe1:
3252 case 0xe5:
3253 return;
3254 case 0xf9:
3255 return;
3256 case 0xf0:
3257 f0_record ();
3258 break;
3259 case 0xf1:
3260 f1_record ();
3261 break;
3262 case 0xf2:
3263 f2_record ();
3264 break;
3265 case 0xf8:
3266 f8_record ();
3267 break;
3268 case 0xe2:
3269 e2_record ();
3270 break;
3277 /* Moves all the debug information from the source bfd to the output
3278 bfd, and relocates any expressions it finds. */
3280 static void
3281 relocate_debug (output, input)
3282 bfd *output ATTRIBUTE_UNUSED;
3283 bfd *input;
3285 #define IBS 400
3286 #define OBS 400
3287 unsigned char input_buffer[IBS];
3289 input_ptr_start = input_ptr = input_buffer;
3290 input_ptr_end = input_buffer + IBS;
3291 input_bfd = input;
3292 /* FIXME: Check return value. I'm not sure whether it needs to read
3293 the entire buffer or not. */
3294 bfd_bread ((PTR) input_ptr_start, (bfd_size_type) IBS, input);
3295 block ();
3298 /* Gather together all the debug information from each input BFD into
3299 one place, relocating it and emitting it as we go. */
3301 static bfd_boolean
3302 ieee_write_debug_part (abfd)
3303 bfd *abfd;
3305 ieee_data_type *ieee = IEEE_DATA (abfd);
3306 bfd_chain_type *chain = ieee->chain_root;
3307 unsigned char obuff[OBS];
3308 bfd_boolean some_debug = FALSE;
3309 file_ptr here = bfd_tell (abfd);
3311 output_ptr_start = output_ptr = obuff;
3312 output_ptr_end = obuff + OBS;
3313 output_ptr = obuff;
3314 output_bfd = abfd;
3316 if (chain == (bfd_chain_type *) NULL)
3318 asection *s;
3320 for (s = abfd->sections; s != NULL; s = s->next)
3321 if ((s->flags & SEC_DEBUGGING) != 0)
3322 break;
3323 if (s == NULL)
3325 ieee->w.r.debug_information_part = 0;
3326 return TRUE;
3329 ieee->w.r.debug_information_part = here;
3330 if (bfd_bwrite (s->contents, s->size, abfd) != s->size)
3331 return FALSE;
3333 else
3335 while (chain != (bfd_chain_type *) NULL)
3337 bfd *entry = chain->this;
3338 ieee_data_type *entry_ieee = IEEE_DATA (entry);
3340 if (entry_ieee->w.r.debug_information_part)
3342 if (bfd_seek (entry, entry_ieee->w.r.debug_information_part,
3343 SEEK_SET) != 0)
3344 return FALSE;
3345 relocate_debug (abfd, entry);
3348 chain = chain->next;
3351 if (some_debug)
3352 ieee->w.r.debug_information_part = here;
3353 else
3354 ieee->w.r.debug_information_part = 0;
3356 flush ();
3359 return TRUE;
3362 /* Write the data in an ieee way. */
3364 static bfd_boolean
3365 ieee_write_data_part (abfd)
3366 bfd *abfd;
3368 asection *s;
3370 ieee_data_type *ieee = IEEE_DATA (abfd);
3371 ieee->w.r.data_part = bfd_tell (abfd);
3373 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
3375 /* Skip sections that have no loadable contents (.bss,
3376 debugging, etc.) */
3377 if ((s->flags & SEC_LOAD) == 0)
3378 continue;
3380 /* Sort the reloc records so we can insert them in the correct
3381 places */
3382 if (s->reloc_count != 0)
3384 if (! do_with_relocs (abfd, s))
3385 return FALSE;
3387 else
3389 if (! do_without_relocs (abfd, s))
3390 return FALSE;
3394 return TRUE;
3398 static bfd_boolean
3399 init_for_output (abfd)
3400 bfd *abfd;
3402 asection *s;
3404 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
3406 if ((s->flags & SEC_DEBUGGING) != 0)
3407 continue;
3408 if (s->size != 0)
3410 bfd_size_type size = s->size;
3411 ieee_per_section (s)->data = (bfd_byte *) (bfd_alloc (abfd, size));
3412 if (!ieee_per_section (s)->data)
3413 return FALSE;
3416 return TRUE;
3419 /* Exec and core file sections. */
3421 /* Set section contents is complicated with IEEE since the format is
3422 not a byte image, but a record stream. */
3424 static bfd_boolean
3425 ieee_set_section_contents (abfd, section, location, offset, count)
3426 bfd *abfd;
3427 sec_ptr section;
3428 const PTR location;
3429 file_ptr offset;
3430 bfd_size_type count;
3432 if ((section->flags & SEC_DEBUGGING) != 0)
3434 if (section->contents == NULL)
3436 bfd_size_type size = section->size;
3437 section->contents = (unsigned char *) bfd_alloc (abfd, size);
3438 if (section->contents == NULL)
3439 return FALSE;
3441 /* bfd_set_section_contents has already checked that everything
3442 is within range. */
3443 memcpy (section->contents + offset, location, (size_t) count);
3444 return TRUE;
3447 if (ieee_per_section (section)->data == (bfd_byte *) NULL)
3449 if (!init_for_output (abfd))
3450 return FALSE;
3452 memcpy ((PTR) (ieee_per_section (section)->data + offset),
3453 (PTR) location,
3454 (unsigned int) count);
3455 return TRUE;
3458 /* Write the external symbols of a file. IEEE considers two sorts of
3459 external symbols, public, and referenced. It uses to internal
3460 forms to index them as well. When we write them out we turn their
3461 symbol values into indexes from the right base. */
3463 static bfd_boolean
3464 ieee_write_external_part (abfd)
3465 bfd *abfd;
3467 asymbol **q;
3468 ieee_data_type *ieee = IEEE_DATA (abfd);
3469 unsigned int reference_index = IEEE_REFERENCE_BASE;
3470 unsigned int public_index = IEEE_PUBLIC_BASE + 2;
3471 file_ptr here = bfd_tell (abfd);
3472 bfd_boolean hadone = FALSE;
3474 if (abfd->outsymbols != (asymbol **) NULL)
3477 for (q = abfd->outsymbols; *q != (asymbol *) NULL; q++)
3479 asymbol *p = *q;
3481 if (bfd_is_und_section (p->section))
3483 /* This must be a symbol reference. */
3484 if (! ieee_write_byte (abfd, ieee_external_reference_enum)
3485 || ! ieee_write_int (abfd, (bfd_vma) reference_index)
3486 || ! ieee_write_id (abfd, p->name))
3487 return FALSE;
3488 p->value = reference_index;
3489 reference_index++;
3490 hadone = TRUE;
3492 else if (bfd_is_com_section (p->section))
3494 /* This is a weak reference. */
3495 if (! ieee_write_byte (abfd, ieee_external_reference_enum)
3496 || ! ieee_write_int (abfd, (bfd_vma) reference_index)
3497 || ! ieee_write_id (abfd, p->name)
3498 || ! ieee_write_byte (abfd,
3499 ieee_weak_external_reference_enum)
3500 || ! ieee_write_int (abfd, (bfd_vma) reference_index)
3501 || ! ieee_write_int (abfd, p->value))
3502 return FALSE;
3503 p->value = reference_index;
3504 reference_index++;
3505 hadone = TRUE;
3507 else if (p->flags & BSF_GLOBAL)
3509 /* This must be a symbol definition. */
3510 if (! ieee_write_byte (abfd, ieee_external_symbol_enum)
3511 || ! ieee_write_int (abfd, (bfd_vma) public_index)
3512 || ! ieee_write_id (abfd, p->name)
3513 || ! ieee_write_2bytes (abfd, ieee_attribute_record_enum)
3514 || ! ieee_write_int (abfd, (bfd_vma) public_index)
3515 || ! ieee_write_byte (abfd, 15) /* instruction address */
3516 || ! ieee_write_byte (abfd, 19) /* static symbol */
3517 || ! ieee_write_byte (abfd, 1)) /* one of them */
3518 return FALSE;
3520 /* Write out the value. */
3521 if (! ieee_write_2bytes (abfd, ieee_value_record_enum)
3522 || ! ieee_write_int (abfd, (bfd_vma) public_index))
3523 return FALSE;
3524 if (! bfd_is_abs_section (p->section))
3526 if (abfd->flags & EXEC_P)
3528 /* If fully linked, then output all symbols
3529 relocated. */
3530 if (! (ieee_write_int
3531 (abfd,
3532 (p->value
3533 + p->section->output_offset
3534 + p->section->output_section->vma))))
3535 return FALSE;
3537 else
3539 if (! (ieee_write_expression
3540 (abfd,
3541 p->value + p->section->output_offset,
3542 p->section->output_section->symbol,
3543 FALSE, 0)))
3544 return FALSE;
3547 else
3549 if (! ieee_write_expression (abfd,
3550 p->value,
3551 bfd_abs_section_ptr->symbol,
3552 FALSE, 0))
3553 return FALSE;
3555 p->value = public_index;
3556 public_index++;
3557 hadone = TRUE;
3559 else
3561 /* This can happen - when there are gaps in the symbols read
3562 from an input ieee file. */
3566 if (hadone)
3567 ieee->w.r.external_part = here;
3569 return TRUE;
3573 static const unsigned char exten[] =
3575 0xf0, 0x20, 0x00,
3576 0xf1, 0xce, 0x20, 0x00, 37, 3, 3, /* Set version 3 rev 3. */
3577 0xf1, 0xce, 0x20, 0x00, 39, 2, /* Keep symbol in original case. */
3578 0xf1, 0xce, 0x20, 0x00, 38 /* Set object type relocatable to x. */
3581 static const unsigned char envi[] =
3583 0xf0, 0x21, 0x00,
3585 /* 0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
3586 0x19, 0x2c,
3588 0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok */
3590 0xf1, 0xce, 0x21, 0, 53, 0x03,/* host unix */
3591 /* 0xf1, 0xce, 0x21, 0, 54, 2,1,1 tool & version # */
3594 static bfd_boolean
3595 ieee_write_me_part (abfd)
3596 bfd *abfd;
3598 ieee_data_type *ieee = IEEE_DATA (abfd);
3599 ieee->w.r.trailer_part = bfd_tell (abfd);
3600 if (abfd->start_address)
3602 if (! ieee_write_2bytes (abfd, ieee_value_starting_address_enum)
3603 || ! ieee_write_byte (abfd, ieee_function_either_open_b_enum)
3604 || ! ieee_write_int (abfd, abfd->start_address)
3605 || ! ieee_write_byte (abfd, ieee_function_either_close_b_enum))
3606 return FALSE;
3608 ieee->w.r.me_record = bfd_tell (abfd);
3609 if (! ieee_write_byte (abfd, ieee_module_end_enum))
3610 return FALSE;
3611 return TRUE;
3614 /* Write out the IEEE processor ID. */
3616 static bfd_boolean
3617 ieee_write_processor (abfd)
3618 bfd *abfd;
3620 const bfd_arch_info_type *arch;
3622 arch = bfd_get_arch_info (abfd);
3623 switch (arch->arch)
3625 default:
3626 if (! ieee_write_id (abfd, bfd_printable_name (abfd)))
3627 return FALSE;
3628 break;
3630 case bfd_arch_a29k:
3631 if (! ieee_write_id (abfd, "29000"))
3632 return FALSE;
3633 break;
3635 case bfd_arch_h8300:
3636 if (! ieee_write_id (abfd, "H8/300"))
3637 return FALSE;
3638 break;
3640 case bfd_arch_h8500:
3641 if (! ieee_write_id (abfd, "H8/500"))
3642 return FALSE;
3643 break;
3645 case bfd_arch_i960:
3646 switch (arch->mach)
3648 default:
3649 case bfd_mach_i960_core:
3650 case bfd_mach_i960_ka_sa:
3651 if (! ieee_write_id (abfd, "80960KA"))
3652 return FALSE;
3653 break;
3655 case bfd_mach_i960_kb_sb:
3656 if (! ieee_write_id (abfd, "80960KB"))
3657 return FALSE;
3658 break;
3660 case bfd_mach_i960_ca:
3661 if (! ieee_write_id (abfd, "80960CA"))
3662 return FALSE;
3663 break;
3665 case bfd_mach_i960_mc:
3666 case bfd_mach_i960_xa:
3667 if (! ieee_write_id (abfd, "80960MC"))
3668 return FALSE;
3669 break;
3671 break;
3673 case bfd_arch_m68k:
3675 const char *id;
3677 switch (arch->mach)
3679 default: id = "68020"; break;
3680 case bfd_mach_m68000: id = "68000"; break;
3681 case bfd_mach_m68008: id = "68008"; break;
3682 case bfd_mach_m68010: id = "68010"; break;
3683 case bfd_mach_m68020: id = "68020"; break;
3684 case bfd_mach_m68030: id = "68030"; break;
3685 case bfd_mach_m68040: id = "68040"; break;
3686 case bfd_mach_m68060: id = "68060"; break;
3687 case bfd_mach_cpu32: id = "cpu32"; break;
3688 case bfd_mach_mcf5200:id = "5200"; break;
3689 case bfd_mach_mcf5206e:id = "5206e"; break;
3690 case bfd_mach_mcf5307:id = "5307"; break;
3691 case bfd_mach_mcf5407:id = "5407"; break;
3692 case bfd_mach_mcf528x:id = "5282"; break;
3695 if (! ieee_write_id (abfd, id))
3696 return FALSE;
3698 break;
3701 return TRUE;
3704 static bfd_boolean
3705 ieee_write_object_contents (abfd)
3706 bfd *abfd;
3708 ieee_data_type *ieee = IEEE_DATA (abfd);
3709 unsigned int i;
3710 file_ptr old;
3712 /* Fast forward over the header area. */
3713 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
3714 return FALSE;
3716 if (! ieee_write_byte (abfd, ieee_module_beginning_enum)
3717 || ! ieee_write_processor (abfd)
3718 || ! ieee_write_id (abfd, abfd->filename))
3719 return FALSE;
3721 /* Fast forward over the variable bits. */
3722 if (! ieee_write_byte (abfd, ieee_address_descriptor_enum))
3723 return FALSE;
3725 /* Bits per MAU. */
3726 if (! ieee_write_byte (abfd, (bfd_byte) (bfd_arch_bits_per_byte (abfd))))
3727 return FALSE;
3728 /* MAU's per address. */
3729 if (! ieee_write_byte (abfd,
3730 (bfd_byte) (bfd_arch_bits_per_address (abfd)
3731 / bfd_arch_bits_per_byte (abfd))))
3732 return FALSE;
3734 old = bfd_tell (abfd);
3735 if (bfd_seek (abfd, (file_ptr) (8 * N_W_VARIABLES), SEEK_CUR) != 0)
3736 return FALSE;
3738 ieee->w.r.extension_record = bfd_tell (abfd);
3739 if (bfd_bwrite ((char *) exten, (bfd_size_type) sizeof (exten), abfd)
3740 != sizeof (exten))
3741 return FALSE;
3742 if (abfd->flags & EXEC_P)
3744 if (! ieee_write_byte (abfd, 0x1)) /* Absolute */
3745 return FALSE;
3747 else
3749 if (! ieee_write_byte (abfd, 0x2)) /* Relocateable */
3750 return FALSE;
3753 ieee->w.r.environmental_record = bfd_tell (abfd);
3754 if (bfd_bwrite ((char *) envi, (bfd_size_type) sizeof (envi), abfd)
3755 != sizeof (envi))
3756 return FALSE;
3758 /* The HP emulator database requires a timestamp in the file. */
3760 time_t now;
3761 const struct tm *t;
3763 time (&now);
3764 t = (struct tm *) localtime (&now);
3765 if (! ieee_write_2bytes (abfd, (int) ieee_atn_record_enum)
3766 || ! ieee_write_byte (abfd, 0x21)
3767 || ! ieee_write_byte (abfd, 0)
3768 || ! ieee_write_byte (abfd, 50)
3769 || ! ieee_write_int (abfd, (bfd_vma) (t->tm_year + 1900))
3770 || ! ieee_write_int (abfd, (bfd_vma) (t->tm_mon + 1))
3771 || ! ieee_write_int (abfd, (bfd_vma) t->tm_mday)
3772 || ! ieee_write_int (abfd, (bfd_vma) t->tm_hour)
3773 || ! ieee_write_int (abfd, (bfd_vma) t->tm_min)
3774 || ! ieee_write_int (abfd, (bfd_vma) t->tm_sec))
3775 return FALSE;
3778 output_bfd = abfd;
3780 flush ();
3782 if (! ieee_write_section_part (abfd))
3783 return FALSE;
3784 /* First write the symbols. This changes their values into table
3785 indeces so we cant use it after this point. */
3786 if (! ieee_write_external_part (abfd))
3787 return FALSE;
3789 /* Write any debugs we have been told about. */
3790 if (! ieee_write_debug_part (abfd))
3791 return FALSE;
3793 /* Can only write the data once the symbols have been written, since
3794 the data contains relocation information which points to the
3795 symbols. */
3796 if (! ieee_write_data_part (abfd))
3797 return FALSE;
3799 /* At the end we put the end! */
3800 if (! ieee_write_me_part (abfd))
3801 return FALSE;
3803 /* Generate the header. */
3804 if (bfd_seek (abfd, old, SEEK_SET) != 0)
3805 return FALSE;
3807 for (i = 0; i < N_W_VARIABLES; i++)
3809 if (! ieee_write_2bytes (abfd, ieee_assign_value_to_variable_enum)
3810 || ! ieee_write_byte (abfd, (bfd_byte) i)
3811 || ! ieee_write_int5_out (abfd, (bfd_vma) ieee->w.offset[i]))
3812 return FALSE;
3815 return TRUE;
3818 /* Native-level interface to symbols. */
3820 /* We read the symbols into a buffer, which is discarded when this
3821 function exits. We read the strings into a buffer large enough to
3822 hold them all plus all the cached symbol entries. */
3824 static asymbol *
3825 ieee_make_empty_symbol (abfd)
3826 bfd *abfd;
3828 bfd_size_type amt = sizeof (ieee_symbol_type);
3829 ieee_symbol_type *new = (ieee_symbol_type *) bfd_zalloc (abfd, amt);
3831 if (!new)
3832 return NULL;
3833 new->symbol.the_bfd = abfd;
3834 return &new->symbol;
3837 static bfd *
3838 ieee_openr_next_archived_file (arch, prev)
3839 bfd *arch;
3840 bfd *prev;
3842 ieee_ar_data_type *ar = IEEE_AR_DATA (arch);
3844 /* Take the next one from the arch state, or reset. */
3845 if (prev == (bfd *) NULL)
3846 /* Reset the index - the first two entries are bogus. */
3847 ar->element_index = 2;
3849 while (TRUE)
3851 ieee_ar_obstack_type *p = ar->elements + ar->element_index;
3853 ar->element_index++;
3854 if (ar->element_index <= ar->element_count)
3856 if (p->file_offset != (file_ptr) 0)
3858 if (p->abfd == (bfd *) NULL)
3860 p->abfd = _bfd_create_empty_archive_element_shell (arch);
3861 p->abfd->origin = p->file_offset;
3863 return p->abfd;
3866 else
3868 bfd_set_error (bfd_error_no_more_archived_files);
3869 return (bfd *) NULL;
3874 static bfd_boolean
3875 ieee_find_nearest_line (abfd, section, symbols, offset, filename_ptr,
3876 functionname_ptr, line_ptr)
3877 bfd *abfd ATTRIBUTE_UNUSED;
3878 asection *section ATTRIBUTE_UNUSED;
3879 asymbol **symbols ATTRIBUTE_UNUSED;
3880 bfd_vma offset ATTRIBUTE_UNUSED;
3881 const char **filename_ptr ATTRIBUTE_UNUSED;
3882 const char **functionname_ptr ATTRIBUTE_UNUSED;
3883 unsigned int *line_ptr ATTRIBUTE_UNUSED;
3885 return FALSE;
3888 static int
3889 ieee_generic_stat_arch_elt (abfd, buf)
3890 bfd *abfd;
3891 struct stat *buf;
3893 ieee_ar_data_type *ar = (ieee_ar_data_type *) NULL;
3894 ieee_data_type *ieee;
3896 if (abfd->my_archive != NULL)
3897 ar = abfd->my_archive->tdata.ieee_ar_data;
3898 if (ar == (ieee_ar_data_type *) NULL)
3900 bfd_set_error (bfd_error_invalid_operation);
3901 return -1;
3904 if (IEEE_DATA (abfd) == NULL)
3906 if (ieee_object_p (abfd) == NULL)
3908 bfd_set_error (bfd_error_wrong_format);
3909 return -1;
3913 ieee = IEEE_DATA (abfd);
3915 buf->st_size = ieee->w.r.me_record + 1;
3916 buf->st_mode = 0644;
3917 return 0;
3920 static int
3921 ieee_sizeof_headers (abfd, x)
3922 bfd *abfd ATTRIBUTE_UNUSED;
3923 bfd_boolean x ATTRIBUTE_UNUSED;
3925 return 0;
3928 #define ieee_close_and_cleanup _bfd_generic_close_and_cleanup
3929 #define ieee_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
3931 #define ieee_slurp_armap bfd_true
3932 #define ieee_slurp_extended_name_table bfd_true
3933 #define ieee_construct_extended_name_table \
3934 ((bfd_boolean (*) \
3935 PARAMS ((bfd *, char **, bfd_size_type *, const char **))) \
3936 bfd_true)
3937 #define ieee_truncate_arname bfd_dont_truncate_arname
3938 #define ieee_write_armap \
3939 ((bfd_boolean (*) \
3940 PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int))) \
3941 bfd_true)
3942 #define ieee_read_ar_hdr bfd_nullvoidptr
3943 #define ieee_update_armap_timestamp bfd_true
3944 #define ieee_get_elt_at_index _bfd_generic_get_elt_at_index
3946 #define ieee_bfd_is_target_special_symbol \
3947 ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
3948 #define ieee_bfd_is_local_label_name bfd_generic_is_local_label_name
3949 #define ieee_get_lineno _bfd_nosymbols_get_lineno
3950 #define ieee_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
3951 #define ieee_read_minisymbols _bfd_generic_read_minisymbols
3952 #define ieee_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
3954 #define ieee_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
3956 #define ieee_set_arch_mach _bfd_generic_set_arch_mach
3958 #define ieee_get_section_contents_in_window \
3959 _bfd_generic_get_section_contents_in_window
3960 #define ieee_bfd_get_relocated_section_contents \
3961 bfd_generic_get_relocated_section_contents
3962 #define ieee_bfd_relax_section bfd_generic_relax_section
3963 #define ieee_bfd_gc_sections bfd_generic_gc_sections
3964 #define ieee_bfd_merge_sections bfd_generic_merge_sections
3965 #define ieee_bfd_is_group_section bfd_generic_is_group_section
3966 #define ieee_bfd_discard_group bfd_generic_discard_group
3967 #define ieee_section_already_linked \
3968 _bfd_generic_section_already_linked
3969 #define ieee_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
3970 #define ieee_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
3971 #define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols
3972 #define ieee_bfd_link_just_syms _bfd_generic_link_just_syms
3973 #define ieee_bfd_final_link _bfd_generic_final_link
3974 #define ieee_bfd_link_split_section _bfd_generic_link_split_section
3976 const bfd_target ieee_vec =
3978 "ieee", /* name */
3979 bfd_target_ieee_flavour,
3980 BFD_ENDIAN_UNKNOWN, /* target byte order */
3981 BFD_ENDIAN_UNKNOWN, /* target headers byte order */
3982 (HAS_RELOC | EXEC_P | /* object flags */
3983 HAS_LINENO | HAS_DEBUG |
3984 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
3985 (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
3986 | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
3987 '_', /* leading underscore */
3988 ' ', /* ar_pad_char */
3989 16, /* ar_max_namelen */
3990 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
3991 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
3992 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
3993 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
3994 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
3995 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
3997 {_bfd_dummy_target,
3998 ieee_object_p, /* bfd_check_format */
3999 ieee_archive_p,
4000 _bfd_dummy_target,
4003 bfd_false,
4004 ieee_mkobject,
4005 _bfd_generic_mkarchive,
4006 bfd_false
4009 bfd_false,
4010 ieee_write_object_contents,
4011 _bfd_write_archive_contents,
4012 bfd_false,
4015 /* ieee_close_and_cleanup, ieee_bfd_free_cached_info, ieee_new_section_hook,
4016 ieee_get_section_contents, ieee_get_section_contents_in_window */
4017 BFD_JUMP_TABLE_GENERIC (ieee),
4019 BFD_JUMP_TABLE_COPY (_bfd_generic),
4020 BFD_JUMP_TABLE_CORE (_bfd_nocore),
4022 /* ieee_slurp_armap, ieee_slurp_extended_name_table,
4023 ieee_construct_extended_name_table, ieee_truncate_arname,
4024 ieee_write_armap, ieee_read_ar_hdr, ieee_openr_next_archived_file,
4025 ieee_get_elt_at_index, ieee_generic_stat_arch_elt,
4026 ieee_update_armap_timestamp */
4027 BFD_JUMP_TABLE_ARCHIVE (ieee),
4029 /* ieee_get_symtab_upper_bound, ieee_canonicalize_symtab,
4030 ieee_make_empty_symbol, ieee_print_symbol, ieee_get_symbol_info,
4031 ieee_bfd_is_local_label_name, ieee_get_lineno,
4032 ieee_find_nearest_line, ieee_bfd_make_debug_symbol,
4033 ieee_read_minisymbols, ieee_minisymbol_to_symbol */
4034 BFD_JUMP_TABLE_SYMBOLS (ieee),
4036 /* ieee_get_reloc_upper_bound, ieee_canonicalize_reloc,
4037 ieee_bfd_reloc_type_lookup */
4038 BFD_JUMP_TABLE_RELOCS (ieee),
4040 /* ieee_set_arch_mach, ieee_set_section_contents */
4041 BFD_JUMP_TABLE_WRITE (ieee),
4043 /* ieee_sizeof_headers, ieee_bfd_get_relocated_section_contents,
4044 ieee_bfd_relax_section, ieee_bfd_link_hash_table_create,
4045 _bfd_generic_link_hash_table_free,
4046 ieee_bfd_link_add_symbols, ieee_bfd_final_link,
4047 ieee_bfd_link_split_section, ieee_bfd_gc_sections,
4048 ieee_bfd_merge_sections */
4049 BFD_JUMP_TABLE_LINK (ieee),
4051 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
4053 NULL,
4055 (PTR) 0