Add support for DragonFlyBSD target.
[binutils.git] / bfd / ieee.c
blobbb986c4a9757bf64ffc3d5d07cf2850b84e40296
1 /* BFD back-end for ieee-695 objects.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010
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 3 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., 51 Franklin Street - Fifth Floor, Boston,
23 MA 02110-1301, USA. */
26 #define KEEPMINUSPCININST 0
28 /* IEEE 695 format is a stream of records, which we parse using a simple one-
29 token (which is one byte in this lexicon) lookahead recursive decent
30 parser. */
32 #include "sysdep.h"
33 #include "bfd.h"
34 #include "libbfd.h"
35 #include "ieee.h"
36 #include "libieee.h"
37 #include "safe-ctype.h"
39 struct output_buffer_struct
41 unsigned char *ptrp;
42 int buffer;
45 static unsigned char *output_ptr_start;
46 static unsigned char *output_ptr;
47 static unsigned char *output_ptr_end;
48 static unsigned char *input_ptr_start;
49 static unsigned char *input_ptr;
50 static unsigned char *input_ptr_end;
51 static bfd *input_bfd;
52 static bfd *output_bfd;
53 static int output_buffer;
56 static void block (void);
58 /* Functions for writing to ieee files in the strange way that the
59 standard requires. */
61 static bfd_boolean
62 ieee_write_byte (bfd *abfd, int barg)
64 bfd_byte byte;
66 byte = barg;
67 if (bfd_bwrite ((void *) &byte, (bfd_size_type) 1, abfd) != 1)
68 return FALSE;
69 return TRUE;
72 static bfd_boolean
73 ieee_write_2bytes (bfd *abfd, int bytes)
75 bfd_byte buffer[2];
77 buffer[0] = bytes >> 8;
78 buffer[1] = bytes & 0xff;
79 if (bfd_bwrite ((void *) buffer, (bfd_size_type) 2, abfd) != 2)
80 return FALSE;
81 return TRUE;
84 static bfd_boolean
85 ieee_write_int (bfd *abfd, bfd_vma value)
87 if (value <= 127)
89 if (! ieee_write_byte (abfd, (bfd_byte) value))
90 return FALSE;
92 else
94 unsigned int length;
96 /* How many significant bytes ? */
97 /* FIXME FOR LONGER INTS. */
98 if (value & 0xff000000)
99 length = 4;
100 else if (value & 0x00ff0000)
101 length = 3;
102 else if (value & 0x0000ff00)
103 length = 2;
104 else
105 length = 1;
107 if (! ieee_write_byte (abfd,
108 (bfd_byte) ((int) ieee_number_repeat_start_enum
109 + length)))
110 return FALSE;
111 switch (length)
113 case 4:
114 if (! ieee_write_byte (abfd, (bfd_byte) (value >> 24)))
115 return FALSE;
116 /* Fall through. */
117 case 3:
118 if (! ieee_write_byte (abfd, (bfd_byte) (value >> 16)))
119 return FALSE;
120 /* Fall through. */
121 case 2:
122 if (! ieee_write_byte (abfd, (bfd_byte) (value >> 8)))
123 return FALSE;
124 /* Fall through. */
125 case 1:
126 if (! ieee_write_byte (abfd, (bfd_byte) (value)))
127 return FALSE;
131 return TRUE;
134 static bfd_boolean
135 ieee_write_id (bfd *abfd, const char *id)
137 size_t length = strlen (id);
139 if (length <= 127)
141 if (! ieee_write_byte (abfd, (bfd_byte) length))
142 return FALSE;
144 else if (length < 255)
146 if (! ieee_write_byte (abfd, ieee_extension_length_1_enum)
147 || ! ieee_write_byte (abfd, (bfd_byte) length))
148 return FALSE;
150 else if (length < 65535)
152 if (! ieee_write_byte (abfd, ieee_extension_length_2_enum)
153 || ! ieee_write_2bytes (abfd, (int) length))
154 return FALSE;
156 else
158 (*_bfd_error_handler)
159 (_("%s: string too long (%d chars, max 65535)"),
160 bfd_get_filename (abfd), length);
161 bfd_set_error (bfd_error_invalid_operation);
162 return FALSE;
165 if (bfd_bwrite ((void *) id, (bfd_size_type) length, abfd) != length)
166 return FALSE;
167 return TRUE;
170 /* Functions for reading from ieee files in the strange way that the
171 standard requires. */
173 #define this_byte(ieee) *((ieee)->input_p)
174 #define next_byte(ieee) ((ieee)->input_p++)
175 #define this_byte_and_next(ieee) (*((ieee)->input_p++))
177 static unsigned short
178 read_2bytes (common_header_type *ieee)
180 unsigned char c1 = this_byte_and_next (ieee);
181 unsigned char c2 = this_byte_and_next (ieee);
183 return (c1 << 8) | c2;
186 static void
187 bfd_get_string (common_header_type *ieee, char *string, size_t length)
189 size_t i;
191 for (i = 0; i < length; i++)
192 string[i] = this_byte_and_next (ieee);
195 static char *
196 read_id (common_header_type *ieee)
198 size_t length;
199 char *string;
201 length = this_byte_and_next (ieee);
202 if (length <= 0x7f)
203 /* Simple string of length 0 to 127. */
206 else if (length == 0xde)
207 /* Length is next byte, allowing 0..255. */
208 length = this_byte_and_next (ieee);
210 else if (length == 0xdf)
212 /* Length is next two bytes, allowing 0..65535. */
213 length = this_byte_and_next (ieee);
214 length = (length * 256) + this_byte_and_next (ieee);
217 /* Buy memory and read string. */
218 string = bfd_alloc (ieee->abfd, (bfd_size_type) length + 1);
219 if (!string)
220 return NULL;
221 bfd_get_string (ieee, string, length);
222 string[length] = 0;
223 return string;
226 static bfd_boolean
227 ieee_write_expression (bfd *abfd,
228 bfd_vma value,
229 asymbol *symbol,
230 bfd_boolean pcrel,
231 unsigned int sindex)
233 unsigned int term_count = 0;
235 if (value != 0)
237 if (! ieee_write_int (abfd, value))
238 return FALSE;
239 term_count++;
242 /* Badly formatted binaries can have a missing symbol,
243 so test here to prevent a seg fault. */
244 if (symbol != NULL)
246 if (bfd_is_com_section (symbol->section)
247 || bfd_is_und_section (symbol->section))
249 /* Def of a common symbol. */
250 if (! ieee_write_byte (abfd, ieee_variable_X_enum)
251 || ! ieee_write_int (abfd, symbol->value))
252 return FALSE;
253 term_count ++;
255 else if (! bfd_is_abs_section (symbol->section))
257 /* Ref to defined symbol - */
258 if (symbol->flags & BSF_GLOBAL)
260 if (! ieee_write_byte (abfd, ieee_variable_I_enum)
261 || ! ieee_write_int (abfd, symbol->value))
262 return FALSE;
263 term_count++;
265 else if (symbol->flags & (BSF_LOCAL | BSF_SECTION_SYM))
267 /* This is a reference to a defined local symbol. We can
268 easily do a local as a section+offset. */
269 if (! ieee_write_byte (abfd, ieee_variable_R_enum)
270 || ! ieee_write_byte (abfd,
271 (bfd_byte) (symbol->section->index
272 + IEEE_SECTION_NUMBER_BASE)))
273 return FALSE;
275 term_count++;
276 if (symbol->value != 0)
278 if (! ieee_write_int (abfd, symbol->value))
279 return FALSE;
280 term_count++;
283 else
285 (*_bfd_error_handler)
286 (_("%s: unrecognized symbol `%s' flags 0x%x"),
287 bfd_get_filename (abfd), bfd_asymbol_name (symbol),
288 symbol->flags);
289 bfd_set_error (bfd_error_invalid_operation);
290 return FALSE;
295 if (pcrel)
297 /* Subtract the pc from here by asking for PC of this section. */
298 if (! ieee_write_byte (abfd, ieee_variable_P_enum)
299 || ! ieee_write_byte (abfd,
300 (bfd_byte) (sindex + IEEE_SECTION_NUMBER_BASE))
301 || ! ieee_write_byte (abfd, ieee_function_minus_enum))
302 return FALSE;
305 /* Handle the degenerate case of a 0 address. */
306 if (term_count == 0)
307 if (! ieee_write_int (abfd, (bfd_vma) 0))
308 return FALSE;
310 while (term_count > 1)
312 if (! ieee_write_byte (abfd, ieee_function_plus_enum))
313 return FALSE;
314 term_count--;
317 return TRUE;
320 /* Writes any integer into the buffer supplied and always takes 5 bytes. */
322 static void
323 ieee_write_int5 (bfd_byte *buffer, bfd_vma value)
325 buffer[0] = (bfd_byte) ieee_number_repeat_4_enum;
326 buffer[1] = (value >> 24) & 0xff;
327 buffer[2] = (value >> 16) & 0xff;
328 buffer[3] = (value >> 8) & 0xff;
329 buffer[4] = (value >> 0) & 0xff;
332 static bfd_boolean
333 ieee_write_int5_out (bfd *abfd, bfd_vma value)
335 bfd_byte b[5];
337 ieee_write_int5 (b, value);
338 if (bfd_bwrite ((void *) b, (bfd_size_type) 5, abfd) != 5)
339 return FALSE;
340 return TRUE;
343 static bfd_boolean
344 parse_int (common_header_type *ieee, bfd_vma *value_ptr)
346 int value = this_byte (ieee);
347 int result;
349 if (value >= 0 && value <= 127)
351 *value_ptr = value;
352 next_byte (ieee);
353 return TRUE;
355 else if (value >= 0x80 && value <= 0x88)
357 unsigned int count = value & 0xf;
359 result = 0;
360 next_byte (ieee);
361 while (count)
363 result = (result << 8) | this_byte_and_next (ieee);
364 count--;
366 *value_ptr = result;
367 return TRUE;
369 return FALSE;
372 static int
373 parse_i (common_header_type *ieee, bfd_boolean *ok)
375 bfd_vma x = 0;
376 *ok = parse_int (ieee, &x);
377 return x;
380 static bfd_vma
381 must_parse_int (common_header_type *ieee)
383 bfd_vma result = 0;
384 BFD_ASSERT (parse_int (ieee, &result));
385 return result;
388 typedef struct
390 bfd_vma value;
391 asection *section;
392 ieee_symbol_index_type symbol;
393 } ieee_value_type;
396 #if KEEPMINUSPCININST
398 #define SRC_MASK(arg) arg
399 #define PCREL_OFFSET FALSE
401 #else
403 #define SRC_MASK(arg) 0
404 #define PCREL_OFFSET TRUE
406 #endif
408 static reloc_howto_type abs32_howto =
409 HOWTO (1,
413 FALSE,
415 complain_overflow_bitfield,
417 "abs32",
418 TRUE,
419 0xffffffff,
420 0xffffffff,
421 FALSE);
423 static reloc_howto_type abs16_howto =
424 HOWTO (1,
428 FALSE,
430 complain_overflow_bitfield,
432 "abs16",
433 TRUE,
434 0x0000ffff,
435 0x0000ffff,
436 FALSE);
438 static reloc_howto_type abs8_howto =
439 HOWTO (1,
443 FALSE,
445 complain_overflow_bitfield,
447 "abs8",
448 TRUE,
449 0x000000ff,
450 0x000000ff,
451 FALSE);
453 static reloc_howto_type rel32_howto =
454 HOWTO (1,
458 TRUE,
460 complain_overflow_signed,
462 "rel32",
463 TRUE,
464 SRC_MASK (0xffffffff),
465 0xffffffff,
466 PCREL_OFFSET);
468 static reloc_howto_type rel16_howto =
469 HOWTO (1,
473 TRUE,
475 complain_overflow_signed,
477 "rel16",
478 TRUE,
479 SRC_MASK (0x0000ffff),
480 0x0000ffff,
481 PCREL_OFFSET);
483 static reloc_howto_type rel8_howto =
484 HOWTO (1,
488 TRUE,
490 complain_overflow_signed,
492 "rel8",
493 TRUE,
494 SRC_MASK (0x000000ff),
495 0x000000ff,
496 PCREL_OFFSET);
498 static ieee_symbol_index_type NOSYMBOL = {0, 0};
500 static void
501 parse_expression (ieee_data_type *ieee,
502 bfd_vma *value,
503 ieee_symbol_index_type *symbol,
504 bfd_boolean *pcrel,
505 unsigned int *extra,
506 asection **section)
509 bfd_boolean loop = TRUE;
510 ieee_value_type stack[10];
511 ieee_value_type *sp = stack;
512 asection *dummy;
514 #define POS sp[1]
515 #define TOS sp[0]
516 #define NOS sp[-1]
517 #define INC sp++;
518 #define DEC sp--;
520 /* The stack pointer always points to the next unused location. */
521 #define PUSH(x,y,z) TOS.symbol = x; TOS.section = y; TOS.value = z; INC;
522 #define POP(x,y,z) DEC; x = TOS.symbol; y = TOS.section; z = TOS.value;
524 while (loop && ieee->h.input_p < ieee->h.last_byte)
526 switch (this_byte (&(ieee->h)))
528 case ieee_variable_P_enum:
529 /* P variable, current program counter for section n. */
531 int section_n;
533 next_byte (&(ieee->h));
534 *pcrel = TRUE;
535 section_n = must_parse_int (&(ieee->h));
536 (void) section_n;
537 PUSH (NOSYMBOL, bfd_abs_section_ptr, 0);
538 break;
540 case ieee_variable_L_enum:
541 /* L variable address of section N. */
542 next_byte (&(ieee->h));
543 PUSH (NOSYMBOL, ieee->section_table[must_parse_int (&(ieee->h))], 0);
544 break;
545 case ieee_variable_R_enum:
546 /* R variable, logical address of section module. */
547 /* FIXME, this should be different to L. */
548 next_byte (&(ieee->h));
549 PUSH (NOSYMBOL, ieee->section_table[must_parse_int (&(ieee->h))], 0);
550 break;
551 case ieee_variable_S_enum:
552 /* S variable, size in MAUS of section module. */
553 next_byte (&(ieee->h));
554 PUSH (NOSYMBOL,
556 ieee->section_table[must_parse_int (&(ieee->h))]->size);
557 break;
558 case ieee_variable_I_enum:
559 /* Push the address of variable n. */
561 ieee_symbol_index_type sy;
563 next_byte (&(ieee->h));
564 sy.index = (int) must_parse_int (&(ieee->h));
565 sy.letter = 'I';
567 PUSH (sy, bfd_abs_section_ptr, 0);
569 break;
570 case ieee_variable_X_enum:
571 /* Push the address of external variable n. */
573 ieee_symbol_index_type sy;
575 next_byte (&(ieee->h));
576 sy.index = (int) (must_parse_int (&(ieee->h)));
577 sy.letter = 'X';
579 PUSH (sy, bfd_und_section_ptr, 0);
581 break;
582 case ieee_function_minus_enum:
584 bfd_vma value1, value2;
585 asection *section1, *section_dummy;
586 ieee_symbol_index_type sy;
588 next_byte (&(ieee->h));
590 POP (sy, section1, value1);
591 POP (sy, section_dummy, value2);
592 PUSH (sy, section1 ? section1 : section_dummy, value2 - value1);
594 break;
595 case ieee_function_plus_enum:
597 bfd_vma value1, value2;
598 asection *section1;
599 asection *section2;
600 ieee_symbol_index_type sy1;
601 ieee_symbol_index_type sy2;
603 next_byte (&(ieee->h));
605 POP (sy1, section1, value1);
606 POP (sy2, section2, value2);
607 PUSH (sy1.letter ? sy1 : sy2,
608 bfd_is_abs_section (section1) ? section2 : section1,
609 value1 + value2);
611 break;
612 default:
614 bfd_vma va;
616 BFD_ASSERT (this_byte (&(ieee->h)) < (int) ieee_variable_A_enum
617 || this_byte (&(ieee->h)) > (int) ieee_variable_Z_enum);
618 if (parse_int (&(ieee->h), &va))
620 PUSH (NOSYMBOL, bfd_abs_section_ptr, va);
622 else
623 /* Thats all that we can understand. */
624 loop = FALSE;
629 /* As far as I can see there is a bug in the Microtec IEEE output
630 which I'm using to scan, whereby the comma operator is omitted
631 sometimes in an expression, giving expressions with too many
632 terms. We can tell if that's the case by ensuring that
633 sp == stack here. If not, then we've pushed something too far,
634 so we keep adding. */
635 while (sp != stack + 1)
637 asection *section1;
638 ieee_symbol_index_type sy1;
640 POP (sy1, section1, *extra);
641 (void) section1;
642 (void) sy1;
645 POP (*symbol, dummy, *value);
646 if (section)
647 *section = dummy;
651 #define ieee_seek(ieee, offset) \
652 do \
654 ieee->h.input_p = ieee->h.first_byte + offset; \
655 ieee->h.last_byte = (ieee->h.first_byte \
656 + ieee_part_after (ieee, offset)); \
658 while (0)
660 #define ieee_pos(ieee) \
661 (ieee->h.input_p - ieee->h.first_byte)
663 /* Find the first part of the ieee file after HERE. */
665 static file_ptr
666 ieee_part_after (ieee_data_type *ieee, file_ptr here)
668 int part;
669 file_ptr after = ieee->w.r.me_record;
671 /* File parts can come in any order, except that module end is
672 guaranteed to be last (and the header first). */
673 for (part = 0; part < N_W_VARIABLES; part++)
674 if (ieee->w.offset[part] > here && after > ieee->w.offset[part])
675 after = ieee->w.offset[part];
677 return after;
680 static unsigned int last_index;
681 static char last_type; /* Is the index for an X or a D. */
683 static ieee_symbol_type *
684 get_symbol (bfd *abfd ATTRIBUTE_UNUSED,
685 ieee_data_type *ieee,
686 ieee_symbol_type *last_symbol,
687 unsigned int *symbol_count,
688 ieee_symbol_type ***pptr,
689 unsigned int *max_index,
690 int this_type)
692 /* Need a new symbol. */
693 unsigned int new_index = must_parse_int (&(ieee->h));
695 if (new_index != last_index || this_type != last_type)
697 ieee_symbol_type *new_symbol;
698 bfd_size_type amt = sizeof (ieee_symbol_type);
700 new_symbol = bfd_alloc (ieee->h.abfd, amt);
701 if (!new_symbol)
702 return NULL;
704 new_symbol->index = new_index;
705 last_index = new_index;
706 (*symbol_count)++;
707 **pptr = new_symbol;
708 *pptr = &new_symbol->next;
709 if (new_index > *max_index)
710 *max_index = new_index;
712 last_type = this_type;
713 new_symbol->symbol.section = bfd_abs_section_ptr;
714 return new_symbol;
716 return last_symbol;
719 static bfd_boolean
720 ieee_slurp_external_symbols (bfd *abfd)
722 ieee_data_type *ieee = IEEE_DATA (abfd);
723 file_ptr offset = ieee->w.r.external_part;
725 ieee_symbol_type **prev_symbols_ptr = &ieee->external_symbols;
726 ieee_symbol_type **prev_reference_ptr = &ieee->external_reference;
727 ieee_symbol_type *symbol = NULL;
728 unsigned int symbol_count = 0;
729 bfd_boolean loop = TRUE;
731 last_index = 0xffffff;
732 ieee->symbol_table_full = TRUE;
734 ieee_seek (ieee, offset);
736 while (loop)
738 switch (this_byte (&(ieee->h)))
740 case ieee_nn_record:
741 next_byte (&(ieee->h));
743 symbol = get_symbol (abfd, ieee, symbol, &symbol_count,
744 & prev_symbols_ptr,
745 & ieee->external_symbol_max_index, 'I');
746 if (symbol == NULL)
747 return FALSE;
749 symbol->symbol.the_bfd = abfd;
750 symbol->symbol.name = read_id (&(ieee->h));
751 symbol->symbol.udata.p = NULL;
752 symbol->symbol.flags = BSF_NO_FLAGS;
753 break;
754 case ieee_external_symbol_enum:
755 next_byte (&(ieee->h));
757 symbol = get_symbol (abfd, ieee, symbol, &symbol_count,
758 &prev_symbols_ptr,
759 &ieee->external_symbol_max_index, 'D');
760 if (symbol == NULL)
761 return FALSE;
763 BFD_ASSERT (symbol->index >= ieee->external_symbol_min_index);
765 symbol->symbol.the_bfd = abfd;
766 symbol->symbol.name = read_id (&(ieee->h));
767 symbol->symbol.udata.p = NULL;
768 symbol->symbol.flags = BSF_NO_FLAGS;
769 break;
770 case ieee_attribute_record_enum >> 8:
772 unsigned int symbol_name_index;
773 unsigned int symbol_type_index;
774 unsigned int symbol_attribute_def;
775 bfd_vma value = 0;
777 switch (read_2bytes (&ieee->h))
779 case ieee_attribute_record_enum:
780 symbol_name_index = must_parse_int (&(ieee->h));
781 symbol_type_index = must_parse_int (&(ieee->h));
782 (void) symbol_type_index;
783 symbol_attribute_def = must_parse_int (&(ieee->h));
784 switch (symbol_attribute_def)
786 case 8:
787 case 19:
788 parse_int (&ieee->h, &value);
789 break;
790 default:
791 (*_bfd_error_handler)
792 (_("%B: unimplemented ATI record %u for symbol %u"),
793 abfd, symbol_attribute_def, symbol_name_index);
794 bfd_set_error (bfd_error_bad_value);
795 return FALSE;
796 break;
798 break;
799 case ieee_external_reference_info_record_enum:
800 /* Skip over ATX record. */
801 parse_int (&(ieee->h), &value);
802 parse_int (&(ieee->h), &value);
803 parse_int (&(ieee->h), &value);
804 parse_int (&(ieee->h), &value);
805 break;
806 case ieee_atn_record_enum:
807 /* We may get call optimization information here,
808 which we just ignore. The format is
809 {$F1}${CE}{index}{$00}{$3F}{$3F}{#_of_ASNs}. */
810 parse_int (&ieee->h, &value);
811 parse_int (&ieee->h, &value);
812 parse_int (&ieee->h, &value);
813 if (value != 0x3f)
815 (*_bfd_error_handler)
816 (_("%B: unexpected ATN type %d in external part"),
817 abfd, (int) value);
818 bfd_set_error (bfd_error_bad_value);
819 return FALSE;
821 parse_int (&ieee->h, &value);
822 parse_int (&ieee->h, &value);
823 while (value > 0)
825 bfd_vma val1;
827 --value;
829 switch (read_2bytes (&ieee->h))
831 case ieee_asn_record_enum:
832 parse_int (&ieee->h, &val1);
833 parse_int (&ieee->h, &val1);
834 break;
836 default:
837 (*_bfd_error_handler)
838 (_("%B: unexpected type after ATN"), abfd);
839 bfd_set_error (bfd_error_bad_value);
840 return FALSE;
845 break;
846 case ieee_value_record_enum >> 8:
848 unsigned int symbol_name_index;
849 ieee_symbol_index_type symbol_ignore;
850 bfd_boolean pcrel_ignore;
851 unsigned int extra;
853 next_byte (&(ieee->h));
854 next_byte (&(ieee->h));
856 symbol_name_index = must_parse_int (&(ieee->h));
857 (void) symbol_name_index;
858 parse_expression (ieee,
859 &symbol->symbol.value,
860 &symbol_ignore,
861 &pcrel_ignore,
862 &extra,
863 &symbol->symbol.section);
865 /* Fully linked IEEE-695 files tend to give every symbol
866 an absolute value. Try to convert that back into a
867 section relative value. FIXME: This won't always to
868 the right thing. */
869 if (bfd_is_abs_section (symbol->symbol.section)
870 && (abfd->flags & HAS_RELOC) == 0)
872 bfd_vma val;
873 asection *s;
875 val = symbol->symbol.value;
876 for (s = abfd->sections; s != NULL; s = s->next)
878 if (val >= s->vma && val < s->vma + s->size)
880 symbol->symbol.section = s;
881 symbol->symbol.value -= s->vma;
882 break;
887 symbol->symbol.flags = BSF_GLOBAL | BSF_EXPORT;
890 break;
891 case ieee_weak_external_reference_enum:
893 bfd_vma size;
894 bfd_vma value;
896 next_byte (&(ieee->h));
897 /* Throw away the external reference index. */
898 (void) must_parse_int (&(ieee->h));
899 /* Fetch the default size if not resolved. */
900 size = must_parse_int (&(ieee->h));
901 /* Fetch the default value if available. */
902 if (! parse_int (&(ieee->h), &value))
903 value = 0;
904 /* This turns into a common. */
905 symbol->symbol.section = bfd_com_section_ptr;
906 symbol->symbol.value = size;
908 break;
910 case ieee_external_reference_enum:
911 next_byte (&(ieee->h));
913 symbol = get_symbol (abfd, ieee, symbol, &symbol_count,
914 &prev_reference_ptr,
915 &ieee->external_reference_max_index, 'X');
916 if (symbol == NULL)
917 return FALSE;
919 symbol->symbol.the_bfd = abfd;
920 symbol->symbol.name = read_id (&(ieee->h));
921 symbol->symbol.udata.p = NULL;
922 symbol->symbol.section = bfd_und_section_ptr;
923 symbol->symbol.value = (bfd_vma) 0;
924 symbol->symbol.flags = 0;
926 BFD_ASSERT (symbol->index >= ieee->external_reference_min_index);
927 break;
929 default:
930 loop = FALSE;
934 if (ieee->external_symbol_max_index != 0)
936 ieee->external_symbol_count =
937 ieee->external_symbol_max_index -
938 ieee->external_symbol_min_index + 1;
940 else
941 ieee->external_symbol_count = 0;
943 if (ieee->external_reference_max_index != 0)
945 ieee->external_reference_count =
946 ieee->external_reference_max_index -
947 ieee->external_reference_min_index + 1;
949 else
950 ieee->external_reference_count = 0;
952 abfd->symcount =
953 ieee->external_reference_count + ieee->external_symbol_count;
955 if (symbol_count != abfd->symcount)
956 /* There are gaps in the table -- */
957 ieee->symbol_table_full = FALSE;
959 *prev_symbols_ptr = NULL;
960 *prev_reference_ptr = NULL;
962 return TRUE;
965 static bfd_boolean
966 ieee_slurp_symbol_table (bfd *abfd)
968 if (! IEEE_DATA (abfd)->read_symbols)
970 if (! ieee_slurp_external_symbols (abfd))
971 return FALSE;
972 IEEE_DATA (abfd)->read_symbols = TRUE;
974 return TRUE;
977 static long
978 ieee_get_symtab_upper_bound (bfd *abfd)
980 if (! ieee_slurp_symbol_table (abfd))
981 return -1;
983 return (abfd->symcount != 0) ?
984 (abfd->symcount + 1) * (sizeof (ieee_symbol_type *)) : 0;
987 /* Move from our internal lists to the canon table, and insert in
988 symbol index order. */
990 extern const bfd_target ieee_vec;
992 static long
993 ieee_canonicalize_symtab (bfd *abfd, asymbol **location)
995 ieee_symbol_type *symp;
996 static bfd dummy_bfd;
997 static asymbol empty_symbol =
999 &dummy_bfd,
1000 " ieee empty",
1001 (symvalue) 0,
1002 BSF_DEBUGGING,
1003 bfd_abs_section_ptr
1004 #ifdef __STDC__
1005 /* K&R compilers can't initialise unions. */
1006 , { 0 }
1007 #endif
1010 if (abfd->symcount)
1012 ieee_data_type *ieee = IEEE_DATA (abfd);
1014 dummy_bfd.xvec = &ieee_vec;
1015 if (! ieee_slurp_symbol_table (abfd))
1016 return -1;
1018 if (! ieee->symbol_table_full)
1020 /* Arrgh - there are gaps in the table, run through and fill them
1021 up with pointers to a null place. */
1022 unsigned int i;
1024 for (i = 0; i < abfd->symcount; i++)
1025 location[i] = &empty_symbol;
1028 ieee->external_symbol_base_offset = -ieee->external_symbol_min_index;
1029 for (symp = IEEE_DATA (abfd)->external_symbols;
1030 symp != (ieee_symbol_type *) NULL;
1031 symp = symp->next)
1032 /* Place into table at correct index locations. */
1033 location[symp->index + ieee->external_symbol_base_offset] = &symp->symbol;
1035 /* The external refs are indexed in a bit. */
1036 ieee->external_reference_base_offset =
1037 -ieee->external_reference_min_index + ieee->external_symbol_count;
1039 for (symp = IEEE_DATA (abfd)->external_reference;
1040 symp != (ieee_symbol_type *) NULL;
1041 symp = symp->next)
1042 location[symp->index + ieee->external_reference_base_offset] =
1043 &symp->symbol;
1046 if (abfd->symcount)
1047 location[abfd->symcount] = (asymbol *) NULL;
1049 return abfd->symcount;
1052 static asection *
1053 get_section_entry (bfd *abfd, ieee_data_type *ieee, unsigned int sindex)
1055 if (sindex >= ieee->section_table_size)
1057 unsigned int c, i;
1058 asection **n;
1059 bfd_size_type amt;
1061 c = ieee->section_table_size;
1062 if (c == 0)
1063 c = 20;
1064 while (c <= sindex)
1065 c *= 2;
1067 amt = c;
1068 amt *= sizeof (asection *);
1069 n = bfd_realloc (ieee->section_table, amt);
1070 if (n == NULL)
1071 return NULL;
1073 for (i = ieee->section_table_size; i < c; i++)
1074 n[i] = NULL;
1076 ieee->section_table = n;
1077 ieee->section_table_size = c;
1080 if (ieee->section_table[sindex] == (asection *) NULL)
1082 char *tmp = bfd_alloc (abfd, (bfd_size_type) 11);
1083 asection *section;
1085 if (!tmp)
1086 return NULL;
1087 sprintf (tmp, " fsec%4d", sindex);
1088 section = bfd_make_section (abfd, tmp);
1089 ieee->section_table[sindex] = section;
1090 section->target_index = sindex;
1091 ieee->section_table[sindex] = section;
1093 return ieee->section_table[sindex];
1096 static void
1097 ieee_slurp_sections (bfd *abfd)
1099 ieee_data_type *ieee = IEEE_DATA (abfd);
1100 file_ptr offset = ieee->w.r.section_part;
1101 char *name;
1103 if (offset != 0)
1105 bfd_byte section_type[3];
1107 ieee_seek (ieee, offset);
1108 while (TRUE)
1110 switch (this_byte (&(ieee->h)))
1112 case ieee_section_type_enum:
1114 asection *section;
1115 unsigned int section_index;
1117 next_byte (&(ieee->h));
1118 section_index = must_parse_int (&(ieee->h));
1120 section = get_section_entry (abfd, ieee, section_index);
1122 section_type[0] = this_byte_and_next (&(ieee->h));
1124 /* Set minimal section attributes. Attributes are
1125 extended later, based on section contents. */
1126 switch (section_type[0])
1128 case 0xC1:
1129 /* Normal attributes for absolute sections. */
1130 section_type[1] = this_byte (&(ieee->h));
1131 section->flags = SEC_ALLOC;
1132 switch (section_type[1])
1134 /* AS Absolute section attributes. */
1135 case 0xD3:
1136 next_byte (&(ieee->h));
1137 section_type[2] = this_byte (&(ieee->h));
1138 switch (section_type[2])
1140 case 0xD0:
1141 /* Normal code. */
1142 next_byte (&(ieee->h));
1143 section->flags |= SEC_CODE;
1144 break;
1145 case 0xC4:
1146 /* Normal data. */
1147 next_byte (&(ieee->h));
1148 section->flags |= SEC_DATA;
1149 break;
1150 case 0xD2:
1151 next_byte (&(ieee->h));
1152 /* Normal rom data. */
1153 section->flags |= SEC_ROM | SEC_DATA;
1154 break;
1155 default:
1156 break;
1159 break;
1161 /* Named relocatable sections (type C). */
1162 case 0xC3:
1163 section_type[1] = this_byte (&(ieee->h));
1164 section->flags = SEC_ALLOC;
1165 switch (section_type[1])
1167 case 0xD0: /* Normal code (CP). */
1168 next_byte (&(ieee->h));
1169 section->flags |= SEC_CODE;
1170 break;
1171 case 0xC4: /* Normal data (CD). */
1172 next_byte (&(ieee->h));
1173 section->flags |= SEC_DATA;
1174 break;
1175 case 0xD2: /* Normal rom data (CR). */
1176 next_byte (&(ieee->h));
1177 section->flags |= SEC_ROM | SEC_DATA;
1178 break;
1179 default:
1180 break;
1184 /* Read section name, use it if non empty. */
1185 name = read_id (&ieee->h);
1186 if (name[0])
1187 section->name = name;
1189 /* Skip these fields, which we don't care about. */
1191 bfd_vma parent, brother, context;
1193 parse_int (&(ieee->h), &parent);
1194 parse_int (&(ieee->h), &brother);
1195 parse_int (&(ieee->h), &context);
1198 break;
1199 case ieee_section_alignment_enum:
1201 unsigned int section_index;
1202 bfd_vma value;
1203 asection *section;
1205 next_byte (&(ieee->h));
1206 section_index = must_parse_int (&ieee->h);
1207 section = get_section_entry (abfd, ieee, section_index);
1208 if (section_index > ieee->section_count)
1209 ieee->section_count = section_index;
1211 section->alignment_power =
1212 bfd_log2 (must_parse_int (&ieee->h));
1213 (void) parse_int (&(ieee->h), &value);
1215 break;
1216 case ieee_e2_first_byte_enum:
1218 asection *section;
1219 ieee_record_enum_type t;
1221 t = (ieee_record_enum_type) (read_2bytes (&(ieee->h)));
1222 switch (t)
1224 case ieee_section_size_enum:
1225 section = ieee->section_table[must_parse_int (&(ieee->h))];
1226 section->size = must_parse_int (&(ieee->h));
1227 break;
1228 case ieee_physical_region_size_enum:
1229 section = ieee->section_table[must_parse_int (&(ieee->h))];
1230 section->size = must_parse_int (&(ieee->h));
1231 break;
1232 case ieee_region_base_address_enum:
1233 section = ieee->section_table[must_parse_int (&(ieee->h))];
1234 section->vma = must_parse_int (&(ieee->h));
1235 section->lma = section->vma;
1236 break;
1237 case ieee_mau_size_enum:
1238 must_parse_int (&(ieee->h));
1239 must_parse_int (&(ieee->h));
1240 break;
1241 case ieee_m_value_enum:
1242 must_parse_int (&(ieee->h));
1243 must_parse_int (&(ieee->h));
1244 break;
1245 case ieee_section_base_address_enum:
1246 section = ieee->section_table[must_parse_int (&(ieee->h))];
1247 section->vma = must_parse_int (&(ieee->h));
1248 section->lma = section->vma;
1249 break;
1250 case ieee_section_offset_enum:
1251 (void) must_parse_int (&(ieee->h));
1252 (void) must_parse_int (&(ieee->h));
1253 break;
1254 default:
1255 return;
1258 break;
1259 default:
1260 return;
1266 /* Make a section for the debugging information, if any. We don't try
1267 to interpret the debugging information; we just point the section
1268 at the area in the file so that program which understand can dig it
1269 out. */
1271 static bfd_boolean
1272 ieee_slurp_debug (bfd *abfd)
1274 ieee_data_type *ieee = IEEE_DATA (abfd);
1275 asection *sec;
1276 file_ptr debug_end;
1277 flagword flags;
1279 if (ieee->w.r.debug_information_part == 0)
1280 return TRUE;
1282 flags = SEC_DEBUGGING | SEC_HAS_CONTENTS;
1283 sec = bfd_make_section_with_flags (abfd, ".debug", flags);
1284 if (sec == NULL)
1285 return FALSE;
1286 sec->filepos = ieee->w.r.debug_information_part;
1288 debug_end = ieee_part_after (ieee, ieee->w.r.debug_information_part);
1289 sec->size = debug_end - ieee->w.r.debug_information_part;
1291 return TRUE;
1294 /* Archive stuff. */
1296 static const bfd_target *
1297 ieee_archive_p (bfd *abfd)
1299 char *library;
1300 unsigned int i;
1301 unsigned char buffer[512];
1302 file_ptr buffer_offset = 0;
1303 ieee_ar_data_type *save = abfd->tdata.ieee_ar_data;
1304 ieee_ar_data_type *ieee;
1305 bfd_size_type alc_elts;
1306 ieee_ar_obstack_type *elts = NULL;
1307 bfd_size_type amt = sizeof (ieee_ar_data_type);
1309 abfd->tdata.ieee_ar_data = bfd_alloc (abfd, amt);
1310 if (!abfd->tdata.ieee_ar_data)
1311 goto error_ret_restore;
1312 ieee = IEEE_AR_DATA (abfd);
1314 /* Ignore the return value here. It doesn't matter if we don't read
1315 the entire buffer. We might have a very small ieee file. */
1316 bfd_bread ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd);
1318 ieee->h.first_byte = buffer;
1319 ieee->h.input_p = buffer;
1321 ieee->h.abfd = abfd;
1323 if (this_byte (&(ieee->h)) != Module_Beginning)
1324 goto got_wrong_format_error;
1326 next_byte (&(ieee->h));
1327 library = read_id (&(ieee->h));
1328 if (strcmp (library, "LIBRARY") != 0)
1329 goto got_wrong_format_error;
1331 /* Throw away the filename. */
1332 read_id (&(ieee->h));
1334 ieee->element_count = 0;
1335 ieee->element_index = 0;
1337 next_byte (&(ieee->h)); /* Drop the ad part. */
1338 must_parse_int (&(ieee->h)); /* And the two dummy numbers. */
1339 must_parse_int (&(ieee->h));
1341 alc_elts = 10;
1342 elts = bfd_malloc (alc_elts * sizeof *elts);
1343 if (elts == NULL)
1344 goto error_return;
1346 /* Read the index of the BB table. */
1347 while (1)
1349 int rec;
1350 ieee_ar_obstack_type *t;
1352 rec = read_2bytes (&(ieee->h));
1353 if (rec != (int) ieee_assign_value_to_variable_enum)
1354 break;
1356 if (ieee->element_count >= alc_elts)
1358 ieee_ar_obstack_type *n;
1360 alc_elts *= 2;
1361 n = bfd_realloc (elts, alc_elts * sizeof (* elts));
1362 if (n == NULL)
1363 goto error_return;
1364 elts = n;
1367 t = &elts[ieee->element_count];
1368 ieee->element_count++;
1370 must_parse_int (&(ieee->h));
1371 t->file_offset = must_parse_int (&(ieee->h));
1372 t->abfd = (bfd *) NULL;
1374 /* Make sure that we don't go over the end of the buffer. */
1375 if ((size_t) ieee_pos (IEEE_DATA (abfd)) > sizeof (buffer) / 2)
1377 /* Past half way, reseek and reprime. */
1378 buffer_offset += ieee_pos (IEEE_DATA (abfd));
1379 if (bfd_seek (abfd, buffer_offset, SEEK_SET) != 0)
1380 goto error_return;
1382 /* Again ignore return value of bfd_bread. */
1383 bfd_bread ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd);
1384 ieee->h.first_byte = buffer;
1385 ieee->h.input_p = buffer;
1389 amt = ieee->element_count;
1390 amt *= sizeof *ieee->elements;
1391 ieee->elements = bfd_alloc (abfd, amt);
1392 if (ieee->elements == NULL)
1393 goto error_return;
1395 memcpy (ieee->elements, elts, (size_t) amt);
1396 free (elts);
1397 elts = NULL;
1399 /* Now scan the area again, and replace BB offsets with file offsets. */
1400 for (i = 2; i < ieee->element_count; i++)
1402 if (bfd_seek (abfd, ieee->elements[i].file_offset, SEEK_SET) != 0)
1403 goto error_return;
1405 /* Again ignore return value of bfd_bread. */
1406 bfd_bread ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd);
1407 ieee->h.first_byte = buffer;
1408 ieee->h.input_p = buffer;
1410 next_byte (&(ieee->h)); /* Drop F8. */
1411 next_byte (&(ieee->h)); /* Drop 14. */
1412 must_parse_int (&(ieee->h)); /* Drop size of block. */
1414 if (must_parse_int (&(ieee->h)) != 0)
1415 /* This object has been deleted. */
1416 ieee->elements[i].file_offset = 0;
1417 else
1418 ieee->elements[i].file_offset = must_parse_int (&(ieee->h));
1421 /* abfd->has_armap = ;*/
1423 return abfd->xvec;
1425 got_wrong_format_error:
1426 bfd_set_error (bfd_error_wrong_format);
1427 error_return:
1428 if (elts != NULL)
1429 free (elts);
1430 bfd_release (abfd, ieee);
1431 error_ret_restore:
1432 abfd->tdata.ieee_ar_data = save;
1434 return NULL;
1437 static bfd_boolean
1438 ieee_mkobject (bfd *abfd)
1440 bfd_size_type amt;
1442 output_ptr_start = NULL;
1443 output_ptr = NULL;
1444 output_ptr_end = NULL;
1445 input_ptr_start = NULL;
1446 input_ptr = NULL;
1447 input_ptr_end = NULL;
1448 input_bfd = NULL;
1449 output_bfd = NULL;
1450 output_buffer = 0;
1451 amt = sizeof (ieee_data_type);
1452 abfd->tdata.ieee_data = bfd_zalloc (abfd, amt);
1453 return abfd->tdata.ieee_data != NULL;
1456 static bfd_boolean
1457 do_one (ieee_data_type *ieee,
1458 ieee_per_section_type *current_map,
1459 unsigned char *location_ptr,
1460 asection *s,
1461 int iterations)
1463 switch (this_byte (&(ieee->h)))
1465 case ieee_load_constant_bytes_enum:
1467 unsigned int number_of_maus;
1468 unsigned int i;
1470 next_byte (&(ieee->h));
1471 number_of_maus = must_parse_int (&(ieee->h));
1473 for (i = 0; i < number_of_maus; i++)
1475 location_ptr[current_map->pc++] = this_byte (&(ieee->h));
1476 next_byte (&(ieee->h));
1479 break;
1481 case ieee_load_with_relocation_enum:
1483 bfd_boolean loop = TRUE;
1485 next_byte (&(ieee->h));
1486 while (loop)
1488 switch (this_byte (&(ieee->h)))
1490 case ieee_variable_R_enum:
1492 case ieee_function_signed_open_b_enum:
1493 case ieee_function_unsigned_open_b_enum:
1494 case ieee_function_either_open_b_enum:
1496 unsigned int extra = 4;
1497 bfd_boolean pcrel = FALSE;
1498 asection *section;
1499 ieee_reloc_type *r;
1501 r = bfd_alloc (ieee->h.abfd, sizeof (* r));
1502 if (!r)
1503 return FALSE;
1505 *(current_map->reloc_tail_ptr) = r;
1506 current_map->reloc_tail_ptr = &r->next;
1507 r->next = (ieee_reloc_type *) NULL;
1508 next_byte (&(ieee->h));
1509 /* abort();*/
1510 r->relent.sym_ptr_ptr = 0;
1511 parse_expression (ieee,
1512 &r->relent.addend,
1513 &r->symbol,
1514 &pcrel, &extra, &section);
1515 r->relent.address = current_map->pc;
1516 s->flags |= SEC_RELOC;
1517 s->owner->flags |= HAS_RELOC;
1518 s->reloc_count++;
1519 if (r->relent.sym_ptr_ptr == NULL && section != NULL)
1520 r->relent.sym_ptr_ptr = section->symbol_ptr_ptr;
1522 if (this_byte (&(ieee->h)) == (int) ieee_comma)
1524 next_byte (&(ieee->h));
1525 /* Fetch number of bytes to pad. */
1526 extra = must_parse_int (&(ieee->h));
1529 switch (this_byte (&(ieee->h)))
1531 case ieee_function_signed_close_b_enum:
1532 next_byte (&(ieee->h));
1533 break;
1534 case ieee_function_unsigned_close_b_enum:
1535 next_byte (&(ieee->h));
1536 break;
1537 case ieee_function_either_close_b_enum:
1538 next_byte (&(ieee->h));
1539 break;
1540 default:
1541 break;
1543 /* Build a relocation entry for this type. */
1544 /* If pc rel then stick -ve pc into instruction
1545 and take out of reloc ..
1547 I've changed this. It's all too complicated. I
1548 keep 0 in the instruction now. */
1550 switch (extra)
1552 case 0:
1553 case 4:
1555 if (pcrel)
1557 #if KEEPMINUSPCININST
1558 bfd_put_32 (ieee->h.abfd, -current_map->pc,
1559 location_ptr + current_map->pc);
1560 r->relent.howto = &rel32_howto;
1561 r->relent.addend -= current_map->pc;
1562 #else
1563 bfd_put_32 (ieee->h.abfd, (bfd_vma) 0, location_ptr +
1564 current_map->pc);
1565 r->relent.howto = &rel32_howto;
1566 #endif
1568 else
1570 bfd_put_32 (ieee->h.abfd, (bfd_vma) 0,
1571 location_ptr + current_map->pc);
1572 r->relent.howto = &abs32_howto;
1574 current_map->pc += 4;
1575 break;
1576 case 2:
1577 if (pcrel)
1579 #if KEEPMINUSPCININST
1580 bfd_put_16 (ieee->h.abfd, (bfd_vma) -current_map->pc,
1581 location_ptr + current_map->pc);
1582 r->relent.addend -= current_map->pc;
1583 r->relent.howto = &rel16_howto;
1584 #else
1586 bfd_put_16 (ieee->h.abfd, (bfd_vma) 0,
1587 location_ptr + current_map->pc);
1588 r->relent.howto = &rel16_howto;
1589 #endif
1592 else
1594 bfd_put_16 (ieee->h.abfd, (bfd_vma) 0,
1595 location_ptr + current_map->pc);
1596 r->relent.howto = &abs16_howto;
1598 current_map->pc += 2;
1599 break;
1600 case 1:
1601 if (pcrel)
1603 #if KEEPMINUSPCININST
1604 bfd_put_8 (ieee->h.abfd, (int) (-current_map->pc), location_ptr + current_map->pc);
1605 r->relent.addend -= current_map->pc;
1606 r->relent.howto = &rel8_howto;
1607 #else
1608 bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1609 r->relent.howto = &rel8_howto;
1610 #endif
1612 else
1614 bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1615 r->relent.howto = &abs8_howto;
1617 current_map->pc += 1;
1618 break;
1620 default:
1621 BFD_FAIL ();
1622 return FALSE;
1625 break;
1626 default:
1628 bfd_vma this_size;
1630 if (parse_int (&(ieee->h), &this_size))
1632 unsigned int i;
1634 for (i = 0; i < this_size; i++)
1636 location_ptr[current_map->pc++] = this_byte (&(ieee->h));
1637 next_byte (&(ieee->h));
1640 else
1641 loop = FALSE;
1645 /* Prevent more than the first load-item of an LR record
1646 from being repeated (MRI convention). */
1647 if (iterations != 1)
1648 loop = FALSE;
1652 return TRUE;
1655 /* Read in all the section data and relocation stuff too. */
1657 static bfd_boolean
1658 ieee_slurp_section_data (bfd *abfd)
1660 bfd_byte *location_ptr = (bfd_byte *) NULL;
1661 ieee_data_type *ieee = IEEE_DATA (abfd);
1662 unsigned int section_number;
1663 ieee_per_section_type *current_map = NULL;
1664 asection *s;
1666 /* Seek to the start of the data area. */
1667 if (ieee->read_data)
1668 return TRUE;
1669 ieee->read_data = TRUE;
1670 ieee_seek (ieee, ieee->w.r.data_part);
1672 /* Allocate enough space for all the section contents. */
1673 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
1675 ieee_per_section_type *per = ieee_per_section (s);
1676 arelent **relpp;
1678 if ((s->flags & SEC_DEBUGGING) != 0)
1679 continue;
1680 per->data = bfd_alloc (ieee->h.abfd, s->size);
1681 if (!per->data)
1682 return FALSE;
1683 relpp = &s->relocation;
1684 per->reloc_tail_ptr = (ieee_reloc_type **) relpp;
1687 while (TRUE)
1689 switch (this_byte (&(ieee->h)))
1691 /* IF we see anything strange then quit. */
1692 default:
1693 return TRUE;
1695 case ieee_set_current_section_enum:
1696 next_byte (&(ieee->h));
1697 section_number = must_parse_int (&(ieee->h));
1698 s = ieee->section_table[section_number];
1699 s->flags |= SEC_LOAD | SEC_HAS_CONTENTS;
1700 current_map = ieee_per_section (s);
1701 location_ptr = current_map->data - s->vma;
1702 /* The document I have says that Microtec's compilers reset
1703 this after a sec section, even though the standard says not
1704 to, SO... */
1705 current_map->pc = s->vma;
1706 break;
1708 case ieee_e2_first_byte_enum:
1709 next_byte (&(ieee->h));
1710 switch (this_byte (&(ieee->h)))
1712 case ieee_set_current_pc_enum & 0xff:
1714 bfd_vma value;
1715 ieee_symbol_index_type symbol;
1716 unsigned int extra;
1717 bfd_boolean pcrel;
1719 next_byte (&(ieee->h));
1720 must_parse_int (&(ieee->h)); /* Throw away section #. */
1721 parse_expression (ieee, &value,
1722 &symbol,
1723 &pcrel, &extra,
1725 current_map->pc = value;
1726 BFD_ASSERT ((unsigned) (value - s->vma) <= s->size);
1728 break;
1730 case ieee_value_starting_address_enum & 0xff:
1731 next_byte (&(ieee->h));
1732 if (this_byte (&(ieee->h)) == ieee_function_either_open_b_enum)
1733 next_byte (&(ieee->h));
1734 abfd->start_address = must_parse_int (&(ieee->h));
1735 /* We've got to the end of the data now - */
1736 return TRUE;
1737 default:
1738 BFD_FAIL ();
1739 return FALSE;
1741 break;
1742 case ieee_repeat_data_enum:
1744 /* Repeat the following LD or LR n times - we do this by
1745 remembering the stream pointer before running it and
1746 resetting it and running it n times. We special case
1747 the repetition of a repeat_data/load_constant. */
1748 unsigned int iterations;
1749 unsigned char *start;
1751 next_byte (&(ieee->h));
1752 iterations = must_parse_int (&(ieee->h));
1753 start = ieee->h.input_p;
1754 if (start[0] == (int) ieee_load_constant_bytes_enum
1755 && start[1] == 1)
1757 while (iterations != 0)
1759 location_ptr[current_map->pc++] = start[2];
1760 iterations--;
1762 next_byte (&(ieee->h));
1763 next_byte (&(ieee->h));
1764 next_byte (&(ieee->h));
1766 else
1768 while (iterations != 0)
1770 ieee->h.input_p = start;
1771 if (!do_one (ieee, current_map, location_ptr, s,
1772 (int) iterations))
1773 return FALSE;
1774 iterations--;
1778 break;
1779 case ieee_load_constant_bytes_enum:
1780 case ieee_load_with_relocation_enum:
1781 if (!do_one (ieee, current_map, location_ptr, s, 1))
1782 return FALSE;
1787 static const bfd_target *
1788 ieee_object_p (bfd *abfd)
1790 char *processor;
1791 unsigned int part;
1792 ieee_data_type *ieee;
1793 unsigned char buffer[300];
1794 ieee_data_type *save = IEEE_DATA (abfd);
1795 bfd_size_type amt;
1797 abfd->tdata.ieee_data = 0;
1798 ieee_mkobject (abfd);
1800 ieee = IEEE_DATA (abfd);
1801 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
1802 goto fail;
1803 /* Read the first few bytes in to see if it makes sense. Ignore
1804 bfd_bread return value; The file might be very small. */
1805 bfd_bread ((void *) buffer, (bfd_size_type) sizeof (buffer), abfd);
1807 ieee->h.input_p = buffer;
1808 if (this_byte_and_next (&(ieee->h)) != Module_Beginning)
1809 goto got_wrong_format;
1811 ieee->read_symbols = FALSE;
1812 ieee->read_data = FALSE;
1813 ieee->section_count = 0;
1814 ieee->external_symbol_max_index = 0;
1815 ieee->external_symbol_min_index = IEEE_PUBLIC_BASE;
1816 ieee->external_reference_min_index = IEEE_REFERENCE_BASE;
1817 ieee->external_reference_max_index = 0;
1818 ieee->h.abfd = abfd;
1819 ieee->section_table = NULL;
1820 ieee->section_table_size = 0;
1822 processor = ieee->mb.processor = read_id (&(ieee->h));
1823 if (strcmp (processor, "LIBRARY") == 0)
1824 goto got_wrong_format;
1825 ieee->mb.module_name = read_id (&(ieee->h));
1826 if (abfd->filename == (const char *) NULL)
1827 abfd->filename = ieee->mb.module_name;
1829 /* Determine the architecture and machine type of the object file. */
1831 const bfd_arch_info_type *arch;
1832 char family[10];
1834 /* IEEE does not specify the format of the processor identification
1835 string, so the compiler is free to put in it whatever it wants.
1836 We try here to recognize different processors belonging to the
1837 m68k family. Code for other processors can be added here. */
1838 if ((processor[0] == '6') && (processor[1] == '8'))
1840 if (processor[2] == '3') /* 683xx integrated processors. */
1842 switch (processor[3])
1844 case '0': /* 68302, 68306, 68307 */
1845 case '2': /* 68322, 68328 */
1846 case '5': /* 68356 */
1847 strcpy (family, "68000"); /* MC68000-based controllers. */
1848 break;
1850 case '3': /* 68330, 68331, 68332, 68333,
1851 68334, 68335, 68336, 68338 */
1852 case '6': /* 68360 */
1853 case '7': /* 68376 */
1854 strcpy (family, "68332"); /* CPU32 and CPU32+ */
1855 break;
1857 case '4':
1858 if (processor[4] == '9') /* 68349 */
1859 strcpy (family, "68030"); /* CPU030 */
1860 else /* 68340, 68341 */
1861 strcpy (family, "68332"); /* CPU32 and CPU32+ */
1862 break;
1864 default: /* Does not exist yet. */
1865 strcpy (family, "68332"); /* Guess it will be CPU32 */
1868 else if (TOUPPER (processor[3]) == 'F') /* 68F333 */
1869 strcpy (family, "68332"); /* CPU32 */
1870 else if ((TOUPPER (processor[3]) == 'C') /* Embedded controllers. */
1871 && ((TOUPPER (processor[2]) == 'E')
1872 || (TOUPPER (processor[2]) == 'H')
1873 || (TOUPPER (processor[2]) == 'L')))
1875 strcpy (family, "68");
1876 strncat (family, processor + 4, 7);
1877 family[9] = '\0';
1879 else /* "Regular" processors. */
1881 strncpy (family, processor, 9);
1882 family[9] = '\0';
1885 else if ((CONST_STRNEQ (processor, "cpu32")) /* CPU32 and CPU32+ */
1886 || (CONST_STRNEQ (processor, "CPU32")))
1887 strcpy (family, "68332");
1888 else
1890 strncpy (family, processor, 9);
1891 family[9] = '\0';
1894 arch = bfd_scan_arch (family);
1895 if (arch == 0)
1896 goto got_wrong_format;
1897 abfd->arch_info = arch;
1900 if (this_byte (&(ieee->h)) != (int) ieee_address_descriptor_enum)
1901 goto fail;
1903 next_byte (&(ieee->h));
1905 if (! parse_int (&(ieee->h), &ieee->ad.number_of_bits_mau))
1906 goto fail;
1908 if (! parse_int (&(ieee->h), &ieee->ad.number_of_maus_in_address))
1909 goto fail;
1911 /* If there is a byte order info, take it. */
1912 if (this_byte (&(ieee->h)) == (int) ieee_variable_L_enum
1913 || this_byte (&(ieee->h)) == (int) ieee_variable_M_enum)
1914 next_byte (&(ieee->h));
1916 for (part = 0; part < N_W_VARIABLES; part++)
1918 bfd_boolean ok;
1920 if (read_2bytes (&(ieee->h)) != (int) ieee_assign_value_to_variable_enum)
1921 goto fail;
1923 if (this_byte_and_next (&(ieee->h)) != part)
1924 goto fail;
1926 ieee->w.offset[part] = parse_i (&(ieee->h), &ok);
1927 if (! ok)
1928 goto fail;
1931 if (ieee->w.r.external_part != 0)
1932 abfd->flags = HAS_SYMS;
1934 /* By now we know that this is a real IEEE file, we're going to read
1935 the whole thing into memory so that we can run up and down it
1936 quickly. We can work out how big the file is from the trailer
1937 record. */
1939 amt = ieee->w.r.me_record + 1;
1940 IEEE_DATA (abfd)->h.first_byte = bfd_alloc (ieee->h.abfd, amt);
1941 if (!IEEE_DATA (abfd)->h.first_byte)
1942 goto fail;
1943 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
1944 goto fail;
1945 /* FIXME: Check return value. I'm not sure whether it needs to read
1946 the entire buffer or not. */
1947 bfd_bread ((void *) (IEEE_DATA (abfd)->h.first_byte),
1948 (bfd_size_type) ieee->w.r.me_record + 1, abfd);
1950 ieee_slurp_sections (abfd);
1952 if (! ieee_slurp_debug (abfd))
1953 goto fail;
1955 /* Parse section data to activate file and section flags implied by
1956 section contents. */
1957 if (! ieee_slurp_section_data (abfd))
1958 goto fail;
1960 return abfd->xvec;
1961 got_wrong_format:
1962 bfd_set_error (bfd_error_wrong_format);
1963 fail:
1964 bfd_release (abfd, ieee);
1965 abfd->tdata.ieee_data = save;
1966 return (const bfd_target *) NULL;
1969 static void
1970 ieee_get_symbol_info (bfd *ignore_abfd ATTRIBUTE_UNUSED,
1971 asymbol *symbol,
1972 symbol_info *ret)
1974 bfd_symbol_info (symbol, ret);
1975 if (symbol->name[0] == ' ')
1976 ret->name = "* empty table entry ";
1977 if (!symbol->section)
1978 ret->type = (symbol->flags & BSF_LOCAL) ? 'a' : 'A';
1981 static void
1982 ieee_print_symbol (bfd *abfd,
1983 void * afile,
1984 asymbol *symbol,
1985 bfd_print_symbol_type how)
1987 FILE *file = (FILE *) afile;
1989 switch (how)
1991 case bfd_print_symbol_name:
1992 fprintf (file, "%s", symbol->name);
1993 break;
1994 case bfd_print_symbol_more:
1995 BFD_FAIL ();
1996 break;
1997 case bfd_print_symbol_all:
1999 const char *section_name =
2000 (symbol->section == (asection *) NULL
2001 ? "*abs"
2002 : symbol->section->name);
2004 if (symbol->name[0] == ' ')
2005 fprintf (file, "* empty table entry ");
2006 else
2008 bfd_print_symbol_vandf (abfd, (void *) file, symbol);
2010 fprintf (file, " %-5s %04x %02x %s",
2011 section_name,
2012 (unsigned) ieee_symbol (symbol)->index,
2013 (unsigned) 0,
2014 symbol->name);
2017 break;
2021 static bfd_boolean
2022 ieee_new_section_hook (bfd *abfd, asection *newsect)
2024 if (!newsect->used_by_bfd)
2026 newsect->used_by_bfd = bfd_alloc (abfd, sizeof (ieee_per_section_type));
2027 if (!newsect->used_by_bfd)
2028 return FALSE;
2030 ieee_per_section (newsect)->data = NULL;
2031 ieee_per_section (newsect)->section = newsect;
2032 return _bfd_generic_new_section_hook (abfd, newsect);
2035 static long
2036 ieee_get_reloc_upper_bound (bfd *abfd, sec_ptr asect)
2038 if ((asect->flags & SEC_DEBUGGING) != 0)
2039 return 0;
2040 if (! ieee_slurp_section_data (abfd))
2041 return -1;
2042 return (asect->reloc_count + 1) * sizeof (arelent *);
2045 static bfd_boolean
2046 ieee_get_section_contents (bfd *abfd,
2047 sec_ptr section,
2048 void * location,
2049 file_ptr offset,
2050 bfd_size_type count)
2052 ieee_per_section_type *p = ieee_per_section (section);
2053 if ((section->flags & SEC_DEBUGGING) != 0)
2054 return _bfd_generic_get_section_contents (abfd, section, location,
2055 offset, count);
2056 ieee_slurp_section_data (abfd);
2057 (void) memcpy ((void *) location, (void *) (p->data + offset), (unsigned) count);
2058 return TRUE;
2061 static long
2062 ieee_canonicalize_reloc (bfd *abfd,
2063 sec_ptr section,
2064 arelent **relptr,
2065 asymbol **symbols)
2067 ieee_reloc_type *src = (ieee_reloc_type *) (section->relocation);
2068 ieee_data_type *ieee = IEEE_DATA (abfd);
2070 if ((section->flags & SEC_DEBUGGING) != 0)
2071 return 0;
2073 while (src != (ieee_reloc_type *) NULL)
2075 /* Work out which symbol to attach it this reloc to. */
2076 switch (src->symbol.letter)
2078 case 'I':
2079 src->relent.sym_ptr_ptr =
2080 symbols + src->symbol.index + ieee->external_symbol_base_offset;
2081 break;
2082 case 'X':
2083 src->relent.sym_ptr_ptr =
2084 symbols + src->symbol.index + ieee->external_reference_base_offset;
2085 break;
2086 case 0:
2087 if (src->relent.sym_ptr_ptr != NULL)
2088 src->relent.sym_ptr_ptr =
2089 src->relent.sym_ptr_ptr[0]->section->symbol_ptr_ptr;
2090 break;
2091 default:
2093 BFD_FAIL ();
2095 *relptr++ = &src->relent;
2096 src = src->next;
2098 *relptr = NULL;
2099 return section->reloc_count;
2102 static int
2103 comp (const void * ap, const void * bp)
2105 arelent *a = *((arelent **) ap);
2106 arelent *b = *((arelent **) bp);
2107 return a->address - b->address;
2110 /* Write the section headers. */
2112 static bfd_boolean
2113 ieee_write_section_part (bfd *abfd)
2115 ieee_data_type *ieee = IEEE_DATA (abfd);
2116 asection *s;
2118 ieee->w.r.section_part = bfd_tell (abfd);
2119 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
2121 if (! bfd_is_abs_section (s)
2122 && (s->flags & SEC_DEBUGGING) == 0)
2124 if (! ieee_write_byte (abfd, ieee_section_type_enum)
2125 || ! ieee_write_byte (abfd,
2126 (bfd_byte) (s->index
2127 + IEEE_SECTION_NUMBER_BASE)))
2128 return FALSE;
2130 if (abfd->flags & EXEC_P)
2132 /* This image is executable, so output absolute sections. */
2133 if (! ieee_write_byte (abfd, ieee_variable_A_enum)
2134 || ! ieee_write_byte (abfd, ieee_variable_S_enum))
2135 return FALSE;
2137 else
2139 if (! ieee_write_byte (abfd, ieee_variable_C_enum))
2140 return FALSE;
2143 switch (s->flags & (SEC_CODE | SEC_DATA | SEC_ROM))
2145 case SEC_CODE | SEC_LOAD:
2146 case SEC_CODE:
2147 if (! ieee_write_byte (abfd, ieee_variable_P_enum))
2148 return FALSE;
2149 break;
2150 case SEC_DATA:
2151 default:
2152 if (! ieee_write_byte (abfd, ieee_variable_D_enum))
2153 return FALSE;
2154 break;
2155 case SEC_ROM:
2156 case SEC_ROM | SEC_DATA:
2157 case SEC_ROM | SEC_LOAD:
2158 case SEC_ROM | SEC_DATA | SEC_LOAD:
2159 if (! ieee_write_byte (abfd, ieee_variable_R_enum))
2160 return FALSE;
2164 if (! ieee_write_id (abfd, s->name))
2165 return FALSE;
2166 /* Alignment. */
2167 if (! ieee_write_byte (abfd, ieee_section_alignment_enum)
2168 || ! ieee_write_byte (abfd,
2169 (bfd_byte) (s->index
2170 + IEEE_SECTION_NUMBER_BASE))
2171 || ! ieee_write_int (abfd, (bfd_vma) 1 << s->alignment_power))
2172 return FALSE;
2174 /* Size. */
2175 if (! ieee_write_2bytes (abfd, ieee_section_size_enum)
2176 || ! ieee_write_byte (abfd,
2177 (bfd_byte) (s->index
2178 + IEEE_SECTION_NUMBER_BASE))
2179 || ! ieee_write_int (abfd, s->size))
2180 return FALSE;
2181 if (abfd->flags & EXEC_P)
2183 /* Relocateable sections don't have asl records. */
2184 /* Vma. */
2185 if (! ieee_write_2bytes (abfd, ieee_section_base_address_enum)
2186 || ! ieee_write_byte (abfd,
2187 ((bfd_byte)
2188 (s->index
2189 + IEEE_SECTION_NUMBER_BASE)))
2190 || ! ieee_write_int (abfd, s->lma))
2191 return FALSE;
2196 return TRUE;
2199 static bfd_boolean
2200 do_with_relocs (bfd *abfd, asection *s)
2202 unsigned int number_of_maus_in_address =
2203 bfd_arch_bits_per_address (abfd) / bfd_arch_bits_per_byte (abfd);
2204 unsigned int relocs_to_go = s->reloc_count;
2205 bfd_byte *stream = ieee_per_section (s)->data;
2206 arelent **p = s->orelocation;
2207 bfd_size_type current_byte_index = 0;
2209 qsort (s->orelocation,
2210 relocs_to_go,
2211 sizeof (arelent **),
2212 comp);
2214 /* Output the section preheader. */
2215 if (! ieee_write_byte (abfd, ieee_set_current_section_enum)
2216 || ! ieee_write_byte (abfd,
2217 (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE))
2218 || ! ieee_write_2bytes (abfd, ieee_set_current_pc_enum)
2219 || ! ieee_write_byte (abfd,
2220 (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE)))
2221 return FALSE;
2223 if ((abfd->flags & EXEC_P) != 0 && relocs_to_go == 0)
2225 if (! ieee_write_int (abfd, s->lma))
2226 return FALSE;
2228 else
2230 if (! ieee_write_expression (abfd, (bfd_vma) 0, s->symbol, 0, 0))
2231 return FALSE;
2234 if (relocs_to_go == 0)
2236 /* If there aren't any relocations then output the load constant
2237 byte opcode rather than the load with relocation opcode. */
2238 while (current_byte_index < s->size)
2240 bfd_size_type run;
2241 unsigned int MAXRUN = 127;
2243 run = MAXRUN;
2244 if (run > s->size - current_byte_index)
2245 run = s->size - current_byte_index;
2247 if (run != 0)
2249 if (! ieee_write_byte (abfd, ieee_load_constant_bytes_enum))
2250 return FALSE;
2251 /* Output a stream of bytes. */
2252 if (! ieee_write_int (abfd, run))
2253 return FALSE;
2254 if (bfd_bwrite ((void *) (stream + current_byte_index), run, abfd)
2255 != run)
2256 return FALSE;
2257 current_byte_index += run;
2261 else
2263 if (! ieee_write_byte (abfd, ieee_load_with_relocation_enum))
2264 return FALSE;
2266 /* Output the data stream as the longest sequence of bytes
2267 possible, allowing for the a reasonable packet size and
2268 relocation stuffs. */
2269 if (stream == NULL)
2271 /* Outputting a section without data, fill it up. */
2272 stream = bfd_zalloc (abfd, s->size);
2273 if (!stream)
2274 return FALSE;
2276 while (current_byte_index < s->size)
2278 bfd_size_type run;
2279 unsigned int MAXRUN = 127;
2281 if (relocs_to_go)
2283 run = (*p)->address - current_byte_index;
2284 if (run > MAXRUN)
2285 run = MAXRUN;
2287 else
2288 run = MAXRUN;
2290 if (run > s->size - current_byte_index)
2291 run = s->size - current_byte_index;
2293 if (run != 0)
2295 /* Output a stream of bytes. */
2296 if (! ieee_write_int (abfd, run))
2297 return FALSE;
2298 if (bfd_bwrite ((void *) (stream + current_byte_index), run, abfd)
2299 != run)
2300 return FALSE;
2301 current_byte_index += run;
2304 /* Output any relocations here. */
2305 if (relocs_to_go && (*p) && (*p)->address == current_byte_index)
2307 while (relocs_to_go
2308 && (*p) && (*p)->address == current_byte_index)
2310 arelent *r = *p;
2311 bfd_signed_vma ov;
2312 switch (r->howto->size)
2314 case 2:
2315 ov = bfd_get_signed_32 (abfd,
2316 stream + current_byte_index);
2317 current_byte_index += 4;
2318 break;
2319 case 1:
2320 ov = bfd_get_signed_16 (abfd,
2321 stream + current_byte_index);
2322 current_byte_index += 2;
2323 break;
2324 case 0:
2325 ov = bfd_get_signed_8 (abfd,
2326 stream + current_byte_index);
2327 current_byte_index++;
2328 break;
2329 default:
2330 ov = 0;
2331 BFD_FAIL ();
2332 return FALSE;
2335 ov &= r->howto->src_mask;
2337 if (r->howto->pc_relative
2338 && ! r->howto->pcrel_offset)
2339 ov += r->address;
2341 if (! ieee_write_byte (abfd,
2342 ieee_function_either_open_b_enum))
2343 return FALSE;
2345 if (r->sym_ptr_ptr != (asymbol **) NULL)
2347 if (! ieee_write_expression (abfd, r->addend + ov,
2348 *(r->sym_ptr_ptr),
2349 r->howto->pc_relative,
2350 (unsigned) s->index))
2351 return FALSE;
2353 else
2355 if (! ieee_write_expression (abfd, r->addend + ov,
2356 (asymbol *) NULL,
2357 r->howto->pc_relative,
2358 (unsigned) s->index))
2359 return FALSE;
2362 if (number_of_maus_in_address
2363 != bfd_get_reloc_size (r->howto))
2365 bfd_vma rsize = bfd_get_reloc_size (r->howto);
2366 if (! ieee_write_int (abfd, rsize))
2367 return FALSE;
2369 if (! ieee_write_byte (abfd,
2370 ieee_function_either_close_b_enum))
2371 return FALSE;
2373 relocs_to_go--;
2374 p++;
2381 return TRUE;
2384 /* If there are no relocations in the output section then we can be
2385 clever about how we write. We block items up into a max of 127
2386 bytes. */
2388 static bfd_boolean
2389 do_as_repeat (bfd *abfd, asection *s)
2391 if (s->size)
2393 if (! ieee_write_byte (abfd, ieee_set_current_section_enum)
2394 || ! ieee_write_byte (abfd,
2395 (bfd_byte) (s->index
2396 + IEEE_SECTION_NUMBER_BASE))
2397 || ! ieee_write_byte (abfd, ieee_set_current_pc_enum >> 8)
2398 || ! ieee_write_byte (abfd, ieee_set_current_pc_enum & 0xff)
2399 || ! ieee_write_byte (abfd,
2400 (bfd_byte) (s->index
2401 + IEEE_SECTION_NUMBER_BASE)))
2402 return FALSE;
2404 if ((abfd->flags & EXEC_P) != 0)
2406 if (! ieee_write_int (abfd, s->lma))
2407 return FALSE;
2409 else
2411 if (! ieee_write_expression (abfd, (bfd_vma) 0, s->symbol, 0, 0))
2412 return FALSE;
2415 if (! ieee_write_byte (abfd, ieee_repeat_data_enum)
2416 || ! ieee_write_int (abfd, s->size)
2417 || ! ieee_write_byte (abfd, ieee_load_constant_bytes_enum)
2418 || ! ieee_write_byte (abfd, 1)
2419 || ! ieee_write_byte (abfd, 0))
2420 return FALSE;
2423 return TRUE;
2426 static bfd_boolean
2427 do_without_relocs (bfd *abfd, asection *s)
2429 bfd_byte *stream = ieee_per_section (s)->data;
2431 if (stream == 0 || ((s->flags & SEC_LOAD) == 0))
2433 if (! do_as_repeat (abfd, s))
2434 return FALSE;
2436 else
2438 unsigned int i;
2440 for (i = 0; i < s->size; i++)
2442 if (stream[i] != 0)
2444 if (! do_with_relocs (abfd, s))
2445 return FALSE;
2446 return TRUE;
2449 if (! do_as_repeat (abfd, s))
2450 return FALSE;
2453 return TRUE;
2456 static void
2457 fill (void)
2459 bfd_size_type amt = input_ptr_end - input_ptr_start;
2460 /* FIXME: Check return value. I'm not sure whether it needs to read
2461 the entire buffer or not. */
2462 bfd_bread ((void *) input_ptr_start, amt, input_bfd);
2463 input_ptr = input_ptr_start;
2466 static void
2467 flush (void)
2469 bfd_size_type amt = output_ptr - output_ptr_start;
2471 if (bfd_bwrite ((void *) (output_ptr_start), amt, output_bfd) != amt)
2472 abort ();
2473 output_ptr = output_ptr_start;
2474 output_buffer++;
2477 #define THIS() ( *input_ptr )
2478 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill (); }
2479 #define OUT(x) { *output_ptr++ = (x); if (output_ptr == output_ptr_end) flush (); }
2481 static void
2482 write_int (int value)
2484 if (value >= 0 && value <= 127)
2486 OUT (value);
2488 else
2490 unsigned int length;
2492 /* How many significant bytes ? */
2493 /* FIXME FOR LONGER INTS. */
2494 if (value & 0xff000000)
2495 length = 4;
2496 else if (value & 0x00ff0000)
2497 length = 3;
2498 else if (value & 0x0000ff00)
2499 length = 2;
2500 else
2501 length = 1;
2503 OUT ((int) ieee_number_repeat_start_enum + length);
2504 switch (length)
2506 case 4:
2507 OUT (value >> 24);
2508 case 3:
2509 OUT (value >> 16);
2510 case 2:
2511 OUT (value >> 8);
2512 case 1:
2513 OUT (value);
2518 static void
2519 copy_id (void)
2521 int length = THIS ();
2522 char ch;
2524 OUT (length);
2525 NEXT ();
2526 while (length--)
2528 ch = THIS ();
2529 OUT (ch);
2530 NEXT ();
2534 #define VAR(x) ((x | 0x80))
2535 static void
2536 copy_expression (void)
2538 int stack[10];
2539 int *tos = stack;
2540 int value;
2542 while (1)
2544 switch (THIS ())
2546 case 0x84:
2547 NEXT ();
2548 value = THIS ();
2549 NEXT ();
2550 value = (value << 8) | THIS ();
2551 NEXT ();
2552 value = (value << 8) | THIS ();
2553 NEXT ();
2554 value = (value << 8) | THIS ();
2555 NEXT ();
2556 *tos++ = value;
2557 break;
2558 case 0x83:
2559 NEXT ();
2560 value = THIS ();
2561 NEXT ();
2562 value = (value << 8) | THIS ();
2563 NEXT ();
2564 value = (value << 8) | THIS ();
2565 NEXT ();
2566 *tos++ = value;
2567 break;
2568 case 0x82:
2569 NEXT ();
2570 value = THIS ();
2571 NEXT ();
2572 value = (value << 8) | THIS ();
2573 NEXT ();
2574 *tos++ = value;
2575 break;
2576 case 0x81:
2577 NEXT ();
2578 value = THIS ();
2579 NEXT ();
2580 *tos++ = value;
2581 break;
2582 case 0x80:
2583 NEXT ();
2584 *tos++ = 0;
2585 break;
2586 default:
2587 if (THIS () > 0x84)
2589 /* Not a number, just bug out with the answer. */
2590 write_int (*(--tos));
2591 return;
2593 *tos++ = THIS ();
2594 NEXT ();
2595 break;
2596 case 0xa5:
2597 /* PLUS anything. */
2598 value = *(--tos);
2599 value += *(--tos);
2600 *tos++ = value;
2601 NEXT ();
2602 break;
2603 case VAR ('R'):
2605 int section_number;
2606 ieee_data_type *ieee;
2607 asection *s;
2609 NEXT ();
2610 section_number = THIS ();
2612 NEXT ();
2613 ieee = IEEE_DATA (input_bfd);
2614 s = ieee->section_table[section_number];
2615 value = 0;
2616 if (s->output_section)
2617 value = s->output_section->lma;
2618 value += s->output_offset;
2619 *tos++ = value;
2621 break;
2622 case 0x90:
2624 NEXT ();
2625 write_int (*(--tos));
2626 OUT (0x90);
2627 return;
2633 /* Drop the int in the buffer, and copy a null into the gap, which we
2634 will overwrite later. */
2636 static void
2637 fill_int (struct output_buffer_struct *buf)
2639 if (buf->buffer == output_buffer)
2641 /* Still a chance to output the size. */
2642 int value = output_ptr - buf->ptrp + 3;
2643 buf->ptrp[0] = value >> 24;
2644 buf->ptrp[1] = value >> 16;
2645 buf->ptrp[2] = value >> 8;
2646 buf->ptrp[3] = value >> 0;
2650 static void
2651 drop_int (struct output_buffer_struct *buf)
2653 int type = THIS ();
2654 int ch;
2656 if (type <= 0x84)
2658 NEXT ();
2659 switch (type)
2661 case 0x84:
2662 ch = THIS ();
2663 NEXT ();
2664 case 0x83:
2665 ch = THIS ();
2666 NEXT ();
2667 case 0x82:
2668 ch = THIS ();
2669 NEXT ();
2670 case 0x81:
2671 ch = THIS ();
2672 NEXT ();
2673 case 0x80:
2674 break;
2677 (void) ch;
2678 OUT (0x84);
2679 buf->ptrp = output_ptr;
2680 buf->buffer = output_buffer;
2681 OUT (0);
2682 OUT (0);
2683 OUT (0);
2684 OUT (0);
2687 static void
2688 copy_int (void)
2690 int type = THIS ();
2691 int ch;
2692 if (type <= 0x84)
2694 OUT (type);
2695 NEXT ();
2696 switch (type)
2698 case 0x84:
2699 ch = THIS ();
2700 NEXT ();
2701 OUT (ch);
2702 case 0x83:
2703 ch = THIS ();
2704 NEXT ();
2705 OUT (ch);
2706 case 0x82:
2707 ch = THIS ();
2708 NEXT ();
2709 OUT (ch);
2710 case 0x81:
2711 ch = THIS ();
2712 NEXT ();
2713 OUT (ch);
2714 case 0x80:
2715 break;
2720 #define ID copy_id ()
2721 #define INT copy_int ()
2722 #define EXP copy_expression ()
2723 #define INTn(q) copy_int ()
2724 #define EXPn(q) copy_expression ()
2726 static void
2727 copy_till_end (void)
2729 int ch = THIS ();
2731 while (1)
2733 while (ch <= 0x80)
2735 OUT (ch);
2736 NEXT ();
2737 ch = THIS ();
2739 switch (ch)
2741 case 0x84:
2742 OUT (THIS ());
2743 NEXT ();
2744 case 0x83:
2745 OUT (THIS ());
2746 NEXT ();
2747 case 0x82:
2748 OUT (THIS ());
2749 NEXT ();
2750 case 0x81:
2751 OUT (THIS ());
2752 NEXT ();
2753 OUT (THIS ());
2754 NEXT ();
2756 ch = THIS ();
2757 break;
2758 default:
2759 return;
2765 static void
2766 f1_record (void)
2768 int ch;
2770 /* ATN record. */
2771 NEXT ();
2772 ch = THIS ();
2773 switch (ch)
2775 default:
2776 OUT (0xf1);
2777 OUT (ch);
2778 break;
2779 case 0xc9:
2780 NEXT ();
2781 OUT (0xf1);
2782 OUT (0xc9);
2783 INT;
2784 INT;
2785 ch = THIS ();
2786 switch (ch)
2788 case 0x16:
2789 NEXT ();
2790 break;
2791 case 0x01:
2792 NEXT ();
2793 break;
2794 case 0x00:
2795 NEXT ();
2796 INT;
2797 break;
2798 case 0x03:
2799 NEXT ();
2800 INT;
2801 break;
2802 case 0x13:
2803 EXPn (instruction address);
2804 break;
2805 default:
2806 break;
2808 break;
2809 case 0xd8:
2810 /* EXternal ref. */
2811 NEXT ();
2812 OUT (0xf1);
2813 OUT (0xd8);
2814 EXP;
2815 EXP;
2816 EXP;
2817 EXP;
2818 break;
2819 case 0xce:
2820 NEXT ();
2821 OUT (0xf1);
2822 OUT (0xce);
2823 INT;
2824 INT;
2825 ch = THIS ();
2826 INT;
2827 switch (ch)
2829 case 0x01:
2830 INT;
2831 INT;
2832 break;
2833 case 0x02:
2834 INT;
2835 break;
2836 case 0x04:
2837 EXPn (external function);
2838 break;
2839 case 0x05:
2840 break;
2841 case 0x07:
2842 INTn (line number);
2843 INT;
2844 case 0x08:
2845 break;
2846 case 0x0a:
2847 INTn (locked register);
2848 INT;
2849 break;
2850 case 0x3f:
2851 copy_till_end ();
2852 break;
2853 case 0x3e:
2854 copy_till_end ();
2855 break;
2856 case 0x40:
2857 copy_till_end ();
2858 break;
2859 case 0x41:
2861 break;
2866 static void
2867 f0_record (void)
2869 /* Attribute record. */
2870 NEXT ();
2871 OUT (0xf0);
2872 INTn (Symbol name);
2876 static void
2877 f2_record (void)
2879 NEXT ();
2880 OUT (0xf2);
2881 INT;
2882 NEXT ();
2883 OUT (0xce);
2884 INT;
2885 copy_till_end ();
2888 static void
2889 f8_record (void)
2891 int ch;
2892 NEXT ();
2893 ch = THIS ();
2894 switch (ch)
2896 case 0x01:
2897 case 0x02:
2898 case 0x03:
2899 /* Unique typedefs for module. */
2900 /* GLobal typedefs. */
2901 /* High level module scope beginning. */
2903 struct output_buffer_struct ob;
2905 NEXT ();
2906 OUT (0xf8);
2907 OUT (ch);
2908 drop_int (&ob);
2911 block ();
2913 NEXT ();
2914 fill_int (&ob);
2915 OUT (0xf9);
2917 break;
2918 case 0x04:
2919 /* Global function. */
2921 struct output_buffer_struct ob;
2923 NEXT ();
2924 OUT (0xf8);
2925 OUT (0x04);
2926 drop_int (&ob);
2928 INTn (stack size);
2929 INTn (ret val);
2930 EXPn (offset);
2932 block ();
2934 NEXT ();
2935 OUT (0xf9);
2936 EXPn (size of block);
2937 fill_int (&ob);
2939 break;
2941 case 0x05:
2942 /* File name for source line numbers. */
2944 struct output_buffer_struct ob;
2946 NEXT ();
2947 OUT (0xf8);
2948 OUT (0x05);
2949 drop_int (&ob);
2951 INTn (year);
2952 INTn (month);
2953 INTn (day);
2954 INTn (hour);
2955 INTn (monute);
2956 INTn (second);
2957 block ();
2958 NEXT ();
2959 OUT (0xf9);
2960 fill_int (&ob);
2962 break;
2964 case 0x06:
2965 /* Local function. */
2967 struct output_buffer_struct ob;
2969 NEXT ();
2970 OUT (0xf8);
2971 OUT (0x06);
2972 drop_int (&ob);
2974 INTn (stack size);
2975 INTn (type return);
2976 EXPn (offset);
2977 block ();
2978 NEXT ();
2979 OUT (0xf9);
2980 EXPn (size);
2981 fill_int (&ob);
2983 break;
2985 case 0x0a:
2986 /* Assembler module scope beginning - */
2988 struct output_buffer_struct ob;
2990 NEXT ();
2991 OUT (0xf8);
2992 OUT (0x0a);
2993 drop_int (&ob);
2996 INT;
2998 INT;
2999 INT;
3000 INT;
3001 INT;
3002 INT;
3003 INT;
3005 block ();
3007 NEXT ();
3008 OUT (0xf9);
3009 fill_int (&ob);
3011 break;
3012 case 0x0b:
3014 struct output_buffer_struct ob;
3016 NEXT ();
3017 OUT (0xf8);
3018 OUT (0x0b);
3019 drop_int (&ob);
3021 INT;
3022 INTn (section index);
3023 EXPn (offset);
3024 INTn (stuff);
3026 block ();
3028 OUT (0xf9);
3029 NEXT ();
3030 EXPn (Size in Maus);
3031 fill_int (&ob);
3033 break;
3037 static void
3038 e2_record (void)
3040 OUT (0xe2);
3041 NEXT ();
3042 OUT (0xce);
3043 NEXT ();
3044 INT;
3045 EXP;
3048 static void
3049 block (void)
3051 int ch;
3053 while (1)
3055 ch = THIS ();
3056 switch (ch)
3058 case 0xe1:
3059 case 0xe5:
3060 return;
3061 case 0xf9:
3062 return;
3063 case 0xf0:
3064 f0_record ();
3065 break;
3066 case 0xf1:
3067 f1_record ();
3068 break;
3069 case 0xf2:
3070 f2_record ();
3071 break;
3072 case 0xf8:
3073 f8_record ();
3074 break;
3075 case 0xe2:
3076 e2_record ();
3077 break;
3083 /* Moves all the debug information from the source bfd to the output
3084 bfd, and relocates any expressions it finds. */
3086 static void
3087 relocate_debug (bfd *output ATTRIBUTE_UNUSED,
3088 bfd *input)
3090 #define IBS 400
3091 #define OBS 400
3092 unsigned char input_buffer[IBS];
3094 input_ptr_start = input_ptr = input_buffer;
3095 input_ptr_end = input_buffer + IBS;
3096 input_bfd = input;
3097 /* FIXME: Check return value. I'm not sure whether it needs to read
3098 the entire buffer or not. */
3099 bfd_bread ((void *) input_ptr_start, (bfd_size_type) IBS, input);
3100 block ();
3103 /* Gather together all the debug information from each input BFD into
3104 one place, relocating it and emitting it as we go. */
3106 static bfd_boolean
3107 ieee_write_debug_part (bfd *abfd)
3109 ieee_data_type *ieee = IEEE_DATA (abfd);
3110 bfd_chain_type *chain = ieee->chain_root;
3111 unsigned char obuff[OBS];
3112 bfd_boolean some_debug = FALSE;
3113 file_ptr here = bfd_tell (abfd);
3115 output_ptr_start = output_ptr = obuff;
3116 output_ptr_end = obuff + OBS;
3117 output_ptr = obuff;
3118 output_bfd = abfd;
3120 if (chain == (bfd_chain_type *) NULL)
3122 asection *s;
3124 for (s = abfd->sections; s != NULL; s = s->next)
3125 if ((s->flags & SEC_DEBUGGING) != 0)
3126 break;
3127 if (s == NULL)
3129 ieee->w.r.debug_information_part = 0;
3130 return TRUE;
3133 ieee->w.r.debug_information_part = here;
3134 if (bfd_bwrite (s->contents, s->size, abfd) != s->size)
3135 return FALSE;
3137 else
3139 while (chain != (bfd_chain_type *) NULL)
3141 bfd *entry = chain->this;
3142 ieee_data_type *entry_ieee = IEEE_DATA (entry);
3144 if (entry_ieee->w.r.debug_information_part)
3146 if (bfd_seek (entry, entry_ieee->w.r.debug_information_part,
3147 SEEK_SET) != 0)
3148 return FALSE;
3149 relocate_debug (abfd, entry);
3152 chain = chain->next;
3155 if (some_debug)
3156 ieee->w.r.debug_information_part = here;
3157 else
3158 ieee->w.r.debug_information_part = 0;
3160 flush ();
3163 return TRUE;
3166 /* Write the data in an ieee way. */
3168 static bfd_boolean
3169 ieee_write_data_part (bfd *abfd)
3171 asection *s;
3173 ieee_data_type *ieee = IEEE_DATA (abfd);
3174 ieee->w.r.data_part = bfd_tell (abfd);
3176 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
3178 /* Skip sections that have no loadable contents (.bss,
3179 debugging, etc.) */
3180 if ((s->flags & SEC_LOAD) == 0)
3181 continue;
3183 /* Sort the reloc records so we can insert them in the correct
3184 places. */
3185 if (s->reloc_count != 0)
3187 if (! do_with_relocs (abfd, s))
3188 return FALSE;
3190 else
3192 if (! do_without_relocs (abfd, s))
3193 return FALSE;
3197 return TRUE;
3200 static bfd_boolean
3201 init_for_output (bfd *abfd)
3203 asection *s;
3205 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
3207 if ((s->flags & SEC_DEBUGGING) != 0)
3208 continue;
3209 if (s->size != 0)
3211 bfd_size_type size = s->size;
3212 ieee_per_section (s)->data = bfd_alloc (abfd, size);
3213 if (!ieee_per_section (s)->data)
3214 return FALSE;
3217 return TRUE;
3220 /* Exec and core file sections. */
3222 /* Set section contents is complicated with IEEE since the format is
3223 not a byte image, but a record stream. */
3225 static bfd_boolean
3226 ieee_set_section_contents (bfd *abfd,
3227 sec_ptr section,
3228 const void * location,
3229 file_ptr offset,
3230 bfd_size_type count)
3232 if ((section->flags & SEC_DEBUGGING) != 0)
3234 if (section->contents == NULL)
3236 bfd_size_type size = section->size;
3237 section->contents = bfd_alloc (abfd, size);
3238 if (section->contents == NULL)
3239 return FALSE;
3241 /* bfd_set_section_contents has already checked that everything
3242 is within range. */
3243 memcpy (section->contents + offset, location, (size_t) count);
3244 return TRUE;
3247 if (ieee_per_section (section)->data == (bfd_byte *) NULL)
3249 if (!init_for_output (abfd))
3250 return FALSE;
3252 memcpy ((void *) (ieee_per_section (section)->data + offset),
3253 (void *) location,
3254 (unsigned int) count);
3255 return TRUE;
3258 /* Write the external symbols of a file. IEEE considers two sorts of
3259 external symbols, public, and referenced. It uses to internal
3260 forms to index them as well. When we write them out we turn their
3261 symbol values into indexes from the right base. */
3263 static bfd_boolean
3264 ieee_write_external_part (bfd *abfd)
3266 asymbol **q;
3267 ieee_data_type *ieee = IEEE_DATA (abfd);
3268 unsigned int reference_index = IEEE_REFERENCE_BASE;
3269 unsigned int public_index = IEEE_PUBLIC_BASE + 2;
3270 file_ptr here = bfd_tell (abfd);
3271 bfd_boolean hadone = FALSE;
3273 if (abfd->outsymbols != (asymbol **) NULL)
3276 for (q = abfd->outsymbols; *q != (asymbol *) NULL; q++)
3278 asymbol *p = *q;
3280 if (bfd_is_und_section (p->section))
3282 /* This must be a symbol reference. */
3283 if (! ieee_write_byte (abfd, ieee_external_reference_enum)
3284 || ! ieee_write_int (abfd, (bfd_vma) reference_index)
3285 || ! ieee_write_id (abfd, p->name))
3286 return FALSE;
3287 p->value = reference_index;
3288 reference_index++;
3289 hadone = TRUE;
3291 else if (bfd_is_com_section (p->section))
3293 /* This is a weak reference. */
3294 if (! ieee_write_byte (abfd, ieee_external_reference_enum)
3295 || ! ieee_write_int (abfd, (bfd_vma) reference_index)
3296 || ! ieee_write_id (abfd, p->name)
3297 || ! ieee_write_byte (abfd,
3298 ieee_weak_external_reference_enum)
3299 || ! ieee_write_int (abfd, (bfd_vma) reference_index)
3300 || ! ieee_write_int (abfd, p->value))
3301 return FALSE;
3302 p->value = reference_index;
3303 reference_index++;
3304 hadone = TRUE;
3306 else if (p->flags & BSF_GLOBAL)
3308 /* This must be a symbol definition. */
3309 if (! ieee_write_byte (abfd, ieee_external_symbol_enum)
3310 || ! ieee_write_int (abfd, (bfd_vma) public_index)
3311 || ! ieee_write_id (abfd, p->name)
3312 || ! ieee_write_2bytes (abfd, ieee_attribute_record_enum)
3313 || ! ieee_write_int (abfd, (bfd_vma) public_index)
3314 || ! ieee_write_byte (abfd, 15) /* Instruction address. */
3315 || ! ieee_write_byte (abfd, 19) /* Static symbol. */
3316 || ! ieee_write_byte (abfd, 1)) /* One of them. */
3317 return FALSE;
3319 /* Write out the value. */
3320 if (! ieee_write_2bytes (abfd, ieee_value_record_enum)
3321 || ! ieee_write_int (abfd, (bfd_vma) public_index))
3322 return FALSE;
3323 if (! bfd_is_abs_section (p->section))
3325 if (abfd->flags & EXEC_P)
3327 /* If fully linked, then output all symbols
3328 relocated. */
3329 if (! (ieee_write_int
3330 (abfd,
3331 (p->value
3332 + p->section->output_offset
3333 + p->section->output_section->vma))))
3334 return FALSE;
3336 else
3338 if (! (ieee_write_expression
3339 (abfd,
3340 p->value + p->section->output_offset,
3341 p->section->output_section->symbol,
3342 FALSE, 0)))
3343 return FALSE;
3346 else
3348 if (! ieee_write_expression (abfd,
3349 p->value,
3350 bfd_abs_section_ptr->symbol,
3351 FALSE, 0))
3352 return FALSE;
3354 p->value = public_index;
3355 public_index++;
3356 hadone = TRUE;
3358 else
3360 /* This can happen - when there are gaps in the symbols read
3361 from an input ieee file. */
3365 if (hadone)
3366 ieee->w.r.external_part = here;
3368 return TRUE;
3372 static const unsigned char exten[] =
3374 0xf0, 0x20, 0x00,
3375 0xf1, 0xce, 0x20, 0x00, 37, 3, 3, /* Set version 3 rev 3. */
3376 0xf1, 0xce, 0x20, 0x00, 39, 2, /* Keep symbol in original case. */
3377 0xf1, 0xce, 0x20, 0x00, 38 /* Set object type relocatable to x. */
3380 static const unsigned char envi[] =
3382 0xf0, 0x21, 0x00,
3384 /* 0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
3385 0x19, 0x2c,
3387 0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok. */
3389 0xf1, 0xce, 0x21, 0, 53, 0x03,/* host unix. */
3390 /* 0xf1, 0xce, 0x21, 0, 54, 2,1,1 tool & version # */
3393 static bfd_boolean
3394 ieee_write_me_part (bfd *abfd)
3396 ieee_data_type *ieee = IEEE_DATA (abfd);
3397 ieee->w.r.trailer_part = bfd_tell (abfd);
3398 if (abfd->start_address)
3400 if (! ieee_write_2bytes (abfd, ieee_value_starting_address_enum)
3401 || ! ieee_write_byte (abfd, ieee_function_either_open_b_enum)
3402 || ! ieee_write_int (abfd, abfd->start_address)
3403 || ! ieee_write_byte (abfd, ieee_function_either_close_b_enum))
3404 return FALSE;
3406 ieee->w.r.me_record = bfd_tell (abfd);
3407 if (! ieee_write_byte (abfd, ieee_module_end_enum))
3408 return FALSE;
3409 return TRUE;
3412 /* Write out the IEEE processor ID. */
3414 static bfd_boolean
3415 ieee_write_processor (bfd *abfd)
3417 const bfd_arch_info_type *arch;
3419 arch = bfd_get_arch_info (abfd);
3420 switch (arch->arch)
3422 default:
3423 if (! ieee_write_id (abfd, bfd_printable_name (abfd)))
3424 return FALSE;
3425 break;
3427 case bfd_arch_h8300:
3428 if (! ieee_write_id (abfd, "H8/300"))
3429 return FALSE;
3430 break;
3432 case bfd_arch_h8500:
3433 if (! ieee_write_id (abfd, "H8/500"))
3434 return FALSE;
3435 break;
3437 case bfd_arch_i960:
3438 switch (arch->mach)
3440 default:
3441 case bfd_mach_i960_core:
3442 case bfd_mach_i960_ka_sa:
3443 if (! ieee_write_id (abfd, "80960KA"))
3444 return FALSE;
3445 break;
3447 case bfd_mach_i960_kb_sb:
3448 if (! ieee_write_id (abfd, "80960KB"))
3449 return FALSE;
3450 break;
3452 case bfd_mach_i960_ca:
3453 if (! ieee_write_id (abfd, "80960CA"))
3454 return FALSE;
3455 break;
3457 case bfd_mach_i960_mc:
3458 case bfd_mach_i960_xa:
3459 if (! ieee_write_id (abfd, "80960MC"))
3460 return FALSE;
3461 break;
3463 break;
3465 case bfd_arch_m68k:
3467 const char *id;
3469 switch (arch->mach)
3471 default: id = "68020"; break;
3472 case bfd_mach_m68000: id = "68000"; break;
3473 case bfd_mach_m68008: id = "68008"; break;
3474 case bfd_mach_m68010: id = "68010"; break;
3475 case bfd_mach_m68020: id = "68020"; break;
3476 case bfd_mach_m68030: id = "68030"; break;
3477 case bfd_mach_m68040: id = "68040"; break;
3478 case bfd_mach_m68060: id = "68060"; break;
3479 case bfd_mach_cpu32: id = "cpu32"; break;
3480 case bfd_mach_mcf_isa_a_nodiv: id = "isa-a:nodiv"; break;
3481 case bfd_mach_mcf_isa_a: id = "isa-a"; break;
3482 case bfd_mach_mcf_isa_a_mac: id = "isa-a:mac"; break;
3483 case bfd_mach_mcf_isa_a_emac: id = "isa-a:emac"; break;
3484 case bfd_mach_mcf_isa_aplus: id = "isa-aplus"; break;
3485 case bfd_mach_mcf_isa_aplus_mac: id = "isa-aplus:mac"; break;
3486 case bfd_mach_mcf_isa_aplus_emac: id = "isa-aplus:mac"; break;
3487 case bfd_mach_mcf_isa_b_nousp: id = "isa-b:nousp"; break;
3488 case bfd_mach_mcf_isa_b_nousp_mac: id = "isa-b:nousp:mac"; break;
3489 case bfd_mach_mcf_isa_b_nousp_emac: id = "isa-b:nousp:emac"; break;
3490 case bfd_mach_mcf_isa_b: id = "isa-b"; break;
3491 case bfd_mach_mcf_isa_b_mac: id = "isa-b:mac"; break;
3492 case bfd_mach_mcf_isa_b_emac: id = "isa-b:emac"; break;
3493 case bfd_mach_mcf_isa_b_float: id = "isa-b:float"; break;
3494 case bfd_mach_mcf_isa_b_float_mac: id = "isa-b:float:mac"; break;
3495 case bfd_mach_mcf_isa_b_float_emac: id = "isa-b:float:emac"; break;
3496 case bfd_mach_mcf_isa_c: id = "isa-c"; break;
3497 case bfd_mach_mcf_isa_c_mac: id = "isa-c:mac"; break;
3498 case bfd_mach_mcf_isa_c_emac: id = "isa-c:emac"; break;
3499 case bfd_mach_mcf_isa_c_nodiv: id = "isa-c:nodiv"; break;
3500 case bfd_mach_mcf_isa_c_nodiv_mac: id = "isa-c:nodiv:mac"; break;
3501 case bfd_mach_mcf_isa_c_nodiv_emac: id = "isa-c:nodiv:emac"; break;
3504 if (! ieee_write_id (abfd, id))
3505 return FALSE;
3507 break;
3510 return TRUE;
3513 static bfd_boolean
3514 ieee_write_object_contents (bfd *abfd)
3516 ieee_data_type *ieee = IEEE_DATA (abfd);
3517 unsigned int i;
3518 file_ptr old;
3520 /* Fast forward over the header area. */
3521 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
3522 return FALSE;
3524 if (! ieee_write_byte (abfd, ieee_module_beginning_enum)
3525 || ! ieee_write_processor (abfd)
3526 || ! ieee_write_id (abfd, abfd->filename))
3527 return FALSE;
3529 /* Fast forward over the variable bits. */
3530 if (! ieee_write_byte (abfd, ieee_address_descriptor_enum))
3531 return FALSE;
3533 /* Bits per MAU. */
3534 if (! ieee_write_byte (abfd, (bfd_byte) (bfd_arch_bits_per_byte (abfd))))
3535 return FALSE;
3536 /* MAU's per address. */
3537 if (! ieee_write_byte (abfd,
3538 (bfd_byte) (bfd_arch_bits_per_address (abfd)
3539 / bfd_arch_bits_per_byte (abfd))))
3540 return FALSE;
3542 old = bfd_tell (abfd);
3543 if (bfd_seek (abfd, (file_ptr) (8 * N_W_VARIABLES), SEEK_CUR) != 0)
3544 return FALSE;
3546 ieee->w.r.extension_record = bfd_tell (abfd);
3547 if (bfd_bwrite ((char *) exten, (bfd_size_type) sizeof (exten), abfd)
3548 != sizeof (exten))
3549 return FALSE;
3550 if (abfd->flags & EXEC_P)
3552 if (! ieee_write_byte (abfd, 0x1)) /* Absolute. */
3553 return FALSE;
3555 else
3557 if (! ieee_write_byte (abfd, 0x2)) /* Relocateable. */
3558 return FALSE;
3561 ieee->w.r.environmental_record = bfd_tell (abfd);
3562 if (bfd_bwrite ((char *) envi, (bfd_size_type) sizeof (envi), abfd)
3563 != sizeof (envi))
3564 return FALSE;
3566 /* The HP emulator database requires a timestamp in the file. */
3568 time_t now;
3569 const struct tm *t;
3571 time (&now);
3572 t = (struct tm *) localtime (&now);
3573 if (! ieee_write_2bytes (abfd, (int) ieee_atn_record_enum)
3574 || ! ieee_write_byte (abfd, 0x21)
3575 || ! ieee_write_byte (abfd, 0)
3576 || ! ieee_write_byte (abfd, 50)
3577 || ! ieee_write_int (abfd, (bfd_vma) (t->tm_year + 1900))
3578 || ! ieee_write_int (abfd, (bfd_vma) (t->tm_mon + 1))
3579 || ! ieee_write_int (abfd, (bfd_vma) t->tm_mday)
3580 || ! ieee_write_int (abfd, (bfd_vma) t->tm_hour)
3581 || ! ieee_write_int (abfd, (bfd_vma) t->tm_min)
3582 || ! ieee_write_int (abfd, (bfd_vma) t->tm_sec))
3583 return FALSE;
3586 output_bfd = abfd;
3588 flush ();
3590 if (! ieee_write_section_part (abfd))
3591 return FALSE;
3592 /* First write the symbols. This changes their values into table
3593 indeces so we cant use it after this point. */
3594 if (! ieee_write_external_part (abfd))
3595 return FALSE;
3597 /* Write any debugs we have been told about. */
3598 if (! ieee_write_debug_part (abfd))
3599 return FALSE;
3601 /* Can only write the data once the symbols have been written, since
3602 the data contains relocation information which points to the
3603 symbols. */
3604 if (! ieee_write_data_part (abfd))
3605 return FALSE;
3607 /* At the end we put the end! */
3608 if (! ieee_write_me_part (abfd))
3609 return FALSE;
3611 /* Generate the header. */
3612 if (bfd_seek (abfd, old, SEEK_SET) != 0)
3613 return FALSE;
3615 for (i = 0; i < N_W_VARIABLES; i++)
3617 if (! ieee_write_2bytes (abfd, ieee_assign_value_to_variable_enum)
3618 || ! ieee_write_byte (abfd, (bfd_byte) i)
3619 || ! ieee_write_int5_out (abfd, (bfd_vma) ieee->w.offset[i]))
3620 return FALSE;
3623 return TRUE;
3626 /* Native-level interface to symbols. */
3628 /* We read the symbols into a buffer, which is discarded when this
3629 function exits. We read the strings into a buffer large enough to
3630 hold them all plus all the cached symbol entries. */
3632 static asymbol *
3633 ieee_make_empty_symbol (bfd *abfd)
3635 bfd_size_type amt = sizeof (ieee_symbol_type);
3636 ieee_symbol_type *new_symbol = (ieee_symbol_type *) bfd_zalloc (abfd, amt);
3638 if (!new_symbol)
3639 return NULL;
3640 new_symbol->symbol.the_bfd = abfd;
3641 return &new_symbol->symbol;
3644 static bfd *
3645 ieee_openr_next_archived_file (bfd *arch, bfd *prev)
3647 ieee_ar_data_type *ar = IEEE_AR_DATA (arch);
3649 /* Take the next one from the arch state, or reset. */
3650 if (prev == (bfd *) NULL)
3651 /* Reset the index - the first two entries are bogus. */
3652 ar->element_index = 2;
3654 while (TRUE)
3656 ieee_ar_obstack_type *p = ar->elements + ar->element_index;
3658 ar->element_index++;
3659 if (ar->element_index <= ar->element_count)
3661 if (p->file_offset != (file_ptr) 0)
3663 if (p->abfd == (bfd *) NULL)
3665 p->abfd = _bfd_create_empty_archive_element_shell (arch);
3666 p->abfd->origin = p->file_offset;
3668 return p->abfd;
3671 else
3673 bfd_set_error (bfd_error_no_more_archived_files);
3674 return NULL;
3679 static bfd_boolean
3680 ieee_find_nearest_line (bfd *abfd ATTRIBUTE_UNUSED,
3681 asection *section ATTRIBUTE_UNUSED,
3682 asymbol **symbols ATTRIBUTE_UNUSED,
3683 bfd_vma offset ATTRIBUTE_UNUSED,
3684 const char **filename_ptr ATTRIBUTE_UNUSED,
3685 const char **functionname_ptr ATTRIBUTE_UNUSED,
3686 unsigned int *line_ptr ATTRIBUTE_UNUSED)
3688 return FALSE;
3691 static bfd_boolean
3692 ieee_find_inliner_info (bfd *abfd ATTRIBUTE_UNUSED,
3693 const char **filename_ptr ATTRIBUTE_UNUSED,
3694 const char **functionname_ptr ATTRIBUTE_UNUSED,
3695 unsigned int *line_ptr ATTRIBUTE_UNUSED)
3697 return FALSE;
3700 static int
3701 ieee_generic_stat_arch_elt (bfd *abfd, struct stat *buf)
3703 ieee_ar_data_type *ar = (ieee_ar_data_type *) NULL;
3704 ieee_data_type *ieee;
3706 if (abfd->my_archive != NULL)
3707 ar = abfd->my_archive->tdata.ieee_ar_data;
3708 if (ar == (ieee_ar_data_type *) NULL)
3710 bfd_set_error (bfd_error_invalid_operation);
3711 return -1;
3714 if (IEEE_DATA (abfd) == NULL)
3716 if (ieee_object_p (abfd) == NULL)
3718 bfd_set_error (bfd_error_wrong_format);
3719 return -1;
3723 ieee = IEEE_DATA (abfd);
3725 buf->st_size = ieee->w.r.me_record + 1;
3726 buf->st_mode = 0644;
3727 return 0;
3730 static int
3731 ieee_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
3732 struct bfd_link_info *info ATTRIBUTE_UNUSED)
3734 return 0;
3737 #define ieee_close_and_cleanup _bfd_generic_close_and_cleanup
3738 #define ieee_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
3740 #define ieee_slurp_armap bfd_true
3741 #define ieee_slurp_extended_name_table bfd_true
3742 #define ieee_construct_extended_name_table \
3743 ((bfd_boolean (*) \
3744 (bfd *, char **, bfd_size_type *, const char **)) \
3745 bfd_true)
3746 #define ieee_truncate_arname bfd_dont_truncate_arname
3747 #define ieee_write_armap \
3748 ((bfd_boolean (*) \
3749 (bfd *, unsigned int, struct orl *, unsigned int, int)) \
3750 bfd_true)
3751 #define ieee_read_ar_hdr bfd_nullvoidptr
3752 #define ieee_write_ar_hdr ((bfd_boolean (*) (bfd *, bfd *)) bfd_false)
3753 #define ieee_update_armap_timestamp bfd_true
3754 #define ieee_get_elt_at_index _bfd_generic_get_elt_at_index
3756 #define ieee_bfd_is_target_special_symbol \
3757 ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
3758 #define ieee_bfd_is_local_label_name bfd_generic_is_local_label_name
3759 #define ieee_get_lineno _bfd_nosymbols_get_lineno
3760 #define ieee_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
3761 #define ieee_read_minisymbols _bfd_generic_read_minisymbols
3762 #define ieee_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
3764 #define ieee_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
3765 #define ieee_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
3767 #define ieee_set_arch_mach _bfd_generic_set_arch_mach
3769 #define ieee_get_section_contents_in_window \
3770 _bfd_generic_get_section_contents_in_window
3771 #define ieee_bfd_get_relocated_section_contents \
3772 bfd_generic_get_relocated_section_contents
3773 #define ieee_bfd_relax_section bfd_generic_relax_section
3774 #define ieee_bfd_gc_sections bfd_generic_gc_sections
3775 #define ieee_bfd_merge_sections bfd_generic_merge_sections
3776 #define ieee_bfd_is_group_section bfd_generic_is_group_section
3777 #define ieee_bfd_discard_group bfd_generic_discard_group
3778 #define ieee_section_already_linked \
3779 _bfd_generic_section_already_linked
3780 #define ieee_bfd_define_common_symbol bfd_generic_define_common_symbol
3781 #define ieee_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
3782 #define ieee_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
3783 #define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols
3784 #define ieee_bfd_link_just_syms _bfd_generic_link_just_syms
3785 #define ieee_bfd_copy_link_hash_symbol_type \
3786 _bfd_generic_copy_link_hash_symbol_type
3787 #define ieee_bfd_final_link _bfd_generic_final_link
3788 #define ieee_bfd_link_split_section _bfd_generic_link_split_section
3790 const bfd_target ieee_vec =
3792 "ieee", /* Name. */
3793 bfd_target_ieee_flavour,
3794 BFD_ENDIAN_UNKNOWN, /* Target byte order. */
3795 BFD_ENDIAN_UNKNOWN, /* Target headers byte order. */
3796 (HAS_RELOC | EXEC_P | /* Object flags. */
3797 HAS_LINENO | HAS_DEBUG |
3798 HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
3799 (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
3800 | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* Section flags. */
3801 '_', /* Leading underscore. */
3802 ' ', /* AR_pad_char. */
3803 16, /* AR_max_namelen. */
3804 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
3805 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
3806 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* Data. */
3807 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
3808 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
3809 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* Headers. */
3811 {_bfd_dummy_target,
3812 ieee_object_p, /* bfd_check_format. */
3813 ieee_archive_p,
3814 _bfd_dummy_target,
3817 bfd_false,
3818 ieee_mkobject,
3819 _bfd_generic_mkarchive,
3820 bfd_false
3823 bfd_false,
3824 ieee_write_object_contents,
3825 _bfd_write_archive_contents,
3826 bfd_false,
3829 /* ieee_close_and_cleanup, ieee_bfd_free_cached_info, ieee_new_section_hook,
3830 ieee_get_section_contents, ieee_get_section_contents_in_window. */
3831 BFD_JUMP_TABLE_GENERIC (ieee),
3833 BFD_JUMP_TABLE_COPY (_bfd_generic),
3834 BFD_JUMP_TABLE_CORE (_bfd_nocore),
3836 /* ieee_slurp_armap, ieee_slurp_extended_name_table,
3837 ieee_construct_extended_name_table, ieee_truncate_arname,
3838 ieee_write_armap, ieee_read_ar_hdr, ieee_openr_next_archived_file,
3839 ieee_get_elt_at_index, ieee_generic_stat_arch_elt,
3840 ieee_update_armap_timestamp. */
3841 BFD_JUMP_TABLE_ARCHIVE (ieee),
3843 /* ieee_get_symtab_upper_bound, ieee_canonicalize_symtab,
3844 ieee_make_empty_symbol, ieee_print_symbol, ieee_get_symbol_info,
3845 ieee_bfd_is_local_label_name, ieee_get_lineno,
3846 ieee_find_nearest_line, ieee_bfd_make_debug_symbol,
3847 ieee_read_minisymbols, ieee_minisymbol_to_symbol. */
3848 BFD_JUMP_TABLE_SYMBOLS (ieee),
3850 /* ieee_get_reloc_upper_bound, ieee_canonicalize_reloc,
3851 ieee_bfd_reloc_type_lookup. */
3852 BFD_JUMP_TABLE_RELOCS (ieee),
3854 /* ieee_set_arch_mach, ieee_set_section_contents. */
3855 BFD_JUMP_TABLE_WRITE (ieee),
3857 /* ieee_sizeof_headers, ieee_bfd_get_relocated_section_contents,
3858 ieee_bfd_relax_section, ieee_bfd_link_hash_table_create,
3859 _bfd_generic_link_hash_table_free,
3860 ieee_bfd_link_add_symbols, ieee_bfd_final_link,
3861 ieee_bfd_link_split_section, ieee_bfd_gc_sections,
3862 ieee_bfd_merge_sections. */
3863 BFD_JUMP_TABLE_LINK (ieee),
3865 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
3867 NULL,
3869 NULL