1 /* BFD back-end for ieee-695 objects.
2 Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
3 Written by Steve Chamberlain of Cygnus Support.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
21 #define KEEPMINUSPCININST 0
23 /* IEEE 695 format is a stream of records, which we parse using a simple one-
24 token (which is one byte in this lexicon) lookahead recursive decent
35 #define obstack_chunk_alloc bfd_xmalloc
36 #define obstack_chunk_free free
38 /* Functions for writing to ieee files in the strange way that the
42 DEFUN(ieee_write_byte,(abfd, byte),
46 bfd_write((PTR)&byte, 1, 1, abfd);
51 DEFUN(ieee_write_twobyte,(abfd, twobyte),
56 b[1] = twobyte & 0xff;
58 bfd_write((PTR)&b[0], 1, 2, abfd);
64 DEFUN(ieee_write_2bytes,(abfd, bytes),
69 buffer[0] = bytes >> 8;
70 buffer[1] = bytes & 0xff;
72 bfd_write((PTR)buffer, 1, 2, abfd);
76 DEFUN(ieee_write_int,(abfd, value),
80 if (((unsigned)value) <= 127) {
81 ieee_write_byte(abfd, value);
85 /* How many significant bytes ? */
86 /* FIXME FOR LONGER INTS */
87 if (value & 0xff000000) {
90 else if (value & 0x00ff0000) {
93 else if (value & 0x0000ff00) {
98 ieee_write_byte(abfd, (int)ieee_number_repeat_start_enum + length);
101 ieee_write_byte(abfd, value >> 24);
103 ieee_write_byte(abfd, value >> 16);
105 ieee_write_byte(abfd, value >> 8);
107 ieee_write_byte(abfd, value);
113 DEFUN(ieee_write_id,(abfd, id),
117 size_t length = strlen(id);
118 if (length >= 0 && length <= 127) {
119 ieee_write_byte(abfd, length);
121 else if (length < 255) {
122 ieee_write_byte(abfd, ieee_extension_length_1_enum);
123 ieee_write_byte(abfd, length);
125 else if (length < 65535) {
126 ieee_write_byte(abfd, ieee_extension_length_2_enum);
127 ieee_write_byte(abfd, length >> 8);
128 ieee_write_byte(abfd, length & 0xff);
133 bfd_write((PTR)id, 1, length, abfd);
135 /***************************************************************************
136 Functions for reading from ieee files in the strange way that the
141 #define this_byte(ieee) *((ieee)->input_p)
142 #define next_byte(ieee) ((ieee)->input_p++)
143 #define this_byte_and_next(ieee) (*((ieee)->input_p++))
146 static unsigned short
147 DEFUN(read_2bytes,(ieee),
148 common_header_type *ieee)
150 unsigned char c1 = this_byte_and_next(ieee);
151 unsigned char c2 = this_byte_and_next(ieee);
152 return (c1<<8 ) | c2;
157 DEFUN(bfd_get_string,(ieee, string, length),
158 common_header_type *ieee AND
163 for (i= 0; i < length; i++) {
164 string[i] = this_byte_and_next(ieee);
169 DEFUN(read_id,(ieee),
170 common_header_type *ieee)
174 length = this_byte_and_next(ieee);
175 if (length >= 0x00 && length <= 0x7f) {
176 /* Simple string of length 0 to 127 */
178 else if (length == 0xde) {
179 /* Length is next byte, allowing 0..255 */
180 length = this_byte_and_next(ieee);
182 else if (length == 0xdf) {
183 /* Length is next two bytes, allowing 0..65535 */
184 length = this_byte_and_next(ieee) ;
185 length = (length * 256) + this_byte_and_next(ieee);
187 /* Buy memory and read string */
188 string = bfd_alloc(ieee->abfd, length+1);
189 bfd_get_string(ieee, string, length);
195 DEFUN(ieee_write_expression,(abfd, value, symbol, pcrel, index),
202 unsigned int term_count = 0;
206 ieee_write_int(abfd, value);
212 if (bfd_is_com_section (symbol->section)
213 || symbol->section == &bfd_und_section)
215 /* Def of a common symbol */
216 ieee_write_byte(abfd, ieee_variable_X_enum);
217 ieee_write_int(abfd, symbol->value);
220 else if (symbol->section != &bfd_abs_section)
222 /* Ref to defined symbol - */
224 ieee_write_byte(abfd, ieee_variable_R_enum);
225 ieee_write_byte(abfd, symbol->section->index + IEEE_SECTION_NUMBER_BASE);
227 if (symbol->flags & BSF_GLOBAL)
229 ieee_write_byte(abfd, ieee_variable_I_enum);
230 ieee_write_int(abfd, symbol->value);
233 else if (symbol->flags & ( BSF_LOCAL | BSF_SECTION_SYM))
235 /* This is a reference to a defined local symbol,
236 We can easily do a local as a section+offset */
237 ieee_write_byte(abfd, ieee_variable_R_enum); /* or L */
238 ieee_write_byte(abfd, symbol->section->index +
239 IEEE_SECTION_NUMBER_BASE);
240 ieee_write_int(abfd, symbol->value);
253 /* subtract the pc from here by asking for PC of this section*/
254 ieee_write_byte(abfd, ieee_variable_P_enum);
255 ieee_write_byte(abfd, index +IEEE_SECTION_NUMBER_BASE);
256 ieee_write_byte(abfd, ieee_function_minus_enum);
261 ieee_write_byte(abfd,0);
264 while (term_count > 1) {
265 ieee_write_byte(abfd, ieee_function_plus_enum);
280 /*****************************************************************************/
283 writes any integer into the buffer supplied and always takes 5 bytes
286 DEFUN(ieee_write_int5,(buffer, value),
290 buffer[0] = (bfd_byte)ieee_number_repeat_4_enum;
291 buffer[1] = (value >> 24 ) & 0xff;
292 buffer[2] = (value >> 16 ) & 0xff;
293 buffer[3] = (value >> 8 ) & 0xff;
294 buffer[4] = (value >> 0 ) & 0xff;
297 DEFUN(ieee_write_int5_out, (abfd, value),
302 ieee_write_int5(b, value);
303 bfd_write((PTR)b,1,5,abfd);
308 DEFUN(parse_int,(ieee, value_ptr),
309 common_header_type *ieee AND
312 int value = this_byte(ieee);
314 if (value >= 0 && value <= 127) {
319 else if (value >= 0x80 && value <= 0x88) {
320 unsigned int count = value & 0xf;
324 result =(result << 8) | this_byte_and_next(ieee);
333 DEFUN(parse_i,(ieee, ok),
334 common_header_type *ieee AND
338 *ok = parse_int(ieee, &x);
343 DEFUN(must_parse_int,(ieee),
344 common_header_type *ieee)
347 BFD_ASSERT(parse_int(ieee, &result) == true);
355 ieee_symbol_index_type symbol;
360 reloc_howto_type abs32_howto
361 = HOWTO(1,0,2,32,false,0,false,true,0,"abs32",true,0xffffffff, 0xffffffff,false);
363 reloc_howto_type abs16_howto
364 = HOWTO(1,0,1,16,false,0,false,true,0,"abs16",true,0x0000ffff, 0x0000ffff,false);
367 reloc_howto_type abs8_howto
368 = HOWTO(1,0,0,8,false,0,false,true,0,"abs8",true,0x000000ff, 0x000000ff,false);
371 reloc_howto_type rel32_howto
372 = HOWTO(1,0,2,32,true,0,false,true,0,"rel32",true,0xffffffff,
376 reloc_howto_type rel16_howto
377 = HOWTO(1,0,1,16,true,0,false,true,0,"rel16",true,0x0000ffff, 0x0000ffff,false);
380 reloc_howto_type rel8_howto
381 = HOWTO(1,0,0,8,true,0,false,true,0,"rel8",true,0x000000ff, 0x000000ff,false);
384 static ieee_symbol_index_type NOSYMBOL = { 0, 0};
388 DEFUN(parse_expression,(ieee, value, symbol, pcrel, extra, section),
389 ieee_data_type *ieee AND
391 ieee_symbol_index_type *symbol AND
393 unsigned int *extra AND
405 ieee_value_type stack[10];
407 /* The stack pointer always points to the next unused location */
408 #define PUSH(x,y,z) TOS.symbol=x;TOS.section=y;TOS.value=z;INC;
409 #define POP(x,y,z) DEC;x=TOS.symbol;y=TOS.section;z=TOS.value;
410 ieee_value_type *sp = stack;
413 switch (this_byte(&(ieee->h)))
415 case ieee_variable_P_enum:
416 /* P variable, current program counter for section n */
419 next_byte(&(ieee->h));
421 section_n = must_parse_int(&(ieee->h));
422 PUSH(NOSYMBOL, &bfd_abs_section,
423 TOS.value = ieee->section_table[section_n]->vma +
424 ieee_per_section(ieee->section_table[section_n])->pc);
427 case ieee_variable_L_enum:
428 /* L variable address of section N */
429 next_byte(&(ieee->h));
430 PUSH(NOSYMBOL,ieee->section_table[must_parse_int(&(ieee->h))],0);
432 case ieee_variable_R_enum:
433 /* R variable, logical address of section module */
434 /* FIXME, this should be different to L */
435 next_byte(&(ieee->h));
436 PUSH(NOSYMBOL,ieee->section_table[must_parse_int(&(ieee->h))],0);
438 case ieee_variable_S_enum:
439 /* S variable, size in MAUS of section module */
440 next_byte(&(ieee->h));
443 ieee->section_table[must_parse_int(&(ieee->h))]->_raw_size);
445 case ieee_variable_I_enum:
446 case ieee_variable_X_enum:
447 /* Push the address of external variable n */
449 ieee_symbol_index_type sy;
450 next_byte(&(ieee->h));
451 sy.index = (int)(must_parse_int(&(ieee->h))) ;
454 PUSH(sy, &bfd_und_section, 0);
457 case ieee_function_minus_enum:
459 bfd_vma value1, value2;
460 asection *section1, *section_dummy;
461 ieee_symbol_index_type sy;
462 next_byte(&(ieee->h));
464 POP(sy, section1, value1);
465 POP(sy, section_dummy, value2);
466 PUSH(sy, section1 ? section1 : section_dummy, value1-value2);
469 case ieee_function_plus_enum:
471 bfd_vma value1, value2;
474 ieee_symbol_index_type sy1;
475 ieee_symbol_index_type sy2;
476 next_byte(&(ieee->h));
478 POP(sy1, section1, value1);
479 POP(sy2, section2, value2);
480 PUSH(sy1.letter ? sy1 : sy2, section1!=&bfd_abs_section ? section1: section2, value1+value2);
486 BFD_ASSERT(this_byte(&(ieee->h)) < (int)ieee_variable_A_enum
487 || this_byte(&(ieee->h)) > (int)ieee_variable_Z_enum);
488 if (parse_int(&(ieee->h), &va))
490 PUSH(NOSYMBOL, &bfd_abs_section, va);
494 Thats all that we can understand. As far as I can see
495 there is a bug in the Microtec IEEE output which I'm
496 using to scan, whereby the comma operator is ommited
497 sometimes in an expression, giving expressions with too
498 many terms. We can tell if that's the case by ensuring
499 that sp == stack here. If not, then we've pushed
500 something too far, so we keep adding
503 while (sp != stack+1) {
505 ieee_symbol_index_type sy1;
506 POP(sy1, section1, *extra);
511 POP(*symbol, dummy, *value);
512 if (section) *section = dummy;
525 #define ieee_seek(abfd, offset) \
526 IEEE_DATA(abfd)->h.input_p = IEEE_DATA(abfd)->h.first_byte + offset
528 #define ieee_pos(abfd) IEEE_DATA(abfd)->h.input_p -IEEE_DATA(abfd)->h.first_byte
530 static unsigned int last_index;
531 static char last_type; /* is the index for an X or a D */
532 static ieee_symbol_type *
533 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 AND
550 /* Need a new symbol */
551 unsigned int new_index = must_parse_int(&(ieee->h));
552 if (new_index != last_index || this_type != last_type) {
553 ieee_symbol_type * new_symbol = (ieee_symbol_type *)bfd_alloc(ieee->h.abfd,
554 sizeof(ieee_symbol_type));
556 new_symbol->index = new_index;
557 last_index = new_index;
560 *pptr = &new_symbol->next;
561 if (new_index > *max_index) {
562 *max_index = new_index;
564 last_type = this_type;
570 DEFUN(ieee_slurp_external_symbols,(abfd),
573 ieee_data_type *ieee = IEEE_DATA(abfd);
574 file_ptr offset = ieee->w.r.external_part;
577 ieee_symbol_type **prev_symbols_ptr = &ieee->external_symbols;
578 ieee_symbol_type **prev_reference_ptr = &ieee->external_reference;
579 ieee_symbol_type *symbol = (ieee_symbol_type *)NULL;
580 unsigned int symbol_count = 0;
582 last_index = 0xffffff;
583 ieee->symbol_table_full = true;
585 ieee_seek(abfd, offset );
588 switch (this_byte(&(ieee->h))) {
590 next_byte(&(ieee->h));
592 symbol = get_symbol(abfd, ieee, symbol, &symbol_count,
594 &ieee->external_symbol_max_index,'D');
597 symbol->symbol.the_bfd = abfd;
598 symbol->symbol.name = read_id(&(ieee->h));
599 symbol->symbol.udata = (PTR)NULL;
600 symbol->symbol.flags = BSF_NO_FLAGS;
604 case ieee_external_symbol_enum:
605 next_byte(&(ieee->h));
607 symbol = get_symbol(abfd, ieee, symbol, &symbol_count,
609 &ieee->external_symbol_max_index,'D');
612 BFD_ASSERT (symbol->index >= ieee->external_symbol_min_index);
614 symbol->symbol.the_bfd = abfd;
615 symbol->symbol.name = read_id(&(ieee->h));
616 symbol->symbol.udata = (PTR)NULL;
617 symbol->symbol.flags = BSF_NO_FLAGS;
619 case ieee_attribute_record_enum >> 8:
621 unsigned int symbol_name_index;
622 unsigned int symbol_type_index;
623 unsigned int symbol_attribute_def;
625 next_byte(&(ieee->h)); /* Skip prefix */
626 next_byte(&(ieee->h));
627 symbol_name_index = must_parse_int(&(ieee->h));
628 symbol_type_index = must_parse_int(&(ieee->h));
629 symbol_attribute_def = must_parse_int(&(ieee->h));
630 switch (symbol_attribute_def) {
632 /* Module misc; followed by two fields which describe the
633 current module block. The first fired is the type id
634 number, the second is the number of asn records
635 associated with the directive */
636 parse_int(&(ieee->h),&value);
637 parse_int(&(ieee->h),&value);
641 parse_int(&(ieee->h),&value);
646 case ieee_value_record_enum >> 8:
648 unsigned int symbol_name_index;
649 ieee_symbol_index_type symbol_ignore;
650 boolean pcrel_ignore;
652 next_byte(&(ieee->h));
653 next_byte(&(ieee->h));
655 symbol_name_index = must_parse_int(&(ieee->h));
656 parse_expression(ieee,
657 &symbol->symbol.value,
661 &symbol->symbol.section);
663 symbol->symbol.flags = BSF_GLOBAL | BSF_EXPORT;
667 case ieee_weak_external_reference_enum:
670 next_byte(&(ieee->h));
671 /* Throw away the external reference index */
672 (void)must_parse_int(&(ieee->h));
673 /* Fetch the default size if not resolved */
674 size = must_parse_int(&(ieee->h));
675 /* Fetch the defautlt value if available */
676 if ( parse_int(&(ieee->h), &value) == false) {
679 /* This turns into a common */
680 symbol->symbol.section = &bfd_com_section;
681 symbol->symbol.value = size;
685 case ieee_external_reference_enum:
686 next_byte(&(ieee->h));
688 symbol = get_symbol(abfd, ieee, symbol, &symbol_count,
690 &ieee->external_reference_max_index,'X');
693 symbol->symbol.the_bfd = abfd;
694 symbol->symbol.name = read_id(&(ieee->h));
695 symbol->symbol.udata = (PTR)NULL;
696 symbol->symbol.section = &bfd_und_section;
697 symbol->symbol.value = (bfd_vma)0;
698 symbol->symbol.flags = 0;
700 BFD_ASSERT (symbol->index >= ieee->external_reference_min_index);
708 if (ieee->external_symbol_max_index != 0) {
709 ieee->external_symbol_count =
710 ieee->external_symbol_max_index -
711 ieee->external_symbol_min_index + 1 ;
714 ieee->external_symbol_count = 0;
718 if(ieee->external_reference_max_index != 0) {
719 ieee->external_reference_count =
720 ieee->external_reference_max_index -
721 ieee->external_reference_min_index + 1;
724 ieee->external_reference_count = 0;
728 ieee->external_reference_count + ieee->external_symbol_count;
730 if (symbol_count != abfd->symcount) {
731 /* There are gaps in the table -- */
732 ieee->symbol_table_full = false;
736 *prev_symbols_ptr = (ieee_symbol_type *)NULL;
737 *prev_reference_ptr = (ieee_symbol_type *)NULL;
741 DEFUN(ieee_slurp_symbol_table,(abfd),
744 if (IEEE_DATA(abfd)->read_symbols == false) {
745 ieee_slurp_external_symbols(abfd);
746 IEEE_DATA(abfd)->read_symbols= true;
751 DEFUN(ieee_get_symtab_upper_bound,(abfd),
754 ieee_slurp_symbol_table (abfd);
756 return (abfd->symcount != 0) ?
757 (abfd->symcount+1) * (sizeof (ieee_symbol_type *)) : 0;
761 Move from our internal lists to the canon table, and insert in
765 extern bfd_target ieee_vec;
767 DEFUN(ieee_get_symtab,(abfd, location),
771 ieee_symbol_type *symp;
772 static bfd dummy_bfd;
773 static asymbol empty_symbol =
774 /* the_bfd, name, value, attr, section */
775 { &dummy_bfd, " ieee empty", (symvalue)0, BSF_DEBUGGING, &bfd_abs_section};
779 ieee_data_type *ieee = IEEE_DATA(abfd);
780 dummy_bfd.xvec= &ieee_vec;
781 ieee_slurp_symbol_table(abfd);
783 if (ieee->symbol_table_full == false) {
784 /* Arrgh - there are gaps in the table, run through and fill them */
785 /* up with pointers to a null place */
787 for (i= 0; i < abfd->symcount; i++) {
788 location[i] = &empty_symbol;
793 ieee->external_symbol_base_offset= - ieee->external_symbol_min_index;
794 for (symp = IEEE_DATA(abfd)->external_symbols;
795 symp != (ieee_symbol_type *)NULL;
797 /* Place into table at correct index locations */
798 location[symp->index + ieee->external_symbol_base_offset] = &symp->symbol;
802 /* The external refs are indexed in a bit */
803 ieee->external_reference_base_offset =
804 - ieee->external_reference_min_index +ieee->external_symbol_count ;
806 for (symp = IEEE_DATA(abfd)->external_reference;
807 symp != (ieee_symbol_type *)NULL;
809 location[symp->index + ieee->external_reference_base_offset] =
818 if (abfd->symcount) {
819 location[abfd->symcount] = (asymbol *)NULL;
821 return abfd->symcount;
824 DEFUN(get_section_entry,(abfd, ieee,index),
826 ieee_data_type *ieee AND
829 if (ieee->section_table[index] == (asection *)NULL) {
830 char *tmp = bfd_alloc(abfd,11);
832 sprintf(tmp," fsec%4d", index);
833 section = bfd_make_section(abfd, tmp);
834 ieee->section_table[index] = section;
835 section->flags = SEC_NO_FLAGS;
836 section->target_index = index;
837 ieee->section_table[index] = section;
839 return ieee->section_table[index];
843 DEFUN(ieee_slurp_sections,(abfd),
846 ieee_data_type *ieee = IEEE_DATA(abfd);
847 file_ptr offset = ieee->w.r.section_part;
849 asection *section = (asection *)NULL;
852 bfd_byte section_type[3];
853 ieee_seek(abfd, offset);
855 switch (this_byte(&(ieee->h))) {
856 case ieee_section_type_enum:
858 unsigned int section_index ;
859 next_byte(&(ieee->h));
860 section_index = must_parse_int(&(ieee->h));
861 /* Fixme to be nice about a silly number of sections */
862 BFD_ASSERT(section_index < NSECTIONS);
864 section =get_section_entry(abfd, ieee, section_index);
866 section_type[0] = this_byte_and_next(&(ieee->h));
867 switch (section_type[0]) {
869 /* Normal attributes for absolute sections */
870 section_type[1] = this_byte(&(ieee->h));
871 section->flags = SEC_LOAD | SEC_ALLOC | SEC_HAS_CONTENTS;
872 switch(section_type[1]) {
874 next_byte(&(ieee->h));
875 section_type[2] = this_byte(&(ieee->h));
876 switch (section_type[2])
880 next_byte(&(ieee->h));
881 section->flags |= SEC_LOAD | SEC_CODE;
884 next_byte(&(ieee->h));
885 section->flags |= SEC_LOAD | SEC_DATA;
889 next_byte(&(ieee->h));
890 /* Normal rom data */
891 section->flags |= SEC_LOAD | SEC_ROM | SEC_DATA;
899 section_type[1] = this_byte(&(ieee->h));
900 section->flags = SEC_LOAD | SEC_ALLOC | SEC_HAS_CONTENTS;
901 switch (section_type[1]) {
904 next_byte(&(ieee->h));
905 section->flags |= SEC_LOAD | SEC_CODE;
908 next_byte(&(ieee->h));
909 section->flags |= SEC_LOAD | SEC_DATA;
913 next_byte(&(ieee->h));
914 /* Normal rom data */
915 section->flags |= SEC_LOAD | SEC_ROM | SEC_DATA;
921 memcpy((char*)section->name, read_id(&(ieee->h)),8);
922 /* Truncate sections to 8 chars */
923 if (strlen(section->name) > 8)
925 char *copy = bfd_alloc(abfd, 9);
926 memcpy(copy, section->name, 8);
928 section->name = copy;
932 bfd_vma parent, brother, context;
933 parse_int(&(ieee->h), &parent);
934 parse_int(&(ieee->h), &brother);
935 parse_int(&(ieee->h), &context);
941 case ieee_section_alignment_enum:
943 unsigned int section_index;
946 next_byte(&(ieee->h));
947 section_index = must_parse_int(&ieee->h);
948 section = get_section_entry(abfd, ieee, section_index);
949 if (section_index > ieee->section_count) {
950 ieee->section_count = section_index;
952 section->alignment_power =
953 bfd_log2(must_parse_int(&ieee->h));
954 (void)parse_int(&(ieee->h), & value);
957 case ieee_e2_first_byte_enum:
959 ieee_record_enum_type t = (ieee_record_enum_type)(read_2bytes(&(ieee->h)));
962 case ieee_section_size_enum:
963 section = ieee->section_table[must_parse_int(&(ieee->h))];
964 section->_raw_size = must_parse_int(&(ieee->h));
966 case ieee_physical_region_size_enum:
967 section = ieee->section_table[must_parse_int(&(ieee->h))];
968 section->_raw_size = must_parse_int(&(ieee->h));
970 case ieee_region_base_address_enum:
971 section = ieee->section_table[must_parse_int(&(ieee->h))];
972 section->vma = must_parse_int(&(ieee->h));
974 case ieee_mau_size_enum:
975 must_parse_int(&(ieee->h));
976 must_parse_int(&(ieee->h));
978 case ieee_m_value_enum:
979 must_parse_int(&(ieee->h));
980 must_parse_int(&(ieee->h));
982 case ieee_section_base_address_enum:
983 section = ieee->section_table[must_parse_int(&(ieee->h))];
984 section->vma = must_parse_int(&(ieee->h));
986 case ieee_section_offset_enum:
987 (void) must_parse_int(&(ieee->h));
988 (void) must_parse_int(&(ieee->h));
1002 /***********************************************************************
1006 DEFUN(ieee_archive_p,(abfd),
1013 uint8e_type buffer[512];
1015 file_ptr buffer_offset = 0;
1016 ieee_ar_data_type *save = abfd->tdata.ieee_ar_data;
1017 ieee_ar_data_type *ieee ;
1018 abfd->tdata.ieee_ar_data = (ieee_ar_data_type *)bfd_alloc(abfd, sizeof(ieee_ar_data_type));
1019 ieee= IEEE_AR_DATA(abfd);
1023 bfd_read((PTR)buffer, 1, sizeof(buffer), abfd);
1025 ieee->h.first_byte = buffer;
1026 ieee->h.input_p = buffer;
1028 ieee->h.abfd = abfd;
1030 if (this_byte(&(ieee->h)) != Module_Beginning) {
1031 abfd->tdata.ieee_ar_data = save;
1032 return (bfd_target*)NULL;
1036 next_byte(&(ieee->h));
1037 library= read_id(&(ieee->h));
1038 if (strcmp(library , "LIBRARY") != 0) {
1039 bfd_release(abfd, ieee);
1040 abfd->tdata.ieee_ar_data = save;
1041 return (bfd_target *)NULL;
1043 /* Throw away the filename */
1044 read_id(&(ieee->h));
1045 /* This must be an IEEE archive, so we'll buy some space to do
1048 obstack_begin(&ob, 128);
1051 ieee->element_count = 0;
1052 ieee->element_index = 0;
1054 next_byte(&(ieee->h)); /* Drop the ad part */
1055 must_parse_int(&(ieee->h)); /* And the two dummy numbers */
1056 must_parse_int(&(ieee->h));
1059 /* Read the index of the BB table */
1061 ieee_ar_obstack_type t;
1062 int rec =read_2bytes(&(ieee->h));
1063 if (rec ==(int)ieee_assign_value_to_variable_enum) {
1064 int record_number = must_parse_int(&(ieee->h));
1065 t.file_offset = must_parse_int(&(ieee->h));
1066 t.abfd = (bfd *)NULL;
1067 ieee->element_count++;
1069 obstack_grow(&ob, (PTR)&t, sizeof(t));
1071 /* Make sure that we don't go over the end of the buffer */
1073 if (ieee_pos(abfd) > sizeof(buffer)/2) {
1074 /* Past half way, reseek and reprime */
1075 buffer_offset += ieee_pos(abfd);
1076 bfd_seek(abfd, buffer_offset, SEEK_SET);
1077 bfd_read((PTR)buffer, 1, sizeof(buffer), abfd);
1078 ieee->h.first_byte = buffer;
1079 ieee->h.input_p = buffer;
1085 ieee->elements = (ieee_ar_obstack_type *)obstack_finish(&ob);
1087 /* Now scan the area again, and replace BB offsets with file */
1091 for (i = 2; i < ieee->element_count; i++) {
1092 bfd_seek(abfd, ieee->elements[i].file_offset, SEEK_SET);
1093 bfd_read((PTR)buffer, 1, sizeof(buffer), abfd);
1094 ieee->h.first_byte = buffer;
1095 ieee->h.input_p = buffer;
1097 next_byte(&(ieee->h)); /* Drop F8 */
1098 next_byte(&(ieee->h)); /* Drop 14 */
1099 must_parse_int(&(ieee->h)); /* Drop size of block */
1100 if (must_parse_int(&(ieee->h)) != 0) {
1101 /* This object has been deleted */
1102 ieee->elements[i].file_offset = 0;
1105 ieee->elements[i].file_offset = must_parse_int(&(ieee->h));
1109 /* abfd->has_armap = ;*/
1115 DEFUN(ieee_mkobject,(abfd),
1118 abfd->tdata.ieee_data = (ieee_data_type *)bfd_zalloc(abfd,sizeof(ieee_data_type));
1125 DEFUN(ieee_object_p,(abfd),
1130 ieee_data_type *ieee;
1131 uint8e_type buffer[300];
1132 ieee_data_type *save = IEEE_DATA(abfd);
1133 abfd->tdata.ieee_data = 0;
1134 ieee_mkobject(abfd);
1136 ieee = IEEE_DATA(abfd);
1137 bfd_seek(abfd, (file_ptr) 0, SEEK_SET);
1138 /* Read the first few bytes in to see if it makes sense */
1139 bfd_read((PTR)buffer, 1, sizeof(buffer), abfd);
1141 ieee->h.input_p = buffer;
1142 if (this_byte_and_next(&(ieee->h)) != Module_Beginning) goto fail;
1144 ieee->read_symbols= false;
1145 ieee->read_data= false;
1146 ieee->section_count = 0;
1147 ieee->external_symbol_max_index = 0;
1148 ieee->external_symbol_min_index = IEEE_PUBLIC_BASE;
1149 ieee->external_reference_min_index =IEEE_REFERENCE_BASE;
1150 ieee->external_reference_max_index = 0;
1151 ieee->h.abfd = abfd;
1152 memset((PTR)ieee->section_table, 0, sizeof(ieee->section_table));
1154 processor = ieee->mb.processor = read_id(&(ieee->h));
1155 if (strcmp(processor,"LIBRARY") == 0) goto fail;
1156 ieee->mb.module_name = read_id(&(ieee->h));
1157 if (abfd->filename == (CONST char *)NULL) {
1158 abfd->filename = ieee->mb.module_name;
1160 /* Determine the architecture and machine type of the object file.
1163 bfd_arch_info_type *arch = bfd_scan_arch(processor);
1164 if (arch == 0) goto fail;
1165 abfd->arch_info = arch;
1168 if (this_byte(&(ieee->h)) != (int)ieee_address_descriptor_enum) {
1171 next_byte(&(ieee->h));
1173 if (parse_int(&(ieee->h), &ieee->ad.number_of_bits_mau) == false) {
1176 if(parse_int(&(ieee->h), &ieee->ad.number_of_maus_in_address) == false) {
1180 /* If there is a byte order info, take it */
1181 if (this_byte(&(ieee->h)) == (int)ieee_variable_L_enum ||
1182 this_byte(&(ieee->h)) == (int)ieee_variable_M_enum)
1183 next_byte(&(ieee->h));
1186 for (part = 0; part < N_W_VARIABLES; part++) {
1188 if (read_2bytes(&(ieee->h)) != (int) ieee_assign_value_to_variable_enum) {
1191 if (this_byte_and_next(&(ieee->h)) != part) {
1195 ieee->w.offset[part] = parse_i(&(ieee->h), &ok);
1201 abfd->flags = HAS_SYMS;
1202 /* By now we know that this is a real IEEE file, we're going to read
1203 the whole thing into memory so that we can run up and down it
1204 quickly. We can work out how big the file is from the trailer
1207 IEEE_DATA(abfd)->h.first_byte = (uint8e_type *) bfd_alloc(ieee->h.abfd, ieee->w.r.me_record
1209 bfd_seek(abfd, (file_ptr) 0, SEEK_SET);
1210 bfd_read((PTR)(IEEE_DATA(abfd)->h.first_byte), 1, ieee->w.r.me_record+50, abfd);
1212 ieee_slurp_sections(abfd);
1215 (void) bfd_release(abfd, ieee);
1216 abfd->tdata.ieee_data = save;
1217 return (bfd_target *)NULL;
1222 DEFUN(ieee_print_symbol,(ignore_abfd, afile, symbol, how),
1223 bfd *ignore_abfd AND
1226 bfd_print_symbol_type how)
1228 FILE *file = (FILE *)afile;
1231 case bfd_print_symbol_name:
1232 fprintf(file,"%s", symbol->name);
1234 case bfd_print_symbol_more:
1236 fprintf(file,"%4x %2x",aout_symbol(symbol)->desc & 0xffff,
1237 aout_symbol(symbol)->other & 0xff);
1241 case bfd_print_symbol_nm:
1242 case bfd_print_symbol_all:
1244 CONST char *section_name = symbol->section == (asection *)NULL ?
1245 (CONST char *)"*abs" : symbol->section->name;
1246 if (symbol->name[0] == ' ') {
1247 fprintf(file,"* empty table entry ");
1250 bfd_print_symbol_vandf((PTR)file,symbol);
1252 fprintf(file," %-5s %04x %02x %s",
1254 (unsigned) ieee_symbol(symbol)->index,
1256 aout_symbol(symbol)->desc & 0xffff,
1257 aout_symbol(symbol)->other & 0xff,*/
1267 DEFUN(do_one,(ieee, current_map, location_ptr,s),
1268 ieee_data_type *ieee AND
1269 ieee_per_section_type *current_map AND
1270 uint8e_type *location_ptr AND
1273 switch (this_byte(&(ieee->h)))
1275 case ieee_load_constant_bytes_enum:
1277 unsigned int number_of_maus;
1279 next_byte(&(ieee->h));
1280 number_of_maus = must_parse_int(&(ieee->h));
1282 for (i = 0; i < number_of_maus; i++) {
1283 location_ptr[current_map->pc++]= this_byte(&(ieee->h));
1284 next_byte(&(ieee->h));
1289 case ieee_load_with_relocation_enum:
1291 boolean loop = true;
1292 next_byte(&(ieee->h));
1295 switch (this_byte(&(ieee->h)))
1297 case ieee_variable_R_enum:
1299 case ieee_function_signed_open_b_enum:
1300 case ieee_function_unsigned_open_b_enum:
1301 case ieee_function_either_open_b_enum:
1303 unsigned int extra = 4;
1304 boolean pcrel = false;
1306 ieee_reloc_type *r =
1307 (ieee_reloc_type *) bfd_alloc(ieee->h.abfd,
1308 sizeof(ieee_reloc_type));
1310 *(current_map->reloc_tail_ptr) = r;
1311 current_map->reloc_tail_ptr= &r->next;
1312 r->next = (ieee_reloc_type *)NULL;
1313 next_byte(&(ieee->h));
1315 r->relent.sym_ptr_ptr = 0;
1316 parse_expression(ieee,
1319 &pcrel, &extra, §ion);
1320 r->relent.address = current_map->pc;
1322 if (r->relent.sym_ptr_ptr == 0) {
1323 r->relent.sym_ptr_ptr = section->symbol_ptr_ptr;
1326 if (this_byte(&(ieee->h)) == (int)ieee_comma) {
1327 next_byte(&(ieee->h));
1328 /* Fetch number of bytes to pad */
1329 extra = must_parse_int(&(ieee->h));
1332 switch (this_byte(&(ieee->h))) {
1333 case ieee_function_signed_close_b_enum:
1334 next_byte(&(ieee->h));
1336 case ieee_function_unsigned_close_b_enum:
1337 next_byte(&(ieee->h));
1339 case ieee_function_either_close_b_enum:
1340 next_byte(&(ieee->h));
1345 /* Build a relocation entry for this type */
1346 /* If pc rel then stick -ve pc into instruction
1347 and take out of reloc ..
1349 I've changed this. It's all too
1350 complicated. I keep 0 in the
1361 #if KEEPMINUSPCININST
1362 bfd_put_32(ieee->h.abfd, -current_map->pc, location_ptr +
1364 r->relent.howto = &rel32_howto;
1368 bfd_put_32(ieee->h.abfd,0, location_ptr +
1370 r->relent.howto = &rel32_howto;
1375 bfd_put_32(ieee->h.abfd, 0, location_ptr +
1377 r->relent.howto = &abs32_howto;
1379 current_map->pc +=4;
1382 if (pcrel == true) {
1383 #if KEEPMINUSPCININST
1384 bfd_put_16(ieee->h.abfd, (int)(-current_map->pc), location_ptr +current_map->pc);
1385 r->relent.addend -= current_map->pc;
1386 r->relent.howto = &rel16_howto;
1389 bfd_put_16(ieee->h.abfd, 0, location_ptr +current_map->pc);
1390 r->relent.howto = &rel16_howto;
1395 bfd_put_16(ieee->h.abfd, 0, location_ptr +current_map->pc);
1396 r->relent.howto = &abs16_howto;
1398 current_map->pc +=2;
1401 if (pcrel == true) {
1402 #if KEEPMINUSPCININST
1403 bfd_put_8(ieee->h.abfd, (int)(-current_map->pc), location_ptr +current_map->pc);
1404 r->relent.addend -= current_map->pc;
1405 r->relent.howto = &rel8_howto;
1407 bfd_put_8(ieee->h.abfd,0, location_ptr +current_map->pc);
1408 r->relent.howto = &rel8_howto;
1412 bfd_put_8(ieee->h.abfd, 0, location_ptr +current_map->pc);
1413 r->relent.howto = &abs8_howto;
1415 current_map->pc +=1;
1427 if (parse_int(&(ieee->h), &this_size) == true) {
1429 for (i = 0; i < this_size; i++) {
1430 location_ptr[current_map->pc ++] = this_byte(&(ieee->h));
1431 next_byte(&(ieee->h));
1444 /* Read in all the section data and relocation stuff too */
1446 DEFUN(ieee_slurp_section_data,(abfd),
1449 bfd_byte *location_ptr = (bfd_byte *)NULL;
1450 ieee_data_type *ieee = IEEE_DATA(abfd);
1451 unsigned int section_number ;
1453 ieee_per_section_type *current_map = (ieee_per_section_type *)NULL;
1455 /* Seek to the start of the data area */
1456 if (ieee->read_data== true) return true;
1457 ieee->read_data = true;
1458 ieee_seek(abfd, ieee->w.r.data_part);
1460 /* Allocate enough space for all the section contents */
1463 for (s = abfd->sections; s != (asection *)NULL; s = s->next) {
1464 ieee_per_section_type *per = (ieee_per_section_type *) s->used_by_bfd;
1465 per->data = (bfd_byte *) bfd_alloc(ieee->h.abfd, s->_raw_size);
1467 per->reloc_tail_ptr =
1468 (ieee_reloc_type **)&(s->relocation);
1474 switch (this_byte(&(ieee->h)))
1476 /* IF we see anything strange then quit */
1480 case ieee_set_current_section_enum:
1481 next_byte(&(ieee->h));
1482 section_number = must_parse_int(&(ieee->h));
1483 s = ieee->section_table[section_number];
1484 current_map = (ieee_per_section_type *) s->used_by_bfd;
1485 location_ptr = current_map->data - s->vma;
1486 /* The document I have says that Microtec's compilers reset */
1487 /* this after a sec section, even though the standard says not */
1489 current_map->pc =s->vma;
1493 case ieee_e2_first_byte_enum:
1494 next_byte(&(ieee->h));
1495 switch (this_byte(&(ieee->h)))
1497 case ieee_set_current_pc_enum & 0xff:
1500 ieee_symbol_index_type symbol;
1503 next_byte(&(ieee->h));
1504 must_parse_int(&(ieee->h)); /* Thow away section #*/
1505 parse_expression(ieee, &value,
1509 current_map->pc = value;
1510 BFD_ASSERT((unsigned)(value - s->vma) <= s->_raw_size);
1514 case ieee_value_starting_address_enum & 0xff:
1515 /* We've got to the end of the data now - */
1522 case ieee_repeat_data_enum:
1524 /* Repeat the following LD or LR n times - we do this by
1525 remembering the stream pointer before running it and
1526 resetting it and running it n times. We special case
1527 the repetition of a repeat_data/load_constant
1530 unsigned int iterations ;
1531 uint8e_type *start ;
1532 next_byte(&(ieee->h));
1533 iterations = must_parse_int(&(ieee->h));
1534 start = ieee->h.input_p;
1535 if (start[0] == (int)ieee_load_constant_bytes_enum &&
1537 while (iterations != 0) {
1538 location_ptr[current_map->pc++] = start[2];
1541 next_byte(&(ieee->h));
1542 next_byte(&(ieee->h));
1543 next_byte(&(ieee->h));
1546 while (iterations != 0) {
1547 ieee->h.input_p = start;
1548 do_one(ieee, current_map, location_ptr,s);
1554 case ieee_load_constant_bytes_enum:
1555 case ieee_load_with_relocation_enum:
1557 do_one(ieee, current_map, location_ptr,s);
1568 DEFUN(ieee_new_section_hook,(abfd, newsect),
1572 newsect->used_by_bfd = (PTR)
1573 bfd_alloc(abfd, sizeof(ieee_per_section_type));
1574 ieee_per_section( newsect)->data = (bfd_byte *)NULL;
1575 ieee_per_section(newsect)->section = newsect;
1581 DEFUN(ieee_get_reloc_upper_bound,(abfd, asect),
1585 ieee_slurp_section_data(abfd);
1586 return (asect->reloc_count+1) * sizeof(arelent *);
1590 DEFUN(ieee_get_section_contents,(abfd, section, location, offset, count),
1595 bfd_size_type count)
1597 ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;
1598 ieee_slurp_section_data(abfd);
1599 (void) memcpy((PTR)location, (PTR)(p->data + offset), (unsigned)count);
1605 DEFUN(ieee_canonicalize_reloc,(abfd, section, relptr, symbols),
1608 arelent **relptr AND
1611 /* ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;*/
1612 ieee_reloc_type *src = (ieee_reloc_type *)(section->relocation);
1613 ieee_data_type *ieee = IEEE_DATA(abfd);
1615 while (src != (ieee_reloc_type *)NULL) {
1616 /* Work out which symbol to attach it this reloc to */
1617 switch (src->symbol.letter) {
1619 src->relent.sym_ptr_ptr =
1620 symbols + src->symbol.index + ieee->external_reference_base_offset;
1623 src->relent.sym_ptr_ptr =
1624 src->relent.sym_ptr_ptr[0]->section->symbol_ptr_ptr;
1630 *relptr++ = &src->relent;
1633 *relptr = (arelent *)NULL;
1634 return section->reloc_count;
1640 DEFUN(comp,(ap, bp),
1644 arelent *a = *((arelent **)ap);
1645 arelent *b = *((arelent **)bp);
1646 return a->address - b->address;
1650 Write the section headers
1654 DEFUN(ieee_write_section_part,(abfd),
1657 ieee_data_type *ieee = IEEE_DATA(abfd);
1659 ieee->w.r.section_part = bfd_tell(abfd);
1660 for (s = abfd->sections; s != (asection *)NULL; s=s->next) {
1661 if (s != &bfd_abs_section)
1664 ieee_write_byte(abfd, ieee_section_type_enum);
1665 ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1667 if (abfd->flags & EXEC_P)
1669 /* This image is executable, so output absolute sections */
1670 ieee_write_byte(abfd, ieee_variable_A_enum);
1671 ieee_write_byte(abfd, ieee_variable_S_enum);
1675 ieee_write_byte(abfd, ieee_variable_C_enum);
1678 switch (s->flags &(SEC_CODE | SEC_DATA | SEC_ROM))
1680 case SEC_CODE | SEC_LOAD:
1682 ieee_write_byte(abfd, ieee_variable_P_enum);
1686 ieee_write_byte(abfd, ieee_variable_D_enum);
1689 case SEC_ROM | SEC_DATA:
1690 case SEC_ROM | SEC_LOAD:
1691 case SEC_ROM | SEC_DATA | SEC_LOAD:
1693 ieee_write_byte(abfd, ieee_variable_R_enum);
1697 ieee_write_id(abfd, s->name);
1699 ieee_write_int(abfd, 0); /* Parent */
1700 ieee_write_int(abfd, 0); /* Brother */
1701 ieee_write_int(abfd, 0); /* Context */
1704 ieee_write_byte(abfd, ieee_section_alignment_enum);
1705 ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1706 ieee_write_int(abfd, 1 << s->alignment_power);
1709 ieee_write_2bytes(abfd, ieee_section_size_enum);
1710 ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1711 ieee_write_int(abfd, s->_raw_size);
1712 if (abfd->flags & EXEC_P) {
1713 /* Relocateable sections don't have asl records */
1715 ieee_write_2bytes(abfd, ieee_section_base_address_enum);
1716 ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1717 ieee_write_int(abfd, s->vma);
1727 DEFUN(do_with_relocs,(abfd, s),
1731 unsigned int relocs_to_go = s->reloc_count;
1734 bfd_byte *stream = ieee_per_section(s)->data;
1735 arelent **p = s->orelocation;
1737 bfd_size_type current_byte_index = 0;
1739 qsort(s->orelocation,
1744 /* Output the section preheader */
1745 ieee_write_byte(abfd, ieee_set_current_section_enum);
1746 ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1748 ieee_write_twobyte(abfd, ieee_set_current_pc_enum);
1749 ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1750 ieee_write_expression(abfd, 0, s->symbol, 0, 0);
1752 if (relocs_to_go == 0)
1754 /* If there arn't any relocations then output the load constant byte
1755 opcode rather than the load with relocation opcode */
1757 while (current_byte_index < s->_raw_size) {
1759 unsigned int MAXRUN = 32;
1761 if (run > s->_raw_size - current_byte_index) {
1762 run = s->_raw_size - current_byte_index;
1766 ieee_write_byte(abfd, ieee_load_constant_bytes_enum);
1767 /* Output a stream of bytes */
1768 ieee_write_int(abfd, run);
1769 bfd_write((PTR)(stream + current_byte_index),
1773 current_byte_index += run;
1779 ieee_write_byte(abfd, ieee_load_with_relocation_enum);
1782 /* Output the data stream as the longest sequence of bytes
1783 possible, allowing for the a reasonable packet size and
1784 relocation stuffs */
1786 if ((PTR)stream == (PTR)NULL) {
1787 /* Outputting a section without data, fill it up */
1788 stream = (uint8e_type *)(bfd_alloc(abfd, s->_raw_size));
1789 memset((PTR)stream, 0, s->_raw_size);
1791 while (current_byte_index < s->_raw_size) {
1793 unsigned int MAXRUN = 32;
1795 run = (*p)->address - current_byte_index;
1800 if (run > s->_raw_size - current_byte_index) {
1801 run = s->_raw_size - current_byte_index;
1805 /* Output a stream of bytes */
1806 ieee_write_int(abfd, run);
1807 bfd_write((PTR)(stream + current_byte_index),
1811 current_byte_index += run;
1813 /* Output any relocations here */
1814 if (relocs_to_go && (*p) && (*p)->address == current_byte_index) {
1815 while (relocs_to_go && (*p) && (*p)->address == current_byte_index) {
1821 if (r->howto->pc_relative) {
1822 r->addend += current_byte_index ;
1826 switch (r->howto->size) {
1829 ov = bfd_get_32(abfd,
1830 stream+current_byte_index);
1831 current_byte_index +=4;
1834 ov = bfd_get_16(abfd,
1835 stream+current_byte_index);
1836 current_byte_index +=2;
1839 ov = bfd_get_8(abfd,
1840 stream+current_byte_index);
1841 current_byte_index ++;
1847 ieee_write_byte(abfd, ieee_function_either_open_b_enum);
1850 if (r->sym_ptr_ptr != (asymbol **)NULL) {
1851 ieee_write_expression(abfd, r->addend + ov,
1853 r->howto->pc_relative, s->index);
1856 ieee_write_expression(abfd, r->addend + ov,
1858 r->howto->pc_relative, s->index);
1861 if (1 || r->howto->size != 2) {
1862 ieee_write_byte(abfd, ieee_comma);
1863 ieee_write_int(abfd, 1<< r->howto->size);
1865 ieee_write_byte(abfd,
1866 ieee_function_either_close_b_enum);
1877 /* If there are no relocations in the output section then we can
1878 be clever about how we write. We block items up into a max of 127
1882 DEFUN(do_as_repeat, (abfd, s),
1887 ieee_write_byte(abfd, ieee_set_current_section_enum);
1888 ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1889 ieee_write_byte(abfd, ieee_set_current_pc_enum >> 8);
1890 ieee_write_byte(abfd, ieee_set_current_pc_enum & 0xff);
1891 ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1892 ieee_write_int(abfd, s->vma );
1894 ieee_write_byte(abfd,ieee_repeat_data_enum);
1895 ieee_write_int(abfd, s->_raw_size);
1896 ieee_write_byte(abfd, ieee_load_constant_bytes_enum);
1897 ieee_write_byte(abfd, 1);
1898 ieee_write_byte(abfd, 0);
1903 DEFUN(do_without_relocs, (abfd, s),
1907 bfd_byte *stream = ieee_per_section(s)->data;
1909 if (stream == 0 || ((s->flags & SEC_LOAD) == 0))
1911 do_as_repeat(abfd, s);
1916 for (i = 0; i < s->_raw_size; i++) {
1917 if (stream[i] != 0) {
1918 do_with_relocs(abfd, s);
1922 do_as_repeat(abfd, s);
1928 static unsigned char *output_ptr_start;
1929 static unsigned char *output_ptr;
1930 static unsigned char *output_ptr_end;
1931 static unsigned char *input_ptr_start;
1932 static unsigned char *input_ptr;
1933 static unsigned char *input_ptr_end;
1934 static bfd *input_bfd;
1935 static bfd *output_bfd;
1936 static int output_buffer;
1940 bfd_read((PTR)input_ptr_start, 1, input_ptr_end - input_ptr_start, input_bfd);
1941 input_ptr = input_ptr_start;
1945 bfd_write((PTR)(output_ptr_start),1,output_ptr - output_ptr_start, output_bfd);
1946 output_ptr = output_ptr_start;
1950 #define THIS() ( *input_ptr )
1951 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill(); }
1952 #define OUT(x) { *output_ptr++ = (x); if(output_ptr == output_ptr_end) flush(); }
1954 static void write_int(value)
1957 if (value >= 0 && value <= 127) {
1961 unsigned int length;
1962 /* How many significant bytes ? */
1963 /* FIXME FOR LONGER INTS */
1964 if (value & 0xff000000) {
1967 else if (value & 0x00ff0000) {
1970 else if (value & 0x0000ff00) {
1975 OUT((int)ieee_number_repeat_start_enum + length);
1989 static void copy_id()
1991 int length = THIS();
2001 #define VAR(x) ((x | 0x80))
2002 static void copy_expression()
2011 value = THIS(); NEXT();
2012 value = (value << 8) | THIS(); NEXT();
2013 value = (value << 8) | THIS(); NEXT();
2014 value = (value << 8) | THIS(); NEXT();
2019 value = THIS(); NEXT();
2020 value = (value << 8) | THIS(); NEXT();
2021 value = (value << 8) | THIS(); NEXT();
2026 value = THIS(); NEXT();
2027 value = (value << 8) | THIS(); NEXT();
2032 value = THIS(); NEXT();
2041 /* Not a number, just bug out with the answer */
2042 write_int(*(--tos));
2052 int value = *(--tos);
2060 int section_number ;
2061 ieee_data_type *ieee;
2064 section_number = THIS();
2067 ieee= IEEE_DATA(input_bfd);
2068 s = ieee->section_table[section_number];
2069 if (s->output_section) {
2070 value = s->output_section->vma ;
2071 } else { value = 0; }
2072 value += s->output_offset;
2080 write_int(*(--tos));
2090 /* Drop the int in the buffer, and copy a null into the gap, which we
2091 will overwrite later */
2093 struct output_buffer_struct {
2094 unsigned char *ptrp;
2099 DEFUN(fill_int,(buf),
2100 struct output_buffer_struct *buf)
2102 if (buf->buffer == output_buffer) {
2103 /* Still a chance to output the size */
2104 int value = output_ptr - buf->ptrp + 3;
2105 buf->ptrp[0] = value >> 24;
2106 buf->ptrp[1] = value >> 16;
2107 buf->ptrp[2] = value >> 8;
2108 buf->ptrp[3] = value >> 0;
2113 DEFUN(drop_int,(buf),
2114 struct output_buffer_struct *buf)
2121 case 0x84: ch = THIS(); NEXT();
2122 case 0x83: ch = THIS(); NEXT();
2123 case 0x82: ch = THIS(); NEXT();
2124 case 0x81: ch = THIS(); NEXT();
2129 buf->ptrp = output_ptr;
2130 buf->buffer = output_buffer;
2131 OUT(0);OUT(0);OUT(0);OUT(0);
2134 static void copy_int()
2142 case 0x84: ch = THIS(); NEXT(); OUT(ch);
2143 case 0x83: ch = THIS(); NEXT(); OUT(ch);
2144 case 0x82: ch = THIS(); NEXT(); OUT(ch);
2145 case 0x81: ch = THIS(); NEXT(); OUT(ch);
2151 #define ID copy_id()
2152 #define INT copy_int()
2153 #define EXP copy_expression()
2154 static void copy_till_end();
2155 #define INTn(q) copy_int()
2156 #define EXPn(q) copy_expression()
2157 static void f1_record()
2170 OUT(0xf1); OUT(0xc9);
2171 INT; INT; ch = THIS();
2174 case 0x16: NEXT();break;
2175 case 0x01: NEXT();break;
2176 case 0x00: NEXT(); INT; break;
2177 case 0x03: NEXT(); INT; break;
2178 case 0x13: EXPn(instruction address); break;
2186 OUT(0xf1); OUT(0xd8);
2187 EXP ; EXP; EXP; EXP;
2191 OUT(0xf1);OUT(0xce); INT; INT; ch = THIS(); INT;
2198 EXPn(external function); break;
2201 case 0x07: INTn(line number); INT;
2203 case 0x0a: INTn(locked register); INT; break;
2204 case 0x3f: copy_till_end(); break;
2205 case 0x3e: copy_till_end(); break;
2206 case 0x40: copy_till_end(); break;
2207 case 0x41: ID; break;
2212 static void f0_record()
2214 /* Attribute record */
2220 static void copy_till_end()
2255 static void f2_record()
2267 static void block();
2268 static void f8_record()
2278 /* Unique typedefs for module */
2279 /* GLobal typedefs */
2280 /* High level module scope beginning */
2282 struct output_buffer_struct ob;
2295 /* Global function */
2297 struct output_buffer_struct ob;
2299 OUT(0xf8); OUT(0x04);
2300 drop_int(&ob); ID ; INTn(stack size); INTn(ret val);
2307 EXPn(size of block);
2313 /* File name for source line numbers */
2315 struct output_buffer_struct ob;
2317 OUT(0xf8); OUT(0x05);
2319 ID; INTn(year); INTn(month); INTn(day);
2320 INTn(hour); INTn(monute); INTn(second);
2329 /* Local function */
2330 { struct output_buffer_struct ob;
2331 NEXT(); OUT(0xf8); OUT(0x06);
2333 ID; INTn(stack size); INTn(type return);
2344 /* Assembler module scope beginning -*/
2345 { struct output_buffer_struct ob;
2348 OUT(0xf8); OUT(0x0a);
2350 ID; ID; INT; ID; INT; INT; INT; INT; INT; INT;
2361 struct output_buffer_struct ob;
2363 OUT(0xf8); OUT(0x0b);
2364 drop_int(&ob); ID ; INT; INTn(section index); EXPn(offset); INTn(stuff);
2377 static void e2_record()
2387 static void DEFUN_VOID(block)
2421 moves all the debug information from the source bfd to the output
2422 bfd, and relocates any expressions it finds
2426 DEFUN(relocate_debug,(output, input),
2432 unsigned char input_buffer[IBS];
2434 input_ptr_start = input_ptr = input_buffer;
2435 input_ptr_end = input_buffer + IBS;
2437 bfd_read((PTR)input_ptr_start, 1, IBS, input);
2441 During linking, we we told about the bfds which made up our
2442 contents, we have a list of them. They will still be open, so go to
2443 the debug info in each, and copy it out, relocating it as we go.
2447 DEFUN(ieee_write_debug_part, (abfd),
2450 ieee_data_type *ieee = IEEE_DATA(abfd);
2451 bfd_chain_type *chain = ieee->chain_root;
2452 unsigned char output_buffer[OBS];
2453 boolean some_debug = false;
2454 file_ptr here = bfd_tell(abfd);
2456 output_ptr_start = output_ptr = output_buffer ;
2457 output_ptr_end = output_buffer + OBS;
2458 output_ptr = output_buffer;
2461 if (chain == (bfd_chain_type *)NULL) {
2463 /* There is no debug info, so we'll fake some up */
2464 CONST static char fake[] = {
2465 0xf8, 0xa, 0, 5, 't', 't', 't', 't', 't', 0, 2, 3,
2466 '1','.','1',0x82, 1991>>8, 1991 & 0xff, 9, 20, 11, 07,50 };
2467 ieee->w.r.debug_information_part = 0;
2473 /* bfd_write(fake, 1, sizeof(fake), abfd);*/
2474 /* Now write a header for each section */
2477 asection *s = abfd->sections;
2479 if (s != abfd->abs_section)
2482 ieee_write_byte(abfd, 0xf8);
2483 ieee_write_byte(abfd, 0x0b);
2484 ieee_write_byte(abfd, 0);
2485 ieee_write_byte(abfd, 0);
2486 ieee_write_byte(abfd, 1);
2487 ieee_write_byte(abfd, i + IEEE_SECTION_NUMBER_BASE);
2488 ieee_write_expression(abfd, 0, s->symbol, 0, 0, 0);
2489 ieee_write_byte(abfd,0);
2490 ieee_write_byte(abfd, 0xf9);
2491 ieee_write_expression(abfd, s->size,
2492 bfd_abs_section.symbol, 0, 0, 0);
2499 /* Close the scope */
2500 ieee_write_byte(abfd, 0xf9);
2505 while (chain != (bfd_chain_type *)NULL) {
2506 bfd *entry = chain->this;
2507 ieee_data_type *entry_ieee = IEEE_DATA(entry);
2508 if (entry_ieee->w.r.debug_information_part) {
2509 bfd_seek(entry, entry_ieee->w.r.debug_information_part, SEEK_SET);
2510 relocate_debug(abfd, entry);
2513 chain = chain->next;
2516 ieee->w.r.debug_information_part = here;
2519 ieee->w.r.debug_information_part = 0;
2525 /* write the data in an ieee way */
2527 DEFUN(ieee_write_data_part,(abfd),
2531 ieee_data_type *ieee = IEEE_DATA(abfd);
2532 ieee->w.r.data_part = bfd_tell(abfd);
2533 for (s = abfd->sections; s != (asection *)NULL; s = s->next)
2535 /* Sort the reloc records so we can insert them in the correct
2537 if (s->reloc_count != 0)
2539 do_with_relocs(abfd, s);
2543 do_without_relocs(abfd, s);
2551 DEFUN(init_for_output,(abfd),
2555 for (s = abfd->sections; s != (asection *)NULL; s = s->next) {
2556 if (s->_raw_size != 0) {
2557 ieee_per_section(s)->data = (bfd_byte *)(bfd_alloc(abfd, s->_raw_size));
2562 /** exec and core file sections */
2564 /* set section contents is complicated with IEEE since the format is
2565 * not a byte image, but a record stream.
2568 DEFUN(ieee_set_section_contents,(abfd, section, location, offset, count),
2573 bfd_size_type count)
2575 if (ieee_per_section(section)->data == (bfd_byte *)NULL) {
2576 init_for_output(abfd);
2578 (void) memcpy((PTR)(ieee_per_section(section)->data + offset),
2580 (unsigned int)count);
2585 write the external symbols of a file, IEEE considers two sorts of
2586 external symbols, public, and referenced. It uses to internal forms
2587 to index them as well. When we write them out we turn their symbol
2588 values into indexes from the right base.
2591 DEFUN(ieee_write_external_part,(abfd),
2595 ieee_data_type *ieee = IEEE_DATA(abfd);
2597 unsigned int reference_index = IEEE_REFERENCE_BASE;
2598 unsigned int public_index = IEEE_PUBLIC_BASE+2;
2599 file_ptr here = bfd_tell(abfd);
2600 boolean hadone = false;
2601 if (abfd->outsymbols != (asymbol **)NULL) {
2603 for (q = abfd->outsymbols; *q != (asymbol *)NULL; q++) {
2606 if (p->section == &bfd_und_section) {
2607 /* This must be a symbol reference .. */
2608 ieee_write_byte(abfd, ieee_external_reference_enum);
2609 ieee_write_int(abfd, reference_index);
2610 ieee_write_id(abfd, p->name);
2611 p->value = reference_index;
2614 else if (bfd_is_com_section (p->section)) {
2615 /* This is a weak reference */
2616 ieee_write_byte(abfd, ieee_external_reference_enum);
2617 ieee_write_int(abfd, reference_index);
2618 ieee_write_id(abfd, p->name);
2619 ieee_write_byte(abfd, ieee_weak_external_reference_enum);
2620 ieee_write_int(abfd, reference_index);
2621 ieee_write_int(abfd, p->value);
2622 ieee_write_int(abfd, BFD_FORT_COMM_DEFAULT_VALUE);
2623 p->value = reference_index;
2626 else if(p->flags & BSF_GLOBAL) {
2627 /* This must be a symbol definition */
2630 ieee_write_byte(abfd, ieee_external_symbol_enum);
2631 ieee_write_int(abfd, public_index );
2632 ieee_write_id(abfd, p->name);
2634 ieee_write_twobyte(abfd, ieee_attribute_record_enum);
2635 ieee_write_int(abfd, public_index );
2636 ieee_write_byte(abfd, 15); /* instruction address */
2637 ieee_write_byte(abfd, 19); /* static symbol */
2638 ieee_write_byte(abfd, 1); /* one of them */
2641 /* Write out the value */
2642 ieee_write_2bytes(abfd, ieee_value_record_enum);
2643 ieee_write_int(abfd, public_index);
2644 if (p->section != &bfd_abs_section)
2646 if (abfd->flags & EXEC_P)
2648 /* If fully linked, then output all symbols
2650 ieee_write_int(abfd,
2651 p->value + p->section->output_offset+ p->section->output_section->vma);
2655 ieee_write_expression(abfd,
2656 p->value + p->section->output_offset,
2657 p->section->output_section->symbol
2663 ieee_write_expression(abfd,
2665 bfd_abs_section.symbol,
2668 p->value = public_index;
2672 /* This can happen - when there are gaps in the symbols read */
2673 /* from an input ieee file */
2678 ieee->w.r.external_part = here;
2683 CONST static unsigned char exten[] =
2686 0xf1, 0xce, 0x20, 0x00, 37, 3, 3, /* Set version 3 rev 3 */
2687 0xf1, 0xce, 0x20, 0x00, 39, 2, /* keep symbol in original case */
2688 0xf1, 0xce, 0x20, 0x00, 38 /* set object type relocateable to x */
2691 CONST static unsigned char envi[] =
2695 /* 0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
2698 0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok */
2700 0xf1, 0xce, 0x21, 0, 53, 0x03, /* host unix */
2701 /* 0xf1, 0xce, 0x21, 0, 54, 2,1,1 tool & version # */
2706 DEFUN(ieee_write_me_part,(abfd),
2709 ieee_data_type *ieee= IEEE_DATA(abfd);
2710 ieee->w.r.trailer_part = bfd_tell(abfd);
2711 if (abfd->start_address) {
2712 ieee->w.r.me_record = bfd_tell(abfd);
2713 ieee_write_2bytes(abfd, ieee_value_starting_address_enum);
2714 ieee_write_byte(abfd, ieee_function_either_open_b_enum);
2715 ieee_write_int(abfd, abfd->start_address);
2716 ieee_write_byte(abfd, ieee_function_either_close_b_enum);
2719 ieee->w.r.me_record = bfd_tell(abfd);
2721 ieee_write_byte(abfd, ieee_module_end_enum);
2725 DEFUN(ieee_write_object_contents,(abfd),
2728 ieee_data_type *ieee = IEEE_DATA(abfd);
2731 /* Fast forward over the header area */
2732 bfd_seek(abfd, (file_ptr) 0, SEEK_SET);
2733 ieee_write_byte(abfd, ieee_module_beginning_enum);
2735 ieee_write_id(abfd, bfd_printable_name(abfd));
2736 ieee_write_id(abfd, abfd->filename);
2738 /* Fast forward over the variable bits */
2739 ieee_write_byte(abfd, ieee_address_descriptor_enum);
2742 ieee_write_byte(abfd, bfd_arch_bits_per_byte(abfd));
2743 /* MAU's per address */
2744 ieee_write_byte(abfd, bfd_arch_bits_per_address(abfd) /
2745 bfd_arch_bits_per_byte(abfd));
2747 old = bfd_tell(abfd);
2748 bfd_seek(abfd, (file_ptr) (8 * N_W_VARIABLES), SEEK_CUR);
2750 ieee->w.r.extension_record = bfd_tell(abfd);
2751 bfd_write((char *)exten, 1, sizeof(exten), abfd);
2752 if (abfd->flags & EXEC_P)
2753 ieee_write_byte(abfd, 0x1); /* Absolute */
2755 ieee_write_byte(abfd, 0x2); /* Relocateable */
2757 ieee->w.r.environmental_record = bfd_tell(abfd);
2758 bfd_write((char *)envi, 1, sizeof(envi), abfd);
2762 ieee_write_section_part(abfd);
2764 First write the symbols, this changes their values into table
2765 indeces so we cant use it after this point
2767 ieee_write_external_part(abfd);
2768 /* ieee_write_byte(abfd, ieee_record_seperator_enum);*/
2771 /* ieee_write_byte(abfd, ieee_record_seperator_enum);*/
2775 Write any debugs we have been told about
2777 ieee_write_debug_part(abfd);
2780 Can only write the data once the symbols have been written since
2781 the data contains relocation information which points to the
2784 ieee_write_data_part(abfd);
2788 At the end we put the end !
2790 ieee_write_me_part(abfd);
2793 /* Generate the header */
2794 bfd_seek(abfd, old, SEEK_SET);
2796 for (i= 0; i < N_W_VARIABLES; i++) {
2797 ieee_write_2bytes(abfd,ieee_assign_value_to_variable_enum);
2798 ieee_write_byte(abfd, i);
2799 ieee_write_int5_out(abfd, ieee->w.offset[i]);
2807 /* Native-level interface to symbols. */
2809 /* We read the symbols into a buffer, which is discarded when this
2810 function exits. We read the strings into a buffer large enough to
2811 hold them all plus all the cached symbol entries. */
2814 DEFUN(ieee_make_empty_symbol,(abfd),
2818 ieee_symbol_type *new =
2819 (ieee_symbol_type *)zalloc (sizeof (ieee_symbol_type));
2820 new->symbol.the_bfd = abfd;
2821 return &new->symbol;
2826 DEFUN(ieee_openr_next_archived_file,(arch, prev),
2830 ieee_ar_data_type *ar = IEEE_AR_DATA(arch);
2831 /* take the next one from the arch state, or reset */
2832 if (prev == (bfd *)NULL) {
2833 /* Reset the index - the first two entries are bogus*/
2834 ar->element_index = 2;
2837 ieee_ar_obstack_type *p = ar->elements + ar->element_index;
2838 ar->element_index++;
2839 if (ar->element_index <= ar->element_count) {
2840 if (p->file_offset != (file_ptr)0) {
2841 if (p->abfd == (bfd *)NULL) {
2842 p->abfd = _bfd_create_empty_archive_element_shell(arch);
2843 p->abfd->origin = p->file_offset;
2849 bfd_error = no_more_archived_files;
2857 ieee_find_nearest_line(abfd,
2868 char **filename_ptr;
2869 char **functionname_ptr;
2877 ieee_generic_stat_arch_elt(abfd, buf)
2881 ieee_ar_data_type *ar = abfd->my_archive->tdata.ieee_ar_data;
2882 if (ar == (ieee_ar_data_type *)NULL) {
2883 bfd_error = invalid_operation;
2888 buf->st_mode = 0666;
2889 return ! ieee_object_p(abfd);
2893 DEFUN(ieee_sizeof_headers,(abfd, x),
2903 DEFUN(ieee_bfd_debug_info_start,(abfd),
2910 DEFUN(ieee_bfd_debug_info_end,(abfd),
2917 /* Add this section to the list of sections we have debug info for, to
2918 be ready to output it at close time
2921 DEFUN(ieee_bfd_debug_info_accumulate,(abfd, section),
2925 ieee_data_type *ieee = IEEE_DATA(section->owner);
2926 ieee_data_type *output_ieee = IEEE_DATA(abfd);
2927 /* can only accumulate data from other ieee bfds */
2928 if (section->owner->xvec != abfd->xvec)
2930 /* Only bother once per bfd */
2931 if (ieee->done_debug == true)
2933 ieee->done_debug = true;
2935 /* Don't bother if there is no debug info */
2936 if (ieee->w.r.debug_information_part == 0)
2942 bfd_chain_type *n = (bfd_chain_type *) bfd_alloc(abfd, sizeof(bfd_chain_type));
2943 n->this = section->owner;
2944 n->next = (bfd_chain_type *)NULL;
2946 if (output_ieee->chain_head) {
2947 output_ieee->chain_head->next = n;
2950 output_ieee->chain_root = n;
2953 output_ieee->chain_head = n;
2963 #define ieee_core_file_failing_command (char *(*)())(bfd_nullvoidptr)
2964 #define ieee_core_file_failing_signal (int (*)())bfd_0
2965 #define ieee_core_file_matches_executable_p ( FOO(boolean, (*),(bfd *, bfd *)))bfd_false
2966 #define ieee_slurp_armap bfd_true
2967 #define ieee_slurp_extended_name_table bfd_true
2968 #define ieee_truncate_arname (void (*)())bfd_nullvoidptr
2969 #define ieee_write_armap (FOO( boolean, (*),(bfd *, unsigned int, struct orl *, unsigned int, int))) bfd_nullvoidptr
2970 #define ieee_get_lineno (struct lineno_cache_entry *(*)())bfd_nullvoidptr
2971 #define ieee_close_and_cleanup bfd_generic_close_and_cleanup
2972 #define ieee_set_arch_mach bfd_default_set_arch_mach
2973 #define ieee_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
2974 #define ieee_bfd_relax_section bfd_generic_relax_section
2975 #define ieee_bfd_seclet_link bfd_generic_seclet_link
2976 #define ieee_bfd_reloc_type_lookup \
2977 ((CONST struct reloc_howto_struct *(*) PARAMS ((bfd *, bfd_reloc_code_real_type))) bfd_nullvoidptr)
2978 #define ieee_bfd_make_debug_symbol \
2979 ((asymbol *(*) PARAMS ((bfd *, void *, unsigned long))) bfd_nullvoidptr)
2982 bfd_target ieee_vec =
2985 bfd_target_ieee_flavour,
2986 true, /* target byte order */
2987 true, /* target headers byte order */
2988 (HAS_RELOC | EXEC_P | /* object flags */
2989 HAS_LINENO | HAS_DEBUG |
2990 HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
2991 ( SEC_CODE|SEC_DATA|SEC_ROM|SEC_HAS_CONTENTS
2992 |SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
2993 0, /* leading underscore */
2994 ' ', /* ar_pad_char */
2995 16, /* ar_max_namelen */
2996 1, /* minimum alignment */
2997 _do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16, /* data */
2998 _do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16, /* hdrs */
3000 { _bfd_dummy_target,
3001 ieee_object_p, /* bfd_check_format */
3008 _bfd_generic_mkarchive,
3013 ieee_write_object_contents,
3014 _bfd_write_archive_contents,