1 /* BFD back-end for ieee-695 objects.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005
4 Free Software Foundation, Inc.
6 Written by Steve Chamberlain of Cygnus Support.
8 This file is part of BFD, the Binary File Descriptor library.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
24 #define KEEPMINUSPCININST 0
26 /* IEEE 695 format is a stream of records, which we parse using a simple one-
27 token (which is one byte in this lexicon) lookahead recursive decent
35 #include "safe-ctype.h"
37 struct output_buffer_struct
43 static unsigned char *output_ptr_start
;
44 static unsigned char *output_ptr
;
45 static unsigned char *output_ptr_end
;
46 static unsigned char *input_ptr_start
;
47 static unsigned char *input_ptr
;
48 static unsigned char *input_ptr_end
;
49 static bfd
*input_bfd
;
50 static bfd
*output_bfd
;
51 static int output_buffer
;
54 static void block (void);
56 /* Functions for writing to ieee files in the strange way that the
60 ieee_write_byte (bfd
*abfd
, int barg
)
65 if (bfd_bwrite ((void *) &byte
, (bfd_size_type
) 1, abfd
) != 1)
71 ieee_write_2bytes (bfd
*abfd
, int bytes
)
75 buffer
[0] = bytes
>> 8;
76 buffer
[1] = bytes
& 0xff;
77 if (bfd_bwrite ((void *) buffer
, (bfd_size_type
) 2, abfd
) != 2)
83 ieee_write_int (bfd
*abfd
, bfd_vma value
)
87 if (! ieee_write_byte (abfd
, (bfd_byte
) value
))
94 /* How many significant bytes ? */
95 /* FIXME FOR LONGER INTS. */
96 if (value
& 0xff000000)
98 else if (value
& 0x00ff0000)
100 else if (value
& 0x0000ff00)
105 if (! ieee_write_byte (abfd
,
106 (bfd_byte
) ((int) ieee_number_repeat_start_enum
112 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
>> 24)))
116 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
>> 16)))
120 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
>> 8)))
124 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
)))
133 ieee_write_id (bfd
*abfd
, const char *id
)
135 size_t length
= strlen (id
);
139 if (! ieee_write_byte (abfd
, (bfd_byte
) length
))
142 else if (length
< 255)
144 if (! ieee_write_byte (abfd
, ieee_extension_length_1_enum
)
145 || ! ieee_write_byte (abfd
, (bfd_byte
) length
))
148 else if (length
< 65535)
150 if (! ieee_write_byte (abfd
, ieee_extension_length_2_enum
)
151 || ! ieee_write_2bytes (abfd
, (int) length
))
156 (*_bfd_error_handler
)
157 (_("%s: string too long (%d chars, max 65535)"),
158 bfd_get_filename (abfd
), length
);
159 bfd_set_error (bfd_error_invalid_operation
);
163 if (bfd_bwrite ((void *) id
, (bfd_size_type
) length
, abfd
) != length
)
168 /* Functions for reading from ieee files in the strange way that the
169 standard requires. */
171 #define this_byte(ieee) *((ieee)->input_p)
172 #define next_byte(ieee) ((ieee)->input_p++)
173 #define this_byte_and_next(ieee) (*((ieee)->input_p++))
175 static unsigned short
176 read_2bytes (common_header_type
*ieee
)
178 unsigned char c1
= this_byte_and_next (ieee
);
179 unsigned char c2
= this_byte_and_next (ieee
);
181 return (c1
<< 8) | c2
;
185 bfd_get_string (common_header_type
*ieee
, char *string
, size_t length
)
189 for (i
= 0; i
< length
; i
++)
190 string
[i
] = this_byte_and_next (ieee
);
194 read_id (common_header_type
*ieee
)
199 length
= this_byte_and_next (ieee
);
201 /* Simple string of length 0 to 127. */
204 else if (length
== 0xde)
205 /* Length is next byte, allowing 0..255. */
206 length
= this_byte_and_next (ieee
);
208 else if (length
== 0xdf)
210 /* Length is next two bytes, allowing 0..65535. */
211 length
= this_byte_and_next (ieee
);
212 length
= (length
* 256) + this_byte_and_next (ieee
);
215 /* Buy memory and read string. */
216 string
= bfd_alloc (ieee
->abfd
, (bfd_size_type
) length
+ 1);
219 bfd_get_string (ieee
, string
, length
);
225 ieee_write_expression (bfd
*abfd
,
231 unsigned int term_count
= 0;
235 if (! ieee_write_int (abfd
, value
))
240 /* Badly formatted binaries can have a missing symbol,
241 so test here to prevent a seg fault. */
244 if (bfd_is_com_section (symbol
->section
)
245 || bfd_is_und_section (symbol
->section
))
247 /* Def of a common symbol. */
248 if (! ieee_write_byte (abfd
, ieee_variable_X_enum
)
249 || ! ieee_write_int (abfd
, symbol
->value
))
253 else if (! bfd_is_abs_section (symbol
->section
))
255 /* Ref to defined symbol - */
256 if (symbol
->flags
& BSF_GLOBAL
)
258 if (! ieee_write_byte (abfd
, ieee_variable_I_enum
)
259 || ! ieee_write_int (abfd
, symbol
->value
))
263 else if (symbol
->flags
& (BSF_LOCAL
| BSF_SECTION_SYM
))
265 /* This is a reference to a defined local symbol. We can
266 easily do a local as a section+offset. */
267 if (! ieee_write_byte (abfd
, ieee_variable_R_enum
)
268 || ! ieee_write_byte (abfd
,
269 (bfd_byte
) (symbol
->section
->index
270 + IEEE_SECTION_NUMBER_BASE
)))
274 if (symbol
->value
!= 0)
276 if (! ieee_write_int (abfd
, symbol
->value
))
283 (*_bfd_error_handler
)
284 (_("%s: unrecognized symbol `%s' flags 0x%x"),
285 bfd_get_filename (abfd
), bfd_asymbol_name (symbol
),
287 bfd_set_error (bfd_error_invalid_operation
);
295 /* Subtract the pc from here by asking for PC of this section. */
296 if (! ieee_write_byte (abfd
, ieee_variable_P_enum
)
297 || ! ieee_write_byte (abfd
,
298 (bfd_byte
) (index
+ IEEE_SECTION_NUMBER_BASE
))
299 || ! ieee_write_byte (abfd
, ieee_function_minus_enum
))
303 /* Handle the degenerate case of a 0 address. */
305 if (! ieee_write_int (abfd
, (bfd_vma
) 0))
308 while (term_count
> 1)
310 if (! ieee_write_byte (abfd
, ieee_function_plus_enum
))
318 /* Writes any integer into the buffer supplied and always takes 5 bytes. */
321 ieee_write_int5 (bfd_byte
*buffer
, bfd_vma value
)
323 buffer
[0] = (bfd_byte
) ieee_number_repeat_4_enum
;
324 buffer
[1] = (value
>> 24) & 0xff;
325 buffer
[2] = (value
>> 16) & 0xff;
326 buffer
[3] = (value
>> 8) & 0xff;
327 buffer
[4] = (value
>> 0) & 0xff;
331 ieee_write_int5_out (bfd
*abfd
, bfd_vma value
)
335 ieee_write_int5 (b
, value
);
336 if (bfd_bwrite ((void *) b
, (bfd_size_type
) 5, abfd
) != 5)
342 parse_int (common_header_type
*ieee
, bfd_vma
*value_ptr
)
344 int value
= this_byte (ieee
);
347 if (value
>= 0 && value
<= 127)
353 else if (value
>= 0x80 && value
<= 0x88)
355 unsigned int count
= value
& 0xf;
361 result
= (result
<< 8) | this_byte_and_next (ieee
);
371 parse_i (common_header_type
*ieee
, bfd_boolean
*ok
)
374 *ok
= parse_int (ieee
, &x
);
379 must_parse_int (common_header_type
*ieee
)
382 BFD_ASSERT (parse_int (ieee
, &result
));
390 ieee_symbol_index_type symbol
;
394 #if KEEPMINUSPCININST
396 #define SRC_MASK(arg) arg
397 #define PCREL_OFFSET FALSE
401 #define SRC_MASK(arg) 0
402 #define PCREL_OFFSET TRUE
406 static reloc_howto_type abs32_howto
=
413 complain_overflow_bitfield
,
421 static reloc_howto_type abs16_howto
=
428 complain_overflow_bitfield
,
436 static reloc_howto_type abs8_howto
=
443 complain_overflow_bitfield
,
451 static reloc_howto_type rel32_howto
=
458 complain_overflow_signed
,
462 SRC_MASK (0xffffffff),
466 static reloc_howto_type rel16_howto
=
473 complain_overflow_signed
,
477 SRC_MASK (0x0000ffff),
481 static reloc_howto_type rel8_howto
=
488 complain_overflow_signed
,
492 SRC_MASK (0x000000ff),
496 static ieee_symbol_index_type NOSYMBOL
= {0, 0};
499 parse_expression (ieee_data_type
*ieee
,
501 ieee_symbol_index_type
*symbol
,
507 bfd_boolean loop
= TRUE
;
508 ieee_value_type stack
[10];
509 ieee_value_type
*sp
= stack
;
518 /* The stack pointer always points to the next unused location. */
519 #define PUSH(x,y,z) TOS.symbol = x; TOS.section = y; TOS.value = z; INC;
520 #define POP(x,y,z) DEC; x = TOS.symbol; y = TOS.section; z = TOS.value;
522 while (loop
&& ieee
->h
.input_p
< ieee
->h
.last_byte
)
524 switch (this_byte (&(ieee
->h
)))
526 case ieee_variable_P_enum
:
527 /* P variable, current program counter for section n. */
531 next_byte (&(ieee
->h
));
533 section_n
= must_parse_int (&(ieee
->h
));
534 PUSH (NOSYMBOL
, bfd_abs_section_ptr
, 0);
537 case ieee_variable_L_enum
:
538 /* L variable address of section N. */
539 next_byte (&(ieee
->h
));
540 PUSH (NOSYMBOL
, ieee
->section_table
[must_parse_int (&(ieee
->h
))], 0);
542 case ieee_variable_R_enum
:
543 /* R variable, logical address of section module. */
544 /* FIXME, this should be different to L. */
545 next_byte (&(ieee
->h
));
546 PUSH (NOSYMBOL
, ieee
->section_table
[must_parse_int (&(ieee
->h
))], 0);
548 case ieee_variable_S_enum
:
549 /* S variable, size in MAUS of section module. */
550 next_byte (&(ieee
->h
));
553 ieee
->section_table
[must_parse_int (&(ieee
->h
))]->size
);
555 case ieee_variable_I_enum
:
556 /* Push the address of variable n. */
558 ieee_symbol_index_type sy
;
560 next_byte (&(ieee
->h
));
561 sy
.index
= (int) must_parse_int (&(ieee
->h
));
564 PUSH (sy
, bfd_abs_section_ptr
, 0);
567 case ieee_variable_X_enum
:
568 /* Push the address of external variable n. */
570 ieee_symbol_index_type sy
;
572 next_byte (&(ieee
->h
));
573 sy
.index
= (int) (must_parse_int (&(ieee
->h
)));
576 PUSH (sy
, bfd_und_section_ptr
, 0);
579 case ieee_function_minus_enum
:
581 bfd_vma value1
, value2
;
582 asection
*section1
, *section_dummy
;
583 ieee_symbol_index_type sy
;
585 next_byte (&(ieee
->h
));
587 POP (sy
, section1
, value1
);
588 POP (sy
, section_dummy
, value2
);
589 PUSH (sy
, section1
? section1
: section_dummy
, value2
- value1
);
592 case ieee_function_plus_enum
:
594 bfd_vma value1
, value2
;
597 ieee_symbol_index_type sy1
;
598 ieee_symbol_index_type sy2
;
600 next_byte (&(ieee
->h
));
602 POP (sy1
, section1
, value1
);
603 POP (sy2
, section2
, value2
);
604 PUSH (sy1
.letter
? sy1
: sy2
,
605 bfd_is_abs_section (section1
) ? section2
: section1
,
613 BFD_ASSERT (this_byte (&(ieee
->h
)) < (int) ieee_variable_A_enum
614 || this_byte (&(ieee
->h
)) > (int) ieee_variable_Z_enum
);
615 if (parse_int (&(ieee
->h
), &va
))
617 PUSH (NOSYMBOL
, bfd_abs_section_ptr
, va
);
620 /* Thats all that we can understand. */
626 /* As far as I can see there is a bug in the Microtec IEEE output
627 which I'm using to scan, whereby the comma operator is omitted
628 sometimes in an expression, giving expressions with too many
629 terms. We can tell if that's the case by ensuring that
630 sp == stack here. If not, then we've pushed something too far,
631 so we keep adding. */
632 while (sp
!= stack
+ 1)
635 ieee_symbol_index_type sy1
;
637 POP (sy1
, section1
, *extra
);
640 POP (*symbol
, dummy
, *value
);
646 #define ieee_seek(ieee, offset) \
649 ieee->h.input_p = ieee->h.first_byte + offset; \
650 ieee->h.last_byte = (ieee->h.first_byte \
651 + ieee_part_after (ieee, offset)); \
655 #define ieee_pos(ieee) \
656 (ieee->h.input_p - ieee->h.first_byte)
658 /* Find the first part of the ieee file after HERE. */
661 ieee_part_after (ieee_data_type
*ieee
, file_ptr here
)
664 file_ptr after
= ieee
->w
.r
.me_record
;
666 /* File parts can come in any order, except that module end is
667 guaranteed to be last (and the header first). */
668 for (part
= 0; part
< N_W_VARIABLES
; part
++)
669 if (ieee
->w
.offset
[part
] > here
&& after
> ieee
->w
.offset
[part
])
670 after
= ieee
->w
.offset
[part
];
675 static unsigned int last_index
;
676 static char last_type
; /* Is the index for an X or a D. */
678 static ieee_symbol_type
*
679 get_symbol (bfd
*abfd ATTRIBUTE_UNUSED
,
680 ieee_data_type
*ieee
,
681 ieee_symbol_type
*last_symbol
,
682 unsigned int *symbol_count
,
683 ieee_symbol_type
***pptr
,
684 unsigned int *max_index
,
687 /* Need a new symbol. */
688 unsigned int new_index
= must_parse_int (&(ieee
->h
));
690 if (new_index
!= last_index
|| this_type
!= last_type
)
692 ieee_symbol_type
*new_symbol
;
693 bfd_size_type amt
= sizeof (ieee_symbol_type
);
695 new_symbol
= bfd_alloc (ieee
->h
.abfd
, amt
);
699 new_symbol
->index
= new_index
;
700 last_index
= new_index
;
703 *pptr
= &new_symbol
->next
;
704 if (new_index
> *max_index
)
705 *max_index
= new_index
;
707 last_type
= this_type
;
708 new_symbol
->symbol
.section
= bfd_abs_section_ptr
;
715 ieee_slurp_external_symbols (bfd
*abfd
)
717 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
718 file_ptr offset
= ieee
->w
.r
.external_part
;
720 ieee_symbol_type
**prev_symbols_ptr
= &ieee
->external_symbols
;
721 ieee_symbol_type
**prev_reference_ptr
= &ieee
->external_reference
;
722 ieee_symbol_type
*symbol
= NULL
;
723 unsigned int symbol_count
= 0;
724 bfd_boolean loop
= TRUE
;
726 last_index
= 0xffffff;
727 ieee
->symbol_table_full
= TRUE
;
729 ieee_seek (ieee
, offset
);
733 switch (this_byte (&(ieee
->h
)))
736 next_byte (&(ieee
->h
));
738 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
740 & ieee
->external_symbol_max_index
, 'I');
744 symbol
->symbol
.the_bfd
= abfd
;
745 symbol
->symbol
.name
= read_id (&(ieee
->h
));
746 symbol
->symbol
.udata
.p
= NULL
;
747 symbol
->symbol
.flags
= BSF_NO_FLAGS
;
749 case ieee_external_symbol_enum
:
750 next_byte (&(ieee
->h
));
752 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
754 &ieee
->external_symbol_max_index
, 'D');
758 BFD_ASSERT (symbol
->index
>= ieee
->external_symbol_min_index
);
760 symbol
->symbol
.the_bfd
= abfd
;
761 symbol
->symbol
.name
= read_id (&(ieee
->h
));
762 symbol
->symbol
.udata
.p
= NULL
;
763 symbol
->symbol
.flags
= BSF_NO_FLAGS
;
765 case ieee_attribute_record_enum
>> 8:
767 unsigned int symbol_name_index
;
768 unsigned int symbol_type_index
;
769 unsigned int symbol_attribute_def
;
772 switch (read_2bytes (&ieee
->h
))
774 case ieee_attribute_record_enum
:
775 symbol_name_index
= must_parse_int (&(ieee
->h
));
776 symbol_type_index
= must_parse_int (&(ieee
->h
));
777 symbol_attribute_def
= must_parse_int (&(ieee
->h
));
778 switch (symbol_attribute_def
)
782 parse_int (&ieee
->h
, &value
);
785 (*_bfd_error_handler
)
786 (_("%B: unimplemented ATI record %u for symbol %u"),
787 abfd
, symbol_attribute_def
, symbol_name_index
);
788 bfd_set_error (bfd_error_bad_value
);
793 case ieee_external_reference_info_record_enum
:
794 /* Skip over ATX record. */
795 parse_int (&(ieee
->h
), &value
);
796 parse_int (&(ieee
->h
), &value
);
797 parse_int (&(ieee
->h
), &value
);
798 parse_int (&(ieee
->h
), &value
);
800 case ieee_atn_record_enum
:
801 /* We may get call optimization information here,
802 which we just ignore. The format is
803 {$F1}${CE}{index}{$00}{$3F}{$3F}{#_of_ASNs}. */
804 parse_int (&ieee
->h
, &value
);
805 parse_int (&ieee
->h
, &value
);
806 parse_int (&ieee
->h
, &value
);
809 (*_bfd_error_handler
)
810 (_("%B: unexpected ATN type %d in external part"),
812 bfd_set_error (bfd_error_bad_value
);
815 parse_int (&ieee
->h
, &value
);
816 parse_int (&ieee
->h
, &value
);
823 switch (read_2bytes (&ieee
->h
))
825 case ieee_asn_record_enum
:
826 parse_int (&ieee
->h
, &val1
);
827 parse_int (&ieee
->h
, &val1
);
831 (*_bfd_error_handler
)
832 (_("%B: unexpected type after ATN"), abfd
);
833 bfd_set_error (bfd_error_bad_value
);
840 case ieee_value_record_enum
>> 8:
842 unsigned int symbol_name_index
;
843 ieee_symbol_index_type symbol_ignore
;
844 bfd_boolean pcrel_ignore
;
847 next_byte (&(ieee
->h
));
848 next_byte (&(ieee
->h
));
850 symbol_name_index
= must_parse_int (&(ieee
->h
));
851 parse_expression (ieee
,
852 &symbol
->symbol
.value
,
856 &symbol
->symbol
.section
);
858 /* Fully linked IEEE-695 files tend to give every symbol
859 an absolute value. Try to convert that back into a
860 section relative value. FIXME: This won't always to
862 if (bfd_is_abs_section (symbol
->symbol
.section
)
863 && (abfd
->flags
& HAS_RELOC
) == 0)
868 val
= symbol
->symbol
.value
;
869 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
871 if (val
>= s
->vma
&& val
< s
->vma
+ s
->size
)
873 symbol
->symbol
.section
= s
;
874 symbol
->symbol
.value
-= s
->vma
;
880 symbol
->symbol
.flags
= BSF_GLOBAL
| BSF_EXPORT
;
884 case ieee_weak_external_reference_enum
:
889 next_byte (&(ieee
->h
));
890 /* Throw away the external reference index. */
891 (void) must_parse_int (&(ieee
->h
));
892 /* Fetch the default size if not resolved. */
893 size
= must_parse_int (&(ieee
->h
));
894 /* Fetch the default value if available. */
895 if (! parse_int (&(ieee
->h
), &value
))
897 /* This turns into a common. */
898 symbol
->symbol
.section
= bfd_com_section_ptr
;
899 symbol
->symbol
.value
= size
;
903 case ieee_external_reference_enum
:
904 next_byte (&(ieee
->h
));
906 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
908 &ieee
->external_reference_max_index
, 'X');
912 symbol
->symbol
.the_bfd
= abfd
;
913 symbol
->symbol
.name
= read_id (&(ieee
->h
));
914 symbol
->symbol
.udata
.p
= NULL
;
915 symbol
->symbol
.section
= bfd_und_section_ptr
;
916 symbol
->symbol
.value
= (bfd_vma
) 0;
917 symbol
->symbol
.flags
= 0;
919 BFD_ASSERT (symbol
->index
>= ieee
->external_reference_min_index
);
927 if (ieee
->external_symbol_max_index
!= 0)
929 ieee
->external_symbol_count
=
930 ieee
->external_symbol_max_index
-
931 ieee
->external_symbol_min_index
+ 1;
934 ieee
->external_symbol_count
= 0;
936 if (ieee
->external_reference_max_index
!= 0)
938 ieee
->external_reference_count
=
939 ieee
->external_reference_max_index
-
940 ieee
->external_reference_min_index
+ 1;
943 ieee
->external_reference_count
= 0;
946 ieee
->external_reference_count
+ ieee
->external_symbol_count
;
948 if (symbol_count
!= abfd
->symcount
)
949 /* There are gaps in the table -- */
950 ieee
->symbol_table_full
= FALSE
;
952 *prev_symbols_ptr
= NULL
;
953 *prev_reference_ptr
= NULL
;
959 ieee_slurp_symbol_table (bfd
*abfd
)
961 if (! IEEE_DATA (abfd
)->read_symbols
)
963 if (! ieee_slurp_external_symbols (abfd
))
965 IEEE_DATA (abfd
)->read_symbols
= TRUE
;
971 ieee_get_symtab_upper_bound (bfd
*abfd
)
973 if (! ieee_slurp_symbol_table (abfd
))
976 return (abfd
->symcount
!= 0) ?
977 (abfd
->symcount
+ 1) * (sizeof (ieee_symbol_type
*)) : 0;
980 /* Move from our internal lists to the canon table, and insert in
981 symbol index order. */
983 extern const bfd_target ieee_vec
;
986 ieee_canonicalize_symtab (bfd
*abfd
, asymbol
**location
)
988 ieee_symbol_type
*symp
;
989 static bfd dummy_bfd
;
990 static asymbol empty_symbol
=
998 /* K&R compilers can't initialise unions. */
1005 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1007 dummy_bfd
.xvec
= &ieee_vec
;
1008 if (! ieee_slurp_symbol_table (abfd
))
1011 if (! ieee
->symbol_table_full
)
1013 /* Arrgh - there are gaps in the table, run through and fill them
1014 up with pointers to a null place. */
1017 for (i
= 0; i
< abfd
->symcount
; i
++)
1018 location
[i
] = &empty_symbol
;
1021 ieee
->external_symbol_base_offset
= -ieee
->external_symbol_min_index
;
1022 for (symp
= IEEE_DATA (abfd
)->external_symbols
;
1023 symp
!= (ieee_symbol_type
*) NULL
;
1025 /* Place into table at correct index locations. */
1026 location
[symp
->index
+ ieee
->external_symbol_base_offset
] = &symp
->symbol
;
1028 /* The external refs are indexed in a bit. */
1029 ieee
->external_reference_base_offset
=
1030 -ieee
->external_reference_min_index
+ ieee
->external_symbol_count
;
1032 for (symp
= IEEE_DATA (abfd
)->external_reference
;
1033 symp
!= (ieee_symbol_type
*) NULL
;
1035 location
[symp
->index
+ ieee
->external_reference_base_offset
] =
1040 location
[abfd
->symcount
] = (asymbol
*) NULL
;
1042 return abfd
->symcount
;
1046 get_section_entry (bfd
*abfd
, ieee_data_type
*ieee
, unsigned int index
)
1048 if (index
>= ieee
->section_table_size
)
1054 c
= ieee
->section_table_size
;
1061 amt
*= sizeof (asection
*);
1062 n
= bfd_realloc (ieee
->section_table
, amt
);
1066 for (i
= ieee
->section_table_size
; i
< c
; i
++)
1069 ieee
->section_table
= n
;
1070 ieee
->section_table_size
= c
;
1073 if (ieee
->section_table
[index
] == (asection
*) NULL
)
1075 char *tmp
= bfd_alloc (abfd
, (bfd_size_type
) 11);
1080 sprintf (tmp
, " fsec%4d", index
);
1081 section
= bfd_make_section (abfd
, tmp
);
1082 ieee
->section_table
[index
] = section
;
1083 section
->flags
= SEC_NO_FLAGS
;
1084 section
->target_index
= index
;
1085 ieee
->section_table
[index
] = section
;
1087 return ieee
->section_table
[index
];
1091 ieee_slurp_sections (bfd
*abfd
)
1093 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1094 file_ptr offset
= ieee
->w
.r
.section_part
;
1099 bfd_byte section_type
[3];
1101 ieee_seek (ieee
, offset
);
1104 switch (this_byte (&(ieee
->h
)))
1106 case ieee_section_type_enum
:
1109 unsigned int section_index
;
1111 next_byte (&(ieee
->h
));
1112 section_index
= must_parse_int (&(ieee
->h
));
1114 section
= get_section_entry (abfd
, ieee
, section_index
);
1116 section_type
[0] = this_byte_and_next (&(ieee
->h
));
1118 /* Set minimal section attributes. Attributes are
1119 extended later, based on section contents. */
1120 switch (section_type
[0])
1123 /* Normal attributes for absolute sections. */
1124 section_type
[1] = this_byte (&(ieee
->h
));
1125 section
->flags
= SEC_ALLOC
;
1126 switch (section_type
[1])
1128 /* AS Absolute section attributes. */
1130 next_byte (&(ieee
->h
));
1131 section_type
[2] = this_byte (&(ieee
->h
));
1132 switch (section_type
[2])
1136 next_byte (&(ieee
->h
));
1137 section
->flags
|= SEC_CODE
;
1141 next_byte (&(ieee
->h
));
1142 section
->flags
|= SEC_DATA
;
1145 next_byte (&(ieee
->h
));
1146 /* Normal rom data. */
1147 section
->flags
|= SEC_ROM
| SEC_DATA
;
1155 /* Named relocatable sections (type C). */
1157 section_type
[1] = this_byte (&(ieee
->h
));
1158 section
->flags
= SEC_ALLOC
;
1159 switch (section_type
[1])
1161 case 0xD0: /* Normal code (CP). */
1162 next_byte (&(ieee
->h
));
1163 section
->flags
|= SEC_CODE
;
1165 case 0xC4: /* Normal data (CD). */
1166 next_byte (&(ieee
->h
));
1167 section
->flags
|= SEC_DATA
;
1169 case 0xD2: /* Normal rom data (CR). */
1170 next_byte (&(ieee
->h
));
1171 section
->flags
|= SEC_ROM
| SEC_DATA
;
1178 /* Read section name, use it if non empty. */
1179 name
= read_id (&ieee
->h
);
1181 section
->name
= name
;
1183 /* Skip these fields, which we don't care about. */
1185 bfd_vma parent
, brother
, context
;
1187 parse_int (&(ieee
->h
), &parent
);
1188 parse_int (&(ieee
->h
), &brother
);
1189 parse_int (&(ieee
->h
), &context
);
1193 case ieee_section_alignment_enum
:
1195 unsigned int section_index
;
1199 next_byte (&(ieee
->h
));
1200 section_index
= must_parse_int (&ieee
->h
);
1201 section
= get_section_entry (abfd
, ieee
, section_index
);
1202 if (section_index
> ieee
->section_count
)
1203 ieee
->section_count
= section_index
;
1205 section
->alignment_power
=
1206 bfd_log2 (must_parse_int (&ieee
->h
));
1207 (void) parse_int (&(ieee
->h
), &value
);
1210 case ieee_e2_first_byte_enum
:
1213 ieee_record_enum_type t
;
1215 t
= (ieee_record_enum_type
) (read_2bytes (&(ieee
->h
)));
1218 case ieee_section_size_enum
:
1219 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1220 section
->size
= must_parse_int (&(ieee
->h
));
1222 case ieee_physical_region_size_enum
:
1223 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1224 section
->size
= must_parse_int (&(ieee
->h
));
1226 case ieee_region_base_address_enum
:
1227 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1228 section
->vma
= must_parse_int (&(ieee
->h
));
1229 section
->lma
= section
->vma
;
1231 case ieee_mau_size_enum
:
1232 must_parse_int (&(ieee
->h
));
1233 must_parse_int (&(ieee
->h
));
1235 case ieee_m_value_enum
:
1236 must_parse_int (&(ieee
->h
));
1237 must_parse_int (&(ieee
->h
));
1239 case ieee_section_base_address_enum
:
1240 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1241 section
->vma
= must_parse_int (&(ieee
->h
));
1242 section
->lma
= section
->vma
;
1244 case ieee_section_offset_enum
:
1245 (void) must_parse_int (&(ieee
->h
));
1246 (void) must_parse_int (&(ieee
->h
));
1260 /* Make a section for the debugging information, if any. We don't try
1261 to interpret the debugging information; we just point the section
1262 at the area in the file so that program which understand can dig it
1266 ieee_slurp_debug (bfd
*abfd
)
1268 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1272 if (ieee
->w
.r
.debug_information_part
== 0)
1275 sec
= bfd_make_section (abfd
, ".debug");
1278 sec
->flags
|= SEC_DEBUGGING
| SEC_HAS_CONTENTS
;
1279 sec
->filepos
= ieee
->w
.r
.debug_information_part
;
1281 debug_end
= ieee_part_after (ieee
, ieee
->w
.r
.debug_information_part
);
1282 sec
->size
= debug_end
- ieee
->w
.r
.debug_information_part
;
1287 /* Archive stuff. */
1289 static const bfd_target
*
1290 ieee_archive_p (bfd
*abfd
)
1294 unsigned char buffer
[512];
1295 file_ptr buffer_offset
= 0;
1296 ieee_ar_data_type
*save
= abfd
->tdata
.ieee_ar_data
;
1297 ieee_ar_data_type
*ieee
;
1298 bfd_size_type alc_elts
;
1299 ieee_ar_obstack_type
*elts
= NULL
;
1300 bfd_size_type amt
= sizeof (ieee_ar_data_type
);
1302 abfd
->tdata
.ieee_ar_data
= bfd_alloc (abfd
, amt
);
1303 if (!abfd
->tdata
.ieee_ar_data
)
1304 goto error_ret_restore
;
1305 ieee
= IEEE_AR_DATA (abfd
);
1307 /* Ignore the return value here. It doesn't matter if we don't read
1308 the entire buffer. We might have a very small ieee file. */
1309 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1311 ieee
->h
.first_byte
= buffer
;
1312 ieee
->h
.input_p
= buffer
;
1314 ieee
->h
.abfd
= abfd
;
1316 if (this_byte (&(ieee
->h
)) != Module_Beginning
)
1317 goto got_wrong_format_error
;
1319 next_byte (&(ieee
->h
));
1320 library
= read_id (&(ieee
->h
));
1321 if (strcmp (library
, "LIBRARY") != 0)
1322 goto got_wrong_format_error
;
1324 /* Throw away the filename. */
1325 read_id (&(ieee
->h
));
1327 ieee
->element_count
= 0;
1328 ieee
->element_index
= 0;
1330 next_byte (&(ieee
->h
)); /* Drop the ad part. */
1331 must_parse_int (&(ieee
->h
)); /* And the two dummy numbers. */
1332 must_parse_int (&(ieee
->h
));
1335 elts
= bfd_malloc (alc_elts
* sizeof *elts
);
1339 /* Read the index of the BB table. */
1343 ieee_ar_obstack_type
*t
;
1345 rec
= read_2bytes (&(ieee
->h
));
1346 if (rec
!= (int) ieee_assign_value_to_variable_enum
)
1349 if (ieee
->element_count
>= alc_elts
)
1351 ieee_ar_obstack_type
*n
;
1354 n
= bfd_realloc (elts
, alc_elts
* sizeof (* elts
));
1360 t
= &elts
[ieee
->element_count
];
1361 ieee
->element_count
++;
1363 must_parse_int (&(ieee
->h
));
1364 t
->file_offset
= must_parse_int (&(ieee
->h
));
1365 t
->abfd
= (bfd
*) NULL
;
1367 /* Make sure that we don't go over the end of the buffer. */
1368 if ((size_t) ieee_pos (IEEE_DATA (abfd
)) > sizeof (buffer
) / 2)
1370 /* Past half way, reseek and reprime. */
1371 buffer_offset
+= ieee_pos (IEEE_DATA (abfd
));
1372 if (bfd_seek (abfd
, buffer_offset
, SEEK_SET
) != 0)
1375 /* Again ignore return value of bfd_bread. */
1376 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1377 ieee
->h
.first_byte
= buffer
;
1378 ieee
->h
.input_p
= buffer
;
1382 amt
= ieee
->element_count
;
1383 amt
*= sizeof *ieee
->elements
;
1384 ieee
->elements
= bfd_alloc (abfd
, amt
);
1385 if (ieee
->elements
== NULL
)
1388 memcpy (ieee
->elements
, elts
, (size_t) amt
);
1392 /* Now scan the area again, and replace BB offsets with file offsets. */
1393 for (i
= 2; i
< ieee
->element_count
; i
++)
1395 if (bfd_seek (abfd
, ieee
->elements
[i
].file_offset
, SEEK_SET
) != 0)
1398 /* Again ignore return value of bfd_bread. */
1399 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1400 ieee
->h
.first_byte
= buffer
;
1401 ieee
->h
.input_p
= buffer
;
1403 next_byte (&(ieee
->h
)); /* Drop F8. */
1404 next_byte (&(ieee
->h
)); /* Drop 14. */
1405 must_parse_int (&(ieee
->h
)); /* Drop size of block. */
1407 if (must_parse_int (&(ieee
->h
)) != 0)
1408 /* This object has been deleted. */
1409 ieee
->elements
[i
].file_offset
= 0;
1411 ieee
->elements
[i
].file_offset
= must_parse_int (&(ieee
->h
));
1414 /* abfd->has_armap = ;*/
1418 got_wrong_format_error
:
1419 bfd_set_error (bfd_error_wrong_format
);
1423 bfd_release (abfd
, ieee
);
1425 abfd
->tdata
.ieee_ar_data
= save
;
1431 ieee_mkobject (bfd
*abfd
)
1435 output_ptr_start
= NULL
;
1437 output_ptr_end
= NULL
;
1438 input_ptr_start
= NULL
;
1440 input_ptr_end
= NULL
;
1444 amt
= sizeof (ieee_data_type
);
1445 abfd
->tdata
.ieee_data
= bfd_zalloc (abfd
, amt
);
1446 return abfd
->tdata
.ieee_data
!= NULL
;
1450 do_one (ieee_data_type
*ieee
,
1451 ieee_per_section_type
*current_map
,
1452 unsigned char *location_ptr
,
1456 switch (this_byte (&(ieee
->h
)))
1458 case ieee_load_constant_bytes_enum
:
1460 unsigned int number_of_maus
;
1463 next_byte (&(ieee
->h
));
1464 number_of_maus
= must_parse_int (&(ieee
->h
));
1466 for (i
= 0; i
< number_of_maus
; i
++)
1468 location_ptr
[current_map
->pc
++] = this_byte (&(ieee
->h
));
1469 next_byte (&(ieee
->h
));
1474 case ieee_load_with_relocation_enum
:
1476 bfd_boolean loop
= TRUE
;
1478 next_byte (&(ieee
->h
));
1481 switch (this_byte (&(ieee
->h
)))
1483 case ieee_variable_R_enum
:
1485 case ieee_function_signed_open_b_enum
:
1486 case ieee_function_unsigned_open_b_enum
:
1487 case ieee_function_either_open_b_enum
:
1489 unsigned int extra
= 4;
1490 bfd_boolean pcrel
= FALSE
;
1494 r
= bfd_alloc (ieee
->h
.abfd
, sizeof (* r
));
1498 *(current_map
->reloc_tail_ptr
) = r
;
1499 current_map
->reloc_tail_ptr
= &r
->next
;
1500 r
->next
= (ieee_reloc_type
*) NULL
;
1501 next_byte (&(ieee
->h
));
1503 r
->relent
.sym_ptr_ptr
= 0;
1504 parse_expression (ieee
,
1507 &pcrel
, &extra
, §ion
);
1508 r
->relent
.address
= current_map
->pc
;
1509 s
->flags
|= SEC_RELOC
;
1510 s
->owner
->flags
|= HAS_RELOC
;
1512 if (r
->relent
.sym_ptr_ptr
== NULL
&& section
!= NULL
)
1513 r
->relent
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
1515 if (this_byte (&(ieee
->h
)) == (int) ieee_comma
)
1517 next_byte (&(ieee
->h
));
1518 /* Fetch number of bytes to pad. */
1519 extra
= must_parse_int (&(ieee
->h
));
1522 switch (this_byte (&(ieee
->h
)))
1524 case ieee_function_signed_close_b_enum
:
1525 next_byte (&(ieee
->h
));
1527 case ieee_function_unsigned_close_b_enum
:
1528 next_byte (&(ieee
->h
));
1530 case ieee_function_either_close_b_enum
:
1531 next_byte (&(ieee
->h
));
1536 /* Build a relocation entry for this type. */
1537 /* If pc rel then stick -ve pc into instruction
1538 and take out of reloc ..
1540 I've changed this. It's all too complicated. I
1541 keep 0 in the instruction now. */
1550 #if KEEPMINUSPCININST
1551 bfd_put_32 (ieee
->h
.abfd
, -current_map
->pc
,
1552 location_ptr
+ current_map
->pc
);
1553 r
->relent
.howto
= &rel32_howto
;
1554 r
->relent
.addend
-= current_map
->pc
;
1556 bfd_put_32 (ieee
->h
.abfd
, (bfd_vma
) 0, location_ptr
+
1558 r
->relent
.howto
= &rel32_howto
;
1563 bfd_put_32 (ieee
->h
.abfd
, (bfd_vma
) 0,
1564 location_ptr
+ current_map
->pc
);
1565 r
->relent
.howto
= &abs32_howto
;
1567 current_map
->pc
+= 4;
1572 #if KEEPMINUSPCININST
1573 bfd_put_16 (ieee
->h
.abfd
, (bfd_vma
) -current_map
->pc
,
1574 location_ptr
+ current_map
->pc
);
1575 r
->relent
.addend
-= current_map
->pc
;
1576 r
->relent
.howto
= &rel16_howto
;
1579 bfd_put_16 (ieee
->h
.abfd
, (bfd_vma
) 0,
1580 location_ptr
+ current_map
->pc
);
1581 r
->relent
.howto
= &rel16_howto
;
1587 bfd_put_16 (ieee
->h
.abfd
, (bfd_vma
) 0,
1588 location_ptr
+ current_map
->pc
);
1589 r
->relent
.howto
= &abs16_howto
;
1591 current_map
->pc
+= 2;
1596 #if KEEPMINUSPCININST
1597 bfd_put_8 (ieee
->h
.abfd
, (int) (-current_map
->pc
), location_ptr
+ current_map
->pc
);
1598 r
->relent
.addend
-= current_map
->pc
;
1599 r
->relent
.howto
= &rel8_howto
;
1601 bfd_put_8 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1602 r
->relent
.howto
= &rel8_howto
;
1607 bfd_put_8 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1608 r
->relent
.howto
= &abs8_howto
;
1610 current_map
->pc
+= 1;
1623 if (parse_int (&(ieee
->h
), &this_size
))
1627 for (i
= 0; i
< this_size
; i
++)
1629 location_ptr
[current_map
->pc
++] = this_byte (&(ieee
->h
));
1630 next_byte (&(ieee
->h
));
1638 /* Prevent more than the first load-item of an LR record
1639 from being repeated (MRI convention). */
1640 if (iterations
!= 1)
1648 /* Read in all the section data and relocation stuff too. */
1651 ieee_slurp_section_data (bfd
*abfd
)
1653 bfd_byte
*location_ptr
= (bfd_byte
*) NULL
;
1654 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1655 unsigned int section_number
;
1656 ieee_per_section_type
*current_map
= NULL
;
1659 /* Seek to the start of the data area. */
1660 if (ieee
->read_data
)
1662 ieee
->read_data
= TRUE
;
1663 ieee_seek (ieee
, ieee
->w
.r
.data_part
);
1665 /* Allocate enough space for all the section contents. */
1666 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
1668 ieee_per_section_type
*per
= ieee_per_section (s
);
1671 if ((s
->flags
& SEC_DEBUGGING
) != 0)
1673 per
->data
= bfd_alloc (ieee
->h
.abfd
, s
->size
);
1676 relpp
= &s
->relocation
;
1677 per
->reloc_tail_ptr
= (ieee_reloc_type
**) relpp
;
1682 switch (this_byte (&(ieee
->h
)))
1684 /* IF we see anything strange then quit. */
1688 case ieee_set_current_section_enum
:
1689 next_byte (&(ieee
->h
));
1690 section_number
= must_parse_int (&(ieee
->h
));
1691 s
= ieee
->section_table
[section_number
];
1692 s
->flags
|= SEC_LOAD
| SEC_HAS_CONTENTS
;
1693 current_map
= ieee_per_section (s
);
1694 location_ptr
= current_map
->data
- s
->vma
;
1695 /* The document I have says that Microtec's compilers reset
1696 this after a sec section, even though the standard says not
1698 current_map
->pc
= s
->vma
;
1701 case ieee_e2_first_byte_enum
:
1702 next_byte (&(ieee
->h
));
1703 switch (this_byte (&(ieee
->h
)))
1705 case ieee_set_current_pc_enum
& 0xff:
1708 ieee_symbol_index_type symbol
;
1712 next_byte (&(ieee
->h
));
1713 must_parse_int (&(ieee
->h
)); /* Throw away section #. */
1714 parse_expression (ieee
, &value
,
1718 current_map
->pc
= value
;
1719 BFD_ASSERT ((unsigned) (value
- s
->vma
) <= s
->size
);
1723 case ieee_value_starting_address_enum
& 0xff:
1724 next_byte (&(ieee
->h
));
1725 if (this_byte (&(ieee
->h
)) == ieee_function_either_open_b_enum
)
1726 next_byte (&(ieee
->h
));
1727 abfd
->start_address
= must_parse_int (&(ieee
->h
));
1728 /* We've got to the end of the data now - */
1735 case ieee_repeat_data_enum
:
1737 /* Repeat the following LD or LR n times - we do this by
1738 remembering the stream pointer before running it and
1739 resetting it and running it n times. We special case
1740 the repetition of a repeat_data/load_constant. */
1741 unsigned int iterations
;
1742 unsigned char *start
;
1744 next_byte (&(ieee
->h
));
1745 iterations
= must_parse_int (&(ieee
->h
));
1746 start
= ieee
->h
.input_p
;
1747 if (start
[0] == (int) ieee_load_constant_bytes_enum
1750 while (iterations
!= 0)
1752 location_ptr
[current_map
->pc
++] = start
[2];
1755 next_byte (&(ieee
->h
));
1756 next_byte (&(ieee
->h
));
1757 next_byte (&(ieee
->h
));
1761 while (iterations
!= 0)
1763 ieee
->h
.input_p
= start
;
1764 if (!do_one (ieee
, current_map
, location_ptr
, s
,
1772 case ieee_load_constant_bytes_enum
:
1773 case ieee_load_with_relocation_enum
:
1774 if (!do_one (ieee
, current_map
, location_ptr
, s
, 1))
1780 static const bfd_target
*
1781 ieee_object_p (bfd
*abfd
)
1785 ieee_data_type
*ieee
;
1786 unsigned char buffer
[300];
1787 ieee_data_type
*save
= IEEE_DATA (abfd
);
1790 abfd
->tdata
.ieee_data
= 0;
1791 ieee_mkobject (abfd
);
1793 ieee
= IEEE_DATA (abfd
);
1794 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1796 /* Read the first few bytes in to see if it makes sense. Ignore
1797 bfd_bread return value; The file might be very small. */
1798 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1800 ieee
->h
.input_p
= buffer
;
1801 if (this_byte_and_next (&(ieee
->h
)) != Module_Beginning
)
1802 goto got_wrong_format
;
1804 ieee
->read_symbols
= FALSE
;
1805 ieee
->read_data
= FALSE
;
1806 ieee
->section_count
= 0;
1807 ieee
->external_symbol_max_index
= 0;
1808 ieee
->external_symbol_min_index
= IEEE_PUBLIC_BASE
;
1809 ieee
->external_reference_min_index
= IEEE_REFERENCE_BASE
;
1810 ieee
->external_reference_max_index
= 0;
1811 ieee
->h
.abfd
= abfd
;
1812 ieee
->section_table
= NULL
;
1813 ieee
->section_table_size
= 0;
1815 processor
= ieee
->mb
.processor
= read_id (&(ieee
->h
));
1816 if (strcmp (processor
, "LIBRARY") == 0)
1817 goto got_wrong_format
;
1818 ieee
->mb
.module_name
= read_id (&(ieee
->h
));
1819 if (abfd
->filename
== (const char *) NULL
)
1820 abfd
->filename
= ieee
->mb
.module_name
;
1822 /* Determine the architecture and machine type of the object file. */
1824 const bfd_arch_info_type
*arch
;
1827 /* IEEE does not specify the format of the processor identification
1828 string, so the compiler is free to put in it whatever it wants.
1829 We try here to recognize different processors belonging to the
1830 m68k family. Code for other processors can be added here. */
1831 if ((processor
[0] == '6') && (processor
[1] == '8'))
1833 if (processor
[2] == '3') /* 683xx integrated processors. */
1835 switch (processor
[3])
1837 case '0': /* 68302, 68306, 68307 */
1838 case '2': /* 68322, 68328 */
1839 case '5': /* 68356 */
1840 strcpy (family
, "68000"); /* MC68000-based controllers. */
1843 case '3': /* 68330, 68331, 68332, 68333,
1844 68334, 68335, 68336, 68338 */
1845 case '6': /* 68360 */
1846 case '7': /* 68376 */
1847 strcpy (family
, "68332"); /* CPU32 and CPU32+ */
1851 if (processor
[4] == '9') /* 68349 */
1852 strcpy (family
, "68030"); /* CPU030 */
1853 else /* 68340, 68341 */
1854 strcpy (family
, "68332"); /* CPU32 and CPU32+ */
1857 default: /* Does not exist yet. */
1858 strcpy (family
, "68332"); /* Guess it will be CPU32 */
1861 else if (TOUPPER (processor
[3]) == 'F') /* 68F333 */
1862 strcpy (family
, "68332"); /* CPU32 */
1863 else if ((TOUPPER (processor
[3]) == 'C') /* Embedded controllers. */
1864 && ((TOUPPER (processor
[2]) == 'E')
1865 || (TOUPPER (processor
[2]) == 'H')
1866 || (TOUPPER (processor
[2]) == 'L')))
1868 strcpy (family
, "68");
1869 strncat (family
, processor
+ 4, 7);
1872 else /* "Regular" processors. */
1874 strncpy (family
, processor
, 9);
1878 else if ((strncmp (processor
, "cpu32", 5) == 0) /* CPU32 and CPU32+ */
1879 || (strncmp (processor
, "CPU32", 5) == 0))
1880 strcpy (family
, "68332");
1883 strncpy (family
, processor
, 9);
1887 arch
= bfd_scan_arch (family
);
1889 goto got_wrong_format
;
1890 abfd
->arch_info
= arch
;
1893 if (this_byte (&(ieee
->h
)) != (int) ieee_address_descriptor_enum
)
1896 next_byte (&(ieee
->h
));
1898 if (! parse_int (&(ieee
->h
), &ieee
->ad
.number_of_bits_mau
))
1901 if (! parse_int (&(ieee
->h
), &ieee
->ad
.number_of_maus_in_address
))
1904 /* If there is a byte order info, take it. */
1905 if (this_byte (&(ieee
->h
)) == (int) ieee_variable_L_enum
1906 || this_byte (&(ieee
->h
)) == (int) ieee_variable_M_enum
)
1907 next_byte (&(ieee
->h
));
1909 for (part
= 0; part
< N_W_VARIABLES
; part
++)
1913 if (read_2bytes (&(ieee
->h
)) != (int) ieee_assign_value_to_variable_enum
)
1916 if (this_byte_and_next (&(ieee
->h
)) != part
)
1919 ieee
->w
.offset
[part
] = parse_i (&(ieee
->h
), &ok
);
1924 if (ieee
->w
.r
.external_part
!= 0)
1925 abfd
->flags
= HAS_SYMS
;
1927 /* By now we know that this is a real IEEE file, we're going to read
1928 the whole thing into memory so that we can run up and down it
1929 quickly. We can work out how big the file is from the trailer
1932 amt
= ieee
->w
.r
.me_record
+ 1;
1933 IEEE_DATA (abfd
)->h
.first_byte
= bfd_alloc (ieee
->h
.abfd
, amt
);
1934 if (!IEEE_DATA (abfd
)->h
.first_byte
)
1936 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1938 /* FIXME: Check return value. I'm not sure whether it needs to read
1939 the entire buffer or not. */
1940 bfd_bread ((void *) (IEEE_DATA (abfd
)->h
.first_byte
),
1941 (bfd_size_type
) ieee
->w
.r
.me_record
+ 1, abfd
);
1943 ieee_slurp_sections (abfd
);
1945 if (! ieee_slurp_debug (abfd
))
1948 /* Parse section data to activate file and section flags implied by
1949 section contents. */
1950 if (! ieee_slurp_section_data (abfd
))
1955 bfd_set_error (bfd_error_wrong_format
);
1957 bfd_release (abfd
, ieee
);
1958 abfd
->tdata
.ieee_data
= save
;
1959 return (const bfd_target
*) NULL
;
1963 ieee_get_symbol_info (bfd
*ignore_abfd ATTRIBUTE_UNUSED
,
1967 bfd_symbol_info (symbol
, ret
);
1968 if (symbol
->name
[0] == ' ')
1969 ret
->name
= "* empty table entry ";
1970 if (!symbol
->section
)
1971 ret
->type
= (symbol
->flags
& BSF_LOCAL
) ? 'a' : 'A';
1975 ieee_print_symbol (bfd
*abfd
,
1978 bfd_print_symbol_type how
)
1980 FILE *file
= (FILE *) afile
;
1984 case bfd_print_symbol_name
:
1985 fprintf (file
, "%s", symbol
->name
);
1987 case bfd_print_symbol_more
:
1990 case bfd_print_symbol_all
:
1992 const char *section_name
=
1993 (symbol
->section
== (asection
*) NULL
1995 : symbol
->section
->name
);
1997 if (symbol
->name
[0] == ' ')
1998 fprintf (file
, "* empty table entry ");
2001 bfd_print_symbol_vandf (abfd
, (void *) file
, symbol
);
2003 fprintf (file
, " %-5s %04x %02x %s",
2005 (unsigned) ieee_symbol (symbol
)->index
,
2015 ieee_new_section_hook (bfd
*abfd
, asection
*newsect
)
2017 newsect
->used_by_bfd
= bfd_alloc (abfd
, (bfd_size_type
) sizeof (ieee_per_section_type
));
2018 if (!newsect
->used_by_bfd
)
2020 ieee_per_section (newsect
)->data
= NULL
;
2021 ieee_per_section (newsect
)->section
= newsect
;
2026 ieee_get_reloc_upper_bound (bfd
*abfd
, sec_ptr asect
)
2028 if ((asect
->flags
& SEC_DEBUGGING
) != 0)
2030 if (! ieee_slurp_section_data (abfd
))
2032 return (asect
->reloc_count
+ 1) * sizeof (arelent
*);
2036 ieee_get_section_contents (bfd
*abfd
,
2040 bfd_size_type count
)
2042 ieee_per_section_type
*p
= ieee_per_section (section
);
2043 if ((section
->flags
& SEC_DEBUGGING
) != 0)
2044 return _bfd_generic_get_section_contents (abfd
, section
, location
,
2046 ieee_slurp_section_data (abfd
);
2047 (void) memcpy ((void *) location
, (void *) (p
->data
+ offset
), (unsigned) count
);
2052 ieee_canonicalize_reloc (bfd
*abfd
,
2057 ieee_reloc_type
*src
= (ieee_reloc_type
*) (section
->relocation
);
2058 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
2060 if ((section
->flags
& SEC_DEBUGGING
) != 0)
2063 while (src
!= (ieee_reloc_type
*) NULL
)
2065 /* Work out which symbol to attach it this reloc to. */
2066 switch (src
->symbol
.letter
)
2069 src
->relent
.sym_ptr_ptr
=
2070 symbols
+ src
->symbol
.index
+ ieee
->external_symbol_base_offset
;
2073 src
->relent
.sym_ptr_ptr
=
2074 symbols
+ src
->symbol
.index
+ ieee
->external_reference_base_offset
;
2077 if (src
->relent
.sym_ptr_ptr
!= NULL
)
2078 src
->relent
.sym_ptr_ptr
=
2079 src
->relent
.sym_ptr_ptr
[0]->section
->symbol_ptr_ptr
;
2085 *relptr
++ = &src
->relent
;
2089 return section
->reloc_count
;
2093 comp (const void * ap
, const void * bp
)
2095 arelent
*a
= *((arelent
**) ap
);
2096 arelent
*b
= *((arelent
**) bp
);
2097 return a
->address
- b
->address
;
2100 /* Write the section headers. */
2103 ieee_write_section_part (bfd
*abfd
)
2105 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
2108 ieee
->w
.r
.section_part
= bfd_tell (abfd
);
2109 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
2111 if (! bfd_is_abs_section (s
)
2112 && (s
->flags
& SEC_DEBUGGING
) == 0)
2114 if (! ieee_write_byte (abfd
, ieee_section_type_enum
)
2115 || ! ieee_write_byte (abfd
,
2116 (bfd_byte
) (s
->index
2117 + IEEE_SECTION_NUMBER_BASE
)))
2120 if (abfd
->flags
& EXEC_P
)
2122 /* This image is executable, so output absolute sections. */
2123 if (! ieee_write_byte (abfd
, ieee_variable_A_enum
)
2124 || ! ieee_write_byte (abfd
, ieee_variable_S_enum
))
2129 if (! ieee_write_byte (abfd
, ieee_variable_C_enum
))
2133 switch (s
->flags
& (SEC_CODE
| SEC_DATA
| SEC_ROM
))
2135 case SEC_CODE
| SEC_LOAD
:
2137 if (! ieee_write_byte (abfd
, ieee_variable_P_enum
))
2142 if (! ieee_write_byte (abfd
, ieee_variable_D_enum
))
2146 case SEC_ROM
| SEC_DATA
:
2147 case SEC_ROM
| SEC_LOAD
:
2148 case SEC_ROM
| SEC_DATA
| SEC_LOAD
:
2149 if (! ieee_write_byte (abfd
, ieee_variable_R_enum
))
2154 if (! ieee_write_id (abfd
, s
->name
))
2157 if (! ieee_write_byte (abfd
, ieee_section_alignment_enum
)
2158 || ! ieee_write_byte (abfd
,
2159 (bfd_byte
) (s
->index
2160 + IEEE_SECTION_NUMBER_BASE
))
2161 || ! ieee_write_int (abfd
, (bfd_vma
) 1 << s
->alignment_power
))
2165 if (! ieee_write_2bytes (abfd
, ieee_section_size_enum
)
2166 || ! ieee_write_byte (abfd
,
2167 (bfd_byte
) (s
->index
2168 + IEEE_SECTION_NUMBER_BASE
))
2169 || ! ieee_write_int (abfd
, s
->size
))
2171 if (abfd
->flags
& EXEC_P
)
2173 /* Relocateable sections don't have asl records. */
2175 if (! ieee_write_2bytes (abfd
, ieee_section_base_address_enum
)
2176 || ! ieee_write_byte (abfd
,
2179 + IEEE_SECTION_NUMBER_BASE
)))
2180 || ! ieee_write_int (abfd
, s
->lma
))
2190 do_with_relocs (bfd
*abfd
, asection
*s
)
2192 unsigned int number_of_maus_in_address
=
2193 bfd_arch_bits_per_address (abfd
) / bfd_arch_bits_per_byte (abfd
);
2194 unsigned int relocs_to_go
= s
->reloc_count
;
2195 bfd_byte
*stream
= ieee_per_section (s
)->data
;
2196 arelent
**p
= s
->orelocation
;
2197 bfd_size_type current_byte_index
= 0;
2199 qsort (s
->orelocation
,
2201 sizeof (arelent
**),
2204 /* Output the section preheader. */
2205 if (! ieee_write_byte (abfd
, ieee_set_current_section_enum
)
2206 || ! ieee_write_byte (abfd
,
2207 (bfd_byte
) (s
->index
+ IEEE_SECTION_NUMBER_BASE
))
2208 || ! ieee_write_2bytes (abfd
, ieee_set_current_pc_enum
)
2209 || ! ieee_write_byte (abfd
,
2210 (bfd_byte
) (s
->index
+ IEEE_SECTION_NUMBER_BASE
)))
2213 if ((abfd
->flags
& EXEC_P
) != 0 && relocs_to_go
== 0)
2215 if (! ieee_write_int (abfd
, s
->lma
))
2220 if (! ieee_write_expression (abfd
, (bfd_vma
) 0, s
->symbol
, 0, 0))
2224 if (relocs_to_go
== 0)
2226 /* If there aren't any relocations then output the load constant
2227 byte opcode rather than the load with relocation opcode. */
2228 while (current_byte_index
< s
->size
)
2231 unsigned int MAXRUN
= 127;
2234 if (run
> s
->size
- current_byte_index
)
2235 run
= s
->size
- current_byte_index
;
2239 if (! ieee_write_byte (abfd
, ieee_load_constant_bytes_enum
))
2241 /* Output a stream of bytes. */
2242 if (! ieee_write_int (abfd
, run
))
2244 if (bfd_bwrite ((void *) (stream
+ current_byte_index
), run
, abfd
)
2247 current_byte_index
+= run
;
2253 if (! ieee_write_byte (abfd
, ieee_load_with_relocation_enum
))
2256 /* Output the data stream as the longest sequence of bytes
2257 possible, allowing for the a reasonable packet size and
2258 relocation stuffs. */
2261 /* Outputting a section without data, fill it up. */
2262 stream
= bfd_zalloc (abfd
, s
->size
);
2266 while (current_byte_index
< s
->size
)
2269 unsigned int MAXRUN
= 127;
2273 run
= (*p
)->address
- current_byte_index
;
2280 if (run
> s
->size
- current_byte_index
)
2281 run
= s
->size
- current_byte_index
;
2285 /* Output a stream of bytes. */
2286 if (! ieee_write_int (abfd
, run
))
2288 if (bfd_bwrite ((void *) (stream
+ current_byte_index
), run
, abfd
)
2291 current_byte_index
+= run
;
2294 /* Output any relocations here. */
2295 if (relocs_to_go
&& (*p
) && (*p
)->address
== current_byte_index
)
2298 && (*p
) && (*p
)->address
== current_byte_index
)
2302 switch (r
->howto
->size
)
2305 ov
= bfd_get_signed_32 (abfd
,
2306 stream
+ current_byte_index
);
2307 current_byte_index
+= 4;
2310 ov
= bfd_get_signed_16 (abfd
,
2311 stream
+ current_byte_index
);
2312 current_byte_index
+= 2;
2315 ov
= bfd_get_signed_8 (abfd
,
2316 stream
+ current_byte_index
);
2317 current_byte_index
++;
2325 ov
&= r
->howto
->src_mask
;
2327 if (r
->howto
->pc_relative
2328 && ! r
->howto
->pcrel_offset
)
2331 if (! ieee_write_byte (abfd
,
2332 ieee_function_either_open_b_enum
))
2335 if (r
->sym_ptr_ptr
!= (asymbol
**) NULL
)
2337 if (! ieee_write_expression (abfd
, r
->addend
+ ov
,
2339 r
->howto
->pc_relative
,
2340 (unsigned) s
->index
))
2345 if (! ieee_write_expression (abfd
, r
->addend
+ ov
,
2347 r
->howto
->pc_relative
,
2348 (unsigned) s
->index
))
2352 if (number_of_maus_in_address
2353 != bfd_get_reloc_size (r
->howto
))
2355 bfd_vma rsize
= bfd_get_reloc_size (r
->howto
);
2356 if (! ieee_write_int (abfd
, rsize
))
2359 if (! ieee_write_byte (abfd
,
2360 ieee_function_either_close_b_enum
))
2374 /* If there are no relocations in the output section then we can be
2375 clever about how we write. We block items up into a max of 127
2379 do_as_repeat (bfd
*abfd
, asection
*s
)
2383 if (! ieee_write_byte (abfd
, ieee_set_current_section_enum
)
2384 || ! ieee_write_byte (abfd
,
2385 (bfd_byte
) (s
->index
2386 + IEEE_SECTION_NUMBER_BASE
))
2387 || ! ieee_write_byte (abfd
, ieee_set_current_pc_enum
>> 8)
2388 || ! ieee_write_byte (abfd
, ieee_set_current_pc_enum
& 0xff)
2389 || ! ieee_write_byte (abfd
,
2390 (bfd_byte
) (s
->index
2391 + IEEE_SECTION_NUMBER_BASE
)))
2394 if ((abfd
->flags
& EXEC_P
) != 0)
2396 if (! ieee_write_int (abfd
, s
->lma
))
2401 if (! ieee_write_expression (abfd
, (bfd_vma
) 0, s
->symbol
, 0, 0))
2405 if (! ieee_write_byte (abfd
, ieee_repeat_data_enum
)
2406 || ! ieee_write_int (abfd
, s
->size
)
2407 || ! ieee_write_byte (abfd
, ieee_load_constant_bytes_enum
)
2408 || ! ieee_write_byte (abfd
, 1)
2409 || ! ieee_write_byte (abfd
, 0))
2417 do_without_relocs (bfd
*abfd
, asection
*s
)
2419 bfd_byte
*stream
= ieee_per_section (s
)->data
;
2421 if (stream
== 0 || ((s
->flags
& SEC_LOAD
) == 0))
2423 if (! do_as_repeat (abfd
, s
))
2430 for (i
= 0; i
< s
->size
; i
++)
2434 if (! do_with_relocs (abfd
, s
))
2439 if (! do_as_repeat (abfd
, s
))
2449 bfd_size_type amt
= input_ptr_end
- input_ptr_start
;
2450 /* FIXME: Check return value. I'm not sure whether it needs to read
2451 the entire buffer or not. */
2452 bfd_bread ((void *) input_ptr_start
, amt
, input_bfd
);
2453 input_ptr
= input_ptr_start
;
2459 bfd_size_type amt
= output_ptr
- output_ptr_start
;
2461 if (bfd_bwrite ((void *) (output_ptr_start
), amt
, output_bfd
) != amt
)
2463 output_ptr
= output_ptr_start
;
2467 #define THIS() ( *input_ptr )
2468 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill (); }
2469 #define OUT(x) { *output_ptr++ = (x); if (output_ptr == output_ptr_end) flush (); }
2472 write_int (int value
)
2474 if (value
>= 0 && value
<= 127)
2480 unsigned int length
;
2482 /* How many significant bytes ? */
2483 /* FIXME FOR LONGER INTS. */
2484 if (value
& 0xff000000)
2486 else if (value
& 0x00ff0000)
2488 else if (value
& 0x0000ff00)
2493 OUT ((int) ieee_number_repeat_start_enum
+ length
);
2511 int length
= THIS ();
2524 #define VAR(x) ((x | 0x80))
2526 copy_expression (void)
2540 value
= (value
<< 8) | THIS ();
2542 value
= (value
<< 8) | THIS ();
2544 value
= (value
<< 8) | THIS ();
2552 value
= (value
<< 8) | THIS ();
2554 value
= (value
<< 8) | THIS ();
2562 value
= (value
<< 8) | THIS ();
2579 /* Not a number, just bug out with the answer. */
2580 write_int (*(--tos
));
2587 /* PLUS anything. */
2596 ieee_data_type
*ieee
;
2600 section_number
= THIS ();
2603 ieee
= IEEE_DATA (input_bfd
);
2604 s
= ieee
->section_table
[section_number
];
2606 if (s
->output_section
)
2607 value
= s
->output_section
->lma
;
2608 value
+= s
->output_offset
;
2615 write_int (*(--tos
));
2623 /* Drop the int in the buffer, and copy a null into the gap, which we
2624 will overwrite later. */
2627 fill_int (struct output_buffer_struct
*buf
)
2629 if (buf
->buffer
== output_buffer
)
2631 /* Still a chance to output the size. */
2632 int value
= output_ptr
- buf
->ptrp
+ 3;
2633 buf
->ptrp
[0] = value
>> 24;
2634 buf
->ptrp
[1] = value
>> 16;
2635 buf
->ptrp
[2] = value
>> 8;
2636 buf
->ptrp
[3] = value
>> 0;
2641 drop_int (struct output_buffer_struct
*buf
)
2668 buf
->ptrp
= output_ptr
;
2669 buf
->buffer
= output_buffer
;
2709 #define ID copy_id ()
2710 #define INT copy_int ()
2711 #define EXP copy_expression ()
2712 #define INTn(q) copy_int ()
2713 #define EXPn(q) copy_expression ()
2716 copy_till_end (void)
2792 EXPn (instruction address
);
2826 EXPn (external function
);
2836 INTn (locked
register);
2858 /* Attribute record. */
2888 /* Unique typedefs for module. */
2889 /* GLobal typedefs. */
2890 /* High level module scope beginning. */
2892 struct output_buffer_struct ob
;
2908 /* Global function. */
2910 struct output_buffer_struct ob
;
2925 EXPn (size of block
);
2931 /* File name for source line numbers. */
2933 struct output_buffer_struct ob
;
2954 /* Local function. */
2956 struct output_buffer_struct ob
;
2975 /* Assembler module scope beginning - */
2977 struct output_buffer_struct ob
;
3003 struct output_buffer_struct ob
;
3011 INTn (section index
);
3019 EXPn (Size in Maus
);
3072 /* Moves all the debug information from the source bfd to the output
3073 bfd, and relocates any expressions it finds. */
3076 relocate_debug (bfd
*output ATTRIBUTE_UNUSED
,
3081 unsigned char input_buffer
[IBS
];
3083 input_ptr_start
= input_ptr
= input_buffer
;
3084 input_ptr_end
= input_buffer
+ IBS
;
3086 /* FIXME: Check return value. I'm not sure whether it needs to read
3087 the entire buffer or not. */
3088 bfd_bread ((void *) input_ptr_start
, (bfd_size_type
) IBS
, input
);
3092 /* Gather together all the debug information from each input BFD into
3093 one place, relocating it and emitting it as we go. */
3096 ieee_write_debug_part (bfd
*abfd
)
3098 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3099 bfd_chain_type
*chain
= ieee
->chain_root
;
3100 unsigned char obuff
[OBS
];
3101 bfd_boolean some_debug
= FALSE
;
3102 file_ptr here
= bfd_tell (abfd
);
3104 output_ptr_start
= output_ptr
= obuff
;
3105 output_ptr_end
= obuff
+ OBS
;
3109 if (chain
== (bfd_chain_type
*) NULL
)
3113 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
3114 if ((s
->flags
& SEC_DEBUGGING
) != 0)
3118 ieee
->w
.r
.debug_information_part
= 0;
3122 ieee
->w
.r
.debug_information_part
= here
;
3123 if (bfd_bwrite (s
->contents
, s
->size
, abfd
) != s
->size
)
3128 while (chain
!= (bfd_chain_type
*) NULL
)
3130 bfd
*entry
= chain
->this;
3131 ieee_data_type
*entry_ieee
= IEEE_DATA (entry
);
3133 if (entry_ieee
->w
.r
.debug_information_part
)
3135 if (bfd_seek (entry
, entry_ieee
->w
.r
.debug_information_part
,
3138 relocate_debug (abfd
, entry
);
3141 chain
= chain
->next
;
3145 ieee
->w
.r
.debug_information_part
= here
;
3147 ieee
->w
.r
.debug_information_part
= 0;
3155 /* Write the data in an ieee way. */
3158 ieee_write_data_part (bfd
*abfd
)
3162 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3163 ieee
->w
.r
.data_part
= bfd_tell (abfd
);
3165 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
3167 /* Skip sections that have no loadable contents (.bss,
3169 if ((s
->flags
& SEC_LOAD
) == 0)
3172 /* Sort the reloc records so we can insert them in the correct
3174 if (s
->reloc_count
!= 0)
3176 if (! do_with_relocs (abfd
, s
))
3181 if (! do_without_relocs (abfd
, s
))
3190 init_for_output (bfd
*abfd
)
3194 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
3196 if ((s
->flags
& SEC_DEBUGGING
) != 0)
3200 bfd_size_type size
= s
->size
;
3201 ieee_per_section (s
)->data
= bfd_alloc (abfd
, size
);
3202 if (!ieee_per_section (s
)->data
)
3209 /* Exec and core file sections. */
3211 /* Set section contents is complicated with IEEE since the format is
3212 not a byte image, but a record stream. */
3215 ieee_set_section_contents (bfd
*abfd
,
3217 const void * location
,
3219 bfd_size_type count
)
3221 if ((section
->flags
& SEC_DEBUGGING
) != 0)
3223 if (section
->contents
== NULL
)
3225 bfd_size_type size
= section
->size
;
3226 section
->contents
= bfd_alloc (abfd
, size
);
3227 if (section
->contents
== NULL
)
3230 /* bfd_set_section_contents has already checked that everything
3232 memcpy (section
->contents
+ offset
, location
, (size_t) count
);
3236 if (ieee_per_section (section
)->data
== (bfd_byte
*) NULL
)
3238 if (!init_for_output (abfd
))
3241 memcpy ((void *) (ieee_per_section (section
)->data
+ offset
),
3243 (unsigned int) count
);
3247 /* Write the external symbols of a file. IEEE considers two sorts of
3248 external symbols, public, and referenced. It uses to internal
3249 forms to index them as well. When we write them out we turn their
3250 symbol values into indexes from the right base. */
3253 ieee_write_external_part (bfd
*abfd
)
3256 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3257 unsigned int reference_index
= IEEE_REFERENCE_BASE
;
3258 unsigned int public_index
= IEEE_PUBLIC_BASE
+ 2;
3259 file_ptr here
= bfd_tell (abfd
);
3260 bfd_boolean hadone
= FALSE
;
3262 if (abfd
->outsymbols
!= (asymbol
**) NULL
)
3265 for (q
= abfd
->outsymbols
; *q
!= (asymbol
*) NULL
; q
++)
3269 if (bfd_is_und_section (p
->section
))
3271 /* This must be a symbol reference. */
3272 if (! ieee_write_byte (abfd
, ieee_external_reference_enum
)
3273 || ! ieee_write_int (abfd
, (bfd_vma
) reference_index
)
3274 || ! ieee_write_id (abfd
, p
->name
))
3276 p
->value
= reference_index
;
3280 else if (bfd_is_com_section (p
->section
))
3282 /* This is a weak 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 || ! ieee_write_byte (abfd
,
3287 ieee_weak_external_reference_enum
)
3288 || ! ieee_write_int (abfd
, (bfd_vma
) reference_index
)
3289 || ! ieee_write_int (abfd
, p
->value
))
3291 p
->value
= reference_index
;
3295 else if (p
->flags
& BSF_GLOBAL
)
3297 /* This must be a symbol definition. */
3298 if (! ieee_write_byte (abfd
, ieee_external_symbol_enum
)
3299 || ! ieee_write_int (abfd
, (bfd_vma
) public_index
)
3300 || ! ieee_write_id (abfd
, p
->name
)
3301 || ! ieee_write_2bytes (abfd
, ieee_attribute_record_enum
)
3302 || ! ieee_write_int (abfd
, (bfd_vma
) public_index
)
3303 || ! ieee_write_byte (abfd
, 15) /* Instruction address. */
3304 || ! ieee_write_byte (abfd
, 19) /* Static symbol. */
3305 || ! ieee_write_byte (abfd
, 1)) /* One of them. */
3308 /* Write out the value. */
3309 if (! ieee_write_2bytes (abfd
, ieee_value_record_enum
)
3310 || ! ieee_write_int (abfd
, (bfd_vma
) public_index
))
3312 if (! bfd_is_abs_section (p
->section
))
3314 if (abfd
->flags
& EXEC_P
)
3316 /* If fully linked, then output all symbols
3318 if (! (ieee_write_int
3321 + p
->section
->output_offset
3322 + p
->section
->output_section
->vma
))))
3327 if (! (ieee_write_expression
3329 p
->value
+ p
->section
->output_offset
,
3330 p
->section
->output_section
->symbol
,
3337 if (! ieee_write_expression (abfd
,
3339 bfd_abs_section_ptr
->symbol
,
3343 p
->value
= public_index
;
3349 /* This can happen - when there are gaps in the symbols read
3350 from an input ieee file. */
3355 ieee
->w
.r
.external_part
= here
;
3361 static const unsigned char exten
[] =
3364 0xf1, 0xce, 0x20, 0x00, 37, 3, 3, /* Set version 3 rev 3. */
3365 0xf1, 0xce, 0x20, 0x00, 39, 2, /* Keep symbol in original case. */
3366 0xf1, 0xce, 0x20, 0x00, 38 /* Set object type relocatable to x. */
3369 static const unsigned char envi
[] =
3373 /* 0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
3376 0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok. */
3378 0xf1, 0xce, 0x21, 0, 53, 0x03,/* host unix. */
3379 /* 0xf1, 0xce, 0x21, 0, 54, 2,1,1 tool & version # */
3383 ieee_write_me_part (bfd
*abfd
)
3385 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3386 ieee
->w
.r
.trailer_part
= bfd_tell (abfd
);
3387 if (abfd
->start_address
)
3389 if (! ieee_write_2bytes (abfd
, ieee_value_starting_address_enum
)
3390 || ! ieee_write_byte (abfd
, ieee_function_either_open_b_enum
)
3391 || ! ieee_write_int (abfd
, abfd
->start_address
)
3392 || ! ieee_write_byte (abfd
, ieee_function_either_close_b_enum
))
3395 ieee
->w
.r
.me_record
= bfd_tell (abfd
);
3396 if (! ieee_write_byte (abfd
, ieee_module_end_enum
))
3401 /* Write out the IEEE processor ID. */
3404 ieee_write_processor (bfd
*abfd
)
3406 const bfd_arch_info_type
*arch
;
3408 arch
= bfd_get_arch_info (abfd
);
3412 if (! ieee_write_id (abfd
, bfd_printable_name (abfd
)))
3416 case bfd_arch_h8300
:
3417 if (! ieee_write_id (abfd
, "H8/300"))
3421 case bfd_arch_h8500
:
3422 if (! ieee_write_id (abfd
, "H8/500"))
3430 case bfd_mach_i960_core
:
3431 case bfd_mach_i960_ka_sa
:
3432 if (! ieee_write_id (abfd
, "80960KA"))
3436 case bfd_mach_i960_kb_sb
:
3437 if (! ieee_write_id (abfd
, "80960KB"))
3441 case bfd_mach_i960_ca
:
3442 if (! ieee_write_id (abfd
, "80960CA"))
3446 case bfd_mach_i960_mc
:
3447 case bfd_mach_i960_xa
:
3448 if (! ieee_write_id (abfd
, "80960MC"))
3460 default: id
= "68020"; break;
3461 case bfd_mach_m68000
: id
= "68000"; break;
3462 case bfd_mach_m68008
: id
= "68008"; break;
3463 case bfd_mach_m68010
: id
= "68010"; break;
3464 case bfd_mach_m68020
: id
= "68020"; break;
3465 case bfd_mach_m68030
: id
= "68030"; break;
3466 case bfd_mach_m68040
: id
= "68040"; break;
3467 case bfd_mach_m68060
: id
= "68060"; break;
3468 case bfd_mach_cpu32
: id
= "cpu32"; break;
3469 case bfd_mach_mcf5200
:id
= "5200"; break;
3470 case bfd_mach_mcf5206e
:id
= "5206e"; break;
3471 case bfd_mach_mcf5307
:id
= "5307"; break;
3472 case bfd_mach_mcf5407
:id
= "5407"; break;
3473 case bfd_mach_mcf528x
:id
= "5282"; break;
3476 if (! ieee_write_id (abfd
, id
))
3486 ieee_write_object_contents (bfd
*abfd
)
3488 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3492 /* Fast forward over the header area. */
3493 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
3496 if (! ieee_write_byte (abfd
, ieee_module_beginning_enum
)
3497 || ! ieee_write_processor (abfd
)
3498 || ! ieee_write_id (abfd
, abfd
->filename
))
3501 /* Fast forward over the variable bits. */
3502 if (! ieee_write_byte (abfd
, ieee_address_descriptor_enum
))
3506 if (! ieee_write_byte (abfd
, (bfd_byte
) (bfd_arch_bits_per_byte (abfd
))))
3508 /* MAU's per address. */
3509 if (! ieee_write_byte (abfd
,
3510 (bfd_byte
) (bfd_arch_bits_per_address (abfd
)
3511 / bfd_arch_bits_per_byte (abfd
))))
3514 old
= bfd_tell (abfd
);
3515 if (bfd_seek (abfd
, (file_ptr
) (8 * N_W_VARIABLES
), SEEK_CUR
) != 0)
3518 ieee
->w
.r
.extension_record
= bfd_tell (abfd
);
3519 if (bfd_bwrite ((char *) exten
, (bfd_size_type
) sizeof (exten
), abfd
)
3522 if (abfd
->flags
& EXEC_P
)
3524 if (! ieee_write_byte (abfd
, 0x1)) /* Absolute. */
3529 if (! ieee_write_byte (abfd
, 0x2)) /* Relocateable. */
3533 ieee
->w
.r
.environmental_record
= bfd_tell (abfd
);
3534 if (bfd_bwrite ((char *) envi
, (bfd_size_type
) sizeof (envi
), abfd
)
3538 /* The HP emulator database requires a timestamp in the file. */
3544 t
= (struct tm
*) localtime (&now
);
3545 if (! ieee_write_2bytes (abfd
, (int) ieee_atn_record_enum
)
3546 || ! ieee_write_byte (abfd
, 0x21)
3547 || ! ieee_write_byte (abfd
, 0)
3548 || ! ieee_write_byte (abfd
, 50)
3549 || ! ieee_write_int (abfd
, (bfd_vma
) (t
->tm_year
+ 1900))
3550 || ! ieee_write_int (abfd
, (bfd_vma
) (t
->tm_mon
+ 1))
3551 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_mday
)
3552 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_hour
)
3553 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_min
)
3554 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_sec
))
3562 if (! ieee_write_section_part (abfd
))
3564 /* First write the symbols. This changes their values into table
3565 indeces so we cant use it after this point. */
3566 if (! ieee_write_external_part (abfd
))
3569 /* Write any debugs we have been told about. */
3570 if (! ieee_write_debug_part (abfd
))
3573 /* Can only write the data once the symbols have been written, since
3574 the data contains relocation information which points to the
3576 if (! ieee_write_data_part (abfd
))
3579 /* At the end we put the end! */
3580 if (! ieee_write_me_part (abfd
))
3583 /* Generate the header. */
3584 if (bfd_seek (abfd
, old
, SEEK_SET
) != 0)
3587 for (i
= 0; i
< N_W_VARIABLES
; i
++)
3589 if (! ieee_write_2bytes (abfd
, ieee_assign_value_to_variable_enum
)
3590 || ! ieee_write_byte (abfd
, (bfd_byte
) i
)
3591 || ! ieee_write_int5_out (abfd
, (bfd_vma
) ieee
->w
.offset
[i
]))
3598 /* Native-level interface to symbols. */
3600 /* We read the symbols into a buffer, which is discarded when this
3601 function exits. We read the strings into a buffer large enough to
3602 hold them all plus all the cached symbol entries. */
3605 ieee_make_empty_symbol (bfd
*abfd
)
3607 bfd_size_type amt
= sizeof (ieee_symbol_type
);
3608 ieee_symbol_type
*new = bfd_zalloc (abfd
, amt
);
3612 new->symbol
.the_bfd
= abfd
;
3613 return &new->symbol
;
3617 ieee_openr_next_archived_file (bfd
*arch
, bfd
*prev
)
3619 ieee_ar_data_type
*ar
= IEEE_AR_DATA (arch
);
3621 /* Take the next one from the arch state, or reset. */
3622 if (prev
== (bfd
*) NULL
)
3623 /* Reset the index - the first two entries are bogus. */
3624 ar
->element_index
= 2;
3628 ieee_ar_obstack_type
*p
= ar
->elements
+ ar
->element_index
;
3630 ar
->element_index
++;
3631 if (ar
->element_index
<= ar
->element_count
)
3633 if (p
->file_offset
!= (file_ptr
) 0)
3635 if (p
->abfd
== (bfd
*) NULL
)
3637 p
->abfd
= _bfd_create_empty_archive_element_shell (arch
);
3638 p
->abfd
->origin
= p
->file_offset
;
3645 bfd_set_error (bfd_error_no_more_archived_files
);
3652 ieee_find_nearest_line (bfd
*abfd ATTRIBUTE_UNUSED
,
3653 asection
*section ATTRIBUTE_UNUSED
,
3654 asymbol
**symbols ATTRIBUTE_UNUSED
,
3655 bfd_vma offset ATTRIBUTE_UNUSED
,
3656 const char **filename_ptr ATTRIBUTE_UNUSED
,
3657 const char **functionname_ptr ATTRIBUTE_UNUSED
,
3658 unsigned int *line_ptr ATTRIBUTE_UNUSED
)
3664 ieee_find_inliner_info (bfd
*abfd ATTRIBUTE_UNUSED
,
3665 const char **filename_ptr ATTRIBUTE_UNUSED
,
3666 const char **functionname_ptr ATTRIBUTE_UNUSED
,
3667 unsigned int *line_ptr ATTRIBUTE_UNUSED
)
3673 ieee_generic_stat_arch_elt (bfd
*abfd
, struct stat
*buf
)
3675 ieee_ar_data_type
*ar
= (ieee_ar_data_type
*) NULL
;
3676 ieee_data_type
*ieee
;
3678 if (abfd
->my_archive
!= NULL
)
3679 ar
= abfd
->my_archive
->tdata
.ieee_ar_data
;
3680 if (ar
== (ieee_ar_data_type
*) NULL
)
3682 bfd_set_error (bfd_error_invalid_operation
);
3686 if (IEEE_DATA (abfd
) == NULL
)
3688 if (ieee_object_p (abfd
) == NULL
)
3690 bfd_set_error (bfd_error_wrong_format
);
3695 ieee
= IEEE_DATA (abfd
);
3697 buf
->st_size
= ieee
->w
.r
.me_record
+ 1;
3698 buf
->st_mode
= 0644;
3703 ieee_sizeof_headers (bfd
*abfd ATTRIBUTE_UNUSED
,
3704 bfd_boolean x ATTRIBUTE_UNUSED
)
3709 #define ieee_close_and_cleanup _bfd_generic_close_and_cleanup
3710 #define ieee_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
3712 #define ieee_slurp_armap bfd_true
3713 #define ieee_slurp_extended_name_table bfd_true
3714 #define ieee_construct_extended_name_table \
3716 (bfd *, char **, bfd_size_type *, const char **)) \
3718 #define ieee_truncate_arname bfd_dont_truncate_arname
3719 #define ieee_write_armap \
3721 (bfd *, unsigned int, struct orl *, unsigned int, int)) \
3723 #define ieee_read_ar_hdr bfd_nullvoidptr
3724 #define ieee_update_armap_timestamp bfd_true
3725 #define ieee_get_elt_at_index _bfd_generic_get_elt_at_index
3727 #define ieee_bfd_is_target_special_symbol \
3728 ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
3729 #define ieee_bfd_is_local_label_name bfd_generic_is_local_label_name
3730 #define ieee_get_lineno _bfd_nosymbols_get_lineno
3731 #define ieee_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
3732 #define ieee_read_minisymbols _bfd_generic_read_minisymbols
3733 #define ieee_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
3735 #define ieee_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
3737 #define ieee_set_arch_mach _bfd_generic_set_arch_mach
3739 #define ieee_get_section_contents_in_window \
3740 _bfd_generic_get_section_contents_in_window
3741 #define ieee_bfd_get_relocated_section_contents \
3742 bfd_generic_get_relocated_section_contents
3743 #define ieee_bfd_relax_section bfd_generic_relax_section
3744 #define ieee_bfd_gc_sections bfd_generic_gc_sections
3745 #define ieee_bfd_merge_sections bfd_generic_merge_sections
3746 #define ieee_bfd_is_group_section bfd_generic_is_group_section
3747 #define ieee_bfd_discard_group bfd_generic_discard_group
3748 #define ieee_section_already_linked \
3749 _bfd_generic_section_already_linked
3750 #define ieee_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
3751 #define ieee_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
3752 #define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols
3753 #define ieee_bfd_link_just_syms _bfd_generic_link_just_syms
3754 #define ieee_bfd_final_link _bfd_generic_final_link
3755 #define ieee_bfd_link_split_section _bfd_generic_link_split_section
3757 const bfd_target ieee_vec
=
3760 bfd_target_ieee_flavour
,
3761 BFD_ENDIAN_UNKNOWN
, /* Target byte order. */
3762 BFD_ENDIAN_UNKNOWN
, /* Target headers byte order. */
3763 (HAS_RELOC
| EXEC_P
| /* Object flags. */
3764 HAS_LINENO
| HAS_DEBUG
|
3765 HAS_SYMS
| HAS_LOCALS
| WP_TEXT
| D_PAGED
),
3766 (SEC_CODE
| SEC_DATA
| SEC_ROM
| SEC_HAS_CONTENTS
3767 | SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
), /* Section flags. */
3768 '_', /* Leading underscore. */
3769 ' ', /* AR_pad_char. */
3770 16, /* AR_max_namelen. */
3771 bfd_getb64
, bfd_getb_signed_64
, bfd_putb64
,
3772 bfd_getb32
, bfd_getb_signed_32
, bfd_putb32
,
3773 bfd_getb16
, bfd_getb_signed_16
, bfd_putb16
, /* Data. */
3774 bfd_getb64
, bfd_getb_signed_64
, bfd_putb64
,
3775 bfd_getb32
, bfd_getb_signed_32
, bfd_putb32
,
3776 bfd_getb16
, bfd_getb_signed_16
, bfd_putb16
, /* Headers. */
3779 ieee_object_p
, /* bfd_check_format. */
3786 _bfd_generic_mkarchive
,
3791 ieee_write_object_contents
,
3792 _bfd_write_archive_contents
,
3796 /* ieee_close_and_cleanup, ieee_bfd_free_cached_info, ieee_new_section_hook,
3797 ieee_get_section_contents, ieee_get_section_contents_in_window. */
3798 BFD_JUMP_TABLE_GENERIC (ieee
),
3800 BFD_JUMP_TABLE_COPY (_bfd_generic
),
3801 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
3803 /* ieee_slurp_armap, ieee_slurp_extended_name_table,
3804 ieee_construct_extended_name_table, ieee_truncate_arname,
3805 ieee_write_armap, ieee_read_ar_hdr, ieee_openr_next_archived_file,
3806 ieee_get_elt_at_index, ieee_generic_stat_arch_elt,
3807 ieee_update_armap_timestamp. */
3808 BFD_JUMP_TABLE_ARCHIVE (ieee
),
3810 /* ieee_get_symtab_upper_bound, ieee_canonicalize_symtab,
3811 ieee_make_empty_symbol, ieee_print_symbol, ieee_get_symbol_info,
3812 ieee_bfd_is_local_label_name, ieee_get_lineno,
3813 ieee_find_nearest_line, ieee_bfd_make_debug_symbol,
3814 ieee_read_minisymbols, ieee_minisymbol_to_symbol. */
3815 BFD_JUMP_TABLE_SYMBOLS (ieee
),
3817 /* ieee_get_reloc_upper_bound, ieee_canonicalize_reloc,
3818 ieee_bfd_reloc_type_lookup. */
3819 BFD_JUMP_TABLE_RELOCS (ieee
),
3821 /* ieee_set_arch_mach, ieee_set_section_contents. */
3822 BFD_JUMP_TABLE_WRITE (ieee
),
3824 /* ieee_sizeof_headers, ieee_bfd_get_relocated_section_contents,
3825 ieee_bfd_relax_section, ieee_bfd_link_hash_table_create,
3826 _bfd_generic_link_hash_table_free,
3827 ieee_bfd_link_add_symbols, ieee_bfd_final_link,
3828 ieee_bfd_link_split_section, ieee_bfd_gc_sections,
3829 ieee_bfd_merge_sections. */
3830 BFD_JUMP_TABLE_LINK (ieee
),
3832 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic
),