1 /* BFD back-end for ieee-695 objects.
2 Copyright (C) 1990-2014 Free Software Foundation, Inc.
4 Written by Steve Chamberlain of Cygnus Support.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 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"
36 #include "libiberty.h"
38 struct output_buffer_struct
44 static unsigned char *output_ptr_start
;
45 static unsigned char *output_ptr
;
46 static unsigned char *output_ptr_end
;
47 static unsigned char *input_ptr_start
;
48 static unsigned char *input_ptr
;
49 static unsigned char *input_ptr_end
;
50 static bfd
*input_bfd
;
51 static bfd
*output_bfd
;
52 static int output_buffer
;
55 static void block (void);
57 /* Functions for writing to ieee files in the strange way that the
61 ieee_write_byte (bfd
*abfd
, int barg
)
66 if (bfd_bwrite ((void *) &byte
, (bfd_size_type
) 1, abfd
) != 1)
72 ieee_write_2bytes (bfd
*abfd
, int bytes
)
76 buffer
[0] = bytes
>> 8;
77 buffer
[1] = bytes
& 0xff;
78 if (bfd_bwrite ((void *) buffer
, (bfd_size_type
) 2, abfd
) != 2)
84 ieee_write_int (bfd
*abfd
, bfd_vma value
)
88 if (! ieee_write_byte (abfd
, (bfd_byte
) value
))
95 /* How many significant bytes ? */
96 /* FIXME FOR LONGER INTS. */
97 if (value
& 0xff000000)
99 else if (value
& 0x00ff0000)
101 else if (value
& 0x0000ff00)
106 if (! ieee_write_byte (abfd
,
107 (bfd_byte
) ((int) ieee_number_repeat_start_enum
113 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
>> 24)))
117 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
>> 16)))
121 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
>> 8)))
125 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
)))
134 ieee_write_id (bfd
*abfd
, const char *id
)
136 size_t length
= strlen (id
);
140 if (! ieee_write_byte (abfd
, (bfd_byte
) length
))
143 else if (length
< 255)
145 if (! ieee_write_byte (abfd
, ieee_extension_length_1_enum
)
146 || ! ieee_write_byte (abfd
, (bfd_byte
) length
))
149 else if (length
< 65535)
151 if (! ieee_write_byte (abfd
, ieee_extension_length_2_enum
)
152 || ! ieee_write_2bytes (abfd
, (int) length
))
157 (*_bfd_error_handler
)
158 (_("%s: string too long (%d chars, max 65535)"),
159 bfd_get_filename (abfd
), length
);
160 bfd_set_error (bfd_error_invalid_operation
);
164 if (bfd_bwrite ((void *) id
, (bfd_size_type
) length
, abfd
) != length
)
169 /* Functions for reading from ieee files in the strange way that the
170 standard requires. */
172 #define this_byte(ieee) *((ieee)->input_p)
173 #define next_byte(ieee) ((ieee)->input_p++)
174 #define this_byte_and_next(ieee) (*((ieee)->input_p++))
176 static unsigned short
177 read_2bytes (common_header_type
*ieee
)
179 unsigned char c1
= this_byte_and_next (ieee
);
180 unsigned char c2
= this_byte_and_next (ieee
);
182 return (c1
<< 8) | c2
;
186 bfd_get_string (common_header_type
*ieee
, char *string
, size_t length
)
190 for (i
= 0; i
< length
; i
++)
191 string
[i
] = this_byte_and_next (ieee
);
195 read_id (common_header_type
*ieee
)
200 length
= this_byte_and_next (ieee
);
202 /* Simple string of length 0 to 127. */
205 else if (length
== 0xde)
206 /* Length is next byte, allowing 0..255. */
207 length
= this_byte_and_next (ieee
);
209 else if (length
== 0xdf)
211 /* Length is next two bytes, allowing 0..65535. */
212 length
= this_byte_and_next (ieee
);
213 length
= (length
* 256) + this_byte_and_next (ieee
);
216 /* Buy memory and read string. */
217 string
= bfd_alloc (ieee
->abfd
, (bfd_size_type
) length
+ 1);
220 bfd_get_string (ieee
, string
, length
);
226 ieee_write_expression (bfd
*abfd
,
232 unsigned int term_count
= 0;
236 if (! ieee_write_int (abfd
, value
))
241 /* Badly formatted binaries can have a missing symbol,
242 so test here to prevent a seg fault. */
245 if (bfd_is_com_section (symbol
->section
)
246 || bfd_is_und_section (symbol
->section
))
248 /* Def of a common symbol. */
249 if (! ieee_write_byte (abfd
, ieee_variable_X_enum
)
250 || ! ieee_write_int (abfd
, symbol
->value
))
254 else if (! bfd_is_abs_section (symbol
->section
))
256 /* Ref to defined symbol - */
257 if (symbol
->flags
& BSF_GLOBAL
)
259 if (! ieee_write_byte (abfd
, ieee_variable_I_enum
)
260 || ! ieee_write_int (abfd
, symbol
->value
))
264 else if (symbol
->flags
& (BSF_LOCAL
| BSF_SECTION_SYM
))
266 /* This is a reference to a defined local symbol. We can
267 easily do a local as a section+offset. */
268 if (! ieee_write_byte (abfd
, ieee_variable_R_enum
)
269 || ! ieee_write_byte (abfd
,
270 (bfd_byte
) (symbol
->section
->index
271 + IEEE_SECTION_NUMBER_BASE
)))
275 if (symbol
->value
!= 0)
277 if (! ieee_write_int (abfd
, symbol
->value
))
284 (*_bfd_error_handler
)
285 (_("%s: unrecognized symbol `%s' flags 0x%x"),
286 bfd_get_filename (abfd
), bfd_asymbol_name (symbol
),
288 bfd_set_error (bfd_error_invalid_operation
);
296 /* Subtract the pc from here by asking for PC of this section. */
297 if (! ieee_write_byte (abfd
, ieee_variable_P_enum
)
298 || ! ieee_write_byte (abfd
,
299 (bfd_byte
) (sindex
+ IEEE_SECTION_NUMBER_BASE
))
300 || ! ieee_write_byte (abfd
, ieee_function_minus_enum
))
304 /* Handle the degenerate case of a 0 address. */
306 if (! ieee_write_int (abfd
, (bfd_vma
) 0))
309 while (term_count
> 1)
311 if (! ieee_write_byte (abfd
, ieee_function_plus_enum
))
319 /* Writes any integer into the buffer supplied and always takes 5 bytes. */
322 ieee_write_int5 (bfd_byte
*buffer
, bfd_vma value
)
324 buffer
[0] = (bfd_byte
) ieee_number_repeat_4_enum
;
325 buffer
[1] = (value
>> 24) & 0xff;
326 buffer
[2] = (value
>> 16) & 0xff;
327 buffer
[3] = (value
>> 8) & 0xff;
328 buffer
[4] = (value
>> 0) & 0xff;
332 ieee_write_int5_out (bfd
*abfd
, bfd_vma value
)
336 ieee_write_int5 (b
, value
);
337 if (bfd_bwrite ((void *) b
, (bfd_size_type
) 5, abfd
) != 5)
343 parse_int (common_header_type
*ieee
, bfd_vma
*value_ptr
)
345 int value
= this_byte (ieee
);
348 if (value
>= 0 && value
<= 127)
354 else if (value
>= 0x80 && value
<= 0x88)
356 unsigned int count
= value
& 0xf;
362 result
= (result
<< 8) | this_byte_and_next (ieee
);
372 parse_i (common_header_type
*ieee
, bfd_boolean
*ok
)
375 *ok
= parse_int (ieee
, &x
);
380 must_parse_int (common_header_type
*ieee
)
383 BFD_ASSERT (parse_int (ieee
, &result
));
391 ieee_symbol_index_type symbol
;
395 #if KEEPMINUSPCININST
397 #define SRC_MASK(arg) arg
398 #define PCREL_OFFSET FALSE
402 #define SRC_MASK(arg) 0
403 #define PCREL_OFFSET TRUE
407 static reloc_howto_type abs32_howto
=
414 complain_overflow_bitfield
,
422 static reloc_howto_type abs16_howto
=
429 complain_overflow_bitfield
,
437 static reloc_howto_type abs8_howto
=
444 complain_overflow_bitfield
,
452 static reloc_howto_type rel32_howto
=
459 complain_overflow_signed
,
463 SRC_MASK (0xffffffff),
467 static reloc_howto_type rel16_howto
=
474 complain_overflow_signed
,
478 SRC_MASK (0x0000ffff),
482 static reloc_howto_type rel8_howto
=
489 complain_overflow_signed
,
493 SRC_MASK (0x000000ff),
497 static ieee_symbol_index_type NOSYMBOL
= {0, 0};
500 parse_expression (ieee_data_type
*ieee
,
502 ieee_symbol_index_type
*symbol
,
508 bfd_boolean loop
= TRUE
;
509 ieee_value_type stack
[10];
510 ieee_value_type
*sp
= stack
;
519 /* The stack pointer always points to the next unused location. */
520 #define PUSH(x,y,z) TOS.symbol = x; TOS.section = y; TOS.value = z; INC;
521 #define POP(x,y,z) DEC; x = TOS.symbol; y = TOS.section; z = TOS.value;
523 while (loop
&& ieee
->h
.input_p
< ieee
->h
.last_byte
)
525 switch (this_byte (&(ieee
->h
)))
527 case ieee_variable_P_enum
:
528 /* P variable, current program counter for section n. */
532 next_byte (&(ieee
->h
));
534 section_n
= must_parse_int (&(ieee
->h
));
536 PUSH (NOSYMBOL
, bfd_abs_section_ptr
, 0);
539 case ieee_variable_L_enum
:
540 /* L variable address of section N. */
541 next_byte (&(ieee
->h
));
542 PUSH (NOSYMBOL
, ieee
->section_table
[must_parse_int (&(ieee
->h
))], 0);
544 case ieee_variable_R_enum
:
545 /* R variable, logical address of section module. */
546 /* FIXME, this should be different to L. */
547 next_byte (&(ieee
->h
));
548 PUSH (NOSYMBOL
, ieee
->section_table
[must_parse_int (&(ieee
->h
))], 0);
550 case ieee_variable_S_enum
:
551 /* S variable, size in MAUS of section module. */
552 next_byte (&(ieee
->h
));
555 ieee
->section_table
[must_parse_int (&(ieee
->h
))]->size
);
557 case ieee_variable_I_enum
:
558 /* Push the address of variable n. */
560 ieee_symbol_index_type sy
;
562 next_byte (&(ieee
->h
));
563 sy
.index
= (int) must_parse_int (&(ieee
->h
));
566 PUSH (sy
, bfd_abs_section_ptr
, 0);
569 case ieee_variable_X_enum
:
570 /* Push the address of external variable n. */
572 ieee_symbol_index_type sy
;
574 next_byte (&(ieee
->h
));
575 sy
.index
= (int) (must_parse_int (&(ieee
->h
)));
578 PUSH (sy
, bfd_und_section_ptr
, 0);
581 case ieee_function_minus_enum
:
583 bfd_vma value1
, value2
;
584 asection
*section1
, *section_dummy
;
585 ieee_symbol_index_type sy
;
587 next_byte (&(ieee
->h
));
589 POP (sy
, section1
, value1
);
590 POP (sy
, section_dummy
, value2
);
591 PUSH (sy
, section1
? section1
: section_dummy
, value2
- value1
);
594 case ieee_function_plus_enum
:
596 bfd_vma value1
, value2
;
599 ieee_symbol_index_type sy1
;
600 ieee_symbol_index_type sy2
;
602 next_byte (&(ieee
->h
));
604 POP (sy1
, section1
, value1
);
605 POP (sy2
, section2
, value2
);
606 PUSH (sy1
.letter
? sy1
: sy2
,
607 bfd_is_abs_section (section1
) ? section2
: section1
,
615 BFD_ASSERT (this_byte (&(ieee
->h
)) < (int) ieee_variable_A_enum
616 || this_byte (&(ieee
->h
)) > (int) ieee_variable_Z_enum
);
617 if (parse_int (&(ieee
->h
), &va
))
619 PUSH (NOSYMBOL
, bfd_abs_section_ptr
, va
);
622 /* Thats all that we can understand. */
628 /* As far as I can see there is a bug in the Microtec IEEE output
629 which I'm using to scan, whereby the comma operator is omitted
630 sometimes in an expression, giving expressions with too many
631 terms. We can tell if that's the case by ensuring that
632 sp == stack here. If not, then we've pushed something too far,
633 so we keep adding. */
634 while (sp
!= stack
+ 1)
637 ieee_symbol_index_type sy1
;
639 POP (sy1
, section1
, *extra
);
644 POP (*symbol
, dummy
, *value
);
650 #define ieee_seek(ieee, offset) \
653 ieee->h.input_p = ieee->h.first_byte + offset; \
654 ieee->h.last_byte = (ieee->h.first_byte \
655 + ieee_part_after (ieee, offset)); \
659 #define ieee_pos(ieee) \
660 (ieee->h.input_p - ieee->h.first_byte)
662 /* Find the first part of the ieee file after HERE. */
665 ieee_part_after (ieee_data_type
*ieee
, file_ptr here
)
668 file_ptr after
= ieee
->w
.r
.me_record
;
670 /* File parts can come in any order, except that module end is
671 guaranteed to be last (and the header first). */
672 for (part
= 0; part
< N_W_VARIABLES
; part
++)
673 if (ieee
->w
.offset
[part
] > here
&& after
> ieee
->w
.offset
[part
])
674 after
= ieee
->w
.offset
[part
];
679 static unsigned int last_index
;
680 static char last_type
; /* Is the index for an X or a D. */
682 static ieee_symbol_type
*
683 get_symbol (bfd
*abfd ATTRIBUTE_UNUSED
,
684 ieee_data_type
*ieee
,
685 ieee_symbol_type
*last_symbol
,
686 unsigned int *symbol_count
,
687 ieee_symbol_type
***pptr
,
688 unsigned int *max_index
,
691 /* Need a new symbol. */
692 unsigned int new_index
= must_parse_int (&(ieee
->h
));
694 if (new_index
!= last_index
|| this_type
!= last_type
)
696 ieee_symbol_type
*new_symbol
;
697 bfd_size_type amt
= sizeof (ieee_symbol_type
);
699 new_symbol
= bfd_alloc (ieee
->h
.abfd
, amt
);
703 new_symbol
->index
= new_index
;
704 last_index
= new_index
;
707 *pptr
= &new_symbol
->next
;
708 if (new_index
> *max_index
)
709 *max_index
= new_index
;
711 last_type
= this_type
;
712 new_symbol
->symbol
.section
= bfd_abs_section_ptr
;
719 ieee_slurp_external_symbols (bfd
*abfd
)
721 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
722 file_ptr offset
= ieee
->w
.r
.external_part
;
724 ieee_symbol_type
**prev_symbols_ptr
= &ieee
->external_symbols
;
725 ieee_symbol_type
**prev_reference_ptr
= &ieee
->external_reference
;
726 ieee_symbol_type
*symbol
= NULL
;
727 unsigned int symbol_count
= 0;
728 bfd_boolean loop
= TRUE
;
730 last_index
= 0xffffff;
731 ieee
->symbol_table_full
= TRUE
;
733 ieee_seek (ieee
, offset
);
737 switch (this_byte (&(ieee
->h
)))
740 next_byte (&(ieee
->h
));
742 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
744 & ieee
->external_symbol_max_index
, 'I');
748 symbol
->symbol
.the_bfd
= abfd
;
749 symbol
->symbol
.name
= read_id (&(ieee
->h
));
750 symbol
->symbol
.udata
.p
= NULL
;
751 symbol
->symbol
.flags
= BSF_NO_FLAGS
;
753 case ieee_external_symbol_enum
:
754 next_byte (&(ieee
->h
));
756 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
758 &ieee
->external_symbol_max_index
, 'D');
762 BFD_ASSERT (symbol
->index
>= ieee
->external_symbol_min_index
);
764 symbol
->symbol
.the_bfd
= abfd
;
765 symbol
->symbol
.name
= read_id (&(ieee
->h
));
766 symbol
->symbol
.udata
.p
= NULL
;
767 symbol
->symbol
.flags
= BSF_NO_FLAGS
;
769 case ieee_attribute_record_enum
>> 8:
771 unsigned int symbol_name_index
;
772 unsigned int symbol_type_index
;
773 unsigned int symbol_attribute_def
;
776 switch (read_2bytes (&ieee
->h
))
778 case ieee_attribute_record_enum
:
779 symbol_name_index
= must_parse_int (&(ieee
->h
));
780 symbol_type_index
= must_parse_int (&(ieee
->h
));
781 (void) symbol_type_index
;
782 symbol_attribute_def
= must_parse_int (&(ieee
->h
));
783 switch (symbol_attribute_def
)
787 parse_int (&ieee
->h
, &value
);
790 (*_bfd_error_handler
)
791 (_("%B: unimplemented ATI record %u for symbol %u"),
792 abfd
, symbol_attribute_def
, symbol_name_index
);
793 bfd_set_error (bfd_error_bad_value
);
798 case ieee_external_reference_info_record_enum
:
799 /* Skip over ATX record. */
800 parse_int (&(ieee
->h
), &value
);
801 parse_int (&(ieee
->h
), &value
);
802 parse_int (&(ieee
->h
), &value
);
803 parse_int (&(ieee
->h
), &value
);
805 case ieee_atn_record_enum
:
806 /* We may get call optimization information here,
807 which we just ignore. The format is
808 {$F1}${CE}{index}{$00}{$3F}{$3F}{#_of_ASNs}. */
809 parse_int (&ieee
->h
, &value
);
810 parse_int (&ieee
->h
, &value
);
811 parse_int (&ieee
->h
, &value
);
814 (*_bfd_error_handler
)
815 (_("%B: unexpected ATN type %d in external part"),
817 bfd_set_error (bfd_error_bad_value
);
820 parse_int (&ieee
->h
, &value
);
821 parse_int (&ieee
->h
, &value
);
828 switch (read_2bytes (&ieee
->h
))
830 case ieee_asn_record_enum
:
831 parse_int (&ieee
->h
, &val1
);
832 parse_int (&ieee
->h
, &val1
);
836 (*_bfd_error_handler
)
837 (_("%B: unexpected type after ATN"), abfd
);
838 bfd_set_error (bfd_error_bad_value
);
845 case ieee_value_record_enum
>> 8:
847 unsigned int symbol_name_index
;
848 ieee_symbol_index_type symbol_ignore
;
849 bfd_boolean pcrel_ignore
;
852 next_byte (&(ieee
->h
));
853 next_byte (&(ieee
->h
));
855 symbol_name_index
= must_parse_int (&(ieee
->h
));
856 (void) symbol_name_index
;
857 parse_expression (ieee
,
858 &symbol
->symbol
.value
,
862 &symbol
->symbol
.section
);
864 /* Fully linked IEEE-695 files tend to give every symbol
865 an absolute value. Try to convert that back into a
866 section relative value. FIXME: This won't always to
868 if (bfd_is_abs_section (symbol
->symbol
.section
)
869 && (abfd
->flags
& HAS_RELOC
) == 0)
874 val
= symbol
->symbol
.value
;
875 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
877 if (val
>= s
->vma
&& val
< s
->vma
+ s
->size
)
879 symbol
->symbol
.section
= s
;
880 symbol
->symbol
.value
-= s
->vma
;
886 symbol
->symbol
.flags
= BSF_GLOBAL
| BSF_EXPORT
;
890 case ieee_weak_external_reference_enum
:
895 next_byte (&(ieee
->h
));
896 /* Throw away the external reference index. */
897 (void) must_parse_int (&(ieee
->h
));
898 /* Fetch the default size if not resolved. */
899 size
= must_parse_int (&(ieee
->h
));
900 /* Fetch the default value if available. */
901 if (! parse_int (&(ieee
->h
), &value
))
903 /* This turns into a common. */
904 symbol
->symbol
.section
= bfd_com_section_ptr
;
905 symbol
->symbol
.value
= size
;
909 case ieee_external_reference_enum
:
910 next_byte (&(ieee
->h
));
912 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
914 &ieee
->external_reference_max_index
, 'X');
918 symbol
->symbol
.the_bfd
= abfd
;
919 symbol
->symbol
.name
= read_id (&(ieee
->h
));
920 symbol
->symbol
.udata
.p
= NULL
;
921 symbol
->symbol
.section
= bfd_und_section_ptr
;
922 symbol
->symbol
.value
= (bfd_vma
) 0;
923 symbol
->symbol
.flags
= 0;
925 BFD_ASSERT (symbol
->index
>= ieee
->external_reference_min_index
);
933 if (ieee
->external_symbol_max_index
!= 0)
935 ieee
->external_symbol_count
=
936 ieee
->external_symbol_max_index
-
937 ieee
->external_symbol_min_index
+ 1;
940 ieee
->external_symbol_count
= 0;
942 if (ieee
->external_reference_max_index
!= 0)
944 ieee
->external_reference_count
=
945 ieee
->external_reference_max_index
-
946 ieee
->external_reference_min_index
+ 1;
949 ieee
->external_reference_count
= 0;
952 ieee
->external_reference_count
+ ieee
->external_symbol_count
;
954 if (symbol_count
!= abfd
->symcount
)
955 /* There are gaps in the table -- */
956 ieee
->symbol_table_full
= FALSE
;
958 *prev_symbols_ptr
= NULL
;
959 *prev_reference_ptr
= NULL
;
965 ieee_slurp_symbol_table (bfd
*abfd
)
967 if (! IEEE_DATA (abfd
)->read_symbols
)
969 if (! ieee_slurp_external_symbols (abfd
))
971 IEEE_DATA (abfd
)->read_symbols
= TRUE
;
977 ieee_get_symtab_upper_bound (bfd
*abfd
)
979 if (! ieee_slurp_symbol_table (abfd
))
982 return (abfd
->symcount
!= 0) ?
983 (abfd
->symcount
+ 1) * (sizeof (ieee_symbol_type
*)) : 0;
986 /* Move from our internal lists to the canon table, and insert in
987 symbol index order. */
989 extern const bfd_target ieee_vec
;
992 ieee_canonicalize_symtab (bfd
*abfd
, asymbol
**location
)
994 ieee_symbol_type
*symp
;
995 static bfd dummy_bfd
;
996 static asymbol empty_symbol
=
1004 /* K&R compilers can't initialise unions. */
1011 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1013 dummy_bfd
.xvec
= &ieee_vec
;
1014 if (! ieee_slurp_symbol_table (abfd
))
1017 if (! ieee
->symbol_table_full
)
1019 /* Arrgh - there are gaps in the table, run through and fill them
1020 up with pointers to a null place. */
1023 for (i
= 0; i
< abfd
->symcount
; i
++)
1024 location
[i
] = &empty_symbol
;
1027 ieee
->external_symbol_base_offset
= -ieee
->external_symbol_min_index
;
1028 for (symp
= IEEE_DATA (abfd
)->external_symbols
;
1029 symp
!= (ieee_symbol_type
*) NULL
;
1031 /* Place into table at correct index locations. */
1032 location
[symp
->index
+ ieee
->external_symbol_base_offset
] = &symp
->symbol
;
1034 /* The external refs are indexed in a bit. */
1035 ieee
->external_reference_base_offset
=
1036 -ieee
->external_reference_min_index
+ ieee
->external_symbol_count
;
1038 for (symp
= IEEE_DATA (abfd
)->external_reference
;
1039 symp
!= (ieee_symbol_type
*) NULL
;
1041 location
[symp
->index
+ ieee
->external_reference_base_offset
] =
1046 location
[abfd
->symcount
] = (asymbol
*) NULL
;
1048 return abfd
->symcount
;
1052 get_section_entry (bfd
*abfd
, ieee_data_type
*ieee
, unsigned int sindex
)
1054 if (sindex
>= ieee
->section_table_size
)
1060 c
= ieee
->section_table_size
;
1067 amt
*= sizeof (asection
*);
1068 n
= bfd_realloc (ieee
->section_table
, amt
);
1072 for (i
= ieee
->section_table_size
; i
< c
; i
++)
1075 ieee
->section_table
= n
;
1076 ieee
->section_table_size
= c
;
1079 if (ieee
->section_table
[sindex
] == (asection
*) NULL
)
1081 char *tmp
= bfd_alloc (abfd
, (bfd_size_type
) 11);
1086 sprintf (tmp
, " fsec%4d", sindex
);
1087 section
= bfd_make_section (abfd
, tmp
);
1088 ieee
->section_table
[sindex
] = section
;
1089 section
->target_index
= sindex
;
1090 ieee
->section_table
[sindex
] = section
;
1092 return ieee
->section_table
[sindex
];
1096 ieee_slurp_sections (bfd
*abfd
)
1098 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1099 file_ptr offset
= ieee
->w
.r
.section_part
;
1104 bfd_byte section_type
[3];
1106 ieee_seek (ieee
, offset
);
1109 switch (this_byte (&(ieee
->h
)))
1111 case ieee_section_type_enum
:
1114 unsigned int section_index
;
1116 next_byte (&(ieee
->h
));
1117 section_index
= must_parse_int (&(ieee
->h
));
1119 section
= get_section_entry (abfd
, ieee
, section_index
);
1121 section_type
[0] = this_byte_and_next (&(ieee
->h
));
1123 /* Set minimal section attributes. Attributes are
1124 extended later, based on section contents. */
1125 switch (section_type
[0])
1128 /* Normal attributes for absolute sections. */
1129 section_type
[1] = this_byte (&(ieee
->h
));
1130 section
->flags
= SEC_ALLOC
;
1131 switch (section_type
[1])
1133 /* AS Absolute section attributes. */
1135 next_byte (&(ieee
->h
));
1136 section_type
[2] = this_byte (&(ieee
->h
));
1137 switch (section_type
[2])
1141 next_byte (&(ieee
->h
));
1142 section
->flags
|= SEC_CODE
;
1146 next_byte (&(ieee
->h
));
1147 section
->flags
|= SEC_DATA
;
1150 next_byte (&(ieee
->h
));
1151 /* Normal rom data. */
1152 section
->flags
|= SEC_ROM
| SEC_DATA
;
1160 /* Named relocatable sections (type C). */
1162 section_type
[1] = this_byte (&(ieee
->h
));
1163 section
->flags
= SEC_ALLOC
;
1164 switch (section_type
[1])
1166 case 0xD0: /* Normal code (CP). */
1167 next_byte (&(ieee
->h
));
1168 section
->flags
|= SEC_CODE
;
1170 case 0xC4: /* Normal data (CD). */
1171 next_byte (&(ieee
->h
));
1172 section
->flags
|= SEC_DATA
;
1174 case 0xD2: /* Normal rom data (CR). */
1175 next_byte (&(ieee
->h
));
1176 section
->flags
|= SEC_ROM
| SEC_DATA
;
1183 /* Read section name, use it if non empty. */
1184 name
= read_id (&ieee
->h
);
1186 section
->name
= name
;
1188 /* Skip these fields, which we don't care about. */
1190 bfd_vma parent
, brother
, context
;
1192 parse_int (&(ieee
->h
), &parent
);
1193 parse_int (&(ieee
->h
), &brother
);
1194 parse_int (&(ieee
->h
), &context
);
1198 case ieee_section_alignment_enum
:
1200 unsigned int section_index
;
1204 next_byte (&(ieee
->h
));
1205 section_index
= must_parse_int (&ieee
->h
);
1206 section
= get_section_entry (abfd
, ieee
, section_index
);
1207 if (section_index
> ieee
->section_count
)
1208 ieee
->section_count
= section_index
;
1210 section
->alignment_power
=
1211 bfd_log2 (must_parse_int (&ieee
->h
));
1212 (void) parse_int (&(ieee
->h
), &value
);
1215 case ieee_e2_first_byte_enum
:
1218 ieee_record_enum_type t
;
1220 t
= (ieee_record_enum_type
) (read_2bytes (&(ieee
->h
)));
1223 case ieee_section_size_enum
:
1224 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1225 section
->size
= must_parse_int (&(ieee
->h
));
1227 case ieee_physical_region_size_enum
:
1228 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1229 section
->size
= must_parse_int (&(ieee
->h
));
1231 case ieee_region_base_address_enum
:
1232 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1233 section
->vma
= must_parse_int (&(ieee
->h
));
1234 section
->lma
= section
->vma
;
1236 case ieee_mau_size_enum
:
1237 must_parse_int (&(ieee
->h
));
1238 must_parse_int (&(ieee
->h
));
1240 case ieee_m_value_enum
:
1241 must_parse_int (&(ieee
->h
));
1242 must_parse_int (&(ieee
->h
));
1244 case ieee_section_base_address_enum
:
1245 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1246 section
->vma
= must_parse_int (&(ieee
->h
));
1247 section
->lma
= section
->vma
;
1249 case ieee_section_offset_enum
:
1250 (void) must_parse_int (&(ieee
->h
));
1251 (void) must_parse_int (&(ieee
->h
));
1265 /* Make a section for the debugging information, if any. We don't try
1266 to interpret the debugging information; we just point the section
1267 at the area in the file so that program which understand can dig it
1271 ieee_slurp_debug (bfd
*abfd
)
1273 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1278 if (ieee
->w
.r
.debug_information_part
== 0)
1281 flags
= SEC_DEBUGGING
| SEC_HAS_CONTENTS
;
1282 sec
= bfd_make_section_with_flags (abfd
, ".debug", flags
);
1285 sec
->filepos
= ieee
->w
.r
.debug_information_part
;
1287 debug_end
= ieee_part_after (ieee
, ieee
->w
.r
.debug_information_part
);
1288 sec
->size
= debug_end
- ieee
->w
.r
.debug_information_part
;
1293 /* Archive stuff. */
1295 static const bfd_target
*
1296 ieee_archive_p (bfd
*abfd
)
1300 unsigned char buffer
[512];
1301 file_ptr buffer_offset
= 0;
1302 ieee_ar_data_type
*save
= abfd
->tdata
.ieee_ar_data
;
1303 ieee_ar_data_type
*ieee
;
1304 bfd_size_type alc_elts
;
1305 ieee_ar_obstack_type
*elts
= NULL
;
1306 bfd_size_type amt
= sizeof (ieee_ar_data_type
);
1308 abfd
->tdata
.ieee_ar_data
= bfd_alloc (abfd
, amt
);
1309 if (!abfd
->tdata
.ieee_ar_data
)
1310 goto error_ret_restore
;
1311 ieee
= IEEE_AR_DATA (abfd
);
1313 /* Ignore the return value here. It doesn't matter if we don't read
1314 the entire buffer. We might have a very small ieee file. */
1315 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1317 ieee
->h
.first_byte
= buffer
;
1318 ieee
->h
.input_p
= buffer
;
1320 ieee
->h
.abfd
= abfd
;
1322 if (this_byte (&(ieee
->h
)) != Module_Beginning
)
1323 goto got_wrong_format_error
;
1325 next_byte (&(ieee
->h
));
1326 library
= read_id (&(ieee
->h
));
1327 if (strcmp (library
, "LIBRARY") != 0)
1328 goto got_wrong_format_error
;
1330 /* Throw away the filename. */
1331 read_id (&(ieee
->h
));
1333 ieee
->element_count
= 0;
1334 ieee
->element_index
= 0;
1336 next_byte (&(ieee
->h
)); /* Drop the ad part. */
1337 must_parse_int (&(ieee
->h
)); /* And the two dummy numbers. */
1338 must_parse_int (&(ieee
->h
));
1341 elts
= bfd_malloc (alc_elts
* sizeof *elts
);
1345 /* Read the index of the BB table. */
1349 ieee_ar_obstack_type
*t
;
1351 rec
= read_2bytes (&(ieee
->h
));
1352 if (rec
!= (int) ieee_assign_value_to_variable_enum
)
1355 if (ieee
->element_count
>= alc_elts
)
1357 ieee_ar_obstack_type
*n
;
1360 n
= bfd_realloc (elts
, alc_elts
* sizeof (* elts
));
1366 t
= &elts
[ieee
->element_count
];
1367 ieee
->element_count
++;
1369 must_parse_int (&(ieee
->h
));
1370 t
->file_offset
= must_parse_int (&(ieee
->h
));
1371 t
->abfd
= (bfd
*) NULL
;
1373 /* Make sure that we don't go over the end of the buffer. */
1374 if ((size_t) ieee_pos (IEEE_DATA (abfd
)) > sizeof (buffer
) / 2)
1376 /* Past half way, reseek and reprime. */
1377 buffer_offset
+= ieee_pos (IEEE_DATA (abfd
));
1378 if (bfd_seek (abfd
, buffer_offset
, SEEK_SET
) != 0)
1381 /* Again ignore return value of bfd_bread. */
1382 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1383 ieee
->h
.first_byte
= buffer
;
1384 ieee
->h
.input_p
= buffer
;
1388 amt
= ieee
->element_count
;
1389 amt
*= sizeof *ieee
->elements
;
1390 ieee
->elements
= bfd_alloc (abfd
, amt
);
1391 if (ieee
->elements
== NULL
)
1394 memcpy (ieee
->elements
, elts
, (size_t) amt
);
1398 /* Now scan the area again, and replace BB offsets with file offsets. */
1399 for (i
= 2; i
< ieee
->element_count
; i
++)
1401 if (bfd_seek (abfd
, ieee
->elements
[i
].file_offset
, SEEK_SET
) != 0)
1404 /* Again ignore return value of bfd_bread. */
1405 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1406 ieee
->h
.first_byte
= buffer
;
1407 ieee
->h
.input_p
= buffer
;
1409 next_byte (&(ieee
->h
)); /* Drop F8. */
1410 next_byte (&(ieee
->h
)); /* Drop 14. */
1411 must_parse_int (&(ieee
->h
)); /* Drop size of block. */
1413 if (must_parse_int (&(ieee
->h
)) != 0)
1414 /* This object has been deleted. */
1415 ieee
->elements
[i
].file_offset
= 0;
1417 ieee
->elements
[i
].file_offset
= must_parse_int (&(ieee
->h
));
1420 /* abfd->has_armap = ;*/
1424 got_wrong_format_error
:
1425 bfd_set_error (bfd_error_wrong_format
);
1429 bfd_release (abfd
, ieee
);
1431 abfd
->tdata
.ieee_ar_data
= save
;
1437 ieee_mkobject (bfd
*abfd
)
1441 output_ptr_start
= NULL
;
1443 output_ptr_end
= NULL
;
1444 input_ptr_start
= NULL
;
1446 input_ptr_end
= NULL
;
1450 amt
= sizeof (ieee_data_type
);
1451 abfd
->tdata
.ieee_data
= bfd_zalloc (abfd
, amt
);
1452 return abfd
->tdata
.ieee_data
!= NULL
;
1456 do_one (ieee_data_type
*ieee
,
1457 ieee_per_section_type
*current_map
,
1458 unsigned char *location_ptr
,
1462 switch (this_byte (&(ieee
->h
)))
1464 case ieee_load_constant_bytes_enum
:
1466 unsigned int number_of_maus
;
1469 next_byte (&(ieee
->h
));
1470 number_of_maus
= must_parse_int (&(ieee
->h
));
1472 for (i
= 0; i
< number_of_maus
; i
++)
1474 location_ptr
[current_map
->pc
++] = this_byte (&(ieee
->h
));
1475 next_byte (&(ieee
->h
));
1480 case ieee_load_with_relocation_enum
:
1482 bfd_boolean loop
= TRUE
;
1484 next_byte (&(ieee
->h
));
1487 switch (this_byte (&(ieee
->h
)))
1489 case ieee_variable_R_enum
:
1491 case ieee_function_signed_open_b_enum
:
1492 case ieee_function_unsigned_open_b_enum
:
1493 case ieee_function_either_open_b_enum
:
1495 unsigned int extra
= 4;
1496 bfd_boolean pcrel
= FALSE
;
1500 r
= bfd_alloc (ieee
->h
.abfd
, sizeof (* r
));
1504 *(current_map
->reloc_tail_ptr
) = r
;
1505 current_map
->reloc_tail_ptr
= &r
->next
;
1506 r
->next
= (ieee_reloc_type
*) NULL
;
1507 next_byte (&(ieee
->h
));
1509 r
->relent
.sym_ptr_ptr
= 0;
1510 parse_expression (ieee
,
1513 &pcrel
, &extra
, §ion
);
1514 r
->relent
.address
= current_map
->pc
;
1515 s
->flags
|= SEC_RELOC
;
1516 s
->owner
->flags
|= HAS_RELOC
;
1518 if (r
->relent
.sym_ptr_ptr
== NULL
&& section
!= NULL
)
1519 r
->relent
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
1521 if (this_byte (&(ieee
->h
)) == (int) ieee_comma
)
1523 next_byte (&(ieee
->h
));
1524 /* Fetch number of bytes to pad. */
1525 extra
= must_parse_int (&(ieee
->h
));
1528 switch (this_byte (&(ieee
->h
)))
1530 case ieee_function_signed_close_b_enum
:
1531 next_byte (&(ieee
->h
));
1533 case ieee_function_unsigned_close_b_enum
:
1534 next_byte (&(ieee
->h
));
1536 case ieee_function_either_close_b_enum
:
1537 next_byte (&(ieee
->h
));
1542 /* Build a relocation entry for this type. */
1543 /* If pc rel then stick -ve pc into instruction
1544 and take out of reloc ..
1546 I've changed this. It's all too complicated. I
1547 keep 0 in the instruction now. */
1556 #if KEEPMINUSPCININST
1557 bfd_put_32 (ieee
->h
.abfd
, -current_map
->pc
,
1558 location_ptr
+ current_map
->pc
);
1559 r
->relent
.howto
= &rel32_howto
;
1560 r
->relent
.addend
-= current_map
->pc
;
1562 bfd_put_32 (ieee
->h
.abfd
, (bfd_vma
) 0, location_ptr
+
1564 r
->relent
.howto
= &rel32_howto
;
1569 bfd_put_32 (ieee
->h
.abfd
, (bfd_vma
) 0,
1570 location_ptr
+ current_map
->pc
);
1571 r
->relent
.howto
= &abs32_howto
;
1573 current_map
->pc
+= 4;
1578 #if KEEPMINUSPCININST
1579 bfd_put_16 (ieee
->h
.abfd
, (bfd_vma
) -current_map
->pc
,
1580 location_ptr
+ current_map
->pc
);
1581 r
->relent
.addend
-= current_map
->pc
;
1582 r
->relent
.howto
= &rel16_howto
;
1585 bfd_put_16 (ieee
->h
.abfd
, (bfd_vma
) 0,
1586 location_ptr
+ current_map
->pc
);
1587 r
->relent
.howto
= &rel16_howto
;
1593 bfd_put_16 (ieee
->h
.abfd
, (bfd_vma
) 0,
1594 location_ptr
+ current_map
->pc
);
1595 r
->relent
.howto
= &abs16_howto
;
1597 current_map
->pc
+= 2;
1602 #if KEEPMINUSPCININST
1603 bfd_put_8 (ieee
->h
.abfd
, (int) (-current_map
->pc
), location_ptr
+ current_map
->pc
);
1604 r
->relent
.addend
-= current_map
->pc
;
1605 r
->relent
.howto
= &rel8_howto
;
1607 bfd_put_8 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1608 r
->relent
.howto
= &rel8_howto
;
1613 bfd_put_8 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1614 r
->relent
.howto
= &abs8_howto
;
1616 current_map
->pc
+= 1;
1629 if (parse_int (&(ieee
->h
), &this_size
))
1633 for (i
= 0; i
< this_size
; i
++)
1635 location_ptr
[current_map
->pc
++] = this_byte (&(ieee
->h
));
1636 next_byte (&(ieee
->h
));
1644 /* Prevent more than the first load-item of an LR record
1645 from being repeated (MRI convention). */
1646 if (iterations
!= 1)
1654 /* Read in all the section data and relocation stuff too. */
1657 ieee_slurp_section_data (bfd
*abfd
)
1659 bfd_byte
*location_ptr
= (bfd_byte
*) NULL
;
1660 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1661 unsigned int section_number
;
1662 ieee_per_section_type
*current_map
= NULL
;
1665 /* Seek to the start of the data area. */
1666 if (ieee
->read_data
)
1668 ieee
->read_data
= TRUE
;
1669 ieee_seek (ieee
, ieee
->w
.r
.data_part
);
1671 /* Allocate enough space for all the section contents. */
1672 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
1674 ieee_per_section_type
*per
= ieee_per_section (s
);
1677 if ((s
->flags
& SEC_DEBUGGING
) != 0)
1679 per
->data
= bfd_alloc (ieee
->h
.abfd
, s
->size
);
1682 relpp
= &s
->relocation
;
1683 per
->reloc_tail_ptr
= (ieee_reloc_type
**) relpp
;
1688 switch (this_byte (&(ieee
->h
)))
1690 /* IF we see anything strange then quit. */
1694 case ieee_set_current_section_enum
:
1695 next_byte (&(ieee
->h
));
1696 section_number
= must_parse_int (&(ieee
->h
));
1697 s
= ieee
->section_table
[section_number
];
1698 s
->flags
|= SEC_LOAD
| SEC_HAS_CONTENTS
;
1699 current_map
= ieee_per_section (s
);
1700 location_ptr
= current_map
->data
- s
->vma
;
1701 /* The document I have says that Microtec's compilers reset
1702 this after a sec section, even though the standard says not
1704 current_map
->pc
= s
->vma
;
1707 case ieee_e2_first_byte_enum
:
1708 next_byte (&(ieee
->h
));
1709 switch (this_byte (&(ieee
->h
)))
1711 case ieee_set_current_pc_enum
& 0xff:
1714 ieee_symbol_index_type symbol
;
1718 next_byte (&(ieee
->h
));
1719 must_parse_int (&(ieee
->h
)); /* Throw away section #. */
1720 parse_expression (ieee
, &value
,
1724 current_map
->pc
= value
;
1725 BFD_ASSERT ((unsigned) (value
- s
->vma
) <= s
->size
);
1729 case ieee_value_starting_address_enum
& 0xff:
1730 next_byte (&(ieee
->h
));
1731 if (this_byte (&(ieee
->h
)) == ieee_function_either_open_b_enum
)
1732 next_byte (&(ieee
->h
));
1733 abfd
->start_address
= must_parse_int (&(ieee
->h
));
1734 /* We've got to the end of the data now - */
1741 case ieee_repeat_data_enum
:
1743 /* Repeat the following LD or LR n times - we do this by
1744 remembering the stream pointer before running it and
1745 resetting it and running it n times. We special case
1746 the repetition of a repeat_data/load_constant. */
1747 unsigned int iterations
;
1748 unsigned char *start
;
1750 next_byte (&(ieee
->h
));
1751 iterations
= must_parse_int (&(ieee
->h
));
1752 start
= ieee
->h
.input_p
;
1753 if (start
[0] == (int) ieee_load_constant_bytes_enum
1756 while (iterations
!= 0)
1758 location_ptr
[current_map
->pc
++] = start
[2];
1761 next_byte (&(ieee
->h
));
1762 next_byte (&(ieee
->h
));
1763 next_byte (&(ieee
->h
));
1767 while (iterations
!= 0)
1769 ieee
->h
.input_p
= start
;
1770 if (!do_one (ieee
, current_map
, location_ptr
, s
,
1778 case ieee_load_constant_bytes_enum
:
1779 case ieee_load_with_relocation_enum
:
1780 if (!do_one (ieee
, current_map
, location_ptr
, s
, 1))
1786 static const bfd_target
*
1787 ieee_object_p (bfd
*abfd
)
1791 ieee_data_type
*ieee
;
1792 unsigned char buffer
[300];
1793 ieee_data_type
*save
= IEEE_DATA (abfd
);
1796 abfd
->tdata
.ieee_data
= 0;
1797 ieee_mkobject (abfd
);
1799 ieee
= IEEE_DATA (abfd
);
1800 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1802 /* Read the first few bytes in to see if it makes sense. Ignore
1803 bfd_bread return value; The file might be very small. */
1804 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1806 ieee
->h
.input_p
= buffer
;
1807 if (this_byte_and_next (&(ieee
->h
)) != Module_Beginning
)
1808 goto got_wrong_format
;
1810 ieee
->read_symbols
= FALSE
;
1811 ieee
->read_data
= FALSE
;
1812 ieee
->section_count
= 0;
1813 ieee
->external_symbol_max_index
= 0;
1814 ieee
->external_symbol_min_index
= IEEE_PUBLIC_BASE
;
1815 ieee
->external_reference_min_index
= IEEE_REFERENCE_BASE
;
1816 ieee
->external_reference_max_index
= 0;
1817 ieee
->h
.abfd
= abfd
;
1818 ieee
->section_table
= NULL
;
1819 ieee
->section_table_size
= 0;
1821 processor
= ieee
->mb
.processor
= read_id (&(ieee
->h
));
1822 if (strcmp (processor
, "LIBRARY") == 0)
1823 goto got_wrong_format
;
1824 ieee
->mb
.module_name
= read_id (&(ieee
->h
));
1825 if (abfd
->filename
== (const char *) NULL
)
1826 abfd
->filename
= xstrdup (ieee
->mb
.module_name
);
1828 /* Determine the architecture and machine type of the object file. */
1830 const bfd_arch_info_type
*arch
;
1833 /* IEEE does not specify the format of the processor identification
1834 string, so the compiler is free to put in it whatever it wants.
1835 We try here to recognize different processors belonging to the
1836 m68k family. Code for other processors can be added here. */
1837 if ((processor
[0] == '6') && (processor
[1] == '8'))
1839 if (processor
[2] == '3') /* 683xx integrated processors. */
1841 switch (processor
[3])
1843 case '0': /* 68302, 68306, 68307 */
1844 case '2': /* 68322, 68328 */
1845 case '5': /* 68356 */
1846 strcpy (family
, "68000"); /* MC68000-based controllers. */
1849 case '3': /* 68330, 68331, 68332, 68333,
1850 68334, 68335, 68336, 68338 */
1851 case '6': /* 68360 */
1852 case '7': /* 68376 */
1853 strcpy (family
, "68332"); /* CPU32 and CPU32+ */
1857 if (processor
[4] == '9') /* 68349 */
1858 strcpy (family
, "68030"); /* CPU030 */
1859 else /* 68340, 68341 */
1860 strcpy (family
, "68332"); /* CPU32 and CPU32+ */
1863 default: /* Does not exist yet. */
1864 strcpy (family
, "68332"); /* Guess it will be CPU32 */
1867 else if (TOUPPER (processor
[3]) == 'F') /* 68F333 */
1868 strcpy (family
, "68332"); /* CPU32 */
1869 else if ((TOUPPER (processor
[3]) == 'C') /* Embedded controllers. */
1870 && ((TOUPPER (processor
[2]) == 'E')
1871 || (TOUPPER (processor
[2]) == 'H')
1872 || (TOUPPER (processor
[2]) == 'L')))
1874 strcpy (family
, "68");
1875 strncat (family
, processor
+ 4, 7);
1878 else /* "Regular" processors. */
1880 strncpy (family
, processor
, 9);
1884 else if ((CONST_STRNEQ (processor
, "cpu32")) /* CPU32 and CPU32+ */
1885 || (CONST_STRNEQ (processor
, "CPU32")))
1886 strcpy (family
, "68332");
1889 strncpy (family
, processor
, 9);
1893 arch
= bfd_scan_arch (family
);
1895 goto got_wrong_format
;
1896 abfd
->arch_info
= arch
;
1899 if (this_byte (&(ieee
->h
)) != (int) ieee_address_descriptor_enum
)
1902 next_byte (&(ieee
->h
));
1904 if (! parse_int (&(ieee
->h
), &ieee
->ad
.number_of_bits_mau
))
1907 if (! parse_int (&(ieee
->h
), &ieee
->ad
.number_of_maus_in_address
))
1910 /* If there is a byte order info, take it. */
1911 if (this_byte (&(ieee
->h
)) == (int) ieee_variable_L_enum
1912 || this_byte (&(ieee
->h
)) == (int) ieee_variable_M_enum
)
1913 next_byte (&(ieee
->h
));
1915 for (part
= 0; part
< N_W_VARIABLES
; part
++)
1919 if (read_2bytes (&(ieee
->h
)) != (int) ieee_assign_value_to_variable_enum
)
1922 if (this_byte_and_next (&(ieee
->h
)) != part
)
1925 ieee
->w
.offset
[part
] = parse_i (&(ieee
->h
), &ok
);
1930 if (ieee
->w
.r
.external_part
!= 0)
1931 abfd
->flags
= HAS_SYMS
;
1933 /* By now we know that this is a real IEEE file, we're going to read
1934 the whole thing into memory so that we can run up and down it
1935 quickly. We can work out how big the file is from the trailer
1938 amt
= ieee
->w
.r
.me_record
+ 1;
1939 IEEE_DATA (abfd
)->h
.first_byte
= bfd_alloc (ieee
->h
.abfd
, amt
);
1940 if (!IEEE_DATA (abfd
)->h
.first_byte
)
1942 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1944 /* FIXME: Check return value. I'm not sure whether it needs to read
1945 the entire buffer or not. */
1946 bfd_bread ((void *) (IEEE_DATA (abfd
)->h
.first_byte
),
1947 (bfd_size_type
) ieee
->w
.r
.me_record
+ 1, abfd
);
1949 ieee_slurp_sections (abfd
);
1951 if (! ieee_slurp_debug (abfd
))
1954 /* Parse section data to activate file and section flags implied by
1955 section contents. */
1956 if (! ieee_slurp_section_data (abfd
))
1961 bfd_set_error (bfd_error_wrong_format
);
1963 bfd_release (abfd
, ieee
);
1964 abfd
->tdata
.ieee_data
= save
;
1965 return (const bfd_target
*) NULL
;
1969 ieee_get_symbol_info (bfd
*ignore_abfd ATTRIBUTE_UNUSED
,
1973 bfd_symbol_info (symbol
, ret
);
1974 if (symbol
->name
[0] == ' ')
1975 ret
->name
= "* empty table entry ";
1976 if (!symbol
->section
)
1977 ret
->type
= (symbol
->flags
& BSF_LOCAL
) ? 'a' : 'A';
1981 ieee_print_symbol (bfd
*abfd
,
1984 bfd_print_symbol_type how
)
1986 FILE *file
= (FILE *) afile
;
1990 case bfd_print_symbol_name
:
1991 fprintf (file
, "%s", symbol
->name
);
1993 case bfd_print_symbol_more
:
1996 case bfd_print_symbol_all
:
1998 const char *section_name
=
1999 (symbol
->section
== (asection
*) NULL
2001 : symbol
->section
->name
);
2003 if (symbol
->name
[0] == ' ')
2004 fprintf (file
, "* empty table entry ");
2007 bfd_print_symbol_vandf (abfd
, (void *) file
, symbol
);
2009 fprintf (file
, " %-5s %04x %02x %s",
2011 (unsigned) ieee_symbol (symbol
)->index
,
2021 ieee_new_section_hook (bfd
*abfd
, asection
*newsect
)
2023 if (!newsect
->used_by_bfd
)
2025 newsect
->used_by_bfd
= bfd_alloc (abfd
, sizeof (ieee_per_section_type
));
2026 if (!newsect
->used_by_bfd
)
2029 ieee_per_section (newsect
)->data
= NULL
;
2030 ieee_per_section (newsect
)->section
= newsect
;
2031 return _bfd_generic_new_section_hook (abfd
, newsect
);
2035 ieee_get_reloc_upper_bound (bfd
*abfd
, sec_ptr asect
)
2037 if ((asect
->flags
& SEC_DEBUGGING
) != 0)
2039 if (! ieee_slurp_section_data (abfd
))
2041 return (asect
->reloc_count
+ 1) * sizeof (arelent
*);
2045 ieee_get_section_contents (bfd
*abfd
,
2049 bfd_size_type count
)
2051 ieee_per_section_type
*p
= ieee_per_section (section
);
2052 if ((section
->flags
& SEC_DEBUGGING
) != 0)
2053 return _bfd_generic_get_section_contents (abfd
, section
, location
,
2055 ieee_slurp_section_data (abfd
);
2056 (void) memcpy ((void *) location
, (void *) (p
->data
+ offset
), (unsigned) count
);
2061 ieee_canonicalize_reloc (bfd
*abfd
,
2066 ieee_reloc_type
*src
= (ieee_reloc_type
*) (section
->relocation
);
2067 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
2069 if ((section
->flags
& SEC_DEBUGGING
) != 0)
2072 while (src
!= (ieee_reloc_type
*) NULL
)
2074 /* Work out which symbol to attach it this reloc to. */
2075 switch (src
->symbol
.letter
)
2078 src
->relent
.sym_ptr_ptr
=
2079 symbols
+ src
->symbol
.index
+ ieee
->external_symbol_base_offset
;
2082 src
->relent
.sym_ptr_ptr
=
2083 symbols
+ src
->symbol
.index
+ ieee
->external_reference_base_offset
;
2086 if (src
->relent
.sym_ptr_ptr
!= NULL
)
2087 src
->relent
.sym_ptr_ptr
=
2088 src
->relent
.sym_ptr_ptr
[0]->section
->symbol_ptr_ptr
;
2094 *relptr
++ = &src
->relent
;
2098 return section
->reloc_count
;
2102 comp (const void * ap
, const void * bp
)
2104 arelent
*a
= *((arelent
**) ap
);
2105 arelent
*b
= *((arelent
**) bp
);
2106 return a
->address
- b
->address
;
2109 /* Write the section headers. */
2112 ieee_write_section_part (bfd
*abfd
)
2114 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
2117 ieee
->w
.r
.section_part
= bfd_tell (abfd
);
2118 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
2120 if (! bfd_is_abs_section (s
)
2121 && (s
->flags
& SEC_DEBUGGING
) == 0)
2123 if (! ieee_write_byte (abfd
, ieee_section_type_enum
)
2124 || ! ieee_write_byte (abfd
,
2125 (bfd_byte
) (s
->index
2126 + IEEE_SECTION_NUMBER_BASE
)))
2129 if (abfd
->flags
& EXEC_P
)
2131 /* This image is executable, so output absolute sections. */
2132 if (! ieee_write_byte (abfd
, ieee_variable_A_enum
)
2133 || ! ieee_write_byte (abfd
, ieee_variable_S_enum
))
2138 if (! ieee_write_byte (abfd
, ieee_variable_C_enum
))
2142 switch (s
->flags
& (SEC_CODE
| SEC_DATA
| SEC_ROM
))
2144 case SEC_CODE
| SEC_LOAD
:
2146 if (! ieee_write_byte (abfd
, ieee_variable_P_enum
))
2151 if (! ieee_write_byte (abfd
, ieee_variable_D_enum
))
2155 case SEC_ROM
| SEC_DATA
:
2156 case SEC_ROM
| SEC_LOAD
:
2157 case SEC_ROM
| SEC_DATA
| SEC_LOAD
:
2158 if (! ieee_write_byte (abfd
, ieee_variable_R_enum
))
2163 if (! ieee_write_id (abfd
, s
->name
))
2166 if (! ieee_write_byte (abfd
, ieee_section_alignment_enum
)
2167 || ! ieee_write_byte (abfd
,
2168 (bfd_byte
) (s
->index
2169 + IEEE_SECTION_NUMBER_BASE
))
2170 || ! ieee_write_int (abfd
, (bfd_vma
) 1 << s
->alignment_power
))
2174 if (! ieee_write_2bytes (abfd
, ieee_section_size_enum
)
2175 || ! ieee_write_byte (abfd
,
2176 (bfd_byte
) (s
->index
2177 + IEEE_SECTION_NUMBER_BASE
))
2178 || ! ieee_write_int (abfd
, s
->size
))
2180 if (abfd
->flags
& EXEC_P
)
2182 /* Relocateable sections don't have asl records. */
2184 if (! ieee_write_2bytes (abfd
, ieee_section_base_address_enum
)
2185 || ! ieee_write_byte (abfd
,
2188 + IEEE_SECTION_NUMBER_BASE
)))
2189 || ! ieee_write_int (abfd
, s
->lma
))
2199 do_with_relocs (bfd
*abfd
, asection
*s
)
2201 unsigned int number_of_maus_in_address
=
2202 bfd_arch_bits_per_address (abfd
) / bfd_arch_bits_per_byte (abfd
);
2203 unsigned int relocs_to_go
= s
->reloc_count
;
2204 bfd_byte
*stream
= ieee_per_section (s
)->data
;
2205 arelent
**p
= s
->orelocation
;
2206 bfd_size_type current_byte_index
= 0;
2208 qsort (s
->orelocation
,
2210 sizeof (arelent
**),
2213 /* Output the section preheader. */
2214 if (! ieee_write_byte (abfd
, ieee_set_current_section_enum
)
2215 || ! ieee_write_byte (abfd
,
2216 (bfd_byte
) (s
->index
+ IEEE_SECTION_NUMBER_BASE
))
2217 || ! ieee_write_2bytes (abfd
, ieee_set_current_pc_enum
)
2218 || ! ieee_write_byte (abfd
,
2219 (bfd_byte
) (s
->index
+ IEEE_SECTION_NUMBER_BASE
)))
2222 if ((abfd
->flags
& EXEC_P
) != 0 && relocs_to_go
== 0)
2224 if (! ieee_write_int (abfd
, s
->lma
))
2229 if (! ieee_write_expression (abfd
, (bfd_vma
) 0, s
->symbol
, 0, 0))
2233 if (relocs_to_go
== 0)
2235 /* If there aren't any relocations then output the load constant
2236 byte opcode rather than the load with relocation opcode. */
2237 while (current_byte_index
< s
->size
)
2240 unsigned int MAXRUN
= 127;
2243 if (run
> s
->size
- current_byte_index
)
2244 run
= s
->size
- current_byte_index
;
2248 if (! ieee_write_byte (abfd
, ieee_load_constant_bytes_enum
))
2250 /* Output a stream of bytes. */
2251 if (! ieee_write_int (abfd
, run
))
2253 if (bfd_bwrite ((void *) (stream
+ current_byte_index
), run
, abfd
)
2256 current_byte_index
+= run
;
2262 if (! ieee_write_byte (abfd
, ieee_load_with_relocation_enum
))
2265 /* Output the data stream as the longest sequence of bytes
2266 possible, allowing for the a reasonable packet size and
2267 relocation stuffs. */
2270 /* Outputting a section without data, fill it up. */
2271 stream
= bfd_zalloc (abfd
, s
->size
);
2275 while (current_byte_index
< s
->size
)
2278 unsigned int MAXRUN
= 127;
2282 run
= (*p
)->address
- current_byte_index
;
2289 if (run
> s
->size
- current_byte_index
)
2290 run
= s
->size
- current_byte_index
;
2294 /* Output a stream of bytes. */
2295 if (! ieee_write_int (abfd
, run
))
2297 if (bfd_bwrite ((void *) (stream
+ current_byte_index
), run
, abfd
)
2300 current_byte_index
+= run
;
2303 /* Output any relocations here. */
2304 if (relocs_to_go
&& (*p
) && (*p
)->address
== current_byte_index
)
2307 && (*p
) && (*p
)->address
== current_byte_index
)
2311 switch (r
->howto
->size
)
2314 ov
= bfd_get_signed_32 (abfd
,
2315 stream
+ current_byte_index
);
2316 current_byte_index
+= 4;
2319 ov
= bfd_get_signed_16 (abfd
,
2320 stream
+ current_byte_index
);
2321 current_byte_index
+= 2;
2324 ov
= bfd_get_signed_8 (abfd
,
2325 stream
+ current_byte_index
);
2326 current_byte_index
++;
2334 ov
&= r
->howto
->src_mask
;
2336 if (r
->howto
->pc_relative
2337 && ! r
->howto
->pcrel_offset
)
2340 if (! ieee_write_byte (abfd
,
2341 ieee_function_either_open_b_enum
))
2344 if (r
->sym_ptr_ptr
!= (asymbol
**) NULL
)
2346 if (! ieee_write_expression (abfd
, r
->addend
+ ov
,
2348 r
->howto
->pc_relative
,
2349 (unsigned) s
->index
))
2354 if (! ieee_write_expression (abfd
, r
->addend
+ ov
,
2356 r
->howto
->pc_relative
,
2357 (unsigned) s
->index
))
2361 if (number_of_maus_in_address
2362 != bfd_get_reloc_size (r
->howto
))
2364 bfd_vma rsize
= bfd_get_reloc_size (r
->howto
);
2365 if (! ieee_write_int (abfd
, rsize
))
2368 if (! ieee_write_byte (abfd
,
2369 ieee_function_either_close_b_enum
))
2383 /* If there are no relocations in the output section then we can be
2384 clever about how we write. We block items up into a max of 127
2388 do_as_repeat (bfd
*abfd
, asection
*s
)
2392 if (! ieee_write_byte (abfd
, ieee_set_current_section_enum
)
2393 || ! ieee_write_byte (abfd
,
2394 (bfd_byte
) (s
->index
2395 + IEEE_SECTION_NUMBER_BASE
))
2396 || ! ieee_write_byte (abfd
, ieee_set_current_pc_enum
>> 8)
2397 || ! ieee_write_byte (abfd
, ieee_set_current_pc_enum
& 0xff)
2398 || ! ieee_write_byte (abfd
,
2399 (bfd_byte
) (s
->index
2400 + IEEE_SECTION_NUMBER_BASE
)))
2403 if ((abfd
->flags
& EXEC_P
) != 0)
2405 if (! ieee_write_int (abfd
, s
->lma
))
2410 if (! ieee_write_expression (abfd
, (bfd_vma
) 0, s
->symbol
, 0, 0))
2414 if (! ieee_write_byte (abfd
, ieee_repeat_data_enum
)
2415 || ! ieee_write_int (abfd
, s
->size
)
2416 || ! ieee_write_byte (abfd
, ieee_load_constant_bytes_enum
)
2417 || ! ieee_write_byte (abfd
, 1)
2418 || ! ieee_write_byte (abfd
, 0))
2426 do_without_relocs (bfd
*abfd
, asection
*s
)
2428 bfd_byte
*stream
= ieee_per_section (s
)->data
;
2430 if (stream
== 0 || ((s
->flags
& SEC_LOAD
) == 0))
2432 if (! do_as_repeat (abfd
, s
))
2439 for (i
= 0; i
< s
->size
; i
++)
2443 if (! do_with_relocs (abfd
, s
))
2448 if (! do_as_repeat (abfd
, s
))
2458 bfd_size_type amt
= input_ptr_end
- input_ptr_start
;
2459 /* FIXME: Check return value. I'm not sure whether it needs to read
2460 the entire buffer or not. */
2461 bfd_bread ((void *) input_ptr_start
, amt
, input_bfd
);
2462 input_ptr
= input_ptr_start
;
2468 bfd_size_type amt
= output_ptr
- output_ptr_start
;
2470 if (bfd_bwrite ((void *) (output_ptr_start
), amt
, output_bfd
) != amt
)
2472 output_ptr
= output_ptr_start
;
2476 #define THIS() ( *input_ptr )
2477 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill (); }
2478 #define OUT(x) { *output_ptr++ = (x); if (output_ptr == output_ptr_end) flush (); }
2481 write_int (int value
)
2483 if (value
>= 0 && value
<= 127)
2489 unsigned int length
;
2491 /* How many significant bytes ? */
2492 /* FIXME FOR LONGER INTS. */
2493 if (value
& 0xff000000)
2495 else if (value
& 0x00ff0000)
2497 else if (value
& 0x0000ff00)
2502 OUT ((int) ieee_number_repeat_start_enum
+ length
);
2520 int length
= THIS ();
2533 #define VAR(x) ((x | 0x80))
2535 copy_expression (void)
2549 value
= (value
<< 8) | THIS ();
2551 value
= (value
<< 8) | THIS ();
2553 value
= (value
<< 8) | THIS ();
2561 value
= (value
<< 8) | THIS ();
2563 value
= (value
<< 8) | THIS ();
2571 value
= (value
<< 8) | THIS ();
2588 /* Not a number, just bug out with the answer. */
2589 write_int (*(--tos
));
2596 /* PLUS anything. */
2605 ieee_data_type
*ieee
;
2609 section_number
= THIS ();
2612 ieee
= IEEE_DATA (input_bfd
);
2613 s
= ieee
->section_table
[section_number
];
2615 if (s
->output_section
)
2616 value
= s
->output_section
->lma
;
2617 value
+= s
->output_offset
;
2624 write_int (*(--tos
));
2632 /* Drop the int in the buffer, and copy a null into the gap, which we
2633 will overwrite later. */
2636 fill_int (struct output_buffer_struct
*buf
)
2638 if (buf
->buffer
== output_buffer
)
2640 /* Still a chance to output the size. */
2641 int value
= output_ptr
- buf
->ptrp
+ 3;
2642 buf
->ptrp
[0] = value
>> 24;
2643 buf
->ptrp
[1] = value
>> 16;
2644 buf
->ptrp
[2] = value
>> 8;
2645 buf
->ptrp
[3] = value
>> 0;
2650 drop_int (struct output_buffer_struct
*buf
)
2678 buf
->ptrp
= output_ptr
;
2679 buf
->buffer
= output_buffer
;
2719 #define ID copy_id ()
2720 #define INT copy_int ()
2721 #define EXP copy_expression ()
2722 #define INTn(q) copy_int ()
2723 #define EXPn(q) copy_expression ()
2726 copy_till_end (void)
2802 EXPn (instruction address
);
2836 EXPn (external function
);
2846 INTn (locked
register);
2868 /* Attribute record. */
2898 /* Unique typedefs for module. */
2899 /* GLobal typedefs. */
2900 /* High level module scope beginning. */
2902 struct output_buffer_struct ob
;
2918 /* Global function. */
2920 struct output_buffer_struct ob
;
2935 EXPn (size of block
);
2941 /* File name for source line numbers. */
2943 struct output_buffer_struct ob
;
2964 /* Local function. */
2966 struct output_buffer_struct ob
;
2985 /* Assembler module scope beginning - */
2987 struct output_buffer_struct ob
;
3013 struct output_buffer_struct ob
;
3021 INTn (section index
);
3029 EXPn (Size in Maus
);
3082 /* Moves all the debug information from the source bfd to the output
3083 bfd, and relocates any expressions it finds. */
3086 relocate_debug (bfd
*output ATTRIBUTE_UNUSED
,
3091 unsigned char input_buffer
[IBS
];
3093 input_ptr_start
= input_ptr
= input_buffer
;
3094 input_ptr_end
= input_buffer
+ IBS
;
3096 /* FIXME: Check return value. I'm not sure whether it needs to read
3097 the entire buffer or not. */
3098 bfd_bread ((void *) input_ptr_start
, (bfd_size_type
) IBS
, input
);
3102 /* Gather together all the debug information from each input BFD into
3103 one place, relocating it and emitting it as we go. */
3106 ieee_write_debug_part (bfd
*abfd
)
3108 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3109 bfd_chain_type
*chain
= ieee
->chain_root
;
3110 unsigned char obuff
[OBS
];
3111 bfd_boolean some_debug
= FALSE
;
3112 file_ptr here
= bfd_tell (abfd
);
3114 output_ptr_start
= output_ptr
= obuff
;
3115 output_ptr_end
= obuff
+ OBS
;
3119 if (chain
== (bfd_chain_type
*) NULL
)
3123 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
3124 if ((s
->flags
& SEC_DEBUGGING
) != 0)
3128 ieee
->w
.r
.debug_information_part
= 0;
3132 ieee
->w
.r
.debug_information_part
= here
;
3133 if (bfd_bwrite (s
->contents
, s
->size
, abfd
) != s
->size
)
3138 while (chain
!= (bfd_chain_type
*) NULL
)
3140 bfd
*entry
= chain
->this;
3141 ieee_data_type
*entry_ieee
= IEEE_DATA (entry
);
3143 if (entry_ieee
->w
.r
.debug_information_part
)
3145 if (bfd_seek (entry
, entry_ieee
->w
.r
.debug_information_part
,
3148 relocate_debug (abfd
, entry
);
3151 chain
= chain
->next
;
3155 ieee
->w
.r
.debug_information_part
= here
;
3157 ieee
->w
.r
.debug_information_part
= 0;
3165 /* Write the data in an ieee way. */
3168 ieee_write_data_part (bfd
*abfd
)
3172 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3173 ieee
->w
.r
.data_part
= bfd_tell (abfd
);
3175 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
3177 /* Skip sections that have no loadable contents (.bss,
3179 if ((s
->flags
& SEC_LOAD
) == 0)
3182 /* Sort the reloc records so we can insert them in the correct
3184 if (s
->reloc_count
!= 0)
3186 if (! do_with_relocs (abfd
, s
))
3191 if (! do_without_relocs (abfd
, s
))
3200 init_for_output (bfd
*abfd
)
3204 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
3206 if ((s
->flags
& SEC_DEBUGGING
) != 0)
3210 bfd_size_type size
= s
->size
;
3211 ieee_per_section (s
)->data
= bfd_alloc (abfd
, size
);
3212 if (!ieee_per_section (s
)->data
)
3219 /* Exec and core file sections. */
3221 /* Set section contents is complicated with IEEE since the format is
3222 not a byte image, but a record stream. */
3225 ieee_set_section_contents (bfd
*abfd
,
3227 const void * location
,
3229 bfd_size_type count
)
3231 if ((section
->flags
& SEC_DEBUGGING
) != 0)
3233 if (section
->contents
== NULL
)
3235 bfd_size_type size
= section
->size
;
3236 section
->contents
= bfd_alloc (abfd
, size
);
3237 if (section
->contents
== NULL
)
3240 /* bfd_set_section_contents has already checked that everything
3242 memcpy (section
->contents
+ offset
, location
, (size_t) count
);
3246 if (ieee_per_section (section
)->data
== (bfd_byte
*) NULL
)
3248 if (!init_for_output (abfd
))
3251 memcpy ((void *) (ieee_per_section (section
)->data
+ offset
),
3253 (unsigned int) count
);
3257 /* Write the external symbols of a file. IEEE considers two sorts of
3258 external symbols, public, and referenced. It uses to internal
3259 forms to index them as well. When we write them out we turn their
3260 symbol values into indexes from the right base. */
3263 ieee_write_external_part (bfd
*abfd
)
3266 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3267 unsigned int reference_index
= IEEE_REFERENCE_BASE
;
3268 unsigned int public_index
= IEEE_PUBLIC_BASE
+ 2;
3269 file_ptr here
= bfd_tell (abfd
);
3270 bfd_boolean hadone
= FALSE
;
3272 if (abfd
->outsymbols
!= (asymbol
**) NULL
)
3275 for (q
= abfd
->outsymbols
; *q
!= (asymbol
*) NULL
; q
++)
3279 if (bfd_is_und_section (p
->section
))
3281 /* This must be a symbol reference. */
3282 if (! ieee_write_byte (abfd
, ieee_external_reference_enum
)
3283 || ! ieee_write_int (abfd
, (bfd_vma
) reference_index
)
3284 || ! ieee_write_id (abfd
, p
->name
))
3286 p
->value
= reference_index
;
3290 else if (bfd_is_com_section (p
->section
))
3292 /* This is a weak reference. */
3293 if (! ieee_write_byte (abfd
, ieee_external_reference_enum
)
3294 || ! ieee_write_int (abfd
, (bfd_vma
) reference_index
)
3295 || ! ieee_write_id (abfd
, p
->name
)
3296 || ! ieee_write_byte (abfd
,
3297 ieee_weak_external_reference_enum
)
3298 || ! ieee_write_int (abfd
, (bfd_vma
) reference_index
)
3299 || ! ieee_write_int (abfd
, p
->value
))
3301 p
->value
= reference_index
;
3305 else if (p
->flags
& BSF_GLOBAL
)
3307 /* This must be a symbol definition. */
3308 if (! ieee_write_byte (abfd
, ieee_external_symbol_enum
)
3309 || ! ieee_write_int (abfd
, (bfd_vma
) public_index
)
3310 || ! ieee_write_id (abfd
, p
->name
)
3311 || ! ieee_write_2bytes (abfd
, ieee_attribute_record_enum
)
3312 || ! ieee_write_int (abfd
, (bfd_vma
) public_index
)
3313 || ! ieee_write_byte (abfd
, 15) /* Instruction address. */
3314 || ! ieee_write_byte (abfd
, 19) /* Static symbol. */
3315 || ! ieee_write_byte (abfd
, 1)) /* One of them. */
3318 /* Write out the value. */
3319 if (! ieee_write_2bytes (abfd
, ieee_value_record_enum
)
3320 || ! ieee_write_int (abfd
, (bfd_vma
) public_index
))
3322 if (! bfd_is_abs_section (p
->section
))
3324 if (abfd
->flags
& EXEC_P
)
3326 /* If fully linked, then output all symbols
3328 if (! (ieee_write_int
3331 + p
->section
->output_offset
3332 + p
->section
->output_section
->vma
))))
3337 if (! (ieee_write_expression
3339 p
->value
+ p
->section
->output_offset
,
3340 p
->section
->output_section
->symbol
,
3347 if (! ieee_write_expression (abfd
,
3349 bfd_abs_section_ptr
->symbol
,
3353 p
->value
= public_index
;
3359 /* This can happen - when there are gaps in the symbols read
3360 from an input ieee file. */
3365 ieee
->w
.r
.external_part
= here
;
3371 static const unsigned char exten
[] =
3374 0xf1, 0xce, 0x20, 0x00, 37, 3, 3, /* Set version 3 rev 3. */
3375 0xf1, 0xce, 0x20, 0x00, 39, 2, /* Keep symbol in original case. */
3376 0xf1, 0xce, 0x20, 0x00, 38 /* Set object type relocatable to x. */
3379 static const unsigned char envi
[] =
3383 /* 0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
3386 0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok. */
3388 0xf1, 0xce, 0x21, 0, 53, 0x03,/* host unix. */
3389 /* 0xf1, 0xce, 0x21, 0, 54, 2,1,1 tool & version # */
3393 ieee_write_me_part (bfd
*abfd
)
3395 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3396 ieee
->w
.r
.trailer_part
= bfd_tell (abfd
);
3397 if (abfd
->start_address
)
3399 if (! ieee_write_2bytes (abfd
, ieee_value_starting_address_enum
)
3400 || ! ieee_write_byte (abfd
, ieee_function_either_open_b_enum
)
3401 || ! ieee_write_int (abfd
, abfd
->start_address
)
3402 || ! ieee_write_byte (abfd
, ieee_function_either_close_b_enum
))
3405 ieee
->w
.r
.me_record
= bfd_tell (abfd
);
3406 if (! ieee_write_byte (abfd
, ieee_module_end_enum
))
3411 /* Write out the IEEE processor ID. */
3414 ieee_write_processor (bfd
*abfd
)
3416 const bfd_arch_info_type
*arch
;
3418 arch
= bfd_get_arch_info (abfd
);
3422 if (! ieee_write_id (abfd
, bfd_printable_name (abfd
)))
3426 case bfd_arch_h8300
:
3427 if (! ieee_write_id (abfd
, "H8/300"))
3431 case bfd_arch_h8500
:
3432 if (! ieee_write_id (abfd
, "H8/500"))
3440 case bfd_mach_i960_core
:
3441 case bfd_mach_i960_ka_sa
:
3442 if (! ieee_write_id (abfd
, "80960KA"))
3446 case bfd_mach_i960_kb_sb
:
3447 if (! ieee_write_id (abfd
, "80960KB"))
3451 case bfd_mach_i960_ca
:
3452 if (! ieee_write_id (abfd
, "80960CA"))
3456 case bfd_mach_i960_mc
:
3457 case bfd_mach_i960_xa
:
3458 if (! ieee_write_id (abfd
, "80960MC"))
3470 default: id
= "68020"; break;
3471 case bfd_mach_m68000
: id
= "68000"; break;
3472 case bfd_mach_m68008
: id
= "68008"; break;
3473 case bfd_mach_m68010
: id
= "68010"; break;
3474 case bfd_mach_m68020
: id
= "68020"; break;
3475 case bfd_mach_m68030
: id
= "68030"; break;
3476 case bfd_mach_m68040
: id
= "68040"; break;
3477 case bfd_mach_m68060
: id
= "68060"; break;
3478 case bfd_mach_cpu32
: id
= "cpu32"; break;
3479 case bfd_mach_mcf_isa_a_nodiv
: id
= "isa-a:nodiv"; break;
3480 case bfd_mach_mcf_isa_a
: id
= "isa-a"; break;
3481 case bfd_mach_mcf_isa_a_mac
: id
= "isa-a:mac"; break;
3482 case bfd_mach_mcf_isa_a_emac
: id
= "isa-a:emac"; break;
3483 case bfd_mach_mcf_isa_aplus
: id
= "isa-aplus"; break;
3484 case bfd_mach_mcf_isa_aplus_mac
: id
= "isa-aplus:mac"; break;
3485 case bfd_mach_mcf_isa_aplus_emac
: id
= "isa-aplus:mac"; break;
3486 case bfd_mach_mcf_isa_b_nousp
: id
= "isa-b:nousp"; break;
3487 case bfd_mach_mcf_isa_b_nousp_mac
: id
= "isa-b:nousp:mac"; break;
3488 case bfd_mach_mcf_isa_b_nousp_emac
: id
= "isa-b:nousp:emac"; break;
3489 case bfd_mach_mcf_isa_b
: id
= "isa-b"; break;
3490 case bfd_mach_mcf_isa_b_mac
: id
= "isa-b:mac"; break;
3491 case bfd_mach_mcf_isa_b_emac
: id
= "isa-b:emac"; break;
3492 case bfd_mach_mcf_isa_b_float
: id
= "isa-b:float"; break;
3493 case bfd_mach_mcf_isa_b_float_mac
: id
= "isa-b:float:mac"; break;
3494 case bfd_mach_mcf_isa_b_float_emac
: id
= "isa-b:float:emac"; break;
3495 case bfd_mach_mcf_isa_c
: id
= "isa-c"; break;
3496 case bfd_mach_mcf_isa_c_mac
: id
= "isa-c:mac"; break;
3497 case bfd_mach_mcf_isa_c_emac
: id
= "isa-c:emac"; break;
3498 case bfd_mach_mcf_isa_c_nodiv
: id
= "isa-c:nodiv"; break;
3499 case bfd_mach_mcf_isa_c_nodiv_mac
: id
= "isa-c:nodiv:mac"; break;
3500 case bfd_mach_mcf_isa_c_nodiv_emac
: id
= "isa-c:nodiv:emac"; break;
3503 if (! ieee_write_id (abfd
, id
))
3513 ieee_write_object_contents (bfd
*abfd
)
3515 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3519 /* Fast forward over the header area. */
3520 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
3523 if (! ieee_write_byte (abfd
, ieee_module_beginning_enum
)
3524 || ! ieee_write_processor (abfd
)
3525 || ! ieee_write_id (abfd
, abfd
->filename
))
3528 /* Fast forward over the variable bits. */
3529 if (! ieee_write_byte (abfd
, ieee_address_descriptor_enum
))
3533 if (! ieee_write_byte (abfd
, (bfd_byte
) (bfd_arch_bits_per_byte (abfd
))))
3535 /* MAU's per address. */
3536 if (! ieee_write_byte (abfd
,
3537 (bfd_byte
) (bfd_arch_bits_per_address (abfd
)
3538 / bfd_arch_bits_per_byte (abfd
))))
3541 old
= bfd_tell (abfd
);
3542 if (bfd_seek (abfd
, (file_ptr
) (8 * N_W_VARIABLES
), SEEK_CUR
) != 0)
3545 ieee
->w
.r
.extension_record
= bfd_tell (abfd
);
3546 if (bfd_bwrite ((char *) exten
, (bfd_size_type
) sizeof (exten
), abfd
)
3549 if (abfd
->flags
& EXEC_P
)
3551 if (! ieee_write_byte (abfd
, 0x1)) /* Absolute. */
3556 if (! ieee_write_byte (abfd
, 0x2)) /* Relocateable. */
3560 ieee
->w
.r
.environmental_record
= bfd_tell (abfd
);
3561 if (bfd_bwrite ((char *) envi
, (bfd_size_type
) sizeof (envi
), abfd
)
3565 /* The HP emulator database requires a timestamp in the file. */
3571 t
= (struct tm
*) localtime (&now
);
3572 if (! ieee_write_2bytes (abfd
, (int) ieee_atn_record_enum
)
3573 || ! ieee_write_byte (abfd
, 0x21)
3574 || ! ieee_write_byte (abfd
, 0)
3575 || ! ieee_write_byte (abfd
, 50)
3576 || ! ieee_write_int (abfd
, (bfd_vma
) (t
->tm_year
+ 1900))
3577 || ! ieee_write_int (abfd
, (bfd_vma
) (t
->tm_mon
+ 1))
3578 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_mday
)
3579 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_hour
)
3580 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_min
)
3581 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_sec
))
3589 if (! ieee_write_section_part (abfd
))
3591 /* First write the symbols. This changes their values into table
3592 indeces so we cant use it after this point. */
3593 if (! ieee_write_external_part (abfd
))
3596 /* Write any debugs we have been told about. */
3597 if (! ieee_write_debug_part (abfd
))
3600 /* Can only write the data once the symbols have been written, since
3601 the data contains relocation information which points to the
3603 if (! ieee_write_data_part (abfd
))
3606 /* At the end we put the end! */
3607 if (! ieee_write_me_part (abfd
))
3610 /* Generate the header. */
3611 if (bfd_seek (abfd
, old
, SEEK_SET
) != 0)
3614 for (i
= 0; i
< N_W_VARIABLES
; i
++)
3616 if (! ieee_write_2bytes (abfd
, ieee_assign_value_to_variable_enum
)
3617 || ! ieee_write_byte (abfd
, (bfd_byte
) i
)
3618 || ! ieee_write_int5_out (abfd
, (bfd_vma
) ieee
->w
.offset
[i
]))
3625 /* Native-level interface to symbols. */
3627 /* We read the symbols into a buffer, which is discarded when this
3628 function exits. We read the strings into a buffer large enough to
3629 hold them all plus all the cached symbol entries. */
3632 ieee_make_empty_symbol (bfd
*abfd
)
3634 bfd_size_type amt
= sizeof (ieee_symbol_type
);
3635 ieee_symbol_type
*new_symbol
= (ieee_symbol_type
*) bfd_zalloc (abfd
, amt
);
3639 new_symbol
->symbol
.the_bfd
= abfd
;
3640 return &new_symbol
->symbol
;
3644 ieee_openr_next_archived_file (bfd
*arch
, bfd
*prev
)
3646 ieee_ar_data_type
*ar
= IEEE_AR_DATA (arch
);
3648 /* Take the next one from the arch state, or reset. */
3649 if (prev
== (bfd
*) NULL
)
3650 /* Reset the index - the first two entries are bogus. */
3651 ar
->element_index
= 2;
3655 ieee_ar_obstack_type
*p
= ar
->elements
+ ar
->element_index
;
3657 ar
->element_index
++;
3658 if (ar
->element_index
<= ar
->element_count
)
3660 if (p
->file_offset
!= (file_ptr
) 0)
3662 if (p
->abfd
== (bfd
*) NULL
)
3664 p
->abfd
= _bfd_create_empty_archive_element_shell (arch
);
3665 p
->abfd
->origin
= p
->file_offset
;
3672 bfd_set_error (bfd_error_no_more_archived_files
);
3679 ieee_find_nearest_line (bfd
*abfd ATTRIBUTE_UNUSED
,
3680 asection
*section ATTRIBUTE_UNUSED
,
3681 asymbol
**symbols ATTRIBUTE_UNUSED
,
3682 bfd_vma offset ATTRIBUTE_UNUSED
,
3683 const char **filename_ptr ATTRIBUTE_UNUSED
,
3684 const char **functionname_ptr ATTRIBUTE_UNUSED
,
3685 unsigned int *line_ptr ATTRIBUTE_UNUSED
)
3691 ieee_find_inliner_info (bfd
*abfd ATTRIBUTE_UNUSED
,
3692 const char **filename_ptr ATTRIBUTE_UNUSED
,
3693 const char **functionname_ptr ATTRIBUTE_UNUSED
,
3694 unsigned int *line_ptr ATTRIBUTE_UNUSED
)
3700 ieee_generic_stat_arch_elt (bfd
*abfd
, struct stat
*buf
)
3702 ieee_ar_data_type
*ar
= (ieee_ar_data_type
*) NULL
;
3703 ieee_data_type
*ieee
;
3705 if (abfd
->my_archive
!= NULL
)
3706 ar
= abfd
->my_archive
->tdata
.ieee_ar_data
;
3707 if (ar
== (ieee_ar_data_type
*) NULL
)
3709 bfd_set_error (bfd_error_invalid_operation
);
3713 if (IEEE_DATA (abfd
) == NULL
)
3715 if (ieee_object_p (abfd
) == NULL
)
3717 bfd_set_error (bfd_error_wrong_format
);
3722 ieee
= IEEE_DATA (abfd
);
3724 buf
->st_size
= ieee
->w
.r
.me_record
+ 1;
3725 buf
->st_mode
= 0644;
3730 ieee_sizeof_headers (bfd
*abfd ATTRIBUTE_UNUSED
,
3731 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
3736 #define ieee_close_and_cleanup _bfd_generic_close_and_cleanup
3737 #define ieee_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
3739 #define ieee_slurp_armap bfd_true
3740 #define ieee_slurp_extended_name_table bfd_true
3741 #define ieee_construct_extended_name_table \
3743 (bfd *, char **, bfd_size_type *, const char **)) \
3745 #define ieee_truncate_arname bfd_dont_truncate_arname
3746 #define ieee_write_armap \
3748 (bfd *, unsigned int, struct orl *, unsigned int, int)) \
3750 #define ieee_read_ar_hdr bfd_nullvoidptr
3751 #define ieee_write_ar_hdr ((bfd_boolean (*) (bfd *, bfd *)) bfd_false)
3752 #define ieee_update_armap_timestamp bfd_true
3753 #define ieee_get_elt_at_index _bfd_generic_get_elt_at_index
3755 #define ieee_bfd_is_target_special_symbol \
3756 ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
3757 #define ieee_bfd_is_local_label_name bfd_generic_is_local_label_name
3758 #define ieee_get_lineno _bfd_nosymbols_get_lineno
3759 #define ieee_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
3760 #define ieee_read_minisymbols _bfd_generic_read_minisymbols
3761 #define ieee_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
3763 #define ieee_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
3764 #define ieee_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
3766 #define ieee_set_arch_mach _bfd_generic_set_arch_mach
3768 #define ieee_get_section_contents_in_window \
3769 _bfd_generic_get_section_contents_in_window
3770 #define ieee_bfd_get_relocated_section_contents \
3771 bfd_generic_get_relocated_section_contents
3772 #define ieee_bfd_relax_section bfd_generic_relax_section
3773 #define ieee_bfd_gc_sections bfd_generic_gc_sections
3774 #define ieee_bfd_lookup_section_flags bfd_generic_lookup_section_flags
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_add_symbols _bfd_generic_link_add_symbols
3783 #define ieee_bfd_link_just_syms _bfd_generic_link_just_syms
3784 #define ieee_bfd_copy_link_hash_symbol_type \
3785 _bfd_generic_copy_link_hash_symbol_type
3786 #define ieee_bfd_final_link _bfd_generic_final_link
3787 #define ieee_bfd_link_split_section _bfd_generic_link_split_section
3789 const bfd_target ieee_vec
=
3792 bfd_target_ieee_flavour
,
3793 BFD_ENDIAN_UNKNOWN
, /* Target byte order. */
3794 BFD_ENDIAN_UNKNOWN
, /* Target headers byte order. */
3795 (HAS_RELOC
| EXEC_P
| /* Object flags. */
3796 HAS_LINENO
| HAS_DEBUG
|
3797 HAS_SYMS
| HAS_LOCALS
| WP_TEXT
| D_PAGED
),
3798 (SEC_CODE
| SEC_DATA
| SEC_ROM
| SEC_HAS_CONTENTS
3799 | SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
), /* Section flags. */
3800 '_', /* Leading underscore. */
3801 ' ', /* AR_pad_char. */
3802 16, /* AR_max_namelen. */
3803 0, /* match priority. */
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. */
3812 ieee_object_p
, /* bfd_check_format. */
3819 _bfd_generic_mkarchive
,
3824 ieee_write_object_contents
,
3825 _bfd_write_archive_contents
,
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 ieee_bfd_link_add_symbols, ieee_bfd_final_link,
3860 ieee_bfd_link_split_section, ieee_bfd_gc_sections,
3861 ieee_bfd_merge_sections. */
3862 BFD_JUMP_TABLE_LINK (ieee
),
3864 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic
),