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, 2009, 2010, 2011
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
) (sindex
+ 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
));
537 PUSH (NOSYMBOL
, bfd_abs_section_ptr
, 0);
540 case ieee_variable_L_enum
:
541 /* L variable address of section N. */
542 next_byte (&(ieee
->h
));
543 PUSH (NOSYMBOL
, ieee
->section_table
[must_parse_int (&(ieee
->h
))], 0);
545 case ieee_variable_R_enum
:
546 /* R variable, logical address of section module. */
547 /* FIXME, this should be different to L. */
548 next_byte (&(ieee
->h
));
549 PUSH (NOSYMBOL
, ieee
->section_table
[must_parse_int (&(ieee
->h
))], 0);
551 case ieee_variable_S_enum
:
552 /* S variable, size in MAUS of section module. */
553 next_byte (&(ieee
->h
));
556 ieee
->section_table
[must_parse_int (&(ieee
->h
))]->size
);
558 case ieee_variable_I_enum
:
559 /* Push the address of variable n. */
561 ieee_symbol_index_type sy
;
563 next_byte (&(ieee
->h
));
564 sy
.index
= (int) must_parse_int (&(ieee
->h
));
567 PUSH (sy
, bfd_abs_section_ptr
, 0);
570 case ieee_variable_X_enum
:
571 /* Push the address of external variable n. */
573 ieee_symbol_index_type sy
;
575 next_byte (&(ieee
->h
));
576 sy
.index
= (int) (must_parse_int (&(ieee
->h
)));
579 PUSH (sy
, bfd_und_section_ptr
, 0);
582 case ieee_function_minus_enum
:
584 bfd_vma value1
, value2
;
585 asection
*section1
, *section_dummy
;
586 ieee_symbol_index_type sy
;
588 next_byte (&(ieee
->h
));
590 POP (sy
, section1
, value1
);
591 POP (sy
, section_dummy
, value2
);
592 PUSH (sy
, section1
? section1
: section_dummy
, value2
- value1
);
595 case ieee_function_plus_enum
:
597 bfd_vma value1
, value2
;
600 ieee_symbol_index_type sy1
;
601 ieee_symbol_index_type sy2
;
603 next_byte (&(ieee
->h
));
605 POP (sy1
, section1
, value1
);
606 POP (sy2
, section2
, value2
);
607 PUSH (sy1
.letter
? sy1
: sy2
,
608 bfd_is_abs_section (section1
) ? section2
: section1
,
616 BFD_ASSERT (this_byte (&(ieee
->h
)) < (int) ieee_variable_A_enum
617 || this_byte (&(ieee
->h
)) > (int) ieee_variable_Z_enum
);
618 if (parse_int (&(ieee
->h
), &va
))
620 PUSH (NOSYMBOL
, bfd_abs_section_ptr
, va
);
623 /* Thats all that we can understand. */
629 /* As far as I can see there is a bug in the Microtec IEEE output
630 which I'm using to scan, whereby the comma operator is omitted
631 sometimes in an expression, giving expressions with too many
632 terms. We can tell if that's the case by ensuring that
633 sp == stack here. If not, then we've pushed something too far,
634 so we keep adding. */
635 while (sp
!= stack
+ 1)
638 ieee_symbol_index_type sy1
;
640 POP (sy1
, section1
, *extra
);
645 POP (*symbol
, dummy
, *value
);
651 #define ieee_seek(ieee, offset) \
654 ieee->h.input_p = ieee->h.first_byte + offset; \
655 ieee->h.last_byte = (ieee->h.first_byte \
656 + ieee_part_after (ieee, offset)); \
660 #define ieee_pos(ieee) \
661 (ieee->h.input_p - ieee->h.first_byte)
663 /* Find the first part of the ieee file after HERE. */
666 ieee_part_after (ieee_data_type
*ieee
, file_ptr here
)
669 file_ptr after
= ieee
->w
.r
.me_record
;
671 /* File parts can come in any order, except that module end is
672 guaranteed to be last (and the header first). */
673 for (part
= 0; part
< N_W_VARIABLES
; part
++)
674 if (ieee
->w
.offset
[part
] > here
&& after
> ieee
->w
.offset
[part
])
675 after
= ieee
->w
.offset
[part
];
680 static unsigned int last_index
;
681 static char last_type
; /* Is the index for an X or a D. */
683 static ieee_symbol_type
*
684 get_symbol (bfd
*abfd ATTRIBUTE_UNUSED
,
685 ieee_data_type
*ieee
,
686 ieee_symbol_type
*last_symbol
,
687 unsigned int *symbol_count
,
688 ieee_symbol_type
***pptr
,
689 unsigned int *max_index
,
692 /* Need a new symbol. */
693 unsigned int new_index
= must_parse_int (&(ieee
->h
));
695 if (new_index
!= last_index
|| this_type
!= last_type
)
697 ieee_symbol_type
*new_symbol
;
698 bfd_size_type amt
= sizeof (ieee_symbol_type
);
700 new_symbol
= bfd_alloc (ieee
->h
.abfd
, amt
);
704 new_symbol
->index
= new_index
;
705 last_index
= new_index
;
708 *pptr
= &new_symbol
->next
;
709 if (new_index
> *max_index
)
710 *max_index
= new_index
;
712 last_type
= this_type
;
713 new_symbol
->symbol
.section
= bfd_abs_section_ptr
;
720 ieee_slurp_external_symbols (bfd
*abfd
)
722 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
723 file_ptr offset
= ieee
->w
.r
.external_part
;
725 ieee_symbol_type
**prev_symbols_ptr
= &ieee
->external_symbols
;
726 ieee_symbol_type
**prev_reference_ptr
= &ieee
->external_reference
;
727 ieee_symbol_type
*symbol
= NULL
;
728 unsigned int symbol_count
= 0;
729 bfd_boolean loop
= TRUE
;
731 last_index
= 0xffffff;
732 ieee
->symbol_table_full
= TRUE
;
734 ieee_seek (ieee
, offset
);
738 switch (this_byte (&(ieee
->h
)))
741 next_byte (&(ieee
->h
));
743 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
745 & ieee
->external_symbol_max_index
, 'I');
749 symbol
->symbol
.the_bfd
= abfd
;
750 symbol
->symbol
.name
= read_id (&(ieee
->h
));
751 symbol
->symbol
.udata
.p
= NULL
;
752 symbol
->symbol
.flags
= BSF_NO_FLAGS
;
754 case ieee_external_symbol_enum
:
755 next_byte (&(ieee
->h
));
757 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
759 &ieee
->external_symbol_max_index
, 'D');
763 BFD_ASSERT (symbol
->index
>= ieee
->external_symbol_min_index
);
765 symbol
->symbol
.the_bfd
= abfd
;
766 symbol
->symbol
.name
= read_id (&(ieee
->h
));
767 symbol
->symbol
.udata
.p
= NULL
;
768 symbol
->symbol
.flags
= BSF_NO_FLAGS
;
770 case ieee_attribute_record_enum
>> 8:
772 unsigned int symbol_name_index
;
773 unsigned int symbol_type_index
;
774 unsigned int symbol_attribute_def
;
777 switch (read_2bytes (&ieee
->h
))
779 case ieee_attribute_record_enum
:
780 symbol_name_index
= must_parse_int (&(ieee
->h
));
781 symbol_type_index
= must_parse_int (&(ieee
->h
));
782 (void) symbol_type_index
;
783 symbol_attribute_def
= must_parse_int (&(ieee
->h
));
784 switch (symbol_attribute_def
)
788 parse_int (&ieee
->h
, &value
);
791 (*_bfd_error_handler
)
792 (_("%B: unimplemented ATI record %u for symbol %u"),
793 abfd
, symbol_attribute_def
, symbol_name_index
);
794 bfd_set_error (bfd_error_bad_value
);
799 case ieee_external_reference_info_record_enum
:
800 /* Skip over ATX record. */
801 parse_int (&(ieee
->h
), &value
);
802 parse_int (&(ieee
->h
), &value
);
803 parse_int (&(ieee
->h
), &value
);
804 parse_int (&(ieee
->h
), &value
);
806 case ieee_atn_record_enum
:
807 /* We may get call optimization information here,
808 which we just ignore. The format is
809 {$F1}${CE}{index}{$00}{$3F}{$3F}{#_of_ASNs}. */
810 parse_int (&ieee
->h
, &value
);
811 parse_int (&ieee
->h
, &value
);
812 parse_int (&ieee
->h
, &value
);
815 (*_bfd_error_handler
)
816 (_("%B: unexpected ATN type %d in external part"),
818 bfd_set_error (bfd_error_bad_value
);
821 parse_int (&ieee
->h
, &value
);
822 parse_int (&ieee
->h
, &value
);
829 switch (read_2bytes (&ieee
->h
))
831 case ieee_asn_record_enum
:
832 parse_int (&ieee
->h
, &val1
);
833 parse_int (&ieee
->h
, &val1
);
837 (*_bfd_error_handler
)
838 (_("%B: unexpected type after ATN"), abfd
);
839 bfd_set_error (bfd_error_bad_value
);
846 case ieee_value_record_enum
>> 8:
848 unsigned int symbol_name_index
;
849 ieee_symbol_index_type symbol_ignore
;
850 bfd_boolean pcrel_ignore
;
853 next_byte (&(ieee
->h
));
854 next_byte (&(ieee
->h
));
856 symbol_name_index
= must_parse_int (&(ieee
->h
));
857 (void) symbol_name_index
;
858 parse_expression (ieee
,
859 &symbol
->symbol
.value
,
863 &symbol
->symbol
.section
);
865 /* Fully linked IEEE-695 files tend to give every symbol
866 an absolute value. Try to convert that back into a
867 section relative value. FIXME: This won't always to
869 if (bfd_is_abs_section (symbol
->symbol
.section
)
870 && (abfd
->flags
& HAS_RELOC
) == 0)
875 val
= symbol
->symbol
.value
;
876 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
878 if (val
>= s
->vma
&& val
< s
->vma
+ s
->size
)
880 symbol
->symbol
.section
= s
;
881 symbol
->symbol
.value
-= s
->vma
;
887 symbol
->symbol
.flags
= BSF_GLOBAL
| BSF_EXPORT
;
891 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 default value if available. */
902 if (! parse_int (&(ieee
->h
), &value
))
904 /* This turns into a common. */
905 symbol
->symbol
.section
= bfd_com_section_ptr
;
906 symbol
->symbol
.value
= size
;
910 case ieee_external_reference_enum
:
911 next_byte (&(ieee
->h
));
913 symbol
= get_symbol (abfd
, ieee
, symbol
, &symbol_count
,
915 &ieee
->external_reference_max_index
, 'X');
919 symbol
->symbol
.the_bfd
= abfd
;
920 symbol
->symbol
.name
= read_id (&(ieee
->h
));
921 symbol
->symbol
.udata
.p
= NULL
;
922 symbol
->symbol
.section
= bfd_und_section_ptr
;
923 symbol
->symbol
.value
= (bfd_vma
) 0;
924 symbol
->symbol
.flags
= 0;
926 BFD_ASSERT (symbol
->index
>= ieee
->external_reference_min_index
);
934 if (ieee
->external_symbol_max_index
!= 0)
936 ieee
->external_symbol_count
=
937 ieee
->external_symbol_max_index
-
938 ieee
->external_symbol_min_index
+ 1;
941 ieee
->external_symbol_count
= 0;
943 if (ieee
->external_reference_max_index
!= 0)
945 ieee
->external_reference_count
=
946 ieee
->external_reference_max_index
-
947 ieee
->external_reference_min_index
+ 1;
950 ieee
->external_reference_count
= 0;
953 ieee
->external_reference_count
+ ieee
->external_symbol_count
;
955 if (symbol_count
!= abfd
->symcount
)
956 /* There are gaps in the table -- */
957 ieee
->symbol_table_full
= FALSE
;
959 *prev_symbols_ptr
= NULL
;
960 *prev_reference_ptr
= NULL
;
966 ieee_slurp_symbol_table (bfd
*abfd
)
968 if (! IEEE_DATA (abfd
)->read_symbols
)
970 if (! ieee_slurp_external_symbols (abfd
))
972 IEEE_DATA (abfd
)->read_symbols
= TRUE
;
978 ieee_get_symtab_upper_bound (bfd
*abfd
)
980 if (! ieee_slurp_symbol_table (abfd
))
983 return (abfd
->symcount
!= 0) ?
984 (abfd
->symcount
+ 1) * (sizeof (ieee_symbol_type
*)) : 0;
987 /* Move from our internal lists to the canon table, and insert in
988 symbol index order. */
990 extern const bfd_target ieee_vec
;
993 ieee_canonicalize_symtab (bfd
*abfd
, asymbol
**location
)
995 ieee_symbol_type
*symp
;
996 static bfd dummy_bfd
;
997 static asymbol empty_symbol
=
1005 /* K&R compilers can't initialise unions. */
1012 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1014 dummy_bfd
.xvec
= &ieee_vec
;
1015 if (! ieee_slurp_symbol_table (abfd
))
1018 if (! ieee
->symbol_table_full
)
1020 /* Arrgh - there are gaps in the table, run through and fill them
1021 up with pointers to a null place. */
1024 for (i
= 0; i
< abfd
->symcount
; i
++)
1025 location
[i
] = &empty_symbol
;
1028 ieee
->external_symbol_base_offset
= -ieee
->external_symbol_min_index
;
1029 for (symp
= IEEE_DATA (abfd
)->external_symbols
;
1030 symp
!= (ieee_symbol_type
*) NULL
;
1032 /* Place into table at correct index locations. */
1033 location
[symp
->index
+ ieee
->external_symbol_base_offset
] = &symp
->symbol
;
1035 /* The external refs are indexed in a bit. */
1036 ieee
->external_reference_base_offset
=
1037 -ieee
->external_reference_min_index
+ ieee
->external_symbol_count
;
1039 for (symp
= IEEE_DATA (abfd
)->external_reference
;
1040 symp
!= (ieee_symbol_type
*) NULL
;
1042 location
[symp
->index
+ ieee
->external_reference_base_offset
] =
1047 location
[abfd
->symcount
] = (asymbol
*) NULL
;
1049 return abfd
->symcount
;
1053 get_section_entry (bfd
*abfd
, ieee_data_type
*ieee
, unsigned int sindex
)
1055 if (sindex
>= ieee
->section_table_size
)
1061 c
= ieee
->section_table_size
;
1068 amt
*= sizeof (asection
*);
1069 n
= bfd_realloc (ieee
->section_table
, amt
);
1073 for (i
= ieee
->section_table_size
; i
< c
; i
++)
1076 ieee
->section_table
= n
;
1077 ieee
->section_table_size
= c
;
1080 if (ieee
->section_table
[sindex
] == (asection
*) NULL
)
1082 char *tmp
= bfd_alloc (abfd
, (bfd_size_type
) 11);
1087 sprintf (tmp
, " fsec%4d", sindex
);
1088 section
= bfd_make_section (abfd
, tmp
);
1089 ieee
->section_table
[sindex
] = section
;
1090 section
->target_index
= sindex
;
1091 ieee
->section_table
[sindex
] = section
;
1093 return ieee
->section_table
[sindex
];
1097 ieee_slurp_sections (bfd
*abfd
)
1099 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1100 file_ptr offset
= ieee
->w
.r
.section_part
;
1105 bfd_byte section_type
[3];
1107 ieee_seek (ieee
, offset
);
1110 switch (this_byte (&(ieee
->h
)))
1112 case ieee_section_type_enum
:
1115 unsigned int section_index
;
1117 next_byte (&(ieee
->h
));
1118 section_index
= must_parse_int (&(ieee
->h
));
1120 section
= get_section_entry (abfd
, ieee
, section_index
);
1122 section_type
[0] = this_byte_and_next (&(ieee
->h
));
1124 /* Set minimal section attributes. Attributes are
1125 extended later, based on section contents. */
1126 switch (section_type
[0])
1129 /* Normal attributes for absolute sections. */
1130 section_type
[1] = this_byte (&(ieee
->h
));
1131 section
->flags
= SEC_ALLOC
;
1132 switch (section_type
[1])
1134 /* AS Absolute section attributes. */
1136 next_byte (&(ieee
->h
));
1137 section_type
[2] = this_byte (&(ieee
->h
));
1138 switch (section_type
[2])
1142 next_byte (&(ieee
->h
));
1143 section
->flags
|= SEC_CODE
;
1147 next_byte (&(ieee
->h
));
1148 section
->flags
|= SEC_DATA
;
1151 next_byte (&(ieee
->h
));
1152 /* Normal rom data. */
1153 section
->flags
|= SEC_ROM
| SEC_DATA
;
1161 /* Named relocatable sections (type C). */
1163 section_type
[1] = this_byte (&(ieee
->h
));
1164 section
->flags
= SEC_ALLOC
;
1165 switch (section_type
[1])
1167 case 0xD0: /* Normal code (CP). */
1168 next_byte (&(ieee
->h
));
1169 section
->flags
|= SEC_CODE
;
1171 case 0xC4: /* Normal data (CD). */
1172 next_byte (&(ieee
->h
));
1173 section
->flags
|= SEC_DATA
;
1175 case 0xD2: /* Normal rom data (CR). */
1176 next_byte (&(ieee
->h
));
1177 section
->flags
|= SEC_ROM
| SEC_DATA
;
1184 /* Read section name, use it if non empty. */
1185 name
= read_id (&ieee
->h
);
1187 section
->name
= name
;
1189 /* Skip these fields, which we don't care about. */
1191 bfd_vma parent
, brother
, context
;
1193 parse_int (&(ieee
->h
), &parent
);
1194 parse_int (&(ieee
->h
), &brother
);
1195 parse_int (&(ieee
->h
), &context
);
1199 case ieee_section_alignment_enum
:
1201 unsigned int section_index
;
1205 next_byte (&(ieee
->h
));
1206 section_index
= must_parse_int (&ieee
->h
);
1207 section
= get_section_entry (abfd
, ieee
, section_index
);
1208 if (section_index
> ieee
->section_count
)
1209 ieee
->section_count
= section_index
;
1211 section
->alignment_power
=
1212 bfd_log2 (must_parse_int (&ieee
->h
));
1213 (void) parse_int (&(ieee
->h
), &value
);
1216 case ieee_e2_first_byte_enum
:
1219 ieee_record_enum_type t
;
1221 t
= (ieee_record_enum_type
) (read_2bytes (&(ieee
->h
)));
1224 case ieee_section_size_enum
:
1225 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1226 section
->size
= must_parse_int (&(ieee
->h
));
1228 case ieee_physical_region_size_enum
:
1229 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1230 section
->size
= must_parse_int (&(ieee
->h
));
1232 case ieee_region_base_address_enum
:
1233 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1234 section
->vma
= must_parse_int (&(ieee
->h
));
1235 section
->lma
= section
->vma
;
1237 case ieee_mau_size_enum
:
1238 must_parse_int (&(ieee
->h
));
1239 must_parse_int (&(ieee
->h
));
1241 case ieee_m_value_enum
:
1242 must_parse_int (&(ieee
->h
));
1243 must_parse_int (&(ieee
->h
));
1245 case ieee_section_base_address_enum
:
1246 section
= ieee
->section_table
[must_parse_int (&(ieee
->h
))];
1247 section
->vma
= must_parse_int (&(ieee
->h
));
1248 section
->lma
= section
->vma
;
1250 case ieee_section_offset_enum
:
1251 (void) must_parse_int (&(ieee
->h
));
1252 (void) must_parse_int (&(ieee
->h
));
1266 /* Make a section for the debugging information, if any. We don't try
1267 to interpret the debugging information; we just point the section
1268 at the area in the file so that program which understand can dig it
1272 ieee_slurp_debug (bfd
*abfd
)
1274 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1279 if (ieee
->w
.r
.debug_information_part
== 0)
1282 flags
= SEC_DEBUGGING
| SEC_HAS_CONTENTS
;
1283 sec
= bfd_make_section_with_flags (abfd
, ".debug", flags
);
1286 sec
->filepos
= ieee
->w
.r
.debug_information_part
;
1288 debug_end
= ieee_part_after (ieee
, ieee
->w
.r
.debug_information_part
);
1289 sec
->size
= debug_end
- ieee
->w
.r
.debug_information_part
;
1294 /* Archive stuff. */
1296 static const bfd_target
*
1297 ieee_archive_p (bfd
*abfd
)
1301 unsigned char buffer
[512];
1302 file_ptr buffer_offset
= 0;
1303 ieee_ar_data_type
*save
= abfd
->tdata
.ieee_ar_data
;
1304 ieee_ar_data_type
*ieee
;
1305 bfd_size_type alc_elts
;
1306 ieee_ar_obstack_type
*elts
= NULL
;
1307 bfd_size_type amt
= sizeof (ieee_ar_data_type
);
1309 abfd
->tdata
.ieee_ar_data
= bfd_alloc (abfd
, amt
);
1310 if (!abfd
->tdata
.ieee_ar_data
)
1311 goto error_ret_restore
;
1312 ieee
= IEEE_AR_DATA (abfd
);
1314 /* Ignore the return value here. It doesn't matter if we don't read
1315 the entire buffer. We might have a very small ieee file. */
1316 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1318 ieee
->h
.first_byte
= buffer
;
1319 ieee
->h
.input_p
= buffer
;
1321 ieee
->h
.abfd
= abfd
;
1323 if (this_byte (&(ieee
->h
)) != Module_Beginning
)
1324 goto got_wrong_format_error
;
1326 next_byte (&(ieee
->h
));
1327 library
= read_id (&(ieee
->h
));
1328 if (strcmp (library
, "LIBRARY") != 0)
1329 goto got_wrong_format_error
;
1331 /* Throw away the filename. */
1332 read_id (&(ieee
->h
));
1334 ieee
->element_count
= 0;
1335 ieee
->element_index
= 0;
1337 next_byte (&(ieee
->h
)); /* Drop the ad part. */
1338 must_parse_int (&(ieee
->h
)); /* And the two dummy numbers. */
1339 must_parse_int (&(ieee
->h
));
1342 elts
= bfd_malloc (alc_elts
* sizeof *elts
);
1346 /* Read the index of the BB table. */
1350 ieee_ar_obstack_type
*t
;
1352 rec
= read_2bytes (&(ieee
->h
));
1353 if (rec
!= (int) ieee_assign_value_to_variable_enum
)
1356 if (ieee
->element_count
>= alc_elts
)
1358 ieee_ar_obstack_type
*n
;
1361 n
= bfd_realloc (elts
, alc_elts
* sizeof (* elts
));
1367 t
= &elts
[ieee
->element_count
];
1368 ieee
->element_count
++;
1370 must_parse_int (&(ieee
->h
));
1371 t
->file_offset
= must_parse_int (&(ieee
->h
));
1372 t
->abfd
= (bfd
*) NULL
;
1374 /* Make sure that we don't go over the end of the buffer. */
1375 if ((size_t) ieee_pos (IEEE_DATA (abfd
)) > sizeof (buffer
) / 2)
1377 /* Past half way, reseek and reprime. */
1378 buffer_offset
+= ieee_pos (IEEE_DATA (abfd
));
1379 if (bfd_seek (abfd
, buffer_offset
, SEEK_SET
) != 0)
1382 /* Again ignore return value of bfd_bread. */
1383 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1384 ieee
->h
.first_byte
= buffer
;
1385 ieee
->h
.input_p
= buffer
;
1389 amt
= ieee
->element_count
;
1390 amt
*= sizeof *ieee
->elements
;
1391 ieee
->elements
= bfd_alloc (abfd
, amt
);
1392 if (ieee
->elements
== NULL
)
1395 memcpy (ieee
->elements
, elts
, (size_t) amt
);
1399 /* Now scan the area again, and replace BB offsets with file offsets. */
1400 for (i
= 2; i
< ieee
->element_count
; i
++)
1402 if (bfd_seek (abfd
, ieee
->elements
[i
].file_offset
, SEEK_SET
) != 0)
1405 /* Again ignore return value of bfd_bread. */
1406 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1407 ieee
->h
.first_byte
= buffer
;
1408 ieee
->h
.input_p
= buffer
;
1410 next_byte (&(ieee
->h
)); /* Drop F8. */
1411 next_byte (&(ieee
->h
)); /* Drop 14. */
1412 must_parse_int (&(ieee
->h
)); /* Drop size of block. */
1414 if (must_parse_int (&(ieee
->h
)) != 0)
1415 /* This object has been deleted. */
1416 ieee
->elements
[i
].file_offset
= 0;
1418 ieee
->elements
[i
].file_offset
= must_parse_int (&(ieee
->h
));
1421 /* abfd->has_armap = ;*/
1425 got_wrong_format_error
:
1426 bfd_set_error (bfd_error_wrong_format
);
1430 bfd_release (abfd
, ieee
);
1432 abfd
->tdata
.ieee_ar_data
= save
;
1438 ieee_mkobject (bfd
*abfd
)
1442 output_ptr_start
= NULL
;
1444 output_ptr_end
= NULL
;
1445 input_ptr_start
= NULL
;
1447 input_ptr_end
= NULL
;
1451 amt
= sizeof (ieee_data_type
);
1452 abfd
->tdata
.ieee_data
= bfd_zalloc (abfd
, amt
);
1453 return abfd
->tdata
.ieee_data
!= NULL
;
1457 do_one (ieee_data_type
*ieee
,
1458 ieee_per_section_type
*current_map
,
1459 unsigned char *location_ptr
,
1463 switch (this_byte (&(ieee
->h
)))
1465 case ieee_load_constant_bytes_enum
:
1467 unsigned int number_of_maus
;
1470 next_byte (&(ieee
->h
));
1471 number_of_maus
= must_parse_int (&(ieee
->h
));
1473 for (i
= 0; i
< number_of_maus
; i
++)
1475 location_ptr
[current_map
->pc
++] = this_byte (&(ieee
->h
));
1476 next_byte (&(ieee
->h
));
1481 case ieee_load_with_relocation_enum
:
1483 bfd_boolean loop
= TRUE
;
1485 next_byte (&(ieee
->h
));
1488 switch (this_byte (&(ieee
->h
)))
1490 case ieee_variable_R_enum
:
1492 case ieee_function_signed_open_b_enum
:
1493 case ieee_function_unsigned_open_b_enum
:
1494 case ieee_function_either_open_b_enum
:
1496 unsigned int extra
= 4;
1497 bfd_boolean pcrel
= FALSE
;
1501 r
= bfd_alloc (ieee
->h
.abfd
, sizeof (* r
));
1505 *(current_map
->reloc_tail_ptr
) = r
;
1506 current_map
->reloc_tail_ptr
= &r
->next
;
1507 r
->next
= (ieee_reloc_type
*) NULL
;
1508 next_byte (&(ieee
->h
));
1510 r
->relent
.sym_ptr_ptr
= 0;
1511 parse_expression (ieee
,
1514 &pcrel
, &extra
, §ion
);
1515 r
->relent
.address
= current_map
->pc
;
1516 s
->flags
|= SEC_RELOC
;
1517 s
->owner
->flags
|= HAS_RELOC
;
1519 if (r
->relent
.sym_ptr_ptr
== NULL
&& section
!= NULL
)
1520 r
->relent
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
1522 if (this_byte (&(ieee
->h
)) == (int) ieee_comma
)
1524 next_byte (&(ieee
->h
));
1525 /* Fetch number of bytes to pad. */
1526 extra
= must_parse_int (&(ieee
->h
));
1529 switch (this_byte (&(ieee
->h
)))
1531 case ieee_function_signed_close_b_enum
:
1532 next_byte (&(ieee
->h
));
1534 case ieee_function_unsigned_close_b_enum
:
1535 next_byte (&(ieee
->h
));
1537 case ieee_function_either_close_b_enum
:
1538 next_byte (&(ieee
->h
));
1543 /* Build a relocation entry for this type. */
1544 /* If pc rel then stick -ve pc into instruction
1545 and take out of reloc ..
1547 I've changed this. It's all too complicated. I
1548 keep 0 in the instruction now. */
1557 #if KEEPMINUSPCININST
1558 bfd_put_32 (ieee
->h
.abfd
, -current_map
->pc
,
1559 location_ptr
+ current_map
->pc
);
1560 r
->relent
.howto
= &rel32_howto
;
1561 r
->relent
.addend
-= current_map
->pc
;
1563 bfd_put_32 (ieee
->h
.abfd
, (bfd_vma
) 0, location_ptr
+
1565 r
->relent
.howto
= &rel32_howto
;
1570 bfd_put_32 (ieee
->h
.abfd
, (bfd_vma
) 0,
1571 location_ptr
+ current_map
->pc
);
1572 r
->relent
.howto
= &abs32_howto
;
1574 current_map
->pc
+= 4;
1579 #if KEEPMINUSPCININST
1580 bfd_put_16 (ieee
->h
.abfd
, (bfd_vma
) -current_map
->pc
,
1581 location_ptr
+ current_map
->pc
);
1582 r
->relent
.addend
-= current_map
->pc
;
1583 r
->relent
.howto
= &rel16_howto
;
1586 bfd_put_16 (ieee
->h
.abfd
, (bfd_vma
) 0,
1587 location_ptr
+ current_map
->pc
);
1588 r
->relent
.howto
= &rel16_howto
;
1594 bfd_put_16 (ieee
->h
.abfd
, (bfd_vma
) 0,
1595 location_ptr
+ current_map
->pc
);
1596 r
->relent
.howto
= &abs16_howto
;
1598 current_map
->pc
+= 2;
1603 #if KEEPMINUSPCININST
1604 bfd_put_8 (ieee
->h
.abfd
, (int) (-current_map
->pc
), location_ptr
+ current_map
->pc
);
1605 r
->relent
.addend
-= current_map
->pc
;
1606 r
->relent
.howto
= &rel8_howto
;
1608 bfd_put_8 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1609 r
->relent
.howto
= &rel8_howto
;
1614 bfd_put_8 (ieee
->h
.abfd
, 0, location_ptr
+ current_map
->pc
);
1615 r
->relent
.howto
= &abs8_howto
;
1617 current_map
->pc
+= 1;
1630 if (parse_int (&(ieee
->h
), &this_size
))
1634 for (i
= 0; i
< this_size
; i
++)
1636 location_ptr
[current_map
->pc
++] = this_byte (&(ieee
->h
));
1637 next_byte (&(ieee
->h
));
1645 /* Prevent more than the first load-item of an LR record
1646 from being repeated (MRI convention). */
1647 if (iterations
!= 1)
1655 /* Read in all the section data and relocation stuff too. */
1658 ieee_slurp_section_data (bfd
*abfd
)
1660 bfd_byte
*location_ptr
= (bfd_byte
*) NULL
;
1661 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
1662 unsigned int section_number
;
1663 ieee_per_section_type
*current_map
= NULL
;
1666 /* Seek to the start of the data area. */
1667 if (ieee
->read_data
)
1669 ieee
->read_data
= TRUE
;
1670 ieee_seek (ieee
, ieee
->w
.r
.data_part
);
1672 /* Allocate enough space for all the section contents. */
1673 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
1675 ieee_per_section_type
*per
= ieee_per_section (s
);
1678 if ((s
->flags
& SEC_DEBUGGING
) != 0)
1680 per
->data
= bfd_alloc (ieee
->h
.abfd
, s
->size
);
1683 relpp
= &s
->relocation
;
1684 per
->reloc_tail_ptr
= (ieee_reloc_type
**) relpp
;
1689 switch (this_byte (&(ieee
->h
)))
1691 /* IF we see anything strange then quit. */
1695 case ieee_set_current_section_enum
:
1696 next_byte (&(ieee
->h
));
1697 section_number
= must_parse_int (&(ieee
->h
));
1698 s
= ieee
->section_table
[section_number
];
1699 s
->flags
|= SEC_LOAD
| SEC_HAS_CONTENTS
;
1700 current_map
= ieee_per_section (s
);
1701 location_ptr
= current_map
->data
- s
->vma
;
1702 /* The document I have says that Microtec's compilers reset
1703 this after a sec section, even though the standard says not
1705 current_map
->pc
= s
->vma
;
1708 case ieee_e2_first_byte_enum
:
1709 next_byte (&(ieee
->h
));
1710 switch (this_byte (&(ieee
->h
)))
1712 case ieee_set_current_pc_enum
& 0xff:
1715 ieee_symbol_index_type symbol
;
1719 next_byte (&(ieee
->h
));
1720 must_parse_int (&(ieee
->h
)); /* Throw away section #. */
1721 parse_expression (ieee
, &value
,
1725 current_map
->pc
= value
;
1726 BFD_ASSERT ((unsigned) (value
- s
->vma
) <= s
->size
);
1730 case ieee_value_starting_address_enum
& 0xff:
1731 next_byte (&(ieee
->h
));
1732 if (this_byte (&(ieee
->h
)) == ieee_function_either_open_b_enum
)
1733 next_byte (&(ieee
->h
));
1734 abfd
->start_address
= must_parse_int (&(ieee
->h
));
1735 /* We've got to the end of the data now - */
1742 case ieee_repeat_data_enum
:
1744 /* Repeat the following LD or LR n times - we do this by
1745 remembering the stream pointer before running it and
1746 resetting it and running it n times. We special case
1747 the repetition of a repeat_data/load_constant. */
1748 unsigned int iterations
;
1749 unsigned char *start
;
1751 next_byte (&(ieee
->h
));
1752 iterations
= must_parse_int (&(ieee
->h
));
1753 start
= ieee
->h
.input_p
;
1754 if (start
[0] == (int) ieee_load_constant_bytes_enum
1757 while (iterations
!= 0)
1759 location_ptr
[current_map
->pc
++] = start
[2];
1762 next_byte (&(ieee
->h
));
1763 next_byte (&(ieee
->h
));
1764 next_byte (&(ieee
->h
));
1768 while (iterations
!= 0)
1770 ieee
->h
.input_p
= start
;
1771 if (!do_one (ieee
, current_map
, location_ptr
, s
,
1779 case ieee_load_constant_bytes_enum
:
1780 case ieee_load_with_relocation_enum
:
1781 if (!do_one (ieee
, current_map
, location_ptr
, s
, 1))
1787 static const bfd_target
*
1788 ieee_object_p (bfd
*abfd
)
1792 ieee_data_type
*ieee
;
1793 unsigned char buffer
[300];
1794 ieee_data_type
*save
= IEEE_DATA (abfd
);
1797 abfd
->tdata
.ieee_data
= 0;
1798 ieee_mkobject (abfd
);
1800 ieee
= IEEE_DATA (abfd
);
1801 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1803 /* Read the first few bytes in to see if it makes sense. Ignore
1804 bfd_bread return value; The file might be very small. */
1805 bfd_bread ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
);
1807 ieee
->h
.input_p
= buffer
;
1808 if (this_byte_and_next (&(ieee
->h
)) != Module_Beginning
)
1809 goto got_wrong_format
;
1811 ieee
->read_symbols
= FALSE
;
1812 ieee
->read_data
= FALSE
;
1813 ieee
->section_count
= 0;
1814 ieee
->external_symbol_max_index
= 0;
1815 ieee
->external_symbol_min_index
= IEEE_PUBLIC_BASE
;
1816 ieee
->external_reference_min_index
= IEEE_REFERENCE_BASE
;
1817 ieee
->external_reference_max_index
= 0;
1818 ieee
->h
.abfd
= abfd
;
1819 ieee
->section_table
= NULL
;
1820 ieee
->section_table_size
= 0;
1822 processor
= ieee
->mb
.processor
= read_id (&(ieee
->h
));
1823 if (strcmp (processor
, "LIBRARY") == 0)
1824 goto got_wrong_format
;
1825 ieee
->mb
.module_name
= read_id (&(ieee
->h
));
1826 if (abfd
->filename
== (const char *) NULL
)
1827 abfd
->filename
= ieee
->mb
.module_name
;
1829 /* Determine the architecture and machine type of the object file. */
1831 const bfd_arch_info_type
*arch
;
1834 /* IEEE does not specify the format of the processor identification
1835 string, so the compiler is free to put in it whatever it wants.
1836 We try here to recognize different processors belonging to the
1837 m68k family. Code for other processors can be added here. */
1838 if ((processor
[0] == '6') && (processor
[1] == '8'))
1840 if (processor
[2] == '3') /* 683xx integrated processors. */
1842 switch (processor
[3])
1844 case '0': /* 68302, 68306, 68307 */
1845 case '2': /* 68322, 68328 */
1846 case '5': /* 68356 */
1847 strcpy (family
, "68000"); /* MC68000-based controllers. */
1850 case '3': /* 68330, 68331, 68332, 68333,
1851 68334, 68335, 68336, 68338 */
1852 case '6': /* 68360 */
1853 case '7': /* 68376 */
1854 strcpy (family
, "68332"); /* CPU32 and CPU32+ */
1858 if (processor
[4] == '9') /* 68349 */
1859 strcpy (family
, "68030"); /* CPU030 */
1860 else /* 68340, 68341 */
1861 strcpy (family
, "68332"); /* CPU32 and CPU32+ */
1864 default: /* Does not exist yet. */
1865 strcpy (family
, "68332"); /* Guess it will be CPU32 */
1868 else if (TOUPPER (processor
[3]) == 'F') /* 68F333 */
1869 strcpy (family
, "68332"); /* CPU32 */
1870 else if ((TOUPPER (processor
[3]) == 'C') /* Embedded controllers. */
1871 && ((TOUPPER (processor
[2]) == 'E')
1872 || (TOUPPER (processor
[2]) == 'H')
1873 || (TOUPPER (processor
[2]) == 'L')))
1875 strcpy (family
, "68");
1876 strncat (family
, processor
+ 4, 7);
1879 else /* "Regular" processors. */
1881 strncpy (family
, processor
, 9);
1885 else if ((CONST_STRNEQ (processor
, "cpu32")) /* CPU32 and CPU32+ */
1886 || (CONST_STRNEQ (processor
, "CPU32")))
1887 strcpy (family
, "68332");
1890 strncpy (family
, processor
, 9);
1894 arch
= bfd_scan_arch (family
);
1896 goto got_wrong_format
;
1897 abfd
->arch_info
= arch
;
1900 if (this_byte (&(ieee
->h
)) != (int) ieee_address_descriptor_enum
)
1903 next_byte (&(ieee
->h
));
1905 if (! parse_int (&(ieee
->h
), &ieee
->ad
.number_of_bits_mau
))
1908 if (! parse_int (&(ieee
->h
), &ieee
->ad
.number_of_maus_in_address
))
1911 /* If there is a byte order info, take it. */
1912 if (this_byte (&(ieee
->h
)) == (int) ieee_variable_L_enum
1913 || this_byte (&(ieee
->h
)) == (int) ieee_variable_M_enum
)
1914 next_byte (&(ieee
->h
));
1916 for (part
= 0; part
< N_W_VARIABLES
; part
++)
1920 if (read_2bytes (&(ieee
->h
)) != (int) ieee_assign_value_to_variable_enum
)
1923 if (this_byte_and_next (&(ieee
->h
)) != part
)
1926 ieee
->w
.offset
[part
] = parse_i (&(ieee
->h
), &ok
);
1931 if (ieee
->w
.r
.external_part
!= 0)
1932 abfd
->flags
= HAS_SYMS
;
1934 /* By now we know that this is a real IEEE file, we're going to read
1935 the whole thing into memory so that we can run up and down it
1936 quickly. We can work out how big the file is from the trailer
1939 amt
= ieee
->w
.r
.me_record
+ 1;
1940 IEEE_DATA (abfd
)->h
.first_byte
= bfd_alloc (ieee
->h
.abfd
, amt
);
1941 if (!IEEE_DATA (abfd
)->h
.first_byte
)
1943 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
1945 /* FIXME: Check return value. I'm not sure whether it needs to read
1946 the entire buffer or not. */
1947 bfd_bread ((void *) (IEEE_DATA (abfd
)->h
.first_byte
),
1948 (bfd_size_type
) ieee
->w
.r
.me_record
+ 1, abfd
);
1950 ieee_slurp_sections (abfd
);
1952 if (! ieee_slurp_debug (abfd
))
1955 /* Parse section data to activate file and section flags implied by
1956 section contents. */
1957 if (! ieee_slurp_section_data (abfd
))
1962 bfd_set_error (bfd_error_wrong_format
);
1964 bfd_release (abfd
, ieee
);
1965 abfd
->tdata
.ieee_data
= save
;
1966 return (const bfd_target
*) NULL
;
1970 ieee_get_symbol_info (bfd
*ignore_abfd ATTRIBUTE_UNUSED
,
1974 bfd_symbol_info (symbol
, ret
);
1975 if (symbol
->name
[0] == ' ')
1976 ret
->name
= "* empty table entry ";
1977 if (!symbol
->section
)
1978 ret
->type
= (symbol
->flags
& BSF_LOCAL
) ? 'a' : 'A';
1982 ieee_print_symbol (bfd
*abfd
,
1985 bfd_print_symbol_type how
)
1987 FILE *file
= (FILE *) afile
;
1991 case bfd_print_symbol_name
:
1992 fprintf (file
, "%s", symbol
->name
);
1994 case bfd_print_symbol_more
:
1997 case bfd_print_symbol_all
:
1999 const char *section_name
=
2000 (symbol
->section
== (asection
*) NULL
2002 : symbol
->section
->name
);
2004 if (symbol
->name
[0] == ' ')
2005 fprintf (file
, "* empty table entry ");
2008 bfd_print_symbol_vandf (abfd
, (void *) file
, symbol
);
2010 fprintf (file
, " %-5s %04x %02x %s",
2012 (unsigned) ieee_symbol (symbol
)->index
,
2022 ieee_new_section_hook (bfd
*abfd
, asection
*newsect
)
2024 if (!newsect
->used_by_bfd
)
2026 newsect
->used_by_bfd
= bfd_alloc (abfd
, sizeof (ieee_per_section_type
));
2027 if (!newsect
->used_by_bfd
)
2030 ieee_per_section (newsect
)->data
= NULL
;
2031 ieee_per_section (newsect
)->section
= newsect
;
2032 return _bfd_generic_new_section_hook (abfd
, newsect
);
2036 ieee_get_reloc_upper_bound (bfd
*abfd
, sec_ptr asect
)
2038 if ((asect
->flags
& SEC_DEBUGGING
) != 0)
2040 if (! ieee_slurp_section_data (abfd
))
2042 return (asect
->reloc_count
+ 1) * sizeof (arelent
*);
2046 ieee_get_section_contents (bfd
*abfd
,
2050 bfd_size_type count
)
2052 ieee_per_section_type
*p
= ieee_per_section (section
);
2053 if ((section
->flags
& SEC_DEBUGGING
) != 0)
2054 return _bfd_generic_get_section_contents (abfd
, section
, location
,
2056 ieee_slurp_section_data (abfd
);
2057 (void) memcpy ((void *) location
, (void *) (p
->data
+ offset
), (unsigned) count
);
2062 ieee_canonicalize_reloc (bfd
*abfd
,
2067 ieee_reloc_type
*src
= (ieee_reloc_type
*) (section
->relocation
);
2068 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
2070 if ((section
->flags
& SEC_DEBUGGING
) != 0)
2073 while (src
!= (ieee_reloc_type
*) NULL
)
2075 /* Work out which symbol to attach it this reloc to. */
2076 switch (src
->symbol
.letter
)
2079 src
->relent
.sym_ptr_ptr
=
2080 symbols
+ src
->symbol
.index
+ ieee
->external_symbol_base_offset
;
2083 src
->relent
.sym_ptr_ptr
=
2084 symbols
+ src
->symbol
.index
+ ieee
->external_reference_base_offset
;
2087 if (src
->relent
.sym_ptr_ptr
!= NULL
)
2088 src
->relent
.sym_ptr_ptr
=
2089 src
->relent
.sym_ptr_ptr
[0]->section
->symbol_ptr_ptr
;
2095 *relptr
++ = &src
->relent
;
2099 return section
->reloc_count
;
2103 comp (const void * ap
, const void * bp
)
2105 arelent
*a
= *((arelent
**) ap
);
2106 arelent
*b
= *((arelent
**) bp
);
2107 return a
->address
- b
->address
;
2110 /* Write the section headers. */
2113 ieee_write_section_part (bfd
*abfd
)
2115 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
2118 ieee
->w
.r
.section_part
= bfd_tell (abfd
);
2119 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
2121 if (! bfd_is_abs_section (s
)
2122 && (s
->flags
& SEC_DEBUGGING
) == 0)
2124 if (! ieee_write_byte (abfd
, ieee_section_type_enum
)
2125 || ! ieee_write_byte (abfd
,
2126 (bfd_byte
) (s
->index
2127 + IEEE_SECTION_NUMBER_BASE
)))
2130 if (abfd
->flags
& EXEC_P
)
2132 /* This image is executable, so output absolute sections. */
2133 if (! ieee_write_byte (abfd
, ieee_variable_A_enum
)
2134 || ! ieee_write_byte (abfd
, ieee_variable_S_enum
))
2139 if (! ieee_write_byte (abfd
, ieee_variable_C_enum
))
2143 switch (s
->flags
& (SEC_CODE
| SEC_DATA
| SEC_ROM
))
2145 case SEC_CODE
| SEC_LOAD
:
2147 if (! ieee_write_byte (abfd
, ieee_variable_P_enum
))
2152 if (! ieee_write_byte (abfd
, ieee_variable_D_enum
))
2156 case SEC_ROM
| SEC_DATA
:
2157 case SEC_ROM
| SEC_LOAD
:
2158 case SEC_ROM
| SEC_DATA
| SEC_LOAD
:
2159 if (! ieee_write_byte (abfd
, ieee_variable_R_enum
))
2164 if (! ieee_write_id (abfd
, s
->name
))
2167 if (! ieee_write_byte (abfd
, ieee_section_alignment_enum
)
2168 || ! ieee_write_byte (abfd
,
2169 (bfd_byte
) (s
->index
2170 + IEEE_SECTION_NUMBER_BASE
))
2171 || ! ieee_write_int (abfd
, (bfd_vma
) 1 << s
->alignment_power
))
2175 if (! ieee_write_2bytes (abfd
, ieee_section_size_enum
)
2176 || ! ieee_write_byte (abfd
,
2177 (bfd_byte
) (s
->index
2178 + IEEE_SECTION_NUMBER_BASE
))
2179 || ! ieee_write_int (abfd
, s
->size
))
2181 if (abfd
->flags
& EXEC_P
)
2183 /* Relocateable sections don't have asl records. */
2185 if (! ieee_write_2bytes (abfd
, ieee_section_base_address_enum
)
2186 || ! ieee_write_byte (abfd
,
2189 + IEEE_SECTION_NUMBER_BASE
)))
2190 || ! ieee_write_int (abfd
, s
->lma
))
2200 do_with_relocs (bfd
*abfd
, asection
*s
)
2202 unsigned int number_of_maus_in_address
=
2203 bfd_arch_bits_per_address (abfd
) / bfd_arch_bits_per_byte (abfd
);
2204 unsigned int relocs_to_go
= s
->reloc_count
;
2205 bfd_byte
*stream
= ieee_per_section (s
)->data
;
2206 arelent
**p
= s
->orelocation
;
2207 bfd_size_type current_byte_index
= 0;
2209 qsort (s
->orelocation
,
2211 sizeof (arelent
**),
2214 /* Output the section preheader. */
2215 if (! ieee_write_byte (abfd
, ieee_set_current_section_enum
)
2216 || ! ieee_write_byte (abfd
,
2217 (bfd_byte
) (s
->index
+ IEEE_SECTION_NUMBER_BASE
))
2218 || ! ieee_write_2bytes (abfd
, ieee_set_current_pc_enum
)
2219 || ! ieee_write_byte (abfd
,
2220 (bfd_byte
) (s
->index
+ IEEE_SECTION_NUMBER_BASE
)))
2223 if ((abfd
->flags
& EXEC_P
) != 0 && relocs_to_go
== 0)
2225 if (! ieee_write_int (abfd
, s
->lma
))
2230 if (! ieee_write_expression (abfd
, (bfd_vma
) 0, s
->symbol
, 0, 0))
2234 if (relocs_to_go
== 0)
2236 /* If there aren't any relocations then output the load constant
2237 byte opcode rather than the load with relocation opcode. */
2238 while (current_byte_index
< s
->size
)
2241 unsigned int MAXRUN
= 127;
2244 if (run
> s
->size
- current_byte_index
)
2245 run
= s
->size
- current_byte_index
;
2249 if (! ieee_write_byte (abfd
, ieee_load_constant_bytes_enum
))
2251 /* Output a stream of bytes. */
2252 if (! ieee_write_int (abfd
, run
))
2254 if (bfd_bwrite ((void *) (stream
+ current_byte_index
), run
, abfd
)
2257 current_byte_index
+= run
;
2263 if (! ieee_write_byte (abfd
, ieee_load_with_relocation_enum
))
2266 /* Output the data stream as the longest sequence of bytes
2267 possible, allowing for the a reasonable packet size and
2268 relocation stuffs. */
2271 /* Outputting a section without data, fill it up. */
2272 stream
= bfd_zalloc (abfd
, s
->size
);
2276 while (current_byte_index
< s
->size
)
2279 unsigned int MAXRUN
= 127;
2283 run
= (*p
)->address
- current_byte_index
;
2290 if (run
> s
->size
- current_byte_index
)
2291 run
= s
->size
- current_byte_index
;
2295 /* Output a stream of bytes. */
2296 if (! ieee_write_int (abfd
, run
))
2298 if (bfd_bwrite ((void *) (stream
+ current_byte_index
), run
, abfd
)
2301 current_byte_index
+= run
;
2304 /* Output any relocations here. */
2305 if (relocs_to_go
&& (*p
) && (*p
)->address
== current_byte_index
)
2308 && (*p
) && (*p
)->address
== current_byte_index
)
2312 switch (r
->howto
->size
)
2315 ov
= bfd_get_signed_32 (abfd
,
2316 stream
+ current_byte_index
);
2317 current_byte_index
+= 4;
2320 ov
= bfd_get_signed_16 (abfd
,
2321 stream
+ current_byte_index
);
2322 current_byte_index
+= 2;
2325 ov
= bfd_get_signed_8 (abfd
,
2326 stream
+ current_byte_index
);
2327 current_byte_index
++;
2335 ov
&= r
->howto
->src_mask
;
2337 if (r
->howto
->pc_relative
2338 && ! r
->howto
->pcrel_offset
)
2341 if (! ieee_write_byte (abfd
,
2342 ieee_function_either_open_b_enum
))
2345 if (r
->sym_ptr_ptr
!= (asymbol
**) NULL
)
2347 if (! ieee_write_expression (abfd
, r
->addend
+ ov
,
2349 r
->howto
->pc_relative
,
2350 (unsigned) s
->index
))
2355 if (! ieee_write_expression (abfd
, r
->addend
+ ov
,
2357 r
->howto
->pc_relative
,
2358 (unsigned) s
->index
))
2362 if (number_of_maus_in_address
2363 != bfd_get_reloc_size (r
->howto
))
2365 bfd_vma rsize
= bfd_get_reloc_size (r
->howto
);
2366 if (! ieee_write_int (abfd
, rsize
))
2369 if (! ieee_write_byte (abfd
,
2370 ieee_function_either_close_b_enum
))
2384 /* If there are no relocations in the output section then we can be
2385 clever about how we write. We block items up into a max of 127
2389 do_as_repeat (bfd
*abfd
, asection
*s
)
2393 if (! ieee_write_byte (abfd
, ieee_set_current_section_enum
)
2394 || ! ieee_write_byte (abfd
,
2395 (bfd_byte
) (s
->index
2396 + IEEE_SECTION_NUMBER_BASE
))
2397 || ! ieee_write_byte (abfd
, ieee_set_current_pc_enum
>> 8)
2398 || ! ieee_write_byte (abfd
, ieee_set_current_pc_enum
& 0xff)
2399 || ! ieee_write_byte (abfd
,
2400 (bfd_byte
) (s
->index
2401 + IEEE_SECTION_NUMBER_BASE
)))
2404 if ((abfd
->flags
& EXEC_P
) != 0)
2406 if (! ieee_write_int (abfd
, s
->lma
))
2411 if (! ieee_write_expression (abfd
, (bfd_vma
) 0, s
->symbol
, 0, 0))
2415 if (! ieee_write_byte (abfd
, ieee_repeat_data_enum
)
2416 || ! ieee_write_int (abfd
, s
->size
)
2417 || ! ieee_write_byte (abfd
, ieee_load_constant_bytes_enum
)
2418 || ! ieee_write_byte (abfd
, 1)
2419 || ! ieee_write_byte (abfd
, 0))
2427 do_without_relocs (bfd
*abfd
, asection
*s
)
2429 bfd_byte
*stream
= ieee_per_section (s
)->data
;
2431 if (stream
== 0 || ((s
->flags
& SEC_LOAD
) == 0))
2433 if (! do_as_repeat (abfd
, s
))
2440 for (i
= 0; i
< s
->size
; i
++)
2444 if (! do_with_relocs (abfd
, s
))
2449 if (! do_as_repeat (abfd
, s
))
2459 bfd_size_type amt
= input_ptr_end
- input_ptr_start
;
2460 /* FIXME: Check return value. I'm not sure whether it needs to read
2461 the entire buffer or not. */
2462 bfd_bread ((void *) input_ptr_start
, amt
, input_bfd
);
2463 input_ptr
= input_ptr_start
;
2469 bfd_size_type amt
= output_ptr
- output_ptr_start
;
2471 if (bfd_bwrite ((void *) (output_ptr_start
), amt
, output_bfd
) != amt
)
2473 output_ptr
= output_ptr_start
;
2477 #define THIS() ( *input_ptr )
2478 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill (); }
2479 #define OUT(x) { *output_ptr++ = (x); if (output_ptr == output_ptr_end) flush (); }
2482 write_int (int value
)
2484 if (value
>= 0 && value
<= 127)
2490 unsigned int length
;
2492 /* How many significant bytes ? */
2493 /* FIXME FOR LONGER INTS. */
2494 if (value
& 0xff000000)
2496 else if (value
& 0x00ff0000)
2498 else if (value
& 0x0000ff00)
2503 OUT ((int) ieee_number_repeat_start_enum
+ length
);
2521 int length
= THIS ();
2534 #define VAR(x) ((x | 0x80))
2536 copy_expression (void)
2550 value
= (value
<< 8) | THIS ();
2552 value
= (value
<< 8) | THIS ();
2554 value
= (value
<< 8) | THIS ();
2562 value
= (value
<< 8) | THIS ();
2564 value
= (value
<< 8) | THIS ();
2572 value
= (value
<< 8) | THIS ();
2589 /* Not a number, just bug out with the answer. */
2590 write_int (*(--tos
));
2597 /* PLUS anything. */
2606 ieee_data_type
*ieee
;
2610 section_number
= THIS ();
2613 ieee
= IEEE_DATA (input_bfd
);
2614 s
= ieee
->section_table
[section_number
];
2616 if (s
->output_section
)
2617 value
= s
->output_section
->lma
;
2618 value
+= s
->output_offset
;
2625 write_int (*(--tos
));
2633 /* Drop the int in the buffer, and copy a null into the gap, which we
2634 will overwrite later. */
2637 fill_int (struct output_buffer_struct
*buf
)
2639 if (buf
->buffer
== output_buffer
)
2641 /* Still a chance to output the size. */
2642 int value
= output_ptr
- buf
->ptrp
+ 3;
2643 buf
->ptrp
[0] = value
>> 24;
2644 buf
->ptrp
[1] = value
>> 16;
2645 buf
->ptrp
[2] = value
>> 8;
2646 buf
->ptrp
[3] = value
>> 0;
2651 drop_int (struct output_buffer_struct
*buf
)
2679 buf
->ptrp
= output_ptr
;
2680 buf
->buffer
= output_buffer
;
2720 #define ID copy_id ()
2721 #define INT copy_int ()
2722 #define EXP copy_expression ()
2723 #define INTn(q) copy_int ()
2724 #define EXPn(q) copy_expression ()
2727 copy_till_end (void)
2803 EXPn (instruction address
);
2837 EXPn (external function
);
2847 INTn (locked
register);
2869 /* Attribute record. */
2899 /* Unique typedefs for module. */
2900 /* GLobal typedefs. */
2901 /* High level module scope beginning. */
2903 struct output_buffer_struct ob
;
2919 /* Global function. */
2921 struct output_buffer_struct ob
;
2936 EXPn (size of block
);
2942 /* File name for source line numbers. */
2944 struct output_buffer_struct ob
;
2965 /* Local function. */
2967 struct output_buffer_struct ob
;
2986 /* Assembler module scope beginning - */
2988 struct output_buffer_struct ob
;
3014 struct output_buffer_struct ob
;
3022 INTn (section index
);
3030 EXPn (Size in Maus
);
3083 /* Moves all the debug information from the source bfd to the output
3084 bfd, and relocates any expressions it finds. */
3087 relocate_debug (bfd
*output ATTRIBUTE_UNUSED
,
3092 unsigned char input_buffer
[IBS
];
3094 input_ptr_start
= input_ptr
= input_buffer
;
3095 input_ptr_end
= input_buffer
+ IBS
;
3097 /* FIXME: Check return value. I'm not sure whether it needs to read
3098 the entire buffer or not. */
3099 bfd_bread ((void *) input_ptr_start
, (bfd_size_type
) IBS
, input
);
3103 /* Gather together all the debug information from each input BFD into
3104 one place, relocating it and emitting it as we go. */
3107 ieee_write_debug_part (bfd
*abfd
)
3109 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3110 bfd_chain_type
*chain
= ieee
->chain_root
;
3111 unsigned char obuff
[OBS
];
3112 bfd_boolean some_debug
= FALSE
;
3113 file_ptr here
= bfd_tell (abfd
);
3115 output_ptr_start
= output_ptr
= obuff
;
3116 output_ptr_end
= obuff
+ OBS
;
3120 if (chain
== (bfd_chain_type
*) NULL
)
3124 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
3125 if ((s
->flags
& SEC_DEBUGGING
) != 0)
3129 ieee
->w
.r
.debug_information_part
= 0;
3133 ieee
->w
.r
.debug_information_part
= here
;
3134 if (bfd_bwrite (s
->contents
, s
->size
, abfd
) != s
->size
)
3139 while (chain
!= (bfd_chain_type
*) NULL
)
3141 bfd
*entry
= chain
->this;
3142 ieee_data_type
*entry_ieee
= IEEE_DATA (entry
);
3144 if (entry_ieee
->w
.r
.debug_information_part
)
3146 if (bfd_seek (entry
, entry_ieee
->w
.r
.debug_information_part
,
3149 relocate_debug (abfd
, entry
);
3152 chain
= chain
->next
;
3156 ieee
->w
.r
.debug_information_part
= here
;
3158 ieee
->w
.r
.debug_information_part
= 0;
3166 /* Write the data in an ieee way. */
3169 ieee_write_data_part (bfd
*abfd
)
3173 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3174 ieee
->w
.r
.data_part
= bfd_tell (abfd
);
3176 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
3178 /* Skip sections that have no loadable contents (.bss,
3180 if ((s
->flags
& SEC_LOAD
) == 0)
3183 /* Sort the reloc records so we can insert them in the correct
3185 if (s
->reloc_count
!= 0)
3187 if (! do_with_relocs (abfd
, s
))
3192 if (! do_without_relocs (abfd
, s
))
3201 init_for_output (bfd
*abfd
)
3205 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
3207 if ((s
->flags
& SEC_DEBUGGING
) != 0)
3211 bfd_size_type size
= s
->size
;
3212 ieee_per_section (s
)->data
= bfd_alloc (abfd
, size
);
3213 if (!ieee_per_section (s
)->data
)
3220 /* Exec and core file sections. */
3222 /* Set section contents is complicated with IEEE since the format is
3223 not a byte image, but a record stream. */
3226 ieee_set_section_contents (bfd
*abfd
,
3228 const void * location
,
3230 bfd_size_type count
)
3232 if ((section
->flags
& SEC_DEBUGGING
) != 0)
3234 if (section
->contents
== NULL
)
3236 bfd_size_type size
= section
->size
;
3237 section
->contents
= bfd_alloc (abfd
, size
);
3238 if (section
->contents
== NULL
)
3241 /* bfd_set_section_contents has already checked that everything
3243 memcpy (section
->contents
+ offset
, location
, (size_t) count
);
3247 if (ieee_per_section (section
)->data
== (bfd_byte
*) NULL
)
3249 if (!init_for_output (abfd
))
3252 memcpy ((void *) (ieee_per_section (section
)->data
+ offset
),
3254 (unsigned int) count
);
3258 /* Write the external symbols of a file. IEEE considers two sorts of
3259 external symbols, public, and referenced. It uses to internal
3260 forms to index them as well. When we write them out we turn their
3261 symbol values into indexes from the right base. */
3264 ieee_write_external_part (bfd
*abfd
)
3267 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3268 unsigned int reference_index
= IEEE_REFERENCE_BASE
;
3269 unsigned int public_index
= IEEE_PUBLIC_BASE
+ 2;
3270 file_ptr here
= bfd_tell (abfd
);
3271 bfd_boolean hadone
= FALSE
;
3273 if (abfd
->outsymbols
!= (asymbol
**) NULL
)
3276 for (q
= abfd
->outsymbols
; *q
!= (asymbol
*) NULL
; q
++)
3280 if (bfd_is_und_section (p
->section
))
3282 /* This must be a symbol reference. */
3283 if (! ieee_write_byte (abfd
, ieee_external_reference_enum
)
3284 || ! ieee_write_int (abfd
, (bfd_vma
) reference_index
)
3285 || ! ieee_write_id (abfd
, p
->name
))
3287 p
->value
= reference_index
;
3291 else if (bfd_is_com_section (p
->section
))
3293 /* This is a weak reference. */
3294 if (! ieee_write_byte (abfd
, ieee_external_reference_enum
)
3295 || ! ieee_write_int (abfd
, (bfd_vma
) reference_index
)
3296 || ! ieee_write_id (abfd
, p
->name
)
3297 || ! ieee_write_byte (abfd
,
3298 ieee_weak_external_reference_enum
)
3299 || ! ieee_write_int (abfd
, (bfd_vma
) reference_index
)
3300 || ! ieee_write_int (abfd
, p
->value
))
3302 p
->value
= reference_index
;
3306 else if (p
->flags
& BSF_GLOBAL
)
3308 /* This must be a symbol definition. */
3309 if (! ieee_write_byte (abfd
, ieee_external_symbol_enum
)
3310 || ! ieee_write_int (abfd
, (bfd_vma
) public_index
)
3311 || ! ieee_write_id (abfd
, p
->name
)
3312 || ! ieee_write_2bytes (abfd
, ieee_attribute_record_enum
)
3313 || ! ieee_write_int (abfd
, (bfd_vma
) public_index
)
3314 || ! ieee_write_byte (abfd
, 15) /* Instruction address. */
3315 || ! ieee_write_byte (abfd
, 19) /* Static symbol. */
3316 || ! ieee_write_byte (abfd
, 1)) /* One of them. */
3319 /* Write out the value. */
3320 if (! ieee_write_2bytes (abfd
, ieee_value_record_enum
)
3321 || ! ieee_write_int (abfd
, (bfd_vma
) public_index
))
3323 if (! bfd_is_abs_section (p
->section
))
3325 if (abfd
->flags
& EXEC_P
)
3327 /* If fully linked, then output all symbols
3329 if (! (ieee_write_int
3332 + p
->section
->output_offset
3333 + p
->section
->output_section
->vma
))))
3338 if (! (ieee_write_expression
3340 p
->value
+ p
->section
->output_offset
,
3341 p
->section
->output_section
->symbol
,
3348 if (! ieee_write_expression (abfd
,
3350 bfd_abs_section_ptr
->symbol
,
3354 p
->value
= public_index
;
3360 /* This can happen - when there are gaps in the symbols read
3361 from an input ieee file. */
3366 ieee
->w
.r
.external_part
= here
;
3372 static const unsigned char exten
[] =
3375 0xf1, 0xce, 0x20, 0x00, 37, 3, 3, /* Set version 3 rev 3. */
3376 0xf1, 0xce, 0x20, 0x00, 39, 2, /* Keep symbol in original case. */
3377 0xf1, 0xce, 0x20, 0x00, 38 /* Set object type relocatable to x. */
3380 static const unsigned char envi
[] =
3384 /* 0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
3387 0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok. */
3389 0xf1, 0xce, 0x21, 0, 53, 0x03,/* host unix. */
3390 /* 0xf1, 0xce, 0x21, 0, 54, 2,1,1 tool & version # */
3394 ieee_write_me_part (bfd
*abfd
)
3396 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3397 ieee
->w
.r
.trailer_part
= bfd_tell (abfd
);
3398 if (abfd
->start_address
)
3400 if (! ieee_write_2bytes (abfd
, ieee_value_starting_address_enum
)
3401 || ! ieee_write_byte (abfd
, ieee_function_either_open_b_enum
)
3402 || ! ieee_write_int (abfd
, abfd
->start_address
)
3403 || ! ieee_write_byte (abfd
, ieee_function_either_close_b_enum
))
3406 ieee
->w
.r
.me_record
= bfd_tell (abfd
);
3407 if (! ieee_write_byte (abfd
, ieee_module_end_enum
))
3412 /* Write out the IEEE processor ID. */
3415 ieee_write_processor (bfd
*abfd
)
3417 const bfd_arch_info_type
*arch
;
3419 arch
= bfd_get_arch_info (abfd
);
3423 if (! ieee_write_id (abfd
, bfd_printable_name (abfd
)))
3427 case bfd_arch_h8300
:
3428 if (! ieee_write_id (abfd
, "H8/300"))
3432 case bfd_arch_h8500
:
3433 if (! ieee_write_id (abfd
, "H8/500"))
3441 case bfd_mach_i960_core
:
3442 case bfd_mach_i960_ka_sa
:
3443 if (! ieee_write_id (abfd
, "80960KA"))
3447 case bfd_mach_i960_kb_sb
:
3448 if (! ieee_write_id (abfd
, "80960KB"))
3452 case bfd_mach_i960_ca
:
3453 if (! ieee_write_id (abfd
, "80960CA"))
3457 case bfd_mach_i960_mc
:
3458 case bfd_mach_i960_xa
:
3459 if (! ieee_write_id (abfd
, "80960MC"))
3471 default: id
= "68020"; break;
3472 case bfd_mach_m68000
: id
= "68000"; break;
3473 case bfd_mach_m68008
: id
= "68008"; break;
3474 case bfd_mach_m68010
: id
= "68010"; break;
3475 case bfd_mach_m68020
: id
= "68020"; break;
3476 case bfd_mach_m68030
: id
= "68030"; break;
3477 case bfd_mach_m68040
: id
= "68040"; break;
3478 case bfd_mach_m68060
: id
= "68060"; break;
3479 case bfd_mach_cpu32
: id
= "cpu32"; break;
3480 case bfd_mach_mcf_isa_a_nodiv
: id
= "isa-a:nodiv"; break;
3481 case bfd_mach_mcf_isa_a
: id
= "isa-a"; break;
3482 case bfd_mach_mcf_isa_a_mac
: id
= "isa-a:mac"; break;
3483 case bfd_mach_mcf_isa_a_emac
: id
= "isa-a:emac"; break;
3484 case bfd_mach_mcf_isa_aplus
: id
= "isa-aplus"; break;
3485 case bfd_mach_mcf_isa_aplus_mac
: id
= "isa-aplus:mac"; break;
3486 case bfd_mach_mcf_isa_aplus_emac
: id
= "isa-aplus:mac"; break;
3487 case bfd_mach_mcf_isa_b_nousp
: id
= "isa-b:nousp"; break;
3488 case bfd_mach_mcf_isa_b_nousp_mac
: id
= "isa-b:nousp:mac"; break;
3489 case bfd_mach_mcf_isa_b_nousp_emac
: id
= "isa-b:nousp:emac"; break;
3490 case bfd_mach_mcf_isa_b
: id
= "isa-b"; break;
3491 case bfd_mach_mcf_isa_b_mac
: id
= "isa-b:mac"; break;
3492 case bfd_mach_mcf_isa_b_emac
: id
= "isa-b:emac"; break;
3493 case bfd_mach_mcf_isa_b_float
: id
= "isa-b:float"; break;
3494 case bfd_mach_mcf_isa_b_float_mac
: id
= "isa-b:float:mac"; break;
3495 case bfd_mach_mcf_isa_b_float_emac
: id
= "isa-b:float:emac"; break;
3496 case bfd_mach_mcf_isa_c
: id
= "isa-c"; break;
3497 case bfd_mach_mcf_isa_c_mac
: id
= "isa-c:mac"; break;
3498 case bfd_mach_mcf_isa_c_emac
: id
= "isa-c:emac"; break;
3499 case bfd_mach_mcf_isa_c_nodiv
: id
= "isa-c:nodiv"; break;
3500 case bfd_mach_mcf_isa_c_nodiv_mac
: id
= "isa-c:nodiv:mac"; break;
3501 case bfd_mach_mcf_isa_c_nodiv_emac
: id
= "isa-c:nodiv:emac"; break;
3504 if (! ieee_write_id (abfd
, id
))
3514 ieee_write_object_contents (bfd
*abfd
)
3516 ieee_data_type
*ieee
= IEEE_DATA (abfd
);
3520 /* Fast forward over the header area. */
3521 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
) != 0)
3524 if (! ieee_write_byte (abfd
, ieee_module_beginning_enum
)
3525 || ! ieee_write_processor (abfd
)
3526 || ! ieee_write_id (abfd
, abfd
->filename
))
3529 /* Fast forward over the variable bits. */
3530 if (! ieee_write_byte (abfd
, ieee_address_descriptor_enum
))
3534 if (! ieee_write_byte (abfd
, (bfd_byte
) (bfd_arch_bits_per_byte (abfd
))))
3536 /* MAU's per address. */
3537 if (! ieee_write_byte (abfd
,
3538 (bfd_byte
) (bfd_arch_bits_per_address (abfd
)
3539 / bfd_arch_bits_per_byte (abfd
))))
3542 old
= bfd_tell (abfd
);
3543 if (bfd_seek (abfd
, (file_ptr
) (8 * N_W_VARIABLES
), SEEK_CUR
) != 0)
3546 ieee
->w
.r
.extension_record
= bfd_tell (abfd
);
3547 if (bfd_bwrite ((char *) exten
, (bfd_size_type
) sizeof (exten
), abfd
)
3550 if (abfd
->flags
& EXEC_P
)
3552 if (! ieee_write_byte (abfd
, 0x1)) /* Absolute. */
3557 if (! ieee_write_byte (abfd
, 0x2)) /* Relocateable. */
3561 ieee
->w
.r
.environmental_record
= bfd_tell (abfd
);
3562 if (bfd_bwrite ((char *) envi
, (bfd_size_type
) sizeof (envi
), abfd
)
3566 /* The HP emulator database requires a timestamp in the file. */
3572 t
= (struct tm
*) localtime (&now
);
3573 if (! ieee_write_2bytes (abfd
, (int) ieee_atn_record_enum
)
3574 || ! ieee_write_byte (abfd
, 0x21)
3575 || ! ieee_write_byte (abfd
, 0)
3576 || ! ieee_write_byte (abfd
, 50)
3577 || ! ieee_write_int (abfd
, (bfd_vma
) (t
->tm_year
+ 1900))
3578 || ! ieee_write_int (abfd
, (bfd_vma
) (t
->tm_mon
+ 1))
3579 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_mday
)
3580 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_hour
)
3581 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_min
)
3582 || ! ieee_write_int (abfd
, (bfd_vma
) t
->tm_sec
))
3590 if (! ieee_write_section_part (abfd
))
3592 /* First write the symbols. This changes their values into table
3593 indeces so we cant use it after this point. */
3594 if (! ieee_write_external_part (abfd
))
3597 /* Write any debugs we have been told about. */
3598 if (! ieee_write_debug_part (abfd
))
3601 /* Can only write the data once the symbols have been written, since
3602 the data contains relocation information which points to the
3604 if (! ieee_write_data_part (abfd
))
3607 /* At the end we put the end! */
3608 if (! ieee_write_me_part (abfd
))
3611 /* Generate the header. */
3612 if (bfd_seek (abfd
, old
, SEEK_SET
) != 0)
3615 for (i
= 0; i
< N_W_VARIABLES
; i
++)
3617 if (! ieee_write_2bytes (abfd
, ieee_assign_value_to_variable_enum
)
3618 || ! ieee_write_byte (abfd
, (bfd_byte
) i
)
3619 || ! ieee_write_int5_out (abfd
, (bfd_vma
) ieee
->w
.offset
[i
]))
3626 /* Native-level interface to symbols. */
3628 /* We read the symbols into a buffer, which is discarded when this
3629 function exits. We read the strings into a buffer large enough to
3630 hold them all plus all the cached symbol entries. */
3633 ieee_make_empty_symbol (bfd
*abfd
)
3635 bfd_size_type amt
= sizeof (ieee_symbol_type
);
3636 ieee_symbol_type
*new_symbol
= (ieee_symbol_type
*) bfd_zalloc (abfd
, amt
);
3640 new_symbol
->symbol
.the_bfd
= abfd
;
3641 return &new_symbol
->symbol
;
3645 ieee_openr_next_archived_file (bfd
*arch
, bfd
*prev
)
3647 ieee_ar_data_type
*ar
= IEEE_AR_DATA (arch
);
3649 /* Take the next one from the arch state, or reset. */
3650 if (prev
== (bfd
*) NULL
)
3651 /* Reset the index - the first two entries are bogus. */
3652 ar
->element_index
= 2;
3656 ieee_ar_obstack_type
*p
= ar
->elements
+ ar
->element_index
;
3658 ar
->element_index
++;
3659 if (ar
->element_index
<= ar
->element_count
)
3661 if (p
->file_offset
!= (file_ptr
) 0)
3663 if (p
->abfd
== (bfd
*) NULL
)
3665 p
->abfd
= _bfd_create_empty_archive_element_shell (arch
);
3666 p
->abfd
->origin
= p
->file_offset
;
3673 bfd_set_error (bfd_error_no_more_archived_files
);
3680 ieee_find_nearest_line (bfd
*abfd ATTRIBUTE_UNUSED
,
3681 asection
*section ATTRIBUTE_UNUSED
,
3682 asymbol
**symbols ATTRIBUTE_UNUSED
,
3683 bfd_vma offset ATTRIBUTE_UNUSED
,
3684 const char **filename_ptr ATTRIBUTE_UNUSED
,
3685 const char **functionname_ptr ATTRIBUTE_UNUSED
,
3686 unsigned int *line_ptr ATTRIBUTE_UNUSED
)
3692 ieee_find_inliner_info (bfd
*abfd ATTRIBUTE_UNUSED
,
3693 const char **filename_ptr ATTRIBUTE_UNUSED
,
3694 const char **functionname_ptr ATTRIBUTE_UNUSED
,
3695 unsigned int *line_ptr ATTRIBUTE_UNUSED
)
3701 ieee_generic_stat_arch_elt (bfd
*abfd
, struct stat
*buf
)
3703 ieee_ar_data_type
*ar
= (ieee_ar_data_type
*) NULL
;
3704 ieee_data_type
*ieee
;
3706 if (abfd
->my_archive
!= NULL
)
3707 ar
= abfd
->my_archive
->tdata
.ieee_ar_data
;
3708 if (ar
== (ieee_ar_data_type
*) NULL
)
3710 bfd_set_error (bfd_error_invalid_operation
);
3714 if (IEEE_DATA (abfd
) == NULL
)
3716 if (ieee_object_p (abfd
) == NULL
)
3718 bfd_set_error (bfd_error_wrong_format
);
3723 ieee
= IEEE_DATA (abfd
);
3725 buf
->st_size
= ieee
->w
.r
.me_record
+ 1;
3726 buf
->st_mode
= 0644;
3731 ieee_sizeof_headers (bfd
*abfd ATTRIBUTE_UNUSED
,
3732 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
3737 #define ieee_close_and_cleanup _bfd_generic_close_and_cleanup
3738 #define ieee_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
3740 #define ieee_slurp_armap bfd_true
3741 #define ieee_slurp_extended_name_table bfd_true
3742 #define ieee_construct_extended_name_table \
3744 (bfd *, char **, bfd_size_type *, const char **)) \
3746 #define ieee_truncate_arname bfd_dont_truncate_arname
3747 #define ieee_write_armap \
3749 (bfd *, unsigned int, struct orl *, unsigned int, int)) \
3751 #define ieee_read_ar_hdr bfd_nullvoidptr
3752 #define ieee_write_ar_hdr ((bfd_boolean (*) (bfd *, bfd *)) bfd_false)
3753 #define ieee_update_armap_timestamp bfd_true
3754 #define ieee_get_elt_at_index _bfd_generic_get_elt_at_index
3756 #define ieee_bfd_is_target_special_symbol \
3757 ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
3758 #define ieee_bfd_is_local_label_name bfd_generic_is_local_label_name
3759 #define ieee_get_lineno _bfd_nosymbols_get_lineno
3760 #define ieee_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
3761 #define ieee_read_minisymbols _bfd_generic_read_minisymbols
3762 #define ieee_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
3764 #define ieee_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
3765 #define ieee_bfd_reloc_name_lookup _bfd_norelocs_bfd_reloc_name_lookup
3767 #define ieee_set_arch_mach _bfd_generic_set_arch_mach
3769 #define ieee_get_section_contents_in_window \
3770 _bfd_generic_get_section_contents_in_window
3771 #define ieee_bfd_get_relocated_section_contents \
3772 bfd_generic_get_relocated_section_contents
3773 #define ieee_bfd_relax_section bfd_generic_relax_section
3774 #define ieee_bfd_gc_sections bfd_generic_gc_sections
3775 #define ieee_bfd_lookup_section_flags bfd_generic_lookup_section_flags
3776 #define ieee_bfd_merge_sections bfd_generic_merge_sections
3777 #define ieee_bfd_is_group_section bfd_generic_is_group_section
3778 #define ieee_bfd_discard_group bfd_generic_discard_group
3779 #define ieee_section_already_linked \
3780 _bfd_generic_section_already_linked
3781 #define ieee_bfd_define_common_symbol bfd_generic_define_common_symbol
3782 #define ieee_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
3783 #define ieee_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
3784 #define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols
3785 #define ieee_bfd_link_just_syms _bfd_generic_link_just_syms
3786 #define ieee_bfd_copy_link_hash_symbol_type \
3787 _bfd_generic_copy_link_hash_symbol_type
3788 #define ieee_bfd_final_link _bfd_generic_final_link
3789 #define ieee_bfd_link_split_section _bfd_generic_link_split_section
3791 const bfd_target ieee_vec
=
3794 bfd_target_ieee_flavour
,
3795 BFD_ENDIAN_UNKNOWN
, /* Target byte order. */
3796 BFD_ENDIAN_UNKNOWN
, /* Target headers byte order. */
3797 (HAS_RELOC
| EXEC_P
| /* Object flags. */
3798 HAS_LINENO
| HAS_DEBUG
|
3799 HAS_SYMS
| HAS_LOCALS
| WP_TEXT
| D_PAGED
),
3800 (SEC_CODE
| SEC_DATA
| SEC_ROM
| SEC_HAS_CONTENTS
3801 | SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
), /* Section flags. */
3802 '_', /* Leading underscore. */
3803 ' ', /* AR_pad_char. */
3804 16, /* AR_max_namelen. */
3805 0, /* match priority. */
3806 bfd_getb64
, bfd_getb_signed_64
, bfd_putb64
,
3807 bfd_getb32
, bfd_getb_signed_32
, bfd_putb32
,
3808 bfd_getb16
, bfd_getb_signed_16
, bfd_putb16
, /* Data. */
3809 bfd_getb64
, bfd_getb_signed_64
, bfd_putb64
,
3810 bfd_getb32
, bfd_getb_signed_32
, bfd_putb32
,
3811 bfd_getb16
, bfd_getb_signed_16
, bfd_putb16
, /* Headers. */
3814 ieee_object_p
, /* bfd_check_format. */
3821 _bfd_generic_mkarchive
,
3826 ieee_write_object_contents
,
3827 _bfd_write_archive_contents
,
3831 /* ieee_close_and_cleanup, ieee_bfd_free_cached_info, ieee_new_section_hook,
3832 ieee_get_section_contents, ieee_get_section_contents_in_window. */
3833 BFD_JUMP_TABLE_GENERIC (ieee
),
3835 BFD_JUMP_TABLE_COPY (_bfd_generic
),
3836 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
3838 /* ieee_slurp_armap, ieee_slurp_extended_name_table,
3839 ieee_construct_extended_name_table, ieee_truncate_arname,
3840 ieee_write_armap, ieee_read_ar_hdr, ieee_openr_next_archived_file,
3841 ieee_get_elt_at_index, ieee_generic_stat_arch_elt,
3842 ieee_update_armap_timestamp. */
3843 BFD_JUMP_TABLE_ARCHIVE (ieee
),
3845 /* ieee_get_symtab_upper_bound, ieee_canonicalize_symtab,
3846 ieee_make_empty_symbol, ieee_print_symbol, ieee_get_symbol_info,
3847 ieee_bfd_is_local_label_name, ieee_get_lineno,
3848 ieee_find_nearest_line, ieee_bfd_make_debug_symbol,
3849 ieee_read_minisymbols, ieee_minisymbol_to_symbol. */
3850 BFD_JUMP_TABLE_SYMBOLS (ieee
),
3852 /* ieee_get_reloc_upper_bound, ieee_canonicalize_reloc,
3853 ieee_bfd_reloc_type_lookup. */
3854 BFD_JUMP_TABLE_RELOCS (ieee
),
3856 /* ieee_set_arch_mach, ieee_set_section_contents. */
3857 BFD_JUMP_TABLE_WRITE (ieee
),
3859 /* ieee_sizeof_headers, ieee_bfd_get_relocated_section_contents,
3860 ieee_bfd_relax_section, ieee_bfd_link_hash_table_create,
3861 _bfd_generic_link_hash_table_free,
3862 ieee_bfd_link_add_symbols, ieee_bfd_final_link,
3863 ieee_bfd_link_split_section, ieee_bfd_gc_sections,
3864 ieee_bfd_merge_sections. */
3865 BFD_JUMP_TABLE_LINK (ieee
),
3867 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic
),