daily update
[binutils.git] / bfd / ieee.c
blob8a0802840d4989c9c25c267a71484be74c1d2805
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
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))]->_raw_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 (_("%s: unimplemented ATI record %u for symbol %u"),
939 bfd_archive_filename (abfd), symbol_attribute_def,
940 symbol_name_index);
941 bfd_set_error (bfd_error_bad_value);
942 return FALSE;
943 break;
945 break;
946 case ieee_external_reference_info_record_enum:
947 /* Skip over ATX record. */
948 parse_int (&(ieee->h), &value);
949 parse_int (&(ieee->h), &value);
950 parse_int (&(ieee->h), &value);
951 parse_int (&(ieee->h), &value);
952 break;
953 case ieee_atn_record_enum:
954 /* We may get call optimization information here,
955 which we just ignore. The format is
956 {$F1}${CE}{index}{$00}{$3F}{$3F}{#_of_ASNs}. */
957 parse_int (&ieee->h, &value);
958 parse_int (&ieee->h, &value);
959 parse_int (&ieee->h, &value);
960 if (value != 0x3f)
962 (*_bfd_error_handler)
963 (_("%s: unexpected ATN type %d in external part"),
964 bfd_archive_filename (abfd), (int) value);
965 bfd_set_error (bfd_error_bad_value);
966 return FALSE;
968 parse_int (&ieee->h, &value);
969 parse_int (&ieee->h, &value);
970 while (value > 0)
972 bfd_vma val1;
974 --value;
976 switch (read_2bytes (&ieee->h))
978 case ieee_asn_record_enum:
979 parse_int (&ieee->h, &val1);
980 parse_int (&ieee->h, &val1);
981 break;
983 default:
984 (*_bfd_error_handler)
985 (_("%s: unexpected type after ATN"),
986 bfd_archive_filename (abfd));
987 bfd_set_error (bfd_error_bad_value);
988 return FALSE;
993 break;
994 case ieee_value_record_enum >> 8:
996 unsigned int symbol_name_index;
997 ieee_symbol_index_type symbol_ignore;
998 bfd_boolean pcrel_ignore;
999 unsigned int extra;
1000 next_byte (&(ieee->h));
1001 next_byte (&(ieee->h));
1003 symbol_name_index = must_parse_int (&(ieee->h));
1004 parse_expression (ieee,
1005 &symbol->symbol.value,
1006 &symbol_ignore,
1007 &pcrel_ignore,
1008 &extra,
1009 &symbol->symbol.section);
1011 /* Fully linked IEEE-695 files tend to give every symbol
1012 an absolute value. Try to convert that back into a
1013 section relative value. FIXME: This won't always to
1014 the right thing. */
1015 if (bfd_is_abs_section (symbol->symbol.section)
1016 && (abfd->flags & HAS_RELOC) == 0)
1018 bfd_vma val;
1019 asection *s;
1021 val = symbol->symbol.value;
1022 for (s = abfd->sections; s != NULL; s = s->next)
1024 if (val >= s->vma && val < s->vma + s->_raw_size)
1026 symbol->symbol.section = s;
1027 symbol->symbol.value -= s->vma;
1028 break;
1033 symbol->symbol.flags = BSF_GLOBAL | BSF_EXPORT;
1036 break;
1037 case ieee_weak_external_reference_enum:
1039 bfd_vma size;
1040 bfd_vma value;
1041 next_byte (&(ieee->h));
1042 /* Throw away the external reference index. */
1043 (void) must_parse_int (&(ieee->h));
1044 /* Fetch the default size if not resolved. */
1045 size = must_parse_int (&(ieee->h));
1046 /* Fetch the default value if available. */
1047 if (! parse_int (&(ieee->h), &value))
1049 value = 0;
1051 /* This turns into a common. */
1052 symbol->symbol.section = bfd_com_section_ptr;
1053 symbol->symbol.value = size;
1055 break;
1057 case ieee_external_reference_enum:
1058 next_byte (&(ieee->h));
1060 symbol = get_symbol (abfd, ieee, symbol, &symbol_count,
1061 &prev_reference_ptr,
1062 &ieee->external_reference_max_index, 'X');
1063 if (symbol == NULL)
1064 return FALSE;
1066 symbol->symbol.the_bfd = abfd;
1067 symbol->symbol.name = read_id (&(ieee->h));
1068 symbol->symbol.udata.p = (PTR) NULL;
1069 symbol->symbol.section = bfd_und_section_ptr;
1070 symbol->symbol.value = (bfd_vma) 0;
1071 symbol->symbol.flags = 0;
1073 BFD_ASSERT (symbol->index >= ieee->external_reference_min_index);
1074 break;
1076 default:
1077 loop = FALSE;
1081 if (ieee->external_symbol_max_index != 0)
1083 ieee->external_symbol_count =
1084 ieee->external_symbol_max_index -
1085 ieee->external_symbol_min_index + 1;
1087 else
1089 ieee->external_symbol_count = 0;
1092 if (ieee->external_reference_max_index != 0)
1094 ieee->external_reference_count =
1095 ieee->external_reference_max_index -
1096 ieee->external_reference_min_index + 1;
1098 else
1100 ieee->external_reference_count = 0;
1103 abfd->symcount =
1104 ieee->external_reference_count + ieee->external_symbol_count;
1106 if (symbol_count != abfd->symcount)
1108 /* There are gaps in the table -- */
1109 ieee->symbol_table_full = FALSE;
1112 *prev_symbols_ptr = (ieee_symbol_type *) NULL;
1113 *prev_reference_ptr = (ieee_symbol_type *) NULL;
1115 return TRUE;
1118 static bfd_boolean
1119 ieee_slurp_symbol_table (abfd)
1120 bfd *abfd;
1122 if (! IEEE_DATA (abfd)->read_symbols)
1124 if (! ieee_slurp_external_symbols (abfd))
1125 return FALSE;
1126 IEEE_DATA (abfd)->read_symbols = TRUE;
1128 return TRUE;
1131 static long
1132 ieee_get_symtab_upper_bound (abfd)
1133 bfd *abfd;
1135 if (! ieee_slurp_symbol_table (abfd))
1136 return -1;
1138 return (abfd->symcount != 0) ?
1139 (abfd->symcount + 1) * (sizeof (ieee_symbol_type *)) : 0;
1142 /* Move from our internal lists to the canon table, and insert in
1143 symbol index order. */
1145 extern const bfd_target ieee_vec;
1147 static long
1148 ieee_canonicalize_symtab (abfd, location)
1149 bfd *abfd;
1150 asymbol **location;
1152 ieee_symbol_type *symp;
1153 static bfd dummy_bfd;
1154 static asymbol empty_symbol =
1156 &dummy_bfd,
1157 " ieee empty",
1158 (symvalue) 0,
1159 BSF_DEBUGGING,
1160 bfd_abs_section_ptr
1161 #ifdef __STDC__
1162 /* K&R compilers can't initialise unions. */
1163 , { 0 }
1164 #endif
1167 if (abfd->symcount)
1169 ieee_data_type *ieee = IEEE_DATA (abfd);
1170 dummy_bfd.xvec = &ieee_vec;
1171 if (! ieee_slurp_symbol_table (abfd))
1172 return -1;
1174 if (! ieee->symbol_table_full)
1176 /* Arrgh - there are gaps in the table, run through and fill them
1177 up with pointers to a null place. */
1178 unsigned int i;
1180 for (i = 0; i < abfd->symcount; i++)
1181 location[i] = &empty_symbol;
1184 ieee->external_symbol_base_offset = -ieee->external_symbol_min_index;
1185 for (symp = IEEE_DATA (abfd)->external_symbols;
1186 symp != (ieee_symbol_type *) NULL;
1187 symp = symp->next)
1188 /* Place into table at correct index locations. */
1189 location[symp->index + ieee->external_symbol_base_offset] = &symp->symbol;
1191 /* The external refs are indexed in a bit. */
1192 ieee->external_reference_base_offset =
1193 -ieee->external_reference_min_index + ieee->external_symbol_count;
1195 for (symp = IEEE_DATA (abfd)->external_reference;
1196 symp != (ieee_symbol_type *) NULL;
1197 symp = symp->next)
1198 location[symp->index + ieee->external_reference_base_offset] =
1199 &symp->symbol;
1202 if (abfd->symcount)
1203 location[abfd->symcount] = (asymbol *) NULL;
1205 return abfd->symcount;
1208 static asection *
1209 get_section_entry (abfd, ieee, index)
1210 bfd *abfd;
1211 ieee_data_type *ieee;
1212 unsigned int index;
1214 if (index >= ieee->section_table_size)
1216 unsigned int c, i;
1217 asection **n;
1218 bfd_size_type amt;
1220 c = ieee->section_table_size;
1221 if (c == 0)
1222 c = 20;
1223 while (c <= index)
1224 c *= 2;
1226 amt = c;
1227 amt *= sizeof (asection *);
1228 n = (asection **) bfd_realloc (ieee->section_table, amt);
1229 if (n == NULL)
1230 return NULL;
1232 for (i = ieee->section_table_size; i < c; i++)
1233 n[i] = NULL;
1235 ieee->section_table = n;
1236 ieee->section_table_size = c;
1239 if (ieee->section_table[index] == (asection *) NULL)
1241 char *tmp = bfd_alloc (abfd, (bfd_size_type) 11);
1242 asection *section;
1244 if (!tmp)
1245 return NULL;
1246 sprintf (tmp, " fsec%4d", index);
1247 section = bfd_make_section (abfd, tmp);
1248 ieee->section_table[index] = section;
1249 section->flags = SEC_NO_FLAGS;
1250 section->target_index = index;
1251 ieee->section_table[index] = section;
1253 return ieee->section_table[index];
1256 static void
1257 ieee_slurp_sections (abfd)
1258 bfd *abfd;
1260 ieee_data_type *ieee = IEEE_DATA (abfd);
1261 file_ptr offset = ieee->w.r.section_part;
1262 char *name;
1264 if (offset != 0)
1266 bfd_byte section_type[3];
1267 ieee_seek (ieee, offset);
1268 while (TRUE)
1270 switch (this_byte (&(ieee->h)))
1272 case ieee_section_type_enum:
1274 asection *section;
1275 unsigned int section_index;
1276 next_byte (&(ieee->h));
1277 section_index = must_parse_int (&(ieee->h));
1279 section = get_section_entry (abfd, ieee, section_index);
1281 section_type[0] = this_byte_and_next (&(ieee->h));
1283 /* Set minimal section attributes. Attributes are
1284 extended later, based on section contents. */
1285 switch (section_type[0])
1287 case 0xC1:
1288 /* Normal attributes for absolute sections. */
1289 section_type[1] = this_byte (&(ieee->h));
1290 section->flags = SEC_ALLOC;
1291 switch (section_type[1])
1293 case 0xD3: /* AS Absolute section attributes. */
1294 next_byte (&(ieee->h));
1295 section_type[2] = this_byte (&(ieee->h));
1296 switch (section_type[2])
1298 case 0xD0:
1299 /* Normal code. */
1300 next_byte (&(ieee->h));
1301 section->flags |= SEC_CODE;
1302 break;
1303 case 0xC4:
1304 /* Normal data. */
1305 next_byte (&(ieee->h));
1306 section->flags |= SEC_DATA;
1307 break;
1308 case 0xD2:
1309 next_byte (&(ieee->h));
1310 /* Normal rom data. */
1311 section->flags |= SEC_ROM | SEC_DATA;
1312 break;
1313 default:
1314 break;
1317 break;
1318 case 0xC3: /* Named relocatable sections (type C). */
1319 section_type[1] = this_byte (&(ieee->h));
1320 section->flags = SEC_ALLOC;
1321 switch (section_type[1])
1323 case 0xD0: /* Normal code (CP). */
1324 next_byte (&(ieee->h));
1325 section->flags |= SEC_CODE;
1326 break;
1327 case 0xC4: /* Normal data (CD). */
1328 next_byte (&(ieee->h));
1329 section->flags |= SEC_DATA;
1330 break;
1331 case 0xD2: /* Normal rom data (CR). */
1332 next_byte (&(ieee->h));
1333 section->flags |= SEC_ROM | SEC_DATA;
1334 break;
1335 default:
1336 break;
1340 /* Read section name, use it if non empty. */
1341 name = read_id (&ieee->h);
1342 if (name[0])
1343 section->name = name;
1345 /* Skip these fields, which we don't care about. */
1347 bfd_vma parent, brother, context;
1348 parse_int (&(ieee->h), &parent);
1349 parse_int (&(ieee->h), &brother);
1350 parse_int (&(ieee->h), &context);
1353 break;
1354 case ieee_section_alignment_enum:
1356 unsigned int section_index;
1357 bfd_vma value;
1358 asection *section;
1359 next_byte (&(ieee->h));
1360 section_index = must_parse_int (&ieee->h);
1361 section = get_section_entry (abfd, ieee, section_index);
1362 if (section_index > ieee->section_count)
1364 ieee->section_count = section_index;
1366 section->alignment_power =
1367 bfd_log2 (must_parse_int (&ieee->h));
1368 (void) parse_int (&(ieee->h), &value);
1370 break;
1371 case ieee_e2_first_byte_enum:
1373 asection *section;
1374 ieee_record_enum_type t;
1376 t = (ieee_record_enum_type) (read_2bytes (&(ieee->h)));
1377 switch (t)
1379 case ieee_section_size_enum:
1380 section = ieee->section_table[must_parse_int (&(ieee->h))];
1381 section->_raw_size = must_parse_int (&(ieee->h));
1382 break;
1383 case ieee_physical_region_size_enum:
1384 section = ieee->section_table[must_parse_int (&(ieee->h))];
1385 section->_raw_size = must_parse_int (&(ieee->h));
1386 break;
1387 case ieee_region_base_address_enum:
1388 section = ieee->section_table[must_parse_int (&(ieee->h))];
1389 section->vma = must_parse_int (&(ieee->h));
1390 section->lma = section->vma;
1391 break;
1392 case ieee_mau_size_enum:
1393 must_parse_int (&(ieee->h));
1394 must_parse_int (&(ieee->h));
1395 break;
1396 case ieee_m_value_enum:
1397 must_parse_int (&(ieee->h));
1398 must_parse_int (&(ieee->h));
1399 break;
1400 case ieee_section_base_address_enum:
1401 section = ieee->section_table[must_parse_int (&(ieee->h))];
1402 section->vma = must_parse_int (&(ieee->h));
1403 section->lma = section->vma;
1404 break;
1405 case ieee_section_offset_enum:
1406 (void) must_parse_int (&(ieee->h));
1407 (void) must_parse_int (&(ieee->h));
1408 break;
1409 default:
1410 return;
1413 break;
1414 default:
1415 return;
1421 /* Make a section for the debugging information, if any. We don't try
1422 to interpret the debugging information; we just point the section
1423 at the area in the file so that program which understand can dig it
1424 out. */
1426 static bfd_boolean
1427 ieee_slurp_debug (abfd)
1428 bfd *abfd;
1430 ieee_data_type *ieee = IEEE_DATA (abfd);
1431 asection *sec;
1432 file_ptr debug_end;
1434 if (ieee->w.r.debug_information_part == 0)
1435 return TRUE;
1437 sec = bfd_make_section (abfd, ".debug");
1438 if (sec == NULL)
1439 return FALSE;
1440 sec->flags |= SEC_DEBUGGING | SEC_HAS_CONTENTS;
1441 sec->filepos = ieee->w.r.debug_information_part;
1443 debug_end = ieee_part_after (ieee, ieee->w.r.debug_information_part);
1444 sec->_raw_size = debug_end - ieee->w.r.debug_information_part;
1446 return TRUE;
1449 /* Archive stuff. */
1451 const bfd_target *
1452 ieee_archive_p (abfd)
1453 bfd *abfd;
1455 char *library;
1456 unsigned int i;
1457 unsigned char buffer[512];
1458 file_ptr buffer_offset = 0;
1459 ieee_ar_data_type *save = abfd->tdata.ieee_ar_data;
1460 ieee_ar_data_type *ieee;
1461 bfd_size_type alc_elts;
1462 ieee_ar_obstack_type *elts = NULL;
1463 bfd_size_type amt = sizeof (ieee_ar_data_type);
1465 abfd->tdata.ieee_ar_data = (ieee_ar_data_type *) bfd_alloc (abfd, amt);
1466 if (!abfd->tdata.ieee_ar_data)
1467 goto error_ret_restore;
1468 ieee = IEEE_AR_DATA (abfd);
1470 /* Ignore the return value here. It doesn't matter if we don't read
1471 the entire buffer. We might have a very small ieee file. */
1472 bfd_bread ((PTR) buffer, (bfd_size_type) sizeof (buffer), abfd);
1474 ieee->h.first_byte = buffer;
1475 ieee->h.input_p = buffer;
1477 ieee->h.abfd = abfd;
1479 if (this_byte (&(ieee->h)) != Module_Beginning)
1480 goto got_wrong_format_error;
1482 next_byte (&(ieee->h));
1483 library = read_id (&(ieee->h));
1484 if (strcmp (library, "LIBRARY") != 0)
1485 goto got_wrong_format_error;
1487 /* Throw away the filename. */
1488 read_id (&(ieee->h));
1490 ieee->element_count = 0;
1491 ieee->element_index = 0;
1493 next_byte (&(ieee->h)); /* Drop the ad part. */
1494 must_parse_int (&(ieee->h)); /* And the two dummy numbers. */
1495 must_parse_int (&(ieee->h));
1497 alc_elts = 10;
1498 elts = (ieee_ar_obstack_type *) bfd_malloc (alc_elts * sizeof *elts);
1499 if (elts == NULL)
1500 goto error_return;
1502 /* Read the index of the BB table. */
1503 while (1)
1505 int rec;
1506 ieee_ar_obstack_type *t;
1508 rec = read_2bytes (&(ieee->h));
1509 if (rec != (int) ieee_assign_value_to_variable_enum)
1510 break;
1512 if (ieee->element_count >= alc_elts)
1514 ieee_ar_obstack_type *n;
1516 alc_elts *= 2;
1517 n = ((ieee_ar_obstack_type *)
1518 bfd_realloc (elts, alc_elts * sizeof *elts));
1519 if (n == NULL)
1520 goto error_return;
1521 elts = n;
1524 t = &elts[ieee->element_count];
1525 ieee->element_count++;
1527 must_parse_int (&(ieee->h));
1528 t->file_offset = must_parse_int (&(ieee->h));
1529 t->abfd = (bfd *) NULL;
1531 /* Make sure that we don't go over the end of the buffer. */
1532 if ((size_t) ieee_pos (IEEE_DATA (abfd)) > sizeof (buffer) / 2)
1534 /* Past half way, reseek and reprime. */
1535 buffer_offset += ieee_pos (IEEE_DATA (abfd));
1536 if (bfd_seek (abfd, buffer_offset, SEEK_SET) != 0)
1537 goto error_return;
1539 /* Again ignore return value of bfd_bread. */
1540 bfd_bread ((PTR) buffer, (bfd_size_type) sizeof (buffer), abfd);
1541 ieee->h.first_byte = buffer;
1542 ieee->h.input_p = buffer;
1546 amt = ieee->element_count;
1547 amt *= sizeof *ieee->elements;
1548 ieee->elements = (ieee_ar_obstack_type *) bfd_alloc (abfd, amt);
1549 if (ieee->elements == NULL)
1550 goto error_return;
1552 memcpy (ieee->elements, elts, (size_t) amt);
1553 free (elts);
1554 elts = NULL;
1556 /* Now scan the area again, and replace BB offsets with file offsets. */
1557 for (i = 2; i < ieee->element_count; i++)
1559 if (bfd_seek (abfd, ieee->elements[i].file_offset, SEEK_SET) != 0)
1560 goto error_return;
1562 /* Again ignore return value of bfd_bread. */
1563 bfd_bread ((PTR) buffer, (bfd_size_type) sizeof (buffer), abfd);
1564 ieee->h.first_byte = buffer;
1565 ieee->h.input_p = buffer;
1567 next_byte (&(ieee->h)); /* Drop F8. */
1568 next_byte (&(ieee->h)); /* Drop 14. */
1569 must_parse_int (&(ieee->h)); /* Drop size of block. */
1571 if (must_parse_int (&(ieee->h)) != 0)
1572 /* This object has been deleted. */
1573 ieee->elements[i].file_offset = 0;
1574 else
1575 ieee->elements[i].file_offset = must_parse_int (&(ieee->h));
1578 /* abfd->has_armap = ;*/
1580 return abfd->xvec;
1582 got_wrong_format_error:
1583 bfd_set_error (bfd_error_wrong_format);
1584 error_return:
1585 if (elts != NULL)
1586 free (elts);
1587 bfd_release (abfd, ieee);
1588 error_ret_restore:
1589 abfd->tdata.ieee_ar_data = save;
1591 return NULL;
1594 const bfd_target *
1595 ieee_object_p (abfd)
1596 bfd *abfd;
1598 char *processor;
1599 unsigned int part;
1600 ieee_data_type *ieee;
1601 unsigned char buffer[300];
1602 ieee_data_type *save = IEEE_DATA (abfd);
1603 bfd_size_type amt;
1605 abfd->tdata.ieee_data = 0;
1606 ieee_mkobject (abfd);
1608 ieee = IEEE_DATA (abfd);
1609 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
1610 goto fail;
1611 /* Read the first few bytes in to see if it makes sense. Ignore
1612 bfd_bread return value; The file might be very small. */
1613 bfd_bread ((PTR) buffer, (bfd_size_type) sizeof (buffer), abfd);
1615 ieee->h.input_p = buffer;
1616 if (this_byte_and_next (&(ieee->h)) != Module_Beginning)
1617 goto got_wrong_format;
1619 ieee->read_symbols = FALSE;
1620 ieee->read_data = FALSE;
1621 ieee->section_count = 0;
1622 ieee->external_symbol_max_index = 0;
1623 ieee->external_symbol_min_index = IEEE_PUBLIC_BASE;
1624 ieee->external_reference_min_index = IEEE_REFERENCE_BASE;
1625 ieee->external_reference_max_index = 0;
1626 ieee->h.abfd = abfd;
1627 ieee->section_table = NULL;
1628 ieee->section_table_size = 0;
1630 processor = ieee->mb.processor = read_id (&(ieee->h));
1631 if (strcmp (processor, "LIBRARY") == 0)
1632 goto got_wrong_format;
1633 ieee->mb.module_name = read_id (&(ieee->h));
1634 if (abfd->filename == (const char *) NULL)
1635 abfd->filename = ieee->mb.module_name;
1637 /* Determine the architecture and machine type of the object file. */
1639 const bfd_arch_info_type *arch;
1640 char family[10];
1642 /* IEEE does not specify the format of the processor identification
1643 string, so the compiler is free to put in it whatever it wants.
1644 We try here to recognize different processors belonging to the
1645 m68k family. Code for other processors can be added here. */
1646 if ((processor[0] == '6') && (processor[1] == '8'))
1648 if (processor[2] == '3') /* 683xx integrated processors */
1650 switch (processor[3])
1652 case '0': /* 68302, 68306, 68307 */
1653 case '2': /* 68322, 68328 */
1654 case '5': /* 68356 */
1655 strcpy (family, "68000"); /* MC68000-based controllers */
1656 break;
1658 case '3': /* 68330, 68331, 68332, 68333,
1659 68334, 68335, 68336, 68338 */
1660 case '6': /* 68360 */
1661 case '7': /* 68376 */
1662 strcpy (family, "68332"); /* CPU32 and CPU32+ */
1663 break;
1665 case '4':
1666 if (processor[4] == '9') /* 68349 */
1667 strcpy (family, "68030"); /* CPU030 */
1668 else /* 68340, 68341 */
1669 strcpy (family, "68332"); /* CPU32 and CPU32+ */
1670 break;
1672 default: /* Does not exist yet */
1673 strcpy (family, "68332"); /* Guess it will be CPU32 */
1676 else if (TOUPPER (processor[3]) == 'F') /* 68F333 */
1677 strcpy (family, "68332"); /* CPU32 */
1678 else if ((TOUPPER (processor[3]) == 'C') /* Embedded controllers. */
1679 && ((TOUPPER (processor[2]) == 'E')
1680 || (TOUPPER (processor[2]) == 'H')
1681 || (TOUPPER (processor[2]) == 'L')))
1683 strcpy (family, "68");
1684 strncat (family, processor + 4, 7);
1685 family[9] = '\0';
1687 else /* "Regular" processors. */
1689 strncpy (family, processor, 9);
1690 family[9] = '\0';
1693 else if ((strncmp (processor, "cpu32", 5) == 0) /* CPU32 and CPU32+ */
1694 || (strncmp (processor, "CPU32", 5) == 0))
1695 strcpy (family, "68332");
1696 else
1698 strncpy (family, processor, 9);
1699 family[9] = '\0';
1702 arch = bfd_scan_arch (family);
1703 if (arch == 0)
1704 goto got_wrong_format;
1705 abfd->arch_info = arch;
1708 if (this_byte (&(ieee->h)) != (int) ieee_address_descriptor_enum)
1709 goto fail;
1711 next_byte (&(ieee->h));
1713 if (! parse_int (&(ieee->h), &ieee->ad.number_of_bits_mau))
1714 goto fail;
1716 if (! parse_int (&(ieee->h), &ieee->ad.number_of_maus_in_address))
1717 goto fail;
1719 /* If there is a byte order info, take it. */
1720 if (this_byte (&(ieee->h)) == (int) ieee_variable_L_enum
1721 || this_byte (&(ieee->h)) == (int) ieee_variable_M_enum)
1722 next_byte (&(ieee->h));
1724 for (part = 0; part < N_W_VARIABLES; part++)
1726 bfd_boolean ok;
1728 if (read_2bytes (&(ieee->h)) != (int) ieee_assign_value_to_variable_enum)
1729 goto fail;
1731 if (this_byte_and_next (&(ieee->h)) != part)
1732 goto fail;
1734 ieee->w.offset[part] = parse_i (&(ieee->h), &ok);
1735 if (! ok)
1736 goto fail;
1739 if (ieee->w.r.external_part != 0)
1740 abfd->flags = HAS_SYMS;
1742 /* By now we know that this is a real IEEE file, we're going to read
1743 the whole thing into memory so that we can run up and down it
1744 quickly. We can work out how big the file is from the trailer
1745 record. */
1747 amt = ieee->w.r.me_record + 1;
1748 IEEE_DATA (abfd)->h.first_byte =
1749 (unsigned char *) bfd_alloc (ieee->h.abfd, amt);
1750 if (!IEEE_DATA (abfd)->h.first_byte)
1751 goto fail;
1752 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
1753 goto fail;
1754 /* FIXME: Check return value. I'm not sure whether it needs to read
1755 the entire buffer or not. */
1756 bfd_bread ((PTR) (IEEE_DATA (abfd)->h.first_byte),
1757 (bfd_size_type) ieee->w.r.me_record + 1, abfd);
1759 ieee_slurp_sections (abfd);
1761 if (! ieee_slurp_debug (abfd))
1762 goto fail;
1764 /* Parse section data to activate file and section flags implied by
1765 section contents. */
1766 if (! ieee_slurp_section_data (abfd))
1767 goto fail;
1769 return abfd->xvec;
1770 got_wrong_format:
1771 bfd_set_error (bfd_error_wrong_format);
1772 fail:
1773 bfd_release (abfd, ieee);
1774 abfd->tdata.ieee_data = save;
1775 return (const bfd_target *) NULL;
1778 static void
1779 ieee_get_symbol_info (ignore_abfd, symbol, ret)
1780 bfd *ignore_abfd ATTRIBUTE_UNUSED;
1781 asymbol *symbol;
1782 symbol_info *ret;
1784 bfd_symbol_info (symbol, ret);
1785 if (symbol->name[0] == ' ')
1786 ret->name = "* empty table entry ";
1787 if (!symbol->section)
1788 ret->type = (symbol->flags & BSF_LOCAL) ? 'a' : 'A';
1791 static void
1792 ieee_print_symbol (abfd, afile, symbol, how)
1793 bfd *abfd;
1794 PTR afile;
1795 asymbol *symbol;
1796 bfd_print_symbol_type how;
1798 FILE *file = (FILE *) afile;
1800 switch (how)
1802 case bfd_print_symbol_name:
1803 fprintf (file, "%s", symbol->name);
1804 break;
1805 case bfd_print_symbol_more:
1806 #if 0
1807 fprintf (file, "%4x %2x", aout_symbol (symbol)->desc & 0xffff,
1808 aout_symbol (symbol)->other & 0xff);
1809 #endif
1810 BFD_FAIL ();
1811 break;
1812 case bfd_print_symbol_all:
1814 const char *section_name =
1815 (symbol->section == (asection *) NULL
1816 ? "*abs"
1817 : symbol->section->name);
1819 if (symbol->name[0] == ' ')
1821 fprintf (file, "* empty table entry ");
1823 else
1825 bfd_print_symbol_vandf (abfd, (PTR) file, symbol);
1827 fprintf (file, " %-5s %04x %02x %s",
1828 section_name,
1829 (unsigned) ieee_symbol (symbol)->index,
1830 (unsigned) 0,
1831 symbol->name);
1834 break;
1838 static bfd_boolean
1839 do_one (ieee, current_map, location_ptr, s, iterations)
1840 ieee_data_type *ieee;
1841 ieee_per_section_type *current_map;
1842 unsigned char *location_ptr;
1843 asection *s;
1844 int iterations;
1846 switch (this_byte (&(ieee->h)))
1848 case ieee_load_constant_bytes_enum:
1850 unsigned int number_of_maus;
1851 unsigned int i;
1853 next_byte (&(ieee->h));
1854 number_of_maus = must_parse_int (&(ieee->h));
1856 for (i = 0; i < number_of_maus; i++)
1858 location_ptr[current_map->pc++] = this_byte (&(ieee->h));
1859 next_byte (&(ieee->h));
1862 break;
1864 case ieee_load_with_relocation_enum:
1866 bfd_boolean loop = TRUE;
1868 next_byte (&(ieee->h));
1869 while (loop)
1871 switch (this_byte (&(ieee->h)))
1873 case ieee_variable_R_enum:
1875 case ieee_function_signed_open_b_enum:
1876 case ieee_function_unsigned_open_b_enum:
1877 case ieee_function_either_open_b_enum:
1879 unsigned int extra = 4;
1880 bfd_boolean pcrel = FALSE;
1881 asection *section;
1882 ieee_reloc_type *r;
1883 bfd_size_type amt = sizeof (ieee_reloc_type);
1885 r = (ieee_reloc_type *) bfd_alloc (ieee->h.abfd, amt);
1886 if (!r)
1887 return FALSE;
1889 *(current_map->reloc_tail_ptr) = r;
1890 current_map->reloc_tail_ptr = &r->next;
1891 r->next = (ieee_reloc_type *) NULL;
1892 next_byte (&(ieee->h));
1893 /* abort();*/
1894 r->relent.sym_ptr_ptr = 0;
1895 parse_expression (ieee,
1896 &r->relent.addend,
1897 &r->symbol,
1898 &pcrel, &extra, &section);
1899 r->relent.address = current_map->pc;
1900 s->flags |= SEC_RELOC;
1901 s->owner->flags |= HAS_RELOC;
1902 s->reloc_count++;
1903 if (r->relent.sym_ptr_ptr == NULL && section != NULL)
1904 r->relent.sym_ptr_ptr = section->symbol_ptr_ptr;
1906 if (this_byte (&(ieee->h)) == (int) ieee_comma)
1908 next_byte (&(ieee->h));
1909 /* Fetch number of bytes to pad. */
1910 extra = must_parse_int (&(ieee->h));
1913 switch (this_byte (&(ieee->h)))
1915 case ieee_function_signed_close_b_enum:
1916 next_byte (&(ieee->h));
1917 break;
1918 case ieee_function_unsigned_close_b_enum:
1919 next_byte (&(ieee->h));
1920 break;
1921 case ieee_function_either_close_b_enum:
1922 next_byte (&(ieee->h));
1923 break;
1924 default:
1925 break;
1927 /* Build a relocation entry for this type. */
1928 /* If pc rel then stick -ve pc into instruction
1929 and take out of reloc ..
1931 I've changed this. It's all too complicated. I
1932 keep 0 in the instruction now. */
1934 switch (extra)
1936 case 0:
1937 case 4:
1939 if (pcrel)
1941 #if KEEPMINUSPCININST
1942 bfd_put_32 (ieee->h.abfd, -current_map->pc,
1943 location_ptr + current_map->pc);
1944 r->relent.howto = &rel32_howto;
1945 r->relent.addend -= current_map->pc;
1946 #else
1947 bfd_put_32 (ieee->h.abfd, (bfd_vma) 0, location_ptr +
1948 current_map->pc);
1949 r->relent.howto = &rel32_howto;
1950 #endif
1952 else
1954 bfd_put_32 (ieee->h.abfd, (bfd_vma) 0,
1955 location_ptr + current_map->pc);
1956 r->relent.howto = &abs32_howto;
1958 current_map->pc += 4;
1959 break;
1960 case 2:
1961 if (pcrel)
1963 #if KEEPMINUSPCININST
1964 bfd_put_16 (ieee->h.abfd, (bfd_vma) -current_map->pc,
1965 location_ptr + current_map->pc);
1966 r->relent.addend -= current_map->pc;
1967 r->relent.howto = &rel16_howto;
1968 #else
1970 bfd_put_16 (ieee->h.abfd, (bfd_vma) 0,
1971 location_ptr + current_map->pc);
1972 r->relent.howto = &rel16_howto;
1973 #endif
1976 else
1978 bfd_put_16 (ieee->h.abfd, (bfd_vma) 0,
1979 location_ptr + current_map->pc);
1980 r->relent.howto = &abs16_howto;
1982 current_map->pc += 2;
1983 break;
1984 case 1:
1985 if (pcrel)
1987 #if KEEPMINUSPCININST
1988 bfd_put_8 (ieee->h.abfd, (int) (-current_map->pc), location_ptr + current_map->pc);
1989 r->relent.addend -= current_map->pc;
1990 r->relent.howto = &rel8_howto;
1991 #else
1992 bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1993 r->relent.howto = &rel8_howto;
1994 #endif
1996 else
1998 bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1999 r->relent.howto = &abs8_howto;
2001 current_map->pc += 1;
2002 break;
2004 default:
2005 BFD_FAIL ();
2006 return FALSE;
2009 break;
2010 default:
2012 bfd_vma this_size;
2013 if (parse_int (&(ieee->h), &this_size))
2015 unsigned int i;
2016 for (i = 0; i < this_size; i++)
2018 location_ptr[current_map->pc++] = this_byte (&(ieee->h));
2019 next_byte (&(ieee->h));
2022 else
2024 loop = FALSE;
2029 /* Prevent more than the first load-item of an LR record
2030 from being repeated (MRI convention). */
2031 if (iterations != 1)
2032 loop = FALSE;
2036 return TRUE;
2039 /* Read in all the section data and relocation stuff too. */
2041 static bfd_boolean
2042 ieee_slurp_section_data (abfd)
2043 bfd *abfd;
2045 bfd_byte *location_ptr = (bfd_byte *) NULL;
2046 ieee_data_type *ieee = IEEE_DATA (abfd);
2047 unsigned int section_number;
2049 ieee_per_section_type *current_map = (ieee_per_section_type *) NULL;
2050 asection *s;
2051 /* Seek to the start of the data area. */
2052 if (ieee->read_data)
2053 return TRUE;
2054 ieee->read_data = TRUE;
2055 ieee_seek (ieee, ieee->w.r.data_part);
2057 /* Allocate enough space for all the section contents. */
2058 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
2060 ieee_per_section_type *per = ieee_per_section (s);
2061 if ((s->flags & SEC_DEBUGGING) != 0)
2062 continue;
2063 per->data = (bfd_byte *) bfd_alloc (ieee->h.abfd, s->_raw_size);
2064 if (!per->data)
2065 return FALSE;
2066 per->reloc_tail_ptr =
2067 (ieee_reloc_type **) & (s->relocation);
2070 while (TRUE)
2072 switch (this_byte (&(ieee->h)))
2074 /* IF we see anything strange then quit. */
2075 default:
2076 return TRUE;
2078 case ieee_set_current_section_enum:
2079 next_byte (&(ieee->h));
2080 section_number = must_parse_int (&(ieee->h));
2081 s = ieee->section_table[section_number];
2082 s->flags |= SEC_LOAD | SEC_HAS_CONTENTS;
2083 current_map = ieee_per_section (s);
2084 location_ptr = current_map->data - s->vma;
2085 /* The document I have says that Microtec's compilers reset
2086 this after a sec section, even though the standard says not
2087 to, SO... */
2088 current_map->pc = s->vma;
2089 break;
2091 case ieee_e2_first_byte_enum:
2092 next_byte (&(ieee->h));
2093 switch (this_byte (&(ieee->h)))
2095 case ieee_set_current_pc_enum & 0xff:
2097 bfd_vma value;
2098 ieee_symbol_index_type symbol;
2099 unsigned int extra;
2100 bfd_boolean pcrel;
2102 next_byte (&(ieee->h));
2103 must_parse_int (&(ieee->h)); /* Throw away section #. */
2104 parse_expression (ieee, &value,
2105 &symbol,
2106 &pcrel, &extra,
2108 current_map->pc = value;
2109 BFD_ASSERT ((unsigned) (value - s->vma) <= s->_raw_size);
2111 break;
2113 case ieee_value_starting_address_enum & 0xff:
2114 next_byte (&(ieee->h));
2115 if (this_byte (&(ieee->h)) == ieee_function_either_open_b_enum)
2116 next_byte (&(ieee->h));
2117 abfd->start_address = must_parse_int (&(ieee->h));
2118 /* We've got to the end of the data now - */
2119 return TRUE;
2120 default:
2121 BFD_FAIL ();
2122 return FALSE;
2124 break;
2125 case ieee_repeat_data_enum:
2127 /* Repeat the following LD or LR n times - we do this by
2128 remembering the stream pointer before running it and
2129 resetting it and running it n times. We special case
2130 the repetition of a repeat_data/load_constant. */
2131 unsigned int iterations;
2132 unsigned char *start;
2134 next_byte (&(ieee->h));
2135 iterations = must_parse_int (&(ieee->h));
2136 start = ieee->h.input_p;
2137 if (start[0] == (int) ieee_load_constant_bytes_enum
2138 && start[1] == 1)
2140 while (iterations != 0)
2142 location_ptr[current_map->pc++] = start[2];
2143 iterations--;
2145 next_byte (&(ieee->h));
2146 next_byte (&(ieee->h));
2147 next_byte (&(ieee->h));
2149 else
2151 while (iterations != 0)
2153 ieee->h.input_p = start;
2154 if (!do_one (ieee, current_map, location_ptr, s,
2155 (int) iterations))
2156 return FALSE;
2157 iterations--;
2161 break;
2162 case ieee_load_constant_bytes_enum:
2163 case ieee_load_with_relocation_enum:
2164 if (!do_one (ieee, current_map, location_ptr, s, 1))
2165 return FALSE;
2170 static bfd_boolean
2171 ieee_new_section_hook (abfd, newsect)
2172 bfd *abfd;
2173 asection *newsect;
2175 newsect->used_by_bfd
2176 = (PTR) bfd_alloc (abfd, (bfd_size_type) sizeof (ieee_per_section_type));
2177 if (!newsect->used_by_bfd)
2178 return FALSE;
2179 ieee_per_section (newsect)->data = (bfd_byte *) NULL;
2180 ieee_per_section (newsect)->section = newsect;
2181 return TRUE;
2184 static long
2185 ieee_get_reloc_upper_bound (abfd, asect)
2186 bfd *abfd;
2187 sec_ptr asect;
2189 if ((asect->flags & SEC_DEBUGGING) != 0)
2190 return 0;
2191 if (! ieee_slurp_section_data (abfd))
2192 return -1;
2193 return (asect->reloc_count + 1) * sizeof (arelent *);
2196 static bfd_boolean
2197 ieee_get_section_contents (abfd, section, location, offset, count)
2198 bfd *abfd;
2199 sec_ptr section;
2200 PTR location;
2201 file_ptr offset;
2202 bfd_size_type count;
2204 ieee_per_section_type *p = ieee_per_section (section);
2205 if ((section->flags & SEC_DEBUGGING) != 0)
2206 return _bfd_generic_get_section_contents (abfd, section, location,
2207 offset, count);
2208 ieee_slurp_section_data (abfd);
2209 (void) memcpy ((PTR) location, (PTR) (p->data + offset), (unsigned) count);
2210 return TRUE;
2213 static long
2214 ieee_canonicalize_reloc (abfd, section, relptr, symbols)
2215 bfd *abfd;
2216 sec_ptr section;
2217 arelent **relptr;
2218 asymbol **symbols;
2220 ieee_reloc_type *src = (ieee_reloc_type *) (section->relocation);
2221 ieee_data_type *ieee = IEEE_DATA (abfd);
2223 if ((section->flags & SEC_DEBUGGING) != 0)
2224 return 0;
2226 while (src != (ieee_reloc_type *) NULL)
2228 /* Work out which symbol to attach it this reloc to. */
2229 switch (src->symbol.letter)
2231 case 'I':
2232 src->relent.sym_ptr_ptr =
2233 symbols + src->symbol.index + ieee->external_symbol_base_offset;
2234 break;
2235 case 'X':
2236 src->relent.sym_ptr_ptr =
2237 symbols + src->symbol.index + ieee->external_reference_base_offset;
2238 break;
2239 case 0:
2240 if (src->relent.sym_ptr_ptr != NULL)
2241 src->relent.sym_ptr_ptr =
2242 src->relent.sym_ptr_ptr[0]->section->symbol_ptr_ptr;
2243 break;
2244 default:
2246 BFD_FAIL ();
2248 *relptr++ = &src->relent;
2249 src = src->next;
2251 *relptr = (arelent *) NULL;
2252 return section->reloc_count;
2255 static int
2256 comp (ap, bp)
2257 const PTR ap;
2258 const PTR bp;
2260 arelent *a = *((arelent **) ap);
2261 arelent *b = *((arelent **) bp);
2262 return a->address - b->address;
2265 /* Write the section headers. */
2267 static bfd_boolean
2268 ieee_write_section_part (abfd)
2269 bfd *abfd;
2271 ieee_data_type *ieee = IEEE_DATA (abfd);
2272 asection *s;
2273 ieee->w.r.section_part = bfd_tell (abfd);
2274 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
2276 if (! bfd_is_abs_section (s)
2277 && (s->flags & SEC_DEBUGGING) == 0)
2279 if (! ieee_write_byte (abfd, ieee_section_type_enum)
2280 || ! ieee_write_byte (abfd,
2281 (bfd_byte) (s->index
2282 + IEEE_SECTION_NUMBER_BASE)))
2283 return FALSE;
2285 if (abfd->flags & EXEC_P)
2287 /* This image is executable, so output absolute sections. */
2288 if (! ieee_write_byte (abfd, ieee_variable_A_enum)
2289 || ! ieee_write_byte (abfd, ieee_variable_S_enum))
2290 return FALSE;
2292 else
2294 if (! ieee_write_byte (abfd, ieee_variable_C_enum))
2295 return FALSE;
2298 switch (s->flags & (SEC_CODE | SEC_DATA | SEC_ROM))
2300 case SEC_CODE | SEC_LOAD:
2301 case SEC_CODE:
2302 if (! ieee_write_byte (abfd, ieee_variable_P_enum))
2303 return FALSE;
2304 break;
2305 case SEC_DATA:
2306 default:
2307 if (! ieee_write_byte (abfd, ieee_variable_D_enum))
2308 return FALSE;
2309 break;
2310 case SEC_ROM:
2311 case SEC_ROM | SEC_DATA:
2312 case SEC_ROM | SEC_LOAD:
2313 case SEC_ROM | SEC_DATA | SEC_LOAD:
2314 if (! ieee_write_byte (abfd, ieee_variable_R_enum))
2315 return FALSE;
2319 if (! ieee_write_id (abfd, s->name))
2320 return FALSE;
2321 #if 0
2322 ieee_write_int (abfd, 0); /* Parent */
2323 ieee_write_int (abfd, 0); /* Brother */
2324 ieee_write_int (abfd, 0); /* Context */
2325 #endif
2326 /* Alignment. */
2327 if (! ieee_write_byte (abfd, ieee_section_alignment_enum)
2328 || ! ieee_write_byte (abfd,
2329 (bfd_byte) (s->index
2330 + IEEE_SECTION_NUMBER_BASE))
2331 || ! ieee_write_int (abfd, (bfd_vma) 1 << s->alignment_power))
2332 return FALSE;
2334 /* Size. */
2335 if (! ieee_write_2bytes (abfd, ieee_section_size_enum)
2336 || ! ieee_write_byte (abfd,
2337 (bfd_byte) (s->index
2338 + IEEE_SECTION_NUMBER_BASE))
2339 || ! ieee_write_int (abfd, s->_raw_size))
2340 return FALSE;
2341 if (abfd->flags & EXEC_P)
2343 /* Relocateable sections don't have asl records. */
2344 /* Vma. */
2345 if (! ieee_write_2bytes (abfd, ieee_section_base_address_enum)
2346 || ! ieee_write_byte (abfd,
2347 ((bfd_byte)
2348 (s->index
2349 + IEEE_SECTION_NUMBER_BASE)))
2350 || ! ieee_write_int (abfd, s->lma))
2351 return FALSE;
2356 return TRUE;
2360 static bfd_boolean
2361 do_with_relocs (abfd, s)
2362 bfd *abfd;
2363 asection *s;
2365 unsigned int number_of_maus_in_address =
2366 bfd_arch_bits_per_address (abfd) / bfd_arch_bits_per_byte (abfd);
2367 unsigned int relocs_to_go = s->reloc_count;
2368 bfd_byte *stream = ieee_per_section (s)->data;
2369 arelent **p = s->orelocation;
2370 bfd_size_type current_byte_index = 0;
2372 qsort (s->orelocation,
2373 relocs_to_go,
2374 sizeof (arelent **),
2375 comp);
2377 /* Output the section preheader. */
2378 if (! ieee_write_byte (abfd, ieee_set_current_section_enum)
2379 || ! ieee_write_byte (abfd,
2380 (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE))
2381 || ! ieee_write_2bytes (abfd, ieee_set_current_pc_enum)
2382 || ! ieee_write_byte (abfd,
2383 (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE)))
2384 return FALSE;
2386 if ((abfd->flags & EXEC_P) != 0 && relocs_to_go == 0)
2388 if (! ieee_write_int (abfd, s->lma))
2389 return FALSE;
2391 else
2393 if (! ieee_write_expression (abfd, (bfd_vma) 0, s->symbol, 0, 0))
2394 return FALSE;
2397 if (relocs_to_go == 0)
2399 /* If there aren't any relocations then output the load constant
2400 byte opcode rather than the load with relocation opcode. */
2401 while (current_byte_index < s->_raw_size)
2403 bfd_size_type run;
2404 unsigned int MAXRUN = 127;
2406 run = MAXRUN;
2407 if (run > s->_raw_size - current_byte_index)
2408 run = s->_raw_size - current_byte_index;
2410 if (run != 0)
2412 if (! ieee_write_byte (abfd, ieee_load_constant_bytes_enum))
2413 return FALSE;
2414 /* Output a stream of bytes. */
2415 if (! ieee_write_int (abfd, run))
2416 return FALSE;
2417 if (bfd_bwrite ((PTR) (stream + current_byte_index), run, abfd)
2418 != run)
2419 return FALSE;
2420 current_byte_index += run;
2424 else
2426 if (! ieee_write_byte (abfd, ieee_load_with_relocation_enum))
2427 return FALSE;
2429 /* Output the data stream as the longest sequence of bytes
2430 possible, allowing for the a reasonable packet size and
2431 relocation stuffs. */
2433 if ((PTR) stream == (PTR) NULL)
2435 /* Outputting a section without data, fill it up. */
2436 stream = (unsigned char *) bfd_zalloc (abfd, s->_raw_size);
2437 if (!stream)
2438 return FALSE;
2440 while (current_byte_index < s->_raw_size)
2442 bfd_size_type run;
2443 unsigned int MAXRUN = 127;
2445 if (relocs_to_go)
2447 run = (*p)->address - current_byte_index;
2448 if (run > MAXRUN)
2449 run = MAXRUN;
2451 else
2452 run = MAXRUN;
2454 if (run > s->_raw_size - current_byte_index)
2455 run = s->_raw_size - current_byte_index;
2457 if (run != 0)
2459 /* Output a stream of bytes. */
2460 if (! ieee_write_int (abfd, run))
2461 return FALSE;
2462 if (bfd_bwrite ((PTR) (stream + current_byte_index), run, abfd)
2463 != run)
2464 return FALSE;
2465 current_byte_index += run;
2468 /* Output any relocations here. */
2469 if (relocs_to_go && (*p) && (*p)->address == current_byte_index)
2471 while (relocs_to_go
2472 && (*p) && (*p)->address == current_byte_index)
2474 arelent *r = *p;
2475 bfd_signed_vma ov;
2476 #if 0
2477 if (r->howto->pc_relative)
2478 r->addend += current_byte_index;
2479 #endif
2480 switch (r->howto->size)
2482 case 2:
2484 ov = bfd_get_signed_32 (abfd,
2485 stream + current_byte_index);
2486 current_byte_index += 4;
2487 break;
2488 case 1:
2489 ov = bfd_get_signed_16 (abfd,
2490 stream + current_byte_index);
2491 current_byte_index += 2;
2492 break;
2493 case 0:
2494 ov = bfd_get_signed_8 (abfd,
2495 stream + current_byte_index);
2496 current_byte_index++;
2497 break;
2498 default:
2499 ov = 0;
2500 BFD_FAIL ();
2501 return FALSE;
2504 ov &= r->howto->src_mask;
2506 if (r->howto->pc_relative
2507 && ! r->howto->pcrel_offset)
2508 ov += r->address;
2510 if (! ieee_write_byte (abfd,
2511 ieee_function_either_open_b_enum))
2512 return FALSE;
2514 /* abort();*/
2516 if (r->sym_ptr_ptr != (asymbol **) NULL)
2518 if (! ieee_write_expression (abfd, r->addend + ov,
2519 *(r->sym_ptr_ptr),
2520 r->howto->pc_relative,
2521 (unsigned) s->index))
2522 return FALSE;
2524 else
2526 if (! ieee_write_expression (abfd, r->addend + ov,
2527 (asymbol *) NULL,
2528 r->howto->pc_relative,
2529 (unsigned) s->index))
2530 return FALSE;
2533 if (number_of_maus_in_address
2534 != bfd_get_reloc_size (r->howto))
2536 bfd_vma rsize = bfd_get_reloc_size (r->howto);
2537 if (! ieee_write_int (abfd, rsize))
2538 return FALSE;
2540 if (! ieee_write_byte (abfd,
2541 ieee_function_either_close_b_enum))
2542 return FALSE;
2544 relocs_to_go--;
2545 p++;
2552 return TRUE;
2555 /* If there are no relocations in the output section then we can be
2556 clever about how we write. We block items up into a max of 127
2557 bytes. */
2559 static bfd_boolean
2560 do_as_repeat (abfd, s)
2561 bfd *abfd;
2562 asection *s;
2564 if (s->_raw_size)
2566 if (! ieee_write_byte (abfd, ieee_set_current_section_enum)
2567 || ! ieee_write_byte (abfd,
2568 (bfd_byte) (s->index
2569 + IEEE_SECTION_NUMBER_BASE))
2570 || ! ieee_write_byte (abfd, ieee_set_current_pc_enum >> 8)
2571 || ! ieee_write_byte (abfd, ieee_set_current_pc_enum & 0xff)
2572 || ! ieee_write_byte (abfd,
2573 (bfd_byte) (s->index
2574 + IEEE_SECTION_NUMBER_BASE)))
2575 return FALSE;
2577 if ((abfd->flags & EXEC_P) != 0)
2579 if (! ieee_write_int (abfd, s->lma))
2580 return FALSE;
2582 else
2584 if (! ieee_write_expression (abfd, (bfd_vma) 0, s->symbol, 0, 0))
2585 return FALSE;
2588 if (! ieee_write_byte (abfd, ieee_repeat_data_enum)
2589 || ! ieee_write_int (abfd, s->_raw_size)
2590 || ! ieee_write_byte (abfd, ieee_load_constant_bytes_enum)
2591 || ! ieee_write_byte (abfd, 1)
2592 || ! ieee_write_byte (abfd, 0))
2593 return FALSE;
2596 return TRUE;
2599 static bfd_boolean
2600 do_without_relocs (abfd, s)
2601 bfd *abfd;
2602 asection *s;
2604 bfd_byte *stream = ieee_per_section (s)->data;
2606 if (stream == 0 || ((s->flags & SEC_LOAD) == 0))
2608 if (! do_as_repeat (abfd, s))
2609 return FALSE;
2611 else
2613 unsigned int i;
2615 for (i = 0; i < s->_raw_size; i++)
2617 if (stream[i] != 0)
2619 if (! do_with_relocs (abfd, s))
2620 return FALSE;
2621 return TRUE;
2624 if (! do_as_repeat (abfd, s))
2625 return FALSE;
2628 return TRUE;
2632 static unsigned char *output_ptr_start;
2633 static unsigned char *output_ptr;
2634 static unsigned char *output_ptr_end;
2635 static unsigned char *input_ptr_start;
2636 static unsigned char *input_ptr;
2637 static unsigned char *input_ptr_end;
2638 static bfd *input_bfd;
2639 static bfd *output_bfd;
2640 static int output_buffer;
2642 static bfd_boolean
2643 ieee_mkobject (abfd)
2644 bfd *abfd;
2646 bfd_size_type amt;
2648 output_ptr_start = NULL;
2649 output_ptr = NULL;
2650 output_ptr_end = NULL;
2651 input_ptr_start = NULL;
2652 input_ptr = NULL;
2653 input_ptr_end = NULL;
2654 input_bfd = NULL;
2655 output_bfd = NULL;
2656 output_buffer = 0;
2657 amt = sizeof (ieee_data_type);
2658 abfd->tdata.ieee_data = (ieee_data_type *) bfd_zalloc (abfd, amt);
2659 return abfd->tdata.ieee_data != NULL;
2662 static void
2663 fill ()
2665 bfd_size_type amt = input_ptr_end - input_ptr_start;
2666 /* FIXME: Check return value. I'm not sure whether it needs to read
2667 the entire buffer or not. */
2668 bfd_bread ((PTR) input_ptr_start, amt, input_bfd);
2669 input_ptr = input_ptr_start;
2672 static void
2673 flush ()
2675 bfd_size_type amt = output_ptr - output_ptr_start;
2677 if (bfd_bwrite ((PTR) (output_ptr_start), amt, output_bfd) != amt)
2678 abort ();
2679 output_ptr = output_ptr_start;
2680 output_buffer++;
2683 #define THIS() ( *input_ptr )
2684 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill(); }
2685 #define OUT(x) { *output_ptr++ = (x); if(output_ptr == output_ptr_end) flush(); }
2687 static void
2688 write_int (value)
2689 int value;
2691 if (value >= 0 && value <= 127)
2693 OUT (value);
2695 else
2697 unsigned int length;
2698 /* How many significant bytes ? */
2699 /* FIXME FOR LONGER INTS. */
2700 if (value & 0xff000000)
2701 length = 4;
2702 else if (value & 0x00ff0000)
2703 length = 3;
2704 else if (value & 0x0000ff00)
2705 length = 2;
2706 else
2707 length = 1;
2709 OUT ((int) ieee_number_repeat_start_enum + length);
2710 switch (length)
2712 case 4:
2713 OUT (value >> 24);
2714 case 3:
2715 OUT (value >> 16);
2716 case 2:
2717 OUT (value >> 8);
2718 case 1:
2719 OUT (value);
2724 static void
2725 copy_id ()
2727 int length = THIS ();
2728 char ch;
2730 OUT (length);
2731 NEXT ();
2732 while (length--)
2734 ch = THIS ();
2735 OUT (ch);
2736 NEXT ();
2740 #define VAR(x) ((x | 0x80))
2741 static void
2742 copy_expression ()
2744 int stack[10];
2745 int *tos = stack;
2746 int value;
2748 while (1)
2750 switch (THIS ())
2752 case 0x84:
2753 NEXT ();
2754 value = THIS ();
2755 NEXT ();
2756 value = (value << 8) | THIS ();
2757 NEXT ();
2758 value = (value << 8) | THIS ();
2759 NEXT ();
2760 value = (value << 8) | THIS ();
2761 NEXT ();
2762 *tos++ = value;
2763 break;
2764 case 0x83:
2765 NEXT ();
2766 value = THIS ();
2767 NEXT ();
2768 value = (value << 8) | THIS ();
2769 NEXT ();
2770 value = (value << 8) | THIS ();
2771 NEXT ();
2772 *tos++ = value;
2773 break;
2774 case 0x82:
2775 NEXT ();
2776 value = THIS ();
2777 NEXT ();
2778 value = (value << 8) | THIS ();
2779 NEXT ();
2780 *tos++ = value;
2781 break;
2782 case 0x81:
2783 NEXT ();
2784 value = THIS ();
2785 NEXT ();
2786 *tos++ = value;
2787 break;
2788 case 0x80:
2789 NEXT ();
2790 *tos++ = 0;
2791 break;
2792 default:
2793 if (THIS () > 0x84)
2795 /* Not a number, just bug out with the answer. */
2796 write_int (*(--tos));
2797 return;
2799 *tos++ = THIS ();
2800 NEXT ();
2801 break;
2802 case 0xa5:
2803 /* PLUS anything. */
2804 value = *(--tos);
2805 value += *(--tos);
2806 *tos++ = value;
2807 NEXT ();
2808 break;
2809 case VAR ('R'):
2811 int section_number;
2812 ieee_data_type *ieee;
2813 asection *s;
2815 NEXT ();
2816 section_number = THIS ();
2818 NEXT ();
2819 ieee = IEEE_DATA (input_bfd);
2820 s = ieee->section_table[section_number];
2821 value = 0;
2822 if (s->output_section)
2823 value = s->output_section->lma;
2824 value += s->output_offset;
2825 *tos++ = value;
2827 break;
2828 case 0x90:
2830 NEXT ();
2831 write_int (*(--tos));
2832 OUT (0x90);
2833 return;
2839 /* Drop the int in the buffer, and copy a null into the gap, which we
2840 will overwrite later */
2842 static void
2843 fill_int (buf)
2844 struct output_buffer_struct *buf;
2846 if (buf->buffer == output_buffer)
2848 /* Still a chance to output the size. */
2849 int value = output_ptr - buf->ptrp + 3;
2850 buf->ptrp[0] = value >> 24;
2851 buf->ptrp[1] = value >> 16;
2852 buf->ptrp[2] = value >> 8;
2853 buf->ptrp[3] = value >> 0;
2857 static void
2858 drop_int (buf)
2859 struct output_buffer_struct *buf;
2861 int type = THIS ();
2862 int ch;
2864 if (type <= 0x84)
2866 NEXT ();
2867 switch (type)
2869 case 0x84:
2870 ch = THIS ();
2871 NEXT ();
2872 case 0x83:
2873 ch = THIS ();
2874 NEXT ();
2875 case 0x82:
2876 ch = THIS ();
2877 NEXT ();
2878 case 0x81:
2879 ch = THIS ();
2880 NEXT ();
2881 case 0x80:
2882 break;
2885 OUT (0x84);
2886 buf->ptrp = output_ptr;
2887 buf->buffer = output_buffer;
2888 OUT (0);
2889 OUT (0);
2890 OUT (0);
2891 OUT (0);
2894 static void
2895 copy_int ()
2897 int type = THIS ();
2898 int ch;
2899 if (type <= 0x84)
2901 OUT (type);
2902 NEXT ();
2903 switch (type)
2905 case 0x84:
2906 ch = THIS ();
2907 NEXT ();
2908 OUT (ch);
2909 case 0x83:
2910 ch = THIS ();
2911 NEXT ();
2912 OUT (ch);
2913 case 0x82:
2914 ch = THIS ();
2915 NEXT ();
2916 OUT (ch);
2917 case 0x81:
2918 ch = THIS ();
2919 NEXT ();
2920 OUT (ch);
2921 case 0x80:
2922 break;
2927 #define ID copy_id()
2928 #define INT copy_int()
2929 #define EXP copy_expression()
2930 #define INTn(q) copy_int()
2931 #define EXPn(q) copy_expression()
2933 static void
2934 f1_record ()
2936 int ch;
2938 /* ATN record. */
2939 NEXT ();
2940 ch = THIS ();
2941 switch (ch)
2943 default:
2944 OUT (0xf1);
2945 OUT (ch);
2946 break;
2947 case 0xc9:
2948 NEXT ();
2949 OUT (0xf1);
2950 OUT (0xc9);
2951 INT;
2952 INT;
2953 ch = THIS ();
2954 switch (ch)
2956 case 0x16:
2957 NEXT ();
2958 break;
2959 case 0x01:
2960 NEXT ();
2961 break;
2962 case 0x00:
2963 NEXT ();
2964 INT;
2965 break;
2966 case 0x03:
2967 NEXT ();
2968 INT;
2969 break;
2970 case 0x13:
2971 EXPn (instruction address);
2972 break;
2973 default:
2974 break;
2976 break;
2977 case 0xd8:
2978 /* EXternal ref. */
2979 NEXT ();
2980 OUT (0xf1);
2981 OUT (0xd8);
2982 EXP;
2983 EXP;
2984 EXP;
2985 EXP;
2986 break;
2987 case 0xce:
2988 NEXT ();
2989 OUT (0xf1);
2990 OUT (0xce);
2991 INT;
2992 INT;
2993 ch = THIS ();
2994 INT;
2995 switch (ch)
2997 case 0x01:
2998 INT;
2999 INT;
3000 break;
3001 case 0x02:
3002 INT;
3003 break;
3004 case 0x04:
3005 EXPn (external function);
3006 break;
3007 case 0x05:
3008 break;
3009 case 0x07:
3010 INTn (line number);
3011 INT;
3012 case 0x08:
3013 break;
3014 case 0x0a:
3015 INTn (locked register);
3016 INT;
3017 break;
3018 case 0x3f:
3019 copy_till_end ();
3020 break;
3021 case 0x3e:
3022 copy_till_end ();
3023 break;
3024 case 0x40:
3025 copy_till_end ();
3026 break;
3027 case 0x41:
3029 break;
3034 static void
3035 f0_record ()
3037 /* Attribute record. */
3038 NEXT ();
3039 OUT (0xf0);
3040 INTn (Symbol name);
3044 static void
3045 copy_till_end ()
3047 int ch = THIS ();
3049 while (1)
3051 while (ch <= 0x80)
3053 OUT (ch);
3054 NEXT ();
3055 ch = THIS ();
3057 switch (ch)
3059 case 0x84:
3060 OUT (THIS ());
3061 NEXT ();
3062 case 0x83:
3063 OUT (THIS ());
3064 NEXT ();
3065 case 0x82:
3066 OUT (THIS ());
3067 NEXT ();
3068 case 0x81:
3069 OUT (THIS ());
3070 NEXT ();
3071 OUT (THIS ());
3072 NEXT ();
3074 ch = THIS ();
3075 break;
3076 default:
3077 return;
3083 static void
3084 f2_record ()
3086 NEXT ();
3087 OUT (0xf2);
3088 INT;
3089 NEXT ();
3090 OUT (0xce);
3091 INT;
3092 copy_till_end ();
3096 static void
3097 f8_record ()
3099 int ch;
3100 NEXT ();
3101 ch = THIS ();
3102 switch (ch)
3104 case 0x01:
3105 case 0x02:
3106 case 0x03:
3107 /* Unique typedefs for module. */
3108 /* GLobal typedefs. */
3109 /* High level module scope beginning. */
3111 struct output_buffer_struct ob;
3113 NEXT ();
3114 OUT (0xf8);
3115 OUT (ch);
3116 drop_int (&ob);
3119 block ();
3121 NEXT ();
3122 fill_int (&ob);
3123 OUT (0xf9);
3125 break;
3126 case 0x04:
3127 /* Global function. */
3129 struct output_buffer_struct ob;
3131 NEXT ();
3132 OUT (0xf8);
3133 OUT (0x04);
3134 drop_int (&ob);
3136 INTn (stack size);
3137 INTn (ret val);
3138 EXPn (offset);
3140 block ();
3142 NEXT ();
3143 OUT (0xf9);
3144 EXPn (size of block);
3145 fill_int (&ob);
3147 break;
3149 case 0x05:
3150 /* File name for source line numbers. */
3152 struct output_buffer_struct ob;
3154 NEXT ();
3155 OUT (0xf8);
3156 OUT (0x05);
3157 drop_int (&ob);
3159 INTn (year);
3160 INTn (month);
3161 INTn (day);
3162 INTn (hour);
3163 INTn (monute);
3164 INTn (second);
3165 block ();
3166 NEXT ();
3167 OUT (0xf9);
3168 fill_int (&ob);
3170 break;
3172 case 0x06:
3173 /* Local function. */
3175 struct output_buffer_struct ob;
3177 NEXT ();
3178 OUT (0xf8);
3179 OUT (0x06);
3180 drop_int (&ob);
3182 INTn (stack size);
3183 INTn (type return);
3184 EXPn (offset);
3185 block ();
3186 NEXT ();
3187 OUT (0xf9);
3188 EXPn (size);
3189 fill_int (&ob);
3191 break;
3193 case 0x0a:
3194 /* Assembler module scope beginning - */
3196 struct output_buffer_struct ob;
3198 NEXT ();
3199 OUT (0xf8);
3200 OUT (0x0a);
3201 drop_int (&ob);
3204 INT;
3206 INT;
3207 INT;
3208 INT;
3209 INT;
3210 INT;
3211 INT;
3213 block ();
3215 NEXT ();
3216 OUT (0xf9);
3217 fill_int (&ob);
3219 break;
3220 case 0x0b:
3222 struct output_buffer_struct ob;
3224 NEXT ();
3225 OUT (0xf8);
3226 OUT (0x0b);
3227 drop_int (&ob);
3229 INT;
3230 INTn (section index);
3231 EXPn (offset);
3232 INTn (stuff);
3234 block ();
3236 OUT (0xf9);
3237 NEXT ();
3238 EXPn (Size in Maus);
3239 fill_int (&ob);
3241 break;
3245 static void
3246 e2_record ()
3248 OUT (0xe2);
3249 NEXT ();
3250 OUT (0xce);
3251 NEXT ();
3252 INT;
3253 EXP;
3256 static void
3257 block ()
3259 int ch;
3261 while (1)
3263 ch = THIS ();
3264 switch (ch)
3266 case 0xe1:
3267 case 0xe5:
3268 return;
3269 case 0xf9:
3270 return;
3271 case 0xf0:
3272 f0_record ();
3273 break;
3274 case 0xf1:
3275 f1_record ();
3276 break;
3277 case 0xf2:
3278 f2_record ();
3279 break;
3280 case 0xf8:
3281 f8_record ();
3282 break;
3283 case 0xe2:
3284 e2_record ();
3285 break;
3292 /* Moves all the debug information from the source bfd to the output
3293 bfd, and relocates any expressions it finds. */
3295 static void
3296 relocate_debug (output, input)
3297 bfd *output ATTRIBUTE_UNUSED;
3298 bfd *input;
3300 #define IBS 400
3301 #define OBS 400
3302 unsigned char input_buffer[IBS];
3304 input_ptr_start = input_ptr = input_buffer;
3305 input_ptr_end = input_buffer + IBS;
3306 input_bfd = input;
3307 /* FIXME: Check return value. I'm not sure whether it needs to read
3308 the entire buffer or not. */
3309 bfd_bread ((PTR) input_ptr_start, (bfd_size_type) IBS, input);
3310 block ();
3313 /* Gather together all the debug information from each input BFD into
3314 one place, relocating it and emitting it as we go. */
3316 static bfd_boolean
3317 ieee_write_debug_part (abfd)
3318 bfd *abfd;
3320 ieee_data_type *ieee = IEEE_DATA (abfd);
3321 bfd_chain_type *chain = ieee->chain_root;
3322 unsigned char obuff[OBS];
3323 bfd_boolean some_debug = FALSE;
3324 file_ptr here = bfd_tell (abfd);
3326 output_ptr_start = output_ptr = obuff;
3327 output_ptr_end = obuff + OBS;
3328 output_ptr = obuff;
3329 output_bfd = abfd;
3331 if (chain == (bfd_chain_type *) NULL)
3333 asection *s;
3335 for (s = abfd->sections; s != NULL; s = s->next)
3336 if ((s->flags & SEC_DEBUGGING) != 0)
3337 break;
3338 if (s == NULL)
3340 ieee->w.r.debug_information_part = 0;
3341 return TRUE;
3344 ieee->w.r.debug_information_part = here;
3345 if (bfd_bwrite (s->contents, s->_raw_size, abfd) != s->_raw_size)
3346 return FALSE;
3348 else
3350 while (chain != (bfd_chain_type *) NULL)
3352 bfd *entry = chain->this;
3353 ieee_data_type *entry_ieee = IEEE_DATA (entry);
3355 if (entry_ieee->w.r.debug_information_part)
3357 if (bfd_seek (entry, entry_ieee->w.r.debug_information_part,
3358 SEEK_SET) != 0)
3359 return FALSE;
3360 relocate_debug (abfd, entry);
3363 chain = chain->next;
3366 if (some_debug)
3367 ieee->w.r.debug_information_part = here;
3368 else
3369 ieee->w.r.debug_information_part = 0;
3371 flush ();
3374 return TRUE;
3377 /* Write the data in an ieee way. */
3379 static bfd_boolean
3380 ieee_write_data_part (abfd)
3381 bfd *abfd;
3383 asection *s;
3385 ieee_data_type *ieee = IEEE_DATA (abfd);
3386 ieee->w.r.data_part = bfd_tell (abfd);
3388 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
3390 /* Skip sections that have no loadable contents (.bss,
3391 debugging, etc.) */
3392 if ((s->flags & SEC_LOAD) == 0)
3393 continue;
3395 /* Sort the reloc records so we can insert them in the correct
3396 places */
3397 if (s->reloc_count != 0)
3399 if (! do_with_relocs (abfd, s))
3400 return FALSE;
3402 else
3404 if (! do_without_relocs (abfd, s))
3405 return FALSE;
3409 return TRUE;
3413 static bfd_boolean
3414 init_for_output (abfd)
3415 bfd *abfd;
3417 asection *s;
3419 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
3421 if ((s->flags & SEC_DEBUGGING) != 0)
3422 continue;
3423 if (s->_raw_size != 0)
3425 bfd_size_type size = s->_raw_size;
3426 ieee_per_section (s)->data = (bfd_byte *) (bfd_alloc (abfd, size));
3427 if (!ieee_per_section (s)->data)
3428 return FALSE;
3431 return TRUE;
3434 /* Exec and core file sections. */
3436 /* Set section contents is complicated with IEEE since the format is
3437 not a byte image, but a record stream. */
3439 static bfd_boolean
3440 ieee_set_section_contents (abfd, section, location, offset, count)
3441 bfd *abfd;
3442 sec_ptr section;
3443 const PTR location;
3444 file_ptr offset;
3445 bfd_size_type count;
3447 if ((section->flags & SEC_DEBUGGING) != 0)
3449 if (section->contents == NULL)
3451 bfd_size_type size = section->_raw_size;
3452 section->contents = (unsigned char *) bfd_alloc (abfd, size);
3453 if (section->contents == NULL)
3454 return FALSE;
3456 /* bfd_set_section_contents has already checked that everything
3457 is within range. */
3458 memcpy (section->contents + offset, location, (size_t) count);
3459 return TRUE;
3462 if (ieee_per_section (section)->data == (bfd_byte *) NULL)
3464 if (!init_for_output (abfd))
3465 return FALSE;
3467 memcpy ((PTR) (ieee_per_section (section)->data + offset),
3468 (PTR) location,
3469 (unsigned int) count);
3470 return TRUE;
3473 /* Write the external symbols of a file. IEEE considers two sorts of
3474 external symbols, public, and referenced. It uses to internal
3475 forms to index them as well. When we write them out we turn their
3476 symbol values into indexes from the right base. */
3478 static bfd_boolean
3479 ieee_write_external_part (abfd)
3480 bfd *abfd;
3482 asymbol **q;
3483 ieee_data_type *ieee = IEEE_DATA (abfd);
3484 unsigned int reference_index = IEEE_REFERENCE_BASE;
3485 unsigned int public_index = IEEE_PUBLIC_BASE + 2;
3486 file_ptr here = bfd_tell (abfd);
3487 bfd_boolean hadone = FALSE;
3489 if (abfd->outsymbols != (asymbol **) NULL)
3492 for (q = abfd->outsymbols; *q != (asymbol *) NULL; q++)
3494 asymbol *p = *q;
3496 if (bfd_is_und_section (p->section))
3498 /* This must be a symbol reference. */
3499 if (! ieee_write_byte (abfd, ieee_external_reference_enum)
3500 || ! ieee_write_int (abfd, (bfd_vma) reference_index)
3501 || ! ieee_write_id (abfd, p->name))
3502 return FALSE;
3503 p->value = reference_index;
3504 reference_index++;
3505 hadone = TRUE;
3507 else if (bfd_is_com_section (p->section))
3509 /* This is a weak reference. */
3510 if (! ieee_write_byte (abfd, ieee_external_reference_enum)
3511 || ! ieee_write_int (abfd, (bfd_vma) reference_index)
3512 || ! ieee_write_id (abfd, p->name)
3513 || ! ieee_write_byte (abfd,
3514 ieee_weak_external_reference_enum)
3515 || ! ieee_write_int (abfd, (bfd_vma) reference_index)
3516 || ! ieee_write_int (abfd, p->value))
3517 return FALSE;
3518 p->value = reference_index;
3519 reference_index++;
3520 hadone = TRUE;
3522 else if (p->flags & BSF_GLOBAL)
3524 /* This must be a symbol definition. */
3525 if (! ieee_write_byte (abfd, ieee_external_symbol_enum)
3526 || ! ieee_write_int (abfd, (bfd_vma) public_index)
3527 || ! ieee_write_id (abfd, p->name)
3528 || ! ieee_write_2bytes (abfd, ieee_attribute_record_enum)
3529 || ! ieee_write_int (abfd, (bfd_vma) public_index)
3530 || ! ieee_write_byte (abfd, 15) /* instruction address */
3531 || ! ieee_write_byte (abfd, 19) /* static symbol */
3532 || ! ieee_write_byte (abfd, 1)) /* one of them */
3533 return FALSE;
3535 /* Write out the value. */
3536 if (! ieee_write_2bytes (abfd, ieee_value_record_enum)
3537 || ! ieee_write_int (abfd, (bfd_vma) public_index))
3538 return FALSE;
3539 if (! bfd_is_abs_section (p->section))
3541 if (abfd->flags & EXEC_P)
3543 /* If fully linked, then output all symbols
3544 relocated. */
3545 if (! (ieee_write_int
3546 (abfd,
3547 (p->value
3548 + p->section->output_offset
3549 + p->section->output_section->vma))))
3550 return FALSE;
3552 else
3554 if (! (ieee_write_expression
3555 (abfd,
3556 p->value + p->section->output_offset,
3557 p->section->output_section->symbol,
3558 FALSE, 0)))
3559 return FALSE;
3562 else
3564 if (! ieee_write_expression (abfd,
3565 p->value,
3566 bfd_abs_section_ptr->symbol,
3567 FALSE, 0))
3568 return FALSE;
3570 p->value = public_index;
3571 public_index++;
3572 hadone = TRUE;
3574 else
3576 /* This can happen - when there are gaps in the symbols read
3577 from an input ieee file. */
3581 if (hadone)
3582 ieee->w.r.external_part = here;
3584 return TRUE;
3588 static const unsigned char exten[] =
3590 0xf0, 0x20, 0x00,
3591 0xf1, 0xce, 0x20, 0x00, 37, 3, 3, /* Set version 3 rev 3. */
3592 0xf1, 0xce, 0x20, 0x00, 39, 2, /* Keep symbol in original case. */
3593 0xf1, 0xce, 0x20, 0x00, 38 /* Set object type relocatable to x. */
3596 static const unsigned char envi[] =
3598 0xf0, 0x21, 0x00,
3600 /* 0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
3601 0x19, 0x2c,
3603 0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok */
3605 0xf1, 0xce, 0x21, 0, 53, 0x03,/* host unix */
3606 /* 0xf1, 0xce, 0x21, 0, 54, 2,1,1 tool & version # */
3609 static bfd_boolean
3610 ieee_write_me_part (abfd)
3611 bfd *abfd;
3613 ieee_data_type *ieee = IEEE_DATA (abfd);
3614 ieee->w.r.trailer_part = bfd_tell (abfd);
3615 if (abfd->start_address)
3617 if (! ieee_write_2bytes (abfd, ieee_value_starting_address_enum)
3618 || ! ieee_write_byte (abfd, ieee_function_either_open_b_enum)
3619 || ! ieee_write_int (abfd, abfd->start_address)
3620 || ! ieee_write_byte (abfd, ieee_function_either_close_b_enum))
3621 return FALSE;
3623 ieee->w.r.me_record = bfd_tell (abfd);
3624 if (! ieee_write_byte (abfd, ieee_module_end_enum))
3625 return FALSE;
3626 return TRUE;
3629 /* Write out the IEEE processor ID. */
3631 static bfd_boolean
3632 ieee_write_processor (abfd)
3633 bfd *abfd;
3635 const bfd_arch_info_type *arch;
3637 arch = bfd_get_arch_info (abfd);
3638 switch (arch->arch)
3640 default:
3641 if (! ieee_write_id (abfd, bfd_printable_name (abfd)))
3642 return FALSE;
3643 break;
3645 case bfd_arch_a29k:
3646 if (! ieee_write_id (abfd, "29000"))
3647 return FALSE;
3648 break;
3650 case bfd_arch_h8300:
3651 if (! ieee_write_id (abfd, "H8/300"))
3652 return FALSE;
3653 break;
3655 case bfd_arch_h8500:
3656 if (! ieee_write_id (abfd, "H8/500"))
3657 return FALSE;
3658 break;
3660 case bfd_arch_i960:
3661 switch (arch->mach)
3663 default:
3664 case bfd_mach_i960_core:
3665 case bfd_mach_i960_ka_sa:
3666 if (! ieee_write_id (abfd, "80960KA"))
3667 return FALSE;
3668 break;
3670 case bfd_mach_i960_kb_sb:
3671 if (! ieee_write_id (abfd, "80960KB"))
3672 return FALSE;
3673 break;
3675 case bfd_mach_i960_ca:
3676 if (! ieee_write_id (abfd, "80960CA"))
3677 return FALSE;
3678 break;
3680 case bfd_mach_i960_mc:
3681 case bfd_mach_i960_xa:
3682 if (! ieee_write_id (abfd, "80960MC"))
3683 return FALSE;
3684 break;
3686 break;
3688 case bfd_arch_m68k:
3690 const char *id;
3692 switch (arch->mach)
3694 default: id = "68020"; break;
3695 case bfd_mach_m68000: id = "68000"; break;
3696 case bfd_mach_m68008: id = "68008"; break;
3697 case bfd_mach_m68010: id = "68010"; break;
3698 case bfd_mach_m68020: id = "68020"; break;
3699 case bfd_mach_m68030: id = "68030"; break;
3700 case bfd_mach_m68040: id = "68040"; break;
3701 case bfd_mach_m68060: id = "68060"; break;
3702 case bfd_mach_cpu32: id = "cpu32"; break;
3703 case bfd_mach_mcf5200:id = "5200"; break;
3704 case bfd_mach_mcf5206e:id = "5206e"; break;
3705 case bfd_mach_mcf5307:id = "5307"; break;
3706 case bfd_mach_mcf5407:id = "5407"; break;
3707 case bfd_mach_mcf528x:id = "5282"; break;
3710 if (! ieee_write_id (abfd, id))
3711 return FALSE;
3713 break;
3716 return TRUE;
3719 static bfd_boolean
3720 ieee_write_object_contents (abfd)
3721 bfd *abfd;
3723 ieee_data_type *ieee = IEEE_DATA (abfd);
3724 unsigned int i;
3725 file_ptr old;
3727 /* Fast forward over the header area. */
3728 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
3729 return FALSE;
3731 if (! ieee_write_byte (abfd, ieee_module_beginning_enum)
3732 || ! ieee_write_processor (abfd)
3733 || ! ieee_write_id (abfd, abfd->filename))
3734 return FALSE;
3736 /* Fast forward over the variable bits. */
3737 if (! ieee_write_byte (abfd, ieee_address_descriptor_enum))
3738 return FALSE;
3740 /* Bits per MAU. */
3741 if (! ieee_write_byte (abfd, (bfd_byte) (bfd_arch_bits_per_byte (abfd))))
3742 return FALSE;
3743 /* MAU's per address. */
3744 if (! ieee_write_byte (abfd,
3745 (bfd_byte) (bfd_arch_bits_per_address (abfd)
3746 / bfd_arch_bits_per_byte (abfd))))
3747 return FALSE;
3749 old = bfd_tell (abfd);
3750 if (bfd_seek (abfd, (file_ptr) (8 * N_W_VARIABLES), SEEK_CUR) != 0)
3751 return FALSE;
3753 ieee->w.r.extension_record = bfd_tell (abfd);
3754 if (bfd_bwrite ((char *) exten, (bfd_size_type) sizeof (exten), abfd)
3755 != sizeof (exten))
3756 return FALSE;
3757 if (abfd->flags & EXEC_P)
3759 if (! ieee_write_byte (abfd, 0x1)) /* Absolute */
3760 return FALSE;
3762 else
3764 if (! ieee_write_byte (abfd, 0x2)) /* Relocateable */
3765 return FALSE;
3768 ieee->w.r.environmental_record = bfd_tell (abfd);
3769 if (bfd_bwrite ((char *) envi, (bfd_size_type) sizeof (envi), abfd)
3770 != sizeof (envi))
3771 return FALSE;
3773 /* The HP emulator database requires a timestamp in the file. */
3775 time_t now;
3776 const struct tm *t;
3778 time (&now);
3779 t = (struct tm *) localtime (&now);
3780 if (! ieee_write_2bytes (abfd, (int) ieee_atn_record_enum)
3781 || ! ieee_write_byte (abfd, 0x21)
3782 || ! ieee_write_byte (abfd, 0)
3783 || ! ieee_write_byte (abfd, 50)
3784 || ! ieee_write_int (abfd, (bfd_vma) (t->tm_year + 1900))
3785 || ! ieee_write_int (abfd, (bfd_vma) (t->tm_mon + 1))
3786 || ! ieee_write_int (abfd, (bfd_vma) t->tm_mday)
3787 || ! ieee_write_int (abfd, (bfd_vma) t->tm_hour)
3788 || ! ieee_write_int (abfd, (bfd_vma) t->tm_min)
3789 || ! ieee_write_int (abfd, (bfd_vma) t->tm_sec))
3790 return FALSE;
3793 output_bfd = abfd;
3795 flush ();
3797 if (! ieee_write_section_part (abfd))
3798 return FALSE;
3799 /* First write the symbols. This changes their values into table
3800 indeces so we cant use it after this point. */
3801 if (! ieee_write_external_part (abfd))
3802 return FALSE;
3804 /* Write any debugs we have been told about. */
3805 if (! ieee_write_debug_part (abfd))
3806 return FALSE;
3808 /* Can only write the data once the symbols have been written, since
3809 the data contains relocation information which points to the
3810 symbols. */
3811 if (! ieee_write_data_part (abfd))
3812 return FALSE;
3814 /* At the end we put the end! */
3815 if (! ieee_write_me_part (abfd))
3816 return FALSE;
3818 /* Generate the header. */
3819 if (bfd_seek (abfd, old, SEEK_SET) != 0)
3820 return FALSE;
3822 for (i = 0; i < N_W_VARIABLES; i++)
3824 if (! ieee_write_2bytes (abfd, ieee_assign_value_to_variable_enum)
3825 || ! ieee_write_byte (abfd, (bfd_byte) i)
3826 || ! ieee_write_int5_out (abfd, (bfd_vma) ieee->w.offset[i]))
3827 return FALSE;
3830 return TRUE;
3833 /* Native-level interface to symbols. */
3835 /* We read the symbols into a buffer, which is discarded when this
3836 function exits. We read the strings into a buffer large enough to
3837 hold them all plus all the cached symbol entries. */
3839 static asymbol *
3840 ieee_make_empty_symbol (abfd)
3841 bfd *abfd;
3843 bfd_size_type amt = sizeof (ieee_symbol_type);
3844 ieee_symbol_type *new = (ieee_symbol_type *) bfd_zalloc (abfd, amt);
3846 if (!new)
3847 return NULL;
3848 new->symbol.the_bfd = abfd;
3849 return &new->symbol;
3852 static bfd *
3853 ieee_openr_next_archived_file (arch, prev)
3854 bfd *arch;
3855 bfd *prev;
3857 ieee_ar_data_type *ar = IEEE_AR_DATA (arch);
3859 /* Take the next one from the arch state, or reset. */
3860 if (prev == (bfd *) NULL)
3861 /* Reset the index - the first two entries are bogus. */
3862 ar->element_index = 2;
3864 while (TRUE)
3866 ieee_ar_obstack_type *p = ar->elements + ar->element_index;
3868 ar->element_index++;
3869 if (ar->element_index <= ar->element_count)
3871 if (p->file_offset != (file_ptr) 0)
3873 if (p->abfd == (bfd *) NULL)
3875 p->abfd = _bfd_create_empty_archive_element_shell (arch);
3876 p->abfd->origin = p->file_offset;
3878 return p->abfd;
3881 else
3883 bfd_set_error (bfd_error_no_more_archived_files);
3884 return (bfd *) NULL;
3889 static bfd_boolean
3890 ieee_find_nearest_line (abfd, section, symbols, offset, filename_ptr,
3891 functionname_ptr, line_ptr)
3892 bfd *abfd ATTRIBUTE_UNUSED;
3893 asection *section ATTRIBUTE_UNUSED;
3894 asymbol **symbols ATTRIBUTE_UNUSED;
3895 bfd_vma offset ATTRIBUTE_UNUSED;
3896 const char **filename_ptr ATTRIBUTE_UNUSED;
3897 const char **functionname_ptr ATTRIBUTE_UNUSED;
3898 unsigned int *line_ptr ATTRIBUTE_UNUSED;
3900 return FALSE;
3903 static int
3904 ieee_generic_stat_arch_elt (abfd, buf)
3905 bfd *abfd;
3906 struct stat *buf;
3908 ieee_ar_data_type *ar = (ieee_ar_data_type *) NULL;
3909 ieee_data_type *ieee;
3911 if (abfd->my_archive != NULL)
3912 ar = abfd->my_archive->tdata.ieee_ar_data;
3913 if (ar == (ieee_ar_data_type *) NULL)
3915 bfd_set_error (bfd_error_invalid_operation);
3916 return -1;
3919 if (IEEE_DATA (abfd) == NULL)
3921 if (ieee_object_p (abfd) == NULL)
3923 bfd_set_error (bfd_error_wrong_format);
3924 return -1;
3928 ieee = IEEE_DATA (abfd);
3930 buf->st_size = ieee->w.r.me_record + 1;
3931 buf->st_mode = 0644;
3932 return 0;
3935 static int
3936 ieee_sizeof_headers (abfd, x)
3937 bfd *abfd ATTRIBUTE_UNUSED;
3938 bfd_boolean x ATTRIBUTE_UNUSED;
3940 return 0;
3944 /* The debug info routines are never used. */
3945 #if 0
3947 static void
3948 ieee_bfd_debug_info_start (abfd)
3949 bfd *abfd;
3954 static void
3955 ieee_bfd_debug_info_end (abfd)
3956 bfd *abfd;
3962 /* Add this section to the list of sections we have debug info for, to
3963 be ready to output it at close time. */
3964 static void
3965 ieee_bfd_debug_info_accumulate (abfd, section)
3966 bfd *abfd;
3967 asection *section;
3969 ieee_data_type *ieee = IEEE_DATA (section->owner);
3970 ieee_data_type *output_ieee = IEEE_DATA (abfd);
3972 /* Can only accumulate data from other ieee bfds. */
3973 if (section->owner->xvec != abfd->xvec)
3974 return;
3975 /* Only bother once per bfd. */
3976 if (ieee->done_debug)
3977 return;
3978 ieee->done_debug = TRUE;
3980 /* Don't bother if there is no debug info. */
3981 if (ieee->w.r.debug_information_part == 0)
3982 return;
3984 /* Add to chain. */
3986 bfd_size_type amt = sizeof (bfd_chain_type);
3987 bfd_chain_type *n = (bfd_chain_type *) bfd_alloc (abfd, amt);
3989 if (!n)
3990 abort (); /* FIXME */
3991 n->this = section->owner;
3992 n->next = (bfd_chain_type *) NULL;
3994 if (output_ieee->chain_head)
3995 output_ieee->chain_head->next = n;
3996 else
3997 output_ieee->chain_root = n;
3999 output_ieee->chain_head = n;
4003 #endif
4005 #define ieee_close_and_cleanup _bfd_generic_close_and_cleanup
4006 #define ieee_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
4008 #define ieee_slurp_armap bfd_true
4009 #define ieee_slurp_extended_name_table bfd_true
4010 #define ieee_construct_extended_name_table \
4011 ((bfd_boolean (*) \
4012 PARAMS ((bfd *, char **, bfd_size_type *, const char **))) \
4013 bfd_true)
4014 #define ieee_truncate_arname bfd_dont_truncate_arname
4015 #define ieee_write_armap \
4016 ((bfd_boolean (*) \
4017 PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int))) \
4018 bfd_true)
4019 #define ieee_read_ar_hdr bfd_nullvoidptr
4020 #define ieee_update_armap_timestamp bfd_true
4021 #define ieee_get_elt_at_index _bfd_generic_get_elt_at_index
4023 #define ieee_bfd_is_local_label_name bfd_generic_is_local_label_name
4024 #define ieee_get_lineno _bfd_nosymbols_get_lineno
4025 #define ieee_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
4026 #define ieee_read_minisymbols _bfd_generic_read_minisymbols
4027 #define ieee_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
4029 #define ieee_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
4031 #define ieee_set_arch_mach _bfd_generic_set_arch_mach
4033 #define ieee_get_section_contents_in_window \
4034 _bfd_generic_get_section_contents_in_window
4035 #define ieee_bfd_get_relocated_section_contents \
4036 bfd_generic_get_relocated_section_contents
4037 #define ieee_bfd_relax_section bfd_generic_relax_section
4038 #define ieee_bfd_gc_sections bfd_generic_gc_sections
4039 #define ieee_bfd_merge_sections bfd_generic_merge_sections
4040 #define ieee_bfd_discard_group bfd_generic_discard_group
4041 #define ieee_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
4042 #define ieee_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
4043 #define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols
4044 #define ieee_bfd_link_just_syms _bfd_generic_link_just_syms
4045 #define ieee_bfd_final_link _bfd_generic_final_link
4046 #define ieee_bfd_link_split_section _bfd_generic_link_split_section
4048 const bfd_target ieee_vec =
4050 "ieee", /* name */
4051 bfd_target_ieee_flavour,
4052 BFD_ENDIAN_UNKNOWN, /* target byte order */
4053 BFD_ENDIAN_UNKNOWN, /* target headers byte order */
4054 (HAS_RELOC | EXEC_P | /* object flags */
4055 HAS_LINENO | HAS_DEBUG |
4056 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
4057 (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
4058 | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
4059 '_', /* leading underscore */
4060 ' ', /* ar_pad_char */
4061 16, /* ar_max_namelen */
4062 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
4063 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
4064 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
4065 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
4066 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
4067 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* hdrs */
4069 {_bfd_dummy_target,
4070 ieee_object_p, /* bfd_check_format */
4071 ieee_archive_p,
4072 _bfd_dummy_target,
4075 bfd_false,
4076 ieee_mkobject,
4077 _bfd_generic_mkarchive,
4078 bfd_false
4081 bfd_false,
4082 ieee_write_object_contents,
4083 _bfd_write_archive_contents,
4084 bfd_false,
4087 /* ieee_close_and_cleanup, ieee_bfd_free_cached_info, ieee_new_section_hook,
4088 ieee_get_section_contents, ieee_get_section_contents_in_window */
4089 BFD_JUMP_TABLE_GENERIC (ieee),
4091 BFD_JUMP_TABLE_COPY (_bfd_generic),
4092 BFD_JUMP_TABLE_CORE (_bfd_nocore),
4094 /* ieee_slurp_armap, ieee_slurp_extended_name_table,
4095 ieee_construct_extended_name_table, ieee_truncate_arname,
4096 ieee_write_armap, ieee_read_ar_hdr, ieee_openr_next_archived_file,
4097 ieee_get_elt_at_index, ieee_generic_stat_arch_elt,
4098 ieee_update_armap_timestamp */
4099 BFD_JUMP_TABLE_ARCHIVE (ieee),
4101 /* ieee_get_symtab_upper_bound, ieee_canonicalize_symtab,
4102 ieee_make_empty_symbol, ieee_print_symbol, ieee_get_symbol_info,
4103 ieee_bfd_is_local_label_name, ieee_get_lineno,
4104 ieee_find_nearest_line, ieee_bfd_make_debug_symbol,
4105 ieee_read_minisymbols, ieee_minisymbol_to_symbol */
4106 BFD_JUMP_TABLE_SYMBOLS (ieee),
4108 /* ieee_get_reloc_upper_bound, ieee_canonicalize_reloc,
4109 ieee_bfd_reloc_type_lookup */
4110 BFD_JUMP_TABLE_RELOCS (ieee),
4112 /* ieee_set_arch_mach, ieee_set_section_contents */
4113 BFD_JUMP_TABLE_WRITE (ieee),
4115 /* ieee_sizeof_headers, ieee_bfd_get_relocated_section_contents,
4116 ieee_bfd_relax_section, ieee_bfd_link_hash_table_create,
4117 _bfd_generic_link_hash_table_free,
4118 ieee_bfd_link_add_symbols, ieee_bfd_final_link,
4119 ieee_bfd_link_split_section, ieee_bfd_gc_sections,
4120 ieee_bfd_merge_sections */
4121 BFD_JUMP_TABLE_LINK (ieee),
4123 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
4125 NULL,
4127 (PTR) 0