* bfd-in.h (JUMP_TABLE): Added bfd_reloc_type_lookup and
[external/binutils.git] / bfd / ieee.c
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.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
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.
11
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.
16
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.  */
20
21 #define KEEPMINUSPCININST 0
22
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
25    parser.  */
26
27 #include "bfd.h"
28 #include "sysdep.h"
29 #include "libbfd.h"
30 #include "ieee.h"
31 #include "libieee.h"
32
33
34 #include "obstack.h"
35 #define obstack_chunk_alloc bfd_xmalloc
36 #define obstack_chunk_free free
37
38 /* Functions for writing to ieee files in the strange way that the
39    standard requires. */
40
41 static void
42 DEFUN(ieee_write_byte,(abfd, byte),
43       bfd *abfd AND
44       bfd_byte byte)
45 {
46   bfd_write((PTR)&byte, 1, 1, abfd);
47 }
48
49
50 static void
51 DEFUN(ieee_write_twobyte,(abfd, twobyte),
52       bfd *abfd AND
53       int twobyte)
54 {
55   bfd_byte b[2];
56   b[1] = twobyte & 0xff;
57   b[0] = twobyte >> 8;
58   bfd_write((PTR)&b[0], 1, 2, abfd);
59 }
60
61
62
63 static void
64 DEFUN(ieee_write_2bytes,(abfd, bytes),
65       bfd *abfd AND
66       int bytes)
67 {
68   bfd_byte buffer[2];
69   buffer[0] = bytes >> 8;
70   buffer[1] = bytes & 0xff;
71
72   bfd_write((PTR)buffer, 1, 2, abfd);
73 }
74
75 static void
76 DEFUN(ieee_write_int,(abfd, value),
77       bfd *abfd AND
78       bfd_vma value)
79 {
80   if (((unsigned)value) <= 127) {
81     ieee_write_byte(abfd, value);
82   }
83   else {
84     unsigned int length;
85     /* How many significant bytes ? */
86     /* FIXME FOR LONGER INTS */
87     if (value & 0xff000000) {
88       length = 4;
89     }
90     else if (value & 0x00ff0000) {
91       length  = 3;
92     }
93     else if (value & 0x0000ff00) {
94       length = 2;
95     }
96     else length = 1;
97
98     ieee_write_byte(abfd, (int)ieee_number_repeat_start_enum + length);
99     switch (length) {
100     case 4:
101       ieee_write_byte(abfd, value >> 24);
102     case 3:
103       ieee_write_byte(abfd, value >> 16);
104     case 2:
105       ieee_write_byte(abfd, value >> 8);
106     case 1:
107       ieee_write_byte(abfd, value);
108     }
109   }
110 }
111
112 static void
113 DEFUN(ieee_write_id,(abfd, id),
114       bfd *abfd AND
115       CONST char *id)
116 {
117   size_t length = strlen(id);
118   if (length >= 0 && length <= 127) {
119     ieee_write_byte(abfd, length);
120   }
121   else if (length < 255) {
122     ieee_write_byte(abfd, ieee_extension_length_1_enum);
123     ieee_write_byte(abfd, length);
124   }
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);  
129   }
130   else {
131     BFD_FAIL();
132   }
133   bfd_write((PTR)id, 1, length, abfd);
134 }
135 /***************************************************************************
136 Functions for reading from ieee files in the strange way that the
137 standard requires:
138 */
139
140
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++))
144
145
146 static unsigned short 
147 DEFUN(read_2bytes,(ieee),
148    common_header_type *ieee)
149 {
150   unsigned  char c1 = this_byte_and_next(ieee);
151   unsigned  char c2 = this_byte_and_next(ieee);
152   return (c1<<8 ) | c2;
153
154 }
155
156 static void
157 DEFUN(bfd_get_string,(ieee, string, length),
158     common_header_type *ieee AND
159       char *string AND
160       size_t length)
161 {
162   size_t i;
163   for (i= 0; i < length; i++) {
164     string[i] = this_byte_and_next(ieee);
165   }
166 }
167
168 static char *
169 DEFUN(read_id,(ieee),
170   common_header_type *ieee)
171 {
172   size_t length;
173   char *string;
174   length = this_byte_and_next(ieee);
175   if (length >= 0x00 && length <= 0x7f) {
176     /* Simple string of length 0 to 127 */
177   }
178   else if (length == 0xde) {
179     /* Length is next byte, allowing 0..255 */
180     length = this_byte_and_next(ieee);
181   }
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);
186   }
187   /* Buy memory and read string */
188   string = bfd_alloc(ieee->abfd, length+1);
189   bfd_get_string(ieee, string, length);
190   string[length] = 0;
191   return string;
192 }
193
194 static void
195 DEFUN(ieee_write_expression,(abfd, value, symbol, pcrel, index),
196       bfd*abfd AND
197       bfd_vma value AND
198       asymbol *symbol AND
199       boolean pcrel AND
200     unsigned int index)
201 {
202   unsigned int term_count = 0;
203
204   if (value != 0) 
205   {
206     ieee_write_int(abfd, value);
207     term_count++;
208   }
209   
210      
211
212   if (bfd_is_com_section (symbol->section)
213       || symbol->section == &bfd_und_section) 
214   {
215     /* Def of a common symbol */
216     ieee_write_byte(abfd, ieee_variable_X_enum);
217     ieee_write_int(abfd, symbol->value);
218     term_count++;
219   }
220   else  if (symbol->section != &bfd_abs_section) 
221   {
222     /* Ref to defined symbol - */
223   
224     ieee_write_byte(abfd, ieee_variable_R_enum);
225     ieee_write_byte(abfd, symbol->section->index + IEEE_SECTION_NUMBER_BASE);
226     term_count++;
227     if (symbol->flags & BSF_GLOBAL) 
228     {
229       ieee_write_byte(abfd, ieee_variable_I_enum);
230       ieee_write_int(abfd, symbol->value);
231       term_count++;
232     }
233     else if (symbol->flags & ( BSF_LOCAL | BSF_SECTION_SYM))
234     {
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);
241       term_count++;
242
243     }
244     else   {
245         BFD_FAIL();
246       }
247
248   }
249
250  
251   
252   if(pcrel) {
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);
257     }
258
259   if (term_count == 1) 
260   {
261     ieee_write_byte(abfd,0);
262   }
263   else {    
264       while (term_count > 1) {
265           ieee_write_byte(abfd, ieee_function_plus_enum);
266           term_count--;
267         }
268
269     }
270
271 }
272
273
274
275
276
277
278
279
280 /*****************************************************************************/
281
282 /*
283 writes any integer into the buffer supplied and always takes 5 bytes
284 */
285 static void
286 DEFUN(ieee_write_int5,(buffer, value),
287       bfd_byte*buffer AND
288       bfd_vma value )
289 {
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;
295 }
296 static void
297 DEFUN(ieee_write_int5_out, (abfd, value),
298       bfd *abfd AND
299       bfd_vma value)
300 {
301   bfd_byte b[5];
302   ieee_write_int5(b, value);
303   bfd_write((PTR)b,1,5,abfd);
304 }
305
306
307 static boolean 
308 DEFUN(parse_int,(ieee, value_ptr),
309       common_header_type  *ieee AND
310       bfd_vma *value_ptr)
311 {
312   int value = this_byte(ieee);
313   int result;
314   if (value >= 0 && value <= 127) {
315     *value_ptr = value;
316     next_byte(ieee);
317     return true;
318   } 
319   else if (value >= 0x80 && value <= 0x88) {
320     unsigned int count = value & 0xf;
321     result = 0;
322     next_byte(ieee);
323     while (count) {
324       result =(result << 8) | this_byte_and_next(ieee);
325       count--;
326     }
327     *value_ptr = result;
328     return true;
329   } 
330   return false;
331 }
332 static int
333 DEFUN(parse_i,(ieee, ok),
334    common_header_type *ieee AND
335       boolean *ok)
336 {
337   bfd_vma x;
338   *ok = parse_int(ieee, &x);
339   return x;
340 }
341
342 static bfd_vma 
343 DEFUN(must_parse_int,(ieee),
344      common_header_type *ieee)
345 {
346   bfd_vma result;
347   BFD_ASSERT(parse_int(ieee, &result) == true);
348   return result;
349 }
350
351 typedef struct 
352 {
353   bfd_vma value;
354   asection *section;
355   ieee_symbol_index_type symbol;
356 } ieee_value_type;
357
358
359 static 
360 reloc_howto_type abs32_howto 
361  = HOWTO(1,0,2,32,false,0,false,true,0,"abs32",true,0xffffffff, 0xffffffff,false);
362 static
363 reloc_howto_type abs16_howto 
364  = HOWTO(1,0,1,16,false,0,false,true,0,"abs16",true,0x0000ffff, 0x0000ffff,false);
365
366 static
367 reloc_howto_type abs8_howto 
368  = HOWTO(1,0,0,8,false,0,false,true,0,"abs8",true,0x000000ff, 0x000000ff,false);
369
370 static 
371 reloc_howto_type rel32_howto 
372  = HOWTO(1,0,2,32,true,0,false,true,0,"rel32",true,0xffffffff,
373          0xffffffff,false);
374
375 static
376 reloc_howto_type rel16_howto 
377  = HOWTO(1,0,1,16,true,0,false,true,0,"rel16",true,0x0000ffff, 0x0000ffff,false);
378
379 static
380 reloc_howto_type rel8_howto 
381  = HOWTO(1,0,0,8,true,0,false,true,0,"rel8",true,0x000000ff, 0x000000ff,false);
382
383
384 static ieee_symbol_index_type NOSYMBOL = {  0, 0};
385
386
387 static void
388 DEFUN(parse_expression,(ieee, value, symbol, pcrel, extra, section),
389       ieee_data_type *ieee AND
390       bfd_vma *value AND
391       ieee_symbol_index_type *symbol AND
392       boolean *pcrel AND
393       unsigned int *extra AND
394       asection **section)
395
396 {
397 #define POS sp[1]
398 #define TOS sp[0]
399 #define NOS sp[-1]
400 #define INC sp++;
401 #define DEC sp--;
402
403   
404   boolean loop = true;
405   ieee_value_type stack[10];
406
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;
411
412   while (loop) {
413     switch (this_byte(&(ieee->h))) 
414         {
415         case ieee_variable_P_enum:
416           /* P variable, current program counter for section n */
417             {
418               int section_n ;
419               next_byte(&(ieee->h));
420               *pcrel = true;
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);
425               break;
426             }
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);
431           break;
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);
437           break;
438         case ieee_variable_S_enum:
439           /* S variable, size in MAUS of section module */
440           next_byte(&(ieee->h));
441           PUSH(NOSYMBOL,
442                0,
443                ieee->section_table[must_parse_int(&(ieee->h))]->_raw_size);
444           break;
445           case ieee_variable_I_enum:
446         case ieee_variable_X_enum:
447           /* Push the address of external variable n */
448             {
449               ieee_symbol_index_type sy;
450               next_byte(&(ieee->h));
451               sy.index  = (int)(must_parse_int(&(ieee->h))) ;
452               sy.letter = 'X';
453
454               PUSH(sy, &bfd_und_section, 0);
455             }   
456           break;
457         case ieee_function_minus_enum:
458             {
459               bfd_vma value1, value2;
460               asection *section1, *section_dummy;
461               ieee_symbol_index_type sy;
462               next_byte(&(ieee->h));
463
464               POP(sy, section1, value1);
465               POP(sy, section_dummy, value2);
466               PUSH(sy, section1 ? section1 : section_dummy, value1-value2);
467             }
468           break;
469         case ieee_function_plus_enum:
470             {
471               bfd_vma value1, value2;
472               asection *section1;
473               asection *section2;
474               ieee_symbol_index_type sy1;
475               ieee_symbol_index_type sy2;
476               next_byte(&(ieee->h));
477
478               POP(sy1, section1, value1);
479               POP(sy2, section2, value2);
480               PUSH(sy1.letter ? sy1 : sy2, section1!=&bfd_abs_section ? section1: section2, value1+value2);
481             }
482           break;
483         default: 
484             {
485               bfd_vma va;
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)) 
489                   {
490                     PUSH(NOSYMBOL, &bfd_abs_section, va);
491                   }
492               else {
493                 /* 
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
501                   */
502
503                 while (sp != stack+1) {
504                   asection *section1;
505                   ieee_symbol_index_type sy1;
506                   POP(sy1, section1, *extra);
507                 }
508               {
509                 asection *dummy;
510
511                 POP(*symbol, dummy, *value);
512                 if (section) *section = dummy;
513               }
514                 
515                 loop = false;
516               }
517             }
518
519         }
520   }
521 }
522
523
524
525 #define ieee_seek(abfd, offset) \
526   IEEE_DATA(abfd)->h.input_p = IEEE_DATA(abfd)->h.first_byte + offset
527
528 #define ieee_pos(abfd)   IEEE_DATA(abfd)->h.input_p -IEEE_DATA(abfd)->h.first_byte 
529
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, 
534                   ieee,  
535                   last_symbol,
536                   symbol_count,
537                   pptr,
538                   max_index,
539                   this_type
540                   ),
541       bfd *abfd AND
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
547       char this_type
548       )
549 {
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));
555
556     new_symbol->index = new_index;
557     last_index = new_index;
558     ( *symbol_count)++; 
559     ** pptr= new_symbol;
560     *pptr = &new_symbol->next;
561     if (new_index > *max_index) {
562       *max_index = new_index;
563     }
564     last_type = this_type;
565     return new_symbol;
566   }
567   return last_symbol;
568 }
569 static void
570 DEFUN(ieee_slurp_external_symbols,(abfd),
571       bfd *abfd)
572 {
573   ieee_data_type *ieee = IEEE_DATA(abfd);
574   file_ptr offset = ieee->w.r.external_part;
575
576
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;
581   boolean loop = true;
582   last_index = 0xffffff;
583   ieee->symbol_table_full = true;
584
585   ieee_seek(abfd, offset );
586
587   while (loop) {
588     switch (this_byte(&(ieee->h))) {
589     case ieee_nn_record:
590       next_byte(&(ieee->h));
591
592       symbol = get_symbol(abfd, ieee, symbol, &symbol_count,
593                           &prev_symbols_ptr, 
594                           &ieee->external_symbol_max_index,'D');
595
596
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;
601
602       
603       break;
604     case ieee_external_symbol_enum:
605       next_byte(&(ieee->h));
606                                              
607       symbol = get_symbol(abfd, ieee, symbol, &symbol_count,
608                           &prev_symbols_ptr,
609                           &ieee->external_symbol_max_index,'D');
610
611
612       BFD_ASSERT (symbol->index >= ieee->external_symbol_min_index);
613
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;
618       break;
619     case ieee_attribute_record_enum >> 8:
620         {
621           unsigned int symbol_name_index;
622           unsigned int symbol_type_index;
623           unsigned int symbol_attribute_def;
624           bfd_vma value;
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) {
631           case 63:
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);
638             break;
639
640           default:
641             parse_int(&(ieee->h),&value);
642             break;
643           }
644         }
645       break;
646     case ieee_value_record_enum >> 8:
647         {
648           unsigned int symbol_name_index;
649           ieee_symbol_index_type symbol_ignore;
650           boolean pcrel_ignore;
651           unsigned int extra;
652           next_byte(&(ieee->h));
653           next_byte(&(ieee->h));
654
655           symbol_name_index = must_parse_int(&(ieee->h));
656           parse_expression(ieee,
657                            &symbol->symbol.value,
658                            &symbol_ignore, 
659                            &pcrel_ignore, 
660                            &extra,
661                            &symbol->symbol.section);
662
663             symbol->symbol.flags  = BSF_GLOBAL | BSF_EXPORT;
664
665         }
666       break;
667     case ieee_weak_external_reference_enum:
668         { bfd_vma size;
669           bfd_vma value ;
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) {
677             value = 0;
678           }
679           /* This turns into a common */
680           symbol->symbol.section = &bfd_com_section;
681           symbol->symbol.value = size;
682         }
683       break;
684
685     case ieee_external_reference_enum: 
686       next_byte(&(ieee->h));
687
688       symbol = get_symbol(abfd, ieee, symbol, &symbol_count,
689                           &prev_reference_ptr,
690                           &ieee->external_reference_max_index,'X');
691
692
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;
699
700       BFD_ASSERT (symbol->index >= ieee->external_reference_min_index);
701       break;
702
703     default:
704       loop = false;
705     }
706   }
707
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  ;
712   }
713   else  {
714     ieee->external_symbol_count = 0;
715   }
716
717
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;
722   }
723   else {
724     ieee->external_reference_count = 0;
725   }
726
727   abfd->symcount =
728     ieee->external_reference_count +  ieee->external_symbol_count;
729
730   if (symbol_count != abfd->symcount) {
731     /* There are gaps in the table -- */
732     ieee->symbol_table_full = false;
733   }
734
735
736   *prev_symbols_ptr = (ieee_symbol_type *)NULL;
737   *prev_reference_ptr = (ieee_symbol_type *)NULL;
738 }
739
740 static void
741 DEFUN(ieee_slurp_symbol_table,(abfd),
742       bfd *abfd)
743 {
744   if (IEEE_DATA(abfd)->read_symbols == false) {
745     ieee_slurp_external_symbols(abfd);
746     IEEE_DATA(abfd)->read_symbols= true;
747   }
748 }
749
750 unsigned int
751 DEFUN(ieee_get_symtab_upper_bound,(abfd),
752       bfd *abfd)
753 {
754   ieee_slurp_symbol_table (abfd);
755
756   return (abfd->symcount != 0) ? 
757     (abfd->symcount+1) * (sizeof (ieee_symbol_type *)) : 0;
758 }
759
760 /* 
761 Move from our internal lists to the canon table, and insert in
762 symbol index order
763 */
764
765 extern bfd_target ieee_vec;
766 unsigned int
767 DEFUN(ieee_get_symtab,(abfd, location),
768       bfd *abfd AND
769       asymbol **location)
770 {
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};
776
777   if (abfd->symcount) 
778 {
779     ieee_data_type *ieee = IEEE_DATA(abfd);
780     dummy_bfd.xvec= &ieee_vec;
781     ieee_slurp_symbol_table(abfd);
782
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 */
786       unsigned int i;
787       for (i= 0; i < abfd->symcount; i++) {
788         location[i] = &empty_symbol;
789       }
790     }
791
792
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;
796          symp = symp->next) {
797       /* Place into table at correct index locations */
798       location[symp->index + ieee->external_symbol_base_offset] = &symp->symbol;
799
800     }
801
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 ;
805
806     for (symp = IEEE_DATA(abfd)->external_reference;
807          symp != (ieee_symbol_type *)NULL;
808          symp = symp->next) {
809       location[symp->index + ieee->external_reference_base_offset] =
810        &symp->symbol;
811
812     }
813
814
815
816
817   }
818   if (abfd->symcount) {
819    location[abfd->symcount] = (asymbol *)NULL;
820   }
821   return abfd->symcount;
822 }
823 static asection *
824 DEFUN(get_section_entry,(abfd, ieee,index),
825  bfd *abfd AND
826      ieee_data_type *ieee AND
827       unsigned int index)
828 {
829   if (ieee->section_table[index] == (asection *)NULL) {
830     char *tmp = bfd_alloc(abfd,11);
831     asection *section;
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;
838   }
839   return ieee->section_table[index];
840 }
841
842 static void
843 DEFUN(ieee_slurp_sections,(abfd),
844       bfd *abfd)
845 {
846   ieee_data_type *ieee = IEEE_DATA(abfd);
847   file_ptr offset = ieee->w.r.section_part;
848
849   asection *section = (asection *)NULL;
850
851   if (offset != 0) {
852     bfd_byte section_type[3];
853     ieee_seek(abfd, offset);
854     while (true) {
855       switch (this_byte(&(ieee->h))) {
856       case ieee_section_type_enum:
857           {
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);
863
864             section =get_section_entry(abfd, ieee, section_index);
865
866             section_type[0] =  this_byte_and_next(&(ieee->h));
867             switch (section_type[0]) {
868             case 0xC1:
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]) {
873               case 0xD3:
874                 next_byte(&(ieee->h));
875                 section_type[2] = this_byte(&(ieee->h));
876                 switch (section_type[2]) 
877                     {
878                     case 0xD0:
879                       /* Normal code */
880                       next_byte(&(ieee->h));
881                       section->flags |= SEC_LOAD | SEC_CODE;
882                       break;
883                     case 0xC4:
884                       next_byte(&(ieee->h));
885                       section->flags |= SEC_LOAD  | SEC_DATA;
886                       /* Normal data */
887                       break;
888                     case 0xD2:
889                       next_byte(&(ieee->h));
890                       /* Normal rom data */
891                       section->flags |= SEC_LOAD | SEC_ROM | SEC_DATA;
892                       break;
893                     default:
894                       break;
895                     }
896               }
897               break;
898             case 0xC3:
899               section_type[1] = this_byte(&(ieee->h));
900               section->flags = SEC_LOAD | SEC_ALLOC | SEC_HAS_CONTENTS;
901               switch (section_type[1]) {
902               case 0xD0:
903                 /* Normal code */
904                 next_byte(&(ieee->h));
905                 section->flags |= SEC_LOAD | SEC_CODE;
906                 break;
907               case 0xC4:
908                 next_byte(&(ieee->h));
909                 section->flags |= SEC_LOAD  | SEC_DATA;
910                 /* Normal data */
911                 break;
912               case 0xD2:
913                 next_byte(&(ieee->h));
914                 /* Normal rom data */
915                 section->flags |= SEC_LOAD | SEC_ROM | SEC_DATA;
916                 break;
917               default:
918                 break;
919               }
920             }
921             memcpy((char*)section->name, read_id(&(ieee->h)),8);
922             /* Truncate sections to 8 chars */
923             if (strlen(section->name) > 8) 
924             {
925               char *copy = bfd_alloc(abfd, 9);
926               memcpy(copy, section->name, 8);
927               copy[8] = 0;
928               section->name = copy;
929             }
930             
931            {
932              bfd_vma parent, brother, context;
933                 parse_int(&(ieee->h), &parent);
934                 parse_int(&(ieee->h), &brother);
935                 parse_int(&(ieee->h), &context);
936               }
937
938
939           }
940         break;
941       case ieee_section_alignment_enum:
942           { 
943             unsigned int section_index;
944             bfd_vma value;
945             asection *section;
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;
951             }
952             section->alignment_power =
953               bfd_log2(must_parse_int(&ieee->h));
954             (void)parse_int(&(ieee->h), & value);
955           }
956         break;
957       case ieee_e2_first_byte_enum: 
958           {
959             ieee_record_enum_type t = (ieee_record_enum_type)(read_2bytes(&(ieee->h)));
960
961             switch (t) {
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));
965               break;
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));
969               break;
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));
973               break;
974             case ieee_mau_size_enum:
975               must_parse_int(&(ieee->h));
976               must_parse_int(&(ieee->h));
977               break;
978             case ieee_m_value_enum:
979               must_parse_int(&(ieee->h));
980               must_parse_int(&(ieee->h));
981               break;
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));
985               break;
986             case ieee_section_offset_enum:
987               (void) must_parse_int(&(ieee->h));
988               (void) must_parse_int(&(ieee->h));
989               break;
990             default:
991               return;
992             }
993           }
994         break;
995       default:
996         return;
997       }
998     }
999   }
1000 }
1001
1002 /***********************************************************************
1003 *  archive stuff 
1004 */
1005 bfd_target *
1006 DEFUN(ieee_archive_p,(abfd),
1007       bfd *abfd)
1008 {
1009   char *library;
1010   boolean loop;
1011
1012   unsigned int i;
1013 uint8e_type buffer[512];
1014   struct obstack ob;
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);
1020
1021
1022
1023   bfd_read((PTR)buffer, 1, sizeof(buffer), abfd);
1024
1025   ieee->h.first_byte = buffer;
1026   ieee->h.input_p = buffer;
1027
1028   ieee->h.abfd = abfd;
1029
1030   if (this_byte(&(ieee->h)) != Module_Beginning) {
1031     abfd->tdata.ieee_ar_data = save;
1032       return (bfd_target*)NULL;
1033     }
1034   
1035
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;
1042   }
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
1046      things */
1047
1048   obstack_begin(&ob, 128);
1049
1050
1051   ieee->element_count = 0;
1052   ieee->element_index = 0;
1053
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));
1057
1058   loop = true;
1059   /* Read the index of the BB table */
1060   while (loop) {
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++;
1068
1069       obstack_grow(&ob, (PTR)&t, sizeof(t));
1070
1071       /* Make sure that we don't go over the end of the buffer */
1072
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;
1080       }
1081     }
1082     else loop = false;
1083   }
1084
1085   ieee->elements = (ieee_ar_obstack_type *)obstack_finish(&ob);
1086
1087   /* Now scan the area again, and replace BB offsets with file */
1088   /* offsets */
1089
1090
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;
1096     
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;
1103     }
1104     else {
1105       ieee->elements[i].file_offset = must_parse_int(&(ieee->h));
1106     }
1107   }
1108
1109 /*  abfd->has_armap = ;*/
1110   return abfd->xvec;
1111
1112 }
1113
1114 static boolean
1115 DEFUN(ieee_mkobject,(abfd),
1116       bfd *abfd)
1117
1118 abfd->tdata.ieee_data = (ieee_data_type *)bfd_zalloc(abfd,sizeof(ieee_data_type));
1119   
1120
1121   return true;
1122 }
1123
1124 bfd_target *
1125 DEFUN(ieee_object_p,(abfd),
1126       bfd *abfd)
1127 {
1128   char *processor;
1129   unsigned int part;
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);
1135   
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);
1140
1141   ieee->h.input_p = buffer;
1142   if (this_byte_and_next(&(ieee->h)) != Module_Beginning) goto fail;
1143
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));
1153
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;
1159   }
1160   /* Determine the architecture and machine type of the object file.
1161      */
1162     {
1163       bfd_arch_info_type *arch = bfd_scan_arch(processor);
1164       if (arch == 0) goto fail;
1165       abfd->arch_info = arch;
1166     }
1167
1168   if (this_byte(&(ieee->h)) != (int)ieee_address_descriptor_enum) {
1169     goto fail;
1170   }
1171   next_byte(&(ieee->h));        
1172
1173   if (parse_int(&(ieee->h), &ieee->ad.number_of_bits_mau) == false) {
1174     goto fail;
1175   }
1176   if(parse_int(&(ieee->h), &ieee->ad.number_of_maus_in_address) == false) {
1177     goto fail;
1178   }
1179
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));
1184
1185
1186   for (part = 0; part < N_W_VARIABLES; part++) {
1187     boolean ok;
1188     if (read_2bytes(&(ieee->h)) != (int) ieee_assign_value_to_variable_enum) {
1189       goto fail;
1190     }
1191     if (this_byte_and_next(&(ieee->h)) != part)  {
1192       goto fail;
1193     }
1194
1195     ieee->w.offset[part] = parse_i(&(ieee->h), &ok);
1196     if (ok==false) {
1197       goto fail;
1198     }
1199
1200   }
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
1205    record */
1206
1207   IEEE_DATA(abfd)->h.first_byte = (uint8e_type *) bfd_alloc(ieee->h.abfd, ieee->w.r.me_record
1208                                             + 50);
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);
1211
1212   ieee_slurp_sections(abfd);
1213   return abfd->xvec;
1214  fail:
1215   (void)  bfd_release(abfd, ieee);
1216 abfd->tdata.ieee_data = save;
1217   return (bfd_target *)NULL;
1218 }
1219
1220
1221 void 
1222 DEFUN(ieee_print_symbol,(ignore_abfd, afile,  symbol, how),
1223       bfd *ignore_abfd AND
1224       PTR afile AND
1225       asymbol *symbol AND
1226       bfd_print_symbol_type how)
1227 {
1228   FILE *file = (FILE *)afile;
1229
1230   switch (how) {
1231   case bfd_print_symbol_name:
1232     fprintf(file,"%s", symbol->name);
1233     break;
1234   case bfd_print_symbol_more:
1235 #if 0
1236     fprintf(file,"%4x %2x",aout_symbol(symbol)->desc & 0xffff,
1237             aout_symbol(symbol)->other  & 0xff);
1238 #endif
1239     BFD_FAIL();
1240     break;
1241   case bfd_print_symbol_nm:
1242   case bfd_print_symbol_all:
1243       {
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 ");
1248         }
1249         else {
1250           bfd_print_symbol_vandf((PTR)file,symbol);
1251
1252           fprintf(file," %-5s %04x %02x %s",
1253                   section_name,
1254                   (unsigned)          ieee_symbol(symbol)->index,
1255                   (unsigned)          0, /*
1256                                            aout_symbol(symbol)->desc & 0xffff,
1257                                            aout_symbol(symbol)->other  & 0xff,*/
1258                   symbol->name);
1259         }
1260       }
1261     break;
1262   }
1263 }
1264
1265
1266 static void
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
1271       asection *s)
1272 {
1273   switch (this_byte(&(ieee->h)))  
1274       {
1275       case ieee_load_constant_bytes_enum:
1276           {
1277             unsigned int number_of_maus;
1278             unsigned int i;
1279             next_byte(&(ieee->h));
1280             number_of_maus = must_parse_int(&(ieee->h));
1281
1282             for (i = 0; i < number_of_maus; i++) {
1283               location_ptr[current_map->pc++]= this_byte(&(ieee->h));
1284               next_byte(&(ieee->h));
1285             }
1286           }
1287         break;
1288
1289       case ieee_load_with_relocation_enum:
1290           {
1291             boolean loop = true;
1292             next_byte(&(ieee->h));
1293             while (loop) 
1294                 {
1295                   switch (this_byte(&(ieee->h))) 
1296                       {
1297                       case ieee_variable_R_enum:
1298
1299                       case ieee_function_signed_open_b_enum:
1300                       case ieee_function_unsigned_open_b_enum:
1301                       case ieee_function_either_open_b_enum:
1302                           {
1303                             unsigned int extra = 4;
1304                             boolean pcrel = false;
1305 asection *section;
1306                             ieee_reloc_type *r = 
1307                               (ieee_reloc_type *) bfd_alloc(ieee->h.abfd,
1308                                                             sizeof(ieee_reloc_type));
1309
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));
1314 /*                          abort();*/
1315                             r->relent.sym_ptr_ptr = 0;
1316                             parse_expression(ieee,
1317                                              &r->relent.addend,
1318                                              &r->symbol,
1319                                              &pcrel, &extra, &section);
1320                             r->relent.address = current_map->pc;
1321                             s->reloc_count++;
1322 if (r->relent.sym_ptr_ptr == 0) {
1323                              r->relent.sym_ptr_ptr = section->symbol_ptr_ptr;
1324 }                           
1325
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));
1330                             };
1331                    
1332                             switch (this_byte(&(ieee->h))) {
1333                             case ieee_function_signed_close_b_enum:
1334                               next_byte(&(ieee->h));
1335                               break;
1336                             case ieee_function_unsigned_close_b_enum:
1337                               next_byte(&(ieee->h));
1338                               break;
1339                             case ieee_function_either_close_b_enum:
1340                               next_byte(&(ieee->h));
1341                               break;
1342                             default:
1343                               break;
1344                             }
1345                             /* Build a relocation entry for this type */
1346                             /* If pc rel then stick -ve pc into instruction
1347                                and take out of reloc ..
1348
1349                                I've changed this. It's all too
1350                                complicated. I keep 0 in the
1351                                instruction  now.
1352                                */
1353                     
1354                             switch (extra) 
1355                                 {
1356                                 case 0:
1357                                 case 4:
1358                                   
1359                                   if (pcrel == true) 
1360                                       {
1361 #if KEEPMINUSPCININST
1362                                         bfd_put_32(ieee->h.abfd, -current_map->pc, location_ptr +
1363                                                     current_map->pc);
1364                                         r->relent.howto = &rel32_howto;
1365                                         r->relent.addend -=
1366                                           current_map->pc;
1367 #else
1368                                         bfd_put_32(ieee->h.abfd,0, location_ptr +
1369                                                     current_map->pc);
1370                                         r->relent.howto = &rel32_howto;
1371 #endif
1372                                       }
1373                                   else 
1374                                       {
1375                                         bfd_put_32(ieee->h.abfd, 0, location_ptr +
1376                                                     current_map->pc);
1377                                         r->relent.howto = &abs32_howto;
1378                                       }
1379                                   current_map->pc +=4;
1380                                   break;
1381                                 case 2:
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;
1387 #else
1388
1389                                     bfd_put_16(ieee->h.abfd, 0,  location_ptr +current_map->pc);
1390                                     r->relent.howto = &rel16_howto;
1391 #endif
1392                                   }
1393
1394                                   else {
1395                                     bfd_put_16(ieee->h.abfd, 0,  location_ptr +current_map->pc);
1396                                     r->relent.howto = &abs16_howto;
1397                                   }
1398                                   current_map->pc +=2;
1399                                   break;
1400                                 case 1:
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;
1406 #else
1407                                     bfd_put_8(ieee->h.abfd,0,  location_ptr +current_map->pc);
1408                                     r->relent.howto = &rel8_howto;
1409 #endif
1410                                   }
1411                                   else {
1412                                     bfd_put_8(ieee->h.abfd, 0,  location_ptr +current_map->pc);
1413                                     r->relent.howto = &abs8_howto;
1414                                   }
1415                                   current_map->pc +=1;
1416                                   break;
1417
1418                                 default:
1419                                   BFD_FAIL();
1420                                   break;
1421                                 }
1422                           }
1423                         break;
1424                       default: 
1425                           {
1426                             bfd_vma this_size ;
1427                             if (parse_int(&(ieee->h), &this_size) == true) {
1428                               unsigned int i;
1429                               for (i = 0; i < this_size; i++) {
1430                                 location_ptr[current_map->pc ++] = this_byte(&(ieee->h));
1431                                 next_byte(&(ieee->h));
1432                               }
1433                             }
1434                             else {
1435                               loop = false;
1436                             }
1437                           }
1438                       }
1439                 }
1440           }
1441       }
1442 }
1443
1444 /* Read in all the section data and relocation stuff too */
1445 static boolean 
1446 DEFUN(ieee_slurp_section_data,(abfd),
1447       bfd *abfd)
1448 {
1449   bfd_byte *location_ptr = (bfd_byte *)NULL;
1450   ieee_data_type *ieee = IEEE_DATA(abfd);
1451   unsigned int section_number ;
1452
1453   ieee_per_section_type *current_map = (ieee_per_section_type *)NULL;
1454   asection *s;
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);
1459
1460   /* Allocate enough space for all the section contents */
1461
1462
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);
1466     /*SUPPRESS 68*/
1467     per->reloc_tail_ptr =
1468       (ieee_reloc_type **)&(s->relocation);
1469   }
1470
1471
1472
1473   while (true) {
1474     switch (this_byte(&(ieee->h))) 
1475         {
1476           /* IF we see anything strange then quit */
1477         default:
1478           return true;
1479
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 */
1488           /* to. SO .. */
1489           current_map->pc =s->vma;
1490           break;
1491
1492
1493         case ieee_e2_first_byte_enum:
1494           next_byte(&(ieee->h));
1495           switch (this_byte(&(ieee->h)))
1496               {
1497               case ieee_set_current_pc_enum & 0xff:
1498                   {
1499                     bfd_vma value;
1500                     asection *dsection;
1501                     ieee_symbol_index_type symbol;
1502                     unsigned int extra;
1503                     boolean pcrel;
1504                     next_byte(&(ieee->h));
1505                     must_parse_int(&(ieee->h)); /* Thow away section #*/
1506                     parse_expression(ieee, &value,
1507                                      &symbol,
1508                                      &pcrel, &extra,
1509                                      0);
1510                     current_map->pc = value;
1511                     BFD_ASSERT((unsigned)(value - s->vma) <= s->_raw_size);
1512                   }
1513                 break;
1514
1515               case ieee_value_starting_address_enum & 0xff:
1516                 /* We've got to the end of the data now - */
1517                 return true;
1518               default:
1519                 BFD_FAIL();
1520                 return true;
1521               }
1522           break;
1523         case ieee_repeat_data_enum:
1524             {
1525               /* Repeat the following LD or LR n times - we do this by
1526                  remembering the stream pointer before running it and
1527                  resetting it and running it n times. We special case
1528                  the repetition of a repeat_data/load_constant
1529                  */
1530
1531               unsigned int iterations ;
1532               uint8e_type *start ;
1533               next_byte(&(ieee->h));
1534               iterations = must_parse_int(&(ieee->h));
1535               start =  ieee->h.input_p;
1536               if (start[0] == (int)ieee_load_constant_bytes_enum &&
1537                   start[1] == 1) {
1538                 while (iterations != 0) {
1539                   location_ptr[current_map->pc++] = start[2];
1540                   iterations--;
1541                 }
1542                 next_byte(&(ieee->h));
1543                 next_byte(&(ieee->h));
1544                 next_byte(&(ieee->h));
1545               }
1546               else {
1547                 while (iterations != 0) {
1548                   ieee->h.input_p = start;
1549                   do_one(ieee, current_map, location_ptr,s);
1550                   iterations --;
1551                 }
1552               }
1553             }
1554           break;
1555         case ieee_load_constant_bytes_enum:
1556         case ieee_load_with_relocation_enum:
1557             {
1558               do_one(ieee, current_map, location_ptr,s);
1559             }
1560         }
1561   }
1562 }
1563
1564
1565
1566
1567
1568 boolean
1569 DEFUN(ieee_new_section_hook,(abfd, newsect),
1570       bfd *abfd AND
1571       asection *newsect)
1572 {
1573   newsect->used_by_bfd = (PTR)
1574     bfd_alloc(abfd, sizeof(ieee_per_section_type));
1575   ieee_per_section( newsect)->data = (bfd_byte *)NULL;
1576   ieee_per_section(newsect)->section = newsect;
1577   return true;
1578 }
1579
1580
1581 unsigned int
1582 DEFUN(ieee_get_reloc_upper_bound,(abfd, asect),
1583       bfd *abfd AND
1584       sec_ptr asect)
1585 {
1586   ieee_slurp_section_data(abfd);
1587   return (asect->reloc_count+1) * sizeof(arelent *);
1588 }
1589
1590 static boolean
1591 DEFUN(ieee_get_section_contents,(abfd, section, location, offset, count),
1592       bfd *abfd AND
1593       sec_ptr section AND
1594       PTR location AND
1595       file_ptr offset AND
1596       bfd_size_type count)
1597 {
1598   ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;
1599   ieee_slurp_section_data(abfd);
1600   (void)  memcpy((PTR)location, (PTR)(p->data + offset), (unsigned)count);
1601   return true;
1602 }
1603
1604
1605 unsigned int
1606 DEFUN(ieee_canonicalize_reloc,(abfd, section, relptr, symbols),
1607       bfd *abfd AND
1608       sec_ptr section AND
1609       arelent **relptr AND
1610       asymbol **symbols)
1611 {
1612 /*  ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;*/
1613   ieee_reloc_type *src = (ieee_reloc_type *)(section->relocation);
1614   ieee_data_type *ieee = IEEE_DATA(abfd);
1615
1616   while (src != (ieee_reloc_type *)NULL) {
1617     /* Work out which symbol to attach it this reloc to */
1618     switch (src->symbol.letter) {
1619     case 'X':
1620       src->relent.sym_ptr_ptr =
1621         symbols + src->symbol.index +  ieee->external_reference_base_offset;
1622       break;
1623     case 0:
1624       src->relent.sym_ptr_ptr = 
1625        src->relent.sym_ptr_ptr[0]->section->symbol_ptr_ptr;
1626       break;
1627     default:
1628
1629       BFD_FAIL();
1630     }
1631     *relptr++ = &src->relent;
1632     src = src->next;
1633   }
1634   *relptr = (arelent *)NULL;
1635   return section->reloc_count;
1636 }
1637
1638
1639
1640 static int 
1641 DEFUN(comp,(ap, bp),
1642      CONST PTR ap AND
1643      CONST PTR bp)
1644 {
1645   arelent *a = *((arelent **)ap);
1646   arelent *b = *((arelent **)bp);
1647   return a->address - b->address;
1648 }
1649
1650 /*
1651 Write the section headers
1652 */
1653
1654 static void
1655 DEFUN(ieee_write_section_part,(abfd),
1656       bfd *abfd)
1657 {
1658   ieee_data_type *ieee = IEEE_DATA(abfd);
1659   asection *s;
1660   ieee->w.r.section_part = bfd_tell(abfd);
1661   for (s = abfd->sections; s != (asection *)NULL; s=s->next) {
1662       if (s != &bfd_abs_section) 
1663       {
1664         
1665         ieee_write_byte(abfd, ieee_section_type_enum);
1666         ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1667
1668         if (abfd->flags & EXEC_P) 
1669         {
1670           /* This image is executable, so output absolute sections */
1671           ieee_write_byte(abfd, ieee_variable_A_enum);
1672           ieee_write_byte(abfd, ieee_variable_S_enum);
1673         }
1674         else  
1675         {
1676           ieee_write_byte(abfd, ieee_variable_C_enum);
1677         }
1678
1679         switch (s->flags &(SEC_CODE | SEC_DATA | SEC_ROM)) 
1680         {
1681         case SEC_CODE | SEC_LOAD:
1682         case SEC_CODE:
1683           ieee_write_byte(abfd, ieee_variable_P_enum);
1684           break;
1685         case SEC_DATA:
1686         default:
1687           ieee_write_byte(abfd, ieee_variable_D_enum);
1688           break;
1689         case SEC_ROM:
1690         case SEC_ROM | SEC_DATA:
1691         case SEC_ROM | SEC_LOAD:
1692         case SEC_ROM | SEC_DATA | SEC_LOAD:
1693
1694           ieee_write_byte(abfd, ieee_variable_R_enum);
1695         }
1696
1697
1698         ieee_write_id(abfd, s->name);
1699 #if 0
1700         ieee_write_int(abfd, 0); /* Parent */
1701         ieee_write_int(abfd, 0); /* Brother */
1702         ieee_write_int(abfd, 0); /* Context */
1703 #endif
1704         /* Alignment */
1705         ieee_write_byte(abfd, ieee_section_alignment_enum);
1706         ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1707         ieee_write_int(abfd, 1 << s->alignment_power);
1708
1709         /* Size */
1710         ieee_write_2bytes(abfd, ieee_section_size_enum);
1711         ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1712         ieee_write_int(abfd, s->_raw_size);
1713         if (abfd->flags & EXEC_P) {
1714             /* Relocateable sections don't have asl records */
1715             /* Vma */
1716             ieee_write_2bytes(abfd, ieee_section_base_address_enum);
1717             ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1718             ieee_write_int(abfd, s->vma);
1719           }
1720       }
1721       
1722     }
1723 }
1724
1725
1726
1727 static void 
1728 DEFUN(do_with_relocs,(abfd, s),
1729       bfd *abfd AND
1730       asection *s)
1731 {
1732   unsigned int relocs_to_go = s->reloc_count;
1733
1734
1735   bfd_byte *stream = ieee_per_section(s)->data;
1736   arelent **p = s->orelocation;
1737
1738   bfd_size_type current_byte_index = 0;
1739
1740   qsort(s->orelocation,
1741         relocs_to_go,
1742         sizeof(arelent **),
1743         comp);
1744
1745   /* Output the section preheader */
1746   ieee_write_byte(abfd, ieee_set_current_section_enum);
1747   ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1748
1749   ieee_write_twobyte(abfd, ieee_set_current_pc_enum);
1750   ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1751   ieee_write_expression(abfd, 0, s->symbol, 0, 0);
1752
1753   if (relocs_to_go == 0) 
1754       {
1755         /* If there arn't any relocations then output the load constant byte
1756            opcode rather than the load with relocation opcode */
1757
1758         while (current_byte_index < s->_raw_size) {
1759           bfd_size_type run;
1760           unsigned int MAXRUN  = 32;
1761           run = MAXRUN;
1762           if (run > s->_raw_size - current_byte_index) {
1763             run = s->_raw_size - current_byte_index;
1764           }
1765
1766           if (run != 0) {
1767             ieee_write_byte(abfd, ieee_load_constant_bytes_enum);
1768             /* Output a stream of bytes */
1769             ieee_write_int(abfd, run);
1770             bfd_write((PTR)(stream + current_byte_index), 
1771                       1,
1772                       run,
1773                       abfd);
1774             current_byte_index += run;
1775           }
1776         }
1777       }
1778   else 
1779       {
1780         ieee_write_byte(abfd, ieee_load_with_relocation_enum);
1781
1782
1783         /* Output the data stream as the longest sequence of bytes
1784            possible, allowing for the a reasonable packet size and
1785            relocation stuffs */
1786
1787         if ((PTR)stream == (PTR)NULL) {
1788           /* Outputting a section without data, fill it up */
1789           stream = (uint8e_type *)(bfd_alloc(abfd, s->_raw_size));
1790           memset((PTR)stream, 0, s->_raw_size);
1791         }
1792         while (current_byte_index < s->_raw_size) {
1793           bfd_size_type run;
1794           unsigned int MAXRUN = 32;
1795           if (relocs_to_go) {
1796             run = (*p)->address - current_byte_index;
1797           }
1798           else {
1799             run = MAXRUN;
1800           }
1801           if (run > s->_raw_size - current_byte_index) {
1802             run = s->_raw_size - current_byte_index;
1803           }
1804
1805           if (run != 0) {
1806             /* Output a stream of bytes */
1807             ieee_write_int(abfd, run);
1808             bfd_write((PTR)(stream + current_byte_index), 
1809                       1,
1810                       run,
1811                       abfd);
1812             current_byte_index += run;
1813           }
1814           /* Output any relocations here */
1815           if (relocs_to_go && (*p) && (*p)->address == current_byte_index) {
1816             while (relocs_to_go && (*p) && (*p)->address == current_byte_index) {
1817
1818               arelent *r = *p;
1819               bfd_vma ov;
1820
1821 #if 0
1822               if (r->howto->pc_relative) {
1823                 r->addend += current_byte_index ;
1824               }
1825 #endif
1826
1827               switch (r->howto->size) {
1828               case 2:
1829
1830                 ov = bfd_get_32(abfd,
1831                                 stream+current_byte_index);
1832                 current_byte_index +=4;
1833                 break;
1834               case 1:
1835                 ov = bfd_get_16(abfd,
1836                                 stream+current_byte_index);
1837                 current_byte_index +=2;
1838                 break;
1839               case 0:
1840                 ov = bfd_get_8(abfd,
1841                                stream+current_byte_index);
1842                 current_byte_index ++;
1843                 break;
1844               default:
1845                 ov = 0;
1846                 BFD_FAIL();
1847               }
1848               ieee_write_byte(abfd, ieee_function_either_open_b_enum);
1849 /*            abort();*/
1850             
1851               if (r->sym_ptr_ptr != (asymbol **)NULL) {
1852                 ieee_write_expression(abfd, r->addend + ov,
1853                                       *(r->sym_ptr_ptr),
1854                                       r->howto->pc_relative, s->index);
1855               }
1856               else {
1857                 ieee_write_expression(abfd, r->addend + ov,
1858                                       (asymbol *)NULL,
1859                                       r->howto->pc_relative, s->index);
1860               }
1861
1862               if (1 || r->howto->size != 2) {
1863                 ieee_write_byte(abfd, ieee_comma);
1864                 ieee_write_int(abfd, 1<< r->howto->size);
1865               }
1866               ieee_write_byte(abfd,
1867                               ieee_function_either_close_b_enum);
1868
1869               relocs_to_go --;
1870               p++;
1871             }
1872
1873           }
1874         }
1875       }
1876 }
1877
1878 /* If there are no relocations in the output section then we can
1879 be clever about how we write. We block items up into a max of 127
1880 bytes */
1881
1882 static void 
1883 DEFUN(do_as_repeat, (abfd, s),
1884       bfd *abfd AND
1885       asection *s)
1886 {
1887   if (s->_raw_size) {
1888     ieee_write_byte(abfd, ieee_set_current_section_enum);
1889     ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1890     ieee_write_byte(abfd, ieee_set_current_pc_enum >> 8);
1891     ieee_write_byte(abfd, ieee_set_current_pc_enum  & 0xff);
1892     ieee_write_byte(abfd, s->index + IEEE_SECTION_NUMBER_BASE);
1893     ieee_write_int(abfd,  s->vma );
1894
1895     ieee_write_byte(abfd,ieee_repeat_data_enum);
1896     ieee_write_int(abfd, s->_raw_size);
1897     ieee_write_byte(abfd, ieee_load_constant_bytes_enum);
1898     ieee_write_byte(abfd, 1);
1899     ieee_write_byte(abfd, 0);
1900   }
1901 }
1902
1903 static void 
1904 DEFUN(do_without_relocs, (abfd, s),
1905       bfd *abfd AND
1906       asection *s)
1907 {
1908   bfd_byte *stream = ieee_per_section(s)->data;
1909
1910   if (stream == 0 || ((s->flags & SEC_LOAD) == 0)) 
1911       {
1912         do_as_repeat(abfd, s);
1913       }
1914   else 
1915       {
1916         unsigned int i;
1917         for (i = 0; i < s->_raw_size; i++) {
1918           if (stream[i] != 0) {
1919             do_with_relocs(abfd, s);
1920             return;
1921           }
1922         }
1923         do_as_repeat(abfd, s);
1924       }
1925   
1926 }
1927
1928
1929 static unsigned char *output_ptr_start;
1930 static unsigned char *output_ptr;
1931 static unsigned char *output_ptr_end;
1932 static unsigned char *input_ptr_start;
1933 static unsigned char *input_ptr;
1934 static unsigned char *input_ptr_end;
1935 static bfd *input_bfd;
1936 static bfd *output_bfd;
1937 static int output_buffer;
1938
1939 static void fill()
1940 {
1941   bfd_read((PTR)input_ptr_start, 1, input_ptr_end - input_ptr_start, input_bfd);
1942   input_ptr = input_ptr_start;
1943 }
1944 static void flush()
1945 {
1946   bfd_write((PTR)(output_ptr_start),1,output_ptr - output_ptr_start, output_bfd);
1947   output_ptr = output_ptr_start;
1948   output_buffer++;
1949 }
1950
1951 #define THIS() ( *input_ptr )
1952 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill(); }
1953 #define OUT(x) { *output_ptr++ = (x); if(output_ptr == output_ptr_end)  flush(); }
1954
1955 static void write_int(value)
1956 int value;
1957 {
1958   if (value >= 0 && value <= 127) {
1959     OUT(value);
1960   }
1961   else {
1962     unsigned int length;
1963     /* How many significant bytes ? */
1964     /* FIXME FOR LONGER INTS */
1965     if (value & 0xff000000) {
1966       length = 4;
1967     }
1968     else if (value & 0x00ff0000) {
1969       length  = 3;
1970     }
1971     else if (value & 0x0000ff00) {
1972       length = 2;
1973     }
1974     else length = 1;
1975
1976     OUT((int)ieee_number_repeat_start_enum + length);
1977     switch (length) {
1978     case 4:
1979       OUT( value >> 24);
1980     case 3:
1981       OUT( value >> 16);
1982     case 2:
1983       OUT( value >> 8);
1984     case 1:
1985       OUT( value);
1986     }
1987
1988   }
1989 }
1990 static void copy_id() 
1991 {
1992   int length  = THIS();
1993   char ch;
1994   OUT(length);
1995   NEXT();
1996   while (length--) {
1997     ch = THIS();
1998     OUT(ch);
1999     NEXT();
2000   }
2001 }
2002 #define VAR(x) ((x | 0x80))
2003 static void copy_expression()
2004 {
2005   int stack[10];
2006   int *tos = stack;
2007   int value = 0;
2008   while (1) {
2009     switch (THIS()) {
2010     case 0x84:
2011       NEXT();
2012       value =  THIS(); NEXT();
2013       value = (value << 8) | THIS(); NEXT();
2014       value = (value << 8) | THIS(); NEXT();
2015       value = (value << 8) | THIS(); NEXT();
2016       *tos ++ = value;
2017       break;
2018     case 0x83:
2019       NEXT();
2020       value =  THIS(); NEXT();
2021       value = (value << 8) | THIS(); NEXT();
2022       value = (value << 8) | THIS(); NEXT();
2023       *tos ++ = value;
2024       break;
2025     case 0x82:  
2026       NEXT();
2027       value =  THIS(); NEXT();
2028       value = (value << 8) | THIS(); NEXT();
2029       *tos ++ = value;
2030       break;
2031     case 0x81:
2032       NEXT();
2033       value =  THIS(); NEXT();
2034       *tos ++ = value;
2035       break;
2036       case 0x80:
2037       NEXT();
2038       *tos ++ = 0;
2039       break;
2040     default:
2041       if (THIS() >0x84) {
2042         /* Not a number, just bug out with the answer */
2043         write_int(*(--tos));
2044         return;
2045       }
2046       *tos++ = THIS();
2047 NEXT();
2048       value = 0;
2049       break;
2050     case 0xa5:
2051       /* PLUS anything */
2052         {
2053           int value = *(--tos);
2054           value += *(--tos);
2055           *tos++ = value;
2056           NEXT();
2057         }
2058       break;
2059     case VAR('R') :
2060         {
2061           int section_number ;
2062           ieee_data_type *ieee;
2063           asection *s;
2064           NEXT();
2065           section_number = THIS();
2066         
2067           NEXT();
2068           ieee= IEEE_DATA(input_bfd);
2069           s =   ieee->section_table[section_number];
2070           if (s->output_section) {
2071             value = s->output_section->vma ;
2072           } else { value = 0; }
2073           value += s->output_offset;
2074           *tos++ = value;
2075           value = 0;
2076         }
2077       break;
2078     case 0x90:
2079         {       
2080           NEXT();
2081           write_int(*(--tos));
2082           OUT(0x90);
2083           return;
2084
2085         }
2086     }
2087   }
2088
2089 }
2090
2091 /* Drop the int in the buffer, and copy a null into the gap, which we
2092    will overwrite later */
2093
2094 struct output_buffer_struct {
2095 unsigned  char *ptrp;
2096   int buffer;
2097 } ;
2098
2099 static void
2100 DEFUN(fill_int,(buf),
2101       struct output_buffer_struct *buf)
2102 {
2103   if (buf->buffer == output_buffer) {
2104     /* Still a chance to output the size */
2105     int value = output_ptr - buf->ptrp + 3;
2106     buf->ptrp[0] =  value >> 24;
2107     buf->ptrp[1] =  value >> 16;
2108     buf->ptrp[2] =  value >> 8;
2109     buf->ptrp[3] =  value >> 0;
2110   }
2111
2112 }
2113 static void
2114 DEFUN(drop_int,(buf),
2115       struct output_buffer_struct *buf)
2116 {
2117   int type = THIS();
2118   int ch;
2119   if (type <= 0x84) {
2120     NEXT();
2121     switch(type) {
2122     case 0x84: ch = THIS(); NEXT();
2123     case 0x83: ch = THIS(); NEXT();
2124     case 0x82: ch = THIS(); NEXT();
2125     case 0x81: ch = THIS(); NEXT();
2126     case 0x80: break;
2127     }
2128   }
2129   OUT(0x84);
2130   buf->ptrp = output_ptr;
2131   buf->buffer  = output_buffer;
2132   OUT(0);OUT(0);OUT(0);OUT(0);
2133 }
2134
2135 static void copy_int()
2136 {
2137   int type = THIS();
2138   int ch;
2139   if (type <= 0x84) {
2140     OUT(type);
2141     NEXT();
2142     switch(type) {
2143     case 0x84: ch = THIS(); NEXT(); OUT(ch);
2144     case 0x83: ch = THIS(); NEXT(); OUT(ch);
2145     case 0x82: ch = THIS(); NEXT(); OUT(ch);
2146     case 0x81: ch = THIS(); NEXT(); OUT(ch);
2147     case 0x80: break;
2148     }
2149   }
2150 }
2151
2152 #define ID copy_id()
2153 #define INT copy_int()
2154 #define EXP copy_expression()
2155 static void copy_till_end();
2156 #define INTn(q) copy_int()
2157 #define EXPn(q) copy_expression()
2158 static void f1_record()
2159 {
2160   int ch;
2161   /* ATN record */
2162   NEXT();
2163   ch = THIS();
2164   switch (ch)
2165       {
2166       default:
2167         OUT(0xf1); OUT(ch);
2168         break;
2169       case 0xc9:
2170         NEXT();
2171         OUT(0xf1); OUT(0xc9);
2172         INT; INT; ch = THIS(); 
2173         switch (ch) 
2174             {
2175             case 0x16: NEXT();break;
2176             case 0x01: NEXT();break;
2177             case 0x00: NEXT(); INT; break;
2178             case 0x03: NEXT(); INT; break;
2179             case 0x13: EXPn(instruction address); break;
2180             default:
2181               break;
2182             }
2183         break;
2184       case 0xd8:
2185         /* EXternal ref */
2186         NEXT(); 
2187         OUT(0xf1); OUT(0xd8);
2188         EXP ; EXP; EXP; EXP;
2189         break;
2190       case 0xce:
2191         NEXT();
2192         OUT(0xf1);OUT(0xce); INT; INT; ch = THIS(); INT;
2193         switch (ch) {
2194         case 0x01:
2195           INT; INT; break;
2196         case 0x02:
2197           INT; break;
2198         case 0x04:
2199           EXPn(external function); break;
2200         case 0x05:
2201           break;
2202         case 0x07: INTn(line number); INT;
2203         case 0x08: break;
2204         case 0x0a: INTn(locked register); INT; break;
2205         case 0x3f: copy_till_end(); break;
2206         case 0x3e: copy_till_end(); break;
2207         case 0x40: copy_till_end(); break;
2208         case 0x41: ID; break;
2209         }
2210       }
2211
2212 }
2213 static void f0_record()
2214 {
2215   /* Attribute record */
2216   NEXT();
2217   OUT(0xf0);
2218   INTn(Symbol name );
2219   ID;
2220 }
2221 static void copy_till_end()
2222 {
2223   int  ch = THIS();
2224   while (1) {
2225     while (ch <= 0x80) 
2226         {
2227           OUT(ch);
2228           NEXT();
2229           ch = THIS();
2230         }
2231     switch (ch) {
2232     case 0x84:
2233       OUT(THIS());
2234       NEXT();
2235     case 0x83:
2236       OUT(THIS());
2237       NEXT();
2238     case 0x82:
2239       OUT(THIS());
2240       NEXT();
2241     case 0x81:
2242       OUT(THIS());
2243       NEXT();
2244       OUT(THIS());
2245       NEXT();
2246
2247       ch = THIS();
2248       break;
2249     default:
2250       return;
2251     }
2252   }    
2253
2254 }
2255
2256 static void f2_record()
2257 {
2258   NEXT();
2259   OUT(0xf2);
2260   INT ;
2261   NEXT();
2262   OUT(0xce);
2263   INT ;
2264   copy_till_end();
2265 }
2266
2267
2268 static void block();
2269 static void f8_record()
2270 {
2271   int ch;
2272   NEXT();
2273   ch = THIS();
2274   switch (ch) 
2275       {
2276       case 0x01:
2277       case 0x02:
2278       case 0x03:
2279         /* Unique typedefs for module */
2280         /* GLobal typedefs  */
2281         /* High level module scope beginning */
2282           {
2283             struct output_buffer_struct ob;
2284             NEXT();
2285             OUT(0xf8); OUT(ch);
2286             drop_int(&ob); ID ;
2287
2288             block();
2289
2290             NEXT();
2291             fill_int(&ob);
2292             OUT(0xf9);
2293           }
2294         break;
2295       case 0x04:        
2296         /* Global function */
2297           {
2298             struct output_buffer_struct ob;
2299             NEXT();
2300             OUT(0xf8); OUT(0x04);
2301             drop_int(&ob); ID ; INTn(stack size); INTn(ret val);
2302             EXPn(offset); 
2303
2304             block();
2305
2306             NEXT();
2307             OUT(0xf9);  
2308             EXPn(size of block);
2309             fill_int(&ob);
2310           }
2311         break;
2312
2313       case 0x05:
2314         /* File name for source line numbers */
2315           {
2316             struct output_buffer_struct ob;
2317             NEXT();
2318             OUT(0xf8); OUT(0x05);
2319             drop_int(&ob);
2320             ID; INTn(year); INTn(month); INTn(day);
2321             INTn(hour); INTn(monute); INTn(second);
2322             block();
2323             NEXT();
2324             OUT(0xf9);
2325             fill_int(&ob);
2326           }
2327         break;
2328         
2329       case 0x06:
2330         /* Local function */
2331           { struct output_buffer_struct ob;
2332             NEXT(); OUT(0xf8); OUT(0x06);
2333             drop_int(&ob);
2334             ID; INTn(stack size); INTn(type return);
2335             EXPn(offset);
2336             block();
2337             NEXT();
2338             OUT(0xf9);
2339             EXPn(size);
2340             fill_int(&ob);
2341           }
2342         break;
2343         
2344       case 0x0a:
2345         /* Assembler module scope beginning -*/
2346           { struct output_buffer_struct ob;
2347
2348             NEXT();
2349             OUT(0xf8); OUT(0x0a); 
2350             drop_int(&ob);
2351               ID; ID; INT; ID; INT; INT; INT; INT; INT; INT;
2352
2353             block();    
2354
2355             NEXT();
2356             OUT(0xf9);
2357             fill_int(&ob);
2358           }
2359         break;
2360       case 0x0b:
2361           {
2362             struct output_buffer_struct ob;
2363             NEXT();
2364             OUT(0xf8); OUT(0x0b); 
2365             drop_int(&ob); ID ; INT; INTn(section index); EXPn(offset); INTn(stuff);
2366
2367             block();
2368
2369             OUT(0xf9);
2370             NEXT();      
2371             EXPn(Size in Maus);
2372             fill_int(&ob);
2373           }
2374         break;
2375       }
2376 }
2377
2378 static void e2_record()
2379 {
2380   OUT(0xe2);
2381   NEXT();
2382   OUT(0xce);
2383   NEXT();
2384   INT;
2385   EXP;
2386 }
2387
2388 static void DEFUN_VOID(block)
2389 {
2390   int ch ;
2391   while (1) {
2392     ch = THIS();
2393     switch (ch) {
2394     case 0xe1:
2395     case 0xe5:
2396       return;
2397     case 0xf9:
2398       return;
2399     case 0xf0:
2400       f0_record();
2401       break;
2402     case 0xf1:
2403       f1_record();    
2404       break;
2405     case 0xf2:
2406       f2_record();
2407       break;
2408     case 0xf8:
2409       f8_record();
2410       break;
2411     case 0xe2:
2412       e2_record();
2413       break;
2414
2415     }  
2416   }
2417 }
2418   
2419
2420
2421 /* relocate_debug, 
2422    moves all the debug information from the source bfd to the output
2423    bfd, and relocates any expressions it finds
2424 */
2425
2426 static void
2427 DEFUN(relocate_debug,(output, input),
2428       bfd *output AND
2429       bfd *input)
2430 {
2431 #define IBS 400
2432 #define OBS 400
2433   unsigned char input_buffer[IBS];
2434
2435   input_ptr_start = input_ptr = input_buffer;
2436   input_ptr_end = input_buffer + IBS;
2437   input_bfd = input;
2438   bfd_read((PTR)input_ptr_start, 1, IBS, input);
2439   block();
2440 }
2441 /* 
2442   During linking, we we told about the bfds which made up our
2443   contents, we have a list of them. They will still be open, so go to
2444   the debug info in each, and copy it out, relocating it as we go.
2445 */
2446
2447 static void 
2448 DEFUN(ieee_write_debug_part, (abfd),
2449       bfd *abfd)
2450 {
2451   ieee_data_type *ieee = IEEE_DATA(abfd);
2452   bfd_chain_type *chain = ieee->chain_root;
2453   unsigned char output_buffer[OBS];
2454   boolean some_debug = false;
2455   file_ptr here = bfd_tell(abfd);
2456
2457   output_ptr_start = output_ptr = output_buffer ;
2458   output_ptr_end = output_buffer + OBS;
2459   output_ptr = output_buffer;
2460   output_bfd = abfd;
2461
2462   if (chain == (bfd_chain_type *)NULL) {
2463 #if 0
2464       /* There is no debug info, so we'll fake some up */
2465       CONST static char fake[] = {
2466           0xf8, 0xa, 0, 5, 't', 't', 't', 't', 't', 0, 2, 3,
2467           '1','.','1',0x82, 1991>>8, 1991 & 0xff, 9, 20, 11, 07,50 };
2468       ieee->w.r.debug_information_part = 0;
2469
2470
2471       here;
2472
2473
2474       /*    bfd_write(fake, 1, sizeof(fake), abfd);*/
2475       /* Now write a header for each section */
2476     {
2477       int i = 0;
2478       asection *s = abfd->sections;
2479       while (s) {
2480           if (s != abfd->abs_section) 
2481           {
2482               
2483             ieee_write_byte(abfd, 0xf8);        
2484             ieee_write_byte(abfd, 0x0b);
2485             ieee_write_byte(abfd, 0);
2486             ieee_write_byte(abfd, 0);
2487             ieee_write_byte(abfd, 1);
2488             ieee_write_byte(abfd, i + IEEE_SECTION_NUMBER_BASE);
2489             ieee_write_expression(abfd, 0, s->symbol, 0, 0, 0);
2490             ieee_write_byte(abfd,0);
2491             ieee_write_byte(abfd, 0xf9);
2492             ieee_write_expression(abfd, s->size,
2493                                   bfd_abs_section.symbol, 0, 0, 0);     
2494             i++;
2495           }
2496             
2497           s = s->next;
2498
2499         }       
2500       /* Close the scope */
2501       ieee_write_byte(abfd, 0xf9);
2502     }
2503 #endif
2504     }
2505   else{
2506       while (chain != (bfd_chain_type *)NULL) {
2507           bfd *entry = chain->this;
2508           ieee_data_type *entry_ieee = IEEE_DATA(entry);
2509           if (entry_ieee->w.r.debug_information_part) {
2510               bfd_seek(entry, entry_ieee->w.r.debug_information_part, SEEK_SET);
2511               relocate_debug(abfd, entry);
2512             }
2513
2514           chain = chain->next;
2515         }
2516       if (some_debug) {
2517           ieee->w.r.debug_information_part = here;
2518         }
2519       else {
2520           ieee->w.r.debug_information_part = 0;
2521         }
2522     }
2523   flush();
2524
2525 }  
2526 /* write the data in an ieee way */
2527 static void
2528 DEFUN(ieee_write_data_part,(abfd),
2529       bfd *abfd)
2530 {
2531   asection *s;
2532   ieee_data_type *ieee = IEEE_DATA(abfd);
2533   ieee->w.r.data_part = bfd_tell(abfd);
2534   for (s = abfd->sections; s != (asection *)NULL; s = s->next) 
2535       {
2536         /* Sort the reloc records so we can insert them in the correct
2537            places */
2538         if (s->reloc_count != 0) 
2539             {
2540              do_with_relocs(abfd, s);
2541             }
2542         else
2543             {
2544               do_without_relocs(abfd, s);
2545             }
2546       }
2547 }
2548
2549
2550
2551 static void
2552 DEFUN(init_for_output,(abfd),
2553       bfd *abfd)
2554 {
2555   asection *s; 
2556   for (s = abfd->sections; s != (asection *)NULL; s = s->next) {
2557     if (s->_raw_size != 0) {
2558       ieee_per_section(s)->data = (bfd_byte *)(bfd_alloc(abfd, s->_raw_size));
2559     }
2560   }
2561 }
2562
2563 /** exec and core file sections */
2564
2565 /* set section contents is complicated with IEEE since the format is 
2566 * not a byte image, but a record stream.
2567 */
2568 boolean
2569 DEFUN(ieee_set_section_contents,(abfd, section, location, offset, count),
2570       bfd *abfd AND
2571       sec_ptr section AND
2572       PTR location AND
2573       file_ptr offset AND
2574       bfd_size_type count)
2575 {
2576   if (ieee_per_section(section)->data == (bfd_byte *)NULL) {
2577     init_for_output(abfd);
2578   }
2579   (void) memcpy((PTR)(ieee_per_section(section)->data + offset),
2580                 (PTR)location,
2581                 (unsigned int)count);
2582   return true;
2583 }
2584
2585 /*
2586 write the external symbols of a file, IEEE considers two sorts of
2587 external symbols, public, and referenced. It uses to internal forms
2588 to index them as well. When we write them out we turn their symbol
2589 values into indexes from the right base.
2590 */
2591 static void
2592 DEFUN(ieee_write_external_part,(abfd),
2593       bfd *abfd)
2594 {
2595   asymbol **q;
2596   ieee_data_type *ieee = IEEE_DATA(abfd);
2597
2598   unsigned int reference_index = IEEE_REFERENCE_BASE;
2599   unsigned int public_index = IEEE_PUBLIC_BASE+2;
2600   file_ptr here = bfd_tell(abfd);
2601   boolean hadone = false;
2602   if (abfd->outsymbols != (asymbol **)NULL) {
2603
2604     for (q = abfd->outsymbols; *q  != (asymbol *)NULL; q++) {
2605       asymbol *p = *q;
2606       hadone = true;
2607       if (p->section == &bfd_und_section) {
2608         /* This must be a symbol reference .. */
2609         ieee_write_byte(abfd, ieee_external_reference_enum);
2610         ieee_write_int(abfd, reference_index);
2611         ieee_write_id(abfd, p->name);
2612         p->value = reference_index;
2613         reference_index++;
2614       }
2615       else if (bfd_is_com_section (p->section)) {
2616         /* This is a weak reference */
2617         ieee_write_byte(abfd, ieee_external_reference_enum);
2618         ieee_write_int(abfd, reference_index);
2619         ieee_write_id(abfd, p->name);
2620         ieee_write_byte(abfd, ieee_weak_external_reference_enum);
2621         ieee_write_int(abfd, reference_index);
2622         ieee_write_int(abfd, p->value);
2623         ieee_write_int(abfd, BFD_FORT_COMM_DEFAULT_VALUE);
2624         p->value = reference_index;
2625         reference_index++;
2626       }
2627       else if(p->flags & BSF_GLOBAL) {
2628         /* This must be a symbol definition */
2629
2630
2631         ieee_write_byte(abfd, ieee_external_symbol_enum);
2632         ieee_write_int(abfd, public_index );
2633         ieee_write_id(abfd, p->name);
2634
2635         ieee_write_twobyte(abfd, ieee_attribute_record_enum);
2636         ieee_write_int(abfd, public_index );
2637         ieee_write_byte(abfd, 15);       /* instruction address */
2638         ieee_write_byte(abfd, 19);      /* static symbol */
2639         ieee_write_byte(abfd, 1);       /* one of them */
2640
2641
2642         /* Write out the value */
2643         ieee_write_2bytes(abfd, ieee_value_record_enum);
2644         ieee_write_int(abfd, public_index);
2645         if (p->section != &bfd_abs_section)
2646             {
2647               if (abfd->flags & EXEC_P) 
2648               {
2649                 /* If fully linked, then output all symbols
2650                    relocated */
2651                 ieee_write_int(abfd,
2652                                p->value + p->section->output_offset+ p->section->output_section->vma);
2653
2654               }
2655               else { 
2656                   ieee_write_expression(abfd,
2657                                         p->value + p->section->output_offset,
2658                                         p->section->output_section->symbol
2659                                         , false, 0);
2660                 }
2661             }
2662         else
2663             {
2664               ieee_write_expression(abfd,
2665                                     p->value,
2666                                     bfd_abs_section.symbol,
2667                                     false, 0);
2668             }
2669         p->value = public_index;
2670         public_index++;
2671       }
2672       else {
2673         /* This can happen - when there are gaps in the symbols read */
2674         /* from an input ieee file */
2675       }
2676     }
2677   }
2678   if (hadone)
2679     ieee->w.r.external_part = here;
2680
2681 }
2682
2683
2684 CONST static unsigned char exten[] = 
2685   {
2686     0xf0, 0x20, 0x00,                                   
2687     0xf1, 0xce, 0x20, 0x00, 37, 3, 3,   /* Set version 3 rev 3          */
2688     0xf1, 0xce, 0x20, 0x00, 39, 2,      /* keep symbol in  original case */
2689     0xf1, 0xce, 0x20, 0x00, 38          /* set object type relocateable to x */
2690   };
2691
2692 CONST static unsigned char envi[] =
2693   {
2694     0xf0, 0x21, 0x00,
2695
2696 /*    0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
2697     0x19, 0x2c, 
2698 */
2699     0xf1, 0xce, 0x21, 00, 52, 0x00, /* exec ok */
2700
2701     0xf1, 0xce, 0x21, 0, 53, 0x03,      /* host unix */
2702 /*    0xf1, 0xce, 0x21, 0, 54, 2,1,1    tool & version # */
2703   };
2704
2705 static
2706 void 
2707 DEFUN(ieee_write_me_part,(abfd),
2708       bfd *abfd)
2709 {
2710   ieee_data_type *ieee= IEEE_DATA(abfd);
2711   ieee->w.r.trailer_part = bfd_tell(abfd);
2712   if (abfd->start_address) {
2713     ieee->w.r.me_record = bfd_tell(abfd);
2714     ieee_write_2bytes(abfd, ieee_value_starting_address_enum);
2715     ieee_write_byte(abfd, ieee_function_either_open_b_enum);
2716     ieee_write_int(abfd, abfd->start_address);
2717     ieee_write_byte(abfd, ieee_function_either_close_b_enum);
2718   }
2719   else {
2720     ieee->w.r.me_record = bfd_tell(abfd);
2721   }
2722   ieee_write_byte(abfd, ieee_module_end_enum);
2723
2724 }
2725 boolean
2726 DEFUN(ieee_write_object_contents,(abfd),
2727       bfd *abfd)
2728 {
2729   ieee_data_type *ieee = IEEE_DATA(abfd);
2730   unsigned int i;
2731   file_ptr   old;
2732   /* Fast forward over the header area */
2733   bfd_seek(abfd, (file_ptr) 0, SEEK_SET);
2734   ieee_write_byte(abfd, ieee_module_beginning_enum);
2735
2736   ieee_write_id(abfd, bfd_printable_name(abfd));
2737   ieee_write_id(abfd, abfd->filename);
2738
2739   /* Fast forward over the variable bits */     
2740   ieee_write_byte(abfd, ieee_address_descriptor_enum);
2741
2742   /* Bits per MAU */
2743   ieee_write_byte(abfd, bfd_arch_bits_per_byte(abfd));
2744   /* MAU's per address */
2745   ieee_write_byte(abfd, bfd_arch_bits_per_address(abfd)  /
2746                   bfd_arch_bits_per_byte(abfd));
2747
2748   old = bfd_tell(abfd);
2749   bfd_seek(abfd, (file_ptr) (8 * N_W_VARIABLES), SEEK_CUR);
2750
2751   ieee->w.r.extension_record = bfd_tell(abfd);
2752   bfd_write((char *)exten, 1, sizeof(exten), abfd);
2753   if (abfd->flags & EXEC_P) 
2754     ieee_write_byte(abfd, 0x1); /* Absolute */
2755   else 
2756     ieee_write_byte(abfd, 0x2); /* Relocateable */    
2757   
2758   ieee->w.r.environmental_record = bfd_tell(abfd);
2759   bfd_write((char *)envi, 1, sizeof(envi), abfd);
2760   output_bfd = abfd;
2761   flush();
2762
2763   ieee_write_section_part(abfd);
2764   /*
2765     First write the symbols, this changes their values into table 
2766     indeces so we cant use it after this point
2767     */
2768   ieee_write_external_part(abfd);     
2769   /*  ieee_write_byte(abfd, ieee_record_seperator_enum);*/
2770
2771
2772   /*  ieee_write_byte(abfd, ieee_record_seperator_enum);*/
2773
2774
2775   /*
2776     Write any debugs we have been told about 
2777     */
2778   ieee_write_debug_part(abfd);
2779
2780   /* 
2781     Can only write the data once the symbols have been written since
2782     the data contains relocation information which points to the
2783     symbols 
2784     */
2785   ieee_write_data_part(abfd);     
2786
2787
2788   /*
2789     At the end we put the end !
2790     */
2791   ieee_write_me_part(abfd);
2792
2793
2794   /* Generate the header */
2795   bfd_seek(abfd, old, SEEK_SET);
2796
2797   for (i= 0; i < N_W_VARIABLES; i++) {
2798     ieee_write_2bytes(abfd,ieee_assign_value_to_variable_enum);
2799     ieee_write_byte(abfd, i);
2800     ieee_write_int5_out(abfd, ieee->w.offset[i]);
2801   }
2802   return true;
2803 }
2804
2805
2806
2807 \f
2808 /* Native-level interface to symbols. */
2809
2810 /* We read the symbols into a buffer, which is discarded when this
2811 function exits.  We read the strings into a buffer large enough to
2812 hold them all plus all the cached symbol entries. */
2813
2814 asymbol *
2815 DEFUN(ieee_make_empty_symbol,(abfd),
2816       bfd *abfd)
2817 {
2818
2819   ieee_symbol_type  *new =
2820     (ieee_symbol_type *)zalloc (sizeof (ieee_symbol_type));
2821   new->symbol.the_bfd = abfd;
2822   return &new->symbol;
2823
2824 }
2825
2826 static bfd *
2827 DEFUN(ieee_openr_next_archived_file,(arch, prev),
2828       bfd *arch AND
2829       bfd *prev)
2830 {
2831   ieee_ar_data_type *ar = IEEE_AR_DATA(arch);
2832   /* take the next one from the arch state, or reset */
2833   if (prev == (bfd *)NULL) {
2834     /* Reset the index - the first two entries are bogus*/
2835     ar->element_index = 2;
2836   }
2837   while (true) {  
2838     ieee_ar_obstack_type *p = ar->elements + ar->element_index;
2839     ar->element_index++;
2840     if (ar->element_index <= ar->element_count) {
2841       if (p->file_offset != (file_ptr)0) {
2842         if (p->abfd == (bfd *)NULL) {
2843           p->abfd = _bfd_create_empty_archive_element_shell(arch);
2844           p->abfd->origin = p->file_offset;
2845         }
2846         return p->abfd;
2847       }
2848     }
2849     else {
2850       bfd_error = no_more_archived_files;
2851       return (bfd *)NULL;
2852     }
2853
2854   }
2855 }
2856
2857 static boolean
2858 ieee_find_nearest_line(abfd,
2859                          section,
2860                          symbols,
2861                          offset,
2862                          filename_ptr,
2863                          functionname_ptr,
2864                          line_ptr)
2865 bfd *abfd;
2866 asection *section;
2867 asymbol **symbols;
2868 bfd_vma offset;
2869 char **filename_ptr;
2870 char **functionname_ptr;
2871 int *line_ptr;
2872 {
2873   return false;
2874 }
2875
2876
2877 static int
2878 ieee_generic_stat_arch_elt(abfd, buf)
2879 bfd *abfd;
2880 struct stat *buf;
2881 {
2882   ieee_ar_data_type *ar = abfd->my_archive->tdata.ieee_ar_data;
2883   if (ar == (ieee_ar_data_type *)NULL) {
2884     bfd_error = invalid_operation;
2885     return -1;
2886   }
2887   else {
2888     buf->st_size = 0x1;
2889     buf->st_mode = 0666;
2890     return !    ieee_object_p(abfd);
2891   }
2892 }
2893 static int 
2894 DEFUN(ieee_sizeof_headers,(abfd, x),
2895       bfd *abfd AND
2896       boolean x)
2897 {
2898   return 0;
2899 }
2900
2901
2902
2903 static void 
2904 DEFUN(ieee_bfd_debug_info_start,(abfd), 
2905       bfd *abfd)
2906   {
2907
2908   }
2909
2910 static void 
2911 DEFUN(ieee_bfd_debug_info_end,(abfd), 
2912       bfd *abfd)
2913   {
2914
2915   }
2916
2917
2918 /* Add this section to the list of sections we have debug info for, to
2919    be ready to output it at close time 
2920    */
2921 static void 
2922 DEFUN(ieee_bfd_debug_info_accumulate,(abfd, section), 
2923       bfd *abfd AND
2924       asection *section)
2925 {
2926   ieee_data_type *ieee = IEEE_DATA(section->owner);
2927   ieee_data_type *output_ieee = IEEE_DATA(abfd);
2928   /* can only accumulate data from other ieee bfds */
2929   if (section->owner->xvec != abfd->xvec)
2930     return;
2931   /* Only bother once per bfd */
2932   if (ieee->done_debug == true) 
2933     return;
2934   ieee->done_debug = true;
2935
2936   /* Don't bother if there is no debug info */
2937   if (ieee->w.r.debug_information_part == 0)
2938     return;
2939
2940
2941   /* Add to chain */
2942     {
2943       bfd_chain_type *n = (bfd_chain_type *) bfd_alloc(abfd, sizeof(bfd_chain_type));
2944       n->this = section->owner;
2945       n->next = (bfd_chain_type *)NULL;
2946         
2947       if (output_ieee->chain_head) {
2948         output_ieee->chain_head->next = n;
2949       }
2950       else {
2951         output_ieee->chain_root = n;
2952
2953       }
2954         output_ieee->chain_head = n; 
2955     }
2956 }
2957
2958
2959
2960
2961
2962
2963 #define FOO PROTO
2964 #define ieee_core_file_failing_command (char *(*)())(bfd_nullvoidptr)
2965 #define ieee_core_file_failing_signal (int (*)())bfd_0
2966 #define ieee_core_file_matches_executable_p ( FOO(boolean, (*),(bfd *, bfd *)))bfd_false
2967 #define ieee_slurp_armap bfd_true
2968 #define ieee_slurp_extended_name_table bfd_true
2969 #define ieee_truncate_arname (void (*)())bfd_nullvoidptr
2970 #define ieee_write_armap  (FOO( boolean, (*),(bfd *, unsigned int, struct orl *, unsigned int, int))) bfd_nullvoidptr
2971 #define ieee_get_lineno (struct lineno_cache_entry *(*)())bfd_nullvoidptr
2972 #define ieee_close_and_cleanup          bfd_generic_close_and_cleanup
2973 #define ieee_set_arch_mach bfd_default_set_arch_mach
2974 #define ieee_bfd_get_relocated_section_contents  bfd_generic_get_relocated_section_contents
2975 #define ieee_bfd_relax_section bfd_generic_relax_section
2976 #define ieee_bfd_seclet_link bfd_generic_seclet_link
2977 #define ieee_bfd_reloc_type_lookup \
2978   ((CONST struct reloc_howto_struct *(*) PARAMS ((bfd *, bfd_reloc_code_real_type))) bfd_nullvoidptr)
2979 #define ieee_bfd_make_debug_symbol \
2980   ((asymbol *(*) PARAMS ((bfd *, void *, unsigned long))) bfd_nullvoidptr)
2981
2982 /*SUPPRESS 460 */
2983 bfd_target ieee_vec =
2984 {
2985   "ieee",                       /* name */
2986   bfd_target_ieee_flavour,
2987   true,                         /* target byte order */
2988   true,                         /* target headers byte order */
2989   (HAS_RELOC | EXEC_P |         /* object flags */
2990    HAS_LINENO | HAS_DEBUG |
2991    HAS_SYMS | HAS_LOCALS | DYNAMIC | WP_TEXT | D_PAGED),
2992   ( SEC_CODE|SEC_DATA|SEC_ROM|SEC_HAS_CONTENTS
2993    |SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
2994    0,                           /* leading underscore */
2995   ' ',                          /* ar_pad_char */
2996   16,                           /* ar_max_namelen */
2997     1,                          /* minimum alignment */
2998 _do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16, /* data */
2999 _do_getb64, _do_putb64,  _do_getb32, _do_putb32, _do_getb16, _do_putb16, /* hdrs */
3000
3001   { _bfd_dummy_target,
3002      ieee_object_p,             /* bfd_check_format */
3003      ieee_archive_p,
3004     _bfd_dummy_target,
3005      },
3006   {
3007     bfd_false,
3008     ieee_mkobject, 
3009     _bfd_generic_mkarchive,
3010     bfd_false
3011     },
3012   {
3013     bfd_false,
3014     ieee_write_object_contents,
3015     _bfd_write_archive_contents,
3016     bfd_false,
3017   },
3018   JUMP_TABLE(ieee),
3019   (PTR) 0
3020 };
3021