2 /* bfd back-end for ieee-695 objects.
3 Copyright (C) 1990-1992 Free Software Foundation, Inc.
4 Written by Steve Chamberlain of Cygnus Support.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
22 #define KEEPMINUSPCININST 1
24 /* IEEE 695 format is a stream of records, which we parse using a simple one-
25 token (which is one byte in this lexicon) lookahead recursive decent
36 #define obstack_chunk_alloc bfd_xmalloc
37 #define obstack_chunk_free free
39 /* Functions for writing to ieee files in the strange way that the
43 DEFUN(ieee_write_byte
,(abfd
, byte
),
47 bfd_write((PTR
)&byte
, 1, 1, abfd
);
52 DEFUN(ieee_write_twobyte
,(abfd
, twobyte
),
57 b
[1] = twobyte
& 0xff;
59 bfd_write((PTR
)&b
[0], 1, 2, abfd
);
65 DEFUN(ieee_write_2bytes
,(abfd
, bytes
),
70 buffer
[0] = bytes
>> 8;
71 buffer
[1] = bytes
& 0xff;
73 bfd_write((PTR
)buffer
, 1, 2, abfd
);
77 DEFUN(ieee_write_int
,(abfd
, value
),
81 if (((unsigned)value
) <= 127) {
82 ieee_write_byte(abfd
, value
);
86 /* How many significant bytes ? */
87 /* FIXME FOR LONGER INTS */
88 if (value
& 0xff000000) {
91 else if (value
& 0x00ff0000) {
94 else if (value
& 0x0000ff00) {
99 ieee_write_byte(abfd
, (int)ieee_number_repeat_start_enum
+ length
);
102 ieee_write_byte(abfd
, value
>> 24);
104 ieee_write_byte(abfd
, value
>> 16);
106 ieee_write_byte(abfd
, value
>> 8);
108 ieee_write_byte(abfd
, value
);
114 DEFUN(ieee_write_id
,(abfd
, id
),
118 size_t length
= strlen(id
);
119 if (length
>= 0 && length
<= 127) {
120 ieee_write_byte(abfd
, length
);
122 else if (length
< 255) {
123 ieee_write_byte(abfd
, ieee_extension_length_1_enum
);
124 ieee_write_byte(abfd
, length
);
126 else if (length
< 65535) {
127 ieee_write_byte(abfd
, ieee_extension_length_2_enum
);
128 ieee_write_byte(abfd
, length
>> 8);
129 ieee_write_byte(abfd
, length
& 0xff);
134 bfd_write((PTR
)id
, 1, length
, abfd
);
136 /***************************************************************************
137 Functions for reading from ieee files in the strange way that the
142 #define this_byte(ieee) *((ieee)->input_p)
143 #define next_byte(ieee) ((ieee)->input_p++)
144 #define this_byte_and_next(ieee) (*((ieee)->input_p++))
147 static unsigned short
148 DEFUN(read_2bytes
,(ieee
),
149 common_header_type
*ieee
)
151 unsigned char c1
= this_byte_and_next(ieee
);
152 unsigned char c2
= this_byte_and_next(ieee
);
153 return (c1
<<8 ) | c2
;
158 DEFUN(bfd_get_string
,(ieee
, string
, length
),
159 common_header_type
*ieee AND
164 for (i
= 0; i
< length
; i
++) {
165 string
[i
] = this_byte_and_next(ieee
);
170 DEFUN(read_id
,(ieee
),
171 common_header_type
*ieee
)
175 length
= this_byte_and_next(ieee
);
176 if (length
>= 0x00 && length
<= 0x7f) {
177 /* Simple string of length 0 to 127 */
179 else if (length
== 0xde) {
180 /* Length is next byte, allowing 0..255 */
181 length
= this_byte_and_next(ieee
);
183 else if (length
== 0xdf) {
184 /* Length is next two bytes, allowing 0..65535 */
185 length
= this_byte_and_next(ieee
) ;
186 length
= (length
* 256) + this_byte_and_next(ieee
);
188 /* Buy memory and read string */
189 string
= bfd_alloc(ieee
->abfd
, length
+1);
190 bfd_get_string(ieee
, string
, length
);
196 DEFUN(ieee_write_expression
,(abfd
, value
, symbol
, pcrel
, index
),
203 unsigned int term_count
= 0;
207 ieee_write_int(abfd
, value
);
213 if (symbol
->section
== &bfd_com_section
214 || symbol
->section
== &bfd_und_section
)
216 /* Def of a common symbol */
217 ieee_write_byte(abfd
, ieee_variable_X_enum
);
218 ieee_write_int(abfd
, symbol
->value
);
221 else if (symbol
->section
!= &bfd_abs_section
)
223 /* Ref to defined symbol - */
225 ieee_write_byte(abfd
, ieee_variable_R_enum
);
226 ieee_write_byte(abfd
, symbol
->section
->index
+ IEEE_SECTION_NUMBER_BASE
);
228 if (symbol
->flags
& BSF_GLOBAL
)
230 ieee_write_byte(abfd
, ieee_variable_I_enum
);
231 ieee_write_int(abfd
, symbol
->value
);
234 else if (symbol
->flags
& ( BSF_LOCAL
| BSF_SECTION_SYM
))
236 /* This is a reference to a defined local symbol,
237 We can easily do a local as a section+offset */
238 ieee_write_byte(abfd
, ieee_variable_R_enum
); /* or L */
239 ieee_write_byte(abfd
, symbol
->section
->index
+
240 IEEE_SECTION_NUMBER_BASE
);
241 ieee_write_int(abfd
, symbol
->value
);
254 /* subtract the pc from here by asking for PC of this section*/
255 ieee_write_byte(abfd
, ieee_variable_P_enum
);
256 ieee_write_byte(abfd
, index
+IEEE_SECTION_NUMBER_BASE
);
257 ieee_write_byte(abfd
, ieee_function_minus_enum
);
262 ieee_write_byte(abfd
,0);
265 while (term_count
> 1) {
266 ieee_write_byte(abfd
, ieee_function_plus_enum
);
281 /*****************************************************************************/
284 writes any integer into the buffer supplied and always takes 5 bytes
287 DEFUN(ieee_write_int5
,(buffer
, value
),
291 buffer
[0] = (bfd_byte
)ieee_number_repeat_4_enum
;
292 buffer
[1] = (value
>> 24 ) & 0xff;
293 buffer
[2] = (value
>> 16 ) & 0xff;
294 buffer
[3] = (value
>> 8 ) & 0xff;
295 buffer
[4] = (value
>> 0 ) & 0xff;
298 DEFUN(ieee_write_int5_out
, (abfd
, value
),
303 ieee_write_int5(b
, value
);
304 bfd_write((PTR
)b
,1,5,abfd
);
309 DEFUN(parse_int
,(ieee
, value_ptr
),
310 common_header_type
*ieee AND
313 int value
= this_byte(ieee
);
315 if (value
>= 0 && value
<= 127) {
320 else if (value
>= 0x80 && value
<= 0x88) {
321 unsigned int count
= value
& 0xf;
325 result
=(result
<< 8) | this_byte_and_next(ieee
);
334 DEFUN(parse_i
,(ieee
, ok
),
335 common_header_type
*ieee AND
339 *ok
= parse_int(ieee
, &x
);
344 DEFUN(must_parse_int
,(ieee
),
345 common_header_type
*ieee
)
348 BFD_ASSERT(parse_int(ieee
, &result
) == true);
356 ieee_symbol_index_type symbol
;
361 reloc_howto_type abs32_howto
362 = HOWTO(1,0,2,32,false,0,false,true,0,"abs32",true,0xffffffff, 0xffffffff,false);
364 reloc_howto_type abs16_howto
365 = HOWTO(1,0,1,16,false,0,false,true,0,"abs16",true,0x0000ffff, 0x0000ffff,false);
368 reloc_howto_type abs8_howto
369 = HOWTO(1,0,0,8,false,0,false,true,0,"abs8",true,0x000000ff, 0x000000ff,false);
372 reloc_howto_type rel32_howto
373 = HOWTO(1,0,2,32,true,0,false,true,0,"rel32",true,0xffffffff,
377 reloc_howto_type rel16_howto
378 = HOWTO(1,0,1,16,true,0,false,true,0,"rel16",true,0x0000ffff, 0x0000ffff,false);
381 reloc_howto_type rel8_howto
382 = HOWTO(1,0,0,8,true,0,false,true,0,"rel8",true,0x000000ff, 0x000000ff,false);
385 static ieee_symbol_index_type NOSYMBOL
= { 0, 0};
389 DEFUN(parse_expression
,(ieee
, value
, symbol
, pcrel
, extra
, section
),
390 ieee_data_type
*ieee AND
392 ieee_symbol_index_type
*symbol AND
394 unsigned int *extra AND
406 ieee_value_type stack
[10];
408 /* The stack pointer always points to the next unused location */
409 #define PUSH(x,y,z) TOS.symbol=x;TOS.section=y;TOS.value=z;INC;
410 #define POP(x,y,z) DEC;x=TOS.symbol;y=TOS.section;z=TOS.value;
411 ieee_value_type
*sp
= stack
;
414 switch (this_byte(&(ieee
->h
)))
416 case ieee_variable_P_enum
:
417 /* P variable, current program counter for section n */
420 next_byte(&(ieee
->h
));
422 section_n
= must_parse_int(&(ieee
->h
));
423 PUSH(NOSYMBOL
, &bfd_abs_section
,
424 TOS
.value
= ieee
->section_table
[section_n
]->vma
+
425 ieee_per_section(ieee
->section_table
[section_n
])->pc
);
428 case ieee_variable_L_enum
:
429 /* L variable address of section N */
430 next_byte(&(ieee
->h
));
431 PUSH(NOSYMBOL
,ieee
->section_table
[must_parse_int(&(ieee
->h
))],0);
433 case ieee_variable_R_enum
:
434 /* R variable, logical address of section module */
435 /* FIXME, this should be different to L */
436 next_byte(&(ieee
->h
));
437 PUSH(NOSYMBOL
,ieee
->section_table
[must_parse_int(&(ieee
->h
))],0);
439 case ieee_variable_S_enum
:
440 /* S variable, size in MAUS of section module */
441 next_byte(&(ieee
->h
));
444 ieee
->section_table
[must_parse_int(&(ieee
->h
))]->_raw_size
);
446 case ieee_variable_I_enum
:
447 case ieee_variable_X_enum
:
448 /* Push the address of external variable n */
450 ieee_symbol_index_type sy
;
451 next_byte(&(ieee
->h
));
452 sy
.index
= (int)(must_parse_int(&(ieee
->h
))) ;
455 PUSH(sy
, &bfd_und_section
, 0);
458 case ieee_function_minus_enum
:
460 bfd_vma value1
, value2
;
461 asection
*section1
, *section_dummy
;
462 ieee_symbol_index_type sy
;
463 next_byte(&(ieee
->h
));
465 POP(sy
, section1
, value1
);
466 POP(sy
, section_dummy
, value2
);
467 PUSH(sy
, section1
? section1
: section_dummy
, value1
-value2
);
470 case ieee_function_plus_enum
:
472 bfd_vma value1
, value2
;
475 ieee_symbol_index_type sy1
;
476 ieee_symbol_index_type sy2
;
477 next_byte(&(ieee
->h
));
479 POP(sy1
, section1
, value1
);
480 POP(sy2
, section2
, value2
);
481 PUSH(sy1
.letter
? sy1
: sy2
, section1
!=&bfd_abs_section
? section1
: section2
, value1
+value2
);
487 BFD_ASSERT(this_byte(&(ieee
->h
)) < (int)ieee_variable_A_enum
488 || this_byte(&(ieee
->h
)) > (int)ieee_variable_Z_enum
);
489 if (parse_int(&(ieee
->h
), &va
))
491 PUSH(NOSYMBOL
, &bfd_abs_section
, va
);
495 Thats all that we can understand. As far as I can see
496 there is a bug in the Microtec IEEE output which I'm
497 using to scan, whereby the comma operator is ommited
498 sometimes in an expression, giving expressions with too
499 many terms. We can tell if that's the case by ensuring
500 that sp == stack here. If not, then we've pushed
501 something too far, so we keep adding
504 while (sp
!= stack
+1) {
506 ieee_symbol_index_type sy1
;
507 POP(sy1
, section1
, *extra
);
512 POP(*symbol
, dummy
, *value
);
513 if (section
) *section
= dummy
;
526 #define ieee_seek(abfd, offset) \
527 IEEE_DATA(abfd)->h.input_p = IEEE_DATA(abfd)->h.first_byte + offset
529 #define ieee_pos(abfd) IEEE_DATA(abfd)->h.input_p -IEEE_DATA(abfd)->h.first_byte
531 static unsigned int last_index
;
533 static ieee_symbol_type
*
534 DEFUN(get_symbol
,(abfd
,
542 ieee_data_type
*ieee AND
543 ieee_symbol_type
*last_symbol AND
544 unsigned int *symbol_count AND
545 ieee_symbol_type
*** pptr AND
546 unsigned int *max_index
549 /* Need a new symbol */
550 unsigned int new_index
= must_parse_int(&(ieee
->h
));
551 if (new_index
!= last_index
) {
552 ieee_symbol_type
* new_symbol
= (ieee_symbol_type
*)bfd_alloc(ieee
->h
.abfd
,
553 sizeof(ieee_symbol_type
));
555 new_symbol
->index
= new_index
;
556 last_index
= new_index
;
559 *pptr
= &new_symbol
->next
;
560 if (new_index
> *max_index
) {
561 *max_index
= new_index
;
568 DEFUN(ieee_slurp_external_symbols
,(abfd
),
571 ieee_data_type
*ieee
= IEEE_DATA(abfd
);
572 file_ptr offset
= ieee
->w
.r
.external_part
;
575 ieee_symbol_type
**prev_symbols_ptr
= &ieee
->external_symbols
;
576 ieee_symbol_type
**prev_reference_ptr
= &ieee
->external_reference
;
577 ieee_symbol_type
*symbol
= (ieee_symbol_type
*)NULL
;
578 unsigned int symbol_count
= 0;
580 last_index
= 0xffffff;
581 ieee
->symbol_table_full
= true;
583 ieee_seek(abfd
, offset
);
586 switch (this_byte(&(ieee
->h
))) {
588 next_byte(&(ieee
->h
));
589 symbol
= get_symbol(abfd
, ieee
, symbol
, &symbol_count
,
591 &ieee
->external_symbol_max_index
);
593 symbol
->symbol
.the_bfd
= abfd
;
594 symbol
->symbol
.name
= read_id(&(ieee
->h
));
595 symbol
->symbol
.udata
= (PTR
)NULL
;
596 symbol
->symbol
.flags
= BSF_NO_FLAGS
;
600 case ieee_external_symbol_enum
:
601 next_byte(&(ieee
->h
));
603 symbol
= get_symbol(abfd
, ieee
, symbol
, &symbol_count
,
605 &ieee
->external_symbol_max_index
);
608 BFD_ASSERT (symbol
->index
>= ieee
->external_symbol_min_index
);
610 symbol
->symbol
.the_bfd
= abfd
;
611 symbol
->symbol
.name
= read_id(&(ieee
->h
));
612 symbol
->symbol
.udata
= (PTR
)NULL
;
613 symbol
->symbol
.flags
= BSF_NO_FLAGS
;
615 case ieee_attribute_record_enum
>> 8:
617 unsigned int symbol_name_index
;
618 unsigned int symbol_type_index
;
619 unsigned int symbol_attribute_def
;
621 next_byte(&(ieee
->h
)); /* Skip prefix */
622 next_byte(&(ieee
->h
));
623 symbol_name_index
= must_parse_int(&(ieee
->h
));
624 symbol_type_index
= must_parse_int(&(ieee
->h
));
625 symbol_attribute_def
= must_parse_int(&(ieee
->h
));
626 switch (symbol_attribute_def
) {
628 /* Module misc; followed by two fields which describe the
629 current module block. The first fired is the type id
630 number, the second is the number of asn records
631 associated with the directive */
632 parse_int(&(ieee
->h
),&value
);
633 parse_int(&(ieee
->h
),&value
);
637 parse_int(&(ieee
->h
),&value
);
642 case ieee_value_record_enum
>> 8:
644 unsigned int symbol_name_index
;
645 ieee_symbol_index_type symbol_ignore
;
646 boolean pcrel_ignore
;
648 next_byte(&(ieee
->h
));
649 next_byte(&(ieee
->h
));
651 symbol_name_index
= must_parse_int(&(ieee
->h
));
652 parse_expression(ieee
,
653 &symbol
->symbol
.value
,
657 &symbol
->symbol
.section
);
659 symbol
->symbol
.flags
= BSF_GLOBAL
| BSF_EXPORT
;
663 case ieee_weak_external_reference_enum
:
666 next_byte(&(ieee
->h
));
667 /* Throw away the external reference index */
668 (void)must_parse_int(&(ieee
->h
));
669 /* Fetch the default size if not resolved */
670 size
= must_parse_int(&(ieee
->h
));
671 /* Fetch the defautlt value if available */
672 if ( parse_int(&(ieee
->h
), &value
) == false) {
675 /* This turns into a common */
676 symbol
->symbol
.section
= &bfd_com_section
;
677 symbol
->symbol
.value
= size
;
681 case ieee_external_reference_enum
:
682 next_byte(&(ieee
->h
));
684 symbol
= get_symbol(abfd
, ieee
, symbol
, &symbol_count
,
686 &ieee
->external_reference_max_index
);
689 symbol
->symbol
.the_bfd
= abfd
;
690 symbol
->symbol
.name
= read_id(&(ieee
->h
));
691 symbol
->symbol
.udata
= (PTR
)NULL
;
692 symbol
->symbol
.section
= &bfd_und_section
;
693 symbol
->symbol
.value
= (bfd_vma
)0;
694 symbol
->symbol
.flags
= 0;
696 BFD_ASSERT (symbol
->index
>= ieee
->external_reference_min_index
);
704 if (ieee
->external_symbol_max_index
!= 0) {
705 ieee
->external_symbol_count
=
706 ieee
->external_symbol_max_index
-
707 ieee
->external_symbol_min_index
+ 1 ;
710 ieee
->external_symbol_count
= 0;
714 if(ieee
->external_reference_max_index
!= 0) {
715 ieee
->external_reference_count
=
716 ieee
->external_reference_max_index
-
717 ieee
->external_reference_min_index
+ 1;
720 ieee
->external_reference_count
= 0;
724 ieee
->external_reference_count
+ ieee
->external_symbol_count
;
726 if (symbol_count
!= abfd
->symcount
) {
727 /* There are gaps in the table -- */
728 ieee
->symbol_table_full
= false;
732 *prev_symbols_ptr
= (ieee_symbol_type
*)NULL
;
733 *prev_reference_ptr
= (ieee_symbol_type
*)NULL
;
737 DEFUN(ieee_slurp_symbol_table
,(abfd
),
740 if (IEEE_DATA(abfd
)->read_symbols
== false) {
741 ieee_slurp_external_symbols(abfd
);
742 IEEE_DATA(abfd
)->read_symbols
= true;
747 DEFUN(ieee_get_symtab_upper_bound
,(abfd
),
750 ieee_slurp_symbol_table (abfd
);
752 return (abfd
->symcount
!= 0) ?
753 (abfd
->symcount
+1) * (sizeof (ieee_symbol_type
*)) : 0;
757 Move from our internal lists to the canon table, and insert in
761 extern bfd_target ieee_vec
;
763 DEFUN(ieee_get_symtab
,(abfd
, location
),
767 ieee_symbol_type
*symp
;
768 static bfd dummy_bfd
;
769 static asymbol empty_symbol
=
770 { &dummy_bfd
," ieee empty",(symvalue
)0,BSF_DEBUGGING
, &bfd_abs_section
};
772 if (abfd
->symcount
) {
777 ieee_data_type
*ieee
= IEEE_DATA(abfd
);
778 dummy_bfd
.xvec
= &ieee_vec
;
779 ieee_slurp_symbol_table(abfd
);
781 if (ieee
->symbol_table_full
== false) {
782 /* Arrgh - there are gaps in the table, run through and fill them */
783 /* up with pointers to a null place */
785 for (i
= 0; i
< abfd
->symcount
; i
++) {
786 location
[i
] = &empty_symbol
;
791 ieee
->external_symbol_base_offset
= - ieee
->external_symbol_min_index
;
792 for (symp
= IEEE_DATA(abfd
)->external_symbols
;
793 symp
!= (ieee_symbol_type
*)NULL
;
795 /* Place into table at correct index locations */
796 location
[symp
->index
+ ieee
->external_symbol_base_offset
] = &symp
->symbol
;
800 /* The external refs are indexed in a bit */
801 ieee
->external_reference_base_offset
=
802 - ieee
->external_reference_min_index
+ieee
->external_symbol_count
;
804 for (symp
= IEEE_DATA(abfd
)->external_reference
;
805 symp
!= (ieee_symbol_type
*)NULL
;
807 location
[symp
->index
+ ieee
->external_reference_base_offset
] =
814 location
[abfd
->symcount
] = (asymbol
*)NULL
;
816 return abfd
->symcount
;
819 DEFUN(get_section_entry
,(abfd
, ieee
,index
),
821 ieee_data_type
*ieee AND
824 if (ieee
->section_table
[index
] == (asection
*)NULL
) {
825 asection
*section
= bfd_make_section(abfd
, " tempname");
826 ieee
->section_table
[index
] = section
;
827 section
->flags
= SEC_NO_FLAGS
;
828 section
->target_index
= index
;
829 ieee
->section_table
[index
] = section
;
831 return ieee
->section_table
[index
];
835 DEFUN(ieee_slurp_sections
,(abfd
),
838 ieee_data_type
*ieee
= IEEE_DATA(abfd
);
839 file_ptr offset
= ieee
->w
.r
.section_part
;
841 asection
*section
= (asection
*)NULL
;
844 bfd_byte section_type
[3];
845 ieee_seek(abfd
, offset
);
847 switch (this_byte(&(ieee
->h
))) {
848 case ieee_section_type_enum
:
850 unsigned int section_index
;
851 next_byte(&(ieee
->h
));
852 section_index
= must_parse_int(&(ieee
->h
));
853 /* Fixme to be nice about a silly number of sections */
854 BFD_ASSERT(section_index
< NSECTIONS
);
856 section
=get_section_entry(abfd
, ieee
, section_index
);
858 section_type
[0] = this_byte_and_next(&(ieee
->h
));
859 switch (section_type
[0]) {
861 /* Normal attributes for absolute sections */
862 section_type
[1] = this_byte(&(ieee
->h
));
863 section
->flags
= SEC_LOAD
| SEC_ALLOC
| SEC_HAS_CONTENTS
;
864 switch(section_type
[1]) {
866 next_byte(&(ieee
->h
));
867 section_type
[2] = this_byte(&(ieee
->h
));
868 switch (section_type
[2])
872 next_byte(&(ieee
->h
));
873 section
->flags
|= SEC_LOAD
| SEC_CODE
;
876 next_byte(&(ieee
->h
));
877 section
->flags
|= SEC_LOAD
| SEC_DATA
;
881 next_byte(&(ieee
->h
));
882 /* Normal rom data */
883 section
->flags
|= SEC_LOAD
| SEC_ROM
| SEC_DATA
;
891 section_type
[1] = this_byte(&(ieee
->h
));
892 section
->flags
= SEC_LOAD
| SEC_ALLOC
| SEC_HAS_CONTENTS
;
893 switch (section_type
[1]) {
896 next_byte(&(ieee
->h
));
897 section
->flags
|= SEC_LOAD
| SEC_CODE
;
900 next_byte(&(ieee
->h
));
901 section
->flags
|= SEC_LOAD
| SEC_DATA
;
905 next_byte(&(ieee
->h
));
906 /* Normal rom data */
907 section
->flags
|= SEC_LOAD
| SEC_ROM
| SEC_DATA
;
913 section
->name
= read_id(&(ieee
->h
));
914 { bfd_vma parent
, brother
, context
;
915 parse_int(&(ieee
->h
), &parent
);
916 parse_int(&(ieee
->h
), &brother
);
917 parse_int(&(ieee
->h
), &context
);
923 case ieee_section_alignment_enum
:
925 unsigned int section_index
;
928 next_byte(&(ieee
->h
));
929 section_index
= must_parse_int(&ieee
->h
);
930 section
= get_section_entry(abfd
, ieee
, section_index
);
931 if (section_index
> ieee
->section_count
) {
932 ieee
->section_count
= section_index
;
934 section
->alignment_power
=
935 bfd_log2(must_parse_int(&ieee
->h
));
936 (void)parse_int(&(ieee
->h
), & value
);
939 case ieee_e2_first_byte_enum
:
941 ieee_record_enum_type t
= (ieee_record_enum_type
)(read_2bytes(&(ieee
->h
)));
944 case ieee_section_size_enum
:
945 section
= ieee
->section_table
[must_parse_int(&(ieee
->h
))];
946 section
->_raw_size
= must_parse_int(&(ieee
->h
));
948 case ieee_physical_region_size_enum
:
949 section
= ieee
->section_table
[must_parse_int(&(ieee
->h
))];
950 section
->_raw_size
= must_parse_int(&(ieee
->h
));
952 case ieee_region_base_address_enum
:
953 section
= ieee
->section_table
[must_parse_int(&(ieee
->h
))];
954 section
->vma
= must_parse_int(&(ieee
->h
));
956 case ieee_mau_size_enum
:
957 must_parse_int(&(ieee
->h
));
958 must_parse_int(&(ieee
->h
));
960 case ieee_m_value_enum
:
961 must_parse_int(&(ieee
->h
));
962 must_parse_int(&(ieee
->h
));
964 case ieee_section_base_address_enum
:
965 section
= ieee
->section_table
[must_parse_int(&(ieee
->h
))];
966 section
->vma
= must_parse_int(&(ieee
->h
));
968 case ieee_section_offset_enum
:
969 (void) must_parse_int(&(ieee
->h
));
970 (void) must_parse_int(&(ieee
->h
));
984 /***********************************************************************
988 DEFUN(ieee_archive_p
,(abfd
),
995 uint8e_type buffer
[512];
997 int buffer_offset
= 0;
998 ieee_ar_data_type
*save
= abfd
->tdata
.ieee_ar_data
;
999 ieee_ar_data_type
*ieee
;
1000 abfd
->tdata
.ieee_ar_data
= (ieee_ar_data_type
*)bfd_alloc(abfd
, sizeof(ieee_ar_data_type
));
1001 ieee
= IEEE_AR_DATA(abfd
);
1005 bfd_read((PTR
)buffer
, 1, sizeof(buffer
), abfd
);
1007 ieee
->h
.first_byte
= buffer
;
1008 ieee
->h
.input_p
= buffer
;
1010 ieee
->h
.abfd
= abfd
;
1012 if (this_byte(&(ieee
->h
)) != Module_Beginning
) {
1013 abfd
->tdata
.ieee_ar_data
= save
;
1014 return (bfd_target
*)NULL
;
1018 next_byte(&(ieee
->h
));
1019 library
= read_id(&(ieee
->h
));
1020 if (strcmp(library
, "LIBRARY") != 0) {
1021 bfd_release(abfd
, ieee
);
1022 abfd
->tdata
.ieee_ar_data
= save
;
1023 return (bfd_target
*)NULL
;
1025 /* Throw away the filename */
1026 free( read_id(&(ieee
->h
)));
1027 /* This must be an IEEE archive, so we'll buy some space to do
1030 obstack_begin(&ob
, 128);
1033 ieee
->element_count
= 0;
1034 ieee
->element_index
= 0;
1036 next_byte(&(ieee
->h
)); /* Drop the ad part */
1037 must_parse_int(&(ieee
->h
)); /* And the two dummy numbers */
1038 must_parse_int(&(ieee
->h
));
1041 /* Read the index of the BB table */
1043 ieee_ar_obstack_type t
;
1044 int rec
=read_2bytes(&(ieee
->h
));
1045 if (rec
==(int)ieee_assign_value_to_variable_enum
) {
1046 int record_number
= must_parse_int(&(ieee
->h
));
1047 t
.file_offset
= must_parse_int(&(ieee
->h
));
1048 t
.abfd
= (bfd
*)NULL
;
1049 ieee
->element_count
++;
1051 obstack_grow(&ob
, (PTR
)&t
, sizeof(t
));
1053 /* Make sure that we don't go over the end of the buffer */
1055 if (ieee_pos(abfd
) > sizeof(buffer
)/2) {
1056 /* Past half way, reseek and reprime */
1057 buffer_offset
+= ieee_pos(abfd
);
1058 bfd_seek(abfd
, buffer_offset
, SEEK_SET
);
1059 bfd_read((PTR
)buffer
, 1, sizeof(buffer
), abfd
);
1060 ieee
->h
.first_byte
= buffer
;
1061 ieee
->h
.input_p
= buffer
;
1067 ieee
->elements
= obstack_finish(&ob
);
1069 /* Now scan the area again, and replace BB offsets with file */
1073 for (i
= 2; i
< ieee
->element_count
; i
++) {
1074 bfd_seek(abfd
, ieee
->elements
[i
].file_offset
, SEEK_SET
);
1075 bfd_read((PTR
)buffer
, 1, sizeof(buffer
), abfd
);
1076 ieee
->h
.first_byte
= buffer
;
1077 ieee
->h
.input_p
= buffer
;
1079 next_byte(&(ieee
->h
)); /* Drop F8 */
1080 next_byte(&(ieee
->h
)); /* Drop 14 */
1081 must_parse_int(&(ieee
->h
)); /* Drop size of block */
1082 if (must_parse_int(&(ieee
->h
)) != 0) {
1083 /* This object has been deleted */
1084 ieee
->elements
[i
].file_offset
= 0;
1087 ieee
->elements
[i
].file_offset
= must_parse_int(&(ieee
->h
));
1096 DEFUN(ieee_mkobject
,(abfd
),
1099 abfd
->tdata
.ieee_data
= (ieee_data_type
*)bfd_zalloc(abfd
,sizeof(ieee_data_type
));
1106 DEFUN(ieee_object_p
,(abfd
),
1111 ieee_data_type
*ieee
;
1112 uint8e_type buffer
[300];
1113 ieee_data_type
*save
= IEEE_DATA(abfd
);
1114 abfd
->tdata
.ieee_data
= 0;
1115 ieee_mkobject(abfd
);
1117 ieee
= IEEE_DATA(abfd
);
1118 bfd_seek(abfd
, 0, 0);
1119 /* Read the first few bytes in to see if it makes sense */
1120 bfd_read((PTR
)buffer
, 1, sizeof(buffer
), abfd
);
1122 ieee
->h
.input_p
= buffer
;
1123 if (this_byte_and_next(&(ieee
->h
)) != Module_Beginning
) goto fail
;
1125 ieee
->read_symbols
= false;
1126 ieee
->read_data
= false;
1127 ieee
->section_count
= 0;
1128 ieee
->external_symbol_max_index
= 0;
1129 ieee
->external_symbol_min_index
= IEEE_PUBLIC_BASE
;
1130 ieee
->external_reference_min_index
=IEEE_REFERENCE_BASE
;
1131 ieee
->external_reference_max_index
= 0;
1132 ieee
->h
.abfd
= abfd
;
1133 memset((PTR
)ieee
->section_table
, 0, sizeof(ieee
->section_table
));
1135 processor
= ieee
->mb
.processor
= read_id(&(ieee
->h
));
1136 if (strcmp(processor
,"LIBRARY") == 0) goto fail
;
1137 ieee
->mb
.module_name
= read_id(&(ieee
->h
));
1138 if (abfd
->filename
== (CONST
char *)NULL
) {
1139 abfd
->filename
= ieee
->mb
.module_name
;
1141 /* Determine the architecture and machine type of the object file.
1144 bfd_arch_info_type
*arch
= bfd_scan_arch(processor
);
1145 if (arch
== 0) goto fail
;
1146 abfd
->arch_info
= arch
;
1149 if (this_byte(&(ieee
->h
)) != (int)ieee_address_descriptor_enum
) {
1152 next_byte(&(ieee
->h
));
1154 if (parse_int(&(ieee
->h
), &ieee
->ad
.number_of_bits_mau
) == false) {
1157 if(parse_int(&(ieee
->h
), &ieee
->ad
.number_of_maus_in_address
) == false) {
1161 /* If there is a byte order info, take it */
1162 if (this_byte(&(ieee
->h
)) == (int)ieee_variable_L_enum
||
1163 this_byte(&(ieee
->h
)) == (int)ieee_variable_M_enum
)
1164 next_byte(&(ieee
->h
));
1167 for (part
= 0; part
< N_W_VARIABLES
; part
++) {
1169 if (read_2bytes(&(ieee
->h
)) != (int) ieee_assign_value_to_variable_enum
) {
1172 if (this_byte_and_next(&(ieee
->h
)) != part
) {
1176 ieee
->w
.offset
[part
] = parse_i(&(ieee
->h
), &ok
);
1182 abfd
->flags
= HAS_SYMS
;
1184 /* By now we know that this is a real IEEE file, we're going to read
1185 the whole thing into memory so that we can run up and down it
1186 quickly. We can work out how big the file is from the trailer
1189 IEEE_DATA(abfd
)->h
.first_byte
= (uint8e_type
*) bfd_alloc(ieee
->h
.abfd
, ieee
->w
.r
.me_record
1191 bfd_seek(abfd
, 0, 0);
1192 bfd_read((PTR
)(IEEE_DATA(abfd
)->h
.first_byte
), 1, ieee
->w
.r
.me_record
+50, abfd
);
1194 ieee_slurp_sections(abfd
);
1197 (void) bfd_release(abfd
, ieee
);
1198 abfd
->tdata
.ieee_data
= save
;
1199 return (bfd_target
*)NULL
;
1204 DEFUN(ieee_print_symbol
,(ignore_abfd
, afile
, symbol
, how
),
1205 bfd
*ignore_abfd AND
1208 bfd_print_symbol_type how
)
1210 FILE *file
= (FILE *)afile
;
1213 case bfd_print_symbol_name
:
1214 fprintf(file
,"%s", symbol
->name
);
1216 case bfd_print_symbol_more
:
1218 fprintf(file
,"%4x %2x",aout_symbol(symbol
)->desc
& 0xffff,
1219 aout_symbol(symbol
)->other
& 0xff);
1223 case bfd_print_symbol_nm
:
1224 case bfd_print_symbol_all
:
1226 CONST
char *section_name
= symbol
->section
== (asection
*)NULL
?
1227 (CONST
char *)"*abs" : symbol
->section
->name
;
1228 if (symbol
->name
[0] == ' ') {
1229 fprintf(file
,"* empty table entry ");
1232 bfd_print_symbol_vandf((PTR
)file
,symbol
);
1234 fprintf(file
," %-5s %04x %02x %s",
1236 (unsigned) ieee_symbol(symbol
)->index
,
1238 aout_symbol(symbol)->desc & 0xffff,
1239 aout_symbol(symbol)->other & 0xff,*/
1249 DEFUN(do_one
,(ieee
, current_map
, location_ptr
,s
),
1250 ieee_data_type
*ieee AND
1251 ieee_per_section_type
*current_map AND
1252 uint8e_type
*location_ptr AND
1255 switch (this_byte(&(ieee
->h
)))
1257 case ieee_load_constant_bytes_enum
:
1259 unsigned int number_of_maus
;
1261 next_byte(&(ieee
->h
));
1262 number_of_maus
= must_parse_int(&(ieee
->h
));
1264 for (i
= 0; i
< number_of_maus
; i
++) {
1265 location_ptr
[current_map
->pc
++]= this_byte(&(ieee
->h
));
1266 next_byte(&(ieee
->h
));
1271 case ieee_load_with_relocation_enum
:
1273 boolean loop
= true;
1274 next_byte(&(ieee
->h
));
1277 switch (this_byte(&(ieee
->h
)))
1279 case ieee_variable_R_enum
:
1281 case ieee_function_signed_open_b_enum
:
1282 case ieee_function_unsigned_open_b_enum
:
1283 case ieee_function_either_open_b_enum
:
1285 unsigned int extra
= 4;
1286 boolean pcrel
= false;
1288 ieee_reloc_type
*r
=
1289 (ieee_reloc_type
*) bfd_alloc(ieee
->h
.abfd
,
1290 sizeof(ieee_reloc_type
));
1292 *(current_map
->reloc_tail_ptr
) = r
;
1293 current_map
->reloc_tail_ptr
= &r
->next
;
1294 r
->next
= (ieee_reloc_type
*)NULL
;
1295 next_byte(&(ieee
->h
));
1298 parse_expression(ieee
,
1301 &pcrel
, &extra
, §ion
);
1302 r
->relent
.address
= current_map
->pc
;
1304 if (r
->relent
.sym_ptr_ptr
== 0) {
1305 r
->relent
.sym_ptr_ptr
= section
->symbol_ptr_ptr
;
1308 if (this_byte(&(ieee
->h
)) == (int)ieee_comma
) {
1309 next_byte(&(ieee
->h
));
1310 /* Fetch number of bytes to pad */
1311 extra
= must_parse_int(&(ieee
->h
));
1314 switch (this_byte(&(ieee
->h
))) {
1315 case ieee_function_signed_close_b_enum
:
1316 next_byte(&(ieee
->h
));
1318 case ieee_function_unsigned_close_b_enum
:
1319 next_byte(&(ieee
->h
));
1321 case ieee_function_either_close_b_enum
:
1322 next_byte(&(ieee
->h
));
1327 /* Build a relocation entry for this type */
1328 /* If pc rel then stick -ve pc into instruction
1329 and take out of reloc ..
1331 I've changed this. It's all too
1332 complicated. I keep 0 in the
1343 #if KEEPMINUSPCININST
1344 bfd_put_32(ieee
->h
.abfd
, -current_map
->pc
, location_ptr
+
1346 r
->relent
.howto
= &rel32_howto
;
1350 bfd_put_32(ieee
->h
.abfd
,0, location_ptr
+
1352 r
->relent
.howto
= &rel32_howto
;
1357 bfd_put_32(ieee
->h
.abfd
, 0, location_ptr
+
1359 r
->relent
.howto
= &abs32_howto
;
1361 current_map
->pc
+=4;
1364 if (pcrel
== true) {
1365 #if KEEPMINUSPCININST
1366 bfd_put_16(ieee
->h
.abfd
, (int)(-current_map
->pc
), location_ptr
+current_map
->pc
);
1367 r
->relent
.addend
-= current_map
->pc
;
1368 r
->relent
.howto
= &rel16_howto
;
1371 bfd_put_16(ieee
->h
.abfd
, 0, location_ptr
+current_map
->pc
);
1372 r
->relent
.howto
= &rel16_howto
;
1377 bfd_put_16(ieee
->h
.abfd
, 0, location_ptr
+current_map
->pc
);
1378 r
->relent
.howto
= &abs16_howto
;
1380 current_map
->pc
+=2;
1383 if (pcrel
== true) {
1384 #if KEEPMINUSPCININST
1385 bfd_put_8(ieee
->h
.abfd
, (int)(-current_map
->pc
), location_ptr
+current_map
->pc
);
1386 r
->relent
.addend
-= current_map
->pc
;
1387 r
->relent
.howto
= &rel8_howto
;
1389 bfd_put_8(ieee
->h
.abfd
,0, location_ptr
+current_map
->pc
);
1390 r
->relent
.howto
= &rel8_howto
;
1394 bfd_put_8(ieee
->h
.abfd
, 0, location_ptr
+current_map
->pc
);
1395 r
->relent
.howto
= &abs8_howto
;
1397 current_map
->pc
+=1;
1409 if (parse_int(&(ieee
->h
), &this_size
) == true) {
1411 for (i
= 0; i
< this_size
; i
++) {
1412 location_ptr
[current_map
->pc
++] = this_byte(&(ieee
->h
));
1413 next_byte(&(ieee
->h
));
1426 /* Read in all the section data and relocation stuff too */
1428 DEFUN(ieee_slurp_section_data
,(abfd
),
1431 bfd_byte
*location_ptr
= (bfd_byte
*)NULL
;
1432 ieee_data_type
*ieee
= IEEE_DATA(abfd
);
1433 unsigned int section_number
;
1435 ieee_per_section_type
*current_map
= (ieee_per_section_type
*)NULL
;
1437 /* Seek to the start of the data area */
1438 if (ieee
->read_data
== true) return true;
1439 ieee
->read_data
= true;
1440 ieee_seek(abfd
, ieee
->w
.r
.data_part
);
1442 /* Allocate enough space for all the section contents */
1445 for (s
= abfd
->sections
; s
!= (asection
*)NULL
; s
= s
->next
) {
1446 ieee_per_section_type
*per
= (ieee_per_section_type
*) s
->used_by_bfd
;
1447 per
->data
= (bfd_byte
*) bfd_alloc(ieee
->h
.abfd
, s
->_raw_size
);
1449 per
->reloc_tail_ptr
=
1450 (ieee_reloc_type
**)&(s
->relocation
);
1456 switch (this_byte(&(ieee
->h
)))
1458 /* IF we see anything strange then quit */
1462 case ieee_set_current_section_enum
:
1463 next_byte(&(ieee
->h
));
1464 section_number
= must_parse_int(&(ieee
->h
));
1465 s
= ieee
->section_table
[section_number
];
1466 current_map
= (ieee_per_section_type
*) s
->used_by_bfd
;
1467 location_ptr
= current_map
->data
- s
->vma
;
1468 /* The document I have says that Microtec's compilers reset */
1469 /* this after a sec section, even though the standard says not */
1471 current_map
->pc
=s
->vma
;
1475 case ieee_e2_first_byte_enum
:
1476 next_byte(&(ieee
->h
));
1477 switch (this_byte(&(ieee
->h
)))
1479 case ieee_set_current_pc_enum
& 0xff:
1483 ieee_symbol_index_type symbol
;
1486 next_byte(&(ieee
->h
));
1487 must_parse_int(&(ieee
->h
)); /* Thow away section #*/
1488 parse_expression(ieee
, &value
,
1492 current_map
->pc
= value
;
1493 BFD_ASSERT((unsigned)(value
- s
->vma
) <= s
->_raw_size
);
1497 case ieee_value_starting_address_enum
& 0xff:
1498 /* We've got to the end of the data now - */
1505 case ieee_repeat_data_enum
:
1507 /* Repeat the following LD or LR n times - we do this by
1508 remembering the stream pointer before running it and
1509 resetting it and running it n times. We special case
1510 the repetition of a repeat_data/load_constant
1513 unsigned int iterations
;
1514 uint8e_type
*start
;
1515 next_byte(&(ieee
->h
));
1516 iterations
= must_parse_int(&(ieee
->h
));
1517 start
= ieee
->h
.input_p
;
1518 if (start
[0] == (int)ieee_load_constant_bytes_enum
&&
1520 while (iterations
!= 0) {
1521 location_ptr
[current_map
->pc
++] = start
[2];
1524 next_byte(&(ieee
->h
));
1525 next_byte(&(ieee
->h
));
1526 next_byte(&(ieee
->h
));
1529 while (iterations
!= 0) {
1530 ieee
->h
.input_p
= start
;
1531 do_one(ieee
, current_map
, location_ptr
,s
);
1537 case ieee_load_constant_bytes_enum
:
1538 case ieee_load_with_relocation_enum
:
1540 do_one(ieee
, current_map
, location_ptr
,s
);
1551 DEFUN(ieee_new_section_hook
,(abfd
, newsect
),
1555 newsect
->used_by_bfd
= (PTR
)
1556 bfd_alloc(abfd
, sizeof(ieee_per_section_type
));
1557 ieee_per_section( newsect
)->data
= (bfd_byte
*)NULL
;
1558 ieee_per_section(newsect
)->section
= newsect
;
1564 DEFUN(ieee_get_reloc_upper_bound
,(abfd
, asect
),
1568 ieee_slurp_section_data(abfd
);
1569 return (asect
->reloc_count
+1) * sizeof(arelent
*);
1573 DEFUN(ieee_get_section_contents
,(abfd
, section
, location
, offset
, count
),
1578 bfd_size_type count
)
1580 ieee_per_section_type
*p
= (ieee_per_section_type
*) section
->used_by_bfd
;
1581 ieee_slurp_section_data(abfd
);
1582 (void) memcpy((PTR
)location
, (PTR
)(p
->data
+ offset
), (unsigned)count
);
1588 DEFUN(ieee_canonicalize_reloc
,(abfd
, section
, relptr
, symbols
),
1591 arelent
**relptr AND
1594 /* ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;*/
1595 ieee_reloc_type
*src
= (ieee_reloc_type
*)(section
->relocation
);
1596 ieee_data_type
*ieee
= IEEE_DATA(abfd
);
1598 while (src
!= (ieee_reloc_type
*)NULL
) {
1599 /* Work out which symbol to attach it this reloc to */
1600 switch (src
->symbol
.letter
) {
1602 src
->relent
.sym_ptr_ptr
=
1603 symbols
+ src
->symbol
.index
+ ieee
->external_reference_base_offset
;
1606 src
->relent
.sym_ptr_ptr
= bfd_abs_section
.symbol_ptr_ptr
;
1612 *relptr
++ = &src
->relent
;
1615 *relptr
= (arelent
*)NULL
;
1616 return section
->reloc_count
;
1622 DEFUN(comp
,(ap
, bp
),
1626 arelent
*a
= *((arelent
**)ap
);
1627 arelent
*b
= *((arelent
**)bp
);
1628 return a
->address
- b
->address
;
1632 Write the section headers
1636 DEFUN(ieee_write_section_part
,(abfd
),
1639 ieee_data_type
*ieee
= IEEE_DATA(abfd
);
1641 ieee
->w
.r
.section_part
= bfd_tell(abfd
);
1642 for (s
= abfd
->sections
; s
!= (asection
*)NULL
; s
=s
->next
) {
1643 if (s
!= &bfd_abs_section
)
1646 ieee_write_byte(abfd
, ieee_section_type_enum
);
1647 ieee_write_byte(abfd
, s
->index
+ IEEE_SECTION_NUMBER_BASE
);
1649 if (abfd
->flags
& EXEC_P
)
1651 /* This image is executable, so output absolute sections */
1652 ieee_write_byte(abfd
, ieee_variable_A_enum
);
1653 ieee_write_byte(abfd
, ieee_variable_S_enum
);
1657 ieee_write_byte(abfd
, ieee_variable_C_enum
);
1660 switch (s
->flags
&(SEC_CODE
| SEC_DATA
| SEC_ROM
))
1662 case SEC_CODE
| SEC_LOAD
:
1664 ieee_write_byte(abfd
, ieee_variable_P_enum
);
1668 ieee_write_byte(abfd
, ieee_variable_D_enum
);
1671 case SEC_ROM
| SEC_DATA
:
1672 case SEC_ROM
| SEC_LOAD
:
1673 case SEC_ROM
| SEC_DATA
| SEC_LOAD
:
1675 ieee_write_byte(abfd
, ieee_variable_R_enum
);
1679 ieee_write_id(abfd
, s
->name
);
1681 ieee_write_int(abfd
, 0); /* Parent */
1682 ieee_write_int(abfd
, 0); /* Brother */
1683 ieee_write_int(abfd
, 0); /* Context */
1686 ieee_write_byte(abfd
, ieee_section_alignment_enum
);
1687 ieee_write_byte(abfd
, s
->index
+ IEEE_SECTION_NUMBER_BASE
);
1688 ieee_write_int(abfd
, 1 << s
->alignment_power
);
1691 ieee_write_2bytes(abfd
, ieee_section_size_enum
);
1692 ieee_write_byte(abfd
, s
->index
+ IEEE_SECTION_NUMBER_BASE
);
1693 ieee_write_int(abfd
, s
->_raw_size
);
1694 if (abfd
->flags
& EXEC_P
) {
1695 /* Relocateable sections don't have asl records */
1697 ieee_write_2bytes(abfd
, ieee_section_base_address_enum
);
1698 ieee_write_byte(abfd
, s
->index
+ IEEE_SECTION_NUMBER_BASE
);
1699 ieee_write_int(abfd
, s
->vma
);
1709 DEFUN(do_with_relocs
,(abfd
, s
),
1713 unsigned int relocs_to_go
= s
->reloc_count
;
1716 bfd_byte
*stream
= ieee_per_section(s
)->data
;
1717 arelent
**p
= s
->orelocation
;
1719 bfd_size_type current_byte_index
= 0;
1721 qsort(s
->orelocation
,
1726 /* Output the section preheader */
1727 ieee_write_byte(abfd
, ieee_set_current_section_enum
);
1728 ieee_write_byte(abfd
, s
->index
+ IEEE_SECTION_NUMBER_BASE
);
1730 ieee_write_twobyte(abfd
, ieee_set_current_pc_enum
);
1731 ieee_write_byte(abfd
, s
->index
+ IEEE_SECTION_NUMBER_BASE
);
1732 ieee_write_expression(abfd
, 0, s
->symbol
, 0, 0);
1734 if (relocs_to_go
== 0)
1736 /* If there arn't any relocations then output the load constant byte
1737 opcode rather than the load with relocation opcode */
1739 while (current_byte_index
< s
->_raw_size
) {
1741 unsigned int MAXRUN
= 32;
1743 if (run
> s
->_raw_size
- current_byte_index
) {
1744 run
= s
->_raw_size
- current_byte_index
;
1748 ieee_write_byte(abfd
, ieee_load_constant_bytes_enum
);
1749 /* Output a stream of bytes */
1750 ieee_write_int(abfd
, run
);
1751 bfd_write((PTR
)(stream
+ current_byte_index
),
1755 current_byte_index
+= run
;
1761 ieee_write_byte(abfd
, ieee_load_with_relocation_enum
);
1764 /* Output the data stream as the longest sequence of bytes
1765 possible, allowing for the a reasonable packet size and
1766 relocation stuffs */
1768 if ((PTR
)stream
== (PTR
)NULL
) {
1769 /* Outputting a section without data, fill it up */
1770 stream
= (uint8e_type
*)(bfd_alloc(abfd
, s
->_raw_size
));
1771 memset((PTR
)stream
, 0, s
->_raw_size
);
1773 while (current_byte_index
< s
->_raw_size
) {
1775 unsigned int MAXRUN
= 32;
1777 run
= (*p
)->address
- current_byte_index
;
1782 if (run
> s
->_raw_size
- current_byte_index
) {
1783 run
= s
->_raw_size
- current_byte_index
;
1787 /* Output a stream of bytes */
1788 ieee_write_int(abfd
, run
);
1789 bfd_write((PTR
)(stream
+ current_byte_index
),
1793 current_byte_index
+= run
;
1795 /* Output any relocations here */
1796 if (relocs_to_go
&& (*p
) && (*p
)->address
== current_byte_index
) {
1797 while (relocs_to_go
&& (*p
) && (*p
)->address
== current_byte_index
) {
1803 if (r
->howto
->pc_relative
) {
1804 r
->addend
+= current_byte_index
;
1808 switch (r
->howto
->size
) {
1811 ov
= bfd_get_32(abfd
,
1812 stream
+current_byte_index
);
1813 current_byte_index
+=4;
1816 ov
= bfd_get_16(abfd
,
1817 stream
+current_byte_index
);
1818 current_byte_index
+=2;
1821 ov
= bfd_get_8(abfd
,
1822 stream
+current_byte_index
);
1823 current_byte_index
++;
1829 ieee_write_byte(abfd
, ieee_function_either_open_b_enum
);
1832 if (r
->sym_ptr_ptr
!= (asymbol
**)NULL
) {
1833 ieee_write_expression(abfd
, r
->addend
+ ov
,
1835 r
->howto
->pc_relative
, s
->index
);
1838 ieee_write_expression(abfd
, r
->addend
+ ov
,
1840 r
->howto
->pc_relative
, s
->index
);
1843 if (1 || r
->howto
->size
!= 2) {
1844 ieee_write_byte(abfd
, ieee_comma
);
1845 ieee_write_int(abfd
, 1<< r
->howto
->size
);
1847 ieee_write_byte(abfd
,
1848 ieee_function_either_close_b_enum
);
1859 /* If there are no relocations in the output section then we can
1860 be clever about how we write. We block items up into a max of 127
1864 DEFUN(do_as_repeat
, (abfd
, s
),
1868 ieee_write_byte(abfd
, ieee_set_current_section_enum
);
1869 ieee_write_byte(abfd
, s
->index
+ IEEE_SECTION_NUMBER_BASE
);
1870 ieee_write_byte(abfd
, ieee_set_current_pc_enum
>> 8);
1871 ieee_write_byte(abfd
, ieee_set_current_pc_enum
& 0xff);
1872 ieee_write_byte(abfd
, s
->index
+ IEEE_SECTION_NUMBER_BASE
);
1873 ieee_write_int(abfd
, s
->vma
);
1875 ieee_write_byte(abfd
,ieee_repeat_data_enum
);
1876 ieee_write_int(abfd
, s
->_raw_size
);
1877 ieee_write_byte(abfd
, ieee_load_constant_bytes_enum
);
1878 ieee_write_byte(abfd
, 1);
1879 ieee_write_byte(abfd
, 0);
1883 DEFUN(do_without_relocs
, (abfd
, s
),
1887 bfd_byte
*stream
= ieee_per_section(s
)->data
;
1889 if (stream
== 0 || ((s
->flags
& SEC_LOAD
) == 0))
1891 do_as_repeat(abfd
, s
);
1896 for (i
= 0; i
< s
->_raw_size
; i
++) {
1897 if (stream
[i
] != 0) {
1898 do_with_relocs(abfd
, s
);
1902 do_as_repeat(abfd
, s
);
1908 static unsigned char *output_ptr_start
;
1909 static unsigned char *output_ptr
;
1910 static unsigned char *output_ptr_end
;
1911 static unsigned char *input_ptr_start
;
1912 static unsigned char *input_ptr
;
1913 static unsigned char *input_ptr_end
;
1914 static bfd
*input_bfd
;
1915 static bfd
*output_bfd
;
1916 static int output_buffer
;
1920 bfd_read((PTR
)input_ptr_start
, 1, input_ptr_end
- input_ptr_start
, input_bfd
);
1921 input_ptr
= input_ptr_start
;
1925 bfd_write((PTR
)(output_ptr_start
),1,output_ptr
- output_ptr_start
, output_bfd
);
1926 output_ptr
= output_ptr_start
;
1930 #define THIS() ( *input_ptr )
1931 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill(); }
1932 #define OUT(x) { *output_ptr++ = (x); if(output_ptr == output_ptr_end) flush(); }
1934 static void write_int(value
)
1937 if (value
>= 0 && value
<= 127) {
1941 unsigned int length
;
1942 /* How many significant bytes ? */
1943 /* FIXME FOR LONGER INTS */
1944 if (value
& 0xff000000) {
1947 else if (value
& 0x00ff0000) {
1950 else if (value
& 0x0000ff00) {
1955 OUT((int)ieee_number_repeat_start_enum
+ length
);
1969 static void copy_id()
1971 int length
= THIS();
1981 #define VAR(x) ((x | 0x80))
1982 static void copy_expression()
1991 value
= THIS(); NEXT();
1992 value
= (value
<< 8) | THIS(); NEXT();
1993 value
= (value
<< 8) | THIS(); NEXT();
1994 value
= (value
<< 8) | THIS(); NEXT();
1999 value
= THIS(); NEXT();
2000 value
= (value
<< 8) | THIS(); NEXT();
2001 value
= (value
<< 8) | THIS(); NEXT();
2006 value
= THIS(); NEXT();
2007 value
= (value
<< 8) | THIS(); NEXT();
2012 value
= THIS(); NEXT();
2021 /* Not a number, just bug out with the answer */
2022 write_int(*(--tos
));
2032 int value
= *(--tos
);
2040 int section_number
;
2041 ieee_data_type
*ieee
;
2044 section_number
= THIS();
2047 ieee
= IEEE_DATA(input_bfd
);
2048 s
= ieee
->section_table
[section_number
];
2049 if (s
->output_section
) {
2050 value
= s
->output_section
->vma
;
2051 } else { value
= 0; }
2052 value
+= s
->output_offset
;
2060 write_int(*(--tos
));
2070 /* Drop the int in the buffer, and copy a null into the gap, which we
2071 will overwrite later */
2073 struct output_buffer_struct
{
2074 unsigned char *ptrp
;
2079 DEFUN(fill_int
,(buf
),
2080 struct output_buffer_struct
*buf
)
2082 if (buf
->buffer
== output_buffer
) {
2083 /* Still a chance to output the size */
2084 int value
= output_ptr
- buf
->ptrp
+ 3;
2085 buf
->ptrp
[0] = value
>> 24;
2086 buf
->ptrp
[1] = value
>> 16;
2087 buf
->ptrp
[2] = value
>> 8;
2088 buf
->ptrp
[3] = value
>> 0;
2093 DEFUN(drop_int
,(buf
),
2094 struct output_buffer_struct
*buf
)
2101 case 0x84: ch
= THIS(); NEXT();
2102 case 0x83: ch
= THIS(); NEXT();
2103 case 0x82: ch
= THIS(); NEXT();
2104 case 0x81: ch
= THIS(); NEXT();
2109 buf
->ptrp
= output_ptr
;
2110 buf
->buffer
= output_buffer
;
2111 OUT(0);OUT(0);OUT(0);OUT(0);
2114 static void copy_int()
2122 case 0x84: ch
= THIS(); NEXT(); OUT(ch
);
2123 case 0x83: ch
= THIS(); NEXT(); OUT(ch
);
2124 case 0x82: ch
= THIS(); NEXT(); OUT(ch
);
2125 case 0x81: ch
= THIS(); NEXT(); OUT(ch
);
2131 #define ID copy_id()
2132 #define INT copy_int()
2133 #define EXP copy_expression()
2134 static void copy_till_end();
2135 #define INTn(q) copy_int()
2136 #define EXPn(q) copy_expression()
2137 static void f1_record()
2150 OUT(0xf1); OUT(0xc9);
2151 INT
; INT
; ch
= THIS();
2154 case 0x16: NEXT();break;
2155 case 0x01: NEXT();break;
2156 case 0x00: NEXT(); INT
; break;
2157 case 0x03: NEXT(); INT
; break;
2158 case 0x13: EXPn(instruction address
); break;
2166 OUT(0xf1); OUT(0xd8);
2167 EXP
; EXP
; EXP
; EXP
;
2171 OUT(0xf1);OUT(0xce); INT
; INT
; ch
= THIS(); INT
;
2178 EXPn(external function
); break;
2181 case 0x07: INTn(line number
); INT
;
2183 case 0x0a: INTn(locked
register); INT
; break;
2184 case 0x3f: copy_till_end(); break;
2185 case 0x3e: copy_till_end(); break;
2186 case 0x40: copy_till_end(); break;
2187 case 0x41: ID
; break;
2192 static void f0_record()
2194 /* Attribute record */
2200 static void copy_till_end()
2235 static void f2_record()
2247 static void block();
2248 static void f8_record()
2258 /* Unique typedefs for module */
2259 /* GLobal typedefs */
2260 /* High level module scope beginning */
2262 struct output_buffer_struct ob
;
2275 /* Global function */
2277 struct output_buffer_struct ob
;
2279 OUT(0xf8); OUT(0x04);
2280 drop_int(&ob
); ID
; INTn(stack size
); INTn(ret val
);
2287 EXPn(size of block
);
2293 /* File name for source line numbers */
2295 struct output_buffer_struct ob
;
2297 OUT(0xf8); OUT(0x05);
2299 ID
; INTn(year
); INTn(month
); INTn(day
);
2300 INTn(hour
); INTn(monute
); INTn(second
);
2309 /* Local function */
2310 { struct output_buffer_struct ob
;
2311 NEXT(); OUT(0xf8); OUT(0x06);
2313 ID
; INTn(stack size
); INTn(type
return);
2324 /* Assembler module scope beginning -*/
2325 { struct output_buffer_struct ob
;
2328 OUT(0xf8); OUT(0x0a);
2330 ID
; ID
; INT
; ID
; INT
; INT
; INT
; INT
; INT
; INT
;
2341 struct output_buffer_struct ob
;
2343 OUT(0xf8); OUT(0x0b);
2344 drop_int(&ob
); ID
; INT
; INTn(section index
); EXPn(offset
); INTn(stuff
);
2357 static void e2_record()
2367 static void DEFUN_VOID(block
)
2401 moves all the debug information from the source bfd to the output
2402 bfd, and relocates any expressions it finds
2406 DEFUN(relocate_debug
,(output
, input
),
2412 unsigned char input_buffer
[IBS
];
2414 input_ptr_start
= input_ptr
= input_buffer
;
2415 input_ptr_end
= input_buffer
+ IBS
;
2417 bfd_read((PTR
)input_ptr_start
, 1, IBS
, input
);
2421 During linking, we we told about the bfds which made up our
2422 contents, we have a list of them. They will still be open, so go to
2423 the debug info in each, and copy it out, relocating it as we go.
2427 DEFUN(ieee_write_debug_part
, (abfd
),
2430 ieee_data_type
*ieee
= IEEE_DATA(abfd
);
2431 bfd_chain_type
*chain
= ieee
->chain_root
;
2432 unsigned char output_buffer
[OBS
];
2433 boolean some_debug
= false;
2434 file_ptr here
= bfd_tell(abfd
);
2436 output_ptr_start
= output_ptr
= output_buffer
;
2437 output_ptr_end
= output_buffer
+ OBS
;
2438 output_ptr
= output_buffer
;
2441 if (chain
== (bfd_chain_type
*)NULL
) {
2443 /* There is no debug info, so we'll fake some up */
2444 CONST
static char fake
[] = {
2445 0xf8, 0xa, 0, 5, 't', 't', 't', 't', 't', 0, 2, 3,
2446 '1','.','1',0x82, 1991>>8, 1991 & 0xff, 9, 20, 11, 07,50 };
2447 ieee
->w
.r
.debug_information_part
= 0;
2453 /* bfd_write(fake, 1, sizeof(fake), abfd);*/
2454 /* Now write a header for each section */
2457 asection
*s
= abfd
->sections
;
2459 if (s
!= abfd
->abs_section
)
2462 ieee_write_byte(abfd
, 0xf8);
2463 ieee_write_byte(abfd
, 0x0b);
2464 ieee_write_byte(abfd
, 0);
2465 ieee_write_byte(abfd
, 0);
2466 ieee_write_byte(abfd
, 1);
2467 ieee_write_byte(abfd
, i
+ IEEE_SECTION_NUMBER_BASE
);
2468 ieee_write_expression(abfd
, 0, s
->symbol
, 0, 0, 0);
2469 ieee_write_byte(abfd
,0);
2470 ieee_write_byte(abfd
, 0xf9);
2471 ieee_write_expression(abfd
, s
->size
,
2472 bfd_abs_section
.symbol
, 0, 0, 0);
2479 /* Close the scope */
2480 ieee_write_byte(abfd
, 0xf9);
2485 while (chain
!= (bfd_chain_type
*)NULL
) {
2486 bfd
*entry
= chain
->this;
2487 ieee_data_type
*entry_ieee
= IEEE_DATA(entry
);
2488 if (entry_ieee
->w
.r
.debug_information_part
) {
2489 bfd_seek(entry
, entry_ieee
->w
.r
.debug_information_part
, SEEK_SET
);
2490 relocate_debug(abfd
, entry
);
2493 chain
= chain
->next
;
2496 ieee
->w
.r
.debug_information_part
= here
;
2499 ieee
->w
.r
.debug_information_part
= 0;
2505 /* write the data in an ieee way */
2507 DEFUN(ieee_write_data_part
,(abfd
),
2511 ieee_data_type
*ieee
= IEEE_DATA(abfd
);
2512 ieee
->w
.r
.data_part
= bfd_tell(abfd
);
2513 for (s
= abfd
->sections
; s
!= (asection
*)NULL
; s
= s
->next
)
2515 /* Sort the reloc records so we can insert them in the correct
2517 if (s
->reloc_count
!= 0)
2519 do_with_relocs(abfd
, s
);
2523 do_without_relocs(abfd
, s
);
2531 DEFUN(init_for_output
,(abfd
),
2535 for (s
= abfd
->sections
; s
!= (asection
*)NULL
; s
= s
->next
) {
2536 if (s
->_raw_size
!= 0) {
2537 ieee_per_section(s
)->data
= (bfd_byte
*)(bfd_alloc(abfd
, s
->_raw_size
));
2542 /** exec and core file sections */
2544 /* set section contents is complicated with IEEE since the format is
2545 * not a byte image, but a record stream.
2548 DEFUN(ieee_set_section_contents
,(abfd
, section
, location
, offset
, count
),
2553 bfd_size_type count
)
2555 if (ieee_per_section(section
)->data
== (bfd_byte
*)NULL
) {
2556 init_for_output(abfd
);
2558 (void) memcpy((PTR
)(ieee_per_section(section
)->data
+ offset
),
2560 (unsigned int)count
);
2565 write the external symbols of a file, IEEE considers two sorts of
2566 external symbols, public, and referenced. It uses to internal forms
2567 to index them as well. When we write them out we turn their symbol
2568 values into indexes from the right base.
2571 DEFUN(ieee_write_external_part
,(abfd
),
2575 ieee_data_type
*ieee
= IEEE_DATA(abfd
);
2577 unsigned int reference_index
= IEEE_REFERENCE_BASE
;
2578 unsigned int public_index
= IEEE_PUBLIC_BASE
+2;
2579 file_ptr here
= bfd_tell(abfd
);
2580 boolean hadone
= false;
2581 if (abfd
->outsymbols
!= (asymbol
**)NULL
) {
2583 for (q
= abfd
->outsymbols
; *q
!= (asymbol
*)NULL
; q
++) {
2586 if (p
->section
== &bfd_und_section
) {
2587 /* This must be a symbol reference .. */
2588 ieee_write_byte(abfd
, ieee_external_reference_enum
);
2589 ieee_write_int(abfd
, reference_index
);
2590 ieee_write_id(abfd
, p
->name
);
2591 p
->value
= reference_index
;
2594 else if(p
->section
== &bfd_com_section
) {
2595 /* This is a weak reference */
2596 ieee_write_byte(abfd
, ieee_external_reference_enum
);
2597 ieee_write_int(abfd
, reference_index
);
2598 ieee_write_id(abfd
, p
->name
);
2599 ieee_write_byte(abfd
, ieee_weak_external_reference_enum
);
2600 ieee_write_int(abfd
, reference_index
);
2601 ieee_write_int(abfd
, p
->value
);
2602 ieee_write_int(abfd
, BFD_FORT_COMM_DEFAULT_VALUE
);
2603 p
->value
= reference_index
;
2606 else if(p
->flags
& BSF_GLOBAL
) {
2607 /* This must be a symbol definition */
2610 ieee_write_byte(abfd
, ieee_external_symbol_enum
);
2611 ieee_write_int(abfd
, public_index
);
2612 ieee_write_id(abfd
, p
->name
);
2614 ieee_write_twobyte(abfd
, ieee_attribute_record_enum
);
2615 ieee_write_int(abfd
, public_index
);
2616 ieee_write_byte(abfd
, 15); /* instruction address */
2617 ieee_write_byte(abfd
, 19); /* static symbol */
2618 ieee_write_byte(abfd
, 1); /* one of them */
2621 /* Write out the value */
2622 ieee_write_2bytes(abfd
, ieee_value_record_enum
);
2623 ieee_write_int(abfd
, public_index
);
2624 if (p
->section
!= &bfd_abs_section
)
2626 if (abfd
->flags
& EXEC_P
)
2628 /* If fully linked, then output all symbols
2630 ieee_write_int(abfd
,
2631 p
->value
+ p
->section
->output_offset
+ p
->section
->output_section
->vma
);
2635 ieee_write_expression(abfd
,
2636 p
->value
+ p
->section
->output_offset
,
2637 p
->section
->output_section
->symbol
2643 ieee_write_expression(abfd
,
2645 bfd_abs_section
.symbol
,
2648 p
->value
= public_index
;
2652 /* This can happen - when there are gaps in the symbols read */
2653 /* from an input ieee file */
2658 ieee
->w
.r
.external_part
= here
;
2663 CONST
static unsigned char exten
[] =
2666 0xf1, 0xce, 0x20, 0x00, 37, 3, 3, /* Set version 3 rev 3 */
2667 0xf1, 0xce, 0x20, 0x00, 39, 2, /* keep symbol in original case */
2668 0xf1, 0xce, 0x20, 0x00, 38 /* set object type relocateable to x */
2671 CONST
static unsigned char envi
[] =
2675 /* 0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
2678 0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok */
2680 0xf1, 0xce, 0x21, 0, 53, 0x03, /* host unix */
2681 /* 0xf1, 0xce, 0x21, 0, 54, 2,1,1 tool & version # */
2686 DEFUN(ieee_write_me_part
,(abfd
),
2689 ieee_data_type
*ieee
= IEEE_DATA(abfd
);
2690 ieee
->w
.r
.trailer_part
= bfd_tell(abfd
);
2691 if (abfd
->start_address
) {
2692 ieee
->w
.r
.me_record
= bfd_tell(abfd
);
2693 ieee_write_2bytes(abfd
, ieee_value_starting_address_enum
);
2694 ieee_write_byte(abfd
, ieee_function_either_open_b_enum
);
2695 ieee_write_int(abfd
, abfd
->start_address
);
2696 ieee_write_byte(abfd
, ieee_function_either_close_b_enum
);
2699 ieee
->w
.r
.me_record
= bfd_tell(abfd
);
2701 ieee_write_byte(abfd
, ieee_module_end_enum
);
2705 DEFUN(ieee_write_object_contents
,(abfd
),
2708 ieee_data_type
*ieee
= IEEE_DATA(abfd
);
2711 /* Fast forward over the header area */
2712 bfd_seek(abfd
, 0, 0);
2713 ieee_write_byte(abfd
, ieee_module_beginning_enum
);
2715 ieee_write_id(abfd
, bfd_printable_name(abfd
));
2716 ieee_write_id(abfd
, abfd
->filename
);
2721 /* Fast forward over the variable bits */
2725 ieee_write_byte(abfd
, ieee_address_descriptor_enum
);
2728 ieee_write_byte(abfd
, bfd_arch_bits_per_byte(abfd
));
2729 /* MAU's per address */
2730 ieee_write_byte(abfd
, bfd_arch_bits_per_address(abfd
) /
2731 bfd_arch_bits_per_byte(abfd
));
2734 old
= bfd_tell(abfd
);
2735 bfd_seek(abfd
, 8 * N_W_VARIABLES
, 1);
2738 ieee
->w
.r
.extension_record
= bfd_tell(abfd
);
2739 bfd_write((char *)exten
, 1, sizeof(exten
), abfd
);
2740 if (abfd
->flags
& EXEC_P
)
2741 ieee_write_byte(abfd
, 0x1); /* Absolute */
2743 ieee_write_byte(abfd
, 0x2); /* Relocateable */
2745 ieee
->w
.r
.environmental_record
= bfd_tell(abfd
);
2746 bfd_write((char *)envi
, 1, sizeof(envi
), abfd
);
2750 ieee_write_section_part(abfd
);
2752 First write the symbols, this changes their values into table
2753 indeces so we cant use it after this point
2755 ieee_write_external_part(abfd
);
2756 /* ieee_write_byte(abfd, ieee_record_seperator_enum);*/
2759 /* ieee_write_byte(abfd, ieee_record_seperator_enum);*/
2763 Write any debugs we have been told about
2765 ieee_write_debug_part(abfd
);
2768 Can only write the data once the symbols have been written since
2769 the data contains relocation information which points to the
2772 ieee_write_data_part(abfd
);
2776 At the end we put the end !
2778 ieee_write_me_part(abfd
);
2781 /* Generate the header */
2782 bfd_seek(abfd
, old
, false);
2784 for (i
= 0; i
< N_W_VARIABLES
; i
++) {
2785 ieee_write_2bytes(abfd
,ieee_assign_value_to_variable_enum
);
2786 ieee_write_byte(abfd
, i
);
2787 ieee_write_int5_out(abfd
, ieee
->w
.offset
[i
]);
2795 /* Native-level interface to symbols. */
2797 /* We read the symbols into a buffer, which is discarded when this
2798 function exits. We read the strings into a buffer large enough to
2799 hold them all plus all the cached symbol entries. */
2802 DEFUN(ieee_make_empty_symbol
,(abfd
),
2806 ieee_symbol_type
*new =
2807 (ieee_symbol_type
*)zalloc (sizeof (ieee_symbol_type
));
2808 new->symbol
.the_bfd
= abfd
;
2809 return &new->symbol
;
2814 DEFUN(ieee_openr_next_archived_file
,(arch
, prev
),
2818 ieee_ar_data_type
*ar
= IEEE_AR_DATA(arch
);
2819 /* take the next one from the arch state, or reset */
2820 if (prev
== (bfd
*)NULL
) {
2821 /* Reset the index - the first two entries are bogus*/
2822 ar
->element_index
= 2;
2825 ieee_ar_obstack_type
*p
= ar
->elements
+ ar
->element_index
;
2826 ar
->element_index
++;
2827 if (ar
->element_index
<= ar
->element_count
) {
2828 if (p
->file_offset
!= (file_ptr
)0) {
2829 if (p
->abfd
== (bfd
*)NULL
) {
2830 p
->abfd
= _bfd_create_empty_archive_element_shell(arch
);
2831 p
->abfd
->origin
= p
->file_offset
;
2837 bfd_error
= no_more_archived_files
;
2845 ieee_find_nearest_line(abfd
,
2856 char **filename_ptr
;
2857 char **functionname_ptr
;
2865 ieee_generic_stat_arch_elt(abfd
, buf
)
2869 ieee_ar_data_type
*ar
= abfd
->my_archive
->tdata
.ieee_ar_data
;
2870 if (ar
== (ieee_ar_data_type
*)NULL
) {
2871 bfd_error
= invalid_operation
;
2876 buf
->st_mode
= 0666;
2877 return ! ieee_object_p(abfd
);
2881 DEFUN(ieee_sizeof_headers
,(abfd
, x
),
2891 DEFUN(ieee_bfd_debug_info_start
,(abfd
),
2898 DEFUN(ieee_bfd_debug_info_end
,(abfd
),
2905 /* Add this section to the list of sections we have debug info for, to
2906 be ready to output it at close time
2909 DEFUN(ieee_bfd_debug_info_accumulate
,(abfd
, section
),
2913 ieee_data_type
*ieee
= IEEE_DATA(section
->owner
);
2914 ieee_data_type
*output_ieee
= IEEE_DATA(abfd
);
2915 /* can only accumulate data from other ieee bfds */
2916 if (section
->owner
->xvec
!= abfd
->xvec
)
2918 /* Only bother once per bfd */
2919 if (ieee
->done_debug
== true)
2921 ieee
->done_debug
= true;
2923 /* Don't bother if there is no debug info */
2924 if (ieee
->w
.r
.debug_information_part
== 0)
2930 bfd_chain_type
*n
= (bfd_chain_type
*) bfd_alloc(abfd
, sizeof(bfd_chain_type
));
2931 n
->this = section
->owner
;
2932 n
->next
= (bfd_chain_type
*)NULL
;
2934 if (output_ieee
->chain_head
) {
2935 output_ieee
->chain_head
->next
= n
;
2938 output_ieee
->chain_root
= n
;
2941 output_ieee
->chain_head
= n
;
2951 #define ieee_core_file_failing_command (char *(*)())(bfd_nullvoidptr)
2952 #define ieee_core_file_failing_signal (int (*)())bfd_0
2953 #define ieee_core_file_matches_executable_p ( FOO(boolean, (*),(bfd *, bfd *)))bfd_false
2954 #define ieee_slurp_armap bfd_true
2955 #define ieee_slurp_extended_name_table bfd_true
2956 #define ieee_truncate_arname (void (*)())bfd_nullvoidptr
2957 #define ieee_write_armap (FOO( boolean, (*),(bfd *, unsigned int, struct orl *, unsigned int, int))) bfd_nullvoidptr
2958 #define ieee_get_lineno (struct lineno_cache_entry *(*)())bfd_nullvoidptr
2959 #define ieee_close_and_cleanup bfd_generic_close_and_cleanup
2960 #define ieee_set_arch_mach bfd_default_set_arch_mach
2961 #define ieee_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
2962 #define ieee_bfd_relax_section bfd_generic_relax_section
2964 bfd_target ieee_vec
=
2967 bfd_target_ieee_flavour
,
2968 true, /* target byte order */
2969 true, /* target headers byte order */
2970 (HAS_RELOC
| EXEC_P
| /* object flags */
2971 HAS_LINENO
| HAS_DEBUG
|
2972 HAS_SYMS
| HAS_LOCALS
| DYNAMIC
| WP_TEXT
| D_PAGED
),
2973 ( SEC_CODE
|SEC_DATA
|SEC_ROM
|SEC_HAS_CONTENTS
2974 |SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
), /* section flags */
2975 ' ', /* ar_pad_char */
2976 16, /* ar_max_namelen */
2977 1, /* minimum alignment */
2978 _do_getb64
, _do_putb64
, _do_getb32
, _do_putb32
, _do_getb16
, _do_putb16
, /* data */
2979 _do_getb64
, _do_putb64
, _do_getb32
, _do_putb32
, _do_getb16
, _do_putb16
, /* hdrs */
2981 { _bfd_dummy_target
,
2982 ieee_object_p
, /* bfd_check_format */
2989 _bfd_generic_mkarchive
,
2994 ieee_write_object_contents
,
2995 _bfd_write_archive_contents
,