1 /* BFD back-end for ieee-695 objects.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
4 Free Software Foundation, Inc.
6 Written by Steve Chamberlain of Cygnus Support.
8 This file is part of BFD, the Binary File Descriptor library.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23 MA 02110-1301, USA. */
26 #define KEEPMINUSPCININST 0
28 /* IEEE 695 format is a stream of records, which we parse using a simple one-
29 token (which is one byte in this lexicon) lookahead recursive decent
37 #include "safe-ctype.h"
39 struct output_buffer_struct
45 static unsigned char *output_ptr_start
;
46 static unsigned char *output_ptr
;
47 static unsigned char *output_ptr_end
;
48 static unsigned char *input_ptr_start
;
49 static unsigned char *input_ptr
;
50 static unsigned char *input_ptr_end
;
51 static bfd
*input_bfd
;
52 static bfd
*output_bfd
;
53 static int output_buffer
;
56 static void block (void);
58 /* Functions for writing to ieee files in the strange way that the
62 ieee_write_byte (bfd
*abfd
, int barg
)
67 if (bfd_bwrite ((void *) &byte
, (bfd_size_type
) 1, abfd
) != 1)
73 ieee_write_2bytes (bfd
*abfd
, int bytes
)
77 buffer
[0] = bytes
>> 8;
78 buffer
[1] = bytes
& 0xff;
79 if (bfd_bwrite ((void *) buffer
, (bfd_size_type
) 2, abfd
) != 2)
85 ieee_write_int (bfd
*abfd
, bfd_vma value
)
89 if (! ieee_write_byte (abfd
, (bfd_byte
) value
))
96 /* How many significant bytes ? */
97 /* FIXME FOR LONGER INTS. */
98 if (value
& 0xff000000)
100 else if (value
& 0x00ff0000)
102 else if (value
& 0x0000ff00)
107 if (! ieee_write_byte (abfd
,
108 (bfd_byte
) ((int) ieee_number_repeat_start_enum
114 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
>> 24)))
118 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
>> 16)))
122 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
>> 8)))
126 if (! ieee_write_byte (abfd
, (bfd_byte
) (value
)))
135 ieee_write_id (bfd
*abfd
, const char *id
)
137 size_t length
= strlen (id
);
141 if (! ieee_write_byte (abfd
, (bfd_byte
) length
))
144 else if (length
< 255)
146 if (! ieee_write_byte (abfd
, ieee_extension_length_1_enum
)
147 || ! ieee_write_byte (abfd
, (bfd_byte
) length
))
150 else if (length
< 65535)
152 if (! ieee_write_byte (abfd
, ieee_extension_length_2_enum
)
153 || ! ieee_write_2bytes (abfd
, (int) length
))
158 (*_bfd_error_handler
)
159 (_("%s: string too long (%d chars, max 65535)"),
160 bfd_get_filename (abfd
), length
);
161 bfd_set_error (bfd_error_invalid_operation
);
165 if (bfd_bwrite ((void *) id
, (bfd_size_type
) length
, abfd
) != length
)
170 /* Functions for reading from ieee files in the strange way that the
171 standard requires. */
173 #define this_byte(ieee) *((ieee)->input_p)
174 #define next_byte(ieee) ((ieee)->input_p++)
175 #define this_byte_and_next(ieee) (*((ieee)->input_p++))
177 static unsigned short
178 read_2bytes (common_header_type
*ieee
)
180 unsigned char c1
= this_byte_and_next (ieee
);
181 unsigned char c2
= this_byte_and_next (ieee
);
183 return (c1
<< 8) | c2
;
187 bfd_get_string (common_header_type
*ieee
, char *string
, size_t length
)
191 for (i
= 0; i
< length
; i
++)
192 string
[i
] = this_byte_and_next (ieee
);
196 read_id (common_header_type
*ieee
)
201 length
= this_byte_and_next (ieee
);
203 /* Simple string of length 0 to 127. */
206 else if (length
== 0xde)
207 /* Length is next byte, allowing 0..255. */
208 length
= this_byte_and_next (ieee
);
210 else if (length
== 0xdf)
212 /* Length is next two bytes, allowing 0..65535. */
213 length
= this_byte_and_next (ieee
);
214 length
= (length
* 256) + this_byte_and_next (ieee
);
217 /* Buy memory and read string. */
218 string
= bfd_alloc (ieee
->abfd
, (bfd_size_type
) length
+ 1);
221 bfd_get_string (ieee
, string
, length
);
227 ieee_write_expression (bfd
*abfd
,
233 unsigned int term_count
= 0;
237 if (! ieee_write_int (abfd
, value
))
242 /* Badly formatted binaries can have a missing symbol,
243 so test here to prevent a seg fault. */
246 if (bfd_is_com_section (symbol
->section
)
247 || bfd_is_und_section (symbol
->section
))
249 /* Def of a common symbol. */
250 if (! ieee_write_byte (abfd
, ieee_variable_X_enum
)
251 || ! ieee_write_int (abfd
, symbol
->value
))
255 else if (! bfd_is_abs_section (symbol
->section
))
257 /* Ref to defined symbol - */
258 if (symbol
->flags
& BSF_GLOBAL
)
260 if (! ieee_write_byte (abfd
, ieee_variable_I_enum
)
261 || ! ieee_write_int (abfd
, symbol
->value
))
265 else if (symbol
->flags
& (BSF_LOCAL
| BSF_SECTION_SYM
))
267 /* This is a reference to a defined local symbol. We can
268 easily do a local as a section+offset. */
269 if (! ieee_write_byte (abfd
, ieee_variable_R_enum
)
270 || ! ieee_write_byte (abfd
,
271 (bfd_byte
) (symbol
->section
->index
272 + IEEE_SECTION_NUMBER_BASE
)))
276 if (symbol
->value
!= 0)
278 if (! ieee_write_int (abfd
, symbol
->value
))
285 (*_bfd_error_handler
)
286 (_("%s: unrecognized symbol `%s' flags 0x%x"),
287 bfd_get_filename (abfd
), bfd_asymbol_name (symbol
),
289 bfd_set_error (bfd_error_invalid_operation
);
297 /* Subtract the pc from here by asking for PC of this section. */
298 if (! ieee_write_byte (abfd
, ieee_variable_P_enum
)
299 || ! ieee_write_byte (abfd
,
300 (bfd_byte
) (index
+ IEEE_SECTION_NUMBER_BASE
))
301 || ! ieee_write_byte (abfd
, ieee_function_minus_enum
))
305 /* Handle the degenerate case of a 0 address. */
307 if (! ieee_write_int (abfd
, (bfd_vma
) 0))
310 while (term_count
> 1)
312 if (! ieee_write_byte (abfd
, ieee_function_plus_enum
))
320 /* Writes any integer into the buffer supplied and always takes 5 bytes. */
323 ieee_write_int5 (bfd_byte
*buffer
, bfd_vma value
)
325 buffer
[0] = (bfd_byte
) ieee_number_repeat_4_enum
;
326 buffer
[1] = (value
>> 24) & 0xff;
327 buffer
[2] = (value
>> 16) & 0xff;
328 buffer
[3] = (value
>> 8) & 0xff;
329 buffer
[4] = (value
>> 0) & 0xff;
333 ieee_write_int5_out (bfd
*abfd
, bfd_vma value
)
337 ieee_write_int5 (b
, value
);
338 if (bfd_bwrite ((void *) b
, (bfd_size_type
) 5, abfd
) != 5)
344 parse_int (common_header_type
*ieee
, bfd_vma
*value_ptr
)
346 int value
= this_byte (ieee
);
349 if (value
>= 0 && value
<= 127)
355 else if (value
>= 0x80 && value
<= 0x88)
357 unsigned int count
= value
& 0xf;
363 result
= (result
<< 8) | this_byte_and_next (ieee
);
373 parse_i (common_header_type
*ieee
, bfd_boolean
*ok
)
376 *ok
= parse_int (ieee
, &x
);
381 must_parse_int (common_header_type
*ieee
)
384 BFD_ASSERT (parse_int (ieee
, &result
));
392 ieee_symbol_index_type symbol
;
396 #if KEEPMINUSPCININST
398 #define SRC_MASK(arg) arg
399 #define PCREL_OFFSET FALSE
403 #define SRC_MASK(arg) 0
404 #define PCREL_OFFSET TRUE
408 static reloc_howto_type abs32_howto
=
415 complain_overflow_bitfield
,
423 static reloc_howto_type abs16_howto
=
430 complain_overflow_bitfield
,
438 static reloc_howto_type abs8_howto
=
445 complain_overflow_bitfield
,
453 static reloc_howto_type rel32_howto
=
460 complain_overflow_signed
,
464 SRC_MASK (0xffffffff),
468 static reloc_howto_type rel16_howto
=
475 complain_overflow_signed
,
479 SRC_MASK (0x0000ffff),
483 static reloc_howto_type rel8_howto
=
490 complain_overflow_signed
,
494 SRC_MASK (0x000000ff),
498 static ieee_symbol_index_type NOSYMBOL
= {0, 0};
501 parse_expression (ieee_data_type
*ieee
,
503 ieee_symbol_index_type
*symbol
,
509 bfd_boolean loop
= TRUE
;
510 ieee_value_type stack
[10];
511 ieee_value_type
*sp
= stack
;
520 /* The stack pointer always points to the next unused location. */
521 #define PUSH(x,y,z) TOS.symbol = x; TOS.section = y; TOS.value = z; INC;
522 #define POP(x,y,z) DEC; x = TOS.symbol; y = TOS.section; z = TOS.value;
524 while (loop
&& ieee
->h
.input_p
< ieee
->h
.last_byte
)
526 switch (this_byte (&(ieee
->h
)))
528 case ieee_variable_P_enum
:
529 /* P variable, current program counter for section n. */
533 next_byte (&(ieee
->h
));
535 section_n
= must_parse_int (&(ieee
->h
));
536 PUSH (NOSYMBOL
, bfd_abs_section_ptr
, 0);
539 case ieee_variable_L_enum
:
540 /* L variable address of section N. */
541 next_byte (&(ieee
->h
));
542 PUSH (NOSYMBOL
, ieee
->section_table
[must_parse_int (&(ieee
->h
))], 0);
544 case ieee_variable_R_enum
:
545 /* R variable, logical address of section module. */
546 /* FIXME, this should be different to L. */
547 next_byte (&(ieee
->h
));
548 PUSH (NOSYMBOL
, ieee
->section_table
[must_parse_int (&(ieee
->h
))], 0);
550 case ieee_variable_S_enum
:
551 /* S variable, size in MAUS of section module. */
552 next_byte (&(ieee
->h
));
555 ieee
->section_table
[must_parse_int (&(ieee
->h
))]->size
);
557 case ieee_variable_I_enum
:
558 /* Push the address of variable n. */
560 ieee_symbol_index_type sy
;
562 next_byte (&(ieee
->h
));
563 sy
.index
= (int) must_parse_int (&(ieee
->h
));
566 PUSH (sy
, bfd_abs_section_ptr
, 0);
569 case ieee_variable_X_enum
:
570 /* Push the address of external variable n. */
572 ieee_symbol_index_type sy
;
574 next_byte (&(ieee
->h
));
575 sy
.index
= (int) (must_parse_int (&(ieee
->h
)));
578 PUSH (sy
, bfd_und_section_ptr
, 0);
581 case ieee_function_minus_enum
:
583 bfd_vma value1
, value2
;
584 asection
*section1
, *section_dummy
;
585 ieee_symbol_index_type sy
;
587 next_byte (&(ieee
->h
));
589 POP (sy
, section1
, value1
);
590 POP (sy
, section_dummy
, value2
);
591 PUSH (sy
, section1
? section1
: section_dummy
, value2
- value1
);
594 case ieee_function_plus_enum
:
596 bfd_vma value1
, value2
;
599 ieee_symbol_index_type sy1
;
600 ieee_symbol_index_type sy2
;
602 next_byte (&(ieee
->h
));
604 POP (sy1
, section1
, value1
);
605 POP (sy2
, section2
, value2
);
606 PUSH (sy1
.letter
? sy1
: sy2
,
607 bfd_is_abs_section (section1
) ? section2
: section1
,
615 BFD_ASSERT (this_byte (&(ieee
->h
)) < (int) ieee_variable_A_enum
616 || this_byte (&(ieee
->h
)) > (int) ieee_variable_Z_enum
);
617 if (parse_int (&(ieee
->h
), &va
))
619 PUSH (NOSYMBOL
, bfd_abs_section_ptr
, va
);
622 /* Thats all that we can understand. */
628 /* As far as I can see there is a bug in the Microtec IEEE output
629 which I'm using to scan, whereby the comma operator is omitted
630 sometimes in an expression, giving expressions with too many
631 terms. We can tell if that's the case by ensuring that
632 sp == stack here. If not, then we've pushed something too far,
633 so we keep adding. */
634 while (sp
!= stack
+ 1)
637 ieee_symbol_index_type sy1
;
639 POP (sy1
, section1
, *extra
);
642 POP (*symbol
, dummy
, *value
);
648 #define ieee_seek(ieee, offset) \
651 ieee->h.input_p = ieee->h.first_byte + offset; \
652 ieee->h.last_byte = (ieee->h.first_byte \
653 + ieee_part_after (ieee, offset)); \
657 #define ieee_pos(ieee) \
658 (ieee->h.input_p - ieee->h.first_byte)
660 /* Find the first part of the ieee file after HERE. */
663 ieee_part_after (ieee_data_type
*ieee
, file_ptr here
)
666 file_ptr after
= ieee
->w
.r
.me_record
;
668 /* File parts can come in any order, except that module end is
669 guaranteed to be last (and the header first). */
670 for (part
= 0; part
< N_W_VARIABLES
; part
++)
671 if (ieee
->w
.offset
[part
] > here
&& after
> ieee
->w
.offset
[part
])
672 after
= ieee
->w
.offset
[part
];
677 static unsigned int last_index
;
678 static char last_type
; /* Is the index for an X or a D. */
680 static ieee_symbol_type
*
681 get_symbol (bfd
*abfd ATTRIBUTE_UNUSED
,
682 ieee_data_type
*ieee
,
683 ieee_symbol_type
*last_symbol
,
684 unsigned int *symbol_count
,
685 ieee_symbol_type
***pptr
,
686 unsigned int *max_index
,
689 /* Need a new symbol. */
690 unsigned int new_index
= must_parse_int (&(ieee
->h
));
692 if (new_index
!= last_index
|| this_type
!= last_type
)
694 ieee_symbol_type
*new_symbol
;
695 bfd_size_type amt
= sizeof (ieee_symbol_type
);
697 new_symbol
= bfd_alloc (ieee
->h
.abfd
, amt
);
701 new_symbol
->index
= new_index
;
702 last_index
= new_index
;
705 *pptr
= &new_symbol
->next
;
706 if (new_index
> *max_index
)
707 *max_index
= new_index
;
709 last_type
= this_type
;
710 new_symbol
->symbol
.section
= bfd_abs_section_ptr
;
717 ieee_slurp_external_symbols (bfd
*abfd
)
719 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
720 file_ptr offset
= ieee
->w
.r
.external_part
;
722 ieee_symbol_type
**prev_symbols_ptr
= &ieee
->external_symbols
;
723 ieee_symbol_type
**prev_reference_ptr
= &ieee
->external_reference
;
724 ieee_symbol_type
*symbol
= NULL
;
725 unsigned int symbol_count
= 0;
726 bfd_boolean loop
= TRUE
;
728 last_index
= 0xffffff;
729 ieee
->symbol_table_full
= TRUE
;
731 ieee_seek (ieee
, offset
);
735 switch (this_byte (&(ieee
->h
)))
738 next_byte (&(ieee
->h
));
740 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
742 & ieee
->external_symbol_max_index
, 'I');
746 symbol
->symbol
.the_bfd
= abfd
;
747 symbol
->symbol
.name
= read_id (&(ieee
->h
));
748 symbol
->symbol
.udata
.p
= NULL
;
749 symbol
->symbol
.flags
= BSF_NO_FLAGS
;
751 case ieee_external_symbol_enum
:
752 next_byte (&(ieee
->h
));
754 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
756 &ieee
->external_symbol_max_index
, 'D');
760 BFD_ASSERT (symbol
->index
>= ieee
->external_symbol_min_index
);
762 symbol
->symbol
.the_bfd
= abfd
;
763 symbol
->symbol
.name
= read_id (&(ieee
->h
));
764 symbol
->symbol
.udata
.p
= NULL
;
765 symbol
->symbol
.flags
= BSF_NO_FLAGS
;
767 case ieee_attribute_record_enum
>> 8:
769 unsigned int symbol_name_index
;
770 unsigned int symbol_type_index
;
771 unsigned int symbol_attribute_def
;
774 switch (read_2bytes (&ieee
->h
))
776 case ieee_attribute_record_enum
:
777 symbol_name_index
= must_parse_int (&(ieee
->h
));
778 symbol_type_index
= must_parse_int (&(ieee
->h
));
779 symbol_attribute_def
= must_parse_int (&(ieee
->h
));
780 switch (symbol_attribute_def
)
784 parse_int (&ieee
->h
, &value
);
787 (*_bfd_error_handler
)
788 (_("%B: unimplemented ATI record %u for symbol %u"),
789 abfd
, symbol_attribute_def
, symbol_name_index
);
790 bfd_set_error (bfd_error_bad_value
);
795 case ieee_external_reference_info_record_enum
:
796 /* Skip over ATX record. */
797 parse_int (&(ieee
->h
), &value
);
798 parse_int (&(ieee
->h
), &value
);
799 parse_int (&(ieee
->h
), &value
);
800 parse_int (&(ieee
->h
), &value
);
802 case ieee_atn_record_enum
:
803 /* We may get call optimization information here,
804 which we just ignore. The format is
805 {$F1}${CE}{index}{$00}{$3F}{$3F}{#_of_ASNs}. */
806 parse_int (&ieee
->h
, &value
);
807 parse_int (&ieee
->h
, &value
);
808 parse_int (&ieee
->h
, &value
);
811 (*_bfd_error_handler
)
812 (_("%B: unexpected ATN type %d in external part"),
814 bfd_set_error (bfd_error_bad_value
);
817 parse_int (&ieee
->h
, &value
);
818 parse_int (&ieee
->h
, &value
);
825 switch (read_2bytes (&ieee
->h
))
827 case ieee_asn_record_enum
:
828 parse_int (&ieee
->h
, &val1
);
829 parse_int (&ieee
->h
, &val1
);
833 (*_bfd_error_handler
)
834 (_("%B: unexpected type after ATN"), abfd
);
835 bfd_set_error (bfd_error_bad_value
);
842 case ieee_value_record_enum
>> 8:
844 unsigned int symbol_name_index
;
845 ieee_symbol_index_type symbol_ignore
;
846 bfd_boolean pcrel_ignore
;
849 next_byte (&(ieee
->h
));
850 next_byte (&(ieee
->h
));
852 symbol_name_index
= must_parse_int (&(ieee
->h
));
853 parse_expression (ieee
,
854 &symbol
->symbol
.value
,
858 &symbol
->symbol
.section
);
860 /* Fully linked IEEE-695 files tend to give every symbol
861 an absolute value. Try to convert that back into a
862 section relative value. FIXME: This won't always to
864 if (bfd_is_abs_section (symbol
->symbol
.section
)
865 && (abfd
->flags
& HAS_RELOC
) == 0)
870 val
= symbol
->symbol
.value
;
871 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
873 if (val
>= s
->vma
&& val
< s
->vma
+ s
->size
)
875 symbol
->symbol
.section
= s
;
876 symbol
->symbol
.value
-= s
->vma
;
882 symbol
->symbol
.flags
= BSF_GLOBAL
| BSF_EXPORT
;
886 case ieee_weak_external_reference_enum
:
891 next_byte (&(ieee
->h
));
892 /* Throw away the external reference index. */
893 (void) must_parse_int (&(ieee
->h
));
894 /* Fetch the default size if not resolved. */
895 size
= must_parse_int (&(ieee
->h
));
896 /* Fetch the default value if available. */
897 if (! parse_int (&(ieee
->h
), &value
))
899 /* This turns into a common. */
900 symbol
->symbol
.section
= bfd_com_section_ptr
;
901 symbol
->symbol
.value
= size
;
905 case ieee_external_reference_enum
:
906 next_byte (&(ieee
->h
));
908 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
910 &ieee
->external_reference_max_index
, 'X');
914 symbol
->symbol
.the_bfd
= abfd
;
915 symbol
->symbol
.name
= read_id (&(ieee
->h
));
916 symbol
->symbol
.udata
.p
= NULL
;
917 symbol
->symbol
.section
= bfd_und_section_ptr
;
918 symbol
->symbol
.value
= (bfd_vma
) 0;
919 symbol
->symbol
.flags
= 0;
921 BFD_ASSERT (symbol
->index
>= ieee
->external_reference_min_index
);
929 if (ieee
->external_symbol_max_index
!= 0)
931 ieee
->external_symbol_count
=
932 ieee
->external_symbol_max_index
-
933 ieee
->external_symbol_min_index
+ 1;
936 ieee
->external_symbol_count
= 0;
938 if (ieee
->external_reference_max_index
!= 0)
940 ieee
->external_reference_count
=
941 ieee
->external_reference_max_index
-
942 ieee
->external_reference_min_index
+ 1;
945 ieee
->external_reference_count
= 0;
948 ieee
->external_reference_count
+ ieee
->external_symbol_count
;
950 if (symbol_count
!= abfd
->symcount
)
951 /* There are gaps in the table -- */
952 ieee
->symbol_table_full
= FALSE
;
954 *prev_symbols_ptr
= NULL
;
955 *prev_reference_ptr
= NULL
;
961 ieee_slurp_symbol_table (bfd
*abfd
)
963 if (! IEEE_DATA (abfd
)->read_symbols
)
965 if (! ieee_slurp_external_symbols (abfd
))
967 IEEE_DATA (abfd
)->read_symbols
= TRUE
;
973 ieee_get_symtab_upper_bound (bfd
*abfd
)
975 if (! ieee_slurp_symbol_table (abfd
))
978 return (abfd
->symcount
!= 0) ?
979 (abfd
->symcount
+ 1) * (sizeof (ieee_symbol_type
*)) : 0;
982 /* Move from our internal lists to the canon table, and insert in
983 symbol index order. */
985 extern const bfd_target ieee_vec
;
988 ieee_canonicalize_symtab (bfd
*abfd
, asymbol
**location
)
990 ieee_symbol_type
*symp
;
991 static bfd dummy_bfd
;
992 static asymbol empty_symbol
=
1000 /* K&R compilers can't initialise unions. */
1007 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1009 dummy_bfd
.xvec
= &ieee_vec
;
1010 if (! ieee_slurp_symbol_table (abfd
))
1013 if (! ieee
->symbol_table_full
)
1015 /* Arrgh - there are gaps in the table, run through and fill them
1016 up with pointers to a null place. */
1019 for (i
= 0; i
< abfd
->symcount
; i
++)
1020 location
[i
] = &empty_symbol
;
1023 ieee
->external_symbol_base_offset
= -ieee
->external_symbol_min_index
;
1024 for (symp
= IEEE_DATA (abfd
)->external_symbols
;
1025 symp
!= (ieee_symbol_type
*) NULL
;
1027 /* Place into table at correct index locations. */
1028 location
[symp
->index
+ ieee
->external_symbol_base_offset
] = &symp
->symbol
;
1030 /* The external refs are indexed in a bit. */
1031 ieee
->external_reference_base_offset
=
1032 -ieee
->external_reference_min_index
+ ieee
->external_symbol_count
;
1034 for (symp
= IEEE_DATA (abfd
)->external_reference
;
1035 symp
!= (ieee_symbol_type
*) NULL
;
1037 location
[symp
->index
+ ieee
->external_reference_base_offset
] =
1042 location
[abfd
->symcount
] = (asymbol
*) NULL
;
1044 return abfd
->symcount
;
1048 get_section_entry (bfd
*abfd
, ieee_data_type
*ieee
, unsigned int index
)
1050 if (index
>= ieee
->section_table_size
)
1056 c
= ieee
->section_table_size
;
1063 amt
*= sizeof (asection
*);
1064 n
= bfd_realloc (ieee
->section_table
, amt
);
1068 for (i
= ieee
->section_table_size
; i
< c
; i
++)
1071 ieee
->section_table
= n
;
1072 ieee
->section_table_size
= c
;
1075 if (ieee
->section_table
[index
] == (asection
*) NULL
)
1077 char *tmp
= bfd_alloc (abfd
, (bfd_size_type
) 11);
1082 sprintf (tmp
, " fsec%4d", index
);
1083 section
= bfd_make_section (abfd
, tmp
);
1084 ieee
->section_table
[index
] = section
;
1085 section
->target_index
= index
;
1086 ieee
->section_table
[index
] = section
;
1088 return ieee
->section_table
[index
];
1092 ieee_slurp_sections (bfd
*abfd
)
1094 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1095 file_ptr offset
= ieee
->w
.r
.section_part
;
1100 bfd_byte section_type
[3];
1102 ieee_seek (ieee
, offset
);
1105 switch (this_byte (&(ieee
->h
)))
1107 case ieee_section_type_enum
:
1110 unsigned int section_index
;
1112 next_byte (&(ieee
->h
));
1113 section_index
= must_parse_int (&(ieee
->h
));
1115 section
= get_section_entry (abfd
, ieee
, section_index
);
1117 section_type
[0] = this_byte_and_next (&(ieee
->h
));
1119 /* Set minimal section attributes. Attributes are
1120 extended later, based on section contents. */
1121 switch (section_type
[0])
1124 /* Normal attributes for absolute sections. */
1125 section_type
[1] = this_byte (&(ieee
->h
));
1126 section
->flags
= SEC_ALLOC
;
1127 switch (section_type
[1])
1129 /* AS Absolute section attributes. */
1131 next_byte (&(ieee
->h
));
1132 section_type
[2] = this_byte (&(ieee
->h
));
1133 switch (section_type
[2])
1137 next_byte (&(ieee
->h
));
1138 section
->flags
|= SEC_CODE
;
1142 next_byte (&(ieee
->h
));
1143 section
->flags
|= SEC_DATA
;
1146 next_byte (&(ieee
->h
));
1147 /* Normal rom data. */
1148 section
->flags
|= SEC_ROM
| SEC_DATA
;
1156 /* Named relocatable sections (type C). */
1158 section_type
[1] = this_byte (&(ieee
->h
));
1159 section
->flags
= SEC_ALLOC
;
1160 switch (section_type
[1])
1162 case 0xD0: /* Normal code (CP). */
1163 next_byte (&(ieee
->h
));
1164 section
->flags
|= SEC_CODE
;
1166 case 0xC4: /* Normal data (CD). */
1167 next_byte (&(ieee
->h
));
1168 section
->flags
|= SEC_DATA
;
1170 case 0xD2: /* Normal rom data (CR). */
1171 next_byte (&(ieee
->h
));
1172 section
->flags
|= SEC_ROM
| SEC_DATA
;
1179 /* Read section name, use it if non empty. */
1180 name
= read_id (&ieee
->h
);
1182 section
->name
= name
;
1184 /* Skip these fields, which we don't care about. */
1186 bfd_vma parent
, brother
, context
;
1188 parse_int (&(ieee
->h
), &parent
);
1189 parse_int (&(ieee
->h
), &brother
);
1190 parse_int (&(ieee
->h
), &context
);
1194 case ieee_section_alignment_enum
:
1196 unsigned int section_index
;
1200 next_byte (&(ieee
->h
));
1201 section_index
= must_parse_int (&ieee
->h
);
1202 section
= get_section_entry (abfd
, ieee
, section_index
);
1203 if (section_index
> ieee
->section_count
)
1204 ieee
->section_count
= section_index
;
1206 section
->alignment_power
=
1207 bfd_log2 (must_parse_int (&ieee
->h
));
1208 (void) parse_int (&(ieee
->h
), &value
);
1211 case ieee_e2_first_byte_enum
:
1214 ieee_record_enum_type t
;
1216 t
= (ieee_record_enum_type
) (read_2bytes (&(ieee
->h
)));
1219 case ieee_section_size_enum
:
1220 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1221 section
->size
= must_parse_int (&(ieee
->h
));
1223 case ieee_physical_region_size_enum
:
1224 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1225 section
->size
= must_parse_int (&(ieee
->h
));
1227 case ieee_region_base_address_enum
:
1228 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1229 section
->vma
= must_parse_int (&(ieee
->h
));
1230 section
->lma
= section
->vma
;
1232 case ieee_mau_size_enum
:
1233 must_parse_int (&(ieee
->h
));
1234 must_parse_int (&(ieee
->h
));
1236 case ieee_m_value_enum
:
1237 must_parse_int (&(ieee
->h
));
1238 must_parse_int (&(ieee
->h
));
1240 case ieee_section_base_address_enum
:
1241 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1242 section
->vma
= must_parse_int (&(ieee
->h
));
1243 section
->lma
= section
->vma
;
1245 case ieee_section_offset_enum
:
1246 (void) must_parse_int (&(ieee
->h
));
1247 (void) must_parse_int (&(ieee
->h
));
1261 /* Make a section for the debugging information, if any. We don't try
1262 to interpret the debugging information; we just point the section
1263 at the area in the file so that program which understand can dig it
1267 ieee_slurp_debug (bfd
*abfd
)
1269 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1274 if (ieee
->w
.r
.debug_information_part
== 0)
1277 flags
= SEC_DEBUGGING
| SEC_HAS_CONTENTS
;
1278 sec
= bfd_make_section_with_flags (abfd
, ".debug", flags
);
1281 sec
->filepos
= ieee
->w
.r
.debug_information_part
;
1283 debug_end
= ieee_part_after (ieee
, ieee
->w
.r
.debug_information_part
);
1284 sec
->size
= debug_end
- ieee
->w
.r
.debug_information_part
;
1289 /* Archive stuff. */
1291 static const bfd_target
*
1292 ieee_archive_p (bfd
*abfd
)
1296 unsigned char buffer
[512];
1297 file_ptr buffer_offset
= 0;
1298 ieee_ar_data_type
*save
= abfd
->tdata
.ieee_ar_data
;
1299 ieee_ar_data_type
*ieee
;
1300 bfd_size_type alc_elts
;
1301 ieee_ar_obstack_type
*elts
= NULL
;
1302 bfd_size_type amt
= sizeof (ieee_ar_data_type
);
1304 abfd
->tdata
.ieee_ar_data
= bfd_alloc (abfd
, amt
);
1305 if (!abfd
->tdata
.ieee_ar_data
)
1306 goto error_ret_restore
;
1307 ieee
= IEEE_AR_DATA (abfd
);
1309 /* Ignore the return value here. It doesn't matter if we don't read
1310 the entire buffer. We might have a very small ieee file. */
1311 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1313 ieee
->h
.first_byte
= buffer
;
1314 ieee
->h
.input_p
= buffer
;
1316 ieee
->h
.abfd
= abfd
;
1318 if (this_byte (&(ieee
->h
)) != Module_Beginning
)
1319 goto got_wrong_format_error
;
1321 next_byte (&(ieee
->h
));
1322 library
= read_id (&(ieee
->h
));
1323 if (strcmp (library
, "LIBRARY") != 0)
1324 goto got_wrong_format_error
;
1326 /* Throw away the filename. */
1327 read_id (&(ieee
->h
));
1329 ieee
->element_count
= 0;
1330 ieee
->element_index
= 0;
1332 next_byte (&(ieee
->h
)); /* Drop the ad part. */
1333 must_parse_int (&(ieee
->h
)); /* And the two dummy numbers. */
1334 must_parse_int (&(ieee
->h
));
1337 elts
= bfd_malloc (alc_elts
* sizeof *elts
);
1341 /* Read the index of the BB table. */
1345 ieee_ar_obstack_type
*t
;
1347 rec
= read_2bytes (&(ieee
->h
));
1348 if (rec
!= (int) ieee_assign_value_to_variable_enum
)
1351 if (ieee
->element_count
>= alc_elts
)
1353 ieee_ar_obstack_type
*n
;
1356 n
= bfd_realloc (elts
, alc_elts
* sizeof (* elts
));
1362 t
= &elts
[ieee
->element_count
];
1363 ieee
->element_count
++;
1365 must_parse_int (&(ieee
->h
));
1366 t
->file_offset
= must_parse_int (&(ieee
->h
));
1367 t
->abfd
= (bfd
*) NULL
;
1369 /* Make sure that we don't go over the end of the buffer. */
1370 if ((size_t) ieee_pos (IEEE_DATA (abfd
)) > sizeof (buffer
) / 2)
1372 /* Past half way, reseek and reprime. */
1373 buffer_offset
+= ieee_pos (IEEE_DATA (abfd
));
1374 if (bfd_seek (abfd
, buffer_offset
, SEEK_SET
) != 0)
1377 /* Again ignore return value of bfd_bread. */
1378 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1379 ieee
->h
.first_byte
= buffer
;
1380 ieee
->h
.input_p
= buffer
;
1384 amt
= ieee
->element_count
;
1385 amt
*= sizeof *ieee
->elements
;
1386 ieee
->elements
= bfd_alloc (abfd
, amt
);
1387 if (ieee
->elements
== NULL
)
1390 memcpy (ieee
->elements
, elts
, (size_t) amt
);
1394 /* Now scan the area again, and replace BB offsets with file offsets. */
1395 for (i
= 2; i
< ieee
->element_count
; i
++)
1397 if (bfd_seek (abfd
, ieee
->elements
[i
].file_offset
, SEEK_SET
) != 0)
1400 /* Again ignore return value of bfd_bread. */
1401 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1402 ieee
->h
.first_byte
= buffer
;
1403 ieee
->h
.input_p
= buffer
;
1405 next_byte (&(ieee
->h
)); /* Drop F8. */
1406 next_byte (&(ieee
->h
)); /* Drop 14. */
1407 must_parse_int (&(ieee
->h
)); /* Drop size of block. */
1409 if (must_parse_int (&(ieee
->h
)) != 0)
1410 /* This object has been deleted. */
1411 ieee
->elements
[i
].file_offset
= 0;
1413 ieee
->elements
[i
].file_offset
= must_parse_int (&(ieee
->h
));
1416 /* abfd->has_armap = ;*/
1420 got_wrong_format_error
:
1421 bfd_set_error (bfd_error_wrong_format
);
1425 bfd_release (abfd
, ieee
);
1427 abfd
->tdata
.ieee_ar_data
= save
;
1433 ieee_mkobject (bfd
*abfd
)
1437 output_ptr_start
= NULL
;
1439 output_ptr_end
= NULL
;
1440 input_ptr_start
= NULL
;
1442 input_ptr_end
= NULL
;
1446 amt
= sizeof (ieee_data_type
);
1447 abfd
->tdata
.ieee_data
= bfd_zalloc (abfd
, amt
);
1448 return abfd
->tdata
.ieee_data
!= NULL
;
1452 do_one (ieee_data_type
*ieee
,
1453 ieee_per_section_type
*current_map
,
1454 unsigned char *location_ptr
,
1458 switch (this_byte (&(ieee
->h
)))
1460 case ieee_load_constant_bytes_enum
:
1462 unsigned int number_of_maus
;
1465 next_byte (&(ieee
->h
));
1466 number_of_maus
= must_parse_int (&(ieee
->h
));
1468 for (i
= 0; i
< number_of_maus
; i
++)
1470 location_ptr
[current_map
->pc
++] = this_byte (&(ieee
->h
));
1471 next_byte (&(ieee
->h
));
1476 case ieee_load_with_relocation_enum
:
1478 bfd_boolean loop
= TRUE
;
1480 next_byte (&(ieee
->h
));
1483 switch (this_byte (&(ieee
->h
)))
1485 case ieee_variable_R_enum
:
1487 case ieee_function_signed_open_b_enum
:
1488 case ieee_function_unsigned_open_b_enum
:
1489 case ieee_function_either_open_b_enum
:
1491 unsigned int extra
= 4;
1492 bfd_boolean pcrel
= FALSE
;
1496 r
= bfd_alloc (ieee
->h
.abfd
, sizeof (* r
));
1500 *(current_map
->reloc_tail_ptr
) = r
;
1501 current_map
->reloc_tail_ptr
= &r
->next
;
1502 r
->next
= (ieee_reloc_type
*) NULL
;
1503 next_byte (&(ieee
->h
));
1505 r
->relent
.sym_ptr_ptr
= 0;
1506 parse_expression (ieee
,
1509 &pcrel
, &extra
, §ion
);
1510 r
->relent
.address
= current_map
->pc
;
1511 s
->flags
|= SEC_RELOC
;
1512 s
->owner
->flags
|= HAS_RELOC
;
1514 if (r
->relent
.sym_ptr_ptr
== NULL
&& section
!= NULL
)
1515 r
->relent
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
1517 if (this_byte (&(ieee
->h
)) == (int) ieee_comma
)
1519 next_byte (&(ieee
->h
));
1520 /* Fetch number of bytes to pad. */
1521 extra
= must_parse_int (&(ieee
->h
));
1524 switch (this_byte (&(ieee
->h
)))
1526 case ieee_function_signed_close_b_enum
:
1527 next_byte (&(ieee
->h
));
1529 case ieee_function_unsigned_close_b_enum
:
1530 next_byte (&(ieee
->h
));
1532 case ieee_function_either_close_b_enum
:
1533 next_byte (&(ieee
->h
));
1538 /* Build a relocation entry for this type. */
1539 /* If pc rel then stick -ve pc into instruction
1540 and take out of reloc ..
1542 I've changed this. It's all too complicated. I
1543 keep 0 in the instruction now. */
1552 #if KEEPMINUSPCININST
1553 bfd_put_32 (ieee
->h
.abfd
, -current_map
->pc
,
1554 location_ptr
+ current_map
->pc
);
1555 r
->relent
.howto
= &rel32_howto
;
1556 r
->relent
.addend
-= current_map
->pc
;
1558 bfd_put_32 (ieee
->h
.abfd
, (bfd_vma
) 0, location_ptr
+
1560 r
->relent
.howto
= &rel32_howto
;
1565 bfd_put_32 (ieee
->h
.abfd
, (bfd_vma
) 0,
1566 location_ptr
+ current_map
->pc
);
1567 r
->relent
.howto
= &abs32_howto
;
1569 current_map
->pc
+= 4;
1574 #if KEEPMINUSPCININST
1575 bfd_put_16 (ieee
->h
.abfd
, (bfd_vma
) -current_map
->pc
,
1576 location_ptr
+ current_map
->pc
);
1577 r
->relent
.addend
-= current_map
->pc
;
1578 r
->relent
.howto
= &rel16_howto
;
1581 bfd_put_16 (ieee
->h
.abfd
, (bfd_vma
) 0,
1582 location_ptr
+ current_map
->pc
);
1583 r
->relent
.howto
= &rel16_howto
;
1589 bfd_put_16 (ieee
->h
.abfd
, (bfd_vma
) 0,
1590 location_ptr
+ current_map
->pc
);
1591 r
->relent
.howto
= &abs16_howto
;
1593 current_map
->pc
+= 2;
1598 #if KEEPMINUSPCININST
1599 bfd_put_8 (ieee
->h
.abfd
, (int) (-current_map
->pc
), location_ptr
+ current_map
->pc
);
1600 r
->relent
.addend
-= current_map
->pc
;
1601 r
->relent
.howto
= &rel8_howto
;
1603 bfd_put_8 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1604 r
->relent
.howto
= &rel8_howto
;
1609 bfd_put_8 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1610 r
->relent
.howto
= &abs8_howto
;
1612 current_map
->pc
+= 1;
1625 if (parse_int (&(ieee
->h
), &this_size
))
1629 for (i
= 0; i
< this_size
; i
++)
1631 location_ptr
[current_map
->pc
++] = this_byte (&(ieee
->h
));
1632 next_byte (&(ieee
->h
));
1640 /* Prevent more than the first load-item of an LR record
1641 from being repeated (MRI convention). */
1642 if (iterations
!= 1)
1650 /* Read in all the section data and relocation stuff too. */
1653 ieee_slurp_section_data (bfd
*abfd
)
1655 bfd_byte
*location_ptr
= (bfd_byte
*) NULL
;
1656 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1657 unsigned int section_number
;
1658 ieee_per_section_type
*current_map
= NULL
;
1661 /* Seek to the start of the data area. */
1662 if (ieee
->read_data
)
1664 ieee
->read_data
= TRUE
;
1665 ieee_seek (ieee
, ieee
->w
.r
.data_part
);
1667 /* Allocate enough space for all the section contents. */
1668 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
1670 ieee_per_section_type
*per
= ieee_per_section (s
);
1673 if ((s
->flags
& SEC_DEBUGGING
) != 0)
1675 per
->data
= bfd_alloc (ieee
->h
.abfd
, s
->size
);
1678 relpp
= &s
->relocation
;
1679 per
->reloc_tail_ptr
= (ieee_reloc_type
**) relpp
;
1684 switch (this_byte (&(ieee
->h
)))
1686 /* IF we see anything strange then quit. */
1690 case ieee_set_current_section_enum
:
1691 next_byte (&(ieee
->h
));
1692 section_number
= must_parse_int (&(ieee
->h
));
1693 s
= ieee
->section_table
[section_number
];
1694 s
->flags
|= SEC_LOAD
| SEC_HAS_CONTENTS
;
1695 current_map
= ieee_per_section (s
);
1696 location_ptr
= current_map
->data
- s
->vma
;
1697 /* The document I have says that Microtec's compilers reset
1698 this after a sec section, even though the standard says not
1700 current_map
->pc
= s
->vma
;
1703 case ieee_e2_first_byte_enum
:
1704 next_byte (&(ieee
->h
));
1705 switch (this_byte (&(ieee
->h
)))
1707 case ieee_set_current_pc_enum
& 0xff:
1710 ieee_symbol_index_type symbol
;
1714 next_byte (&(ieee
->h
));
1715 must_parse_int (&(ieee
->h
)); /* Throw away section #. */
1716 parse_expression (ieee
, &value
,
1720 current_map
->pc
= value
;
1721 BFD_ASSERT ((unsigned) (value
- s
->vma
) <= s
->size
);
1725 case ieee_value_starting_address_enum
& 0xff:
1726 next_byte (&(ieee
->h
));
1727 if (this_byte (&(ieee
->h
)) == ieee_function_either_open_b_enum
)
1728 next_byte (&(ieee
->h
));
1729 abfd
->start_address
= must_parse_int (&(ieee
->h
));
1730 /* We've got to the end of the data now - */
1737 case ieee_repeat_data_enum
:
1739 /* Repeat the following LD or LR n times - we do this by
1740 remembering the stream pointer before running it and
1741 resetting it and running it n times. We special case
1742 the repetition of a repeat_data/load_constant. */
1743 unsigned int iterations
;
1744 unsigned char *start
;
1746 next_byte (&(ieee
->h
));
1747 iterations
= must_parse_int (&(ieee
->h
));
1748 start
= ieee
->h
.input_p
;
1749 if (start
[0] == (int) ieee_load_constant_bytes_enum
1752 while (iterations
!= 0)
1754 location_ptr
[current_map
->pc
++] = start
[2];
1757 next_byte (&(ieee
->h
));
1758 next_byte (&(ieee
->h
));
1759 next_byte (&(ieee
->h
));
1763 while (iterations
!= 0)
1765 ieee
->h
.input_p
= start
;
1766 if (!do_one (ieee
, current_map
, location_ptr
, s
,
1774 case ieee_load_constant_bytes_enum
:
1775 case ieee_load_with_relocation_enum
:
1776 if (!do_one (ieee
, current_map
, location_ptr
, s
, 1))
1782 static const bfd_target
*
1783 ieee_object_p (bfd
*abfd
)
1787 ieee_data_type
*ieee
;
1788 unsigned char buffer
[300];
1789 ieee_data_type
*save
= IEEE_DATA (abfd
);
1792 abfd
->tdata
.ieee_data
= 0;
1793 ieee_mkobject (abfd
);
1795 ieee
= IEEE_DATA (abfd
);
1796 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1798 /* Read the first few bytes in to see if it makes sense. Ignore
1799 bfd_bread return value; The file might be very small. */
1800 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1802 ieee
->h
.input_p
= buffer
;
1803 if (this_byte_and_next (&(ieee
->h
)) != Module_Beginning
)
1804 goto got_wrong_format
;
1806 ieee
->read_symbols
= FALSE
;
1807 ieee
->read_data
= FALSE
;
1808 ieee
->section_count
= 0;
1809 ieee
->external_symbol_max_index
= 0;
1810 ieee
->external_symbol_min_index
= IEEE_PUBLIC_BASE
;
1811 ieee
->external_reference_min_index
= IEEE_REFERENCE_BASE
;
1812 ieee
->external_reference_max_index
= 0;
1813 ieee
->h
.abfd
= abfd
;
1814 ieee
->section_table
= NULL
;
1815 ieee
->section_table_size
= 0;
1817 processor
= ieee
->mb
.processor
= read_id (&(ieee
->h
));
1818 if (strcmp (processor
, "LIBRARY") == 0)
1819 goto got_wrong_format
;
1820 ieee
->mb
.module_name
= read_id (&(ieee
->h
));
1821 if (abfd
->filename
== (const char *) NULL
)
1822 abfd
->filename
= ieee
->mb
.module_name
;
1824 /* Determine the architecture and machine type of the object file. */
1826 const bfd_arch_info_type
*arch
;
1829 /* IEEE does not specify the format of the processor identification
1830 string, so the compiler is free to put in it whatever it wants.
1831 We try here to recognize different processors belonging to the
1832 m68k family. Code for other processors can be added here. */
1833 if ((processor
[0] == '6') && (processor
[1] == '8'))
1835 if (processor
[2] == '3') /* 683xx integrated processors. */
1837 switch (processor
[3])
1839 case '0': /* 68302, 68306, 68307 */
1840 case '2': /* 68322, 68328 */
1841 case '5': /* 68356 */
1842 strcpy (family
, "68000"); /* MC68000-based controllers. */
1845 case '3': /* 68330, 68331, 68332, 68333,
1846 68334, 68335, 68336, 68338 */
1847 case '6': /* 68360 */
1848 case '7': /* 68376 */
1849 strcpy (family
, "68332"); /* CPU32 and CPU32+ */
1853 if (processor
[4] == '9') /* 68349 */
1854 strcpy (family
, "68030"); /* CPU030 */
1855 else /* 68340, 68341 */
1856 strcpy (family
, "68332"); /* CPU32 and CPU32+ */
1859 default: /* Does not exist yet. */
1860 strcpy (family
, "68332"); /* Guess it will be CPU32 */
1863 else if (TOUPPER (processor
[3]) == 'F') /* 68F333 */
1864 strcpy (family
, "68332"); /* CPU32 */
1865 else if ((TOUPPER (processor
[3]) == 'C') /* Embedded controllers. */
1866 && ((TOUPPER (processor
[2]) == 'E')
1867 || (TOUPPER (processor
[2]) == 'H')
1868 || (TOUPPER (processor
[2]) == 'L')))
1870 strcpy (family
, "68");
1871 strncat (family
, processor
+ 4, 7);
1874 else /* "Regular" processors. */
1876 strncpy (family
, processor
, 9);
1880 else if ((CONST_STRNEQ (processor
, "cpu32")) /* CPU32 and CPU32+ */
1881 || (CONST_STRNEQ (processor
, "CPU32")))
1882 strcpy (family
, "68332");
1885 strncpy (family
, processor
, 9);
1889 arch
= bfd_scan_arch (family
);
1891 goto got_wrong_format
;
1892 abfd
->arch_info
= arch
;
1895 if (this_byte (&(ieee
->h
)) != (int) ieee_address_descriptor_enum
)
1898 next_byte (&(ieee
->h
));
1900 if (! parse_int (&(ieee
->h
), &ieee
->ad
.number_of_bits_mau
))
1903 if (! parse_int (&(ieee
->h
), &ieee
->ad
.number_of_maus_in_address
))
1906 /* If there is a byte order info, take it. */
1907 if (this_byte (&(ieee
->h
)) == (int) ieee_variable_L_enum
1908 || this_byte (&(ieee
->h
)) == (int) ieee_variable_M_enum
)
1909 next_byte (&(ieee
->h
));
1911 for (part
= 0; part
< N_W_VARIABLES
; part
++)
1915 if (read_2bytes (&(ieee
->h
)) != (int) ieee_assign_value_to_variable_enum
)
1918 if (this_byte_and_next (&(ieee
->h
)) != part
)
1921 ieee
->w
.offset
[part
] = parse_i (&(ieee
->h
), &ok
);
1926 if (ieee
->w
.r
.external_part
!= 0)
1927 abfd
->flags
= HAS_SYMS
;
1929 /* By now we know that this is a real IEEE file, we're going to read
1930 the whole thing into memory so that we can run up and down it
1931 quickly. We can work out how big the file is from the trailer
1934 amt
= ieee
->w
.r
.me_record
+ 1;
1935 IEEE_DATA (abfd
)->h
.first_byte
= bfd_alloc (ieee
->h
.abfd
, amt
);
1936 if (!IEEE_DATA (abfd
)->h
.first_byte
)
1938 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1940 /* FIXME: Check return value. I'm not sure whether it needs to read
1941 the entire buffer or not. */
1942 bfd_bread ((void *) (IEEE_DATA (abfd
)->h
.first_byte
),
1943 (bfd_size_type
) ieee
->w
.r
.me_record
+ 1, abfd
);
1945 ieee_slurp_sections (abfd
);
1947 if (! ieee_slurp_debug (abfd
))
1950 /* Parse section data to activate file and section flags implied by
1951 section contents. */
1952 if (! ieee_slurp_section_data (abfd
))
1957 bfd_set_error (bfd_error_wrong_format
);
1959 bfd_release (abfd
, ieee
);
1960 abfd
->tdata
.ieee_data
= save
;
1961 return (const bfd_target
*) NULL
;
1965 ieee_get_symbol_info (bfd
*ignore_abfd ATTRIBUTE_UNUSED
,
1969 bfd_symbol_info (symbol
, ret
);
1970 if (symbol
->name
[0] == ' ')
1971 ret
->name
= "* empty table entry ";
1972 if (!symbol
->section
)
1973 ret
->type
= (symbol
->flags
& BSF_LOCAL
) ? 'a' : 'A';
1977 ieee_print_symbol (bfd
*abfd
,
1980 bfd_print_symbol_type how
)
1982 FILE *file
= (FILE *) afile
;
1986 case bfd_print_symbol_name
:
1987 fprintf (file
, "%s", symbol
->name
);
1989 case bfd_print_symbol_more
:
1992 case bfd_print_symbol_all
:
1994 const char *section_name
=
1995 (symbol
->section
== (asection
*) NULL
1997 : symbol
->section
->name
);
1999 if (symbol
->name
[0] == ' ')
2000 fprintf (file
, "* empty table entry ");
2003 bfd_print_symbol_vandf (abfd
, (void *) file
, symbol
);
2005 fprintf (file
, " %-5s %04x %02x %s",
2007 (unsigned) ieee_symbol (symbol
)->index
,
2017 ieee_new_section_hook (bfd
*abfd
, asection
*newsect
)
2019 if (!newsect
->used_by_bfd
)
2021 newsect
->used_by_bfd
= bfd_alloc (abfd
, sizeof (ieee_per_section_type
));
2022 if (!newsect
->used_by_bfd
)
2025 ieee_per_section (newsect
)->data
= NULL
;
2026 ieee_per_section (newsect
)->section
= newsect
;
2027 return _bfd_generic_new_section_hook (abfd
, newsect
);
2031 ieee_get_reloc_upper_bound (bfd
*abfd
, sec_ptr asect
)
2033 if ((asect
->flags
& SEC_DEBUGGING
) != 0)
2035 if (! ieee_slurp_section_data (abfd
))
2037 return (asect
->reloc_count
+ 1) * sizeof (arelent
*);
2041 ieee_get_section_contents (bfd
*abfd
,
2045 bfd_size_type count
)
2047 ieee_per_section_type
*p
= ieee_per_section (section
);
2048 if ((section
->flags
& SEC_DEBUGGING
) != 0)
2049 return _bfd_generic_get_section_contents (abfd
, section
, location
,
2051 ieee_slurp_section_data (abfd
);
2052 (void) memcpy ((void *) location
, (void *) (p
->data
+ offset
), (unsigned) count
);
2057 ieee_canonicalize_reloc (bfd
*abfd
,
2062 ieee_reloc_type
*src
= (ieee_reloc_type
*) (section
->relocation
);
2063 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
2065 if ((section
->flags
& SEC_DEBUGGING
) != 0)
2068 while (src
!= (ieee_reloc_type
*) NULL
)
2070 /* Work out which symbol to attach it this reloc to. */
2071 switch (src
->symbol
.letter
)
2074 src
->relent
.sym_ptr_ptr
=
2075 symbols
+ src
->symbol
.index
+ ieee
->external_symbol_base_offset
;
2078 src
->relent
.sym_ptr_ptr
=
2079 symbols
+ src
->symbol
.index
+ ieee
->external_reference_base_offset
;
2082 if (src
->relent
.sym_ptr_ptr
!= NULL
)
2083 src
->relent
.sym_ptr_ptr
=
2084 src
->relent
.sym_ptr_ptr
[0]->section
->symbol_ptr_ptr
;
2090 *relptr
++ = &src
->relent
;
2094 return section
->reloc_count
;
2098 comp (const void * ap
, const void * bp
)
2100 arelent
*a
= *((arelent
**) ap
);
2101 arelent
*b
= *((arelent
**) bp
);
2102 return a
->address
- b
->address
;
2105 /* Write the section headers. */
2108 ieee_write_section_part (bfd
*abfd
)
2110 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
2113 ieee
->w
.r
.section_part
= bfd_tell (abfd
);
2114 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
2116 if (! bfd_is_abs_section (s
)
2117 && (s
->flags
& SEC_DEBUGGING
) == 0)
2119 if (! ieee_write_byte (abfd
, ieee_section_type_enum
)
2120 || ! ieee_write_byte (abfd
,
2121 (bfd_byte
) (s
->index
2122 + IEEE_SECTION_NUMBER_BASE
)))
2125 if (abfd
->flags
& EXEC_P
)
2127 /* This image is executable, so output absolute sections. */
2128 if (! ieee_write_byte (abfd
, ieee_variable_A_enum
)
2129 || ! ieee_write_byte (abfd
, ieee_variable_S_enum
))
2134 if (! ieee_write_byte (abfd
, ieee_variable_C_enum
))
2138 switch (s
->flags
& (SEC_CODE
| SEC_DATA
| SEC_ROM
))
2140 case SEC_CODE
| SEC_LOAD
:
2142 if (! ieee_write_byte (abfd
, ieee_variable_P_enum
))
2147 if (! ieee_write_byte (abfd
, ieee_variable_D_enum
))
2151 case SEC_ROM
| SEC_DATA
:
2152 case SEC_ROM
| SEC_LOAD
:
2153 case SEC_ROM
| SEC_DATA
| SEC_LOAD
:
2154 if (! ieee_write_byte (abfd
, ieee_variable_R_enum
))
2159 if (! ieee_write_id (abfd
, s
->name
))
2162 if (! ieee_write_byte (abfd
, ieee_section_alignment_enum
)
2163 || ! ieee_write_byte (abfd
,
2164 (bfd_byte
) (s
->index
2165 + IEEE_SECTION_NUMBER_BASE
))
2166 || ! ieee_write_int (abfd
, (bfd_vma
) 1 << s
->alignment_power
))
2170 if (! ieee_write_2bytes (abfd
, ieee_section_size_enum
)
2171 || ! ieee_write_byte (abfd
,
2172 (bfd_byte
) (s
->index
2173 + IEEE_SECTION_NUMBER_BASE
))
2174 || ! ieee_write_int (abfd
, s
->size
))
2176 if (abfd
->flags
& EXEC_P
)
2178 /* Relocateable sections don't have asl records. */
2180 if (! ieee_write_2bytes (abfd
, ieee_section_base_address_enum
)
2181 || ! ieee_write_byte (abfd
,
2184 + IEEE_SECTION_NUMBER_BASE
)))
2185 || ! ieee_write_int (abfd
, s
->lma
))
2195 do_with_relocs (bfd
*abfd
, asection
*s
)
2197 unsigned int number_of_maus_in_address
=
2198 bfd_arch_bits_per_address (abfd
) / bfd_arch_bits_per_byte (abfd
);
2199 unsigned int relocs_to_go
= s
->reloc_count
;
2200 bfd_byte
*stream
= ieee_per_section (s
)->data
;
2201 arelent
**p
= s
->orelocation
;
2202 bfd_size_type current_byte_index
= 0;
2204 qsort (s
->orelocation
,
2206 sizeof (arelent
**),
2209 /* Output the section preheader. */
2210 if (! ieee_write_byte (abfd
, ieee_set_current_section_enum
)
2211 || ! ieee_write_byte (abfd
,
2212 (bfd_byte
) (s
->index
+ IEEE_SECTION_NUMBER_BASE
))
2213 || ! ieee_write_2bytes (abfd
, ieee_set_current_pc_enum
)
2214 || ! ieee_write_byte (abfd
,
2215 (bfd_byte
) (s
->index
+ IEEE_SECTION_NUMBER_BASE
)))
2218 if ((abfd
->flags
& EXEC_P
) != 0 && relocs_to_go
== 0)
2220 if (! ieee_write_int (abfd
, s
->lma
))
2225 if (! ieee_write_expression (abfd
, (bfd_vma
) 0, s
->symbol
, 0, 0))
2229 if (relocs_to_go
== 0)
2231 /* If there aren't any relocations then output the load constant
2232 byte opcode rather than the load with relocation opcode. */
2233 while (current_byte_index
< s
->size
)
2236 unsigned int MAXRUN
= 127;
2239 if (run
> s
->size
- current_byte_index
)
2240 run
= s
->size
- current_byte_index
;
2244 if (! ieee_write_byte (abfd
, ieee_load_constant_bytes_enum
))
2246 /* Output a stream of bytes. */
2247 if (! ieee_write_int (abfd
, run
))
2249 if (bfd_bwrite ((void *) (stream
+ current_byte_index
), run
, abfd
)
2252 current_byte_index
+= run
;
2258 if (! ieee_write_byte (abfd
, ieee_load_with_relocation_enum
))
2261 /* Output the data stream as the longest sequence of bytes
2262 possible, allowing for the a reasonable packet size and
2263 relocation stuffs. */
2266 /* Outputting a section without data, fill it up. */
2267 stream
= bfd_zalloc (abfd
, s
->size
);
2271 while (current_byte_index
< s
->size
)
2274 unsigned int MAXRUN
= 127;
2278 run
= (*p
)->address
- current_byte_index
;
2285 if (run
> s
->size
- current_byte_index
)
2286 run
= s
->size
- current_byte_index
;
2290 /* Output a stream of bytes. */
2291 if (! ieee_write_int (abfd
, run
))
2293 if (bfd_bwrite ((void *) (stream
+ current_byte_index
), run
, abfd
)
2296 current_byte_index
+= run
;
2299 /* Output any relocations here. */
2300 if (relocs_to_go
&& (*p
) && (*p
)->address
== current_byte_index
)
2303 && (*p
) && (*p
)->address
== current_byte_index
)
2307 switch (r
->howto
->size
)
2310 ov
= bfd_get_signed_32 (abfd
,
2311 stream
+ current_byte_index
);
2312 current_byte_index
+= 4;
2315 ov
= bfd_get_signed_16 (abfd
,
2316 stream
+ current_byte_index
);
2317 current_byte_index
+= 2;
2320 ov
= bfd_get_signed_8 (abfd
,
2321 stream
+ current_byte_index
);
2322 current_byte_index
++;
2330 ov
&= r
->howto
->src_mask
;
2332 if (r
->howto
->pc_relative
2333 && ! r
->howto
->pcrel_offset
)
2336 if (! ieee_write_byte (abfd
,
2337 ieee_function_either_open_b_enum
))
2340 if (r
->sym_ptr_ptr
!= (asymbol
**) NULL
)
2342 if (! ieee_write_expression (abfd
, r
->addend
+ ov
,
2344 r
->howto
->pc_relative
,
2345 (unsigned) s
->index
))
2350 if (! ieee_write_expression (abfd
, r
->addend
+ ov
,
2352 r
->howto
->pc_relative
,
2353 (unsigned) s
->index
))
2357 if (number_of_maus_in_address
2358 != bfd_get_reloc_size (r
->howto
))
2360 bfd_vma rsize
= bfd_get_reloc_size (r
->howto
);
2361 if (! ieee_write_int (abfd
, rsize
))
2364 if (! ieee_write_byte (abfd
,
2365 ieee_function_either_close_b_enum
))
2379 /* If there are no relocations in the output section then we can be
2380 clever about how we write. We block items up into a max of 127
2384 do_as_repeat (bfd
*abfd
, asection
*s
)
2388 if (! ieee_write_byte (abfd
, ieee_set_current_section_enum
)
2389 || ! ieee_write_byte (abfd
,
2390 (bfd_byte
) (s
->index
2391 + IEEE_SECTION_NUMBER_BASE
))
2392 || ! ieee_write_byte (abfd
, ieee_set_current_pc_enum
>> 8)
2393 || ! ieee_write_byte (abfd
, ieee_set_current_pc_enum
& 0xff)
2394 || ! ieee_write_byte (abfd
,
2395 (bfd_byte
) (s
->index
2396 + IEEE_SECTION_NUMBER_BASE
)))
2399 if ((abfd
->flags
& EXEC_P
) != 0)
2401 if (! ieee_write_int (abfd
, s
->lma
))
2406 if (! ieee_write_expression (abfd
, (bfd_vma
) 0, s
->symbol
, 0, 0))
2410 if (! ieee_write_byte (abfd
, ieee_repeat_data_enum
)
2411 || ! ieee_write_int (abfd
, s
->size
)
2412 || ! ieee_write_byte (abfd
, ieee_load_constant_bytes_enum
)
2413 || ! ieee_write_byte (abfd
, 1)
2414 || ! ieee_write_byte (abfd
, 0))
2422 do_without_relocs (bfd
*abfd
, asection
*s
)
2424 bfd_byte
*stream
= ieee_per_section (s
)->data
;
2426 if (stream
== 0 || ((s
->flags
& SEC_LOAD
) == 0))
2428 if (! do_as_repeat (abfd
, s
))
2435 for (i
= 0; i
< s
->size
; i
++)
2439 if (! do_with_relocs (abfd
, s
))
2444 if (! do_as_repeat (abfd
, s
))
2454 bfd_size_type amt
= input_ptr_end
- input_ptr_start
;
2455 /* FIXME: Check return value. I'm not sure whether it needs to read
2456 the entire buffer or not. */
2457 bfd_bread ((void *) input_ptr_start
, amt
, input_bfd
);
2458 input_ptr
= input_ptr_start
;
2464 bfd_size_type amt
= output_ptr
- output_ptr_start
;
2466 if (bfd_bwrite ((void *) (output_ptr_start
), amt
, output_bfd
) != amt
)
2468 output_ptr
= output_ptr_start
;
2472 #define THIS() ( *input_ptr )
2473 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill (); }
2474 #define OUT(x) { *output_ptr++ = (x); if (output_ptr == output_ptr_end) flush (); }
2477 write_int (int value
)
2479 if (value
>= 0 && value
<= 127)
2485 unsigned int length
;
2487 /* How many significant bytes ? */
2488 /* FIXME FOR LONGER INTS. */
2489 if (value
& 0xff000000)
2491 else if (value
& 0x00ff0000)
2493 else if (value
& 0x0000ff00)
2498 OUT ((int) ieee_number_repeat_start_enum
+ length
);
2516 int length
= THIS ();
2529 #define VAR(x) ((x | 0x80))
2531 copy_expression (void)
2545 value
= (value
<< 8) | THIS ();
2547 value
= (value
<< 8) | THIS ();
2549 value
= (value
<< 8) | THIS ();
2557 value
= (value
<< 8) | THIS ();
2559 value
= (value
<< 8) | THIS ();
2567 value
= (value
<< 8) | THIS ();
2584 /* Not a number, just bug out with the answer. */
2585 write_int (*(--tos
));
2592 /* PLUS anything. */
2601 ieee_data_type
*ieee
;
2605 section_number
= THIS ();
2608 ieee
= IEEE_DATA (input_bfd
);
2609 s
= ieee
->section_table
[section_number
];
2611 if (s
->output_section
)
2612 value
= s
->output_section
->lma
;
2613 value
+= s
->output_offset
;
2620 write_int (*(--tos
));
2628 /* Drop the int in the buffer, and copy a null into the gap, which we
2629 will overwrite later. */
2632 fill_int (struct output_buffer_struct
*buf
)
2634 if (buf
->buffer
== output_buffer
)
2636 /* Still a chance to output the size. */
2637 int value
= output_ptr
- buf
->ptrp
+ 3;
2638 buf
->ptrp
[0] = value
>> 24;
2639 buf
->ptrp
[1] = value
>> 16;
2640 buf
->ptrp
[2] = value
>> 8;
2641 buf
->ptrp
[3] = value
>> 0;
2646 drop_int (struct output_buffer_struct
*buf
)
2673 buf
->ptrp
= output_ptr
;
2674 buf
->buffer
= output_buffer
;
2714 #define ID copy_id ()
2715 #define INT copy_int ()
2716 #define EXP copy_expression ()
2717 #define INTn(q) copy_int ()
2718 #define EXPn(q) copy_expression ()
2721 copy_till_end (void)
2797 EXPn (instruction address
);
2831 EXPn (external function
);
2841 INTn (locked
register);
2863 /* Attribute record. */
2893 /* Unique typedefs for module. */
2894 /* GLobal typedefs. */
2895 /* High level module scope beginning. */
2897 struct output_buffer_struct ob
;
2913 /* Global function. */
2915 struct output_buffer_struct ob
;
2930 EXPn (size of block
);
2936 /* File name for source line numbers. */
2938 struct output_buffer_struct ob
;
2959 /* Local function. */
2961 struct output_buffer_struct ob
;
2980 /* Assembler module scope beginning - */
2982 struct output_buffer_struct ob
;
3008 struct output_buffer_struct ob
;
3016 INTn (section index
);
3024 EXPn (Size in Maus
);
3077 /* Moves all the debug information from the source bfd to the output
3078 bfd, and relocates any expressions it finds. */
3081 relocate_debug (bfd
*output ATTRIBUTE_UNUSED
,
3086 unsigned char input_buffer
[IBS
];
3088 input_ptr_start
= input_ptr
= input_buffer
;
3089 input_ptr_end
= input_buffer
+ IBS
;
3091 /* FIXME: Check return value. I'm not sure whether it needs to read
3092 the entire buffer or not. */
3093 bfd_bread ((void *) input_ptr_start
, (bfd_size_type
) IBS
, input
);
3097 /* Gather together all the debug information from each input BFD into
3098 one place, relocating it and emitting it as we go. */
3101 ieee_write_debug_part (bfd
*abfd
)
3103 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3104 bfd_chain_type
*chain
= ieee
->chain_root
;
3105 unsigned char obuff
[OBS
];
3106 bfd_boolean some_debug
= FALSE
;
3107 file_ptr here
= bfd_tell (abfd
);
3109 output_ptr_start
= output_ptr
= obuff
;
3110 output_ptr_end
= obuff
+ OBS
;
3114 if (chain
== (bfd_chain_type
*) NULL
)
3118 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
3119 if ((s
->flags
& SEC_DEBUGGING
) != 0)
3123 ieee
->w
.r
.debug_information_part
= 0;
3127 ieee
->w
.r
.debug_information_part
= here
;
3128 if (bfd_bwrite (s
->contents
, s
->size
, abfd
) != s
->size
)
3133 while (chain
!= (bfd_chain_type
*) NULL
)
3135 bfd
*entry
= chain
->this;
3136 ieee_data_type
*entry_ieee
= IEEE_DATA (entry
);
3138 if (entry_ieee
->w
.r
.debug_information_part
)
3140 if (bfd_seek (entry
, entry_ieee
->w
.r
.debug_information_part
,
3143 relocate_debug (abfd
, entry
);
3146 chain
= chain
->next
;
3150 ieee
->w
.r
.debug_information_part
= here
;
3152 ieee
->w
.r
.debug_information_part
= 0;
3160 /* Write the data in an ieee way. */
3163 ieee_write_data_part (bfd
*abfd
)
3167 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3168 ieee
->w
.r
.data_part
= bfd_tell (abfd
);
3170 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
3172 /* Skip sections that have no loadable contents (.bss,
3174 if ((s
->flags
& SEC_LOAD
) == 0)
3177 /* Sort the reloc records so we can insert them in the correct
3179 if (s
->reloc_count
!= 0)
3181 if (! do_with_relocs (abfd
, s
))
3186 if (! do_without_relocs (abfd
, s
))
3195 init_for_output (bfd
*abfd
)
3199 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
3201 if ((s
->flags
& SEC_DEBUGGING
) != 0)
3205 bfd_size_type size
= s
->size
;
3206 ieee_per_section (s
)->data
= bfd_alloc (abfd
, size
);
3207 if (!ieee_per_section (s
)->data
)
3214 /* Exec and core file sections. */
3216 /* Set section contents is complicated with IEEE since the format is
3217 not a byte image, but a record stream. */
3220 ieee_set_section_contents (bfd
*abfd
,
3222 const void * location
,
3224 bfd_size_type count
)
3226 if ((section
->flags
& SEC_DEBUGGING
) != 0)
3228 if (section
->contents
== NULL
)
3230 bfd_size_type size
= section
->size
;
3231 section
->contents
= bfd_alloc (abfd
, size
);
3232 if (section
->contents
== NULL
)
3235 /* bfd_set_section_contents has already checked that everything
3237 memcpy (section
->contents
+ offset
, location
, (size_t) count
);
3241 if (ieee_per_section (section
)->data
== (bfd_byte
*) NULL
)
3243 if (!init_for_output (abfd
))
3246 memcpy ((void *) (ieee_per_section (section
)->data
+ offset
),
3248 (unsigned int) count
);
3252 /* Write the external symbols of a file. IEEE considers two sorts of
3253 external symbols, public, and referenced. It uses to internal
3254 forms to index them as well. When we write them out we turn their
3255 symbol values into indexes from the right base. */
3258 ieee_write_external_part (bfd
*abfd
)
3261 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3262 unsigned int reference_index
= IEEE_REFERENCE_BASE
;
3263 unsigned int public_index
= IEEE_PUBLIC_BASE
+ 2;
3264 file_ptr here
= bfd_tell (abfd
);
3265 bfd_boolean hadone
= FALSE
;
3267 if (abfd
->outsymbols
!= (asymbol
**) NULL
)
3270 for (q
= abfd
->outsymbols
; *q
!= (asymbol
*) NULL
; q
++)
3274 if (bfd_is_und_section (p
->section
))
3276 /* This must be a symbol reference. */
3277 if (! ieee_write_byte (abfd
, ieee_external_reference_enum
)
3278 || ! ieee_write_int (abfd
, (bfd_vma
) reference_index
)
3279 || ! ieee_write_id (abfd
, p
->name
))
3281 p
->value
= reference_index
;
3285 else if (bfd_is_com_section (p
->section
))
3287 /* This is a weak reference. */
3288 if (! ieee_write_byte (abfd
, ieee_external_reference_enum
)
3289 || ! ieee_write_int (abfd
, (bfd_vma
) reference_index
)
3290 || ! ieee_write_id (abfd
, p
->name
)
3291 || ! ieee_write_byte (abfd
,
3292 ieee_weak_external_reference_enum
)
3293 || ! ieee_write_int (abfd
, (bfd_vma
) reference_index
)
3294 || ! ieee_write_int (abfd
, p
->value
))
3296 p
->value
= reference_index
;
3300 else if (p
->flags
& BSF_GLOBAL
)
3302 /* This must be a symbol definition. */
3303 if (! ieee_write_byte (abfd
, ieee_external_symbol_enum
)
3304 || ! ieee_write_int (abfd
, (bfd_vma
) public_index
)
3305 || ! ieee_write_id (abfd
, p
->name
)
3306 || ! ieee_write_2bytes (abfd
, ieee_attribute_record_enum
)
3307 || ! ieee_write_int (abfd
, (bfd_vma
) public_index
)
3308 || ! ieee_write_byte (abfd
, 15) /* Instruction address. */
3309 || ! ieee_write_byte (abfd
, 19) /* Static symbol. */
3310 || ! ieee_write_byte (abfd
, 1)) /* One of them. */
3313 /* Write out the value. */
3314 if (! ieee_write_2bytes (abfd
, ieee_value_record_enum
)
3315 || ! ieee_write_int (abfd
, (bfd_vma
) public_index
))
3317 if (! bfd_is_abs_section (p
->section
))
3319 if (abfd
->flags
& EXEC_P
)
3321 /* If fully linked, then output all symbols
3323 if (! (ieee_write_int
3326 + p
->section
->output_offset
3327 + p
->section
->output_section
->vma
))))
3332 if (! (ieee_write_expression
3334 p
->value
+ p
->section
->output_offset
,
3335 p
->section
->output_section
->symbol
,
3342 if (! ieee_write_expression (abfd
,
3344 bfd_abs_section_ptr
->symbol
,
3348 p
->value
= public_index
;
3354 /* This can happen - when there are gaps in the symbols read
3355 from an input ieee file. */
3360 ieee
->w
.r
.external_part
= here
;
3366 static const unsigned char exten
[] =
3369 0xf1, 0xce, 0x20, 0x00, 37, 3, 3, /* Set version 3 rev 3. */
3370 0xf1, 0xce, 0x20, 0x00, 39, 2, /* Keep symbol in original case. */
3371 0xf1, 0xce, 0x20, 0x00, 38 /* Set object type relocatable to x. */
3374 static const unsigned char envi
[] =
3378 /* 0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
3381 0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok. */
3383 0xf1, 0xce, 0x21, 0, 53, 0x03,/* host unix. */
3384 /* 0xf1, 0xce, 0x21, 0, 54, 2,1,1 tool & version # */
3388 ieee_write_me_part (bfd
*abfd
)
3390 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3391 ieee
->w
.r
.trailer_part
= bfd_tell (abfd
);
3392 if (abfd
->start_address
)
3394 if (! ieee_write_2bytes (abfd
, ieee_value_starting_address_enum
)
3395 || ! ieee_write_byte (abfd
, ieee_function_either_open_b_enum
)
3396 || ! ieee_write_int (abfd
, abfd
->start_address
)
3397 || ! ieee_write_byte (abfd
, ieee_function_either_close_b_enum
))
3400 ieee
->w
.r
.me_record
= bfd_tell (abfd
);
3401 if (! ieee_write_byte (abfd
, ieee_module_end_enum
))
3406 /* Write out the IEEE processor ID. */
3409 ieee_write_processor (bfd
*abfd
)
3411 const bfd_arch_info_type
*arch
;
3413 arch
= bfd_get_arch_info (abfd
);
3417 if (! ieee_write_id (abfd
, bfd_printable_name (abfd
)))
3421 case bfd_arch_h8300
:
3422 if (! ieee_write_id (abfd
, "H8/300"))
3426 case bfd_arch_h8500
:
3427 if (! ieee_write_id (abfd
, "H8/500"))
3435 case bfd_mach_i960_core
:
3436 case bfd_mach_i960_ka_sa
:
3437 if (! ieee_write_id (abfd
, "80960KA"))
3441 case bfd_mach_i960_kb_sb
:
3442 if (! ieee_write_id (abfd
, "80960KB"))
3446 case bfd_mach_i960_ca
:
3447 if (! ieee_write_id (abfd
, "80960CA"))
3451 case bfd_mach_i960_mc
:
3452 case bfd_mach_i960_xa
:
3453 if (! ieee_write_id (abfd
, "80960MC"))
3465 default: id
= "68020"; break;
3466 case bfd_mach_m68000
: id
= "68000"; break;
3467 case bfd_mach_m68008
: id
= "68008"; break;
3468 case bfd_mach_m68010
: id
= "68010"; break;
3469 case bfd_mach_m68020
: id
= "68020"; break;
3470 case bfd_mach_m68030
: id
= "68030"; break;
3471 case bfd_mach_m68040
: id
= "68040"; break;
3472 case bfd_mach_m68060
: id
= "68060"; break;
3473 case bfd_mach_cpu32
: id
= "cpu32"; break;
3474 case bfd_mach_mcf_isa_a_nodiv
: id
= "isa-a:nodiv"; break;
3475 case bfd_mach_mcf_isa_a
: id
= "isa-a"; break;
3476 case bfd_mach_mcf_isa_a_mac
: id
= "isa-a:mac"; break;
3477 case bfd_mach_mcf_isa_a_emac
: id
= "isa-a:emac"; break;
3478 case bfd_mach_mcf_isa_aplus
: id
= "isa-aplus"; break;
3479 case bfd_mach_mcf_isa_aplus_mac
: id
= "isa-aplus:mac"; break;
3480 case bfd_mach_mcf_isa_aplus_emac
: id
= "isa-aplus:mac"; break;
3481 case bfd_mach_mcf_isa_b_nousp
: id
= "isa-b:nousp"; break;
3482 case bfd_mach_mcf_isa_b_nousp_mac
: id
= "isa-b:nousp:mac"; break;
3483 case bfd_mach_mcf_isa_b_nousp_emac
: id
= "isa-b:nousp:emac"; break;
3484 case bfd_mach_mcf_isa_b
: id
= "isa-b"; break;
3485 case bfd_mach_mcf_isa_b_mac
: id
= "isa-b:mac"; break;
3486 case bfd_mach_mcf_isa_b_emac
: id
= "isa-b:emac"; break;
3487 case bfd_mach_mcf_isa_b_float
: id
= "isa-b:float"; break;
3488 case bfd_mach_mcf_isa_b_float_mac
: id
= "isa-b:float:mac"; break;
3489 case bfd_mach_mcf_isa_b_float_emac
: id
= "isa-b:float:emac"; break;
3490 case bfd_mach_mcf_isa_c
: id
= "isa-c"; break;
3491 case bfd_mach_mcf_isa_c_mac
: id
= "isa-c:mac"; break;
3492 case bfd_mach_mcf_isa_c_emac
: id
= "isa-c:emac"; break;
3493 case bfd_mach_mcf_isa_c_nodiv
: id
= "isa-c:nodiv"; break;
3494 case bfd_mach_mcf_isa_c_nodiv_mac
: id
= "isa-c:nodiv:mac"; break;
3495 case bfd_mach_mcf_isa_c_nodiv_emac
: id
= "isa-c:nodiv:emac"; break;
3498 if (! ieee_write_id (abfd
, id
))
3508 ieee_write_object_contents (bfd
*abfd
)
3510 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3514 /* Fast forward over the header area. */
3515 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
3518 if (! ieee_write_byte (abfd
, ieee_module_beginning_enum
)
3519 || ! ieee_write_processor (abfd
)
3520 || ! ieee_write_id (abfd
, abfd
->filename
))
3523 /* Fast forward over the variable bits. */
3524 if (! ieee_write_byte (abfd
, ieee_address_descriptor_enum
))
3528 if (! ieee_write_byte (abfd
, (bfd_byte
) (bfd_arch_bits_per_byte (abfd
))))
3530 /* MAU's per address. */
3531 if (! ieee_write_byte (abfd
,
3532 (bfd_byte
) (bfd_arch_bits_per_address (abfd
)
3533 / bfd_arch_bits_per_byte (abfd
))))
3536 old
= bfd_tell (abfd
);
3537 if (bfd_seek (abfd
, (file_ptr
) (8 * N_W_VARIABLES
), SEEK_CUR
) != 0)
3540 ieee
->w
.r
.extension_record
= bfd_tell (abfd
);
3541 if (bfd_bwrite ((char *) exten
, (bfd_size_type
) sizeof (exten
), abfd
)
3544 if (abfd
->flags
& EXEC_P
)
3546 if (! ieee_write_byte (abfd
, 0x1)) /* Absolute. */
3551 if (! ieee_write_byte (abfd
, 0x2)) /* Relocateable. */
3555 ieee
->w
.r
.environmental_record
= bfd_tell (abfd
);
3556 if (bfd_bwrite ((char *) envi
, (bfd_size_type
) sizeof (envi
), abfd
)
3560 /* The HP emulator database requires a timestamp in the file. */
3566 t
= (struct tm
*) localtime (&now
);
3567 if (! ieee_write_2bytes (abfd
, (int) ieee_atn_record_enum
)
3568 || ! ieee_write_byte (abfd
, 0x21)
3569 || ! ieee_write_byte (abfd
, 0)
3570 || ! ieee_write_byte (abfd
, 50)
3571 || ! ieee_write_int (abfd
, (bfd_vma
) (t
->tm_year
+ 1900))
3572 || ! ieee_write_int (abfd
, (bfd_vma
) (t
->tm_mon
+ 1))
3573 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_mday
)
3574 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_hour
)
3575 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_min
)
3576 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_sec
))
3584 if (! ieee_write_section_part (abfd
))
3586 /* First write the symbols. This changes their values into table
3587 indeces so we cant use it after this point. */
3588 if (! ieee_write_external_part (abfd
))
3591 /* Write any debugs we have been told about. */
3592 if (! ieee_write_debug_part (abfd
))
3595 /* Can only write the data once the symbols have been written, since
3596 the data contains relocation information which points to the
3598 if (! ieee_write_data_part (abfd
))
3601 /* At the end we put the end! */
3602 if (! ieee_write_me_part (abfd
))
3605 /* Generate the header. */
3606 if (bfd_seek (abfd
, old
, SEEK_SET
) != 0)
3609 for (i
= 0; i
< N_W_VARIABLES
; i
++)
3611 if (! ieee_write_2bytes (abfd
, ieee_assign_value_to_variable_enum
)
3612 || ! ieee_write_byte (abfd
, (bfd_byte
) i
)
3613 || ! ieee_write_int5_out (abfd
, (bfd_vma
) ieee
->w
.offset
[i
]))
3620 /* Native-level interface to symbols. */
3622 /* We read the symbols into a buffer, which is discarded when this
3623 function exits. We read the strings into a buffer large enough to
3624 hold them all plus all the cached symbol entries. */
3627 ieee_make_empty_symbol (bfd
*abfd
)
3629 bfd_size_type amt
= sizeof (ieee_symbol_type
);
3630 ieee_symbol_type
*new = bfd_zalloc (abfd
, amt
);
3634 new->symbol
.the_bfd
= abfd
;
3635 return &new->symbol
;
3639 ieee_openr_next_archived_file (bfd
*arch
, bfd
*prev
)
3641 ieee_ar_data_type
*ar
= IEEE_AR_DATA (arch
);
3643 /* Take the next one from the arch state, or reset. */
3644 if (prev
== (bfd
*) NULL
)
3645 /* Reset the index - the first two entries are bogus. */
3646 ar
->element_index
= 2;
3650 ieee_ar_obstack_type
*p
= ar
->elements
+ ar
->element_index
;
3652 ar
->element_index
++;
3653 if (ar
->element_index
<= ar
->element_count
)
3655 if (p
->file_offset
!= (file_ptr
) 0)
3657 if (p
->abfd
== (bfd
*) NULL
)
3659 p
->abfd
= _bfd_create_empty_archive_element_shell (arch
);
3660 p
->abfd
->origin
= p
->file_offset
;
3667 bfd_set_error (bfd_error_no_more_archived_files
);
3674 ieee_find_nearest_line (bfd
*abfd ATTRIBUTE_UNUSED
,
3675 asection
*section ATTRIBUTE_UNUSED
,
3676 asymbol
**symbols ATTRIBUTE_UNUSED
,
3677 bfd_vma offset ATTRIBUTE_UNUSED
,
3678 const char **filename_ptr ATTRIBUTE_UNUSED
,
3679 const char **functionname_ptr ATTRIBUTE_UNUSED
,
3680 unsigned int *line_ptr ATTRIBUTE_UNUSED
)
3686 ieee_find_inliner_info (bfd
*abfd ATTRIBUTE_UNUSED
,
3687 const char **filename_ptr ATTRIBUTE_UNUSED
,
3688 const char **functionname_ptr ATTRIBUTE_UNUSED
,
3689 unsigned int *line_ptr ATTRIBUTE_UNUSED
)
3695 ieee_generic_stat_arch_elt (bfd
*abfd
, struct stat
*buf
)
3697 ieee_ar_data_type
*ar
= (ieee_ar_data_type
*) NULL
;
3698 ieee_data_type
*ieee
;
3700 if (abfd
->my_archive
!= NULL
)
3701 ar
= abfd
->my_archive
->tdata
.ieee_ar_data
;
3702 if (ar
== (ieee_ar_data_type
*) NULL
)
3704 bfd_set_error (bfd_error_invalid_operation
);
3708 if (IEEE_DATA (abfd
) == NULL
)
3710 if (ieee_object_p (abfd
) == NULL
)
3712 bfd_set_error (bfd_error_wrong_format
);
3717 ieee
= IEEE_DATA (abfd
);
3719 buf
->st_size
= ieee
->w
.r
.me_record
+ 1;
3720 buf
->st_mode
= 0644;
3725 ieee_sizeof_headers (bfd
*abfd ATTRIBUTE_UNUSED
,
3726 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
3731 #define ieee_close_and_cleanup _bfd_generic_close_and_cleanup
3732 #define ieee_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
3734 #define ieee_slurp_armap bfd_true
3735 #define ieee_slurp_extended_name_table bfd_true
3736 #define ieee_construct_extended_name_table \
3738 (bfd *, char **, bfd_size_type *, const char **)) \
3740 #define ieee_truncate_arname bfd_dont_truncate_arname
3741 #define ieee_write_armap \
3743 (bfd *, unsigned int, struct orl *, unsigned int, int)) \
3745 #define ieee_read_ar_hdr bfd_nullvoidptr
3746 #define ieee_update_armap_timestamp bfd_true
3747 #define ieee_get_elt_at_index _bfd_generic_get_elt_at_index
3749 #define ieee_bfd_is_target_special_symbol \
3750 ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
3751 #define ieee_bfd_is_local_label_name bfd_generic_is_local_label_name
3752 #define ieee_get_lineno _bfd_nosymbols_get_lineno
3753 #define ieee_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
3754 #define ieee_read_minisymbols _bfd_generic_read_minisymbols
3755 #define ieee_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
3757 #define ieee_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
3758 #define ieee_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
3760 #define ieee_set_arch_mach _bfd_generic_set_arch_mach
3762 #define ieee_get_section_contents_in_window \
3763 _bfd_generic_get_section_contents_in_window
3764 #define ieee_bfd_get_relocated_section_contents \
3765 bfd_generic_get_relocated_section_contents
3766 #define ieee_bfd_relax_section bfd_generic_relax_section
3767 #define ieee_bfd_gc_sections bfd_generic_gc_sections
3768 #define ieee_bfd_merge_sections bfd_generic_merge_sections
3769 #define ieee_bfd_is_group_section bfd_generic_is_group_section
3770 #define ieee_bfd_discard_group bfd_generic_discard_group
3771 #define ieee_section_already_linked \
3772 _bfd_generic_section_already_linked
3773 #define ieee_bfd_define_common_symbol bfd_generic_define_common_symbol
3774 #define ieee_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
3775 #define ieee_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
3776 #define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols
3777 #define ieee_bfd_link_just_syms _bfd_generic_link_just_syms
3778 #define ieee_bfd_final_link _bfd_generic_final_link
3779 #define ieee_bfd_link_split_section _bfd_generic_link_split_section
3781 const bfd_target ieee_vec
=
3784 bfd_target_ieee_flavour
,
3785 BFD_ENDIAN_UNKNOWN
, /* Target byte order. */
3786 BFD_ENDIAN_UNKNOWN
, /* Target headers byte order. */
3787 (HAS_RELOC
| EXEC_P
| /* Object flags. */
3788 HAS_LINENO
| HAS_DEBUG
|
3789 HAS_SYMS
| HAS_LOCALS
| WP_TEXT
| D_PAGED
),
3790 (SEC_CODE
| SEC_DATA
| SEC_ROM
| SEC_HAS_CONTENTS
3791 | SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
), /* Section flags. */
3792 '_', /* Leading underscore. */
3793 ' ', /* AR_pad_char. */
3794 16, /* AR_max_namelen. */
3795 bfd_getb64
, bfd_getb_signed_64
, bfd_putb64
,
3796 bfd_getb32
, bfd_getb_signed_32
, bfd_putb32
,
3797 bfd_getb16
, bfd_getb_signed_16
, bfd_putb16
, /* Data. */
3798 bfd_getb64
, bfd_getb_signed_64
, bfd_putb64
,
3799 bfd_getb32
, bfd_getb_signed_32
, bfd_putb32
,
3800 bfd_getb16
, bfd_getb_signed_16
, bfd_putb16
, /* Headers. */
3803 ieee_object_p
, /* bfd_check_format. */
3810 _bfd_generic_mkarchive
,
3815 ieee_write_object_contents
,
3816 _bfd_write_archive_contents
,
3820 /* ieee_close_and_cleanup, ieee_bfd_free_cached_info, ieee_new_section_hook,
3821 ieee_get_section_contents, ieee_get_section_contents_in_window. */
3822 BFD_JUMP_TABLE_GENERIC (ieee
),
3824 BFD_JUMP_TABLE_COPY (_bfd_generic
),
3825 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
3827 /* ieee_slurp_armap, ieee_slurp_extended_name_table,
3828 ieee_construct_extended_name_table, ieee_truncate_arname,
3829 ieee_write_armap, ieee_read_ar_hdr, ieee_openr_next_archived_file,
3830 ieee_get_elt_at_index, ieee_generic_stat_arch_elt,
3831 ieee_update_armap_timestamp. */
3832 BFD_JUMP_TABLE_ARCHIVE (ieee
),
3834 /* ieee_get_symtab_upper_bound, ieee_canonicalize_symtab,
3835 ieee_make_empty_symbol, ieee_print_symbol, ieee_get_symbol_info,
3836 ieee_bfd_is_local_label_name, ieee_get_lineno,
3837 ieee_find_nearest_line, ieee_bfd_make_debug_symbol,
3838 ieee_read_minisymbols, ieee_minisymbol_to_symbol. */
3839 BFD_JUMP_TABLE_SYMBOLS (ieee
),
3841 /* ieee_get_reloc_upper_bound, ieee_canonicalize_reloc,
3842 ieee_bfd_reloc_type_lookup. */
3843 BFD_JUMP_TABLE_RELOCS (ieee
),
3845 /* ieee_set_arch_mach, ieee_set_section_contents. */
3846 BFD_JUMP_TABLE_WRITE (ieee
),
3848 /* ieee_sizeof_headers, ieee_bfd_get_relocated_section_contents,
3849 ieee_bfd_relax_section, ieee_bfd_link_hash_table_create,
3850 _bfd_generic_link_hash_table_free,
3851 ieee_bfd_link_add_symbols, ieee_bfd_final_link,
3852 ieee_bfd_link_split_section, ieee_bfd_gc_sections,
3853 ieee_bfd_merge_sections. */
3854 BFD_JUMP_TABLE_LINK (ieee
),
3856 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic
),