1 /* bfd back-end for ieee-695 objects.
2 Copyright (C) 1990-1991 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 /* IEEE 695 format is a stream of records, which we parse using a simple one-
22 token (which is one byte in this lexicon) lookahead recursive decent
31 /* Functions for writing to ieee files in the strange way that the
35 DEFUN(ieee_write_byte,(abfd, byte),
39 bfd_write((PTR)&byte, 1, 1, abfd);
44 DEFUN(ieee_write_twobyte,(abfd, twobyte),
49 b[1] = twobyte & 0xff;
51 bfd_write((PTR)&b[0], 1, 2, abfd);
57 DEFUN(ieee_write_2bytes,(abfd, bytes),
62 buffer[0] = bytes >> 8;
63 buffer[1] = bytes & 0xff;
65 bfd_write((PTR)buffer, 1, 2, abfd);
69 DEFUN(ieee_write_int,(abfd, value),
73 if (((unsigned)value) <= 127) {
74 ieee_write_byte(abfd, value);
78 /* How many significant bytes ? */
79 /* FIXME FOR LONGER INTS */
80 if (value & 0xff000000) {
83 else if (value & 0x00ff0000) {
86 else if (value & 0x0000ff00) {
91 ieee_write_byte(abfd, (int)ieee_number_repeat_start_enum + length);
94 ieee_write_byte(abfd, value >> 24);
96 ieee_write_byte(abfd, value >> 16);
98 ieee_write_byte(abfd, value >> 8);
100 ieee_write_byte(abfd, value);
106 DEFUN(ieee_write_id,(abfd, id),
110 size_t length = strlen(id);
111 if (length >= 0 && length <= 127) {
112 ieee_write_byte(abfd, length);
114 else if (length < 255) {
115 ieee_write_byte(abfd, ieee_extension_length_1_enum);
116 ieee_write_byte(abfd, length);
118 else if (length < 65535) {
119 ieee_write_byte(abfd, ieee_extension_length_2_enum);
120 ieee_write_byte(abfd, length >> 8);
121 ieee_write_byte(abfd, length & 0xff);
126 bfd_write((PTR)id, 1, length, abfd);
128 /***************************************************************************
129 Functions for reading from ieee files in the strange way that the
134 #define this_byte(ieee) *((ieee)->input_p)
135 #define next_byte(ieee) ((ieee)->input_p++)
136 #define this_byte_and_next(ieee) (*((ieee)->input_p++))
139 static unsigned short
140 DEFUN(read_2bytes,(ieee),
141 common_header_type *ieee)
143 unsigned char c1 = this_byte_and_next(ieee);
144 unsigned char c2 = this_byte_and_next(ieee);
145 return (c1<<8 ) | c2;
150 DEFUN(bfd_get_string,(ieee, string, length),
151 common_header_type *ieee AND
156 for (i= 0; i < length; i++) {
157 string[i] = this_byte_and_next(ieee);
162 DEFUN(read_id,(ieee),
163 common_header_type *ieee)
167 length = this_byte_and_next(ieee);
168 if (length >= 0x00 && length <= 0x7f) {
169 /* Simple string of length 0 to 127 */
171 else if (length == 0xde) {
172 /* Length is next byte, allowing 0..255 */
173 length = this_byte_and_next(ieee);
175 else if (length == 0xdf) {
176 /* Length is next two bytes, allowing 0..65535 */
177 length = this_byte_and_next(ieee) ;
178 length = (length * 256) + this_byte_and_next(ieee);
180 /* Buy memory and read string */
181 string = bfd_alloc(ieee->abfd, length+1);
182 bfd_get_string(ieee, string, length);
188 DEFUN(ieee_write_expression,(abfd, value,/* section,*/ symbol, pcrel, index),
191 /* asection *section AND*/
198 unsigned int plus_count = 0;
200 ieee_write_int(abfd, value);
202 if (section != &bfd_abs_section) {
204 ieee_write_byte(abfd, ieee_variable_R_enum);
205 ieee_write_byte(abfd, section->index +IEEE_SECTION_NUMBER_BASE);
210 if (symbol != (asymbol *)NULL) {
212 if ((symbol->section == &bfd_und_section) ||
213 (symbol->section == &bfd_com_section)) {
214 ieee_write_byte(abfd, ieee_variable_X_enum);
215 ieee_write_int(abfd, symbol->value);
217 else if (symbol->flags & BSF_GLOBAL) {
218 ieee_write_byte(abfd, ieee_variable_I_enum);
219 ieee_write_int(abfd, symbol->value);
221 else if (symbol->flags & BSF_LOCAL) {
222 /* This is a reference to a defined local symbol,
223 We can easily do a local as a section+offset */
224 if (bfd_symbol_is_absolute(symbol) == false) {
225 /* If this symbol is not absolute, add the base of it */
226 ieee_write_byte(abfd, ieee_variable_R_enum); /* or L */
227 ieee_write_byte(abfd, symbol->section->index +
228 IEEE_SECTION_NUMBER_BASE);
232 ieee_write_int(abfd, symbol->value);
241 /* subtract the pc from here by asking for PC of this section*/
242 ieee_write_byte(abfd, ieee_variable_P_enum);
243 ieee_write_byte(abfd, index +IEEE_SECTION_NUMBER_BASE);
244 ieee_write_byte(abfd, ieee_function_minus_enum);
248 while (plus_count > 0) {
249 ieee_write_byte(abfd, ieee_function_plus_enum);
255 ieee_write_byte(abfd,0);
268 /*****************************************************************************/
271 writes any integer into the buffer supplied and always takes 5 bytes
274 DEFUN(ieee_write_int5,(buffer, value),
278 buffer[0] = (bfd_byte)ieee_number_repeat_4_enum;
279 buffer[1] = (value >> 24 ) & 0xff;
280 buffer[2] = (value >> 16 ) & 0xff;
281 buffer[3] = (value >> 8 ) & 0xff;
282 buffer[4] = (value >> 0 ) & 0xff;
285 DEFUN(ieee_write_int5_out, (abfd, value),
290 ieee_write_int5(b, value);
291 bfd_write((PTR)b,1,5,abfd);
296 DEFUN(parse_int,(ieee, value_ptr),
297 common_header_type *ieee AND
300 int value = this_byte(ieee);
302 if (value >= 0 && value <= 127) {
307 else if (value >= 0x80 && value <= 0x88) {
308 unsigned int count = value & 0xf;
312 result =(result << 8) | this_byte_and_next(ieee);
321 DEFUN(parse_i,(ieee, ok),
322 common_header_type *ieee AND
326 *ok = parse_int(ieee, &x);
331 DEFUN(must_parse_int,(ieee),
332 common_header_type *ieee)
335 BFD_ASSERT(parse_int(ieee, &result) == true);
343 ieee_symbol_index_type symbol;
348 reloc_howto_type abs32_howto
349 = HOWTO(1,0,2,32,false,0,false,true,0,"abs32",true,0xffffffff, 0xffffffff,false);
351 reloc_howto_type abs16_howto
352 = HOWTO(1,0,1,16,false,0,false,true,0,"abs16",true,0x0000ffff, 0x0000ffff,false);
355 reloc_howto_type abs8_howto
356 = HOWTO(1,0,0,8,false,0,false,true,0,"abs8",true,0x000000ff, 0x000000ff,false);
359 reloc_howto_type rel32_howto
360 = HOWTO(1,0,2,32,true,0,false,true,0,"rel32",true,0xffffffff, 0xffffffff,true);
362 reloc_howto_type rel16_howto
363 = HOWTO(1,0,1,16,true,0,false,true,0,"rel16",true,0x0000ffff, 0x0000ffff,true);
366 reloc_howto_type rel8_howto
367 = HOWTO(1,0,0,8,true,0,false,true,0,"rel8",true,0x000000ff, 0x000000ff,true);
370 static ieee_symbol_index_type NOSYMBOL = { 0, 0};
374 DEFUN(parse_expression,(ieee, value,/* section,*/ symbol, pcrel, extra),
375 ieee_data_type *ieee AND
377 /* asection **section AND*/
378 ieee_symbol_index_type *symbol AND
391 ieee_value_type stack[10];
393 /* The stack pointer always points to the next unused location */
394 #define PUSH(x,y,z) TOS.symbol=x;TOS.section=y;TOS.value=z;INC;
395 #define POP(x,y,z) DEC;x=TOS.symbol;y=TOS.section;z=TOS.value;
396 ieee_value_type *sp = stack;
399 switch (this_byte(&(ieee->h)))
401 case ieee_variable_P_enum:
402 /* P variable, current program counter for section n */
405 next_byte(&(ieee->h));
407 section_n = must_parse_int(&(ieee->h));
409 TOS.value = ieee->section_table[section_n]->vma +
410 ieee_per_section(ieee->section_table[section_n])->pc);
413 case ieee_variable_L_enum:
414 /* L variable address of section N */
415 next_byte(&(ieee->h));
416 PUSH(NOSYMBOL,ieee->section_table[must_parse_int(&(ieee->h))],0);
418 case ieee_variable_R_enum:
419 /* R variable, logical address of section module */
420 /* FIXME, this should be different to L */
421 next_byte(&(ieee->h));
422 PUSH(NOSYMBOL,ieee->section_table[must_parse_int(&(ieee->h))],0);
424 case ieee_variable_S_enum:
425 /* S variable, size in MAUS of section module */
426 next_byte(&(ieee->h));
429 ieee->section_table[must_parse_int(&(ieee->h))]->_cooked_size);
431 case ieee_variable_I_enum:
432 case ieee_variable_X_enum:
433 /* Push the address of external variable n */
435 ieee_symbol_index_type sy;
436 next_byte(&(ieee->h));
437 sy.index = (int)(must_parse_int(&(ieee->h))) ;
443 case ieee_function_minus_enum:
445 bfd_vma value1, value2;
446 asection *section1, *section_dummy;
447 ieee_symbol_index_type sy;
448 next_byte(&(ieee->h));
450 POP(sy, section1, value1);
451 POP(sy, section_dummy, value2);
452 PUSH(sy, section1 ? section1 : section_dummy, value1-value2);
455 case ieee_function_plus_enum:
457 bfd_vma value1, value2;
460 ieee_symbol_index_type sy1;
461 ieee_symbol_index_type sy2;
462 next_byte(&(ieee->h));
464 POP(sy1, section1, value1);
465 POP(sy2, section2, value2);
466 PUSH(sy1.letter ? sy1 : sy2, section1 ? section1: section2, value1+value2);
472 BFD_ASSERT(this_byte(&(ieee->h)) < (int)ieee_variable_A_enum
473 || this_byte(&(ieee->h)) > (int)ieee_variable_Z_enum);
474 if (parse_int(&(ieee->h), &va))
476 PUSH(NOSYMBOL,0, va);
480 Thats all that we can understand. As far as I can see
481 there is a bug in the Microtec IEEE output which I'm
482 using to scan, whereby the comma operator is ommited
483 sometimes in an expression, giving expressions with too
484 many terms. We can tell if that's the case by ensuring
485 that sp == stack here. If not, then we've pushed
486 something too far, so we keep adding
489 while (sp != stack+1) {
491 ieee_symbol_index_type sy1;
492 POP(sy1, section1, *extra);
495 POP(*symbol, *section, *value);
506 #define ieee_seek(abfd, offset) \
507 IEEE_DATA(abfd)->h.input_p = IEEE_DATA(abfd)->h.first_byte + offset
509 #define ieee_pos(abfd) IEEE_DATA(abfd)->h.input_p -IEEE_DATA(abfd)->h.first_byte
511 static unsigned int last_index;
513 static ieee_symbol_type *
514 DEFUN(get_symbol,(abfd,
522 ieee_data_type *ieee AND
523 ieee_symbol_type *last_symbol AND
524 unsigned int *symbol_count AND
525 ieee_symbol_type *** pptr AND
526 unsigned int *max_index
529 /* Need a new symbol */
530 unsigned int new_index = must_parse_int(&(ieee->h));
531 if (new_index != last_index) {
532 ieee_symbol_type * new_symbol = (ieee_symbol_type *)bfd_alloc(ieee->h.abfd,
533 sizeof(ieee_symbol_type));
535 new_symbol->index = new_index;
536 last_index = new_index;
539 *pptr = &new_symbol->next;
540 if (new_index > *max_index) {
541 *max_index = new_index;
548 DEFUN(ieee_slurp_external_symbols,(abfd),
551 ieee_data_type *ieee = IEEE_DATA(abfd);
552 file_ptr offset = ieee->w.r.external_part;
555 ieee_symbol_type **prev_symbols_ptr = &ieee->external_symbols;
556 ieee_symbol_type **prev_reference_ptr = &ieee->external_reference;
557 ieee_symbol_type *symbol = (ieee_symbol_type *)NULL;
558 unsigned int symbol_count = 0;
560 last_index = 0xffffff;
561 ieee->symbol_table_full = true;
563 ieee_seek(abfd, offset );
566 switch (this_byte(&(ieee->h))) {
568 next_byte(&(ieee->h));
569 symbol = get_symbol(abfd, ieee, symbol, &symbol_count,
571 &ieee->external_symbol_max_index);
573 symbol->symbol.the_bfd = abfd;
574 symbol->symbol.name = read_id(&(ieee->h));
575 symbol->symbol.udata = (PTR)NULL;
576 symbol->symbol.flags = BSF_NO_FLAGS;
580 case ieee_external_symbol_enum:
581 next_byte(&(ieee->h));
583 symbol = get_symbol(abfd, ieee, symbol, &symbol_count,
585 &ieee->external_symbol_max_index);
588 BFD_ASSERT (symbol->index >= ieee->external_symbol_min_index);
590 symbol->symbol.the_bfd = abfd;
591 symbol->symbol.name = read_id(&(ieee->h));
592 symbol->symbol.udata = (PTR)NULL;
593 symbol->symbol.flags = BSF_NO_FLAGS;
595 case ieee_attribute_record_enum >> 8:
597 unsigned int symbol_name_index;
598 unsigned int symbol_type_index;
599 unsigned int symbol_attribute_def;
601 next_byte(&(ieee->h)); /* Skip prefix */
602 next_byte(&(ieee->h));
603 symbol_name_index = must_parse_int(&(ieee->h));
604 symbol_type_index = must_parse_int(&(ieee->h));
605 symbol_attribute_def = must_parse_int(&(ieee->h));
606 switch (symbol_attribute_def) {
608 /* Module misc; followed by two fields which describe the
609 current module block. The first fired is the type id
610 number, the second is the number of asn records
611 associated with the directive */
612 parse_int(&(ieee->h),&value);
613 parse_int(&(ieee->h),&value);
617 parse_int(&(ieee->h),&value);
622 case ieee_value_record_enum >> 8:
624 unsigned int symbol_name_index;
625 ieee_symbol_index_type symbol_ignore;
626 boolean pcrel_ignore;
628 next_byte(&(ieee->h));
629 next_byte(&(ieee->h));
631 symbol_name_index = must_parse_int(&(ieee->h));
632 parse_expression(ieee,
633 &symbol->symbol.value,
634 /* &symbol->symbol.section,*/
639 symbol->symbol.flags = BSF_GLOBAL | BSF_EXPORT;
643 case ieee_weak_external_reference_enum:
646 next_byte(&(ieee->h));
647 /* Throw away the external reference index */
648 (void)must_parse_int(&(ieee->h));
649 /* Fetch the default size if not resolved */
650 size = must_parse_int(&(ieee->h));
651 /* Fetch the defautlt value if available */
652 if ( parse_int(&(ieee->h), &value) == false) {
655 /* This turns into a common */
656 symbol->symbol.section = &bfd_com_section;
657 symbol->symbol.value = size;
661 case ieee_external_reference_enum:
662 next_byte(&(ieee->h));
664 symbol = get_symbol(abfd, ieee, symbol, &symbol_count,
666 &ieee->external_reference_max_index);
669 symbol->symbol.the_bfd = abfd;
670 symbol->symbol.name = read_id(&(ieee->h));
671 symbol->symbol.udata = (PTR)NULL;
672 symbol->symbol.section = &bfd_und_section;
673 symbol->symbol.value = (bfd_vma)0;
674 symbol->symbol.flags = 0;
676 BFD_ASSERT (symbol->index >= ieee->external_reference_min_index);
684 if (ieee->external_symbol_max_index != 0) {
685 ieee->external_symbol_count =
686 ieee->external_symbol_max_index -
687 ieee->external_symbol_min_index + 1 ;
690 ieee->external_symbol_count = 0;
694 if(ieee->external_reference_max_index != 0) {
695 ieee->external_reference_count =
696 ieee->external_reference_max_index -
697 ieee->external_reference_min_index + 1;
700 ieee->external_reference_count = 0;
704 ieee->external_reference_count + ieee->external_symbol_count;
706 if (symbol_count != abfd->symcount) {
707 /* There are gaps in the table -- */
708 ieee->symbol_table_full = false;
712 *prev_symbols_ptr = (ieee_symbol_type *)NULL;
713 *prev_reference_ptr = (ieee_symbol_type *)NULL;
717 DEFUN(ieee_slurp_symbol_table,(abfd),
720 if (IEEE_DATA(abfd)->read_symbols == false) {
721 ieee_slurp_external_symbols(abfd);
722 IEEE_DATA(abfd)->read_symbols= true;
727 DEFUN(ieee_get_symtab_upper_bound,(abfd),
730 ieee_slurp_symbol_table (abfd);
732 return (abfd->symcount != 0) ?
733 (abfd->symcount+1) * (sizeof (ieee_symbol_type *)) : 0;
737 Move from our internal lists to the canon table, and insert in
741 extern bfd_target ieee_vec;
743 DEFUN(ieee_get_symtab,(abfd, location),
747 ieee_symbol_type *symp;
748 static bfd dummy_bfd;
749 static asymbol empty_symbol =
750 { &dummy_bfd," ieee empty",(symvalue)0,BSF_DEBUGGING };
752 if (abfd->symcount) {
757 ieee_data_type *ieee = IEEE_DATA(abfd);
758 dummy_bfd.xvec= &ieee_vec;
759 ieee_slurp_symbol_table(abfd);
761 if (ieee->symbol_table_full == false) {
762 /* Arrgh - there are gaps in the table, run through and fill them */
763 /* up with pointers to a null place */
765 for (i= 0; i < abfd->symcount; i++) {
766 location[i] = &empty_symbol;
771 ieee->external_symbol_base_offset= - ieee->external_symbol_min_index;
772 for (symp = IEEE_DATA(abfd)->external_symbols;
773 symp != (ieee_symbol_type *)NULL;
775 /* Place into table at correct index locations */
776 location[symp->index + ieee->external_symbol_base_offset] = &symp->symbol;
780 /* The external refs are indexed in a bit */
781 ieee->external_reference_base_offset =
782 - ieee->external_reference_min_index +ieee->external_symbol_count ;
784 for (symp = IEEE_DATA(abfd)->external_reference;
785 symp != (ieee_symbol_type *)NULL;
787 location[symp->index + ieee->external_reference_base_offset] =
794 location[abfd->symcount] = (asymbol *)NULL;
796 return abfd->symcount;
799 DEFUN(get_section_entry,(abfd, ieee,index),
801 ieee_data_type *ieee AND
804 if (ieee->section_table[index] == (asection *)NULL) {
805 asection *section = bfd_make_section(abfd, " tempname");
806 ieee->section_table[index] = section;
807 section->flags = SEC_NO_FLAGS;
808 section->target_index = index;
809 ieee->section_table[index] = section;
811 return ieee->section_table[index];
815 DEFUN(ieee_slurp_sections,(abfd),
818 ieee_data_type *ieee = IEEE_DATA(abfd);
819 file_ptr offset = ieee->w.r.section_part;
821 asection *section = (asection *)NULL;
824 bfd_byte section_type[3];
825 ieee_seek(abfd, offset);
827 switch (this_byte(&(ieee->h))) {
828 case ieee_section_type_enum:
830 unsigned int section_index ;
831 next_byte(&(ieee->h));
832 section_index = must_parse_int(&(ieee->h));
833 /* Fixme to be nice about a silly number of sections */
834 BFD_ASSERT(section_index < NSECTIONS);
836 section =get_section_entry(abfd, ieee, section_index);
838 section_type[0] = this_byte_and_next(&(ieee->h));
839 switch (section_type[0]) {
841 /* Normal attributes for absolute sections */
842 section_type[1] = this_byte(&(ieee->h));
843 section->flags = SEC_LOAD | SEC_ALLOC | SEC_HAS_CONTENTS;
844 switch(section_type[1]) {
846 next_byte(&(ieee->h));
847 section_type[2] = this_byte(&(ieee->h));
848 switch (section_type[2])
852 next_byte(&(ieee->h));
853 section->flags |= SEC_LOAD | SEC_CODE;
856 next_byte(&(ieee->h));
857 section->flags |= SEC_LOAD | SEC_DATA;
861 next_byte(&(ieee->h));
862 /* Normal rom data */
863 section->flags |= SEC_LOAD | SEC_ROM | SEC_DATA;
871 section_type[1] = this_byte(&(ieee->h));
872 section->flags = SEC_LOAD | SEC_ALLOC | SEC_HAS_CONTENTS;
873 switch (section_type[1]) {
876 next_byte(&(ieee->h));
877 section->flags |= SEC_LOAD | SEC_CODE;
880 next_byte(&(ieee->h));
881 section->flags |= SEC_LOAD | SEC_DATA;
885 next_byte(&(ieee->h));
886 /* Normal rom data */
887 section->flags |= SEC_LOAD | SEC_ROM | SEC_DATA;
893 section->name = read_id(&(ieee->h));
894 { bfd_vma parent, brother, context;
895 parse_int(&(ieee->h), &parent);
896 parse_int(&(ieee->h), &brother);
897 parse_int(&(ieee->h), &context);
903 case ieee_section_alignment_enum:
905 unsigned int section_index;
908 next_byte(&(ieee->h));
909 section_index = must_parse_int(&ieee->h);
910 section = get_section_entry(abfd, ieee, section_index);
911 if (section_index > ieee->section_count) {
912 ieee->section_count = section_index;
914 section->alignment_power =
915 bfd_log2(must_parse_int(&ieee->h));
916 (void)parse_int(&(ieee->h), & value);
919 case ieee_e2_first_byte_enum:
921 ieee_record_enum_type t = (ieee_record_enum_type)(read_2bytes(&(ieee->h)));
924 case ieee_section_size_enum:
925 section = ieee->section_table[must_parse_int(&(ieee->h))];
926 section->_raw_size = must_parse_int(&(ieee->h));
928 case ieee_physical_region_size_enum:
929 section = ieee->section_table[must_parse_int(&(ieee->h))];
930 section->_raw_size = must_parse_int(&(ieee->h));
932 case ieee_region_base_address_enum:
933 section = ieee->section_table[must_parse_int(&(ieee->h))];
934 section->vma = must_parse_int(&(ieee->h));
936 case ieee_mau_size_enum:
937 must_parse_int(&(ieee->h));
938 must_parse_int(&(ieee->h));
940 case ieee_m_value_enum:
941 must_parse_int(&(ieee->h));
942 must_parse_int(&(ieee->h));
944 case ieee_section_base_address_enum:
945 section = ieee->section_table[must_parse_int(&(ieee->h))];
946 section->vma = must_parse_int(&(ieee->h));
948 case ieee_section_offset_enum:
949 (void) must_parse_int(&(ieee->h));
950 (void) must_parse_int(&(ieee->h));
964 /***********************************************************************
968 DEFUN(ieee_archive_p,(abfd),
975 uint8e_type buffer[512];
977 int buffer_offset = 0;
978 ieee_ar_data_type *save = IEEE_AR_DATA(abfd);
979 ieee_ar_data_type *ieee ;
980 abfd->tdata.ieee_ar_data = (ieee_ar_data_type *)bfd_alloc(abfd, sizeof(ieee_ar_data_type));
981 ieee= IEEE_AR_DATA(abfd);
984 bfd_read((PTR)buffer, 1, sizeof(buffer), abfd);
986 ieee->h.first_byte = buffer;
987 ieee->h.input_p = buffer;
991 if (this_byte(&(ieee->h)) != Module_Beginning) return (bfd_target*)NULL;
993 next_byte(&(ieee->h));
994 library= read_id(&(ieee->h));
995 if (strcmp(library , "LIBRARY") != 0) {
996 bfd_release(abfd, ieee);
997 abfd->tdata.ieee_ar_data = save;
998 return (bfd_target *)NULL;
1000 /* Throw away the filename */
1001 free( read_id(&(ieee->h)));
1002 /* This must be an IEEE archive, so we'll buy some space to do
1004 ieee->element_count = 0;
1005 ieee->element_index = 0;
1007 next_byte(&(ieee->h)); /* Drop the ad part */
1008 must_parse_int(&(ieee->h)); /* And the two dummy numbers */
1009 must_parse_int(&(ieee->h));
1012 /* Read the index of the BB table */
1014 ieee_ar_obstack_type t;
1015 int rec =read_2bytes(&(ieee->h));
1016 if (rec ==(int)ieee_assign_value_to_variable_enum) {
1017 int record_number = must_parse_int(&(ieee->h));
1018 t.file_offset = must_parse_int(&(ieee->h));
1019 t.abfd = (bfd *)NULL;
1020 ieee->element_count++;
1021 bfd_alloc_grow(abfd, (PTR)&t, sizeof(t));
1023 /* Make sure that we don't go over the end of the buffer */
1025 if (ieee_pos(abfd) > sizeof(buffer)/2) {
1026 /* Past half way, reseek and reprime */
1027 buffer_offset += ieee_pos(abfd);
1028 bfd_seek(abfd, buffer_offset, SEEK_SET);
1029 bfd_read((PTR)buffer, 1, sizeof(buffer), abfd);
1030 ieee->h.first_byte = buffer;
1031 ieee->h.input_p = buffer;
1037 ieee->elements = (ieee_ar_obstack_type *)bfd_alloc_finish(abfd);
1039 /* Now scan the area again, and replace BB offsets with file */
1043 for (i = 2; i < ieee->element_count; i++) {
1044 bfd_seek(abfd, ieee->elements[i].file_offset, SEEK_SET);
1045 bfd_read((PTR)buffer, 1, sizeof(buffer), abfd);
1046 ieee->h.first_byte = buffer;
1047 ieee->h.input_p = buffer;
1049 next_byte(&(ieee->h)); /* Drop F8 */
1050 next_byte(&(ieee->h)); /* Drop 14 */
1051 must_parse_int(&(ieee->h)); /* Drop size of block */
1052 if (must_parse_int(&(ieee->h)) != 0) {
1053 /* This object has been deleted */
1054 ieee->elements[i].file_offset = 0;
1057 ieee->elements[i].file_offset = must_parse_int(&(ieee->h));
1066 DEFUN(ieee_mkobject,(abfd),
1069 abfd->tdata.ieee_data = (ieee_data_type *)bfd_zalloc(abfd,sizeof(ieee_data_type));
1076 DEFUN(ieee_object_p,(abfd),
1081 ieee_data_type *ieee;
1082 uint8e_type buffer[300];
1083 ieee_data_type *save = IEEE_DATA(abfd);
1084 abfd->tdata.ieee_data = 0;
1085 ieee_mkobject(abfd);
1086 ieee = IEEE_DATA(abfd);
1088 /* Read the first few bytes in to see if it makes sense */
1089 bfd_read((PTR)buffer, 1, sizeof(buffer), abfd);
1091 ieee->h.input_p = buffer;
1092 if (this_byte_and_next(&(ieee->h)) != Module_Beginning) goto fail;
1094 ieee->read_symbols= false;
1095 ieee->read_data= false;
1096 ieee->section_count = 0;
1097 ieee->external_symbol_max_index = 0;
1098 ieee->external_symbol_min_index = IEEE_PUBLIC_BASE;
1099 ieee->external_reference_min_index =IEEE_REFERENCE_BASE;
1100 ieee->external_reference_max_index = 0;
1101 ieee->h.abfd = abfd;
1102 memset((PTR)ieee->section_table, 0, sizeof(ieee->section_table));
1104 processor = ieee->mb.processor = read_id(&(ieee->h));
1105 if (strcmp(processor,"LIBRARY") == 0) goto fail;
1106 ieee->mb.module_name = read_id(&(ieee->h));
1107 if (abfd->filename == (CONST char *)NULL) {
1108 abfd->filename = ieee->mb.module_name;
1110 /* Determine the architecture and machine type of the object file.
1113 bfd_arch_info_type *arch = bfd_scan_arch(processor);
1114 if (arch == 0) goto fail;
1115 abfd->arch_info = arch;
1118 if (this_byte(&(ieee->h)) != (int)ieee_address_descriptor_enum) {
1121 next_byte(&(ieee->h));
1123 if (parse_int(&(ieee->h), &ieee->ad.number_of_bits_mau) == false) {
1126 if(parse_int(&(ieee->h), &ieee->ad.number_of_maus_in_address) == false) {
1130 /* If there is a byte order info, take it */
1131 if (this_byte(&(ieee->h)) == (int)ieee_variable_L_enum ||
1132 this_byte(&(ieee->h)) == (int)ieee_variable_M_enum)
1133 next_byte(&(ieee->h));
1136 for (part = 0; part < N_W_VARIABLES; part++) {
1138 if (read_2bytes(&(ieee->h)) != (int) ieee_assign_value_to_variable_enum) {
1141 if (this_byte_and_next(&(ieee->h)) != part) {
1145 ieee->w.offset[part] = parse_i(&(ieee->h), &ok);
1151 abfd->flags = HAS_SYMS;
1153 /* By now we know that this is a real IEEE file, we're going to read
1154 the whole thing into memory so that we can run up and down it
1155 quickly. We can work out how big the file is from the trailer
1158 IEEE_DATA(abfd)->h.first_byte = (uint8e_type *) bfd_alloc(ieee->h.abfd, ieee->w.r.me_record
1160 bfd_seek(abfd, 0, 0);
1161 bfd_read((PTR)(IEEE_DATA(abfd)->h.first_byte), 1, ieee->w.r.me_record+50, abfd);
1163 ieee_slurp_sections(abfd);
1166 (void) bfd_release(abfd, ieee);
1167 abfd->tdata.ieee_data = save;
1168 return (bfd_target *)NULL;
1173 DEFUN(ieee_print_symbol,(ignore_abfd, afile, symbol, how),
1174 bfd *ignore_abfd AND
1177 bfd_print_symbol_type how)
1179 FILE *file = (FILE *)afile;
1182 case bfd_print_symbol_name:
1183 fprintf(file,"%s", symbol->name);
1185 case bfd_print_symbol_more:
1187 fprintf(file,"%4x %2x",aout_symbol(symbol)->desc & 0xffff,
1188 aout_symbol(symbol)->other & 0xff);
1192 case bfd_print_symbol_nm:
1193 case bfd_print_symbol_all:
1195 CONST char *section_name = symbol->section == (asection *)NULL ?
1196 (CONST char *)"*abs" : symbol->section->name;
1197 if (symbol->name[0] == ' ') {
1198 fprintf(file,"* empty table entry ");
1201 bfd_print_symbol_vandf((PTR)file,symbol);
1203 fprintf(file," %-5s %04x %02x %s",
1205 (unsigned) ieee_symbol(symbol)->index,
1207 aout_symbol(symbol)->desc & 0xffff,
1208 aout_symbol(symbol)->other & 0xff,*/
1218 DEFUN(do_one,(ieee, current_map, location_ptr,s),
1219 ieee_data_type *ieee AND
1220 ieee_per_section_type *current_map AND
1221 uint8e_type *location_ptr AND
1224 switch (this_byte(&(ieee->h)))
1226 case ieee_load_constant_bytes_enum:
1228 unsigned int number_of_maus;
1230 next_byte(&(ieee->h));
1231 number_of_maus = must_parse_int(&(ieee->h));
1233 for (i = 0; i < number_of_maus; i++) {
1234 location_ptr[current_map->pc++]= this_byte(&(ieee->h));
1235 next_byte(&(ieee->h));
1240 case ieee_load_with_relocation_enum:
1242 boolean loop = true;
1243 next_byte(&(ieee->h));
1246 switch (this_byte(&(ieee->h)))
1248 case ieee_variable_R_enum:
1250 case ieee_function_signed_open_b_enum:
1251 case ieee_function_unsigned_open_b_enum:
1252 case ieee_function_either_open_b_enum:
1254 unsigned int extra = 4;
1255 boolean pcrel = false;
1257 ieee_reloc_type *r =
1258 (ieee_reloc_type *) bfd_alloc(ieee->h.abfd,
1259 sizeof(ieee_reloc_type));
1261 *(current_map->reloc_tail_ptr) = r;
1262 current_map->reloc_tail_ptr= &r->next;
1263 r->next = (ieee_reloc_type *)NULL;
1264 next_byte(&(ieee->h));
1267 parse_expression(ieee,
1269 /* &r->relent.section,*/
1272 r->relent.address = current_map->pc;
1275 if (this_byte(&(ieee->h)) == (int)ieee_comma) {
1276 next_byte(&(ieee->h));
1277 /* Fetch number of bytes to pad */
1278 extra = must_parse_int(&(ieee->h));
1281 switch (this_byte(&(ieee->h))) {
1282 case ieee_function_signed_close_b_enum:
1283 next_byte(&(ieee->h));
1285 case ieee_function_unsigned_close_b_enum:
1286 next_byte(&(ieee->h));
1288 case ieee_function_either_close_b_enum:
1289 next_byte(&(ieee->h));
1294 /* Build a relocation entry for this type */
1295 /* If pc rel then stick -ve pc into instruction
1296 and take out of reloc ..
1298 I've changed this. It's all too
1299 complicated. I keep 0 in the
1310 #if KEEPMINUSPCININST
1311 bfd_put_32(ieee->h.abfd, -current_map->pc, location_ptr +
1313 r->relent.howto = &rel32_howto;
1317 bfd_put_32(ieee->h.abfd,0, location_ptr +
1319 r->relent.howto = &rel32_howto;
1324 bfd_put_32(ieee->h.abfd, 0, location_ptr +
1326 r->relent.howto = &abs32_howto;
1328 current_map->pc +=4;
1331 if (pcrel == true) {
1332 #if KEEPMINUSPCININST
1333 bfd_put_16(ieee->h.abfd, (int)(-current_map->pc), location_ptr +current_map->pc);
1334 r->relent.addend -= current_map->pc;
1335 r->relent.howto = &rel16_howto;
1338 bfd_put_16(ieee->h.abfd, 0, location_ptr +current_map->pc);
1339 r->relent.howto = &rel16_howto;
1344 bfd_put_16(ieee->h.abfd, 0, location_ptr +current_map->pc);
1345 r->relent.howto = &abs16_howto;
1347 current_map->pc +=2;
1350 if (pcrel == true) {
1351 #if KEEPMINUSPCININST
1352 bfd_put_8(ieee->h.abfd, (int)(-current_map->pc), location_ptr +current_map->pc);
1353 r->relent.addend -= current_map->pc;
1354 r->relent.howto = &rel8_howto;
1356 bfd_put_8(ieee->h.abfd,0, location_ptr +current_map->pc);
1357 r->relent.howto = &rel8_howto;
1361 bfd_put_8(ieee->h.abfd, 0, location_ptr +current_map->pc);
1362 r->relent.howto = &abs8_howto;
1364 current_map->pc +=1;
1376 if (parse_int(&(ieee->h), &this_size) == true) {
1378 for (i = 0; i < this_size; i++) {
1379 location_ptr[current_map->pc ++] = this_byte(&(ieee->h));
1380 next_byte(&(ieee->h));
1393 /* Read in all the section data and relocation stuff too */
1395 DEFUN(ieee_slurp_section_data,(abfd),
1398 bfd_byte *location_ptr = (bfd_byte *)NULL;
1399 ieee_data_type *ieee = IEEE_DATA(abfd);
1400 unsigned int section_number ;
1402 ieee_per_section_type *current_map = (ieee_per_section_type *)NULL;
1404 /* Seek to the start of the data area */
1405 if (ieee->read_data== true) return true;
1406 ieee->read_data = true;
1407 ieee_seek(abfd, ieee->w.r.data_part);
1409 /* Allocate enough space for all the section contents */
1412 for (s = abfd->sections; s != (asection *)NULL; s = s->next) {
1413 ieee_per_section_type *per = (ieee_per_section_type *) s->used_by_bfd;
1414 per->data = (bfd_byte *) bfd_alloc(ieee->h.abfd, s->_raw_size);
1416 per->reloc_tail_ptr =
1417 (ieee_reloc_type **)&(s->relocation);
1423 switch (this_byte(&(ieee->h)))
1425 /* IF we see anything strange then quit */
1429 case ieee_set_current_section_enum:
1430 next_byte(&(ieee->h));
1431 section_number = must_parse_int(&(ieee->h));
1432 s = ieee->section_table[section_number];
1433 current_map = (ieee_per_section_type *) s->used_by_bfd;
1434 location_ptr = current_map->data - s->vma;
1435 /* The document I have says that Microtec's compilers reset */
1436 /* this after a sec section, even though the standard says not */
1438 current_map->pc =s->vma;
1442 case ieee_e2_first_byte_enum:
1443 next_byte(&(ieee->h));
1444 switch (this_byte(&(ieee->h)))
1446 case ieee_set_current_pc_enum & 0xff:
1450 ieee_symbol_index_type symbol;
1453 next_byte(&(ieee->h));
1454 must_parse_int(&(ieee->h)); /* Thow away section #*/
1455 parse_expression(ieee, &value,
1459 current_map->pc = value;
1460 BFD_ASSERT((unsigned)(value - s->vma) <= s->_raw_size);
1464 case ieee_value_starting_address_enum & 0xff:
1465 /* We've got to the end of the data now - */
1472 case ieee_repeat_data_enum:
1474 /* Repeat the following LD or LR n times - we do this by
1475 remembering the stream pointer before running it and
1476 resetting it and running it n times. We special case
1477 the repetition of a repeat_data/load_constant
1480 unsigned int iterations ;
1481 uint8e_type *start ;
1482 next_byte(&(ieee->h));
1483 iterations = must_parse_int(&(ieee->h));
1484 start = ieee->h.input_p;
1485 if (start[0] == (int)ieee_load_constant_bytes_enum &&
1487 while (iterations != 0) {
1488 location_ptr[current_map->pc++] = start[2];
1491 next_byte(&(ieee->h));
1492 next_byte(&(ieee->h));
1493 next_byte(&(ieee->h));
1496 while (iterations != 0) {
1497 ieee->h.input_p = start;
1498 do_one(ieee, current_map, location_ptr,s);
1504 case ieee_load_constant_bytes_enum:
1505 case ieee_load_with_relocation_enum:
1507 do_one(ieee, current_map, location_ptr,s);
1518 DEFUN(ieee_new_section_hook,(abfd, newsect),
1522 newsect->used_by_bfd = (PTR)
1523 bfd_alloc(abfd, sizeof(ieee_per_section_type));
1524 ieee_per_section( newsect)->data = (bfd_byte *)NULL;
1525 ieee_per_section(newsect)->section = newsect;
1531 DEFUN(ieee_get_reloc_upper_bound,(abfd, asect),
1535 ieee_slurp_section_data(abfd);
1536 return (asect->reloc_count+1) * sizeof(arelent *);
1540 DEFUN(ieee_get_section_contents,(abfd, section, location, offset, count),
1545 bfd_size_type count)
1547 ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;
1548 ieee_slurp_section_data(abfd);
1549 (void) memcpy((PTR)location, (PTR)(p->data + offset), (unsigned)count);
1555 DEFUN(ieee_canonicalize_reloc,(abfd, section, relptr, symbols),
1558 arelent **relptr AND
1561 /* ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;*/
1562 ieee_reloc_type *src = (ieee_reloc_type *)(section->relocation);
1563 ieee_data_type *ieee = IEEE_DATA(abfd);
1565 while (src != (ieee_reloc_type *)NULL) {
1566 /* Work out which symbol to attach it this reloc to */
1567 switch (src->symbol.letter) {
1569 src->relent.sym_ptr_ptr =
1570 symbols + src->symbol.index + ieee->external_reference_base_offset;
1573 src->relent.sym_ptr_ptr = (asymbol **)NULL;
1579 *relptr++ = &src->relent;
1582 *relptr = (arelent *)NULL;
1583 return section->reloc_count;
1589 DEFUN(comp,(ap, bp),
1593 arelent *a = *((arelent **)ap);
1594 arelent *b = *((arelent **)bp);
1595 return a->address - b->address;
1599 Write the section headers
1603 DEFUN(ieee_write_section_part,(abfd),
1606 ieee_data_type *ieee = IEEE_DATA(abfd);
1608 ieee->w.r.section_part = bfd_tell(abfd);
1609 for (s = abfd->sections; s != (asection *)NULL; s=s->next) {
1610 if (s != &bfd_abs_section)
1613 ieee_write_byte(abfd, ieee_section_type_enum);
1614 ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1616 if (abfd->flags & EXEC_P)
1618 /* This image is executable, so output absolute sections */
1619 ieee_write_byte(abfd, ieee_variable_A_enum);
1620 ieee_write_byte(abfd, ieee_variable_S_enum);
1624 ieee_write_byte(abfd, ieee_variable_C_enum);
1627 switch (s->flags &(SEC_CODE | SEC_DATA | SEC_ROM))
1629 case SEC_CODE | SEC_LOAD:
1631 ieee_write_byte(abfd, ieee_variable_P_enum);
1635 ieee_write_byte(abfd, ieee_variable_D_enum);
1638 case SEC_ROM | SEC_DATA:
1639 case SEC_ROM | SEC_LOAD:
1640 case SEC_ROM | SEC_DATA | SEC_LOAD:
1642 ieee_write_byte(abfd, ieee_variable_R_enum);
1646 ieee_write_id(abfd, s->name);
1648 ieee_write_int(abfd, 0); /* Parent */
1649 ieee_write_int(abfd, 0); /* Brother */
1650 ieee_write_int(abfd, 0); /* Context */
1653 ieee_write_byte(abfd, ieee_section_alignment_enum);
1654 ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1655 ieee_write_int(abfd, 1 << s->alignment_power);
1658 ieee_write_2bytes(abfd, ieee_section_size_enum);
1659 ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1660 ieee_write_int(abfd, s->_cooked_size);
1661 if (abfd->flags & EXEC_P) {
1662 /* Relocateable sections don't have asl records */
1664 ieee_write_2bytes(abfd, ieee_section_base_address_enum);
1665 ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1666 ieee_write_int(abfd, s->vma);
1676 DEFUN(do_with_relocs,(abfd, s),
1680 unsigned int relocs_to_go = s->reloc_count;
1683 bfd_byte *stream = ieee_per_section(s)->data;
1684 arelent **p = s->orelocation;
1686 bfd_size_type current_byte_index = 0;
1688 qsort(s->orelocation,
1693 /* Output the section preheader */
1694 ieee_write_byte(abfd, ieee_set_current_section_enum);
1695 ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1697 ieee_write_twobyte(abfd, ieee_set_current_pc_enum);
1698 ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1699 ieee_write_expression(abfd, 0,/* s,!!!!*/ 0, 0, 0);
1701 if (relocs_to_go == 0)
1703 /* If there arn't any relocations then output the load constant byte
1704 opcode rather than the load with relocation opcode */
1706 while (current_byte_index < s->_cooked_size) {
1708 unsigned int MAXRUN = 32;
1710 if (run > s->_cooked_size - current_byte_index) {
1711 run = s->_cooked_size - current_byte_index;
1715 ieee_write_byte(abfd, ieee_load_constant_bytes_enum);
1716 /* Output a stream of bytes */
1717 ieee_write_int(abfd, run);
1718 bfd_write((PTR)(stream + current_byte_index),
1722 current_byte_index += run;
1728 ieee_write_byte(abfd, ieee_load_with_relocation_enum);
1731 /* Output the data stream as the longest sequence of bytes
1732 possible, allowing for the a reasonable packet size and
1733 relocation stuffs */
1735 if ((PTR)stream == (PTR)NULL) {
1736 /* Outputting a section without data, fill it up */
1737 stream = (uint8e_type *)(bfd_alloc(abfd, s->_cooked_size));
1738 memset((PTR)stream, 0, s->_cooked_size);
1740 while (current_byte_index < s->_cooked_size) {
1742 unsigned int MAXRUN = 32;
1744 run = (*p)->address - current_byte_index;
1749 if (run > s->_cooked_size - current_byte_index) {
1750 run = s->_cooked_size - current_byte_index;
1754 /* Output a stream of bytes */
1755 ieee_write_int(abfd, run);
1756 bfd_write((PTR)(stream + current_byte_index),
1760 current_byte_index += run;
1762 /* Output any relocations here */
1763 if (relocs_to_go && (*p) && (*p)->address == current_byte_index) {
1764 while (relocs_to_go && (*p) && (*p)->address == current_byte_index) {
1770 if (r->howto->pc_relative) {
1771 r->addend += current_byte_index ;
1775 switch (r->howto->size) {
1778 ov = bfd_get_32(abfd,
1779 stream+current_byte_index);
1780 current_byte_index +=4;
1783 ov = bfd_get_16(abfd,
1784 stream+current_byte_index);
1785 current_byte_index +=2;
1788 ov = bfd_get_8(abfd,
1789 stream+current_byte_index);
1790 current_byte_index ++;
1796 ieee_write_byte(abfd, ieee_function_either_open_b_enum);
1799 if (r->sym_ptr_ptr != (asymbol **)NULL) {
1800 ieee_write_expression(abfd, r->addend + ov,
1801 /* !!! r->section,*/
1803 r->howto->pc_relative, s->index);
1806 ieee_write_expression(abfd, r->addend + ov,
1809 r->howto->pc_relative, s->index);
1812 if (1 || r->howto->size != 2) {
1813 ieee_write_byte(abfd, ieee_comma);
1814 ieee_write_int(abfd, 1<< r->howto->size);
1816 ieee_write_byte(abfd,
1817 ieee_function_either_close_b_enum);
1828 /* If there are no relocations in the output section then we can
1829 be clever about how we write. We block items up into a max of 127
1833 DEFUN(do_as_repeat, (abfd, s),
1837 ieee_write_byte(abfd, ieee_set_current_section_enum);
1838 ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1839 ieee_write_byte(abfd, ieee_set_current_pc_enum >> 8);
1840 ieee_write_byte(abfd, ieee_set_current_pc_enum & 0xff);
1841 ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1842 ieee_write_int(abfd, s->vma );
1844 ieee_write_byte(abfd,ieee_repeat_data_enum);
1845 ieee_write_int(abfd, s->_cooked_size);
1846 ieee_write_byte(abfd, ieee_load_constant_bytes_enum);
1847 ieee_write_byte(abfd, 1);
1848 ieee_write_byte(abfd, 0);
1852 DEFUN(do_without_relocs, (abfd, s),
1856 bfd_byte *stream = ieee_per_section(s)->data;
1858 if (stream == 0 || ((s->flags & SEC_LOAD) == 0))
1860 do_as_repeat(abfd, s);
1865 for (i = 0; i < s->_cooked_size; i++) {
1866 if (stream[i] != 0) {
1867 do_with_relocs(abfd, s);
1871 do_as_repeat(abfd, s);
1877 static unsigned char *output_ptr_start;
1878 static unsigned char *output_ptr;
1879 static unsigned char *output_ptr_end;
1880 static unsigned char *input_ptr_start;
1881 static unsigned char *input_ptr;
1882 static unsigned char *input_ptr_end;
1883 static bfd *input_bfd;
1884 static bfd *output_bfd;
1885 static int output_buffer;
1889 bfd_read((PTR)input_ptr_start, 1, input_ptr_end - input_ptr_start, input_bfd);
1890 input_ptr = input_ptr_start;
1894 bfd_write((PTR)(output_ptr_start),1,output_ptr - output_ptr_start, output_bfd);
1895 output_ptr = output_ptr_start;
1899 #define THIS() ( *input_ptr )
1900 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill(); }
1901 #define OUT(x) { *output_ptr++ = (x); if(output_ptr == output_ptr_end) flush(); }
1903 static void write_int(value)
1906 if (value >= 0 && value <= 127) {
1910 unsigned int length;
1911 /* How many significant bytes ? */
1912 /* FIXME FOR LONGER INTS */
1913 if (value & 0xff000000) {
1916 else if (value & 0x00ff0000) {
1919 else if (value & 0x0000ff00) {
1924 OUT((int)ieee_number_repeat_start_enum + length);
1938 static void copy_id()
1940 int length = THIS();
1950 #define VAR(x) ((x | 0x80))
1951 static void copy_expression()
1960 value = THIS(); NEXT();
1961 value = (value << 8) | THIS(); NEXT();
1962 value = (value << 8) | THIS(); NEXT();
1963 value = (value << 8) | THIS(); NEXT();
1968 value = THIS(); NEXT();
1969 value = (value << 8) | THIS(); NEXT();
1970 value = (value << 8) | THIS(); NEXT();
1975 value = THIS(); NEXT();
1976 value = (value << 8) | THIS(); NEXT();
1981 value = THIS(); NEXT();
1990 /* Not a number, just bug out with the answer */
1991 write_int(*(--tos));
2001 int value = *(--tos);
2009 int section_number ;
2010 ieee_data_type *ieee;
2013 section_number = THIS();
2016 ieee= IEEE_DATA(input_bfd);
2017 s = ieee->section_table[section_number];
2018 if (s->output_section) {
2019 value = s->output_section->vma ;
2020 } else { value = 0; }
2021 value += s->output_offset;
2029 write_int(*(--tos));
2039 /* Drop the int in the buffer, and copy a null into the gap, which we
2040 will overwrite later */
2042 struct output_buffer_struct {
2043 unsigned char *ptrp;
2048 DEFUN(fill_int,(buf),
2049 struct output_buffer_struct *buf)
2051 if (buf->buffer == output_buffer) {
2052 /* Still a chance to output the size */
2053 int value = output_ptr - buf->ptrp + 3;
2054 buf->ptrp[0] = value >> 24;
2055 buf->ptrp[1] = value >> 16;
2056 buf->ptrp[2] = value >> 8;
2057 buf->ptrp[3] = value >> 0;
2062 DEFUN(drop_int,(buf),
2063 struct output_buffer_struct *buf)
2070 case 0x84: ch = THIS(); NEXT();
2071 case 0x83: ch = THIS(); NEXT();
2072 case 0x82: ch = THIS(); NEXT();
2073 case 0x81: ch = THIS(); NEXT();
2078 buf->ptrp = output_ptr;
2079 buf->buffer = output_buffer;
2080 OUT(0);OUT(0);OUT(0);OUT(0);
2083 static void copy_int()
2091 case 0x84: ch = THIS(); NEXT(); OUT(ch);
2092 case 0x83: ch = THIS(); NEXT(); OUT(ch);
2093 case 0x82: ch = THIS(); NEXT(); OUT(ch);
2094 case 0x81: ch = THIS(); NEXT(); OUT(ch);
2100 #define ID copy_id()
2101 #define INT copy_int()
2102 #define EXP copy_expression()
2103 static void copy_till_end();
2104 #define INTn(q) copy_int()
2105 #define EXPn(q) copy_expression()
2106 static void f1_record()
2119 OUT(0xf1); OUT(0xc9);
2120 INT; INT; ch = THIS();
2123 case 0x16: NEXT();break;
2124 case 0x01: NEXT();break;
2125 case 0x00: NEXT(); INT; break;
2126 case 0x03: NEXT(); INT; break;
2127 case 0x13: EXPn(instruction address); break;
2135 OUT(0xf1); OUT(0xd8);
2136 EXP ; EXP; EXP; EXP;
2140 OUT(0xf1);OUT(0xce); INT; INT; ch = THIS(); INT;
2147 EXPn(external function); break;
2150 case 0x07: INTn(line number); INT;
2152 case 0x0a: INTn(locked register); INT; break;
2153 case 0x3f: copy_till_end(); break;
2154 case 0x3e: copy_till_end(); break;
2155 case 0x40: copy_till_end(); break;
2156 case 0x41: ID; break;
2161 static void f0_record()
2163 /* Attribute record */
2169 static void copy_till_end()
2204 static void f2_record()
2216 static void block();
2217 static void f8_record()
2227 /* Unique typedefs for module */
2228 /* GLobal typedefs */
2229 /* High level module scope beginning */
2231 struct output_buffer_struct ob;
2244 /* Global function */
2246 struct output_buffer_struct ob;
2248 OUT(0xf8); OUT(0x04);
2249 drop_int(&ob); ID ; INTn(stack size); INTn(ret val);
2256 EXPn(size of block);
2262 /* File name for source line numbers */
2264 struct output_buffer_struct ob;
2266 OUT(0xf8); OUT(0x05);
2268 ID; INTn(year); INTn(month); INTn(day);
2269 INTn(hour); INTn(monute); INTn(second);
2278 /* Local function */
2279 { struct output_buffer_struct ob;
2280 NEXT(); OUT(0xf8); OUT(0x06);
2282 ID; INTn(stack size); INTn(type return);
2293 /* Assembler module scope beginning -*/
2294 { struct output_buffer_struct ob;
2297 OUT(0xf8); OUT(0x0a);
2299 ID; ID; INT; ID; INT; INT; INT; INT; INT; INT;
2310 struct output_buffer_struct ob;
2312 OUT(0xf8); OUT(0x0b);
2313 drop_int(&ob); ID ; INT; INTn(section index); EXPn(offset); INTn(stuff);
2326 static void e2_record()
2336 static void DEFUN_VOID(block)
2370 moves all the debug information from the source bfd to the output
2371 bfd, and relocates any expressions it finds
2375 DEFUN(relocate_debug,(output, input),
2381 unsigned char input_buffer[IBS];
2383 input_ptr_start = input_ptr = input_buffer;
2384 input_ptr_end = input_buffer + IBS;
2386 bfd_read((PTR)input_ptr_start, 1, IBS, input);
2390 During linking, we we told about the bfds which made up our
2391 contents, we have a list of them. They will still be open, so go to
2392 the debug info in each, and copy it out, relocating it as we go.
2396 DEFUN(ieee_write_debug_part, (abfd),
2399 ieee_data_type *ieee = IEEE_DATA(abfd);
2400 bfd_chain_type *chain = ieee->chain_root;
2401 unsigned char output_buffer[OBS];
2402 boolean some_debug = false;
2403 file_ptr here = bfd_tell(abfd);
2405 output_ptr_start = output_ptr = output_buffer ;
2406 output_ptr_end = output_buffer + OBS;
2407 output_ptr = output_buffer;
2410 if (chain == (bfd_chain_type *)NULL) {
2412 /* There is no debug info, so we'll fake some up */
2413 CONST static char fake[] = {
2414 0xf8, 0xa, 0, 5, 't', 't', 't', 't', 't', 0, 2, 3,
2415 '1','.','1',0x82, 1991>>8, 1991 & 0xff, 9, 20, 11, 07,50 };
2416 ieee->w.r.debug_information_part = 0;
2422 /* bfd_write(fake, 1, sizeof(fake), abfd);*/
2423 /* Now write a header for each section */
2426 asection *s = abfd->sections;
2428 if (s != abfd->abs_section)
2431 ieee_write_byte(abfd, 0xf8);
2432 ieee_write_byte(abfd, 0x0b);
2433 ieee_write_byte(abfd, 0);
2434 ieee_write_byte(abfd, 0);
2435 ieee_write_byte(abfd, 1);
2436 ieee_write_byte(abfd, i + IEEE_SECTION_NUMBER_BASE);
2437 ieee_write_expression(abfd, 0, s, 0, 0, 0);
2438 ieee_write_byte(abfd,0);
2439 ieee_write_byte(abfd, 0xf9);
2440 ieee_write_expression(abfd, s->size, 0, 0, 0, 0);
2447 /* Close the scope */
2448 ieee_write_byte(abfd, 0xf9);
2453 while (chain != (bfd_chain_type *)NULL) {
2454 bfd *entry = chain->this;
2455 ieee_data_type *entry_ieee = IEEE_DATA(entry);
2456 if (entry_ieee->w.r.debug_information_part) {
2457 bfd_seek(entry, entry_ieee->w.r.debug_information_part, SEEK_SET);
2458 relocate_debug(abfd, entry);
2461 chain = chain->next;
2464 ieee->w.r.debug_information_part = here;
2467 ieee->w.r.debug_information_part = 0;
2473 /* write the data in an ieee way */
2475 DEFUN(ieee_write_data_part,(abfd),
2479 ieee_data_type *ieee = IEEE_DATA(abfd);
2480 ieee->w.r.data_part = bfd_tell(abfd);
2481 for (s = abfd->sections; s != (asection *)NULL; s = s->next)
2483 /* Sort the reloc records so we can insert them in the correct
2485 if (s->reloc_count != 0)
2487 do_with_relocs(abfd, s);
2491 do_without_relocs(abfd, s);
2499 DEFUN(init_for_output,(abfd),
2503 for (s = abfd->sections; s != (asection *)NULL; s = s->next) {
2504 if (s->_cooked_size != 0) {
2505 ieee_per_section(s)->data = (bfd_byte *)(bfd_alloc(abfd, s->_cooked_size));
2510 /** exec and core file sections */
2512 /* set section contents is complicated with IEEE since the format is
2513 * not a byte image, but a record stream.
2516 DEFUN(ieee_set_section_contents,(abfd, section, location, offset, count),
2521 bfd_size_type count)
2523 if (ieee_per_section(section)->data == (bfd_byte *)NULL) {
2524 init_for_output(abfd);
2526 (void) memcpy((PTR)(ieee_per_section(section)->data + offset),
2528 (unsigned int)count);
2533 write the external symbols of a file, IEEE considers two sorts of
2534 external symbols, public, and referenced. It uses to internal forms
2535 to index them as well. When we write them out we turn their symbol
2536 values into indexes from the right base.
2539 DEFUN(ieee_write_external_part,(abfd),
2543 ieee_data_type *ieee = IEEE_DATA(abfd);
2545 unsigned int reference_index = IEEE_REFERENCE_BASE;
2546 unsigned int public_index = IEEE_PUBLIC_BASE+2;
2547 file_ptr here = bfd_tell(abfd);
2548 boolean hadone = false;
2549 if (abfd->outsymbols != (asymbol **)NULL) {
2551 for (q = abfd->outsymbols; *q != (asymbol *)NULL; q++) {
2554 if (p->section == &bfd_und_section) {
2555 /* This must be a symbol reference .. */
2556 ieee_write_byte(abfd, ieee_external_reference_enum);
2557 ieee_write_int(abfd, reference_index);
2558 ieee_write_id(abfd, p->name);
2559 p->value = reference_index;
2562 else if(p->section == &bfd_com_section) {
2563 /* This is a weak reference */
2564 ieee_write_byte(abfd, ieee_external_reference_enum);
2565 ieee_write_int(abfd, reference_index);
2566 ieee_write_id(abfd, p->name);
2567 ieee_write_byte(abfd, ieee_weak_external_reference_enum);
2568 ieee_write_int(abfd, reference_index);
2569 ieee_write_int(abfd, p->value);
2570 ieee_write_int(abfd, BFD_FORT_COMM_DEFAULT_VALUE);
2571 p->value = reference_index;
2574 else if(p->flags & BSF_GLOBAL) {
2575 /* This must be a symbol definition */
2578 ieee_write_byte(abfd, ieee_external_symbol_enum);
2579 ieee_write_int(abfd, public_index );
2580 ieee_write_id(abfd, p->name);
2582 ieee_write_twobyte(abfd, ieee_attribute_record_enum);
2583 ieee_write_int(abfd, public_index );
2584 ieee_write_byte(abfd, 15); /* instruction address */
2585 ieee_write_byte(abfd, 19); /* static symbol */
2586 ieee_write_byte(abfd, 1); /* one of them */
2589 /* Write out the value */
2590 ieee_write_2bytes(abfd, ieee_value_record_enum);
2591 ieee_write_int(abfd, public_index);
2592 if (p->section != &bfd_abs_section)
2594 if (abfd->flags & EXEC_P)
2596 /* If fully linked, then output all symbols
2598 ieee_write_int(abfd,
2599 p->value + p->section->output_offset+ p->section->output_section->vma);
2603 ieee_write_expression(abfd,
2604 p->value + p->section->output_offset,
2605 /*!!! p->section->output_section,*/
2606 (asymbol *)NULL, false, 0);
2611 ieee_write_expression(abfd,
2613 /*!!! (asection *)NULL,*/
2614 (asymbol *)NULL, false, 0);
2616 p->value = public_index;
2620 /* This can happen - when there are gaps in the symbols read */
2621 /* from an input ieee file */
2626 ieee->w.r.external_part = here;
2631 CONST static char exten[] =
2634 0xf1, 0xce, 0x20, 0x00, 37, 3, 3, /* Set version 3 rev 3 */
2635 0xf1, 0xce, 0x20, 0x00, 39, 2, /* keep symbol in original case */
2636 0xf1, 0xce, 0x20, 0x00, 38 /* set object type relocateable to x */
2639 CONST static char envi[] =
2643 /* 0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
2646 0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok */
2648 0xf1, 0xce, 0x21, 0, 53, 0x03, /* host unix */
2649 /* 0xf1, 0xce, 0x21, 0, 54, 2,1,1 tool & version # */
2654 DEFUN(ieee_write_me_part,(abfd),
2657 ieee_data_type *ieee= IEEE_DATA(abfd);
2658 ieee->w.r.trailer_part = bfd_tell(abfd);
2659 if (abfd->start_address) {
2660 ieee->w.r.me_record = bfd_tell(abfd);
2661 ieee_write_2bytes(abfd, ieee_value_starting_address_enum);
2662 ieee_write_byte(abfd, ieee_function_either_open_b_enum);
2663 ieee_write_int(abfd, abfd->start_address);
2664 ieee_write_byte(abfd, ieee_function_either_close_b_enum);
2667 ieee->w.r.me_record = bfd_tell(abfd);
2669 ieee_write_byte(abfd, ieee_module_end_enum);
2673 DEFUN(ieee_write_object_contents,(abfd),
2676 ieee_data_type *ieee = IEEE_DATA(abfd);
2679 /* Fast forward over the header area */
2680 bfd_seek(abfd, 0, 0);
2681 ieee_write_byte(abfd, ieee_module_beginning_enum);
2683 ieee_write_id(abfd, bfd_printable_name(abfd));
2684 ieee_write_id(abfd, abfd->filename);
2689 /* Fast forward over the variable bits */
2693 ieee_write_byte(abfd, ieee_address_descriptor_enum);
2696 ieee_write_byte(abfd, bfd_arch_bits_per_byte(abfd));
2697 /* MAU's per address */
2698 ieee_write_byte(abfd, bfd_arch_bits_per_address(abfd) /
2699 bfd_arch_bits_per_byte(abfd));
2702 old = bfd_tell(abfd);
2703 bfd_seek(abfd, 8 * N_W_VARIABLES, 1);
2706 ieee->w.r.extension_record = bfd_tell(abfd);
2707 bfd_write(exten, 1, sizeof(exten), abfd);
2708 if (abfd->flags & EXEC_P)
2709 ieee_write_byte(abfd, 0x1); /* Absolute */
2711 ieee_write_byte(abfd, 0x2); /* Relocateable */
2713 ieee->w.r.environmental_record = bfd_tell(abfd);
2714 bfd_write(envi, 1, sizeof(envi), abfd);
2718 ieee_write_section_part(abfd);
2720 First write the symbols, this changes their values into table
2721 indeces so we cant use it after this point
2723 ieee_write_external_part(abfd);
2724 /* ieee_write_byte(abfd, ieee_record_seperator_enum);*/
2727 /* ieee_write_byte(abfd, ieee_record_seperator_enum);*/
2731 Write any debugs we have been told about
2733 ieee_write_debug_part(abfd);
2736 Can only write the data once the symbols have been written since
2737 the data contains relocation information which points to the
2740 ieee_write_data_part(abfd);
2744 At the end we put the end !
2746 ieee_write_me_part(abfd);
2749 /* Generate the header */
2750 bfd_seek(abfd, old, false);
2752 for (i= 0; i < N_W_VARIABLES; i++) {
2753 ieee_write_2bytes(abfd,ieee_assign_value_to_variable_enum);
2754 ieee_write_byte(abfd, i);
2755 ieee_write_int5_out(abfd, ieee->w.offset[i]);
2763 /* Native-level interface to symbols. */
2765 /* We read the symbols into a buffer, which is discarded when this
2766 function exits. We read the strings into a buffer large enough to
2767 hold them all plus all the cached symbol entries. */
2770 DEFUN(ieee_make_empty_symbol,(abfd),
2774 ieee_symbol_type *new =
2775 (ieee_symbol_type *)zalloc (sizeof (ieee_symbol_type));
2776 new->symbol.the_bfd = abfd;
2777 return &new->symbol;
2782 DEFUN(ieee_openr_next_archived_file,(arch, prev),
2786 ieee_ar_data_type *ar = IEEE_AR_DATA(arch);
2787 /* take the next one from the arch state, or reset */
2788 if (prev == (bfd *)NULL) {
2789 /* Reset the index - the first two entries are bogus*/
2790 ar->element_index = 2;
2793 ieee_ar_obstack_type *p = ar->elements + ar->element_index;
2794 ar->element_index++;
2795 if (ar->element_index <= ar->element_count) {
2796 if (p->file_offset != (file_ptr)0) {
2797 if (p->abfd == (bfd *)NULL) {
2798 p->abfd = _bfd_create_empty_archive_element_shell(arch);
2799 p->abfd->origin = p->file_offset;
2805 bfd_error = no_more_archived_files;
2813 ieee_find_nearest_line(abfd,
2824 char **filename_ptr;
2825 char **functionname_ptr;
2833 ieee_generic_stat_arch_elt(abfd, buf)
2837 ieee_ar_data_type *ar = IEEE_AR_DATA(abfd);
2838 if (ar == (ieee_ar_data_type *)NULL) {
2839 bfd_error = invalid_operation;
2844 buf->st_mode = 0666;
2849 DEFUN(ieee_sizeof_headers,(abfd, x),
2859 DEFUN(ieee_bfd_debug_info_start,(abfd),
2866 DEFUN(ieee_bfd_debug_info_end,(abfd),
2873 /* Add this section to the list of sections we have debug info for, to
2874 be ready to output it at close time
2877 DEFUN(ieee_bfd_debug_info_accumulate,(abfd, section),
2881 ieee_data_type *ieee = IEEE_DATA(section->owner);
2882 ieee_data_type *output_ieee = IEEE_DATA(abfd);
2883 /* can only accumulate data from other ieee bfds */
2884 if (section->owner->xvec != abfd->xvec)
2886 /* Only bother once per bfd */
2887 if (ieee->done_debug == true)
2889 ieee->done_debug = true;
2891 /* Don't bother if there is no debug info */
2892 if (ieee->w.r.debug_information_part == 0)
2898 bfd_chain_type *n = (bfd_chain_type *) bfd_alloc(abfd, sizeof(bfd_chain_type));
2899 n->this = section->owner;
2900 n->next = (bfd_chain_type *)NULL;
2902 if (output_ieee->chain_head) {
2903 output_ieee->chain_head->next = n;
2906 output_ieee->chain_root = n;
2909 output_ieee->chain_head = n;
2919 #define ieee_core_file_failing_command (char *(*)())(bfd_nullvoidptr)
2920 #define ieee_core_file_failing_signal (int (*)())bfd_0
2921 #define ieee_core_file_matches_executable_p ( FOO(boolean, (*),(bfd *, bfd *)))bfd_false
2922 #define ieee_slurp_armap bfd_true
2923 #define ieee_slurp_extended_name_table bfd_true
2924 #define ieee_truncate_arname (void (*)())bfd_nullvoidptr
2925 #define ieee_write_armap (FOO( boolean, (*),(bfd *, unsigned int, struct orl *, unsigned int, int))) bfd_nullvoidptr
2926 #define ieee_get_lineno (struct lineno_cache_entry *(*)())bfd_nullvoidptr
2927 #define ieee_close_and_cleanup bfd_generic_close_and_cleanup
2928 #define ieee_set_arch_mach bfd_default_set_arch_mach
2929 #define ieee_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents
2932 bfd_target ieee_vec =
2935 bfd_target_ieee_flavour,
2936 true, /* target byte order */
2937 true, /* target headers byte order */
2938 (HAS_RELOC | EXEC_P | /* object flags */
2939 HAS_LINENO | HAS_DEBUG |
2940 HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
2941 ( SEC_CODE|SEC_DATA|SEC_ROM|SEC_HAS_CONTENTS
2942 |SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
2943 ' ', /* ar_pad_char */
2944 16, /* ar_max_namelen */
2945 1, /* minimum alignment */
2946 _do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16, /* data */
2947 _do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16, /* hdrs */
2949 { _bfd_dummy_target,
2950 ieee_object_p, /* bfd_check_format */
2957 _bfd_generic_mkarchive,
2962 ieee_write_object_contents,
2963 _bfd_write_archive_contents,