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
=
1012 /* the_bfd, name, value, attr, section */
1013 {&dummy_bfd
, " ieee empty", (symvalue
) 0, BSF_DEBUGGING
, bfd_abs_section_ptr
, { 0 }};
1017 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1018 dummy_bfd
.xvec
= &ieee_vec
;
1019 if (! ieee_slurp_symbol_table (abfd
))
1022 if (ieee
->symbol_table_full
== false)
1024 /* Arrgh - there are gaps in the table, run through and fill them */
1025 /* up with pointers to a null place */
1027 for (i
= 0; i
< abfd
->symcount
; i
++)
1029 location
[i
] = &empty_symbol
;
1033 ieee
->external_symbol_base_offset
= -ieee
->external_symbol_min_index
;
1034 for (symp
= IEEE_DATA (abfd
)->external_symbols
;
1035 symp
!= (ieee_symbol_type
*) NULL
;
1038 /* Place into table at correct index locations */
1039 location
[symp
->index
+ ieee
->external_symbol_base_offset
] = &symp
->symbol
;
1042 /* The external refs are indexed in a bit */
1043 ieee
->external_reference_base_offset
=
1044 -ieee
->external_reference_min_index
+ ieee
->external_symbol_count
;
1046 for (symp
= IEEE_DATA (abfd
)->external_reference
;
1047 symp
!= (ieee_symbol_type
*) NULL
;
1050 location
[symp
->index
+ ieee
->external_reference_base_offset
] =
1057 location
[abfd
->symcount
] = (asymbol
*) NULL
;
1059 return abfd
->symcount
;
1063 get_section_entry (abfd
, ieee
, index
)
1065 ieee_data_type
*ieee
;
1068 if (index
>= ieee
->section_table_size
)
1073 c
= ieee
->section_table_size
;
1080 bfd_realloc (ieee
->section_table
, c
* sizeof (asection
*)));
1084 for (i
= ieee
->section_table_size
; i
< c
; i
++)
1087 ieee
->section_table
= n
;
1088 ieee
->section_table_size
= c
;
1091 if (ieee
->section_table
[index
] == (asection
*) NULL
)
1093 char *tmp
= bfd_alloc (abfd
, 11);
1098 sprintf (tmp
, " fsec%4d", index
);
1099 section
= bfd_make_section (abfd
, tmp
);
1100 ieee
->section_table
[index
] = section
;
1101 section
->flags
= SEC_NO_FLAGS
;
1102 section
->target_index
= index
;
1103 ieee
->section_table
[index
] = section
;
1105 return ieee
->section_table
[index
];
1109 ieee_slurp_sections (abfd
)
1112 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1113 file_ptr offset
= ieee
->w
.r
.section_part
;
1114 asection
*section
= (asection
*) NULL
;
1119 bfd_byte section_type
[3];
1120 ieee_seek (abfd
, offset
);
1123 switch (this_byte (&(ieee
->h
)))
1125 case ieee_section_type_enum
:
1127 unsigned int section_index
;
1128 next_byte (&(ieee
->h
));
1129 section_index
= must_parse_int (&(ieee
->h
));
1131 section
= get_section_entry (abfd
, ieee
, section_index
);
1133 section_type
[0] = this_byte_and_next (&(ieee
->h
));
1135 /* Set minimal section attributes. Attributes are
1136 extended later, based on section contents. */
1138 switch (section_type
[0])
1141 /* Normal attributes for absolute sections */
1142 section_type
[1] = this_byte (&(ieee
->h
));
1143 section
->flags
= SEC_ALLOC
;
1144 switch (section_type
[1])
1146 case 0xD3: /* AS Absolute section attributes */
1147 next_byte (&(ieee
->h
));
1148 section_type
[2] = this_byte (&(ieee
->h
));
1149 switch (section_type
[2])
1153 next_byte (&(ieee
->h
));
1154 section
->flags
|= SEC_CODE
;
1158 next_byte (&(ieee
->h
));
1159 section
->flags
|= SEC_DATA
;
1162 next_byte (&(ieee
->h
));
1163 /* Normal rom data */
1164 section
->flags
|= SEC_ROM
| SEC_DATA
;
1171 case 0xC3: /* Named relocatable sections (type C) */
1172 section_type
[1] = this_byte (&(ieee
->h
));
1173 section
->flags
= SEC_ALLOC
;
1174 switch (section_type
[1])
1176 case 0xD0: /* Normal code (CP) */
1177 next_byte (&(ieee
->h
));
1178 section
->flags
|= SEC_CODE
;
1180 case 0xC4: /* Normal data (CD) */
1181 next_byte (&(ieee
->h
));
1182 section
->flags
|= SEC_DATA
;
1184 case 0xD2: /* Normal rom data (CR) */
1185 next_byte (&(ieee
->h
));
1186 section
->flags
|= SEC_ROM
| SEC_DATA
;
1193 /* Read section name, use it if non empty. */
1194 name
= read_id (&ieee
->h
);
1196 section
->name
= name
;
1198 /* Skip these fields, which we don't care about */
1200 bfd_vma parent
, brother
, context
;
1201 parse_int (&(ieee
->h
), &parent
);
1202 parse_int (&(ieee
->h
), &brother
);
1203 parse_int (&(ieee
->h
), &context
);
1207 case ieee_section_alignment_enum
:
1209 unsigned int section_index
;
1212 next_byte (&(ieee
->h
));
1213 section_index
= must_parse_int (&ieee
->h
);
1214 section
= get_section_entry (abfd
, ieee
, section_index
);
1215 if (section_index
> ieee
->section_count
)
1217 ieee
->section_count
= section_index
;
1219 section
->alignment_power
=
1220 bfd_log2 (must_parse_int (&ieee
->h
));
1221 (void) parse_int (&(ieee
->h
), &value
);
1224 case ieee_e2_first_byte_enum
:
1226 ieee_record_enum_type t
= (ieee_record_enum_type
) (read_2bytes (&(ieee
->h
)));
1230 case ieee_section_size_enum
:
1231 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1232 section
->_raw_size
= must_parse_int (&(ieee
->h
));
1234 case ieee_physical_region_size_enum
:
1235 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1236 section
->_raw_size
= must_parse_int (&(ieee
->h
));
1238 case ieee_region_base_address_enum
:
1239 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1240 section
->vma
= must_parse_int (&(ieee
->h
));
1241 section
->lma
= section
->vma
;
1243 case ieee_mau_size_enum
:
1244 must_parse_int (&(ieee
->h
));
1245 must_parse_int (&(ieee
->h
));
1247 case ieee_m_value_enum
:
1248 must_parse_int (&(ieee
->h
));
1249 must_parse_int (&(ieee
->h
));
1251 case ieee_section_base_address_enum
:
1252 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1253 section
->vma
= must_parse_int (&(ieee
->h
));
1254 section
->lma
= section
->vma
;
1256 case ieee_section_offset_enum
:
1257 (void) must_parse_int (&(ieee
->h
));
1258 (void) must_parse_int (&(ieee
->h
));
1272 /* Make a section for the debugging information, if any. We don't try
1273 to interpret the debugging information; we just point the section
1274 at the area in the file so that program which understand can dig it
1278 ieee_slurp_debug (abfd
)
1281 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1284 if (ieee
->w
.r
.debug_information_part
== 0)
1287 sec
= bfd_make_section (abfd
, ".debug");
1290 sec
->flags
|= SEC_DEBUGGING
| SEC_HAS_CONTENTS
;
1291 sec
->filepos
= ieee
->w
.r
.debug_information_part
;
1292 sec
->_raw_size
= ieee
->w
.r
.data_part
- ieee
->w
.r
.debug_information_part
;
1297 /***********************************************************************
1302 ieee_archive_p (abfd
)
1307 unsigned char buffer
[512];
1308 file_ptr buffer_offset
= 0;
1309 ieee_ar_data_type
*save
= abfd
->tdata
.ieee_ar_data
;
1310 ieee_ar_data_type
*ieee
;
1311 unsigned int alc_elts
;
1312 ieee_ar_obstack_type
*elts
= NULL
;
1314 abfd
->tdata
.ieee_ar_data
=
1315 (ieee_ar_data_type
*) bfd_alloc (abfd
, sizeof (ieee_ar_data_type
));
1316 if (!abfd
->tdata
.ieee_ar_data
)
1318 ieee
= IEEE_AR_DATA (abfd
);
1320 /* FIXME: Check return value. I'm not sure whether it needs to read
1321 the entire buffer or not. */
1322 bfd_read ((PTR
) buffer
, 1, sizeof (buffer
), abfd
);
1324 ieee
->h
.first_byte
= buffer
;
1325 ieee
->h
.input_p
= buffer
;
1327 ieee
->h
.abfd
= abfd
;
1329 if (this_byte (&(ieee
->h
)) != Module_Beginning
)
1331 abfd
->tdata
.ieee_ar_data
= save
;
1335 next_byte (&(ieee
->h
));
1336 library
= read_id (&(ieee
->h
));
1337 if (strcmp (library
, "LIBRARY") != 0)
1339 bfd_release (abfd
, ieee
);
1340 abfd
->tdata
.ieee_ar_data
= save
;
1343 /* Throw away the filename */
1344 read_id (&(ieee
->h
));
1346 ieee
->element_count
= 0;
1347 ieee
->element_index
= 0;
1349 next_byte (&(ieee
->h
)); /* Drop the ad part */
1350 must_parse_int (&(ieee
->h
)); /* And the two dummy numbers */
1351 must_parse_int (&(ieee
->h
));
1354 elts
= (ieee_ar_obstack_type
*) bfd_malloc (alc_elts
* sizeof *elts
);
1358 /* Read the index of the BB table */
1362 ieee_ar_obstack_type
*t
;
1364 rec
= read_2bytes (&(ieee
->h
));
1365 if (rec
!= (int) ieee_assign_value_to_variable_enum
)
1368 if (ieee
->element_count
>= alc_elts
)
1370 ieee_ar_obstack_type
*n
;
1373 n
= ((ieee_ar_obstack_type
*)
1374 bfd_realloc (elts
, alc_elts
* sizeof *elts
));
1380 t
= &elts
[ieee
->element_count
];
1381 ieee
->element_count
++;
1383 must_parse_int (&(ieee
->h
));
1384 t
->file_offset
= must_parse_int (&(ieee
->h
));
1385 t
->abfd
= (bfd
*) NULL
;
1387 /* Make sure that we don't go over the end of the buffer */
1389 if ((size_t) ieee_pos (abfd
) > sizeof (buffer
) / 2)
1391 /* Past half way, reseek and reprime */
1392 buffer_offset
+= ieee_pos (abfd
);
1393 if (bfd_seek (abfd
, buffer_offset
, SEEK_SET
) != 0)
1395 /* FIXME: Check return value. I'm not sure whether it needs
1396 to read the entire buffer or not. */
1397 bfd_read ((PTR
) buffer
, 1, sizeof (buffer
), abfd
);
1398 ieee
->h
.first_byte
= buffer
;
1399 ieee
->h
.input_p
= buffer
;
1403 ieee
->elements
= ((ieee_ar_obstack_type
*)
1405 ieee
->element_count
* sizeof *ieee
->elements
));
1406 if (ieee
->elements
== NULL
)
1408 memcpy (ieee
->elements
, elts
,
1409 ieee
->element_count
* sizeof *ieee
->elements
);
1413 /* Now scan the area again, and replace BB offsets with file */
1416 for (i
= 2; i
< ieee
->element_count
; i
++)
1418 if (bfd_seek (abfd
, ieee
->elements
[i
].file_offset
, SEEK_SET
) != 0)
1420 /* FIXME: Check return value. I'm not sure whether it needs to
1421 read the entire buffer or not. */
1422 bfd_read ((PTR
) buffer
, 1, sizeof (buffer
), abfd
);
1423 ieee
->h
.first_byte
= buffer
;
1424 ieee
->h
.input_p
= buffer
;
1426 next_byte (&(ieee
->h
)); /* Drop F8 */
1427 next_byte (&(ieee
->h
)); /* Drop 14 */
1428 must_parse_int (&(ieee
->h
)); /* Drop size of block */
1429 if (must_parse_int (&(ieee
->h
)) != 0)
1431 /* This object has been deleted */
1432 ieee
->elements
[i
].file_offset
= 0;
1436 ieee
->elements
[i
].file_offset
= must_parse_int (&(ieee
->h
));
1440 /* abfd->has_armap = ;*/
1451 ieee_mkobject (abfd
)
1454 abfd
->tdata
.ieee_data
= (ieee_data_type
*) bfd_zalloc (abfd
, sizeof (ieee_data_type
));
1455 return abfd
->tdata
.ieee_data
? true : false;
1459 ieee_object_p (abfd
)
1464 ieee_data_type
*ieee
;
1465 unsigned char buffer
[300];
1466 ieee_data_type
*save
= IEEE_DATA (abfd
);
1468 abfd
->tdata
.ieee_data
= 0;
1469 ieee_mkobject (abfd
);
1471 ieee
= IEEE_DATA (abfd
);
1472 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1474 /* Read the first few bytes in to see if it makes sense */
1475 /* FIXME: Check return value. I'm not sure whether it needs to read
1476 the entire buffer or not. */
1477 bfd_read ((PTR
) buffer
, 1, sizeof (buffer
), abfd
);
1479 ieee
->h
.input_p
= buffer
;
1480 if (this_byte_and_next (&(ieee
->h
)) != Module_Beginning
)
1481 goto got_wrong_format
;
1483 ieee
->read_symbols
= false;
1484 ieee
->read_data
= false;
1485 ieee
->section_count
= 0;
1486 ieee
->external_symbol_max_index
= 0;
1487 ieee
->external_symbol_min_index
= IEEE_PUBLIC_BASE
;
1488 ieee
->external_reference_min_index
= IEEE_REFERENCE_BASE
;
1489 ieee
->external_reference_max_index
= 0;
1490 ieee
->h
.abfd
= abfd
;
1491 ieee
->section_table
= NULL
;
1492 ieee
->section_table_size
= 0;
1494 processor
= ieee
->mb
.processor
= read_id (&(ieee
->h
));
1495 if (strcmp (processor
, "LIBRARY") == 0)
1496 goto got_wrong_format
;
1497 ieee
->mb
.module_name
= read_id (&(ieee
->h
));
1498 if (abfd
->filename
== (CONST
char *) NULL
)
1500 abfd
->filename
= ieee
->mb
.module_name
;
1502 /* Determine the architecture and machine type of the object file.
1505 const bfd_arch_info_type
*arch
;
1508 /* IEEE does not specify the format of the processor identificaton
1509 string, so the compiler is free to put in it whatever it wants.
1510 We try here to recognize different processors belonging to the
1511 m68k family. Code for other processors can be added here. */
1512 if ((processor
[0] == '6') && (processor
[1] == '8'))
1514 if (processor
[2] == '3') /* 683xx integrated processors */
1516 switch (processor
[3])
1518 case '0': /* 68302, 68306, 68307 */
1519 case '2': /* 68322, 68328 */
1520 case '5': /* 68356 */
1521 strcpy (family
, "68000"); /* MC68000-based controllers */
1524 case '3': /* 68330, 68331, 68332, 68333,
1525 68334, 68335, 68336, 68338 */
1526 case '6': /* 68360 */
1527 case '7': /* 68376 */
1528 strcpy (family
, "68332"); /* CPU32 and CPU32+ */
1532 if (processor
[4] == '9') /* 68349 */
1533 strcpy (family
, "68030"); /* CPU030 */
1534 else /* 68340, 68341 */
1535 strcpy (family
, "68332"); /* CPU32 and CPU32+ */
1538 default: /* Does not exist yet */
1539 strcpy (family
, "68332"); /* Guess it will be CPU32 */
1542 else if (toupper (processor
[3]) == 'F') /* 68F333 */
1543 strcpy (family
, "68332"); /* CPU32 */
1544 else if ((toupper (processor
[3]) == 'C') /* Embedded controllers */
1545 && ((toupper (processor
[2]) == 'E')
1546 || (toupper (processor
[2]) == 'H')
1547 || (toupper (processor
[2]) == 'L')))
1549 strcpy (family
, "68");
1550 strncat (family
, processor
+ 4, 7);
1553 else /* "Regular" processors */
1555 strncpy (family
, processor
, 9);
1559 else if ((strncmp (processor
, "cpu32", 5) == 0) /* CPU32 and CPU32+ */
1560 || (strncmp (processor
, "CPU32", 5) == 0))
1561 strcpy (family
, "68332");
1564 strncpy (family
, processor
, 9);
1568 arch
= bfd_scan_arch (family
);
1570 goto got_wrong_format
;
1571 abfd
->arch_info
= arch
;
1574 if (this_byte (&(ieee
->h
)) != (int) ieee_address_descriptor_enum
)
1578 next_byte (&(ieee
->h
));
1580 if (parse_int (&(ieee
->h
), &ieee
->ad
.number_of_bits_mau
) == false)
1584 if (parse_int (&(ieee
->h
), &ieee
->ad
.number_of_maus_in_address
) == false)
1589 /* If there is a byte order info, take it */
1590 if (this_byte (&(ieee
->h
)) == (int) ieee_variable_L_enum
||
1591 this_byte (&(ieee
->h
)) == (int) ieee_variable_M_enum
)
1592 next_byte (&(ieee
->h
));
1594 for (part
= 0; part
< N_W_VARIABLES
; part
++)
1597 if (read_2bytes (&(ieee
->h
)) != (int) ieee_assign_value_to_variable_enum
)
1601 if (this_byte_and_next (&(ieee
->h
)) != part
)
1606 ieee
->w
.offset
[part
] = parse_i (&(ieee
->h
), &ok
);
1614 if (ieee
->w
.r
.external_part
!= 0)
1615 abfd
->flags
= HAS_SYMS
;
1617 /* By now we know that this is a real IEEE file, we're going to read
1618 the whole thing into memory so that we can run up and down it
1619 quickly. We can work out how big the file is from the trailer
1622 IEEE_DATA (abfd
)->h
.first_byte
=
1623 (unsigned char *) bfd_alloc (ieee
->h
.abfd
, ieee
->w
.r
.me_record
+ 1);
1624 if (!IEEE_DATA (abfd
)->h
.first_byte
)
1626 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1628 /* FIXME: Check return value. I'm not sure whether it needs to read
1629 the entire buffer or not. */
1630 bfd_read ((PTR
) (IEEE_DATA (abfd
)->h
.first_byte
), 1,
1631 ieee
->w
.r
.me_record
+ 1, abfd
);
1633 ieee_slurp_sections (abfd
);
1635 if (! ieee_slurp_debug (abfd
))
1638 /* Parse section data to activate file and section flags implied by
1639 section contents. */
1641 if (! ieee_slurp_section_data (abfd
))
1646 bfd_set_error (bfd_error_wrong_format
);
1648 (void) bfd_release (abfd
, ieee
);
1649 abfd
->tdata
.ieee_data
= save
;
1650 return (const bfd_target
*) NULL
;
1654 ieee_get_symbol_info (ignore_abfd
, symbol
, ret
)
1655 bfd
*ignore_abfd ATTRIBUTE_UNUSED
;
1659 bfd_symbol_info (symbol
, ret
);
1660 if (symbol
->name
[0] == ' ')
1661 ret
->name
= "* empty table entry ";
1662 if (!symbol
->section
)
1663 ret
->type
= (symbol
->flags
& BSF_LOCAL
) ? 'a' : 'A';
1667 ieee_print_symbol (ignore_abfd
, afile
, symbol
, how
)
1668 bfd
*ignore_abfd ATTRIBUTE_UNUSED
;
1671 bfd_print_symbol_type how
;
1673 FILE *file
= (FILE *) afile
;
1677 case bfd_print_symbol_name
:
1678 fprintf (file
, "%s", symbol
->name
);
1680 case bfd_print_symbol_more
:
1682 fprintf (file
, "%4x %2x", aout_symbol (symbol
)->desc
& 0xffff,
1683 aout_symbol (symbol
)->other
& 0xff);
1687 case bfd_print_symbol_all
:
1689 const char *section_name
=
1690 (symbol
->section
== (asection
*) NULL
1692 : symbol
->section
->name
);
1693 if (symbol
->name
[0] == ' ')
1695 fprintf (file
, "* empty table entry ");
1699 bfd_print_symbol_vandf ((PTR
) file
, symbol
);
1701 fprintf (file
, " %-5s %04x %02x %s",
1703 (unsigned) ieee_symbol (symbol
)->index
,
1713 do_one (ieee
, current_map
, location_ptr
, s
, iterations
)
1714 ieee_data_type
*ieee
;
1715 ieee_per_section_type
*current_map
;
1716 unsigned char *location_ptr
;
1720 switch (this_byte (&(ieee
->h
)))
1722 case ieee_load_constant_bytes_enum
:
1724 unsigned int number_of_maus
;
1726 next_byte (&(ieee
->h
));
1727 number_of_maus
= must_parse_int (&(ieee
->h
));
1729 for (i
= 0; i
< number_of_maus
; i
++)
1731 location_ptr
[current_map
->pc
++] = this_byte (&(ieee
->h
));
1732 next_byte (&(ieee
->h
));
1737 case ieee_load_with_relocation_enum
:
1739 boolean loop
= true;
1740 next_byte (&(ieee
->h
));
1743 switch (this_byte (&(ieee
->h
)))
1745 case ieee_variable_R_enum
:
1747 case ieee_function_signed_open_b_enum
:
1748 case ieee_function_unsigned_open_b_enum
:
1749 case ieee_function_either_open_b_enum
:
1751 unsigned int extra
= 4;
1752 boolean pcrel
= false;
1754 ieee_reloc_type
*r
=
1755 (ieee_reloc_type
*) bfd_alloc (ieee
->h
.abfd
,
1756 sizeof (ieee_reloc_type
));
1760 *(current_map
->reloc_tail_ptr
) = r
;
1761 current_map
->reloc_tail_ptr
= &r
->next
;
1762 r
->next
= (ieee_reloc_type
*) NULL
;
1763 next_byte (&(ieee
->h
));
1765 r
->relent
.sym_ptr_ptr
= 0;
1766 parse_expression (ieee
,
1769 &pcrel
, &extra
, §ion
);
1770 r
->relent
.address
= current_map
->pc
;
1771 s
->flags
|= SEC_RELOC
;
1772 s
->owner
->flags
|= HAS_RELOC
;
1774 if (r
->relent
.sym_ptr_ptr
== NULL
&& section
!= NULL
)
1775 r
->relent
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
1777 if (this_byte (&(ieee
->h
)) == (int) ieee_comma
)
1779 next_byte (&(ieee
->h
));
1780 /* Fetch number of bytes to pad */
1781 extra
= must_parse_int (&(ieee
->h
));
1784 switch (this_byte (&(ieee
->h
)))
1786 case ieee_function_signed_close_b_enum
:
1787 next_byte (&(ieee
->h
));
1789 case ieee_function_unsigned_close_b_enum
:
1790 next_byte (&(ieee
->h
));
1792 case ieee_function_either_close_b_enum
:
1793 next_byte (&(ieee
->h
));
1798 /* Build a relocation entry for this type */
1799 /* If pc rel then stick -ve pc into instruction
1800 and take out of reloc ..
1802 I've changed this. It's all too complicated. I
1803 keep 0 in the instruction now. */
1812 #if KEEPMINUSPCININST
1813 bfd_put_32 (ieee
->h
.abfd
, -current_map
->pc
, location_ptr
+
1815 r
->relent
.howto
= &rel32_howto
;
1819 bfd_put_32 (ieee
->h
.abfd
, 0, location_ptr
+
1821 r
->relent
.howto
= &rel32_howto
;
1826 bfd_put_32 (ieee
->h
.abfd
, 0, location_ptr
+
1828 r
->relent
.howto
= &abs32_howto
;
1830 current_map
->pc
+= 4;
1835 #if KEEPMINUSPCININST
1836 bfd_put_16 (ieee
->h
.abfd
, (int) (-current_map
->pc
), location_ptr
+ current_map
->pc
);
1837 r
->relent
.addend
-= current_map
->pc
;
1838 r
->relent
.howto
= &rel16_howto
;
1841 bfd_put_16 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1842 r
->relent
.howto
= &rel16_howto
;
1848 bfd_put_16 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1849 r
->relent
.howto
= &abs16_howto
;
1851 current_map
->pc
+= 2;
1856 #if KEEPMINUSPCININST
1857 bfd_put_8 (ieee
->h
.abfd
, (int) (-current_map
->pc
), location_ptr
+ current_map
->pc
);
1858 r
->relent
.addend
-= current_map
->pc
;
1859 r
->relent
.howto
= &rel8_howto
;
1861 bfd_put_8 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1862 r
->relent
.howto
= &rel8_howto
;
1867 bfd_put_8 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1868 r
->relent
.howto
= &abs8_howto
;
1870 current_map
->pc
+= 1;
1882 if (parse_int (&(ieee
->h
), &this_size
) == true)
1885 for (i
= 0; i
< this_size
; i
++)
1887 location_ptr
[current_map
->pc
++] = this_byte (&(ieee
->h
));
1888 next_byte (&(ieee
->h
));
1898 /* Prevent more than the first load-item of an LR record
1899 from being repeated (MRI convention). */
1900 if (iterations
!= 1)
1908 /* Read in all the section data and relocation stuff too */
1910 ieee_slurp_section_data (abfd
)
1913 bfd_byte
*location_ptr
= (bfd_byte
*) NULL
;
1914 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1915 unsigned int section_number
;
1917 ieee_per_section_type
*current_map
= (ieee_per_section_type
*) NULL
;
1919 /* Seek to the start of the data area */
1920 if (ieee
->read_data
== true)
1922 ieee
->read_data
= true;
1923 ieee_seek (abfd
, ieee
->w
.r
.data_part
);
1925 /* Allocate enough space for all the section contents */
1927 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
1929 ieee_per_section_type
*per
= (ieee_per_section_type
*) s
->used_by_bfd
;
1930 if ((s
->flags
& SEC_DEBUGGING
) != 0)
1932 per
->data
= (bfd_byte
*) bfd_alloc (ieee
->h
.abfd
, s
->_raw_size
);
1936 per
->reloc_tail_ptr
=
1937 (ieee_reloc_type
**) & (s
->relocation
);
1942 switch (this_byte (&(ieee
->h
)))
1944 /* IF we see anything strange then quit */
1948 case ieee_set_current_section_enum
:
1949 next_byte (&(ieee
->h
));
1950 section_number
= must_parse_int (&(ieee
->h
));
1951 s
= ieee
->section_table
[section_number
];
1952 s
->flags
|= SEC_LOAD
| SEC_HAS_CONTENTS
;
1953 current_map
= (ieee_per_section_type
*) s
->used_by_bfd
;
1954 location_ptr
= current_map
->data
- s
->vma
;
1955 /* The document I have says that Microtec's compilers reset */
1956 /* this after a sec section, even though the standard says not */
1958 current_map
->pc
= s
->vma
;
1961 case ieee_e2_first_byte_enum
:
1962 next_byte (&(ieee
->h
));
1963 switch (this_byte (&(ieee
->h
)))
1965 case ieee_set_current_pc_enum
& 0xff:
1968 ieee_symbol_index_type symbol
;
1971 next_byte (&(ieee
->h
));
1972 must_parse_int (&(ieee
->h
)); /* Thow away section #*/
1973 parse_expression (ieee
, &value
,
1977 current_map
->pc
= value
;
1978 BFD_ASSERT ((unsigned) (value
- s
->vma
) <= s
->_raw_size
);
1982 case ieee_value_starting_address_enum
& 0xff:
1983 next_byte (&(ieee
->h
));
1984 if (this_byte (&(ieee
->h
)) == ieee_function_either_open_b_enum
)
1985 next_byte (&(ieee
->h
));
1986 abfd
->start_address
= must_parse_int (&(ieee
->h
));
1987 /* We've got to the end of the data now - */
1994 case ieee_repeat_data_enum
:
1996 /* Repeat the following LD or LR n times - we do this by
1997 remembering the stream pointer before running it and
1998 resetting it and running it n times. We special case
1999 the repetition of a repeat_data/load_constant
2002 unsigned int iterations
;
2003 unsigned char *start
;
2004 next_byte (&(ieee
->h
));
2005 iterations
= must_parse_int (&(ieee
->h
));
2006 start
= ieee
->h
.input_p
;
2007 if (start
[0] == (int) ieee_load_constant_bytes_enum
&&
2010 while (iterations
!= 0)
2012 location_ptr
[current_map
->pc
++] = start
[2];
2015 next_byte (&(ieee
->h
));
2016 next_byte (&(ieee
->h
));
2017 next_byte (&(ieee
->h
));
2021 while (iterations
!= 0)
2023 ieee
->h
.input_p
= start
;
2024 if (!do_one (ieee
, current_map
, location_ptr
, s
,
2032 case ieee_load_constant_bytes_enum
:
2033 case ieee_load_with_relocation_enum
:
2035 if (!do_one (ieee
, current_map
, location_ptr
, s
, 1))
2043 ieee_new_section_hook (abfd
, newsect
)
2047 newsect
->used_by_bfd
= (PTR
)
2048 bfd_alloc (abfd
, sizeof (ieee_per_section_type
));
2049 if (!newsect
->used_by_bfd
)
2051 ieee_per_section (newsect
)->data
= (bfd_byte
*) NULL
;
2052 ieee_per_section (newsect
)->section
= newsect
;
2057 ieee_get_reloc_upper_bound (abfd
, asect
)
2061 if ((asect
->flags
& SEC_DEBUGGING
) != 0)
2063 if (! ieee_slurp_section_data (abfd
))
2065 return (asect
->reloc_count
+ 1) * sizeof (arelent
*);
2069 ieee_get_section_contents (abfd
, section
, location
, offset
, count
)
2074 bfd_size_type count
;
2076 ieee_per_section_type
*p
= (ieee_per_section_type
*) section
->used_by_bfd
;
2077 if ((section
->flags
& SEC_DEBUGGING
) != 0)
2078 return _bfd_generic_get_section_contents (abfd
, section
, location
,
2080 ieee_slurp_section_data (abfd
);
2081 (void) memcpy ((PTR
) location
, (PTR
) (p
->data
+ offset
), (unsigned) count
);
2086 ieee_canonicalize_reloc (abfd
, section
, relptr
, symbols
)
2092 /* ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;*/
2093 ieee_reloc_type
*src
= (ieee_reloc_type
*) (section
->relocation
);
2094 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
2096 if ((section
->flags
& SEC_DEBUGGING
) != 0)
2099 while (src
!= (ieee_reloc_type
*) NULL
)
2101 /* Work out which symbol to attach it this reloc to */
2102 switch (src
->symbol
.letter
)
2105 src
->relent
.sym_ptr_ptr
=
2106 symbols
+ src
->symbol
.index
+ ieee
->external_symbol_base_offset
;
2109 src
->relent
.sym_ptr_ptr
=
2110 symbols
+ src
->symbol
.index
+ ieee
->external_reference_base_offset
;
2113 if (src
->relent
.sym_ptr_ptr
!= NULL
)
2114 src
->relent
.sym_ptr_ptr
=
2115 src
->relent
.sym_ptr_ptr
[0]->section
->symbol_ptr_ptr
;
2121 *relptr
++ = &src
->relent
;
2124 *relptr
= (arelent
*) NULL
;
2125 return section
->reloc_count
;
2133 arelent
*a
= *((arelent
**) ap
);
2134 arelent
*b
= *((arelent
**) bp
);
2135 return a
->address
- b
->address
;
2138 /* Write the section headers. */
2141 ieee_write_section_part (abfd
)
2144 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
2146 ieee
->w
.r
.section_part
= bfd_tell (abfd
);
2147 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
2149 if (! bfd_is_abs_section (s
)
2150 && (s
->flags
& SEC_DEBUGGING
) == 0)
2152 if (! ieee_write_byte (abfd
, ieee_section_type_enum
)
2153 || ! ieee_write_byte (abfd
,
2154 (bfd_byte
) (s
->index
2155 + IEEE_SECTION_NUMBER_BASE
)))
2158 if (abfd
->flags
& EXEC_P
)
2160 /* This image is executable, so output absolute sections */
2161 if (! ieee_write_byte (abfd
, ieee_variable_A_enum
)
2162 || ! ieee_write_byte (abfd
, ieee_variable_S_enum
))
2167 if (! ieee_write_byte (abfd
, ieee_variable_C_enum
))
2171 switch (s
->flags
& (SEC_CODE
| SEC_DATA
| SEC_ROM
))
2173 case SEC_CODE
| SEC_LOAD
:
2175 if (! ieee_write_byte (abfd
, ieee_variable_P_enum
))
2180 if (! ieee_write_byte (abfd
, ieee_variable_D_enum
))
2184 case SEC_ROM
| SEC_DATA
:
2185 case SEC_ROM
| SEC_LOAD
:
2186 case SEC_ROM
| SEC_DATA
| SEC_LOAD
:
2187 if (! ieee_write_byte (abfd
, ieee_variable_R_enum
))
2192 if (! ieee_write_id (abfd
, s
->name
))
2195 ieee_write_int (abfd
, 0); /* Parent */
2196 ieee_write_int (abfd
, 0); /* Brother */
2197 ieee_write_int (abfd
, 0); /* Context */
2200 if (! ieee_write_byte (abfd
, ieee_section_alignment_enum
)
2201 || ! ieee_write_byte (abfd
,
2202 (bfd_byte
) (s
->index
2203 + IEEE_SECTION_NUMBER_BASE
))
2204 || ! ieee_write_int (abfd
, 1 << s
->alignment_power
))
2208 if (! ieee_write_2bytes (abfd
, ieee_section_size_enum
)
2209 || ! ieee_write_byte (abfd
,
2210 (bfd_byte
) (s
->index
2211 + IEEE_SECTION_NUMBER_BASE
))
2212 || ! ieee_write_int (abfd
, s
->_raw_size
))
2214 if (abfd
->flags
& EXEC_P
)
2216 /* Relocateable sections don't have asl records */
2218 if (! ieee_write_2bytes (abfd
, ieee_section_base_address_enum
)
2219 || ! ieee_write_byte (abfd
,
2222 + IEEE_SECTION_NUMBER_BASE
)))
2223 || ! ieee_write_int (abfd
, s
->lma
))
2234 do_with_relocs (abfd
, s
)
2238 unsigned int number_of_maus_in_address
=
2239 bfd_arch_bits_per_address (abfd
) / bfd_arch_bits_per_byte (abfd
);
2240 unsigned int relocs_to_go
= s
->reloc_count
;
2241 bfd_byte
*stream
= ieee_per_section (s
)->data
;
2242 arelent
**p
= s
->orelocation
;
2243 bfd_size_type current_byte_index
= 0;
2245 qsort (s
->orelocation
,
2247 sizeof (arelent
**),
2250 /* Output the section preheader */
2251 if (! ieee_write_byte (abfd
, ieee_set_current_section_enum
)
2252 || ! ieee_write_byte (abfd
,
2253 (bfd_byte
) (s
->index
+ IEEE_SECTION_NUMBER_BASE
))
2254 || ! ieee_write_2bytes (abfd
, ieee_set_current_pc_enum
)
2255 || ! ieee_write_byte (abfd
,
2256 (bfd_byte
) (s
->index
+ IEEE_SECTION_NUMBER_BASE
)))
2258 if ((abfd
->flags
& EXEC_P
) != 0 && relocs_to_go
== 0)
2260 if (! ieee_write_int (abfd
, s
->lma
))
2265 if (! ieee_write_expression (abfd
, 0, s
->symbol
, 0, 0))
2269 if (relocs_to_go
== 0)
2271 /* If there aren't any relocations then output the load constant
2272 byte opcode rather than the load with relocation opcode */
2274 while (current_byte_index
< s
->_raw_size
)
2277 unsigned int MAXRUN
= 127;
2279 if (run
> s
->_raw_size
- current_byte_index
)
2281 run
= s
->_raw_size
- current_byte_index
;
2286 if (! ieee_write_byte (abfd
, ieee_load_constant_bytes_enum
))
2288 /* Output a stream of bytes */
2289 if (! ieee_write_int (abfd
, run
))
2291 if (bfd_write ((PTR
) (stream
+ current_byte_index
),
2297 current_byte_index
+= run
;
2303 if (! ieee_write_byte (abfd
, ieee_load_with_relocation_enum
))
2306 /* Output the data stream as the longest sequence of bytes
2307 possible, allowing for the a reasonable packet size and
2308 relocation stuffs. */
2310 if ((PTR
) stream
== (PTR
) NULL
)
2312 /* Outputting a section without data, fill it up */
2313 stream
= (unsigned char *) (bfd_alloc (abfd
, s
->_raw_size
));
2316 memset ((PTR
) stream
, 0, (size_t) s
->_raw_size
);
2318 while (current_byte_index
< s
->_raw_size
)
2321 unsigned int MAXRUN
= 127;
2324 run
= (*p
)->address
- current_byte_index
;
2332 if (run
> s
->_raw_size
- current_byte_index
)
2334 run
= s
->_raw_size
- current_byte_index
;
2339 /* Output a stream of bytes */
2340 if (! ieee_write_int (abfd
, run
))
2342 if (bfd_write ((PTR
) (stream
+ current_byte_index
),
2348 current_byte_index
+= run
;
2350 /* Output any relocations here */
2351 if (relocs_to_go
&& (*p
) && (*p
)->address
== current_byte_index
)
2354 && (*p
) && (*p
)->address
== current_byte_index
)
2360 if (r
->howto
->pc_relative
)
2362 r
->addend
+= current_byte_index
;
2366 switch (r
->howto
->size
)
2370 ov
= bfd_get_signed_32 (abfd
,
2371 stream
+ current_byte_index
);
2372 current_byte_index
+= 4;
2375 ov
= bfd_get_signed_16 (abfd
,
2376 stream
+ current_byte_index
);
2377 current_byte_index
+= 2;
2380 ov
= bfd_get_signed_8 (abfd
,
2381 stream
+ current_byte_index
);
2382 current_byte_index
++;
2390 ov
&= r
->howto
->src_mask
;
2392 if (r
->howto
->pc_relative
2393 && ! r
->howto
->pcrel_offset
)
2396 if (! ieee_write_byte (abfd
,
2397 ieee_function_either_open_b_enum
))
2402 if (r
->sym_ptr_ptr
!= (asymbol
**) NULL
)
2404 if (! ieee_write_expression (abfd
, r
->addend
+ ov
,
2406 r
->howto
->pc_relative
,
2412 if (! ieee_write_expression (abfd
, r
->addend
+ ov
,
2414 r
->howto
->pc_relative
,
2419 if (number_of_maus_in_address
2420 != bfd_get_reloc_size (r
->howto
))
2422 if (! ieee_write_int (abfd
,
2423 bfd_get_reloc_size (r
->howto
)))
2426 if (! ieee_write_byte (abfd
,
2427 ieee_function_either_close_b_enum
))
2441 /* If there are no relocations in the output section then we can be
2442 clever about how we write. We block items up into a max of 127
2446 do_as_repeat (abfd
, s
)
2452 if (! ieee_write_byte (abfd
, ieee_set_current_section_enum
)
2453 || ! ieee_write_byte (abfd
,
2454 (bfd_byte
) (s
->index
2455 + IEEE_SECTION_NUMBER_BASE
))
2456 || ! ieee_write_byte (abfd
, ieee_set_current_pc_enum
>> 8)
2457 || ! ieee_write_byte (abfd
, ieee_set_current_pc_enum
& 0xff)
2458 || ! ieee_write_byte (abfd
,
2459 (bfd_byte
) (s
->index
2460 + IEEE_SECTION_NUMBER_BASE
))
2461 || ! ieee_write_int (abfd
, s
->lma
)
2462 || ! ieee_write_byte (abfd
, ieee_repeat_data_enum
)
2463 || ! ieee_write_int (abfd
, s
->_raw_size
)
2464 || ! ieee_write_byte (abfd
, ieee_load_constant_bytes_enum
)
2465 || ! ieee_write_byte (abfd
, 1)
2466 || ! ieee_write_byte (abfd
, 0))
2474 do_without_relocs (abfd
, s
)
2478 bfd_byte
*stream
= ieee_per_section (s
)->data
;
2480 if (stream
== 0 || ((s
->flags
& SEC_LOAD
) == 0))
2482 if (! do_as_repeat (abfd
, s
))
2488 for (i
= 0; i
< s
->_raw_size
; i
++)
2492 if (! do_with_relocs (abfd
, s
))
2497 if (! do_as_repeat (abfd
, s
))
2505 static unsigned char *output_ptr_start
;
2506 static unsigned char *output_ptr
;
2507 static unsigned char *output_ptr_end
;
2508 static unsigned char *input_ptr_start
;
2509 static unsigned char *input_ptr
;
2510 static unsigned char *input_ptr_end
;
2511 static bfd
*input_bfd
;
2512 static bfd
*output_bfd
;
2513 static int output_buffer
;
2518 /* FIXME: Check return value. I'm not sure whether it needs to read
2519 the entire buffer or not. */
2520 bfd_read ((PTR
) input_ptr_start
, 1, input_ptr_end
- input_ptr_start
, input_bfd
);
2521 input_ptr
= input_ptr_start
;
2526 if (bfd_write ((PTR
) (output_ptr_start
), 1, output_ptr
- output_ptr_start
,
2528 != (bfd_size_type
) (output_ptr
- output_ptr_start
))
2530 output_ptr
= output_ptr_start
;
2534 #define THIS() ( *input_ptr )
2535 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill(); }
2536 #define OUT(x) { *output_ptr++ = (x); if(output_ptr == output_ptr_end) flush(); }
2542 if (value
>= 0 && value
<= 127)
2548 unsigned int length
;
2549 /* How many significant bytes ? */
2550 /* FIXME FOR LONGER INTS */
2551 if (value
& 0xff000000)
2555 else if (value
& 0x00ff0000)
2559 else if (value
& 0x0000ff00)
2566 OUT ((int) ieee_number_repeat_start_enum
+ length
);
2585 int length
= THIS ();
2597 #define VAR(x) ((x | 0x80))
2612 value
= (value
<< 8) | THIS ();
2614 value
= (value
<< 8) | THIS ();
2616 value
= (value
<< 8) | THIS ();
2624 value
= (value
<< 8) | THIS ();
2626 value
= (value
<< 8) | THIS ();
2634 value
= (value
<< 8) | THIS ();
2651 /* Not a number, just bug out with the answer */
2652 write_int (*(--tos
));
2662 int value
= *(--tos
);
2671 ieee_data_type
*ieee
;
2674 section_number
= THIS ();
2677 ieee
= IEEE_DATA (input_bfd
);
2678 s
= ieee
->section_table
[section_number
];
2679 if (s
->output_section
)
2681 value
= s
->output_section
->lma
;
2687 value
+= s
->output_offset
;
2695 write_int (*(--tos
));
2705 /* Drop the int in the buffer, and copy a null into the gap, which we
2706 will overwrite later */
2708 struct output_buffer_struct
2710 unsigned char *ptrp
;
2716 struct output_buffer_struct
*buf
;
2718 if (buf
->buffer
== output_buffer
)
2720 /* Still a chance to output the size */
2721 int value
= output_ptr
- buf
->ptrp
+ 3;
2722 buf
->ptrp
[0] = value
>> 24;
2723 buf
->ptrp
[1] = value
>> 16;
2724 buf
->ptrp
[2] = value
>> 8;
2725 buf
->ptrp
[3] = value
>> 0;
2731 struct output_buffer_struct
*buf
;
2757 buf
->ptrp
= output_ptr
;
2758 buf
->buffer
= output_buffer
;
2798 #define ID copy_id()
2799 #define INT copy_int()
2800 #define EXP copy_expression()
2801 static void copy_till_end ();
2802 #define INTn(q) copy_int()
2803 #define EXPn(q) copy_expression()
2842 EXPn (instruction address
);
2876 EXPn (external function
);
2886 INTn (locked
register);
2909 /* Attribute record */
2967 static void block ();
2979 /* Unique typedefs for module */
2980 /* GLobal typedefs */
2981 /* High level module scope beginning */
2983 struct output_buffer_struct ob
;
2998 /* Global function */
3000 struct output_buffer_struct ob
;
3014 EXPn (size of block
);
3020 /* File name for source line numbers */
3022 struct output_buffer_struct ob
;
3042 /* Local function */
3044 struct output_buffer_struct ob
;
3062 /* Assembler module scope beginning -*/
3064 struct output_buffer_struct ob
;
3090 struct output_buffer_struct ob
;
3097 INTn (section index
);
3105 EXPn (Size in Maus
);
3160 moves all the debug information from the source bfd to the output
3161 bfd, and relocates any expressions it finds
3165 relocate_debug (output
, input
)
3166 bfd
*output ATTRIBUTE_UNUSED
;
3171 unsigned char input_buffer
[IBS
];
3173 input_ptr_start
= input_ptr
= input_buffer
;
3174 input_ptr_end
= input_buffer
+ IBS
;
3176 /* FIXME: Check return value. I'm not sure whether it needs to read
3177 the entire buffer or not. */
3178 bfd_read ((PTR
) input_ptr_start
, 1, IBS
, input
);
3183 During linking, we we told about the bfds which made up our
3184 contents, we have a list of them. They will still be open, so go to
3185 the debug info in each, and copy it out, relocating it as we go.
3189 ieee_write_debug_part (abfd
)
3192 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3193 bfd_chain_type
*chain
= ieee
->chain_root
;
3194 unsigned char output_buffer
[OBS
];
3195 boolean some_debug
= false;
3196 file_ptr here
= bfd_tell (abfd
);
3198 output_ptr_start
= output_ptr
= output_buffer
;
3199 output_ptr_end
= output_buffer
+ OBS
;
3200 output_ptr
= output_buffer
;
3203 if (chain
== (bfd_chain_type
*) NULL
)
3207 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
3208 if ((s
->flags
& SEC_DEBUGGING
) != 0)
3212 ieee
->w
.r
.debug_information_part
= 0;
3216 ieee
->w
.r
.debug_information_part
= here
;
3217 if (bfd_write (s
->contents
, 1, s
->_raw_size
, abfd
) != s
->_raw_size
)
3222 while (chain
!= (bfd_chain_type
*) NULL
)
3224 bfd
*entry
= chain
->this;
3225 ieee_data_type
*entry_ieee
= IEEE_DATA (entry
);
3226 if (entry_ieee
->w
.r
.debug_information_part
)
3228 if (bfd_seek (entry
, entry_ieee
->w
.r
.debug_information_part
,
3232 relocate_debug (abfd
, entry
);
3235 chain
= chain
->next
;
3239 ieee
->w
.r
.debug_information_part
= here
;
3243 ieee
->w
.r
.debug_information_part
= 0;
3252 /* Write the data in an ieee way. */
3255 ieee_write_data_part (abfd
)
3259 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3260 ieee
->w
.r
.data_part
= bfd_tell (abfd
);
3261 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
3263 /* Skip sections that have no loadable contents (.bss,
3265 if ((s
->flags
& SEC_LOAD
) == 0)
3268 /* Sort the reloc records so we can insert them in the correct
3270 if (s
->reloc_count
!= 0)
3272 if (! do_with_relocs (abfd
, s
))
3277 if (! do_without_relocs (abfd
, s
))
3287 init_for_output (abfd
)
3291 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
3293 if ((s
->flags
& SEC_DEBUGGING
) != 0)
3295 if (s
->_raw_size
!= 0)
3297 ieee_per_section (s
)->data
= (bfd_byte
*) (bfd_alloc (abfd
, s
->_raw_size
));
3298 if (!ieee_per_section (s
)->data
)
3305 /** exec and core file sections */
3307 /* set section contents is complicated with IEEE since the format is
3308 * not a byte image, but a record stream.
3311 ieee_set_section_contents (abfd
, section
, location
, offset
, count
)
3316 bfd_size_type count
;
3318 if ((section
->flags
& SEC_DEBUGGING
) != 0)
3320 if (section
->contents
== NULL
)
3322 section
->contents
= ((unsigned char *)
3323 bfd_alloc (abfd
, section
->_raw_size
));
3324 if (section
->contents
== NULL
)
3327 /* bfd_set_section_contents has already checked that everything
3329 memcpy (section
->contents
+ offset
, location
, count
);
3333 if (ieee_per_section (section
)->data
== (bfd_byte
*) NULL
)
3335 if (!init_for_output (abfd
))
3338 memcpy ((PTR
) (ieee_per_section (section
)->data
+ offset
),
3340 (unsigned int) count
);
3344 /* Write the external symbols of a file. IEEE considers two sorts of
3345 external symbols, public, and referenced. It uses to internal
3346 forms to index them as well. When we write them out we turn their
3347 symbol values into indexes from the right base. */
3350 ieee_write_external_part (abfd
)
3354 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3356 unsigned int reference_index
= IEEE_REFERENCE_BASE
;
3357 unsigned int public_index
= IEEE_PUBLIC_BASE
+ 2;
3358 file_ptr here
= bfd_tell (abfd
);
3359 boolean hadone
= false;
3360 if (abfd
->outsymbols
!= (asymbol
**) NULL
)
3363 for (q
= abfd
->outsymbols
; *q
!= (asymbol
*) NULL
; q
++)
3366 if (bfd_is_und_section (p
->section
))
3368 /* This must be a symbol reference .. */
3369 if (! ieee_write_byte (abfd
, ieee_external_reference_enum
)
3370 || ! ieee_write_int (abfd
, reference_index
)
3371 || ! ieee_write_id (abfd
, p
->name
))
3373 p
->value
= reference_index
;
3377 else if (bfd_is_com_section (p
->section
))
3379 /* This is a weak reference */
3380 if (! ieee_write_byte (abfd
, ieee_external_reference_enum
)
3381 || ! ieee_write_int (abfd
, reference_index
)
3382 || ! ieee_write_id (abfd
, p
->name
)
3383 || ! ieee_write_byte (abfd
,
3384 ieee_weak_external_reference_enum
)
3385 || ! ieee_write_int (abfd
, reference_index
)
3386 || ! ieee_write_int (abfd
, p
->value
))
3388 p
->value
= reference_index
;
3392 else if (p
->flags
& BSF_GLOBAL
)
3394 /* This must be a symbol definition */
3396 if (! ieee_write_byte (abfd
, ieee_external_symbol_enum
)
3397 || ! ieee_write_int (abfd
, public_index
)
3398 || ! ieee_write_id (abfd
, p
->name
)
3399 || ! ieee_write_2bytes (abfd
, ieee_attribute_record_enum
)
3400 || ! ieee_write_int (abfd
, public_index
)
3401 || ! ieee_write_byte (abfd
, 15) /* instruction address */
3402 || ! ieee_write_byte (abfd
, 19) /* static symbol */
3403 || ! ieee_write_byte (abfd
, 1)) /* one of them */
3406 /* Write out the value */
3407 if (! ieee_write_2bytes (abfd
, ieee_value_record_enum
)
3408 || ! ieee_write_int (abfd
, public_index
))
3410 if (! bfd_is_abs_section (p
->section
))
3412 if (abfd
->flags
& EXEC_P
)
3414 /* If fully linked, then output all symbols
3416 if (! (ieee_write_int
3419 + p
->section
->output_offset
3420 + p
->section
->output_section
->vma
))))
3425 if (! (ieee_write_expression
3427 p
->value
+ p
->section
->output_offset
,
3428 p
->section
->output_section
->symbol
,
3435 if (! ieee_write_expression (abfd
,
3437 bfd_abs_section_ptr
->symbol
,
3441 p
->value
= public_index
;
3447 /* This can happen - when there are gaps in the symbols read */
3448 /* from an input ieee file */
3453 ieee
->w
.r
.external_part
= here
;
3459 static CONST
unsigned char exten
[] =
3462 0xf1, 0xce, 0x20, 0x00, 37, 3, 3, /* Set version 3 rev 3 */
3463 0xf1, 0xce, 0x20, 0x00, 39, 2,/* keep symbol in original case */
3464 0xf1, 0xce, 0x20, 0x00, 38 /* set object type relocateable to x */
3467 static CONST
unsigned char envi
[] =
3471 /* 0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
3474 0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok */
3476 0xf1, 0xce, 0x21, 0, 53, 0x03,/* host unix */
3477 /* 0xf1, 0xce, 0x21, 0, 54, 2,1,1 tool & version # */
3481 ieee_write_me_part (abfd
)
3484 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3485 ieee
->w
.r
.trailer_part
= bfd_tell (abfd
);
3486 if (abfd
->start_address
)
3488 if (! ieee_write_2bytes (abfd
, ieee_value_starting_address_enum
)
3489 || ! ieee_write_byte (abfd
, ieee_function_either_open_b_enum
)
3490 || ! ieee_write_int (abfd
, abfd
->start_address
)
3491 || ! ieee_write_byte (abfd
, ieee_function_either_close_b_enum
))
3494 ieee
->w
.r
.me_record
= bfd_tell (abfd
);
3495 if (! ieee_write_byte (abfd
, ieee_module_end_enum
))
3500 /* Write out the IEEE processor ID. */
3503 ieee_write_processor (abfd
)
3506 const bfd_arch_info_type
*arch
;
3508 arch
= bfd_get_arch_info (abfd
);
3512 if (! ieee_write_id (abfd
, bfd_printable_name (abfd
)))
3517 if (! ieee_write_id (abfd
, "29000"))
3521 case bfd_arch_h8300
:
3522 if (! ieee_write_id (abfd
, "H8/300"))
3526 case bfd_arch_h8500
:
3527 if (! ieee_write_id (abfd
, "H8/500"))
3535 case bfd_mach_i960_core
:
3536 case bfd_mach_i960_ka_sa
:
3537 if (! ieee_write_id (abfd
, "80960KA"))
3541 case bfd_mach_i960_kb_sb
:
3542 if (! ieee_write_id (abfd
, "80960KB"))
3546 case bfd_mach_i960_ca
:
3547 if (! ieee_write_id (abfd
, "80960CA"))
3551 case bfd_mach_i960_mc
:
3552 case bfd_mach_i960_xa
:
3553 if (! ieee_write_id (abfd
, "80960MC"))
3565 default: id
= "68020"; break;
3566 case bfd_mach_m68000
: id
= "68000"; break;
3567 case bfd_mach_m68008
: id
= "68008"; break;
3568 case bfd_mach_m68010
: id
= "68010"; break;
3569 case bfd_mach_m68020
: id
= "68020"; break;
3570 case bfd_mach_m68030
: id
= "68030"; break;
3571 case bfd_mach_m68040
: id
= "68040"; break;
3572 case bfd_mach_m68060
: id
= "68060"; break;
3573 case bfd_mach_cpu32
: id
= "cpu32"; break;
3576 if (! ieee_write_id (abfd
, id
))
3586 ieee_write_object_contents (abfd
)
3589 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3593 /* Fast forward over the header area */
3594 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
3597 if (! ieee_write_byte (abfd
, ieee_module_beginning_enum
)
3598 || ! ieee_write_processor (abfd
)
3599 || ! ieee_write_id (abfd
, abfd
->filename
))
3602 /* Fast forward over the variable bits */
3603 if (! ieee_write_byte (abfd
, ieee_address_descriptor_enum
))
3607 if (! ieee_write_byte (abfd
, (bfd_byte
) (bfd_arch_bits_per_byte (abfd
))))
3609 /* MAU's per address */
3610 if (! ieee_write_byte (abfd
,
3611 (bfd_byte
) (bfd_arch_bits_per_address (abfd
)
3612 / bfd_arch_bits_per_byte (abfd
))))
3615 old
= bfd_tell (abfd
);
3616 if (bfd_seek (abfd
, (file_ptr
) (8 * N_W_VARIABLES
), SEEK_CUR
) != 0)
3619 ieee
->w
.r
.extension_record
= bfd_tell (abfd
);
3620 if (bfd_write ((char *) exten
, 1, sizeof (exten
), abfd
) != sizeof (exten
))
3622 if (abfd
->flags
& EXEC_P
)
3624 if (! ieee_write_byte (abfd
, 0x1)) /* Absolute */
3629 if (! ieee_write_byte (abfd
, 0x2)) /* Relocateable */
3633 ieee
->w
.r
.environmental_record
= bfd_tell (abfd
);
3634 if (bfd_write ((char *) envi
, 1, sizeof (envi
), abfd
) != sizeof (envi
))
3637 /* The HP emulator database requires a timestamp in the file. */
3643 t
= (struct tm
*) localtime (&now
);
3644 if (! ieee_write_2bytes (abfd
, (int) ieee_atn_record_enum
)
3645 || ! ieee_write_byte (abfd
, 0x21)
3646 || ! ieee_write_byte (abfd
, 0)
3647 || ! ieee_write_byte (abfd
, 50)
3648 || ! ieee_write_int (abfd
, t
->tm_year
+ 1900)
3649 || ! ieee_write_int (abfd
, t
->tm_mon
+ 1)
3650 || ! ieee_write_int (abfd
, t
->tm_mday
)
3651 || ! ieee_write_int (abfd
, t
->tm_hour
)
3652 || ! ieee_write_int (abfd
, t
->tm_min
)
3653 || ! ieee_write_int (abfd
, t
->tm_sec
))
3661 if (! ieee_write_section_part (abfd
))
3663 /* First write the symbols. This changes their values into table
3664 indeces so we cant use it after this point. */
3665 if (! ieee_write_external_part (abfd
))
3668 /* ieee_write_byte(abfd, ieee_record_seperator_enum);*/
3670 /* ieee_write_byte(abfd, ieee_record_seperator_enum);*/
3673 /* Write any debugs we have been told about. */
3674 if (! ieee_write_debug_part (abfd
))
3677 /* Can only write the data once the symbols have been written, since
3678 the data contains relocation information which points to the
3680 if (! ieee_write_data_part (abfd
))
3683 /* At the end we put the end! */
3684 if (! ieee_write_me_part (abfd
))
3687 /* Generate the header */
3688 if (bfd_seek (abfd
, old
, SEEK_SET
) != 0)
3691 for (i
= 0; i
< N_W_VARIABLES
; i
++)
3693 if (! ieee_write_2bytes (abfd
, ieee_assign_value_to_variable_enum
)
3694 || ! ieee_write_byte (abfd
, (bfd_byte
) i
)
3695 || ! ieee_write_int5_out (abfd
, ieee
->w
.offset
[i
]))
3702 /* Native-level interface to symbols. */
3704 /* We read the symbols into a buffer, which is discarded when this
3705 function exits. We read the strings into a buffer large enough to
3706 hold them all plus all the cached symbol entries. */
3709 ieee_make_empty_symbol (abfd
)
3712 ieee_symbol_type
*new =
3713 (ieee_symbol_type
*) bfd_zmalloc (sizeof (ieee_symbol_type
));
3716 new->symbol
.the_bfd
= abfd
;
3717 return &new->symbol
;
3721 ieee_openr_next_archived_file (arch
, prev
)
3725 ieee_ar_data_type
*ar
= IEEE_AR_DATA (arch
);
3726 /* take the next one from the arch state, or reset */
3727 if (prev
== (bfd
*) NULL
)
3729 /* Reset the index - the first two entries are bogus*/
3730 ar
->element_index
= 2;
3734 ieee_ar_obstack_type
*p
= ar
->elements
+ ar
->element_index
;
3735 ar
->element_index
++;
3736 if (ar
->element_index
<= ar
->element_count
)
3738 if (p
->file_offset
!= (file_ptr
) 0)
3740 if (p
->abfd
== (bfd
*) NULL
)
3742 p
->abfd
= _bfd_create_empty_archive_element_shell (arch
);
3743 p
->abfd
->origin
= p
->file_offset
;
3750 bfd_set_error (bfd_error_no_more_archived_files
);
3751 return (bfd
*) NULL
;
3758 ieee_find_nearest_line (abfd
,
3765 bfd
*abfd ATTRIBUTE_UNUSED
;
3766 asection
*section ATTRIBUTE_UNUSED
;
3767 asymbol
**symbols ATTRIBUTE_UNUSED
;
3768 bfd_vma offset ATTRIBUTE_UNUSED
;
3769 const char **filename_ptr ATTRIBUTE_UNUSED
;
3770 const char **functionname_ptr ATTRIBUTE_UNUSED
;
3771 unsigned int *line_ptr ATTRIBUTE_UNUSED
;
3777 ieee_generic_stat_arch_elt (abfd
, buf
)
3781 ieee_ar_data_type
*ar
= (ieee_ar_data_type
*) NULL
;
3782 ieee_data_type
*ieee
;
3784 if (abfd
->my_archive
!= NULL
)
3785 ar
= abfd
->my_archive
->tdata
.ieee_ar_data
;
3786 if (ar
== (ieee_ar_data_type
*) NULL
)
3788 bfd_set_error (bfd_error_invalid_operation
);
3792 if (IEEE_DATA (abfd
) == NULL
)
3794 if (ieee_object_p (abfd
) == NULL
)
3796 bfd_set_error (bfd_error_wrong_format
);
3801 ieee
= IEEE_DATA (abfd
);
3803 buf
->st_size
= ieee
->w
.r
.me_record
+ 1;
3804 buf
->st_mode
= 0644;
3809 ieee_sizeof_headers (abfd
, x
)
3810 bfd
*abfd ATTRIBUTE_UNUSED
;
3811 boolean x ATTRIBUTE_UNUSED
;
3817 /* The debug info routines are never used. */
3821 ieee_bfd_debug_info_start (abfd
)
3828 ieee_bfd_debug_info_end (abfd
)
3835 /* Add this section to the list of sections we have debug info for, to
3836 be ready to output it at close time
3839 ieee_bfd_debug_info_accumulate (abfd
, section
)
3843 ieee_data_type
*ieee
= IEEE_DATA (section
->owner
);
3844 ieee_data_type
*output_ieee
= IEEE_DATA (abfd
);
3845 /* can only accumulate data from other ieee bfds */
3846 if (section
->owner
->xvec
!= abfd
->xvec
)
3848 /* Only bother once per bfd */
3849 if (ieee
->done_debug
== true)
3851 ieee
->done_debug
= true;
3853 /* Don't bother if there is no debug info */
3854 if (ieee
->w
.r
.debug_information_part
== 0)
3860 bfd_chain_type
*n
= (bfd_chain_type
*) bfd_alloc (abfd
, sizeof (bfd_chain_type
));
3862 abort (); /* FIXME */
3863 n
->this = section
->owner
;
3864 n
->next
= (bfd_chain_type
*) NULL
;
3866 if (output_ieee
->chain_head
)
3868 output_ieee
->chain_head
->next
= n
;
3872 output_ieee
->chain_root
= n
;
3875 output_ieee
->chain_head
= n
;
3881 #define ieee_close_and_cleanup _bfd_generic_close_and_cleanup
3882 #define ieee_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
3884 #define ieee_slurp_armap bfd_true
3885 #define ieee_slurp_extended_name_table bfd_true
3886 #define ieee_construct_extended_name_table \
3887 ((boolean (*) PARAMS ((bfd *, char **, bfd_size_type *, const char **))) \
3889 #define ieee_truncate_arname bfd_dont_truncate_arname
3890 #define ieee_write_armap \
3892 PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int))) \
3894 #define ieee_read_ar_hdr bfd_nullvoidptr
3895 #define ieee_update_armap_timestamp bfd_true
3896 #define ieee_get_elt_at_index _bfd_generic_get_elt_at_index
3898 #define ieee_bfd_is_local_label_name bfd_generic_is_local_label_name
3899 #define ieee_get_lineno _bfd_nosymbols_get_lineno
3900 #define ieee_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
3901 #define ieee_read_minisymbols _bfd_generic_read_minisymbols
3902 #define ieee_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
3904 #define ieee_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
3906 #define ieee_set_arch_mach _bfd_generic_set_arch_mach
3908 #define ieee_get_section_contents_in_window \
3909 _bfd_generic_get_section_contents_in_window
3910 #define ieee_bfd_get_relocated_section_contents \
3911 bfd_generic_get_relocated_section_contents
3912 #define ieee_bfd_relax_section bfd_generic_relax_section
3913 #define ieee_bfd_gc_sections bfd_generic_gc_sections
3914 #define ieee_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
3915 #define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols
3916 #define ieee_bfd_final_link _bfd_generic_final_link
3917 #define ieee_bfd_link_split_section _bfd_generic_link_split_section
3920 const bfd_target ieee_vec
=
3923 bfd_target_ieee_flavour
,
3924 BFD_ENDIAN_UNKNOWN
, /* target byte order */
3925 BFD_ENDIAN_UNKNOWN
, /* target headers byte order */
3926 (HAS_RELOC
| EXEC_P
| /* object flags */
3927 HAS_LINENO
| HAS_DEBUG
|
3928 HAS_SYMS
| HAS_LOCALS
| WP_TEXT
| D_PAGED
),
3929 (SEC_CODE
| SEC_DATA
| SEC_ROM
| SEC_HAS_CONTENTS
3930 | SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
), /* section flags */
3931 '_', /* leading underscore */
3932 ' ', /* ar_pad_char */
3933 16, /* ar_max_namelen */
3934 bfd_getb64
, bfd_getb_signed_64
, bfd_putb64
,
3935 bfd_getb32
, bfd_getb_signed_32
, bfd_putb32
,
3936 bfd_getb16
, bfd_getb_signed_16
, bfd_putb16
, /* data */
3937 bfd_getb64
, bfd_getb_signed_64
, bfd_putb64
,
3938 bfd_getb32
, bfd_getb_signed_32
, bfd_putb32
,
3939 bfd_getb16
, bfd_getb_signed_16
, bfd_putb16
, /* hdrs */
3942 ieee_object_p
, /* bfd_check_format */
3949 _bfd_generic_mkarchive
,
3954 ieee_write_object_contents
,
3955 _bfd_write_archive_contents
,
3959 BFD_JUMP_TABLE_GENERIC (ieee
),
3960 BFD_JUMP_TABLE_COPY (_bfd_generic
),
3961 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
3962 BFD_JUMP_TABLE_ARCHIVE (ieee
),
3963 BFD_JUMP_TABLE_SYMBOLS (ieee
),
3964 BFD_JUMP_TABLE_RELOCS (ieee
),
3965 BFD_JUMP_TABLE_WRITE (ieee
),
3966 BFD_JUMP_TABLE_LINK (ieee
),
3967 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic
),