1 /* BFD back-end for ieee-695 objects.
2 Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
3 Free Software Foundation, Inc.
5 Written by Steve Chamberlain of Cygnus Support.
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
23 #define KEEPMINUSPCININST 0
25 /* IEEE 695 format is a stream of records, which we parse using a simple one-
26 token (which is one byte in this lexicon) lookahead recursive decent
37 static boolean ieee_write_byte
PARAMS ((bfd
*, int));
38 static boolean ieee_write_2bytes
PARAMS ((bfd
*, int));
39 static boolean ieee_write_int
PARAMS ((bfd
*, bfd_vma
));
40 static boolean ieee_write_id
PARAMS ((bfd
*, const char *));
41 static boolean ieee_write_expression
42 PARAMS ((bfd
*, bfd_vma
, asymbol
*, boolean
, unsigned int));
43 static void ieee_write_int5
PARAMS ((bfd_byte
*, bfd_vma
));
44 static boolean ieee_write_int5_out
PARAMS ((bfd
*, bfd_vma
));
45 static boolean ieee_write_section_part
PARAMS ((bfd
*));
46 static boolean do_with_relocs
PARAMS ((bfd
*, asection
*));
47 static boolean do_as_repeat
PARAMS ((bfd
*, asection
*));
48 static boolean do_without_relocs
PARAMS ((bfd
*, asection
*));
49 static boolean ieee_write_external_part
PARAMS ((bfd
*));
50 static boolean ieee_write_data_part
PARAMS ((bfd
*));
51 static boolean ieee_write_debug_part
PARAMS ((bfd
*));
52 static boolean ieee_write_me_part
PARAMS ((bfd
*));
53 static boolean ieee_write_processor
PARAMS ((bfd
*));
55 static boolean ieee_slurp_debug
PARAMS ((bfd
*));
56 static boolean ieee_slurp_section_data
PARAMS ((bfd
*));
58 /* Functions for writing to ieee files in the strange way that the
62 ieee_write_byte (abfd
, barg
)
69 if (bfd_write ((PTR
) &byte
, 1, 1, abfd
) != 1)
75 ieee_write_2bytes (abfd
, bytes
)
81 buffer
[0] = bytes
>> 8;
82 buffer
[1] = bytes
& 0xff;
83 if (bfd_write ((PTR
) buffer
, 1, 2, abfd
) != 2)
89 ieee_write_int (abfd
, value
)
95 if (! ieee_write_byte (abfd
, (bfd_byte
) value
))
102 /* How many significant bytes ? */
103 /* FIXME FOR LONGER INTS */
104 if (value
& 0xff000000)
106 else if (value
& 0x00ff0000)
108 else if (value
& 0x0000ff00)
113 if (! ieee_write_byte (abfd
,
114 (bfd_byte
) ((int) ieee_number_repeat_start_enum
120 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
>> 24)))
124 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
>> 16)))
128 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
>> 8)))
132 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
)))
141 ieee_write_id (abfd
, id
)
145 size_t length
= strlen (id
);
149 if (! ieee_write_byte (abfd
, (bfd_byte
) length
))
152 else if (length
< 255)
154 if (! ieee_write_byte (abfd
, ieee_extension_length_1_enum
)
155 || ! ieee_write_byte (abfd
, (bfd_byte
) length
))
158 else if (length
< 65535)
160 if (! ieee_write_byte (abfd
, ieee_extension_length_2_enum
)
161 || ! ieee_write_2bytes (abfd
, (int) length
))
166 (*_bfd_error_handler
)
167 (_("%s: string too long (%d chars, max 65535)"),
168 bfd_get_filename (abfd
), length
);
169 bfd_set_error (bfd_error_invalid_operation
);
173 if (bfd_write ((PTR
) id
, 1, length
, abfd
) != length
)
178 /***************************************************************************
179 Functions for reading from ieee files in the strange way that the
183 #define this_byte(ieee) *((ieee)->input_p)
184 #define next_byte(ieee) ((ieee)->input_p++)
185 #define this_byte_and_next(ieee) (*((ieee)->input_p++))
187 static unsigned short
189 common_header_type
*ieee
;
191 unsigned char c1
= this_byte_and_next (ieee
);
192 unsigned char c2
= this_byte_and_next (ieee
);
193 return (c1
<< 8) | c2
;
197 bfd_get_string (ieee
, string
, length
)
198 common_header_type
*ieee
;
203 for (i
= 0; i
< length
; i
++)
205 string
[i
] = this_byte_and_next (ieee
);
211 common_header_type
*ieee
;
215 length
= this_byte_and_next (ieee
);
218 /* Simple string of length 0 to 127 */
220 else if (length
== 0xde)
222 /* Length is next byte, allowing 0..255 */
223 length
= this_byte_and_next (ieee
);
225 else if (length
== 0xdf)
227 /* Length is next two bytes, allowing 0..65535 */
228 length
= this_byte_and_next (ieee
);
229 length
= (length
* 256) + this_byte_and_next (ieee
);
231 /* Buy memory and read string */
232 string
= bfd_alloc (ieee
->abfd
, length
+ 1);
235 bfd_get_string (ieee
, string
, length
);
241 ieee_write_expression (abfd
, value
, symbol
, pcrel
, index
)
248 unsigned int term_count
= 0;
252 if (! ieee_write_int (abfd
, value
))
257 if (bfd_is_com_section (symbol
->section
)
258 || bfd_is_und_section (symbol
->section
))
260 /* Def of a common symbol */
261 if (! ieee_write_byte (abfd
, ieee_variable_X_enum
)
262 || ! ieee_write_int (abfd
, symbol
->value
))
266 else if (! bfd_is_abs_section (symbol
->section
))
268 /* Ref to defined symbol - */
270 if (symbol
->flags
& BSF_GLOBAL
)
272 if (! ieee_write_byte (abfd
, ieee_variable_I_enum
)
273 || ! ieee_write_int (abfd
, symbol
->value
))
277 else if (symbol
->flags
& (BSF_LOCAL
| BSF_SECTION_SYM
))
279 /* This is a reference to a defined local symbol. We can
280 easily do a local as a section+offset. */
281 if (! ieee_write_byte (abfd
, ieee_variable_R_enum
)
282 || ! ieee_write_byte (abfd
,
283 (bfd_byte
) (symbol
->section
->index
284 + IEEE_SECTION_NUMBER_BASE
)))
287 if (symbol
->value
!= 0)
289 if (! ieee_write_int (abfd
, symbol
->value
))
296 (*_bfd_error_handler
)
297 (_("%s: unrecognized symbol `%s' flags 0x%x"),
298 bfd_get_filename (abfd
), bfd_asymbol_name (symbol
),
300 bfd_set_error (bfd_error_invalid_operation
);
307 /* subtract the pc from here by asking for PC of this section*/
308 if (! ieee_write_byte (abfd
, ieee_variable_P_enum
)
309 || ! ieee_write_byte (abfd
,
310 (bfd_byte
) (index
+ IEEE_SECTION_NUMBER_BASE
))
311 || ! ieee_write_byte (abfd
, ieee_function_minus_enum
))
315 /* Handle the degenerate case of a 0 address. */
318 if (! ieee_write_int (abfd
, 0))
322 while (term_count
> 1)
324 if (! ieee_write_byte (abfd
, ieee_function_plus_enum
))
332 /*****************************************************************************/
335 writes any integer into the buffer supplied and always takes 5 bytes
338 ieee_write_int5 (buffer
, value
)
342 buffer
[0] = (bfd_byte
) ieee_number_repeat_4_enum
;
343 buffer
[1] = (value
>> 24) & 0xff;
344 buffer
[2] = (value
>> 16) & 0xff;
345 buffer
[3] = (value
>> 8) & 0xff;
346 buffer
[4] = (value
>> 0) & 0xff;
350 ieee_write_int5_out (abfd
, value
)
356 ieee_write_int5 (b
, value
);
357 if (bfd_write ((PTR
) b
, 1, 5, abfd
) != 5)
363 parse_int (ieee
, value_ptr
)
364 common_header_type
*ieee
;
367 int value
= this_byte (ieee
);
369 if (value
>= 0 && value
<= 127)
375 else if (value
>= 0x80 && value
<= 0x88)
377 unsigned int count
= value
& 0xf;
382 result
= (result
<< 8) | this_byte_and_next (ieee
);
393 common_header_type
*ieee
;
397 *ok
= parse_int (ieee
, &x
);
402 must_parse_int (ieee
)
403 common_header_type
*ieee
;
406 BFD_ASSERT (parse_int (ieee
, &result
) == true);
414 ieee_symbol_index_type symbol
;
418 #if KEEPMINUSPCININST
420 #define SRC_MASK(arg) arg
421 #define PCREL_OFFSET false
425 #define SRC_MASK(arg) 0
426 #define PCREL_OFFSET true
430 static reloc_howto_type abs32_howto
=
437 complain_overflow_bitfield
,
445 static reloc_howto_type abs16_howto
=
452 complain_overflow_bitfield
,
460 static reloc_howto_type abs8_howto
=
467 complain_overflow_bitfield
,
475 static reloc_howto_type rel32_howto
=
482 complain_overflow_signed
,
486 SRC_MASK (0xffffffff),
490 static reloc_howto_type rel16_howto
=
497 complain_overflow_signed
,
501 SRC_MASK (0x0000ffff),
505 static reloc_howto_type rel8_howto
=
512 complain_overflow_signed
,
516 SRC_MASK (0x000000ff),
520 static ieee_symbol_index_type NOSYMBOL
= {0, 0};
523 parse_expression (ieee
, value
, symbol
, pcrel
, extra
, section
)
524 ieee_data_type
*ieee
;
526 ieee_symbol_index_type
*symbol
;
539 ieee_value_type stack
[10];
541 /* The stack pointer always points to the next unused location */
542 #define PUSH(x,y,z) TOS.symbol=x;TOS.section=y;TOS.value=z;INC;
543 #define POP(x,y,z) DEC;x=TOS.symbol;y=TOS.section;z=TOS.value;
544 ieee_value_type
*sp
= stack
;
548 switch (this_byte (&(ieee
->h
)))
550 case ieee_variable_P_enum
:
551 /* P variable, current program counter for section n */
554 next_byte (&(ieee
->h
));
556 section_n
= must_parse_int (&(ieee
->h
));
557 PUSH (NOSYMBOL
, bfd_abs_section_ptr
, 0);
560 case ieee_variable_L_enum
:
561 /* L variable address of section N */
562 next_byte (&(ieee
->h
));
563 PUSH (NOSYMBOL
, ieee
->section_table
[must_parse_int (&(ieee
->h
))], 0);
565 case ieee_variable_R_enum
:
566 /* R variable, logical address of section module */
567 /* FIXME, this should be different to L */
568 next_byte (&(ieee
->h
));
569 PUSH (NOSYMBOL
, ieee
->section_table
[must_parse_int (&(ieee
->h
))], 0);
571 case ieee_variable_S_enum
:
572 /* S variable, size in MAUS of section module */
573 next_byte (&(ieee
->h
));
576 ieee
->section_table
[must_parse_int (&(ieee
->h
))]->_raw_size
);
578 case ieee_variable_I_enum
:
579 /* Push the address of variable n */
581 ieee_symbol_index_type sy
;
582 next_byte (&(ieee
->h
));
583 sy
.index
= (int) must_parse_int (&(ieee
->h
));
586 PUSH (sy
, bfd_abs_section_ptr
, 0);
589 case ieee_variable_X_enum
:
590 /* Push the address of external variable n */
592 ieee_symbol_index_type sy
;
593 next_byte (&(ieee
->h
));
594 sy
.index
= (int) (must_parse_int (&(ieee
->h
)));
597 PUSH (sy
, bfd_und_section_ptr
, 0);
600 case ieee_function_minus_enum
:
602 bfd_vma value1
, value2
;
603 asection
*section1
, *section_dummy
;
604 ieee_symbol_index_type sy
;
605 next_byte (&(ieee
->h
));
607 POP (sy
, section1
, value1
);
608 POP (sy
, section_dummy
, value2
);
609 PUSH (sy
, section1
? section1
: section_dummy
, value2
- value1
);
612 case ieee_function_plus_enum
:
614 bfd_vma value1
, value2
;
617 ieee_symbol_index_type sy1
;
618 ieee_symbol_index_type sy2
;
619 next_byte (&(ieee
->h
));
621 POP (sy1
, section1
, value1
);
622 POP (sy2
, section2
, value2
);
623 PUSH (sy1
.letter
? sy1
: sy2
,
624 bfd_is_abs_section (section1
) ? section2
: section1
,
631 BFD_ASSERT (this_byte (&(ieee
->h
)) < (int) ieee_variable_A_enum
632 || this_byte (&(ieee
->h
)) > (int) ieee_variable_Z_enum
);
633 if (parse_int (&(ieee
->h
), &va
))
635 PUSH (NOSYMBOL
, bfd_abs_section_ptr
, va
);
640 Thats all that we can understand. As far as I can see
641 there is a bug in the Microtec IEEE output which I'm
642 using to scan, whereby the comma operator is omitted
643 sometimes in an expression, giving expressions with too
644 many terms. We can tell if that's the case by ensuring
645 that sp == stack here. If not, then we've pushed
646 something too far, so we keep adding. */
648 while (sp
!= stack
+ 1)
651 ieee_symbol_index_type sy1
;
652 POP (sy1
, section1
, *extra
);
657 POP (*symbol
, dummy
, *value
);
670 #define ieee_seek(abfd, offset) \
671 IEEE_DATA(abfd)->h.input_p = IEEE_DATA(abfd)->h.first_byte + offset
673 #define ieee_pos(abfd) \
674 (IEEE_DATA(abfd)->h.input_p - IEEE_DATA(abfd)->h.first_byte)
676 static unsigned int last_index
;
677 static char last_type
; /* is the index for an X or a D */
679 static ieee_symbol_type
*
688 bfd
*abfd ATTRIBUTE_UNUSED
;
689 ieee_data_type
*ieee
;
690 ieee_symbol_type
*last_symbol
;
691 unsigned int *symbol_count
;
692 ieee_symbol_type
***pptr
;
693 unsigned int *max_index
;
697 /* Need a new symbol */
698 unsigned int new_index
= must_parse_int (&(ieee
->h
));
699 if (new_index
!= last_index
|| this_type
!= last_type
)
701 ieee_symbol_type
*new_symbol
= (ieee_symbol_type
*) bfd_alloc (ieee
->h
.abfd
,
702 sizeof (ieee_symbol_type
));
706 new_symbol
->index
= new_index
;
707 last_index
= new_index
;
710 *pptr
= &new_symbol
->next
;
711 if (new_index
> *max_index
)
713 *max_index
= new_index
;
715 last_type
= this_type
;
716 new_symbol
->symbol
.section
= bfd_abs_section_ptr
;
723 ieee_slurp_external_symbols (abfd
)
726 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
727 file_ptr offset
= ieee
->w
.r
.external_part
;
729 ieee_symbol_type
**prev_symbols_ptr
= &ieee
->external_symbols
;
730 ieee_symbol_type
**prev_reference_ptr
= &ieee
->external_reference
;
731 ieee_symbol_type
*symbol
= (ieee_symbol_type
*) NULL
;
732 unsigned int symbol_count
= 0;
734 last_index
= 0xffffff;
735 ieee
->symbol_table_full
= true;
737 ieee_seek (abfd
, offset
);
741 switch (this_byte (&(ieee
->h
)))
744 next_byte (&(ieee
->h
));
746 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
748 &ieee
->external_symbol_max_index
, 'I');
752 symbol
->symbol
.the_bfd
= abfd
;
753 symbol
->symbol
.name
= read_id (&(ieee
->h
));
754 symbol
->symbol
.udata
.p
= (PTR
) NULL
;
755 symbol
->symbol
.flags
= BSF_NO_FLAGS
;
757 case ieee_external_symbol_enum
:
758 next_byte (&(ieee
->h
));
760 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
762 &ieee
->external_symbol_max_index
, 'D');
766 BFD_ASSERT (symbol
->index
>= ieee
->external_symbol_min_index
);
768 symbol
->symbol
.the_bfd
= abfd
;
769 symbol
->symbol
.name
= read_id (&(ieee
->h
));
770 symbol
->symbol
.udata
.p
= (PTR
) NULL
;
771 symbol
->symbol
.flags
= BSF_NO_FLAGS
;
773 case ieee_attribute_record_enum
>> 8:
775 unsigned int symbol_name_index
;
776 unsigned int symbol_type_index
;
777 unsigned int symbol_attribute_def
;
779 switch (read_2bytes (ieee
))
781 case ieee_attribute_record_enum
:
782 symbol_name_index
= must_parse_int (&(ieee
->h
));
783 symbol_type_index
= must_parse_int (&(ieee
->h
));
784 symbol_attribute_def
= must_parse_int (&(ieee
->h
));
785 switch (symbol_attribute_def
)
789 parse_int (&ieee
->h
, &value
);
792 (*_bfd_error_handler
)
793 (_("%s: unimplemented ATI record %u for symbol %u"),
794 bfd_get_filename (abfd
), symbol_attribute_def
,
796 bfd_set_error (bfd_error_bad_value
);
801 case ieee_external_reference_info_record_enum
:
802 /* Skip over ATX record. */
803 parse_int (&(ieee
->h
), &value
);
804 parse_int (&(ieee
->h
), &value
);
805 parse_int (&(ieee
->h
), &value
);
806 parse_int (&(ieee
->h
), &value
);
808 case ieee_atn_record_enum
:
809 /* We may get call optimization information here,
810 which we just ignore. The format is
811 {$F1}${CE}{index}{$00}{$3F}{$3F}{#_of_ASNs} */
812 parse_int (&ieee
->h
, &value
);
813 parse_int (&ieee
->h
, &value
);
814 parse_int (&ieee
->h
, &value
);
817 (*_bfd_error_handler
)
818 (_("%s: unexpected ATN type %d in external part"),
819 bfd_get_filename (abfd
), (int) value
);
820 bfd_set_error (bfd_error_bad_value
);
823 parse_int (&ieee
->h
, &value
);
824 parse_int (&ieee
->h
, &value
);
831 switch (read_2bytes (ieee
))
833 case ieee_asn_record_enum
:
834 parse_int (&ieee
->h
, &val1
);
835 parse_int (&ieee
->h
, &val1
);
839 (*_bfd_error_handler
)
840 (_("%s: unexpected type after ATN"),
841 bfd_get_filename (abfd
));
842 bfd_set_error (bfd_error_bad_value
);
849 case ieee_value_record_enum
>> 8:
851 unsigned int symbol_name_index
;
852 ieee_symbol_index_type symbol_ignore
;
853 boolean pcrel_ignore
;
855 next_byte (&(ieee
->h
));
856 next_byte (&(ieee
->h
));
858 symbol_name_index
= must_parse_int (&(ieee
->h
));
859 parse_expression (ieee
,
860 &symbol
->symbol
.value
,
864 &symbol
->symbol
.section
);
866 /* Fully linked IEEE-695 files tend to give every symbol
867 an absolute value. Try to convert that back into a
868 section relative value. FIXME: This won't always to
870 if (bfd_is_abs_section (symbol
->symbol
.section
)
871 && (abfd
->flags
& HAS_RELOC
) == 0)
876 val
= symbol
->symbol
.value
;
877 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
879 if (val
>= s
->vma
&& val
< s
->vma
+ s
->_raw_size
)
881 symbol
->symbol
.section
= s
;
882 symbol
->symbol
.value
-= s
->vma
;
888 symbol
->symbol
.flags
= BSF_GLOBAL
| BSF_EXPORT
;
892 case ieee_weak_external_reference_enum
:
896 next_byte (&(ieee
->h
));
897 /* Throw away the external reference index */
898 (void) must_parse_int (&(ieee
->h
));
899 /* Fetch the default size if not resolved */
900 size
= must_parse_int (&(ieee
->h
));
901 /* Fetch the defautlt value if available */
902 if (parse_int (&(ieee
->h
), &value
) == false)
906 /* This turns into a common */
907 symbol
->symbol
.section
= bfd_com_section_ptr
;
908 symbol
->symbol
.value
= size
;
912 case ieee_external_reference_enum
:
913 next_byte (&(ieee
->h
));
915 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
917 &ieee
->external_reference_max_index
, 'X');
921 symbol
->symbol
.the_bfd
= abfd
;
922 symbol
->symbol
.name
= read_id (&(ieee
->h
));
923 symbol
->symbol
.udata
.p
= (PTR
) NULL
;
924 symbol
->symbol
.section
= bfd_und_section_ptr
;
925 symbol
->symbol
.value
= (bfd_vma
) 0;
926 symbol
->symbol
.flags
= 0;
928 BFD_ASSERT (symbol
->index
>= ieee
->external_reference_min_index
);
936 if (ieee
->external_symbol_max_index
!= 0)
938 ieee
->external_symbol_count
=
939 ieee
->external_symbol_max_index
-
940 ieee
->external_symbol_min_index
+ 1;
944 ieee
->external_symbol_count
= 0;
947 if (ieee
->external_reference_max_index
!= 0)
949 ieee
->external_reference_count
=
950 ieee
->external_reference_max_index
-
951 ieee
->external_reference_min_index
+ 1;
955 ieee
->external_reference_count
= 0;
959 ieee
->external_reference_count
+ ieee
->external_symbol_count
;
961 if (symbol_count
!= abfd
->symcount
)
963 /* There are gaps in the table -- */
964 ieee
->symbol_table_full
= false;
967 *prev_symbols_ptr
= (ieee_symbol_type
*) NULL
;
968 *prev_reference_ptr
= (ieee_symbol_type
*) NULL
;
974 ieee_slurp_symbol_table (abfd
)
977 if (IEEE_DATA (abfd
)->read_symbols
== false)
979 if (! ieee_slurp_external_symbols (abfd
))
981 IEEE_DATA (abfd
)->read_symbols
= true;
987 ieee_get_symtab_upper_bound (abfd
)
990 if (! ieee_slurp_symbol_table (abfd
))
993 return (abfd
->symcount
!= 0) ?
994 (abfd
->symcount
+ 1) * (sizeof (ieee_symbol_type
*)) : 0;
998 Move from our internal lists to the canon table, and insert in
1002 extern const bfd_target ieee_vec
;
1005 ieee_get_symtab (abfd
, location
)
1009 ieee_symbol_type
*symp
;
1010 static bfd dummy_bfd
;
1011 static asymbol empty_symbol
=
1019 /* K&R compilers can't initialise unions. */
1026 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1027 dummy_bfd
.xvec
= &ieee_vec
;
1028 if (! ieee_slurp_symbol_table (abfd
))
1031 if (ieee
->symbol_table_full
== false)
1033 /* Arrgh - there are gaps in the table, run through and fill them */
1034 /* up with pointers to a null place */
1036 for (i
= 0; i
< abfd
->symcount
; i
++)
1038 location
[i
] = &empty_symbol
;
1042 ieee
->external_symbol_base_offset
= -ieee
->external_symbol_min_index
;
1043 for (symp
= IEEE_DATA (abfd
)->external_symbols
;
1044 symp
!= (ieee_symbol_type
*) NULL
;
1047 /* Place into table at correct index locations */
1048 location
[symp
->index
+ ieee
->external_symbol_base_offset
] = &symp
->symbol
;
1051 /* The external refs are indexed in a bit */
1052 ieee
->external_reference_base_offset
=
1053 -ieee
->external_reference_min_index
+ ieee
->external_symbol_count
;
1055 for (symp
= IEEE_DATA (abfd
)->external_reference
;
1056 symp
!= (ieee_symbol_type
*) NULL
;
1059 location
[symp
->index
+ ieee
->external_reference_base_offset
] =
1066 location
[abfd
->symcount
] = (asymbol
*) NULL
;
1068 return abfd
->symcount
;
1072 get_section_entry (abfd
, ieee
, index
)
1074 ieee_data_type
*ieee
;
1077 if (index
>= ieee
->section_table_size
)
1082 c
= ieee
->section_table_size
;
1089 bfd_realloc (ieee
->section_table
, c
* sizeof (asection
*)));
1093 for (i
= ieee
->section_table_size
; i
< c
; i
++)
1096 ieee
->section_table
= n
;
1097 ieee
->section_table_size
= c
;
1100 if (ieee
->section_table
[index
] == (asection
*) NULL
)
1102 char *tmp
= bfd_alloc (abfd
, 11);
1107 sprintf (tmp
, " fsec%4d", index
);
1108 section
= bfd_make_section (abfd
, tmp
);
1109 ieee
->section_table
[index
] = section
;
1110 section
->flags
= SEC_NO_FLAGS
;
1111 section
->target_index
= index
;
1112 ieee
->section_table
[index
] = section
;
1114 return ieee
->section_table
[index
];
1118 ieee_slurp_sections (abfd
)
1121 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1122 file_ptr offset
= ieee
->w
.r
.section_part
;
1123 asection
*section
= (asection
*) NULL
;
1128 bfd_byte section_type
[3];
1129 ieee_seek (abfd
, offset
);
1132 switch (this_byte (&(ieee
->h
)))
1134 case ieee_section_type_enum
:
1136 unsigned int section_index
;
1137 next_byte (&(ieee
->h
));
1138 section_index
= must_parse_int (&(ieee
->h
));
1140 section
= get_section_entry (abfd
, ieee
, section_index
);
1142 section_type
[0] = this_byte_and_next (&(ieee
->h
));
1144 /* Set minimal section attributes. Attributes are
1145 extended later, based on section contents. */
1147 switch (section_type
[0])
1150 /* Normal attributes for absolute sections */
1151 section_type
[1] = this_byte (&(ieee
->h
));
1152 section
->flags
= SEC_ALLOC
;
1153 switch (section_type
[1])
1155 case 0xD3: /* AS Absolute section attributes */
1156 next_byte (&(ieee
->h
));
1157 section_type
[2] = this_byte (&(ieee
->h
));
1158 switch (section_type
[2])
1162 next_byte (&(ieee
->h
));
1163 section
->flags
|= SEC_CODE
;
1167 next_byte (&(ieee
->h
));
1168 section
->flags
|= SEC_DATA
;
1171 next_byte (&(ieee
->h
));
1172 /* Normal rom data */
1173 section
->flags
|= SEC_ROM
| SEC_DATA
;
1180 case 0xC3: /* Named relocatable sections (type C) */
1181 section_type
[1] = this_byte (&(ieee
->h
));
1182 section
->flags
= SEC_ALLOC
;
1183 switch (section_type
[1])
1185 case 0xD0: /* Normal code (CP) */
1186 next_byte (&(ieee
->h
));
1187 section
->flags
|= SEC_CODE
;
1189 case 0xC4: /* Normal data (CD) */
1190 next_byte (&(ieee
->h
));
1191 section
->flags
|= SEC_DATA
;
1193 case 0xD2: /* Normal rom data (CR) */
1194 next_byte (&(ieee
->h
));
1195 section
->flags
|= SEC_ROM
| SEC_DATA
;
1202 /* Read section name, use it if non empty. */
1203 name
= read_id (&ieee
->h
);
1205 section
->name
= name
;
1207 /* Skip these fields, which we don't care about */
1209 bfd_vma parent
, brother
, context
;
1210 parse_int (&(ieee
->h
), &parent
);
1211 parse_int (&(ieee
->h
), &brother
);
1212 parse_int (&(ieee
->h
), &context
);
1216 case ieee_section_alignment_enum
:
1218 unsigned int section_index
;
1221 next_byte (&(ieee
->h
));
1222 section_index
= must_parse_int (&ieee
->h
);
1223 section
= get_section_entry (abfd
, ieee
, section_index
);
1224 if (section_index
> ieee
->section_count
)
1226 ieee
->section_count
= section_index
;
1228 section
->alignment_power
=
1229 bfd_log2 (must_parse_int (&ieee
->h
));
1230 (void) parse_int (&(ieee
->h
), &value
);
1233 case ieee_e2_first_byte_enum
:
1235 ieee_record_enum_type t
= (ieee_record_enum_type
) (read_2bytes (&(ieee
->h
)));
1239 case ieee_section_size_enum
:
1240 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1241 section
->_raw_size
= must_parse_int (&(ieee
->h
));
1243 case ieee_physical_region_size_enum
:
1244 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1245 section
->_raw_size
= must_parse_int (&(ieee
->h
));
1247 case ieee_region_base_address_enum
:
1248 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1249 section
->vma
= must_parse_int (&(ieee
->h
));
1250 section
->lma
= section
->vma
;
1252 case ieee_mau_size_enum
:
1253 must_parse_int (&(ieee
->h
));
1254 must_parse_int (&(ieee
->h
));
1256 case ieee_m_value_enum
:
1257 must_parse_int (&(ieee
->h
));
1258 must_parse_int (&(ieee
->h
));
1260 case ieee_section_base_address_enum
:
1261 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1262 section
->vma
= must_parse_int (&(ieee
->h
));
1263 section
->lma
= section
->vma
;
1265 case ieee_section_offset_enum
:
1266 (void) must_parse_int (&(ieee
->h
));
1267 (void) must_parse_int (&(ieee
->h
));
1281 /* Make a section for the debugging information, if any. We don't try
1282 to interpret the debugging information; we just point the section
1283 at the area in the file so that program which understand can dig it
1287 ieee_slurp_debug (abfd
)
1290 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1294 if (ieee
->w
.r
.debug_information_part
== 0)
1297 sec
= bfd_make_section (abfd
, ".debug");
1300 sec
->flags
|= SEC_DEBUGGING
| SEC_HAS_CONTENTS
;
1301 sec
->filepos
= ieee
->w
.r
.debug_information_part
;
1303 debug_end
= ieee
->w
.r
.data_part
;
1305 debug_end
= ieee
->w
.r
.trailer_part
;
1307 debug_end
= ieee
->w
.r
.me_record
;
1308 sec
->_raw_size
= debug_end
- ieee
->w
.r
.debug_information_part
;
1313 /***********************************************************************
1318 ieee_archive_p (abfd
)
1323 unsigned char buffer
[512];
1324 file_ptr buffer_offset
= 0;
1325 ieee_ar_data_type
*save
= abfd
->tdata
.ieee_ar_data
;
1326 ieee_ar_data_type
*ieee
;
1327 unsigned int alc_elts
;
1328 ieee_ar_obstack_type
*elts
= NULL
;
1330 abfd
->tdata
.ieee_ar_data
=
1331 (ieee_ar_data_type
*) bfd_alloc (abfd
, sizeof (ieee_ar_data_type
));
1332 if (!abfd
->tdata
.ieee_ar_data
)
1334 ieee
= IEEE_AR_DATA (abfd
);
1336 /* FIXME: Check return value. I'm not sure whether it needs to read
1337 the entire buffer or not. */
1338 bfd_read ((PTR
) buffer
, 1, sizeof (buffer
), abfd
);
1340 ieee
->h
.first_byte
= buffer
;
1341 ieee
->h
.input_p
= buffer
;
1343 ieee
->h
.abfd
= abfd
;
1345 if (this_byte (&(ieee
->h
)) != Module_Beginning
)
1347 abfd
->tdata
.ieee_ar_data
= save
;
1348 goto got_wrong_format_error
;
1351 next_byte (&(ieee
->h
));
1352 library
= read_id (&(ieee
->h
));
1353 if (strcmp (library
, "LIBRARY") != 0)
1355 bfd_release (abfd
, ieee
);
1356 abfd
->tdata
.ieee_ar_data
= save
;
1357 goto got_wrong_format_error
;
1359 /* Throw away the filename */
1360 read_id (&(ieee
->h
));
1362 ieee
->element_count
= 0;
1363 ieee
->element_index
= 0;
1365 next_byte (&(ieee
->h
)); /* Drop the ad part */
1366 must_parse_int (&(ieee
->h
)); /* And the two dummy numbers */
1367 must_parse_int (&(ieee
->h
));
1370 elts
= (ieee_ar_obstack_type
*) bfd_malloc (alc_elts
* sizeof *elts
);
1374 /* Read the index of the BB table */
1378 ieee_ar_obstack_type
*t
;
1380 rec
= read_2bytes (&(ieee
->h
));
1381 if (rec
!= (int) ieee_assign_value_to_variable_enum
)
1384 if (ieee
->element_count
>= alc_elts
)
1386 ieee_ar_obstack_type
*n
;
1389 n
= ((ieee_ar_obstack_type
*)
1390 bfd_realloc (elts
, alc_elts
* sizeof *elts
));
1396 t
= &elts
[ieee
->element_count
];
1397 ieee
->element_count
++;
1399 must_parse_int (&(ieee
->h
));
1400 t
->file_offset
= must_parse_int (&(ieee
->h
));
1401 t
->abfd
= (bfd
*) NULL
;
1403 /* Make sure that we don't go over the end of the buffer */
1405 if ((size_t) ieee_pos (abfd
) > sizeof (buffer
) / 2)
1407 /* Past half way, reseek and reprime */
1408 buffer_offset
+= ieee_pos (abfd
);
1409 if (bfd_seek (abfd
, buffer_offset
, SEEK_SET
) != 0)
1411 /* FIXME: Check return value. I'm not sure whether it needs
1412 to read the entire buffer or not. */
1413 bfd_read ((PTR
) buffer
, 1, sizeof (buffer
), abfd
);
1414 ieee
->h
.first_byte
= buffer
;
1415 ieee
->h
.input_p
= buffer
;
1419 ieee
->elements
= ((ieee_ar_obstack_type
*)
1421 ieee
->element_count
* sizeof *ieee
->elements
));
1422 if (ieee
->elements
== NULL
)
1424 memcpy (ieee
->elements
, elts
,
1425 ieee
->element_count
* sizeof *ieee
->elements
);
1429 /* Now scan the area again, and replace BB offsets with file */
1432 for (i
= 2; i
< ieee
->element_count
; i
++)
1434 if (bfd_seek (abfd
, ieee
->elements
[i
].file_offset
, SEEK_SET
) != 0)
1436 /* FIXME: Check return value. I'm not sure whether it needs to
1437 read the entire buffer or not. */
1438 bfd_read ((PTR
) buffer
, 1, sizeof (buffer
), abfd
);
1439 ieee
->h
.first_byte
= buffer
;
1440 ieee
->h
.input_p
= buffer
;
1442 next_byte (&(ieee
->h
)); /* Drop F8 */
1443 next_byte (&(ieee
->h
)); /* Drop 14 */
1444 must_parse_int (&(ieee
->h
)); /* Drop size of block */
1445 if (must_parse_int (&(ieee
->h
)) != 0)
1447 /* This object has been deleted */
1448 ieee
->elements
[i
].file_offset
= 0;
1452 ieee
->elements
[i
].file_offset
= must_parse_int (&(ieee
->h
));
1456 /* abfd->has_armap = ;*/
1460 got_wrong_format_error
:
1461 bfd_set_error (bfd_error_wrong_format
);
1469 ieee_mkobject (abfd
)
1472 abfd
->tdata
.ieee_data
= (ieee_data_type
*) bfd_zalloc (abfd
, sizeof (ieee_data_type
));
1473 return abfd
->tdata
.ieee_data
? true : false;
1477 ieee_object_p (abfd
)
1482 ieee_data_type
*ieee
;
1483 unsigned char buffer
[300];
1484 ieee_data_type
*save
= IEEE_DATA (abfd
);
1486 abfd
->tdata
.ieee_data
= 0;
1487 ieee_mkobject (abfd
);
1489 ieee
= IEEE_DATA (abfd
);
1490 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1492 /* Read the first few bytes in to see if it makes sense */
1493 /* FIXME: Check return value. I'm not sure whether it needs to read
1494 the entire buffer or not. */
1495 bfd_read ((PTR
) buffer
, 1, sizeof (buffer
), abfd
);
1497 ieee
->h
.input_p
= buffer
;
1498 if (this_byte_and_next (&(ieee
->h
)) != Module_Beginning
)
1499 goto got_wrong_format
;
1501 ieee
->read_symbols
= false;
1502 ieee
->read_data
= false;
1503 ieee
->section_count
= 0;
1504 ieee
->external_symbol_max_index
= 0;
1505 ieee
->external_symbol_min_index
= IEEE_PUBLIC_BASE
;
1506 ieee
->external_reference_min_index
= IEEE_REFERENCE_BASE
;
1507 ieee
->external_reference_max_index
= 0;
1508 ieee
->h
.abfd
= abfd
;
1509 ieee
->section_table
= NULL
;
1510 ieee
->section_table_size
= 0;
1512 processor
= ieee
->mb
.processor
= read_id (&(ieee
->h
));
1513 if (strcmp (processor
, "LIBRARY") == 0)
1514 goto got_wrong_format
;
1515 ieee
->mb
.module_name
= read_id (&(ieee
->h
));
1516 if (abfd
->filename
== (CONST
char *) NULL
)
1518 abfd
->filename
= ieee
->mb
.module_name
;
1520 /* Determine the architecture and machine type of the object file.
1523 const bfd_arch_info_type
*arch
;
1526 /* IEEE does not specify the format of the processor identificaton
1527 string, so the compiler is free to put in it whatever it wants.
1528 We try here to recognize different processors belonging to the
1529 m68k family. Code for other processors can be added here. */
1530 if ((processor
[0] == '6') && (processor
[1] == '8'))
1532 if (processor
[2] == '3') /* 683xx integrated processors */
1534 switch (processor
[3])
1536 case '0': /* 68302, 68306, 68307 */
1537 case '2': /* 68322, 68328 */
1538 case '5': /* 68356 */
1539 strcpy (family
, "68000"); /* MC68000-based controllers */
1542 case '3': /* 68330, 68331, 68332, 68333,
1543 68334, 68335, 68336, 68338 */
1544 case '6': /* 68360 */
1545 case '7': /* 68376 */
1546 strcpy (family
, "68332"); /* CPU32 and CPU32+ */
1550 if (processor
[4] == '9') /* 68349 */
1551 strcpy (family
, "68030"); /* CPU030 */
1552 else /* 68340, 68341 */
1553 strcpy (family
, "68332"); /* CPU32 and CPU32+ */
1556 default: /* Does not exist yet */
1557 strcpy (family
, "68332"); /* Guess it will be CPU32 */
1560 else if (toupper (processor
[3]) == 'F') /* 68F333 */
1561 strcpy (family
, "68332"); /* CPU32 */
1562 else if ((toupper (processor
[3]) == 'C') /* Embedded controllers */
1563 && ((toupper (processor
[2]) == 'E')
1564 || (toupper (processor
[2]) == 'H')
1565 || (toupper (processor
[2]) == 'L')))
1567 strcpy (family
, "68");
1568 strncat (family
, processor
+ 4, 7);
1571 else /* "Regular" processors */
1573 strncpy (family
, processor
, 9);
1577 else if ((strncmp (processor
, "cpu32", 5) == 0) /* CPU32 and CPU32+ */
1578 || (strncmp (processor
, "CPU32", 5) == 0))
1579 strcpy (family
, "68332");
1582 strncpy (family
, processor
, 9);
1586 arch
= bfd_scan_arch (family
);
1588 goto got_wrong_format
;
1589 abfd
->arch_info
= arch
;
1592 if (this_byte (&(ieee
->h
)) != (int) ieee_address_descriptor_enum
)
1596 next_byte (&(ieee
->h
));
1598 if (parse_int (&(ieee
->h
), &ieee
->ad
.number_of_bits_mau
) == false)
1602 if (parse_int (&(ieee
->h
), &ieee
->ad
.number_of_maus_in_address
) == false)
1607 /* If there is a byte order info, take it */
1608 if (this_byte (&(ieee
->h
)) == (int) ieee_variable_L_enum
||
1609 this_byte (&(ieee
->h
)) == (int) ieee_variable_M_enum
)
1610 next_byte (&(ieee
->h
));
1612 for (part
= 0; part
< N_W_VARIABLES
; part
++)
1615 if (read_2bytes (&(ieee
->h
)) != (int) ieee_assign_value_to_variable_enum
)
1619 if (this_byte_and_next (&(ieee
->h
)) != part
)
1624 ieee
->w
.offset
[part
] = parse_i (&(ieee
->h
), &ok
);
1632 if (ieee
->w
.r
.external_part
!= 0)
1633 abfd
->flags
= HAS_SYMS
;
1635 /* By now we know that this is a real IEEE file, we're going to read
1636 the whole thing into memory so that we can run up and down it
1637 quickly. We can work out how big the file is from the trailer
1640 IEEE_DATA (abfd
)->h
.first_byte
=
1641 (unsigned char *) bfd_alloc (ieee
->h
.abfd
, ieee
->w
.r
.me_record
+ 1);
1642 if (!IEEE_DATA (abfd
)->h
.first_byte
)
1644 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1646 /* FIXME: Check return value. I'm not sure whether it needs to read
1647 the entire buffer or not. */
1648 bfd_read ((PTR
) (IEEE_DATA (abfd
)->h
.first_byte
), 1,
1649 ieee
->w
.r
.me_record
+ 1, abfd
);
1651 ieee_slurp_sections (abfd
);
1653 if (! ieee_slurp_debug (abfd
))
1656 /* Parse section data to activate file and section flags implied by
1657 section contents. */
1659 if (! ieee_slurp_section_data (abfd
))
1664 bfd_set_error (bfd_error_wrong_format
);
1666 (void) bfd_release (abfd
, ieee
);
1667 abfd
->tdata
.ieee_data
= save
;
1668 return (const bfd_target
*) NULL
;
1672 ieee_get_symbol_info (ignore_abfd
, symbol
, ret
)
1673 bfd
*ignore_abfd ATTRIBUTE_UNUSED
;
1677 bfd_symbol_info (symbol
, ret
);
1678 if (symbol
->name
[0] == ' ')
1679 ret
->name
= "* empty table entry ";
1680 if (!symbol
->section
)
1681 ret
->type
= (symbol
->flags
& BSF_LOCAL
) ? 'a' : 'A';
1685 ieee_print_symbol (ignore_abfd
, afile
, symbol
, how
)
1686 bfd
*ignore_abfd ATTRIBUTE_UNUSED
;
1689 bfd_print_symbol_type how
;
1691 FILE *file
= (FILE *) afile
;
1695 case bfd_print_symbol_name
:
1696 fprintf (file
, "%s", symbol
->name
);
1698 case bfd_print_symbol_more
:
1700 fprintf (file
, "%4x %2x", aout_symbol (symbol
)->desc
& 0xffff,
1701 aout_symbol (symbol
)->other
& 0xff);
1705 case bfd_print_symbol_all
:
1707 const char *section_name
=
1708 (symbol
->section
== (asection
*) NULL
1710 : symbol
->section
->name
);
1711 if (symbol
->name
[0] == ' ')
1713 fprintf (file
, "* empty table entry ");
1717 bfd_print_symbol_vandf ((PTR
) file
, symbol
);
1719 fprintf (file
, " %-5s %04x %02x %s",
1721 (unsigned) ieee_symbol (symbol
)->index
,
1731 do_one (ieee
, current_map
, location_ptr
, s
, iterations
)
1732 ieee_data_type
*ieee
;
1733 ieee_per_section_type
*current_map
;
1734 unsigned char *location_ptr
;
1738 switch (this_byte (&(ieee
->h
)))
1740 case ieee_load_constant_bytes_enum
:
1742 unsigned int number_of_maus
;
1744 next_byte (&(ieee
->h
));
1745 number_of_maus
= must_parse_int (&(ieee
->h
));
1747 for (i
= 0; i
< number_of_maus
; i
++)
1749 location_ptr
[current_map
->pc
++] = this_byte (&(ieee
->h
));
1750 next_byte (&(ieee
->h
));
1755 case ieee_load_with_relocation_enum
:
1757 boolean loop
= true;
1758 next_byte (&(ieee
->h
));
1761 switch (this_byte (&(ieee
->h
)))
1763 case ieee_variable_R_enum
:
1765 case ieee_function_signed_open_b_enum
:
1766 case ieee_function_unsigned_open_b_enum
:
1767 case ieee_function_either_open_b_enum
:
1769 unsigned int extra
= 4;
1770 boolean pcrel
= false;
1772 ieee_reloc_type
*r
=
1773 (ieee_reloc_type
*) bfd_alloc (ieee
->h
.abfd
,
1774 sizeof (ieee_reloc_type
));
1778 *(current_map
->reloc_tail_ptr
) = r
;
1779 current_map
->reloc_tail_ptr
= &r
->next
;
1780 r
->next
= (ieee_reloc_type
*) NULL
;
1781 next_byte (&(ieee
->h
));
1783 r
->relent
.sym_ptr_ptr
= 0;
1784 parse_expression (ieee
,
1787 &pcrel
, &extra
, §ion
);
1788 r
->relent
.address
= current_map
->pc
;
1789 s
->flags
|= SEC_RELOC
;
1790 s
->owner
->flags
|= HAS_RELOC
;
1792 if (r
->relent
.sym_ptr_ptr
== NULL
&& section
!= NULL
)
1793 r
->relent
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
1795 if (this_byte (&(ieee
->h
)) == (int) ieee_comma
)
1797 next_byte (&(ieee
->h
));
1798 /* Fetch number of bytes to pad */
1799 extra
= must_parse_int (&(ieee
->h
));
1802 switch (this_byte (&(ieee
->h
)))
1804 case ieee_function_signed_close_b_enum
:
1805 next_byte (&(ieee
->h
));
1807 case ieee_function_unsigned_close_b_enum
:
1808 next_byte (&(ieee
->h
));
1810 case ieee_function_either_close_b_enum
:
1811 next_byte (&(ieee
->h
));
1816 /* Build a relocation entry for this type */
1817 /* If pc rel then stick -ve pc into instruction
1818 and take out of reloc ..
1820 I've changed this. It's all too complicated. I
1821 keep 0 in the instruction now. */
1830 #if KEEPMINUSPCININST
1831 bfd_put_32 (ieee
->h
.abfd
, -current_map
->pc
, location_ptr
+
1833 r
->relent
.howto
= &rel32_howto
;
1837 bfd_put_32 (ieee
->h
.abfd
, 0, location_ptr
+
1839 r
->relent
.howto
= &rel32_howto
;
1844 bfd_put_32 (ieee
->h
.abfd
, 0, location_ptr
+
1846 r
->relent
.howto
= &abs32_howto
;
1848 current_map
->pc
+= 4;
1853 #if KEEPMINUSPCININST
1854 bfd_put_16 (ieee
->h
.abfd
, (int) (-current_map
->pc
), location_ptr
+ current_map
->pc
);
1855 r
->relent
.addend
-= current_map
->pc
;
1856 r
->relent
.howto
= &rel16_howto
;
1859 bfd_put_16 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1860 r
->relent
.howto
= &rel16_howto
;
1866 bfd_put_16 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1867 r
->relent
.howto
= &abs16_howto
;
1869 current_map
->pc
+= 2;
1874 #if KEEPMINUSPCININST
1875 bfd_put_8 (ieee
->h
.abfd
, (int) (-current_map
->pc
), location_ptr
+ current_map
->pc
);
1876 r
->relent
.addend
-= current_map
->pc
;
1877 r
->relent
.howto
= &rel8_howto
;
1879 bfd_put_8 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1880 r
->relent
.howto
= &rel8_howto
;
1885 bfd_put_8 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1886 r
->relent
.howto
= &abs8_howto
;
1888 current_map
->pc
+= 1;
1900 if (parse_int (&(ieee
->h
), &this_size
) == true)
1903 for (i
= 0; i
< this_size
; i
++)
1905 location_ptr
[current_map
->pc
++] = this_byte (&(ieee
->h
));
1906 next_byte (&(ieee
->h
));
1916 /* Prevent more than the first load-item of an LR record
1917 from being repeated (MRI convention). */
1918 if (iterations
!= 1)
1926 /* Read in all the section data and relocation stuff too */
1928 ieee_slurp_section_data (abfd
)
1931 bfd_byte
*location_ptr
= (bfd_byte
*) NULL
;
1932 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1933 unsigned int section_number
;
1935 ieee_per_section_type
*current_map
= (ieee_per_section_type
*) NULL
;
1937 /* Seek to the start of the data area */
1938 if (ieee
->read_data
== true)
1940 ieee
->read_data
= true;
1941 ieee_seek (abfd
, ieee
->w
.r
.data_part
);
1943 /* Allocate enough space for all the section contents */
1945 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
1947 ieee_per_section_type
*per
= (ieee_per_section_type
*) s
->used_by_bfd
;
1948 if ((s
->flags
& SEC_DEBUGGING
) != 0)
1950 per
->data
= (bfd_byte
*) bfd_alloc (ieee
->h
.abfd
, s
->_raw_size
);
1954 per
->reloc_tail_ptr
=
1955 (ieee_reloc_type
**) & (s
->relocation
);
1960 switch (this_byte (&(ieee
->h
)))
1962 /* IF we see anything strange then quit */
1966 case ieee_set_current_section_enum
:
1967 next_byte (&(ieee
->h
));
1968 section_number
= must_parse_int (&(ieee
->h
));
1969 s
= ieee
->section_table
[section_number
];
1970 s
->flags
|= SEC_LOAD
| SEC_HAS_CONTENTS
;
1971 current_map
= (ieee_per_section_type
*) s
->used_by_bfd
;
1972 location_ptr
= current_map
->data
- s
->vma
;
1973 /* The document I have says that Microtec's compilers reset */
1974 /* this after a sec section, even though the standard says not */
1976 current_map
->pc
= s
->vma
;
1979 case ieee_e2_first_byte_enum
:
1980 next_byte (&(ieee
->h
));
1981 switch (this_byte (&(ieee
->h
)))
1983 case ieee_set_current_pc_enum
& 0xff:
1986 ieee_symbol_index_type symbol
;
1989 next_byte (&(ieee
->h
));
1990 must_parse_int (&(ieee
->h
)); /* Thow away section #*/
1991 parse_expression (ieee
, &value
,
1995 current_map
->pc
= value
;
1996 BFD_ASSERT ((unsigned) (value
- s
->vma
) <= s
->_raw_size
);
2000 case ieee_value_starting_address_enum
& 0xff:
2001 next_byte (&(ieee
->h
));
2002 if (this_byte (&(ieee
->h
)) == ieee_function_either_open_b_enum
)
2003 next_byte (&(ieee
->h
));
2004 abfd
->start_address
= must_parse_int (&(ieee
->h
));
2005 /* We've got to the end of the data now - */
2012 case ieee_repeat_data_enum
:
2014 /* Repeat the following LD or LR n times - we do this by
2015 remembering the stream pointer before running it and
2016 resetting it and running it n times. We special case
2017 the repetition of a repeat_data/load_constant
2020 unsigned int iterations
;
2021 unsigned char *start
;
2022 next_byte (&(ieee
->h
));
2023 iterations
= must_parse_int (&(ieee
->h
));
2024 start
= ieee
->h
.input_p
;
2025 if (start
[0] == (int) ieee_load_constant_bytes_enum
&&
2028 while (iterations
!= 0)
2030 location_ptr
[current_map
->pc
++] = start
[2];
2033 next_byte (&(ieee
->h
));
2034 next_byte (&(ieee
->h
));
2035 next_byte (&(ieee
->h
));
2039 while (iterations
!= 0)
2041 ieee
->h
.input_p
= start
;
2042 if (!do_one (ieee
, current_map
, location_ptr
, s
,
2050 case ieee_load_constant_bytes_enum
:
2051 case ieee_load_with_relocation_enum
:
2053 if (!do_one (ieee
, current_map
, location_ptr
, s
, 1))
2061 ieee_new_section_hook (abfd
, newsect
)
2065 newsect
->used_by_bfd
= (PTR
)
2066 bfd_alloc (abfd
, sizeof (ieee_per_section_type
));
2067 if (!newsect
->used_by_bfd
)
2069 ieee_per_section (newsect
)->data
= (bfd_byte
*) NULL
;
2070 ieee_per_section (newsect
)->section
= newsect
;
2075 ieee_get_reloc_upper_bound (abfd
, asect
)
2079 if ((asect
->flags
& SEC_DEBUGGING
) != 0)
2081 if (! ieee_slurp_section_data (abfd
))
2083 return (asect
->reloc_count
+ 1) * sizeof (arelent
*);
2087 ieee_get_section_contents (abfd
, section
, location
, offset
, count
)
2092 bfd_size_type count
;
2094 ieee_per_section_type
*p
= (ieee_per_section_type
*) section
->used_by_bfd
;
2095 if ((section
->flags
& SEC_DEBUGGING
) != 0)
2096 return _bfd_generic_get_section_contents (abfd
, section
, location
,
2098 ieee_slurp_section_data (abfd
);
2099 (void) memcpy ((PTR
) location
, (PTR
) (p
->data
+ offset
), (unsigned) count
);
2104 ieee_canonicalize_reloc (abfd
, section
, relptr
, symbols
)
2110 /* ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;*/
2111 ieee_reloc_type
*src
= (ieee_reloc_type
*) (section
->relocation
);
2112 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
2114 if ((section
->flags
& SEC_DEBUGGING
) != 0)
2117 while (src
!= (ieee_reloc_type
*) NULL
)
2119 /* Work out which symbol to attach it this reloc to */
2120 switch (src
->symbol
.letter
)
2123 src
->relent
.sym_ptr_ptr
=
2124 symbols
+ src
->symbol
.index
+ ieee
->external_symbol_base_offset
;
2127 src
->relent
.sym_ptr_ptr
=
2128 symbols
+ src
->symbol
.index
+ ieee
->external_reference_base_offset
;
2131 if (src
->relent
.sym_ptr_ptr
!= NULL
)
2132 src
->relent
.sym_ptr_ptr
=
2133 src
->relent
.sym_ptr_ptr
[0]->section
->symbol_ptr_ptr
;
2139 *relptr
++ = &src
->relent
;
2142 *relptr
= (arelent
*) NULL
;
2143 return section
->reloc_count
;
2151 arelent
*a
= *((arelent
**) ap
);
2152 arelent
*b
= *((arelent
**) bp
);
2153 return a
->address
- b
->address
;
2156 /* Write the section headers. */
2159 ieee_write_section_part (abfd
)
2162 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
2164 ieee
->w
.r
.section_part
= bfd_tell (abfd
);
2165 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
2167 if (! bfd_is_abs_section (s
)
2168 && (s
->flags
& SEC_DEBUGGING
) == 0)
2170 if (! ieee_write_byte (abfd
, ieee_section_type_enum
)
2171 || ! ieee_write_byte (abfd
,
2172 (bfd_byte
) (s
->index
2173 + IEEE_SECTION_NUMBER_BASE
)))
2176 if (abfd
->flags
& EXEC_P
)
2178 /* This image is executable, so output absolute sections */
2179 if (! ieee_write_byte (abfd
, ieee_variable_A_enum
)
2180 || ! ieee_write_byte (abfd
, ieee_variable_S_enum
))
2185 if (! ieee_write_byte (abfd
, ieee_variable_C_enum
))
2189 switch (s
->flags
& (SEC_CODE
| SEC_DATA
| SEC_ROM
))
2191 case SEC_CODE
| SEC_LOAD
:
2193 if (! ieee_write_byte (abfd
, ieee_variable_P_enum
))
2198 if (! ieee_write_byte (abfd
, ieee_variable_D_enum
))
2202 case SEC_ROM
| SEC_DATA
:
2203 case SEC_ROM
| SEC_LOAD
:
2204 case SEC_ROM
| SEC_DATA
| SEC_LOAD
:
2205 if (! ieee_write_byte (abfd
, ieee_variable_R_enum
))
2210 if (! ieee_write_id (abfd
, s
->name
))
2213 ieee_write_int (abfd
, 0); /* Parent */
2214 ieee_write_int (abfd
, 0); /* Brother */
2215 ieee_write_int (abfd
, 0); /* Context */
2218 if (! ieee_write_byte (abfd
, ieee_section_alignment_enum
)
2219 || ! ieee_write_byte (abfd
,
2220 (bfd_byte
) (s
->index
2221 + IEEE_SECTION_NUMBER_BASE
))
2222 || ! ieee_write_int (abfd
, 1 << s
->alignment_power
))
2226 if (! ieee_write_2bytes (abfd
, ieee_section_size_enum
)
2227 || ! ieee_write_byte (abfd
,
2228 (bfd_byte
) (s
->index
2229 + IEEE_SECTION_NUMBER_BASE
))
2230 || ! ieee_write_int (abfd
, s
->_raw_size
))
2232 if (abfd
->flags
& EXEC_P
)
2234 /* Relocateable sections don't have asl records */
2236 if (! ieee_write_2bytes (abfd
, ieee_section_base_address_enum
)
2237 || ! ieee_write_byte (abfd
,
2240 + IEEE_SECTION_NUMBER_BASE
)))
2241 || ! ieee_write_int (abfd
, s
->lma
))
2252 do_with_relocs (abfd
, s
)
2256 unsigned int number_of_maus_in_address
=
2257 bfd_arch_bits_per_address (abfd
) / bfd_arch_bits_per_byte (abfd
);
2258 unsigned int relocs_to_go
= s
->reloc_count
;
2259 bfd_byte
*stream
= ieee_per_section (s
)->data
;
2260 arelent
**p
= s
->orelocation
;
2261 bfd_size_type current_byte_index
= 0;
2263 qsort (s
->orelocation
,
2265 sizeof (arelent
**),
2268 /* Output the section preheader */
2269 if (! ieee_write_byte (abfd
, ieee_set_current_section_enum
)
2270 || ! ieee_write_byte (abfd
,
2271 (bfd_byte
) (s
->index
+ IEEE_SECTION_NUMBER_BASE
))
2272 || ! ieee_write_2bytes (abfd
, ieee_set_current_pc_enum
)
2273 || ! ieee_write_byte (abfd
,
2274 (bfd_byte
) (s
->index
+ IEEE_SECTION_NUMBER_BASE
)))
2276 if ((abfd
->flags
& EXEC_P
) != 0 && relocs_to_go
== 0)
2278 if (! ieee_write_int (abfd
, s
->lma
))
2283 if (! ieee_write_expression (abfd
, 0, s
->symbol
, 0, 0))
2287 if (relocs_to_go
== 0)
2289 /* If there aren't any relocations then output the load constant
2290 byte opcode rather than the load with relocation opcode */
2292 while (current_byte_index
< s
->_raw_size
)
2295 unsigned int MAXRUN
= 127;
2297 if (run
> s
->_raw_size
- current_byte_index
)
2299 run
= s
->_raw_size
- current_byte_index
;
2304 if (! ieee_write_byte (abfd
, ieee_load_constant_bytes_enum
))
2306 /* Output a stream of bytes */
2307 if (! ieee_write_int (abfd
, run
))
2309 if (bfd_write ((PTR
) (stream
+ current_byte_index
),
2315 current_byte_index
+= run
;
2321 if (! ieee_write_byte (abfd
, ieee_load_with_relocation_enum
))
2324 /* Output the data stream as the longest sequence of bytes
2325 possible, allowing for the a reasonable packet size and
2326 relocation stuffs. */
2328 if ((PTR
) stream
== (PTR
) NULL
)
2330 /* Outputting a section without data, fill it up */
2331 stream
= (unsigned char *) (bfd_alloc (abfd
, s
->_raw_size
));
2334 memset ((PTR
) stream
, 0, (size_t) s
->_raw_size
);
2336 while (current_byte_index
< s
->_raw_size
)
2339 unsigned int MAXRUN
= 127;
2342 run
= (*p
)->address
- current_byte_index
;
2350 if (run
> s
->_raw_size
- current_byte_index
)
2352 run
= s
->_raw_size
- current_byte_index
;
2357 /* Output a stream of bytes */
2358 if (! ieee_write_int (abfd
, run
))
2360 if (bfd_write ((PTR
) (stream
+ current_byte_index
),
2366 current_byte_index
+= run
;
2368 /* Output any relocations here */
2369 if (relocs_to_go
&& (*p
) && (*p
)->address
== current_byte_index
)
2372 && (*p
) && (*p
)->address
== current_byte_index
)
2378 if (r
->howto
->pc_relative
)
2380 r
->addend
+= current_byte_index
;
2384 switch (r
->howto
->size
)
2388 ov
= bfd_get_signed_32 (abfd
,
2389 stream
+ current_byte_index
);
2390 current_byte_index
+= 4;
2393 ov
= bfd_get_signed_16 (abfd
,
2394 stream
+ current_byte_index
);
2395 current_byte_index
+= 2;
2398 ov
= bfd_get_signed_8 (abfd
,
2399 stream
+ current_byte_index
);
2400 current_byte_index
++;
2408 ov
&= r
->howto
->src_mask
;
2410 if (r
->howto
->pc_relative
2411 && ! r
->howto
->pcrel_offset
)
2414 if (! ieee_write_byte (abfd
,
2415 ieee_function_either_open_b_enum
))
2420 if (r
->sym_ptr_ptr
!= (asymbol
**) NULL
)
2422 if (! ieee_write_expression (abfd
, r
->addend
+ ov
,
2424 r
->howto
->pc_relative
,
2430 if (! ieee_write_expression (abfd
, r
->addend
+ ov
,
2432 r
->howto
->pc_relative
,
2437 if (number_of_maus_in_address
2438 != bfd_get_reloc_size (r
->howto
))
2440 if (! ieee_write_int (abfd
,
2441 bfd_get_reloc_size (r
->howto
)))
2444 if (! ieee_write_byte (abfd
,
2445 ieee_function_either_close_b_enum
))
2459 /* If there are no relocations in the output section then we can be
2460 clever about how we write. We block items up into a max of 127
2464 do_as_repeat (abfd
, s
)
2470 if (! ieee_write_byte (abfd
, ieee_set_current_section_enum
)
2471 || ! ieee_write_byte (abfd
,
2472 (bfd_byte
) (s
->index
2473 + IEEE_SECTION_NUMBER_BASE
))
2474 || ! ieee_write_byte (abfd
, ieee_set_current_pc_enum
>> 8)
2475 || ! ieee_write_byte (abfd
, ieee_set_current_pc_enum
& 0xff)
2476 || ! ieee_write_byte (abfd
,
2477 (bfd_byte
) (s
->index
2478 + IEEE_SECTION_NUMBER_BASE
))
2479 || ! ieee_write_int (abfd
, s
->lma
)
2480 || ! ieee_write_byte (abfd
, ieee_repeat_data_enum
)
2481 || ! ieee_write_int (abfd
, s
->_raw_size
)
2482 || ! ieee_write_byte (abfd
, ieee_load_constant_bytes_enum
)
2483 || ! ieee_write_byte (abfd
, 1)
2484 || ! ieee_write_byte (abfd
, 0))
2492 do_without_relocs (abfd
, s
)
2496 bfd_byte
*stream
= ieee_per_section (s
)->data
;
2498 if (stream
== 0 || ((s
->flags
& SEC_LOAD
) == 0))
2500 if (! do_as_repeat (abfd
, s
))
2506 for (i
= 0; i
< s
->_raw_size
; i
++)
2510 if (! do_with_relocs (abfd
, s
))
2515 if (! do_as_repeat (abfd
, s
))
2523 static unsigned char *output_ptr_start
;
2524 static unsigned char *output_ptr
;
2525 static unsigned char *output_ptr_end
;
2526 static unsigned char *input_ptr_start
;
2527 static unsigned char *input_ptr
;
2528 static unsigned char *input_ptr_end
;
2529 static bfd
*input_bfd
;
2530 static bfd
*output_bfd
;
2531 static int output_buffer
;
2536 /* FIXME: Check return value. I'm not sure whether it needs to read
2537 the entire buffer or not. */
2538 bfd_read ((PTR
) input_ptr_start
, 1, input_ptr_end
- input_ptr_start
, input_bfd
);
2539 input_ptr
= input_ptr_start
;
2544 if (bfd_write ((PTR
) (output_ptr_start
), 1, output_ptr
- output_ptr_start
,
2546 != (bfd_size_type
) (output_ptr
- output_ptr_start
))
2548 output_ptr
= output_ptr_start
;
2552 #define THIS() ( *input_ptr )
2553 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill(); }
2554 #define OUT(x) { *output_ptr++ = (x); if(output_ptr == output_ptr_end) flush(); }
2560 if (value
>= 0 && value
<= 127)
2566 unsigned int length
;
2567 /* How many significant bytes ? */
2568 /* FIXME FOR LONGER INTS */
2569 if (value
& 0xff000000)
2573 else if (value
& 0x00ff0000)
2577 else if (value
& 0x0000ff00)
2584 OUT ((int) ieee_number_repeat_start_enum
+ length
);
2603 int length
= THIS ();
2615 #define VAR(x) ((x | 0x80))
2630 value
= (value
<< 8) | THIS ();
2632 value
= (value
<< 8) | THIS ();
2634 value
= (value
<< 8) | THIS ();
2642 value
= (value
<< 8) | THIS ();
2644 value
= (value
<< 8) | THIS ();
2652 value
= (value
<< 8) | THIS ();
2669 /* Not a number, just bug out with the answer */
2670 write_int (*(--tos
));
2680 int value
= *(--tos
);
2689 ieee_data_type
*ieee
;
2692 section_number
= THIS ();
2695 ieee
= IEEE_DATA (input_bfd
);
2696 s
= ieee
->section_table
[section_number
];
2697 if (s
->output_section
)
2699 value
= s
->output_section
->lma
;
2705 value
+= s
->output_offset
;
2713 write_int (*(--tos
));
2723 /* Drop the int in the buffer, and copy a null into the gap, which we
2724 will overwrite later */
2726 struct output_buffer_struct
2728 unsigned char *ptrp
;
2734 struct output_buffer_struct
*buf
;
2736 if (buf
->buffer
== output_buffer
)
2738 /* Still a chance to output the size */
2739 int value
= output_ptr
- buf
->ptrp
+ 3;
2740 buf
->ptrp
[0] = value
>> 24;
2741 buf
->ptrp
[1] = value
>> 16;
2742 buf
->ptrp
[2] = value
>> 8;
2743 buf
->ptrp
[3] = value
>> 0;
2749 struct output_buffer_struct
*buf
;
2775 buf
->ptrp
= output_ptr
;
2776 buf
->buffer
= output_buffer
;
2816 #define ID copy_id()
2817 #define INT copy_int()
2818 #define EXP copy_expression()
2819 static void copy_till_end ();
2820 #define INTn(q) copy_int()
2821 #define EXPn(q) copy_expression()
2860 EXPn (instruction address
);
2894 EXPn (external function
);
2904 INTn (locked
register);
2927 /* Attribute record */
2985 static void block ();
2997 /* Unique typedefs for module */
2998 /* GLobal typedefs */
2999 /* High level module scope beginning */
3001 struct output_buffer_struct ob
;
3016 /* Global function */
3018 struct output_buffer_struct ob
;
3032 EXPn (size of block
);
3038 /* File name for source line numbers */
3040 struct output_buffer_struct ob
;
3060 /* Local function */
3062 struct output_buffer_struct ob
;
3080 /* Assembler module scope beginning -*/
3082 struct output_buffer_struct ob
;
3108 struct output_buffer_struct ob
;
3115 INTn (section index
);
3123 EXPn (Size in Maus
);
3178 moves all the debug information from the source bfd to the output
3179 bfd, and relocates any expressions it finds
3183 relocate_debug (output
, input
)
3184 bfd
*output ATTRIBUTE_UNUSED
;
3189 unsigned char input_buffer
[IBS
];
3191 input_ptr_start
= input_ptr
= input_buffer
;
3192 input_ptr_end
= input_buffer
+ IBS
;
3194 /* FIXME: Check return value. I'm not sure whether it needs to read
3195 the entire buffer or not. */
3196 bfd_read ((PTR
) input_ptr_start
, 1, IBS
, input
);
3201 During linking, we we told about the bfds which made up our
3202 contents, we have a list of them. They will still be open, so go to
3203 the debug info in each, and copy it out, relocating it as we go.
3207 ieee_write_debug_part (abfd
)
3210 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3211 bfd_chain_type
*chain
= ieee
->chain_root
;
3212 unsigned char output_buffer
[OBS
];
3213 boolean some_debug
= false;
3214 file_ptr here
= bfd_tell (abfd
);
3216 output_ptr_start
= output_ptr
= output_buffer
;
3217 output_ptr_end
= output_buffer
+ OBS
;
3218 output_ptr
= output_buffer
;
3221 if (chain
== (bfd_chain_type
*) NULL
)
3225 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
3226 if ((s
->flags
& SEC_DEBUGGING
) != 0)
3230 ieee
->w
.r
.debug_information_part
= 0;
3234 ieee
->w
.r
.debug_information_part
= here
;
3235 if (bfd_write (s
->contents
, 1, s
->_raw_size
, abfd
) != s
->_raw_size
)
3240 while (chain
!= (bfd_chain_type
*) NULL
)
3242 bfd
*entry
= chain
->this;
3243 ieee_data_type
*entry_ieee
= IEEE_DATA (entry
);
3244 if (entry_ieee
->w
.r
.debug_information_part
)
3246 if (bfd_seek (entry
, entry_ieee
->w
.r
.debug_information_part
,
3250 relocate_debug (abfd
, entry
);
3253 chain
= chain
->next
;
3257 ieee
->w
.r
.debug_information_part
= here
;
3261 ieee
->w
.r
.debug_information_part
= 0;
3270 /* Write the data in an ieee way. */
3273 ieee_write_data_part (abfd
)
3277 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3278 ieee
->w
.r
.data_part
= bfd_tell (abfd
);
3279 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
3281 /* Skip sections that have no loadable contents (.bss,
3283 if ((s
->flags
& SEC_LOAD
) == 0)
3286 /* Sort the reloc records so we can insert them in the correct
3288 if (s
->reloc_count
!= 0)
3290 if (! do_with_relocs (abfd
, s
))
3295 if (! do_without_relocs (abfd
, s
))
3305 init_for_output (abfd
)
3309 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
3311 if ((s
->flags
& SEC_DEBUGGING
) != 0)
3313 if (s
->_raw_size
!= 0)
3315 ieee_per_section (s
)->data
= (bfd_byte
*) (bfd_alloc (abfd
, s
->_raw_size
));
3316 if (!ieee_per_section (s
)->data
)
3323 /** exec and core file sections */
3325 /* set section contents is complicated with IEEE since the format is
3326 * not a byte image, but a record stream.
3329 ieee_set_section_contents (abfd
, section
, location
, offset
, count
)
3334 bfd_size_type count
;
3336 if ((section
->flags
& SEC_DEBUGGING
) != 0)
3338 if (section
->contents
== NULL
)
3340 section
->contents
= ((unsigned char *)
3341 bfd_alloc (abfd
, section
->_raw_size
));
3342 if (section
->contents
== NULL
)
3345 /* bfd_set_section_contents has already checked that everything
3347 memcpy (section
->contents
+ offset
, location
, count
);
3351 if (ieee_per_section (section
)->data
== (bfd_byte
*) NULL
)
3353 if (!init_for_output (abfd
))
3356 memcpy ((PTR
) (ieee_per_section (section
)->data
+ offset
),
3358 (unsigned int) count
);
3362 /* Write the external symbols of a file. IEEE considers two sorts of
3363 external symbols, public, and referenced. It uses to internal
3364 forms to index them as well. When we write them out we turn their
3365 symbol values into indexes from the right base. */
3368 ieee_write_external_part (abfd
)
3372 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3374 unsigned int reference_index
= IEEE_REFERENCE_BASE
;
3375 unsigned int public_index
= IEEE_PUBLIC_BASE
+ 2;
3376 file_ptr here
= bfd_tell (abfd
);
3377 boolean hadone
= false;
3378 if (abfd
->outsymbols
!= (asymbol
**) NULL
)
3381 for (q
= abfd
->outsymbols
; *q
!= (asymbol
*) NULL
; q
++)
3384 if (bfd_is_und_section (p
->section
))
3386 /* This must be a symbol reference .. */
3387 if (! ieee_write_byte (abfd
, ieee_external_reference_enum
)
3388 || ! ieee_write_int (abfd
, reference_index
)
3389 || ! ieee_write_id (abfd
, p
->name
))
3391 p
->value
= reference_index
;
3395 else if (bfd_is_com_section (p
->section
))
3397 /* This is a weak reference */
3398 if (! ieee_write_byte (abfd
, ieee_external_reference_enum
)
3399 || ! ieee_write_int (abfd
, reference_index
)
3400 || ! ieee_write_id (abfd
, p
->name
)
3401 || ! ieee_write_byte (abfd
,
3402 ieee_weak_external_reference_enum
)
3403 || ! ieee_write_int (abfd
, reference_index
)
3404 || ! ieee_write_int (abfd
, p
->value
))
3406 p
->value
= reference_index
;
3410 else if (p
->flags
& BSF_GLOBAL
)
3412 /* This must be a symbol definition */
3414 if (! ieee_write_byte (abfd
, ieee_external_symbol_enum
)
3415 || ! ieee_write_int (abfd
, public_index
)
3416 || ! ieee_write_id (abfd
, p
->name
)
3417 || ! ieee_write_2bytes (abfd
, ieee_attribute_record_enum
)
3418 || ! ieee_write_int (abfd
, public_index
)
3419 || ! ieee_write_byte (abfd
, 15) /* instruction address */
3420 || ! ieee_write_byte (abfd
, 19) /* static symbol */
3421 || ! ieee_write_byte (abfd
, 1)) /* one of them */
3424 /* Write out the value */
3425 if (! ieee_write_2bytes (abfd
, ieee_value_record_enum
)
3426 || ! ieee_write_int (abfd
, public_index
))
3428 if (! bfd_is_abs_section (p
->section
))
3430 if (abfd
->flags
& EXEC_P
)
3432 /* If fully linked, then output all symbols
3434 if (! (ieee_write_int
3437 + p
->section
->output_offset
3438 + p
->section
->output_section
->vma
))))
3443 if (! (ieee_write_expression
3445 p
->value
+ p
->section
->output_offset
,
3446 p
->section
->output_section
->symbol
,
3453 if (! ieee_write_expression (abfd
,
3455 bfd_abs_section_ptr
->symbol
,
3459 p
->value
= public_index
;
3465 /* This can happen - when there are gaps in the symbols read */
3466 /* from an input ieee file */
3471 ieee
->w
.r
.external_part
= here
;
3477 static CONST
unsigned char exten
[] =
3480 0xf1, 0xce, 0x20, 0x00, 37, 3, 3, /* Set version 3 rev 3 */
3481 0xf1, 0xce, 0x20, 0x00, 39, 2,/* keep symbol in original case */
3482 0xf1, 0xce, 0x20, 0x00, 38 /* set object type relocateable to x */
3485 static CONST
unsigned char envi
[] =
3489 /* 0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
3492 0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok */
3494 0xf1, 0xce, 0x21, 0, 53, 0x03,/* host unix */
3495 /* 0xf1, 0xce, 0x21, 0, 54, 2,1,1 tool & version # */
3499 ieee_write_me_part (abfd
)
3502 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3503 ieee
->w
.r
.trailer_part
= bfd_tell (abfd
);
3504 if (abfd
->start_address
)
3506 if (! ieee_write_2bytes (abfd
, ieee_value_starting_address_enum
)
3507 || ! ieee_write_byte (abfd
, ieee_function_either_open_b_enum
)
3508 || ! ieee_write_int (abfd
, abfd
->start_address
)
3509 || ! ieee_write_byte (abfd
, ieee_function_either_close_b_enum
))
3512 ieee
->w
.r
.me_record
= bfd_tell (abfd
);
3513 if (! ieee_write_byte (abfd
, ieee_module_end_enum
))
3518 /* Write out the IEEE processor ID. */
3521 ieee_write_processor (abfd
)
3524 const bfd_arch_info_type
*arch
;
3526 arch
= bfd_get_arch_info (abfd
);
3530 if (! ieee_write_id (abfd
, bfd_printable_name (abfd
)))
3535 if (! ieee_write_id (abfd
, "29000"))
3539 case bfd_arch_h8300
:
3540 if (! ieee_write_id (abfd
, "H8/300"))
3544 case bfd_arch_h8500
:
3545 if (! ieee_write_id (abfd
, "H8/500"))
3553 case bfd_mach_i960_core
:
3554 case bfd_mach_i960_ka_sa
:
3555 if (! ieee_write_id (abfd
, "80960KA"))
3559 case bfd_mach_i960_kb_sb
:
3560 if (! ieee_write_id (abfd
, "80960KB"))
3564 case bfd_mach_i960_ca
:
3565 if (! ieee_write_id (abfd
, "80960CA"))
3569 case bfd_mach_i960_mc
:
3570 case bfd_mach_i960_xa
:
3571 if (! ieee_write_id (abfd
, "80960MC"))
3583 default: id
= "68020"; break;
3584 case bfd_mach_m68000
: id
= "68000"; break;
3585 case bfd_mach_m68008
: id
= "68008"; break;
3586 case bfd_mach_m68010
: id
= "68010"; break;
3587 case bfd_mach_m68020
: id
= "68020"; break;
3588 case bfd_mach_m68030
: id
= "68030"; break;
3589 case bfd_mach_m68040
: id
= "68040"; break;
3590 case bfd_mach_m68060
: id
= "68060"; break;
3591 case bfd_mach_cpu32
: id
= "cpu32"; break;
3594 if (! ieee_write_id (abfd
, id
))
3604 ieee_write_object_contents (abfd
)
3607 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3611 /* Fast forward over the header area */
3612 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
3615 if (! ieee_write_byte (abfd
, ieee_module_beginning_enum
)
3616 || ! ieee_write_processor (abfd
)
3617 || ! ieee_write_id (abfd
, abfd
->filename
))
3620 /* Fast forward over the variable bits */
3621 if (! ieee_write_byte (abfd
, ieee_address_descriptor_enum
))
3625 if (! ieee_write_byte (abfd
, (bfd_byte
) (bfd_arch_bits_per_byte (abfd
))))
3627 /* MAU's per address */
3628 if (! ieee_write_byte (abfd
,
3629 (bfd_byte
) (bfd_arch_bits_per_address (abfd
)
3630 / bfd_arch_bits_per_byte (abfd
))))
3633 old
= bfd_tell (abfd
);
3634 if (bfd_seek (abfd
, (file_ptr
) (8 * N_W_VARIABLES
), SEEK_CUR
) != 0)
3637 ieee
->w
.r
.extension_record
= bfd_tell (abfd
);
3638 if (bfd_write ((char *) exten
, 1, sizeof (exten
), abfd
) != sizeof (exten
))
3640 if (abfd
->flags
& EXEC_P
)
3642 if (! ieee_write_byte (abfd
, 0x1)) /* Absolute */
3647 if (! ieee_write_byte (abfd
, 0x2)) /* Relocateable */
3651 ieee
->w
.r
.environmental_record
= bfd_tell (abfd
);
3652 if (bfd_write ((char *) envi
, 1, sizeof (envi
), abfd
) != sizeof (envi
))
3655 /* The HP emulator database requires a timestamp in the file. */
3661 t
= (struct tm
*) localtime (&now
);
3662 if (! ieee_write_2bytes (abfd
, (int) ieee_atn_record_enum
)
3663 || ! ieee_write_byte (abfd
, 0x21)
3664 || ! ieee_write_byte (abfd
, 0)
3665 || ! ieee_write_byte (abfd
, 50)
3666 || ! ieee_write_int (abfd
, t
->tm_year
+ 1900)
3667 || ! ieee_write_int (abfd
, t
->tm_mon
+ 1)
3668 || ! ieee_write_int (abfd
, t
->tm_mday
)
3669 || ! ieee_write_int (abfd
, t
->tm_hour
)
3670 || ! ieee_write_int (abfd
, t
->tm_min
)
3671 || ! ieee_write_int (abfd
, t
->tm_sec
))
3679 if (! ieee_write_section_part (abfd
))
3681 /* First write the symbols. This changes their values into table
3682 indeces so we cant use it after this point. */
3683 if (! ieee_write_external_part (abfd
))
3686 /* ieee_write_byte(abfd, ieee_record_seperator_enum);*/
3688 /* ieee_write_byte(abfd, ieee_record_seperator_enum);*/
3691 /* Write any debugs we have been told about. */
3692 if (! ieee_write_debug_part (abfd
))
3695 /* Can only write the data once the symbols have been written, since
3696 the data contains relocation information which points to the
3698 if (! ieee_write_data_part (abfd
))
3701 /* At the end we put the end! */
3702 if (! ieee_write_me_part (abfd
))
3705 /* Generate the header */
3706 if (bfd_seek (abfd
, old
, SEEK_SET
) != 0)
3709 for (i
= 0; i
< N_W_VARIABLES
; i
++)
3711 if (! ieee_write_2bytes (abfd
, ieee_assign_value_to_variable_enum
)
3712 || ! ieee_write_byte (abfd
, (bfd_byte
) i
)
3713 || ! ieee_write_int5_out (abfd
, ieee
->w
.offset
[i
]))
3720 /* Native-level interface to symbols. */
3722 /* We read the symbols into a buffer, which is discarded when this
3723 function exits. We read the strings into a buffer large enough to
3724 hold them all plus all the cached symbol entries. */
3727 ieee_make_empty_symbol (abfd
)
3730 ieee_symbol_type
*new =
3731 (ieee_symbol_type
*) bfd_zmalloc (sizeof (ieee_symbol_type
));
3734 new->symbol
.the_bfd
= abfd
;
3735 return &new->symbol
;
3739 ieee_openr_next_archived_file (arch
, prev
)
3743 ieee_ar_data_type
*ar
= IEEE_AR_DATA (arch
);
3744 /* take the next one from the arch state, or reset */
3745 if (prev
== (bfd
*) NULL
)
3747 /* Reset the index - the first two entries are bogus*/
3748 ar
->element_index
= 2;
3752 ieee_ar_obstack_type
*p
= ar
->elements
+ ar
->element_index
;
3753 ar
->element_index
++;
3754 if (ar
->element_index
<= ar
->element_count
)
3756 if (p
->file_offset
!= (file_ptr
) 0)
3758 if (p
->abfd
== (bfd
*) NULL
)
3760 p
->abfd
= _bfd_create_empty_archive_element_shell (arch
);
3761 p
->abfd
->origin
= p
->file_offset
;
3768 bfd_set_error (bfd_error_no_more_archived_files
);
3769 return (bfd
*) NULL
;
3776 ieee_find_nearest_line (abfd
,
3783 bfd
*abfd ATTRIBUTE_UNUSED
;
3784 asection
*section ATTRIBUTE_UNUSED
;
3785 asymbol
**symbols ATTRIBUTE_UNUSED
;
3786 bfd_vma offset ATTRIBUTE_UNUSED
;
3787 const char **filename_ptr ATTRIBUTE_UNUSED
;
3788 const char **functionname_ptr ATTRIBUTE_UNUSED
;
3789 unsigned int *line_ptr ATTRIBUTE_UNUSED
;
3795 ieee_generic_stat_arch_elt (abfd
, buf
)
3799 ieee_ar_data_type
*ar
= (ieee_ar_data_type
*) NULL
;
3800 ieee_data_type
*ieee
;
3802 if (abfd
->my_archive
!= NULL
)
3803 ar
= abfd
->my_archive
->tdata
.ieee_ar_data
;
3804 if (ar
== (ieee_ar_data_type
*) NULL
)
3806 bfd_set_error (bfd_error_invalid_operation
);
3810 if (IEEE_DATA (abfd
) == NULL
)
3812 if (ieee_object_p (abfd
) == NULL
)
3814 bfd_set_error (bfd_error_wrong_format
);
3819 ieee
= IEEE_DATA (abfd
);
3821 buf
->st_size
= ieee
->w
.r
.me_record
+ 1;
3822 buf
->st_mode
= 0644;
3827 ieee_sizeof_headers (abfd
, x
)
3828 bfd
*abfd ATTRIBUTE_UNUSED
;
3829 boolean x ATTRIBUTE_UNUSED
;
3835 /* The debug info routines are never used. */
3839 ieee_bfd_debug_info_start (abfd
)
3846 ieee_bfd_debug_info_end (abfd
)
3853 /* Add this section to the list of sections we have debug info for, to
3854 be ready to output it at close time
3857 ieee_bfd_debug_info_accumulate (abfd
, section
)
3861 ieee_data_type
*ieee
= IEEE_DATA (section
->owner
);
3862 ieee_data_type
*output_ieee
= IEEE_DATA (abfd
);
3863 /* can only accumulate data from other ieee bfds */
3864 if (section
->owner
->xvec
!= abfd
->xvec
)
3866 /* Only bother once per bfd */
3867 if (ieee
->done_debug
== true)
3869 ieee
->done_debug
= true;
3871 /* Don't bother if there is no debug info */
3872 if (ieee
->w
.r
.debug_information_part
== 0)
3878 bfd_chain_type
*n
= (bfd_chain_type
*) bfd_alloc (abfd
, sizeof (bfd_chain_type
));
3880 abort (); /* FIXME */
3881 n
->this = section
->owner
;
3882 n
->next
= (bfd_chain_type
*) NULL
;
3884 if (output_ieee
->chain_head
)
3886 output_ieee
->chain_head
->next
= n
;
3890 output_ieee
->chain_root
= n
;
3893 output_ieee
->chain_head
= n
;
3899 #define ieee_close_and_cleanup _bfd_generic_close_and_cleanup
3900 #define ieee_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
3902 #define ieee_slurp_armap bfd_true
3903 #define ieee_slurp_extended_name_table bfd_true
3904 #define ieee_construct_extended_name_table \
3905 ((boolean (*) PARAMS ((bfd *, char **, bfd_size_type *, const char **))) \
3907 #define ieee_truncate_arname bfd_dont_truncate_arname
3908 #define ieee_write_armap \
3910 PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int))) \
3912 #define ieee_read_ar_hdr bfd_nullvoidptr
3913 #define ieee_update_armap_timestamp bfd_true
3914 #define ieee_get_elt_at_index _bfd_generic_get_elt_at_index
3916 #define ieee_bfd_is_local_label_name bfd_generic_is_local_label_name
3917 #define ieee_get_lineno _bfd_nosymbols_get_lineno
3918 #define ieee_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
3919 #define ieee_read_minisymbols _bfd_generic_read_minisymbols
3920 #define ieee_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
3922 #define ieee_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
3924 #define ieee_set_arch_mach _bfd_generic_set_arch_mach
3926 #define ieee_get_section_contents_in_window \
3927 _bfd_generic_get_section_contents_in_window
3928 #define ieee_bfd_get_relocated_section_contents \
3929 bfd_generic_get_relocated_section_contents
3930 #define ieee_bfd_relax_section bfd_generic_relax_section
3931 #define ieee_bfd_gc_sections bfd_generic_gc_sections
3932 #define ieee_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
3933 #define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols
3934 #define ieee_bfd_final_link _bfd_generic_final_link
3935 #define ieee_bfd_link_split_section _bfd_generic_link_split_section
3938 const bfd_target ieee_vec
=
3941 bfd_target_ieee_flavour
,
3942 BFD_ENDIAN_UNKNOWN
, /* target byte order */
3943 BFD_ENDIAN_UNKNOWN
, /* target headers byte order */
3944 (HAS_RELOC
| EXEC_P
| /* object flags */
3945 HAS_LINENO
| HAS_DEBUG
|
3946 HAS_SYMS
| HAS_LOCALS
| WP_TEXT
| D_PAGED
),
3947 (SEC_CODE
| SEC_DATA
| SEC_ROM
| SEC_HAS_CONTENTS
3948 | SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
), /* section flags */
3949 '_', /* leading underscore */
3950 ' ', /* ar_pad_char */
3951 16, /* ar_max_namelen */
3952 bfd_getb64
, bfd_getb_signed_64
, bfd_putb64
,
3953 bfd_getb32
, bfd_getb_signed_32
, bfd_putb32
,
3954 bfd_getb16
, bfd_getb_signed_16
, bfd_putb16
, /* data */
3955 bfd_getb64
, bfd_getb_signed_64
, bfd_putb64
,
3956 bfd_getb32
, bfd_getb_signed_32
, bfd_putb32
,
3957 bfd_getb16
, bfd_getb_signed_16
, bfd_putb16
, /* hdrs */
3960 ieee_object_p
, /* bfd_check_format */
3967 _bfd_generic_mkarchive
,
3972 ieee_write_object_contents
,
3973 _bfd_write_archive_contents
,
3977 BFD_JUMP_TABLE_GENERIC (ieee
),
3978 BFD_JUMP_TABLE_COPY (_bfd_generic
),
3979 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
3980 BFD_JUMP_TABLE_ARCHIVE (ieee
),
3981 BFD_JUMP_TABLE_SYMBOLS (ieee
),
3982 BFD_JUMP_TABLE_RELOCS (ieee
),
3983 BFD_JUMP_TABLE_WRITE (ieee
),
3984 BFD_JUMP_TABLE_LINK (ieee
),
3985 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic
),