AIX 4.3 changes
[external/binutils.git] / bfd / ieee.c
1 /* BFD back-end for ieee-695 objects.
2    Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
3    Free Software Foundation, Inc.
4
5    Written by Steve Chamberlain of Cygnus Support.
6
7 This file is part of BFD, the Binary File Descriptor library.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
22
23 #define KEEPMINUSPCININST 0
24
25 /* IEEE 695 format is a stream of records, which we parse using a simple one-
26    token (which is one byte in this lexicon) lookahead recursive decent
27    parser.  */
28
29 #include "bfd.h"
30 #include "sysdep.h"
31 #include "libbfd.h"
32 #include "ieee.h"
33 #include "libieee.h"
34
35 #include <ctype.h>
36
37 static boolean ieee_write_byte PARAMS ((bfd *, int));
38 static boolean ieee_write_2bytes PARAMS ((bfd *, int));
39 static boolean ieee_write_int PARAMS ((bfd *, bfd_vma));
40 static boolean ieee_write_id PARAMS ((bfd *, const char *));
41 static boolean ieee_write_expression
42   PARAMS ((bfd *, bfd_vma, asymbol *, boolean, unsigned int));
43 static void ieee_write_int5 PARAMS ((bfd_byte *, bfd_vma));
44 static boolean ieee_write_int5_out PARAMS ((bfd *, bfd_vma));
45 static boolean ieee_write_section_part PARAMS ((bfd *));
46 static boolean do_with_relocs PARAMS ((bfd *, asection *));
47 static boolean do_as_repeat PARAMS ((bfd *, asection *));
48 static boolean do_without_relocs PARAMS ((bfd *, asection *));
49 static boolean ieee_write_external_part PARAMS ((bfd *));
50 static boolean ieee_write_data_part PARAMS ((bfd *));
51 static boolean ieee_write_debug_part PARAMS ((bfd *));
52 static boolean ieee_write_me_part PARAMS ((bfd *));
53 static boolean ieee_write_processor PARAMS ((bfd *));
54
55 static boolean ieee_slurp_debug PARAMS ((bfd *));
56 static boolean ieee_slurp_section_data PARAMS ((bfd *));
57
58 /* Functions for writing to ieee files in the strange way that the
59    standard requires. */
60
61 static boolean
62 ieee_write_byte (abfd, barg)
63      bfd *abfd;
64      int barg;
65 {
66   bfd_byte byte;
67
68   byte = barg;
69   if (bfd_write ((PTR) &byte, 1, 1, abfd) != 1)
70     return false;
71   return true;
72 }
73
74 static boolean
75 ieee_write_2bytes (abfd, bytes)
76      bfd *abfd;
77      int bytes;
78 {
79   bfd_byte buffer[2];
80
81   buffer[0] = bytes >> 8;
82   buffer[1] = bytes & 0xff;
83   if (bfd_write ((PTR) buffer, 1, 2, abfd) != 2)
84     return false;
85   return true;
86 }
87
88 static boolean
89 ieee_write_int (abfd, value)
90      bfd *abfd;
91      bfd_vma value;
92 {
93   if (value <= 127)
94     {
95       if (! ieee_write_byte (abfd, (bfd_byte) value))
96         return false;
97     }
98   else
99     {
100       unsigned int length;
101
102       /* How many significant bytes ? */
103       /* FIXME FOR LONGER INTS */
104       if (value & 0xff000000)
105         length = 4;
106       else if (value & 0x00ff0000)
107         length = 3;
108       else if (value & 0x0000ff00)
109         length = 2;
110       else
111         length = 1;
112
113       if (! ieee_write_byte (abfd,
114                              (bfd_byte) ((int) ieee_number_repeat_start_enum
115                                          + length)))
116         return false;
117       switch (length)
118         {
119         case 4:
120           if (! ieee_write_byte (abfd, (bfd_byte) (value >> 24)))
121             return false;
122           /* Fall through.  */
123         case 3:
124           if (! ieee_write_byte (abfd, (bfd_byte) (value >> 16)))
125             return false;
126           /* Fall through.  */
127         case 2:
128           if (! ieee_write_byte (abfd, (bfd_byte) (value >> 8)))
129             return false;
130           /* Fall through.  */
131         case 1:
132           if (! ieee_write_byte (abfd, (bfd_byte) (value)))
133             return false;
134         }
135     }
136
137   return true;
138 }
139
140 static boolean
141 ieee_write_id (abfd, id)
142      bfd *abfd;
143      const char *id;
144 {
145   size_t length = strlen (id);
146
147   if (length <= 127)
148     {
149       if (! ieee_write_byte (abfd, (bfd_byte) length))
150         return false;
151     }
152   else if (length < 255)
153     {
154       if (! ieee_write_byte (abfd, ieee_extension_length_1_enum)
155           || ! ieee_write_byte (abfd, (bfd_byte) length))
156         return false;
157     }
158   else if (length < 65535)
159     {
160       if (! ieee_write_byte (abfd, ieee_extension_length_2_enum)
161           || ! ieee_write_2bytes (abfd, (int) length))
162         return false;
163     }
164   else
165     {
166       (*_bfd_error_handler)
167         (_("%s: string too long (%d chars, max 65535)"),
168          bfd_get_filename (abfd), length);
169       bfd_set_error (bfd_error_invalid_operation);
170       return false;
171     }
172
173   if (bfd_write ((PTR) id, 1, length, abfd) != length)
174     return false;
175   return true;
176 }
177 \f
178 /***************************************************************************
179 Functions for reading from ieee files in the strange way that the
180 standard requires:
181 */
182
183 #define this_byte(ieee) *((ieee)->input_p)
184 #define next_byte(ieee) ((ieee)->input_p++)
185 #define this_byte_and_next(ieee) (*((ieee)->input_p++))
186
187 static unsigned short
188 read_2bytes (ieee)
189      common_header_type *ieee;
190 {
191   unsigned char c1 = this_byte_and_next (ieee);
192   unsigned char c2 = this_byte_and_next (ieee);
193   return (c1 << 8) | c2;
194 }
195
196 static void
197 bfd_get_string (ieee, string, length)
198      common_header_type *ieee;
199      char *string;
200      size_t length;
201 {
202   size_t i;
203   for (i = 0; i < length; i++)
204     {
205       string[i] = this_byte_and_next (ieee);
206     }
207 }
208
209 static char *
210 read_id (ieee)
211      common_header_type *ieee;
212 {
213   size_t length;
214   char *string;
215   length = this_byte_and_next (ieee);
216   if (length <= 0x7f)
217     {
218       /* Simple string of length 0 to 127 */
219     }
220   else if (length == 0xde)
221     {
222       /* Length is next byte, allowing 0..255 */
223       length = this_byte_and_next (ieee);
224     }
225   else if (length == 0xdf)
226     {
227       /* Length is next two bytes, allowing 0..65535 */
228       length = this_byte_and_next (ieee);
229       length = (length * 256) + this_byte_and_next (ieee);
230     }
231   /* Buy memory and read string */
232   string = bfd_alloc (ieee->abfd, length + 1);
233   if (!string)
234     return NULL;
235   bfd_get_string (ieee, string, length);
236   string[length] = 0;
237   return string;
238 }
239
240 static boolean
241 ieee_write_expression (abfd, value, symbol, pcrel, index)
242      bfd *abfd;
243      bfd_vma value;
244      asymbol *symbol;
245      boolean pcrel;
246      unsigned int index;
247 {
248   unsigned int term_count = 0;
249
250   if (value != 0)
251     {
252       if (! ieee_write_int (abfd, value))
253         return false;
254       term_count++;
255     }
256
257   if (bfd_is_com_section (symbol->section)
258       || bfd_is_und_section (symbol->section))
259     {
260       /* Def of a common symbol */
261       if (! ieee_write_byte (abfd, ieee_variable_X_enum)
262           || ! ieee_write_int (abfd, symbol->value))
263         return false;
264       term_count++;
265     }
266   else if (! bfd_is_abs_section (symbol->section))
267     {
268       /* Ref to defined symbol - */
269
270       if (symbol->flags & BSF_GLOBAL)
271         {
272           if (! ieee_write_byte (abfd, ieee_variable_I_enum)
273               || ! ieee_write_int (abfd, symbol->value))
274             return false;
275           term_count++;
276         }
277       else if (symbol->flags & (BSF_LOCAL | BSF_SECTION_SYM))
278         {
279           /* This is a reference to a defined local symbol.  We can
280              easily do a local as a section+offset.  */
281           if (! ieee_write_byte (abfd, ieee_variable_R_enum)
282               || ! ieee_write_byte (abfd,
283                                     (bfd_byte) (symbol->section->index
284                                                 + IEEE_SECTION_NUMBER_BASE)))
285             return false;
286           term_count++;
287           if (symbol->value != 0)
288             {
289               if (! ieee_write_int (abfd, symbol->value))
290                 return false;
291               term_count++;
292             }
293         }
294       else
295         {
296           (*_bfd_error_handler)
297             (_("%s: unrecognized symbol `%s' flags 0x%x"),
298              bfd_get_filename (abfd), bfd_asymbol_name (symbol),
299              symbol->flags);
300           bfd_set_error (bfd_error_invalid_operation);
301           return false;
302         }
303     }
304
305   if (pcrel)
306     {
307       /* subtract the pc from here by asking for PC of this section*/
308       if (! ieee_write_byte (abfd, ieee_variable_P_enum)
309           || ! ieee_write_byte (abfd,
310                                 (bfd_byte) (index + IEEE_SECTION_NUMBER_BASE))
311           || ! ieee_write_byte (abfd, ieee_function_minus_enum))
312         return false;
313     }
314
315   /* Handle the degenerate case of a 0 address.  */
316   if (term_count == 0)
317     {
318       if (! ieee_write_int (abfd, 0))
319         return false;
320     }
321
322   while (term_count > 1)
323     {
324       if (! ieee_write_byte (abfd, ieee_function_plus_enum))
325         return false;
326       term_count--;
327     }
328
329   return true;
330 }
331 \f
332 /*****************************************************************************/
333
334 /*
335 writes any integer into the buffer supplied and always takes 5 bytes
336 */
337 static void
338 ieee_write_int5 (buffer, value)
339      bfd_byte *buffer;
340      bfd_vma value;
341 {
342   buffer[0] = (bfd_byte) ieee_number_repeat_4_enum;
343   buffer[1] = (value >> 24) & 0xff;
344   buffer[2] = (value >> 16) & 0xff;
345   buffer[3] = (value >> 8) & 0xff;
346   buffer[4] = (value >> 0) & 0xff;
347 }
348
349 static boolean
350 ieee_write_int5_out (abfd, value)
351      bfd *abfd;
352      bfd_vma value;
353 {
354   bfd_byte b[5];
355
356   ieee_write_int5 (b, value);
357   if (bfd_write ((PTR) b, 1, 5, abfd) != 5)
358     return false;
359   return true;
360 }
361
362 static boolean
363 parse_int (ieee, value_ptr)
364      common_header_type *ieee;
365      bfd_vma *value_ptr;
366 {
367   int value = this_byte (ieee);
368   int result;
369   if (value >= 0 && value <= 127)
370     {
371       *value_ptr = value;
372       next_byte (ieee);
373       return true;
374     }
375   else if (value >= 0x80 && value <= 0x88)
376     {
377       unsigned int count = value & 0xf;
378       result = 0;
379       next_byte (ieee);
380       while (count)
381         {
382           result = (result << 8) | this_byte_and_next (ieee);
383           count--;
384         }
385       *value_ptr = result;
386       return true;
387     }
388   return false;
389 }
390
391 static int
392 parse_i (ieee, ok)
393      common_header_type *ieee;
394      boolean *ok;
395 {
396   bfd_vma x;
397   *ok = parse_int (ieee, &x);
398   return x;
399 }
400
401 static bfd_vma
402 must_parse_int (ieee)
403      common_header_type *ieee;
404 {
405   bfd_vma result;
406   BFD_ASSERT (parse_int (ieee, &result) == true);
407   return result;
408 }
409
410 typedef struct
411 {
412   bfd_vma value;
413   asection *section;
414   ieee_symbol_index_type symbol;
415 } ieee_value_type;
416
417
418 #if KEEPMINUSPCININST
419
420 #define SRC_MASK(arg) arg
421 #define PCREL_OFFSET false
422
423 #else
424
425 #define SRC_MASK(arg) 0
426 #define PCREL_OFFSET true
427
428 #endif
429
430 static reloc_howto_type abs32_howto =
431   HOWTO (1,
432          0,
433          2,
434          32,
435          false,
436          0,
437          complain_overflow_bitfield,
438          0,
439          "abs32",
440          true,
441          0xffffffff,
442          0xffffffff,
443          false);
444
445 static reloc_howto_type abs16_howto =
446   HOWTO (1,
447          0,
448          1,
449          16,
450          false,
451          0,
452          complain_overflow_bitfield,
453          0,
454          "abs16",
455          true,
456          0x0000ffff,
457          0x0000ffff,
458          false);
459
460 static reloc_howto_type abs8_howto =
461   HOWTO (1,
462          0,
463          0,
464          8,
465          false,
466          0,
467          complain_overflow_bitfield,
468          0,
469          "abs8",
470          true,
471          0x000000ff,
472          0x000000ff,
473          false);
474
475 static reloc_howto_type rel32_howto =
476   HOWTO (1,
477          0,
478          2,
479          32,
480          true,
481          0,
482          complain_overflow_signed,
483          0,
484          "rel32",
485          true,
486          SRC_MASK (0xffffffff),
487          0xffffffff,
488          PCREL_OFFSET);
489
490 static reloc_howto_type rel16_howto =
491   HOWTO (1,
492          0,
493          1,
494          16,
495          true,
496          0,
497          complain_overflow_signed,
498          0,
499          "rel16",
500          true,
501          SRC_MASK (0x0000ffff),
502          0x0000ffff,
503          PCREL_OFFSET);
504
505 static reloc_howto_type rel8_howto =
506   HOWTO (1,
507          0,
508          0,
509          8,
510          true,
511          0,
512          complain_overflow_signed,
513          0,
514          "rel8",
515          true,
516          SRC_MASK (0x000000ff),
517          0x000000ff,
518          PCREL_OFFSET);
519
520 static ieee_symbol_index_type NOSYMBOL = {0, 0};
521
522 static void
523 parse_expression (ieee, value, symbol, pcrel, extra, section)
524      ieee_data_type *ieee;
525      bfd_vma *value;
526      ieee_symbol_index_type *symbol;
527      boolean *pcrel;
528      unsigned int *extra;
529      asection **section;
530
531 {
532 #define POS sp[1]
533 #define TOS sp[0]
534 #define NOS sp[-1]
535 #define INC sp++;
536 #define DEC sp--;
537
538   boolean loop = true;
539   ieee_value_type stack[10];
540
541   /* The stack pointer always points to the next unused location */
542 #define PUSH(x,y,z) TOS.symbol=x;TOS.section=y;TOS.value=z;INC;
543 #define POP(x,y,z) DEC;x=TOS.symbol;y=TOS.section;z=TOS.value;
544   ieee_value_type *sp = stack;
545
546   while (loop)
547     {
548       switch (this_byte (&(ieee->h)))
549         {
550         case ieee_variable_P_enum:
551           /* P variable, current program counter for section n */
552           {
553             int section_n;
554             next_byte (&(ieee->h));
555             *pcrel = true;
556             section_n = must_parse_int (&(ieee->h));
557             PUSH (NOSYMBOL, bfd_abs_section_ptr, 0);
558             break;
559           }
560         case ieee_variable_L_enum:
561           /* L variable  address of section N */
562           next_byte (&(ieee->h));
563           PUSH (NOSYMBOL, ieee->section_table[must_parse_int (&(ieee->h))], 0);
564           break;
565         case ieee_variable_R_enum:
566           /* R variable, logical address of section module */
567           /* FIXME, this should be different to L */
568           next_byte (&(ieee->h));
569           PUSH (NOSYMBOL, ieee->section_table[must_parse_int (&(ieee->h))], 0);
570           break;
571         case ieee_variable_S_enum:
572           /* S variable, size in MAUS of section module */
573           next_byte (&(ieee->h));
574           PUSH (NOSYMBOL,
575                 0,
576                 ieee->section_table[must_parse_int (&(ieee->h))]->_raw_size);
577           break;
578         case ieee_variable_I_enum:
579           /* Push the address of variable n */
580           {
581             ieee_symbol_index_type sy;
582             next_byte (&(ieee->h));
583             sy.index = (int) must_parse_int (&(ieee->h));
584             sy.letter = 'I';
585
586             PUSH (sy, bfd_abs_section_ptr, 0);
587           }
588           break;
589         case ieee_variable_X_enum:
590           /* Push the address of external variable n */
591           {
592             ieee_symbol_index_type sy;
593             next_byte (&(ieee->h));
594             sy.index = (int) (must_parse_int (&(ieee->h)));
595             sy.letter = 'X';
596
597             PUSH (sy, bfd_und_section_ptr, 0);
598           }
599           break;
600         case ieee_function_minus_enum:
601           {
602             bfd_vma value1, value2;
603             asection *section1, *section_dummy;
604             ieee_symbol_index_type sy;
605             next_byte (&(ieee->h));
606
607             POP (sy, section1, value1);
608             POP (sy, section_dummy, value2);
609             PUSH (sy, section1 ? section1 : section_dummy, value2 - value1);
610           }
611           break;
612         case ieee_function_plus_enum:
613           {
614             bfd_vma value1, value2;
615             asection *section1;
616             asection *section2;
617             ieee_symbol_index_type sy1;
618             ieee_symbol_index_type sy2;
619             next_byte (&(ieee->h));
620
621             POP (sy1, section1, value1);
622             POP (sy2, section2, value2);
623             PUSH (sy1.letter ? sy1 : sy2,
624                   bfd_is_abs_section (section1) ? section2 : section1,
625                   value1 + value2);
626           }
627           break;
628         default:
629           {
630             bfd_vma va;
631             BFD_ASSERT (this_byte (&(ieee->h)) < (int) ieee_variable_A_enum
632                     || this_byte (&(ieee->h)) > (int) ieee_variable_Z_enum);
633             if (parse_int (&(ieee->h), &va))
634               {
635                 PUSH (NOSYMBOL, bfd_abs_section_ptr, va);
636               }
637             else
638               {
639                 /*
640                   Thats all that we can understand. As far as I can see
641                   there is a bug in the Microtec IEEE output which I'm
642                   using to scan, whereby the comma operator is omitted
643                   sometimes in an expression, giving expressions with too
644                   many terms. We can tell if that's the case by ensuring
645                   that sp == stack here. If not, then we've pushed
646                   something too far, so we keep adding.  */
647
648                 while (sp != stack + 1)
649                   {
650                     asection *section1;
651                     ieee_symbol_index_type sy1;
652                     POP (sy1, section1, *extra);
653                   }
654                 {
655                   asection *dummy;
656
657                   POP (*symbol, dummy, *value);
658                   if (section)
659                     *section = dummy;
660                 }
661
662                 loop = false;
663               }
664           }
665         }
666     }
667 }
668
669
670 #define ieee_seek(abfd, offset) \
671   IEEE_DATA(abfd)->h.input_p = IEEE_DATA(abfd)->h.first_byte + offset
672
673 #define ieee_pos(abfd) \
674   (IEEE_DATA(abfd)->h.input_p - IEEE_DATA(abfd)->h.first_byte)
675
676 static unsigned int last_index;
677 static char last_type;          /* is the index for an X or a D */
678
679 static ieee_symbol_type *
680 get_symbol (abfd,
681             ieee,
682             last_symbol,
683             symbol_count,
684             pptr,
685             max_index,
686             this_type
687 )
688      bfd *abfd ATTRIBUTE_UNUSED;
689      ieee_data_type *ieee;
690      ieee_symbol_type *last_symbol;
691      unsigned int *symbol_count;
692      ieee_symbol_type ***pptr;
693      unsigned int *max_index;
694      char this_type
695       ;
696 {
697   /* Need a new symbol */
698   unsigned int new_index = must_parse_int (&(ieee->h));
699   if (new_index != last_index || this_type != last_type)
700     {
701       ieee_symbol_type *new_symbol = (ieee_symbol_type *) bfd_alloc (ieee->h.abfd,
702                                                  sizeof (ieee_symbol_type));
703       if (!new_symbol)
704         return NULL;
705
706       new_symbol->index = new_index;
707       last_index = new_index;
708       (*symbol_count)++;
709       **pptr = new_symbol;
710       *pptr = &new_symbol->next;
711       if (new_index > *max_index)
712         {
713           *max_index = new_index;
714         }
715       last_type = this_type;
716       new_symbol->symbol.section = bfd_abs_section_ptr;
717       return new_symbol;
718     }
719   return last_symbol;
720 }
721
722 static boolean
723 ieee_slurp_external_symbols (abfd)
724      bfd *abfd;
725 {
726   ieee_data_type *ieee = IEEE_DATA (abfd);
727   file_ptr offset = ieee->w.r.external_part;
728
729   ieee_symbol_type **prev_symbols_ptr = &ieee->external_symbols;
730   ieee_symbol_type **prev_reference_ptr = &ieee->external_reference;
731   ieee_symbol_type *symbol = (ieee_symbol_type *) NULL;
732   unsigned int symbol_count = 0;
733   boolean loop = true;
734   last_index = 0xffffff;
735   ieee->symbol_table_full = true;
736
737   ieee_seek (abfd, offset);
738
739   while (loop)
740     {
741       switch (this_byte (&(ieee->h)))
742         {
743         case ieee_nn_record:
744           next_byte (&(ieee->h));
745
746           symbol = get_symbol (abfd, ieee, symbol, &symbol_count,
747                                &prev_symbols_ptr,
748                                &ieee->external_symbol_max_index, 'I');
749           if (symbol == NULL)
750             return false;
751
752           symbol->symbol.the_bfd = abfd;
753           symbol->symbol.name = read_id (&(ieee->h));
754           symbol->symbol.udata.p = (PTR) NULL;
755           symbol->symbol.flags = BSF_NO_FLAGS;
756           break;
757         case ieee_external_symbol_enum:
758           next_byte (&(ieee->h));
759
760           symbol = get_symbol (abfd, ieee, symbol, &symbol_count,
761                                &prev_symbols_ptr,
762                                &ieee->external_symbol_max_index, 'D');
763           if (symbol == NULL)
764             return false;
765
766           BFD_ASSERT (symbol->index >= ieee->external_symbol_min_index);
767
768           symbol->symbol.the_bfd = abfd;
769           symbol->symbol.name = read_id (&(ieee->h));
770           symbol->symbol.udata.p = (PTR) NULL;
771           symbol->symbol.flags = BSF_NO_FLAGS;
772           break;
773         case ieee_attribute_record_enum >> 8:
774           {
775             unsigned int symbol_name_index;
776             unsigned int symbol_type_index;
777             unsigned int symbol_attribute_def;
778             bfd_vma value;
779             switch (read_2bytes (ieee))
780               {
781               case ieee_attribute_record_enum:
782                 symbol_name_index = must_parse_int (&(ieee->h));
783                 symbol_type_index = must_parse_int (&(ieee->h));
784                 symbol_attribute_def = must_parse_int (&(ieee->h));
785                 switch (symbol_attribute_def)
786                   {
787                   case 8:
788                   case 19:
789                     parse_int (&ieee->h, &value);
790                     break;
791                   default:
792                     (*_bfd_error_handler)
793                       (_("%s: unimplemented ATI record  %u for symbol %u"),
794                        bfd_get_filename (abfd), symbol_attribute_def,
795                        symbol_name_index);
796                     bfd_set_error (bfd_error_bad_value);
797                     return false;
798                     break;
799                   }
800                 break;
801               case ieee_external_reference_info_record_enum:
802                 /* Skip over ATX record. */
803                 parse_int (&(ieee->h), &value);
804                 parse_int (&(ieee->h), &value);
805                 parse_int (&(ieee->h), &value);
806                 parse_int (&(ieee->h), &value);
807                 break;
808               case ieee_atn_record_enum:
809                 /* We may get call optimization information here,
810                    which we just ignore.  The format is
811                    {$F1}${CE}{index}{$00}{$3F}{$3F}{#_of_ASNs} */
812                 parse_int (&ieee->h, &value);
813                 parse_int (&ieee->h, &value);
814                 parse_int (&ieee->h, &value);
815                 if (value != 0x3f)
816                   {
817                     (*_bfd_error_handler)
818                       (_("%s: unexpected ATN type %d in external part"),
819                          bfd_get_filename (abfd), (int) value);
820                     bfd_set_error (bfd_error_bad_value);
821                     return false;
822                   }
823                 parse_int (&ieee->h, &value);
824                 parse_int (&ieee->h, &value);
825                 while (value > 0)
826                   {
827                     bfd_vma val1;
828
829                     --value;
830
831                     switch (read_2bytes (ieee))
832                       {
833                       case ieee_asn_record_enum:
834                         parse_int (&ieee->h, &val1);
835                         parse_int (&ieee->h, &val1);
836                         break;
837
838                       default:
839                         (*_bfd_error_handler)
840                           (_("%s: unexpected type after ATN"),
841                              bfd_get_filename (abfd));
842                         bfd_set_error (bfd_error_bad_value);
843                         return false;
844                       }
845                   }
846               }
847           }
848           break;
849         case ieee_value_record_enum >> 8:
850           {
851             unsigned int symbol_name_index;
852             ieee_symbol_index_type symbol_ignore;
853             boolean pcrel_ignore;
854             unsigned int extra;
855             next_byte (&(ieee->h));
856             next_byte (&(ieee->h));
857
858             symbol_name_index = must_parse_int (&(ieee->h));
859             parse_expression (ieee,
860                               &symbol->symbol.value,
861                               &symbol_ignore,
862                               &pcrel_ignore,
863                               &extra,
864                               &symbol->symbol.section);
865
866             /* Fully linked IEEE-695 files tend to give every symbol
867                an absolute value.  Try to convert that back into a
868                section relative value.  FIXME: This won't always to
869                the right thing.  */
870             if (bfd_is_abs_section (symbol->symbol.section)
871                 && (abfd->flags & HAS_RELOC) == 0)
872               {
873                 bfd_vma val;
874                 asection *s;
875
876                 val = symbol->symbol.value;
877                 for (s = abfd->sections; s != NULL; s = s->next)
878                   {
879                     if (val >= s->vma && val < s->vma + s->_raw_size)
880                       {
881                         symbol->symbol.section = s;
882                         symbol->symbol.value -= s->vma;
883                         break;
884                       }
885                   }
886               }
887
888             symbol->symbol.flags = BSF_GLOBAL | BSF_EXPORT;
889
890           }
891           break;
892         case ieee_weak_external_reference_enum:
893           {
894             bfd_vma size;
895             bfd_vma value;
896             next_byte (&(ieee->h));
897             /* Throw away the external reference index */
898             (void) must_parse_int (&(ieee->h));
899             /* Fetch the default size if not resolved */
900             size = must_parse_int (&(ieee->h));
901             /* Fetch the defautlt value if available */
902             if (parse_int (&(ieee->h), &value) == false)
903               {
904                 value = 0;
905               }
906             /* This turns into a common */
907             symbol->symbol.section = bfd_com_section_ptr;
908             symbol->symbol.value = size;
909           }
910           break;
911
912         case ieee_external_reference_enum:
913           next_byte (&(ieee->h));
914
915           symbol = get_symbol (abfd, ieee, symbol, &symbol_count,
916                                &prev_reference_ptr,
917                                &ieee->external_reference_max_index, 'X');
918           if (symbol == NULL)
919             return false;
920
921           symbol->symbol.the_bfd = abfd;
922           symbol->symbol.name = read_id (&(ieee->h));
923           symbol->symbol.udata.p = (PTR) NULL;
924           symbol->symbol.section = bfd_und_section_ptr;
925           symbol->symbol.value = (bfd_vma) 0;
926           symbol->symbol.flags = 0;
927
928           BFD_ASSERT (symbol->index >= ieee->external_reference_min_index);
929           break;
930
931         default:
932           loop = false;
933         }
934     }
935
936   if (ieee->external_symbol_max_index != 0)
937     {
938       ieee->external_symbol_count =
939         ieee->external_symbol_max_index -
940         ieee->external_symbol_min_index + 1;
941     }
942   else
943     {
944       ieee->external_symbol_count = 0;
945     }
946
947   if (ieee->external_reference_max_index != 0)
948     {
949       ieee->external_reference_count =
950         ieee->external_reference_max_index -
951         ieee->external_reference_min_index + 1;
952     }
953   else
954     {
955       ieee->external_reference_count = 0;
956     }
957
958   abfd->symcount =
959     ieee->external_reference_count + ieee->external_symbol_count;
960
961   if (symbol_count != abfd->symcount)
962     {
963       /* There are gaps in the table -- */
964       ieee->symbol_table_full = false;
965     }
966
967   *prev_symbols_ptr = (ieee_symbol_type *) NULL;
968   *prev_reference_ptr = (ieee_symbol_type *) NULL;
969
970   return true;
971 }
972
973 static boolean
974 ieee_slurp_symbol_table (abfd)
975      bfd *abfd;
976 {
977   if (IEEE_DATA (abfd)->read_symbols == false)
978     {
979       if (! ieee_slurp_external_symbols (abfd))
980         return false;
981       IEEE_DATA (abfd)->read_symbols = true;
982     }
983   return true;
984 }
985
986 long
987 ieee_get_symtab_upper_bound (abfd)
988      bfd *abfd;
989 {
990   if (! ieee_slurp_symbol_table (abfd))
991     return -1;
992
993   return (abfd->symcount != 0) ?
994     (abfd->symcount + 1) * (sizeof (ieee_symbol_type *)) : 0;
995 }
996
997 /*
998 Move from our internal lists to the canon table, and insert in
999 symbol index order
1000 */
1001
1002 extern const bfd_target ieee_vec;
1003
1004 long
1005 ieee_get_symtab (abfd, location)
1006      bfd *abfd;
1007      asymbol **location;
1008 {
1009   ieee_symbol_type *symp;
1010   static bfd dummy_bfd;
1011   static asymbol empty_symbol =
1012   /* the_bfd, name, value, attr, section */
1013   {&dummy_bfd, " ieee empty", (symvalue) 0, BSF_DEBUGGING, bfd_abs_section_ptr, { 0 }};
1014
1015   if (abfd->symcount)
1016     {
1017       ieee_data_type *ieee = IEEE_DATA (abfd);
1018       dummy_bfd.xvec = &ieee_vec;
1019       if (! ieee_slurp_symbol_table (abfd))
1020         return -1;
1021
1022       if (ieee->symbol_table_full == false)
1023         {
1024           /* Arrgh - there are gaps in the table, run through and fill them */
1025           /* up with pointers to a null place */
1026           unsigned int i;
1027           for (i = 0; i < abfd->symcount; i++)
1028             {
1029               location[i] = &empty_symbol;
1030             }
1031         }
1032
1033       ieee->external_symbol_base_offset = -ieee->external_symbol_min_index;
1034       for (symp = IEEE_DATA (abfd)->external_symbols;
1035            symp != (ieee_symbol_type *) NULL;
1036            symp = symp->next)
1037         {
1038           /* Place into table at correct index locations */
1039           location[symp->index + ieee->external_symbol_base_offset] = &symp->symbol;
1040         }
1041
1042       /* The external refs are indexed in a bit */
1043       ieee->external_reference_base_offset =
1044         -ieee->external_reference_min_index + ieee->external_symbol_count;
1045
1046       for (symp = IEEE_DATA (abfd)->external_reference;
1047            symp != (ieee_symbol_type *) NULL;
1048            symp = symp->next)
1049         {
1050           location[symp->index + ieee->external_reference_base_offset] =
1051             &symp->symbol;
1052
1053         }
1054     }
1055   if (abfd->symcount)
1056     {
1057       location[abfd->symcount] = (asymbol *) NULL;
1058     }
1059   return abfd->symcount;
1060 }
1061
1062 static asection *
1063 get_section_entry (abfd, ieee, index)
1064      bfd *abfd;
1065      ieee_data_type *ieee;
1066      unsigned int index;
1067 {
1068   if (index >= ieee->section_table_size)
1069     {
1070       unsigned int c, i;
1071       asection **n;
1072
1073       c = ieee->section_table_size;
1074       if (c == 0)
1075         c = 20;
1076       while (c <= index)
1077         c *= 2;
1078
1079       n = ((asection **)
1080            bfd_realloc (ieee->section_table, c * sizeof (asection *)));
1081       if (n == NULL)
1082         return NULL;
1083
1084       for (i = ieee->section_table_size; i < c; i++)
1085         n[i] = NULL;
1086
1087       ieee->section_table = n;
1088       ieee->section_table_size = c;
1089     }
1090
1091   if (ieee->section_table[index] == (asection *) NULL)
1092     {
1093       char *tmp = bfd_alloc (abfd, 11);
1094       asection *section;
1095
1096       if (!tmp)
1097         return NULL;
1098       sprintf (tmp, " fsec%4d", index);
1099       section = bfd_make_section (abfd, tmp);
1100       ieee->section_table[index] = section;
1101       section->flags = SEC_NO_FLAGS;
1102       section->target_index = index;
1103       ieee->section_table[index] = section;
1104     }
1105   return ieee->section_table[index];
1106 }
1107
1108 static void
1109 ieee_slurp_sections (abfd)
1110      bfd *abfd;
1111 {
1112   ieee_data_type *ieee = IEEE_DATA (abfd);
1113   file_ptr offset = ieee->w.r.section_part;
1114   asection *section = (asection *) NULL;
1115   char *name;
1116
1117   if (offset != 0)
1118     {
1119       bfd_byte section_type[3];
1120       ieee_seek (abfd, offset);
1121       while (true)
1122         {
1123           switch (this_byte (&(ieee->h)))
1124             {
1125             case ieee_section_type_enum:
1126               {
1127                 unsigned int section_index;
1128                 next_byte (&(ieee->h));
1129                 section_index = must_parse_int (&(ieee->h));
1130
1131                 section = get_section_entry (abfd, ieee, section_index);
1132
1133                 section_type[0] = this_byte_and_next (&(ieee->h));
1134
1135                 /* Set minimal section attributes. Attributes are
1136                    extended later, based on section contents. */
1137
1138                 switch (section_type[0])
1139                   {
1140                   case 0xC1:
1141                     /* Normal attributes for absolute sections  */
1142                     section_type[1] = this_byte (&(ieee->h));
1143                     section->flags = SEC_ALLOC;
1144                     switch (section_type[1])
1145                       {
1146                       case 0xD3:        /* AS Absolute section attributes */
1147                         next_byte (&(ieee->h));
1148                         section_type[2] = this_byte (&(ieee->h));
1149                         switch (section_type[2])
1150                           {
1151                           case 0xD0:
1152                             /* Normal code */
1153                             next_byte (&(ieee->h));
1154                             section->flags |= SEC_CODE;
1155                             break;
1156                           case 0xC4:
1157                             /* Normal data */
1158                             next_byte (&(ieee->h));
1159                             section->flags |= SEC_DATA;
1160                             break;
1161                           case 0xD2:
1162                             next_byte (&(ieee->h));
1163                             /* Normal rom data */
1164                             section->flags |= SEC_ROM | SEC_DATA;
1165                             break;
1166                           default:
1167                             break;
1168                           }
1169                       }
1170                     break;
1171                   case 0xC3:    /* Named relocatable sections (type C) */
1172                     section_type[1] = this_byte (&(ieee->h));
1173                     section->flags = SEC_ALLOC;
1174                     switch (section_type[1])
1175                       {
1176                       case 0xD0:        /* Normal code (CP) */
1177                         next_byte (&(ieee->h));
1178                         section->flags |= SEC_CODE;
1179                         break;
1180                       case 0xC4:        /* Normal data (CD) */
1181                         next_byte (&(ieee->h));
1182                         section->flags |= SEC_DATA;
1183                         break;
1184                       case 0xD2:        /* Normal rom data (CR) */
1185                         next_byte (&(ieee->h));
1186                         section->flags |= SEC_ROM | SEC_DATA;
1187                         break;
1188                       default:
1189                         break;
1190                       }
1191                   }
1192
1193                 /* Read section name, use it if non empty. */
1194                 name = read_id (&ieee->h);
1195                 if (name[0])
1196                   section->name = name;
1197
1198                 /* Skip these fields, which we don't care about */
1199                 {
1200                   bfd_vma parent, brother, context;
1201                   parse_int (&(ieee->h), &parent);
1202                   parse_int (&(ieee->h), &brother);
1203                   parse_int (&(ieee->h), &context);
1204                 }
1205               }
1206               break;
1207             case ieee_section_alignment_enum:
1208               {
1209                 unsigned int section_index;
1210                 bfd_vma value;
1211                 asection *section;
1212                 next_byte (&(ieee->h));
1213                 section_index = must_parse_int (&ieee->h);
1214                 section = get_section_entry (abfd, ieee, section_index);
1215                 if (section_index > ieee->section_count)
1216                   {
1217                     ieee->section_count = section_index;
1218                   }
1219                 section->alignment_power =
1220                   bfd_log2 (must_parse_int (&ieee->h));
1221                 (void) parse_int (&(ieee->h), &value);
1222               }
1223               break;
1224             case ieee_e2_first_byte_enum:
1225               {
1226                 ieee_record_enum_type t = (ieee_record_enum_type) (read_2bytes (&(ieee->h)));
1227
1228                 switch (t)
1229                   {
1230                   case ieee_section_size_enum:
1231                     section = ieee->section_table[must_parse_int (&(ieee->h))];
1232                     section->_raw_size = must_parse_int (&(ieee->h));
1233                     break;
1234                   case ieee_physical_region_size_enum:
1235                     section = ieee->section_table[must_parse_int (&(ieee->h))];
1236                     section->_raw_size = must_parse_int (&(ieee->h));
1237                     break;
1238                   case ieee_region_base_address_enum:
1239                     section = ieee->section_table[must_parse_int (&(ieee->h))];
1240                     section->vma = must_parse_int (&(ieee->h));
1241                     section->lma = section->vma;
1242                     break;
1243                   case ieee_mau_size_enum:
1244                     must_parse_int (&(ieee->h));
1245                     must_parse_int (&(ieee->h));
1246                     break;
1247                   case ieee_m_value_enum:
1248                     must_parse_int (&(ieee->h));
1249                     must_parse_int (&(ieee->h));
1250                     break;
1251                   case ieee_section_base_address_enum:
1252                     section = ieee->section_table[must_parse_int (&(ieee->h))];
1253                     section->vma = must_parse_int (&(ieee->h));
1254                     section->lma = section->vma;
1255                     break;
1256                   case ieee_section_offset_enum:
1257                     (void) must_parse_int (&(ieee->h));
1258                     (void) must_parse_int (&(ieee->h));
1259                     break;
1260                   default:
1261                     return;
1262                   }
1263               }
1264               break;
1265             default:
1266               return;
1267             }
1268         }
1269     }
1270 }
1271
1272 /* Make a section for the debugging information, if any.  We don't try
1273    to interpret the debugging information; we just point the section
1274    at the area in the file so that program which understand can dig it
1275    out.  */
1276
1277 static boolean
1278 ieee_slurp_debug (abfd)
1279      bfd *abfd;
1280 {
1281   ieee_data_type *ieee = IEEE_DATA (abfd);
1282   asection *sec;
1283   file_ptr debug_end;
1284
1285   if (ieee->w.r.debug_information_part == 0)
1286     return true;
1287
1288   sec = bfd_make_section (abfd, ".debug");
1289   if (sec == NULL)
1290     return false;
1291   sec->flags |= SEC_DEBUGGING | SEC_HAS_CONTENTS;
1292   sec->filepos = ieee->w.r.debug_information_part;
1293
1294   debug_end = ieee->w.r.data_part;
1295   if (debug_end == 0)
1296     debug_end = ieee->w.r.trailer_part;
1297   if (debug_end == 0)
1298     debug_end = ieee->w.r.me_record;
1299   sec->_raw_size = debug_end - ieee->w.r.debug_information_part;
1300
1301   return true;
1302 }
1303 \f
1304 /***********************************************************************
1305 *  archive stuff
1306 */
1307
1308 const bfd_target *
1309 ieee_archive_p (abfd)
1310      bfd *abfd;
1311 {
1312   char *library;
1313   unsigned int i;
1314   unsigned char buffer[512];
1315   file_ptr buffer_offset = 0;
1316   ieee_ar_data_type *save = abfd->tdata.ieee_ar_data;
1317   ieee_ar_data_type *ieee;
1318   unsigned int alc_elts;
1319   ieee_ar_obstack_type *elts = NULL;
1320
1321   abfd->tdata.ieee_ar_data =
1322     (ieee_ar_data_type *) bfd_alloc (abfd, sizeof (ieee_ar_data_type));
1323   if (!abfd->tdata.ieee_ar_data)
1324     goto error_return;
1325   ieee = IEEE_AR_DATA (abfd);
1326
1327   /* FIXME: Check return value.  I'm not sure whether it needs to read
1328      the entire buffer or not.  */
1329   bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd);
1330
1331   ieee->h.first_byte = buffer;
1332   ieee->h.input_p = buffer;
1333
1334   ieee->h.abfd = abfd;
1335
1336   if (this_byte (&(ieee->h)) != Module_Beginning)
1337     {
1338       abfd->tdata.ieee_ar_data = save;
1339       goto got_wrong_format_error;
1340     }
1341
1342   next_byte (&(ieee->h));
1343   library = read_id (&(ieee->h));
1344   if (strcmp (library, "LIBRARY") != 0)
1345     {
1346       bfd_release (abfd, ieee);
1347       abfd->tdata.ieee_ar_data = save;
1348       goto got_wrong_format_error;
1349     }
1350   /* Throw away the filename */
1351   read_id (&(ieee->h));
1352
1353   ieee->element_count = 0;
1354   ieee->element_index = 0;
1355
1356   next_byte (&(ieee->h));       /* Drop the ad part */
1357   must_parse_int (&(ieee->h));  /* And the two dummy numbers */
1358   must_parse_int (&(ieee->h));
1359
1360   alc_elts = 10;
1361   elts = (ieee_ar_obstack_type *) bfd_malloc (alc_elts * sizeof *elts);
1362   if (elts == NULL)
1363     goto error_return;
1364
1365   /* Read the index of the BB table */
1366   while (1)
1367     {
1368       int rec;
1369       ieee_ar_obstack_type *t;
1370
1371       rec = read_2bytes (&(ieee->h));
1372       if (rec != (int) ieee_assign_value_to_variable_enum)
1373         break;
1374
1375       if (ieee->element_count >= alc_elts)
1376         {
1377           ieee_ar_obstack_type *n;
1378
1379           alc_elts *= 2;
1380           n = ((ieee_ar_obstack_type *)
1381                bfd_realloc (elts, alc_elts * sizeof *elts));
1382           if (n == NULL)
1383             goto error_return;
1384           elts = n;
1385         }
1386
1387       t = &elts[ieee->element_count];
1388       ieee->element_count++;
1389
1390       must_parse_int (&(ieee->h));
1391       t->file_offset = must_parse_int (&(ieee->h));
1392       t->abfd = (bfd *) NULL;
1393
1394       /* Make sure that we don't go over the end of the buffer */
1395
1396       if ((size_t) ieee_pos (abfd) > sizeof (buffer) / 2)
1397         {
1398           /* Past half way, reseek and reprime */
1399           buffer_offset += ieee_pos (abfd);
1400           if (bfd_seek (abfd, buffer_offset, SEEK_SET) != 0)
1401             goto error_return;
1402           /* FIXME: Check return value.  I'm not sure whether it needs
1403              to read the entire buffer or not.  */
1404           bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd);
1405           ieee->h.first_byte = buffer;
1406           ieee->h.input_p = buffer;
1407         }
1408     }
1409
1410   ieee->elements = ((ieee_ar_obstack_type *)
1411                     bfd_alloc (abfd,
1412                                ieee->element_count * sizeof *ieee->elements));
1413   if (ieee->elements == NULL)
1414     goto error_return;
1415   memcpy (ieee->elements, elts,
1416           ieee->element_count * sizeof *ieee->elements);
1417   free (elts);
1418   elts = NULL;
1419
1420   /* Now scan the area again, and replace BB offsets with file */
1421   /* offsets */
1422
1423   for (i = 2; i < ieee->element_count; i++)
1424     {
1425       if (bfd_seek (abfd, ieee->elements[i].file_offset, SEEK_SET) != 0)
1426         goto error_return;
1427       /* FIXME: Check return value.  I'm not sure whether it needs to
1428          read the entire buffer or not.  */
1429       bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd);
1430       ieee->h.first_byte = buffer;
1431       ieee->h.input_p = buffer;
1432
1433       next_byte (&(ieee->h));   /* Drop F8 */
1434       next_byte (&(ieee->h));   /* Drop 14 */
1435       must_parse_int (&(ieee->h));      /* Drop size of block */
1436       if (must_parse_int (&(ieee->h)) != 0)
1437         {
1438           /* This object has been deleted */
1439           ieee->elements[i].file_offset = 0;
1440         }
1441       else
1442         {
1443           ieee->elements[i].file_offset = must_parse_int (&(ieee->h));
1444         }
1445     }
1446
1447   /*  abfd->has_armap = ;*/
1448
1449   return abfd->xvec;
1450
1451  got_wrong_format_error:
1452   bfd_set_error (bfd_error_wrong_format);
1453  error_return:
1454   if (elts != NULL)
1455     free (elts);
1456   return NULL;
1457 }
1458
1459 static boolean
1460 ieee_mkobject (abfd)
1461      bfd *abfd;
1462 {
1463   abfd->tdata.ieee_data = (ieee_data_type *) bfd_zalloc (abfd, sizeof (ieee_data_type));
1464   return abfd->tdata.ieee_data ? true : false;
1465 }
1466
1467 const bfd_target *
1468 ieee_object_p (abfd)
1469      bfd *abfd;
1470 {
1471   char *processor;
1472   unsigned int part;
1473   ieee_data_type *ieee;
1474   unsigned char buffer[300];
1475   ieee_data_type *save = IEEE_DATA (abfd);
1476
1477   abfd->tdata.ieee_data = 0;
1478   ieee_mkobject (abfd);
1479
1480   ieee = IEEE_DATA (abfd);
1481   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
1482     goto fail;
1483   /* Read the first few bytes in to see if it makes sense */
1484   /* FIXME: Check return value.  I'm not sure whether it needs to read
1485      the entire buffer or not.  */
1486   bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd);
1487
1488   ieee->h.input_p = buffer;
1489   if (this_byte_and_next (&(ieee->h)) != Module_Beginning)
1490     goto got_wrong_format;
1491
1492   ieee->read_symbols = false;
1493   ieee->read_data = false;
1494   ieee->section_count = 0;
1495   ieee->external_symbol_max_index = 0;
1496   ieee->external_symbol_min_index = IEEE_PUBLIC_BASE;
1497   ieee->external_reference_min_index = IEEE_REFERENCE_BASE;
1498   ieee->external_reference_max_index = 0;
1499   ieee->h.abfd = abfd;
1500   ieee->section_table = NULL;
1501   ieee->section_table_size = 0;
1502
1503   processor = ieee->mb.processor = read_id (&(ieee->h));
1504   if (strcmp (processor, "LIBRARY") == 0)
1505     goto got_wrong_format;
1506   ieee->mb.module_name = read_id (&(ieee->h));
1507   if (abfd->filename == (CONST char *) NULL)
1508     {
1509       abfd->filename = ieee->mb.module_name;
1510     }
1511   /* Determine the architecture and machine type of the object file.
1512      */
1513   {
1514     const bfd_arch_info_type *arch;
1515     char family[10];
1516
1517     /* IEEE does not specify the format of the processor identificaton
1518        string, so the compiler is free to put in it whatever it wants.
1519        We try here to recognize different processors belonging to the
1520        m68k family.  Code for other processors can be added here.  */
1521     if ((processor[0] == '6') && (processor[1] == '8'))
1522       {
1523         if (processor[2] == '3')            /* 683xx integrated processors */
1524           {
1525             switch (processor[3])
1526               {
1527               case '0':                     /* 68302, 68306, 68307 */
1528               case '2':                     /* 68322, 68328 */
1529               case '5':                     /* 68356 */
1530                 strcpy (family, "68000");   /* MC68000-based controllers */
1531                 break;
1532
1533               case '3':                     /* 68330, 68331, 68332, 68333,
1534                                                68334, 68335, 68336, 68338 */
1535               case '6':                     /* 68360 */
1536               case '7':                     /* 68376 */
1537                 strcpy (family, "68332");   /* CPU32 and CPU32+ */
1538                 break;
1539
1540               case '4':
1541                 if (processor[4] == '9')    /* 68349 */
1542                   strcpy (family, "68030"); /* CPU030 */
1543                 else                        /* 68340, 68341 */
1544                   strcpy (family, "68332"); /* CPU32 and CPU32+ */
1545                 break;
1546
1547               default:                      /* Does not exist yet */
1548                 strcpy (family, "68332");   /* Guess it will be CPU32 */
1549               }
1550           }
1551         else if (toupper (processor[3]) == 'F')   /* 68F333 */
1552           strcpy (family, "68332");               /* CPU32 */
1553         else if ((toupper (processor[3]) == 'C')  /* Embedded controllers */
1554                  && ((toupper (processor[2]) == 'E')
1555                      || (toupper (processor[2]) == 'H')
1556                      || (toupper (processor[2]) == 'L')))
1557           {
1558             strcpy (family, "68");
1559             strncat (family, processor + 4, 7);
1560             family[9] = '\0';
1561           }
1562         else                             /* "Regular" processors */
1563           {
1564             strncpy (family, processor, 9);
1565             family[9] = '\0';
1566           }
1567       }
1568     else if ((strncmp (processor, "cpu32", 5) == 0) /* CPU32 and CPU32+ */
1569              || (strncmp (processor, "CPU32", 5) == 0))
1570       strcpy (family, "68332");
1571     else
1572       {
1573         strncpy (family, processor, 9);
1574         family[9] = '\0';
1575       }
1576
1577     arch = bfd_scan_arch (family);
1578     if (arch == 0)
1579       goto got_wrong_format;
1580     abfd->arch_info = arch;
1581   }
1582
1583   if (this_byte (&(ieee->h)) != (int) ieee_address_descriptor_enum)
1584     {
1585       goto fail;
1586     }
1587   next_byte (&(ieee->h));
1588
1589   if (parse_int (&(ieee->h), &ieee->ad.number_of_bits_mau) == false)
1590     {
1591       goto fail;
1592     }
1593   if (parse_int (&(ieee->h), &ieee->ad.number_of_maus_in_address) == false)
1594     {
1595       goto fail;
1596     }
1597
1598   /* If there is a byte order info, take it */
1599   if (this_byte (&(ieee->h)) == (int) ieee_variable_L_enum ||
1600       this_byte (&(ieee->h)) == (int) ieee_variable_M_enum)
1601     next_byte (&(ieee->h));
1602
1603   for (part = 0; part < N_W_VARIABLES; part++)
1604     {
1605       boolean ok;
1606       if (read_2bytes (&(ieee->h)) != (int) ieee_assign_value_to_variable_enum)
1607         {
1608           goto fail;
1609         }
1610       if (this_byte_and_next (&(ieee->h)) != part)
1611         {
1612           goto fail;
1613         }
1614
1615       ieee->w.offset[part] = parse_i (&(ieee->h), &ok);
1616       if (ok == false)
1617         {
1618           goto fail;
1619         }
1620
1621     }
1622
1623   if (ieee->w.r.external_part != 0)
1624     abfd->flags = HAS_SYMS;
1625
1626   /* By now we know that this is a real IEEE file, we're going to read
1627      the whole thing into memory so that we can run up and down it
1628      quickly.  We can work out how big the file is from the trailer
1629      record */
1630
1631   IEEE_DATA (abfd)->h.first_byte =
1632     (unsigned char *) bfd_alloc (ieee->h.abfd, ieee->w.r.me_record + 1);
1633   if (!IEEE_DATA (abfd)->h.first_byte)
1634     goto fail;
1635   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
1636     goto fail;
1637   /* FIXME: Check return value.  I'm not sure whether it needs to read
1638      the entire buffer or not.  */
1639   bfd_read ((PTR) (IEEE_DATA (abfd)->h.first_byte), 1,
1640             ieee->w.r.me_record + 1, abfd);
1641
1642   ieee_slurp_sections (abfd);
1643
1644   if (! ieee_slurp_debug (abfd))
1645     goto fail;
1646
1647   /* Parse section data to activate file and section flags implied by
1648      section contents. */
1649
1650   if (! ieee_slurp_section_data (abfd))
1651     goto fail;
1652     
1653   return abfd->xvec;
1654 got_wrong_format:
1655   bfd_set_error (bfd_error_wrong_format);
1656 fail:
1657   (void) bfd_release (abfd, ieee);
1658   abfd->tdata.ieee_data = save;
1659   return (const bfd_target *) NULL;
1660 }
1661
1662 void
1663 ieee_get_symbol_info (ignore_abfd, symbol, ret)
1664      bfd *ignore_abfd ATTRIBUTE_UNUSED;
1665      asymbol *symbol;
1666      symbol_info *ret;
1667 {
1668   bfd_symbol_info (symbol, ret);
1669   if (symbol->name[0] == ' ')
1670     ret->name = "* empty table entry ";
1671   if (!symbol->section)
1672     ret->type = (symbol->flags & BSF_LOCAL) ? 'a' : 'A';
1673 }
1674
1675 void
1676 ieee_print_symbol (ignore_abfd, afile, symbol, how)
1677      bfd *ignore_abfd ATTRIBUTE_UNUSED;
1678      PTR afile;
1679      asymbol *symbol;
1680      bfd_print_symbol_type how;
1681 {
1682   FILE *file = (FILE *) afile;
1683
1684   switch (how)
1685     {
1686     case bfd_print_symbol_name:
1687       fprintf (file, "%s", symbol->name);
1688       break;
1689     case bfd_print_symbol_more:
1690 #if 0
1691       fprintf (file, "%4x %2x", aout_symbol (symbol)->desc & 0xffff,
1692                aout_symbol (symbol)->other & 0xff);
1693 #endif
1694       BFD_FAIL ();
1695       break;
1696     case bfd_print_symbol_all:
1697       {
1698         const char *section_name =
1699           (symbol->section == (asection *) NULL
1700            ? "*abs"
1701            : symbol->section->name);
1702         if (symbol->name[0] == ' ')
1703           {
1704             fprintf (file, "* empty table entry ");
1705           }
1706         else
1707           {
1708             bfd_print_symbol_vandf ((PTR) file, symbol);
1709
1710             fprintf (file, " %-5s %04x %02x %s",
1711                      section_name,
1712                      (unsigned) ieee_symbol (symbol)->index,
1713                      (unsigned) 0,
1714                      symbol->name);
1715           }
1716       }
1717       break;
1718     }
1719 }
1720
1721 static boolean
1722 do_one (ieee, current_map, location_ptr, s, iterations)
1723      ieee_data_type *ieee;
1724      ieee_per_section_type *current_map;
1725      unsigned char *location_ptr;
1726      asection *s;
1727      int iterations;
1728 {
1729   switch (this_byte (&(ieee->h)))
1730     {
1731     case ieee_load_constant_bytes_enum:
1732       {
1733         unsigned int number_of_maus;
1734         unsigned int i;
1735         next_byte (&(ieee->h));
1736         number_of_maus = must_parse_int (&(ieee->h));
1737
1738         for (i = 0; i < number_of_maus; i++)
1739           {
1740             location_ptr[current_map->pc++] = this_byte (&(ieee->h));
1741             next_byte (&(ieee->h));
1742           }
1743       }
1744       break;
1745
1746     case ieee_load_with_relocation_enum:
1747       {
1748         boolean loop = true;
1749         next_byte (&(ieee->h));
1750         while (loop)
1751           {
1752             switch (this_byte (&(ieee->h)))
1753               {
1754               case ieee_variable_R_enum:
1755
1756               case ieee_function_signed_open_b_enum:
1757               case ieee_function_unsigned_open_b_enum:
1758               case ieee_function_either_open_b_enum:
1759                 {
1760                   unsigned int extra = 4;
1761                   boolean pcrel = false;
1762                   asection *section;
1763                   ieee_reloc_type *r =
1764                   (ieee_reloc_type *) bfd_alloc (ieee->h.abfd,
1765                                                  sizeof (ieee_reloc_type));
1766                   if (!r)
1767                     return false;
1768
1769                   *(current_map->reloc_tail_ptr) = r;
1770                   current_map->reloc_tail_ptr = &r->next;
1771                   r->next = (ieee_reloc_type *) NULL;
1772                   next_byte (&(ieee->h));
1773 /*                          abort();*/
1774                   r->relent.sym_ptr_ptr = 0;
1775                   parse_expression (ieee,
1776                                     &r->relent.addend,
1777                                     &r->symbol,
1778                                     &pcrel, &extra, &section);
1779                   r->relent.address = current_map->pc;
1780                   s->flags |= SEC_RELOC;
1781                   s->owner->flags |= HAS_RELOC;
1782                   s->reloc_count++;
1783                   if (r->relent.sym_ptr_ptr == NULL && section != NULL)
1784                     r->relent.sym_ptr_ptr = section->symbol_ptr_ptr;
1785
1786                   if (this_byte (&(ieee->h)) == (int) ieee_comma)
1787                     {
1788                       next_byte (&(ieee->h));
1789                       /* Fetch number of bytes to pad */
1790                       extra = must_parse_int (&(ieee->h));
1791                     };
1792
1793                   switch (this_byte (&(ieee->h)))
1794                     {
1795                     case ieee_function_signed_close_b_enum:
1796                       next_byte (&(ieee->h));
1797                       break;
1798                     case ieee_function_unsigned_close_b_enum:
1799                       next_byte (&(ieee->h));
1800                       break;
1801                     case ieee_function_either_close_b_enum:
1802                       next_byte (&(ieee->h));
1803                       break;
1804                     default:
1805                       break;
1806                     }
1807                   /* Build a relocation entry for this type */
1808                   /* If pc rel then stick -ve pc into instruction
1809                      and take out of reloc ..
1810
1811                      I've changed this. It's all too complicated. I
1812                      keep 0 in the instruction now.  */
1813
1814                   switch (extra)
1815                     {
1816                     case 0:
1817                     case 4:
1818
1819                       if (pcrel == true)
1820                         {
1821 #if KEEPMINUSPCININST
1822                           bfd_put_32 (ieee->h.abfd, -current_map->pc, location_ptr +
1823                                       current_map->pc);
1824                           r->relent.howto = &rel32_howto;
1825                           r->relent.addend -=
1826                             current_map->pc;
1827 #else
1828                           bfd_put_32 (ieee->h.abfd, 0, location_ptr +
1829                                       current_map->pc);
1830                           r->relent.howto = &rel32_howto;
1831 #endif
1832                         }
1833                       else
1834                         {
1835                           bfd_put_32 (ieee->h.abfd, 0, location_ptr +
1836                                       current_map->pc);
1837                           r->relent.howto = &abs32_howto;
1838                         }
1839                       current_map->pc += 4;
1840                       break;
1841                     case 2:
1842                       if (pcrel == true)
1843                         {
1844 #if KEEPMINUSPCININST
1845                           bfd_put_16 (ieee->h.abfd, (int) (-current_map->pc), location_ptr + current_map->pc);
1846                           r->relent.addend -= current_map->pc;
1847                           r->relent.howto = &rel16_howto;
1848 #else
1849
1850                           bfd_put_16 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1851                           r->relent.howto = &rel16_howto;
1852 #endif
1853                         }
1854
1855                       else
1856                         {
1857                           bfd_put_16 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1858                           r->relent.howto = &abs16_howto;
1859                         }
1860                       current_map->pc += 2;
1861                       break;
1862                     case 1:
1863                       if (pcrel == true)
1864                         {
1865 #if KEEPMINUSPCININST
1866                           bfd_put_8 (ieee->h.abfd, (int) (-current_map->pc), location_ptr + current_map->pc);
1867                           r->relent.addend -= current_map->pc;
1868                           r->relent.howto = &rel8_howto;
1869 #else
1870                           bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1871                           r->relent.howto = &rel8_howto;
1872 #endif
1873                         }
1874                       else
1875                         {
1876                           bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1877                           r->relent.howto = &abs8_howto;
1878                         }
1879                       current_map->pc += 1;
1880                       break;
1881
1882                     default:
1883                       BFD_FAIL ();
1884                       return false;
1885                     }
1886                 }
1887                 break;
1888               default:
1889                 {
1890                   bfd_vma this_size;
1891                   if (parse_int (&(ieee->h), &this_size) == true)
1892                     {
1893                       unsigned int i;
1894                       for (i = 0; i < this_size; i++)
1895                         {
1896                           location_ptr[current_map->pc++] = this_byte (&(ieee->h));
1897                           next_byte (&(ieee->h));
1898                         }
1899                     }
1900                   else
1901                     {
1902                       loop = false;
1903                     }
1904                 }
1905               }
1906
1907             /* Prevent more than the first load-item of an LR record
1908                from being repeated (MRI convention). */
1909             if (iterations != 1)
1910               loop = false;
1911           }
1912       }
1913     }
1914   return true;
1915 }
1916
1917 /* Read in all the section data and relocation stuff too */
1918 static boolean
1919 ieee_slurp_section_data (abfd)
1920      bfd *abfd;
1921 {
1922   bfd_byte *location_ptr = (bfd_byte *) NULL;
1923   ieee_data_type *ieee = IEEE_DATA (abfd);
1924   unsigned int section_number;
1925
1926   ieee_per_section_type *current_map = (ieee_per_section_type *) NULL;
1927   asection *s;
1928   /* Seek to the start of the data area */
1929   if (ieee->read_data == true)
1930     return true;
1931   ieee->read_data = true;
1932   ieee_seek (abfd, ieee->w.r.data_part);
1933
1934   /* Allocate enough space for all the section contents */
1935
1936   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
1937     {
1938       ieee_per_section_type *per = (ieee_per_section_type *) s->used_by_bfd;
1939       if ((s->flags & SEC_DEBUGGING) != 0)
1940         continue;
1941       per->data = (bfd_byte *) bfd_alloc (ieee->h.abfd, s->_raw_size);
1942       if (!per->data)
1943         return false;
1944       /*SUPPRESS 68*/
1945       per->reloc_tail_ptr =
1946         (ieee_reloc_type **) & (s->relocation);
1947     }
1948
1949   while (true)
1950     {
1951       switch (this_byte (&(ieee->h)))
1952         {
1953           /* IF we see anything strange then quit */
1954         default:
1955           return true;
1956
1957         case ieee_set_current_section_enum:
1958           next_byte (&(ieee->h));
1959           section_number = must_parse_int (&(ieee->h));
1960           s = ieee->section_table[section_number];
1961           s->flags |= SEC_LOAD | SEC_HAS_CONTENTS;
1962           current_map = (ieee_per_section_type *) s->used_by_bfd;
1963           location_ptr = current_map->data - s->vma;
1964           /* The document I have says that Microtec's compilers reset */
1965           /* this after a sec section, even though the standard says not */
1966           /* to. SO .. */
1967           current_map->pc = s->vma;
1968           break;
1969
1970         case ieee_e2_first_byte_enum:
1971           next_byte (&(ieee->h));
1972           switch (this_byte (&(ieee->h)))
1973             {
1974             case ieee_set_current_pc_enum & 0xff:
1975               {
1976                 bfd_vma value;
1977                 ieee_symbol_index_type symbol;
1978                 unsigned int extra;
1979                 boolean pcrel;
1980                 next_byte (&(ieee->h));
1981                 must_parse_int (&(ieee->h));    /* Thow away section #*/
1982                 parse_expression (ieee, &value,
1983                                   &symbol,
1984                                   &pcrel, &extra,
1985                                   0);
1986                 current_map->pc = value;
1987                 BFD_ASSERT ((unsigned) (value - s->vma) <= s->_raw_size);
1988               }
1989               break;
1990
1991             case ieee_value_starting_address_enum & 0xff:
1992               next_byte (&(ieee->h));
1993               if (this_byte (&(ieee->h)) == ieee_function_either_open_b_enum)
1994                 next_byte (&(ieee->h));
1995               abfd->start_address = must_parse_int (&(ieee->h));
1996               /* We've got to the end of the data now - */
1997               return true;
1998             default:
1999               BFD_FAIL ();
2000               return false;
2001             }
2002           break;
2003         case ieee_repeat_data_enum:
2004           {
2005             /* Repeat the following LD or LR n times - we do this by
2006                  remembering the stream pointer before running it and
2007                  resetting it and running it n times. We special case
2008                  the repetition of a repeat_data/load_constant
2009                  */
2010
2011             unsigned int iterations;
2012             unsigned char *start;
2013             next_byte (&(ieee->h));
2014             iterations = must_parse_int (&(ieee->h));
2015             start = ieee->h.input_p;
2016             if (start[0] == (int) ieee_load_constant_bytes_enum &&
2017                 start[1] == 1)
2018               {
2019                 while (iterations != 0)
2020                   {
2021                     location_ptr[current_map->pc++] = start[2];
2022                     iterations--;
2023                   }
2024                 next_byte (&(ieee->h));
2025                 next_byte (&(ieee->h));
2026                 next_byte (&(ieee->h));
2027               }
2028             else
2029               {
2030                 while (iterations != 0)
2031                   {
2032                     ieee->h.input_p = start;
2033                     if (!do_one (ieee, current_map, location_ptr, s,
2034                                  iterations))
2035                       return false;
2036                     iterations--;
2037                   }
2038               }
2039           }
2040           break;
2041         case ieee_load_constant_bytes_enum:
2042         case ieee_load_with_relocation_enum:
2043           {
2044             if (!do_one (ieee, current_map, location_ptr, s, 1))
2045               return false;
2046           }
2047         }
2048     }
2049 }
2050
2051 boolean
2052 ieee_new_section_hook (abfd, newsect)
2053      bfd *abfd;
2054      asection *newsect;
2055 {
2056   newsect->used_by_bfd = (PTR)
2057     bfd_alloc (abfd, sizeof (ieee_per_section_type));
2058   if (!newsect->used_by_bfd)
2059     return false;
2060   ieee_per_section (newsect)->data = (bfd_byte *) NULL;
2061   ieee_per_section (newsect)->section = newsect;
2062   return true;
2063 }
2064
2065 long
2066 ieee_get_reloc_upper_bound (abfd, asect)
2067      bfd *abfd;
2068      sec_ptr asect;
2069 {
2070   if ((asect->flags & SEC_DEBUGGING) != 0)
2071     return 0;
2072   if (! ieee_slurp_section_data (abfd))
2073     return -1;
2074   return (asect->reloc_count + 1) * sizeof (arelent *);
2075 }
2076
2077 static boolean
2078 ieee_get_section_contents (abfd, section, location, offset, count)
2079      bfd *abfd;
2080      sec_ptr section;
2081      PTR location;
2082      file_ptr offset;
2083      bfd_size_type count;
2084 {
2085   ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;
2086   if ((section->flags & SEC_DEBUGGING) != 0)
2087     return _bfd_generic_get_section_contents (abfd, section, location,
2088                                               offset, count);
2089   ieee_slurp_section_data (abfd);
2090   (void) memcpy ((PTR) location, (PTR) (p->data + offset), (unsigned) count);
2091   return true;
2092 }
2093
2094 long
2095 ieee_canonicalize_reloc (abfd, section, relptr, symbols)
2096      bfd *abfd;
2097      sec_ptr section;
2098      arelent **relptr;
2099      asymbol **symbols;
2100 {
2101 /*  ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;*/
2102   ieee_reloc_type *src = (ieee_reloc_type *) (section->relocation);
2103   ieee_data_type *ieee = IEEE_DATA (abfd);
2104
2105   if ((section->flags & SEC_DEBUGGING) != 0)
2106     return 0;
2107
2108   while (src != (ieee_reloc_type *) NULL)
2109     {
2110       /* Work out which symbol to attach it this reloc to */
2111       switch (src->symbol.letter)
2112         {
2113         case 'I':
2114           src->relent.sym_ptr_ptr =
2115             symbols + src->symbol.index + ieee->external_symbol_base_offset;
2116           break;
2117         case 'X':
2118           src->relent.sym_ptr_ptr =
2119             symbols + src->symbol.index + ieee->external_reference_base_offset;
2120           break;
2121         case 0:
2122           if (src->relent.sym_ptr_ptr != NULL)
2123             src->relent.sym_ptr_ptr =
2124               src->relent.sym_ptr_ptr[0]->section->symbol_ptr_ptr;
2125           break;
2126         default:
2127
2128           BFD_FAIL ();
2129         }
2130       *relptr++ = &src->relent;
2131       src = src->next;
2132     }
2133   *relptr = (arelent *) NULL;
2134   return section->reloc_count;
2135 }
2136
2137 static int
2138 comp (ap, bp)
2139      CONST PTR ap;
2140      CONST PTR bp;
2141 {
2142   arelent *a = *((arelent **) ap);
2143   arelent *b = *((arelent **) bp);
2144   return a->address - b->address;
2145 }
2146
2147 /* Write the section headers.  */
2148
2149 static boolean
2150 ieee_write_section_part (abfd)
2151      bfd *abfd;
2152 {
2153   ieee_data_type *ieee = IEEE_DATA (abfd);
2154   asection *s;
2155   ieee->w.r.section_part = bfd_tell (abfd);
2156   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
2157     {
2158       if (! bfd_is_abs_section (s)
2159           && (s->flags & SEC_DEBUGGING) == 0)
2160         {
2161           if (! ieee_write_byte (abfd, ieee_section_type_enum)
2162               || ! ieee_write_byte (abfd,
2163                                     (bfd_byte) (s->index
2164                                                 + IEEE_SECTION_NUMBER_BASE)))
2165             return false;
2166
2167           if (abfd->flags & EXEC_P)
2168             {
2169               /* This image is executable, so output absolute sections */
2170               if (! ieee_write_byte (abfd, ieee_variable_A_enum)
2171                   || ! ieee_write_byte (abfd, ieee_variable_S_enum))
2172                 return false;
2173             }
2174           else
2175             {
2176               if (! ieee_write_byte (abfd, ieee_variable_C_enum))
2177                 return false;
2178             }
2179
2180           switch (s->flags & (SEC_CODE | SEC_DATA | SEC_ROM))
2181             {
2182             case SEC_CODE | SEC_LOAD:
2183             case SEC_CODE:
2184               if (! ieee_write_byte (abfd, ieee_variable_P_enum))
2185                 return false;
2186               break;
2187             case SEC_DATA:
2188             default:
2189               if (! ieee_write_byte (abfd, ieee_variable_D_enum))
2190                 return false;
2191               break;
2192             case SEC_ROM:
2193             case SEC_ROM | SEC_DATA:
2194             case SEC_ROM | SEC_LOAD:
2195             case SEC_ROM | SEC_DATA | SEC_LOAD:
2196               if (! ieee_write_byte (abfd, ieee_variable_R_enum))
2197                 return false;
2198             }
2199
2200
2201           if (! ieee_write_id (abfd, s->name))
2202             return false;
2203 #if 0
2204           ieee_write_int (abfd, 0);     /* Parent */
2205           ieee_write_int (abfd, 0);     /* Brother */
2206           ieee_write_int (abfd, 0);     /* Context */
2207 #endif
2208           /* Alignment */
2209           if (! ieee_write_byte (abfd, ieee_section_alignment_enum)
2210               || ! ieee_write_byte (abfd,
2211                                     (bfd_byte) (s->index
2212                                                 + IEEE_SECTION_NUMBER_BASE))
2213               || ! ieee_write_int (abfd, 1 << s->alignment_power))
2214             return false;
2215
2216           /* Size */
2217           if (! ieee_write_2bytes (abfd, ieee_section_size_enum)
2218               || ! ieee_write_byte (abfd,
2219                                     (bfd_byte) (s->index
2220                                                 + IEEE_SECTION_NUMBER_BASE))
2221               || ! ieee_write_int (abfd, s->_raw_size))
2222             return false;
2223           if (abfd->flags & EXEC_P)
2224             {
2225               /* Relocateable sections don't have asl records */
2226               /* Vma */
2227               if (! ieee_write_2bytes (abfd, ieee_section_base_address_enum)
2228                   || ! ieee_write_byte (abfd,
2229                                         ((bfd_byte)
2230                                          (s->index
2231                                           + IEEE_SECTION_NUMBER_BASE)))
2232                   || ! ieee_write_int (abfd, s->lma))
2233                 return false;
2234             }
2235         }
2236     }
2237
2238   return true;
2239 }
2240
2241
2242 static boolean
2243 do_with_relocs (abfd, s)
2244      bfd *abfd;
2245      asection *s;
2246 {
2247   unsigned int number_of_maus_in_address =
2248     bfd_arch_bits_per_address (abfd) / bfd_arch_bits_per_byte (abfd);
2249   unsigned int relocs_to_go = s->reloc_count;
2250   bfd_byte *stream = ieee_per_section (s)->data;
2251   arelent **p = s->orelocation;
2252   bfd_size_type current_byte_index = 0;
2253
2254   qsort (s->orelocation,
2255          relocs_to_go,
2256          sizeof (arelent **),
2257          comp);
2258
2259   /* Output the section preheader */
2260   if (! ieee_write_byte (abfd, ieee_set_current_section_enum)
2261       || ! ieee_write_byte (abfd,
2262                             (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE))
2263       || ! ieee_write_2bytes (abfd, ieee_set_current_pc_enum)
2264       || ! ieee_write_byte (abfd,
2265                             (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE)))
2266     return false;
2267   if ((abfd->flags & EXEC_P) != 0 && relocs_to_go == 0)
2268     {
2269       if (! ieee_write_int (abfd, s->lma))
2270         return false;
2271     }
2272   else
2273     {
2274       if (! ieee_write_expression (abfd, 0, s->symbol, 0, 0))
2275         return false;
2276     }
2277
2278   if (relocs_to_go == 0)
2279     {
2280       /* If there aren't any relocations then output the load constant
2281          byte opcode rather than the load with relocation opcode */
2282
2283       while (current_byte_index < s->_raw_size)
2284         {
2285           bfd_size_type run;
2286           unsigned int MAXRUN = 127;
2287           run = MAXRUN;
2288           if (run > s->_raw_size - current_byte_index)
2289             {
2290               run = s->_raw_size - current_byte_index;
2291             }
2292
2293           if (run != 0)
2294             {
2295               if (! ieee_write_byte (abfd, ieee_load_constant_bytes_enum))
2296                 return false;
2297               /* Output a stream of bytes */
2298               if (! ieee_write_int (abfd, run))
2299                 return false;
2300               if (bfd_write ((PTR) (stream + current_byte_index),
2301                              1,
2302                              run,
2303                              abfd)
2304                   != run)
2305                 return false;
2306               current_byte_index += run;
2307             }
2308         }
2309     }
2310   else
2311     {
2312       if (! ieee_write_byte (abfd, ieee_load_with_relocation_enum))
2313         return false;
2314
2315       /* Output the data stream as the longest sequence of bytes
2316          possible, allowing for the a reasonable packet size and
2317          relocation stuffs.  */
2318
2319       if ((PTR) stream == (PTR) NULL)
2320         {
2321           /* Outputting a section without data, fill it up */
2322           stream = (unsigned char *) (bfd_alloc (abfd, s->_raw_size));
2323           if (!stream)
2324             return false;
2325           memset ((PTR) stream, 0, (size_t) s->_raw_size);
2326         }
2327       while (current_byte_index < s->_raw_size)
2328         {
2329           bfd_size_type run;
2330           unsigned int MAXRUN = 127;
2331           if (relocs_to_go)
2332             {
2333               run = (*p)->address - current_byte_index;
2334               if (run > MAXRUN)
2335                 run = MAXRUN;
2336             }
2337           else
2338             {
2339               run = MAXRUN;
2340             }
2341           if (run > s->_raw_size - current_byte_index)
2342             {
2343               run = s->_raw_size - current_byte_index;
2344             }
2345
2346           if (run != 0)
2347             {
2348               /* Output a stream of bytes */
2349               if (! ieee_write_int (abfd, run))
2350                 return false;
2351               if (bfd_write ((PTR) (stream + current_byte_index),
2352                              1,
2353                              run,
2354                              abfd)
2355                   != run)
2356                 return false;
2357               current_byte_index += run;
2358             }
2359           /* Output any relocations here */
2360           if (relocs_to_go && (*p) && (*p)->address == current_byte_index)
2361             {
2362               while (relocs_to_go
2363                      && (*p) && (*p)->address == current_byte_index)
2364                 {
2365                   arelent *r = *p;
2366                   bfd_signed_vma ov;
2367
2368 #if 0
2369                   if (r->howto->pc_relative)
2370                     {
2371                       r->addend += current_byte_index;
2372                     }
2373 #endif
2374
2375                   switch (r->howto->size)
2376                     {
2377                     case 2:
2378
2379                       ov = bfd_get_signed_32 (abfd,
2380                                               stream + current_byte_index);
2381                       current_byte_index += 4;
2382                       break;
2383                     case 1:
2384                       ov = bfd_get_signed_16 (abfd,
2385                                               stream + current_byte_index);
2386                       current_byte_index += 2;
2387                       break;
2388                     case 0:
2389                       ov = bfd_get_signed_8 (abfd,
2390                                              stream + current_byte_index);
2391                       current_byte_index++;
2392                       break;
2393                     default:
2394                       ov = 0;
2395                       BFD_FAIL ();
2396                       return false;
2397                     }
2398
2399                   ov &= r->howto->src_mask;
2400
2401                   if (r->howto->pc_relative
2402                       && ! r->howto->pcrel_offset)
2403                     ov += r->address;
2404
2405                   if (! ieee_write_byte (abfd,
2406                                          ieee_function_either_open_b_enum))
2407                     return false;
2408
2409 /*                abort();*/
2410
2411                   if (r->sym_ptr_ptr != (asymbol **) NULL)
2412                     {
2413                       if (! ieee_write_expression (abfd, r->addend + ov,
2414                                                    *(r->sym_ptr_ptr),
2415                                                    r->howto->pc_relative,
2416                                                    s->index))
2417                         return false;
2418                     }
2419                   else
2420                     {
2421                       if (! ieee_write_expression (abfd, r->addend + ov,
2422                                                    (asymbol *) NULL,
2423                                                    r->howto->pc_relative,
2424                                                    s->index))
2425                         return false;
2426                     }
2427
2428                   if (number_of_maus_in_address
2429                       != bfd_get_reloc_size (r->howto))
2430                     {
2431                       if (! ieee_write_int (abfd,
2432                                             bfd_get_reloc_size (r->howto)))
2433                         return false;
2434                     }
2435                   if (! ieee_write_byte (abfd,
2436                                          ieee_function_either_close_b_enum))
2437                     return false;
2438
2439                   relocs_to_go--;
2440                   p++;
2441                 }
2442
2443             }
2444         }
2445     }
2446
2447   return true;
2448 }
2449
2450 /* If there are no relocations in the output section then we can be
2451    clever about how we write.  We block items up into a max of 127
2452    bytes.  */
2453
2454 static boolean
2455 do_as_repeat (abfd, s)
2456      bfd *abfd;
2457      asection *s;
2458 {
2459   if (s->_raw_size)
2460     {
2461       if (! ieee_write_byte (abfd, ieee_set_current_section_enum)
2462           || ! ieee_write_byte (abfd,
2463                                 (bfd_byte) (s->index
2464                                             + IEEE_SECTION_NUMBER_BASE))
2465           || ! ieee_write_byte (abfd, ieee_set_current_pc_enum >> 8)
2466           || ! ieee_write_byte (abfd, ieee_set_current_pc_enum & 0xff)
2467           || ! ieee_write_byte (abfd,
2468                                 (bfd_byte) (s->index
2469                                             + IEEE_SECTION_NUMBER_BASE))
2470           || ! ieee_write_int (abfd, s->lma)
2471           || ! ieee_write_byte (abfd, ieee_repeat_data_enum)
2472           || ! ieee_write_int (abfd, s->_raw_size)
2473           || ! ieee_write_byte (abfd, ieee_load_constant_bytes_enum)
2474           || ! ieee_write_byte (abfd, 1)
2475           || ! ieee_write_byte (abfd, 0))
2476         return false;
2477     }
2478
2479   return true;
2480 }
2481
2482 static boolean
2483 do_without_relocs (abfd, s)
2484      bfd *abfd;
2485      asection *s;
2486 {
2487   bfd_byte *stream = ieee_per_section (s)->data;
2488
2489   if (stream == 0 || ((s->flags & SEC_LOAD) == 0))
2490     {
2491       if (! do_as_repeat (abfd, s))
2492         return false;
2493     }
2494   else
2495     {
2496       unsigned int i;
2497       for (i = 0; i < s->_raw_size; i++)
2498         {
2499           if (stream[i] != 0)
2500             {
2501               if (! do_with_relocs (abfd, s))
2502                 return false;
2503               return true;
2504             }
2505         }
2506       if (! do_as_repeat (abfd, s))
2507         return false;
2508     }
2509
2510   return true;
2511 }
2512
2513
2514 static unsigned char *output_ptr_start;
2515 static unsigned char *output_ptr;
2516 static unsigned char *output_ptr_end;
2517 static unsigned char *input_ptr_start;
2518 static unsigned char *input_ptr;
2519 static unsigned char *input_ptr_end;
2520 static bfd *input_bfd;
2521 static bfd *output_bfd;
2522 static int output_buffer;
2523
2524 static void
2525 fill ()
2526 {
2527   /* FIXME: Check return value.  I'm not sure whether it needs to read
2528      the entire buffer or not.  */
2529   bfd_read ((PTR) input_ptr_start, 1, input_ptr_end - input_ptr_start, input_bfd);
2530   input_ptr = input_ptr_start;
2531 }
2532 static void
2533 flush ()
2534 {
2535   if (bfd_write ((PTR) (output_ptr_start), 1, output_ptr - output_ptr_start,
2536                  output_bfd)
2537       != (bfd_size_type) (output_ptr - output_ptr_start))
2538     abort ();
2539   output_ptr = output_ptr_start;
2540   output_buffer++;
2541 }
2542
2543 #define THIS() ( *input_ptr )
2544 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill(); }
2545 #define OUT(x) { *output_ptr++ = (x); if(output_ptr == output_ptr_end)  flush(); }
2546
2547 static void
2548 write_int (value)
2549      int value;
2550 {
2551   if (value >= 0 && value <= 127)
2552     {
2553       OUT (value);
2554     }
2555   else
2556     {
2557       unsigned int length;
2558       /* How many significant bytes ? */
2559       /* FIXME FOR LONGER INTS */
2560       if (value & 0xff000000)
2561         {
2562           length = 4;
2563         }
2564       else if (value & 0x00ff0000)
2565         {
2566           length = 3;
2567         }
2568       else if (value & 0x0000ff00)
2569         {
2570           length = 2;
2571         }
2572       else
2573         length = 1;
2574
2575       OUT ((int) ieee_number_repeat_start_enum + length);
2576       switch (length)
2577         {
2578         case 4:
2579           OUT (value >> 24);
2580         case 3:
2581           OUT (value >> 16);
2582         case 2:
2583           OUT (value >> 8);
2584         case 1:
2585           OUT (value);
2586         }
2587
2588     }
2589 }
2590
2591 static void
2592 copy_id ()
2593 {
2594   int length = THIS ();
2595   char ch;
2596   OUT (length);
2597   NEXT ();
2598   while (length--)
2599     {
2600       ch = THIS ();
2601       OUT (ch);
2602       NEXT ();
2603     }
2604 }
2605
2606 #define VAR(x) ((x | 0x80))
2607 static void
2608 copy_expression ()
2609 {
2610   int stack[10];
2611   int *tos = stack;
2612   int value = 0;
2613   while (1)
2614     {
2615       switch (THIS ())
2616         {
2617         case 0x84:
2618           NEXT ();
2619           value = THIS ();
2620           NEXT ();
2621           value = (value << 8) | THIS ();
2622           NEXT ();
2623           value = (value << 8) | THIS ();
2624           NEXT ();
2625           value = (value << 8) | THIS ();
2626           NEXT ();
2627           *tos++ = value;
2628           break;
2629         case 0x83:
2630           NEXT ();
2631           value = THIS ();
2632           NEXT ();
2633           value = (value << 8) | THIS ();
2634           NEXT ();
2635           value = (value << 8) | THIS ();
2636           NEXT ();
2637           *tos++ = value;
2638           break;
2639         case 0x82:
2640           NEXT ();
2641           value = THIS ();
2642           NEXT ();
2643           value = (value << 8) | THIS ();
2644           NEXT ();
2645           *tos++ = value;
2646           break;
2647         case 0x81:
2648           NEXT ();
2649           value = THIS ();
2650           NEXT ();
2651           *tos++ = value;
2652           break;
2653         case 0x80:
2654           NEXT ();
2655           *tos++ = 0;
2656           break;
2657         default:
2658           if (THIS () > 0x84)
2659             {
2660               /* Not a number, just bug out with the answer */
2661               write_int (*(--tos));
2662               return;
2663             }
2664           *tos++ = THIS ();
2665           NEXT ();
2666           value = 0;
2667           break;
2668         case 0xa5:
2669           /* PLUS anything */
2670           {
2671             int value = *(--tos);
2672             value += *(--tos);
2673             *tos++ = value;
2674             NEXT ();
2675           }
2676           break;
2677         case VAR ('R'):
2678           {
2679             int section_number;
2680             ieee_data_type *ieee;
2681             asection *s;
2682             NEXT ();
2683             section_number = THIS ();
2684
2685             NEXT ();
2686             ieee = IEEE_DATA (input_bfd);
2687             s = ieee->section_table[section_number];
2688             if (s->output_section)
2689               {
2690                 value = s->output_section->lma;
2691               }
2692             else
2693               {
2694                 value = 0;
2695               }
2696             value += s->output_offset;
2697             *tos++ = value;
2698             value = 0;
2699           }
2700           break;
2701         case 0x90:
2702           {
2703             NEXT ();
2704             write_int (*(--tos));
2705             OUT (0x90);
2706             return;
2707
2708           }
2709         }
2710     }
2711
2712 }
2713
2714 /* Drop the int in the buffer, and copy a null into the gap, which we
2715    will overwrite later */
2716
2717 struct output_buffer_struct
2718 {
2719   unsigned char *ptrp;
2720   int buffer;
2721 };
2722
2723 static void
2724 fill_int (buf)
2725      struct output_buffer_struct *buf;
2726 {
2727   if (buf->buffer == output_buffer)
2728     {
2729       /* Still a chance to output the size */
2730       int value = output_ptr - buf->ptrp + 3;
2731       buf->ptrp[0] = value >> 24;
2732       buf->ptrp[1] = value >> 16;
2733       buf->ptrp[2] = value >> 8;
2734       buf->ptrp[3] = value >> 0;
2735     }
2736 }
2737
2738 static void
2739 drop_int (buf)
2740      struct output_buffer_struct *buf;
2741 {
2742   int type = THIS ();
2743   int ch;
2744   if (type <= 0x84)
2745     {
2746       NEXT ();
2747       switch (type)
2748         {
2749         case 0x84:
2750           ch = THIS ();
2751           NEXT ();
2752         case 0x83:
2753           ch = THIS ();
2754           NEXT ();
2755         case 0x82:
2756           ch = THIS ();
2757           NEXT ();
2758         case 0x81:
2759           ch = THIS ();
2760           NEXT ();
2761         case 0x80:
2762           break;
2763         }
2764     }
2765   OUT (0x84);
2766   buf->ptrp = output_ptr;
2767   buf->buffer = output_buffer;
2768   OUT (0);
2769   OUT (0);
2770   OUT (0);
2771   OUT (0);
2772 }
2773
2774 static void
2775 copy_int ()
2776 {
2777   int type = THIS ();
2778   int ch;
2779   if (type <= 0x84)
2780     {
2781       OUT (type);
2782       NEXT ();
2783       switch (type)
2784         {
2785         case 0x84:
2786           ch = THIS ();
2787           NEXT ();
2788           OUT (ch);
2789         case 0x83:
2790           ch = THIS ();
2791           NEXT ();
2792           OUT (ch);
2793         case 0x82:
2794           ch = THIS ();
2795           NEXT ();
2796           OUT (ch);
2797         case 0x81:
2798           ch = THIS ();
2799           NEXT ();
2800           OUT (ch);
2801         case 0x80:
2802           break;
2803         }
2804     }
2805 }
2806
2807 #define ID copy_id()
2808 #define INT copy_int()
2809 #define EXP copy_expression()
2810 static void copy_till_end ();
2811 #define INTn(q) copy_int()
2812 #define EXPn(q) copy_expression()
2813
2814 static void
2815 f1_record ()
2816 {
2817   int ch;
2818   /* ATN record */
2819   NEXT ();
2820   ch = THIS ();
2821   switch (ch)
2822     {
2823     default:
2824       OUT (0xf1);
2825       OUT (ch);
2826       break;
2827     case 0xc9:
2828       NEXT ();
2829       OUT (0xf1);
2830       OUT (0xc9);
2831       INT;
2832       INT;
2833       ch = THIS ();
2834       switch (ch)
2835         {
2836         case 0x16:
2837           NEXT ();
2838           break;
2839         case 0x01:
2840           NEXT ();
2841           break;
2842         case 0x00:
2843           NEXT ();
2844           INT;
2845           break;
2846         case 0x03:
2847           NEXT ();
2848           INT;
2849           break;
2850         case 0x13:
2851           EXPn (instruction address);
2852           break;
2853         default:
2854           break;
2855         }
2856       break;
2857     case 0xd8:
2858       /* EXternal ref */
2859       NEXT ();
2860       OUT (0xf1);
2861       OUT (0xd8);
2862       EXP;
2863       EXP;
2864       EXP;
2865       EXP;
2866       break;
2867     case 0xce:
2868       NEXT ();
2869       OUT (0xf1);
2870       OUT (0xce);
2871       INT;
2872       INT;
2873       ch = THIS ();
2874       INT;
2875       switch (ch)
2876         {
2877         case 0x01:
2878           INT;
2879           INT;
2880           break;
2881         case 0x02:
2882           INT;
2883           break;
2884         case 0x04:
2885           EXPn (external function);
2886           break;
2887         case 0x05:
2888           break;
2889         case 0x07:
2890           INTn (line number);
2891           INT;
2892         case 0x08:
2893           break;
2894         case 0x0a:
2895           INTn (locked register);
2896           INT;
2897           break;
2898         case 0x3f:
2899           copy_till_end ();
2900           break;
2901         case 0x3e:
2902           copy_till_end ();
2903           break;
2904         case 0x40:
2905           copy_till_end ();
2906           break;
2907         case 0x41:
2908           ID;
2909           break;
2910         }
2911     }
2912
2913 }
2914
2915 static void
2916 f0_record ()
2917 {
2918   /* Attribute record */
2919   NEXT ();
2920   OUT (0xf0);
2921   INTn (Symbol name);
2922   ID;
2923 }
2924
2925 static void
2926 copy_till_end ()
2927 {
2928   int ch = THIS ();
2929   while (1)
2930     {
2931       while (ch <= 0x80)
2932         {
2933           OUT (ch);
2934           NEXT ();
2935           ch = THIS ();
2936         }
2937       switch (ch)
2938         {
2939         case 0x84:
2940           OUT (THIS ());
2941           NEXT ();
2942         case 0x83:
2943           OUT (THIS ());
2944           NEXT ();
2945         case 0x82:
2946           OUT (THIS ());
2947           NEXT ();
2948         case 0x81:
2949           OUT (THIS ());
2950           NEXT ();
2951           OUT (THIS ());
2952           NEXT ();
2953
2954           ch = THIS ();
2955           break;
2956         default:
2957           return;
2958         }
2959     }
2960
2961 }
2962
2963 static void
2964 f2_record ()
2965 {
2966   NEXT ();
2967   OUT (0xf2);
2968   INT;
2969   NEXT ();
2970   OUT (0xce);
2971   INT;
2972   copy_till_end ();
2973 }
2974
2975
2976 static void block ();
2977 static void
2978 f8_record ()
2979 {
2980   int ch;
2981   NEXT ();
2982   ch = THIS ();
2983   switch (ch)
2984     {
2985     case 0x01:
2986     case 0x02:
2987     case 0x03:
2988       /* Unique typedefs for module */
2989       /* GLobal typedefs  */
2990       /* High level module scope beginning */
2991       {
2992         struct output_buffer_struct ob;
2993         NEXT ();
2994         OUT (0xf8);
2995         OUT (ch);
2996         drop_int (&ob);
2997         ID;
2998
2999         block ();
3000
3001         NEXT ();
3002         fill_int (&ob);
3003         OUT (0xf9);
3004       }
3005       break;
3006     case 0x04:
3007       /* Global function */
3008       {
3009         struct output_buffer_struct ob;
3010         NEXT ();
3011         OUT (0xf8);
3012         OUT (0x04);
3013         drop_int (&ob);
3014         ID;
3015         INTn (stack size);
3016         INTn (ret val);
3017         EXPn (offset);
3018
3019         block ();
3020
3021         NEXT ();
3022         OUT (0xf9);
3023         EXPn (size of block);
3024         fill_int (&ob);
3025       }
3026       break;
3027
3028     case 0x05:
3029       /* File name for source line numbers */
3030       {
3031         struct output_buffer_struct ob;
3032         NEXT ();
3033         OUT (0xf8);
3034         OUT (0x05);
3035         drop_int (&ob);
3036         ID;
3037         INTn (year);
3038         INTn (month);
3039         INTn (day);
3040         INTn (hour);
3041         INTn (monute);
3042         INTn (second);
3043         block ();
3044         NEXT ();
3045         OUT (0xf9);
3046         fill_int (&ob);
3047       }
3048       break;
3049
3050     case 0x06:
3051       /* Local function */
3052       {
3053         struct output_buffer_struct ob;
3054         NEXT ();
3055         OUT (0xf8);
3056         OUT (0x06);
3057         drop_int (&ob);
3058         ID;
3059         INTn (stack size);
3060         INTn (type return);
3061         EXPn (offset);
3062         block ();
3063         NEXT ();
3064         OUT (0xf9);
3065         EXPn (size);
3066         fill_int (&ob);
3067       }
3068       break;
3069
3070     case 0x0a:
3071       /* Assembler module scope beginning -*/
3072       {
3073         struct output_buffer_struct ob;
3074
3075         NEXT ();
3076         OUT (0xf8);
3077         OUT (0x0a);
3078         drop_int (&ob);
3079         ID;
3080         ID;
3081         INT;
3082         ID;
3083         INT;
3084         INT;
3085         INT;
3086         INT;
3087         INT;
3088         INT;
3089
3090         block ();
3091
3092         NEXT ();
3093         OUT (0xf9);
3094         fill_int (&ob);
3095       }
3096       break;
3097     case 0x0b:
3098       {
3099         struct output_buffer_struct ob;
3100         NEXT ();
3101         OUT (0xf8);
3102         OUT (0x0b);
3103         drop_int (&ob);
3104         ID;
3105         INT;
3106         INTn (section index);
3107         EXPn (offset);
3108         INTn (stuff);
3109
3110         block ();
3111
3112         OUT (0xf9);
3113         NEXT ();
3114         EXPn (Size in Maus);
3115         fill_int (&ob);
3116       }
3117       break;
3118     }
3119 }
3120
3121 static void
3122 e2_record ()
3123 {
3124   OUT (0xe2);
3125   NEXT ();
3126   OUT (0xce);
3127   NEXT ();
3128   INT;
3129   EXP;
3130 }
3131
3132 static void
3133 block ()
3134 {
3135   int ch;
3136   while (1)
3137     {
3138       ch = THIS ();
3139       switch (ch)
3140         {
3141         case 0xe1:
3142         case 0xe5:
3143           return;
3144         case 0xf9:
3145           return;
3146         case 0xf0:
3147           f0_record ();
3148           break;
3149         case 0xf1:
3150           f1_record ();
3151           break;
3152         case 0xf2:
3153           f2_record ();
3154           break;
3155         case 0xf8:
3156           f8_record ();
3157           break;
3158         case 0xe2:
3159           e2_record ();
3160           break;
3161
3162         }
3163     }
3164 }
3165
3166
3167
3168 /* relocate_debug,
3169    moves all the debug information from the source bfd to the output
3170    bfd, and relocates any expressions it finds
3171 */
3172
3173 static void
3174 relocate_debug (output, input)
3175      bfd *output ATTRIBUTE_UNUSED;
3176      bfd *input;
3177 {
3178 #define IBS 400
3179 #define OBS 400
3180   unsigned char input_buffer[IBS];
3181
3182   input_ptr_start = input_ptr = input_buffer;
3183   input_ptr_end = input_buffer + IBS;
3184   input_bfd = input;
3185   /* FIXME: Check return value.  I'm not sure whether it needs to read
3186      the entire buffer or not.  */
3187   bfd_read ((PTR) input_ptr_start, 1, IBS, input);
3188   block ();
3189 }
3190
3191 /*
3192   During linking, we we told about the bfds which made up our
3193   contents, we have a list of them. They will still be open, so go to
3194   the debug info in each, and copy it out, relocating it as we go.
3195 */
3196
3197 static boolean
3198 ieee_write_debug_part (abfd)
3199      bfd *abfd;
3200 {
3201   ieee_data_type *ieee = IEEE_DATA (abfd);
3202   bfd_chain_type *chain = ieee->chain_root;
3203   unsigned char output_buffer[OBS];
3204   boolean some_debug = false;
3205   file_ptr here = bfd_tell (abfd);
3206
3207   output_ptr_start = output_ptr = output_buffer;
3208   output_ptr_end = output_buffer + OBS;
3209   output_ptr = output_buffer;
3210   output_bfd = abfd;
3211
3212   if (chain == (bfd_chain_type *) NULL)
3213     {
3214       asection *s;
3215
3216       for (s = abfd->sections; s != NULL; s = s->next)
3217         if ((s->flags & SEC_DEBUGGING) != 0)
3218           break;
3219       if (s == NULL)
3220         {
3221           ieee->w.r.debug_information_part = 0;
3222           return true;
3223         }
3224
3225       ieee->w.r.debug_information_part = here;
3226       if (bfd_write (s->contents, 1, s->_raw_size, abfd) != s->_raw_size)
3227         return false;
3228     }
3229   else
3230     {
3231       while (chain != (bfd_chain_type *) NULL)
3232         {
3233           bfd *entry = chain->this;
3234           ieee_data_type *entry_ieee = IEEE_DATA (entry);
3235           if (entry_ieee->w.r.debug_information_part)
3236             {
3237               if (bfd_seek (entry, entry_ieee->w.r.debug_information_part,
3238                             SEEK_SET)
3239                   != 0)
3240                 return false;
3241               relocate_debug (abfd, entry);
3242             }
3243
3244           chain = chain->next;
3245         }
3246       if (some_debug)
3247         {
3248           ieee->w.r.debug_information_part = here;
3249         }
3250       else
3251         {
3252           ieee->w.r.debug_information_part = 0;
3253         }
3254
3255       flush ();
3256     }
3257
3258   return true;
3259 }
3260
3261 /* Write the data in an ieee way.  */
3262
3263 static boolean
3264 ieee_write_data_part (abfd)
3265      bfd *abfd;
3266 {
3267   asection *s;
3268   ieee_data_type *ieee = IEEE_DATA (abfd);
3269   ieee->w.r.data_part = bfd_tell (abfd);
3270   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
3271     {
3272       /* Skip sections that have no loadable contents (.bss,
3273          debugging, etc.)  */
3274       if ((s->flags & SEC_LOAD) == 0)
3275         continue;
3276
3277       /* Sort the reloc records so we can insert them in the correct
3278          places */
3279       if (s->reloc_count != 0)
3280         {
3281           if (! do_with_relocs (abfd, s))
3282             return false;
3283         }
3284       else
3285         {
3286           if (! do_without_relocs (abfd, s))
3287             return false;
3288         }
3289     }
3290
3291   return true;
3292 }
3293
3294
3295 static boolean
3296 init_for_output (abfd)
3297      bfd *abfd;
3298 {
3299   asection *s;
3300   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
3301     {
3302       if ((s->flags & SEC_DEBUGGING) != 0)
3303         continue;
3304       if (s->_raw_size != 0)
3305         {
3306           ieee_per_section (s)->data = (bfd_byte *) (bfd_alloc (abfd, s->_raw_size));
3307           if (!ieee_per_section (s)->data)
3308             return false;
3309         }
3310     }
3311   return true;
3312 }
3313 \f
3314 /** exec and core file sections */
3315
3316 /* set section contents is complicated with IEEE since the format is
3317 * not a byte image, but a record stream.
3318 */
3319 boolean
3320 ieee_set_section_contents (abfd, section, location, offset, count)
3321      bfd *abfd;
3322      sec_ptr section;
3323      PTR location;
3324      file_ptr offset;
3325      bfd_size_type count;
3326 {
3327   if ((section->flags & SEC_DEBUGGING) != 0)
3328     {
3329       if (section->contents == NULL)
3330         {
3331           section->contents = ((unsigned char *)
3332                                bfd_alloc (abfd, section->_raw_size));
3333           if (section->contents == NULL)
3334             return false;
3335         }
3336       /* bfd_set_section_contents has already checked that everything
3337          is within range.  */
3338       memcpy (section->contents + offset, location, count);
3339       return true;
3340     }
3341
3342   if (ieee_per_section (section)->data == (bfd_byte *) NULL)
3343     {
3344       if (!init_for_output (abfd))
3345         return false;
3346     }
3347   memcpy ((PTR) (ieee_per_section (section)->data + offset),
3348           (PTR) location,
3349           (unsigned int) count);
3350   return true;
3351 }
3352
3353 /* Write the external symbols of a file.  IEEE considers two sorts of
3354    external symbols, public, and referenced.  It uses to internal
3355    forms to index them as well.  When we write them out we turn their
3356    symbol values into indexes from the right base.  */
3357
3358 static boolean
3359 ieee_write_external_part (abfd)
3360      bfd *abfd;
3361 {
3362   asymbol **q;
3363   ieee_data_type *ieee = IEEE_DATA (abfd);
3364
3365   unsigned int reference_index = IEEE_REFERENCE_BASE;
3366   unsigned int public_index = IEEE_PUBLIC_BASE + 2;
3367   file_ptr here = bfd_tell (abfd);
3368   boolean hadone = false;
3369   if (abfd->outsymbols != (asymbol **) NULL)
3370     {
3371
3372       for (q = abfd->outsymbols; *q != (asymbol *) NULL; q++)
3373         {
3374           asymbol *p = *q;
3375           if (bfd_is_und_section (p->section))
3376             {
3377               /* This must be a symbol reference .. */
3378               if (! ieee_write_byte (abfd, ieee_external_reference_enum)
3379                   || ! ieee_write_int (abfd, reference_index)
3380                   || ! ieee_write_id (abfd, p->name))
3381                 return false;
3382               p->value = reference_index;
3383               reference_index++;
3384               hadone = true;
3385             }
3386           else if (bfd_is_com_section (p->section))
3387             {
3388               /* This is a weak reference */
3389               if (! ieee_write_byte (abfd, ieee_external_reference_enum)
3390                   || ! ieee_write_int (abfd, reference_index)
3391                   || ! ieee_write_id (abfd, p->name)
3392                   || ! ieee_write_byte (abfd,
3393                                         ieee_weak_external_reference_enum)
3394                   || ! ieee_write_int (abfd, reference_index)
3395                   || ! ieee_write_int (abfd, p->value))
3396                 return false;
3397               p->value = reference_index;
3398               reference_index++;
3399               hadone = true;
3400             }
3401           else if (p->flags & BSF_GLOBAL)
3402             {
3403               /* This must be a symbol definition */
3404
3405               if (! ieee_write_byte (abfd, ieee_external_symbol_enum)
3406                   || ! ieee_write_int (abfd, public_index)
3407                   || ! ieee_write_id (abfd, p->name)
3408                   || ! ieee_write_2bytes (abfd, ieee_attribute_record_enum)
3409                   || ! ieee_write_int (abfd, public_index)
3410                   || ! ieee_write_byte (abfd, 15) /* instruction address */
3411                   || ! ieee_write_byte (abfd, 19) /* static symbol */
3412                   || ! ieee_write_byte (abfd, 1)) /* one of them */
3413                 return false;
3414
3415               /* Write out the value */
3416               if (! ieee_write_2bytes (abfd, ieee_value_record_enum)
3417                   || ! ieee_write_int (abfd, public_index))
3418                 return false;
3419               if (! bfd_is_abs_section (p->section))
3420                 {
3421                   if (abfd->flags & EXEC_P)
3422                     {
3423                       /* If fully linked, then output all symbols
3424                          relocated */
3425                       if (! (ieee_write_int
3426                              (abfd,
3427                               (p->value
3428                                + p->section->output_offset
3429                                + p->section->output_section->vma))))
3430                         return false;
3431                     }
3432                   else
3433                     {
3434                       if (! (ieee_write_expression
3435                              (abfd,
3436                               p->value + p->section->output_offset,
3437                               p->section->output_section->symbol,
3438                               false, 0)))
3439                         return false;
3440                     }
3441                 }
3442               else
3443                 {
3444                   if (! ieee_write_expression (abfd,
3445                                                p->value,
3446                                                bfd_abs_section_ptr->symbol,
3447                                                false, 0))
3448                     return false;
3449                 }
3450               p->value = public_index;
3451               public_index++;
3452               hadone = true;
3453             }
3454           else
3455             {
3456               /* This can happen - when there are gaps in the symbols read */
3457               /* from an input ieee file */
3458             }
3459         }
3460     }
3461   if (hadone)
3462     ieee->w.r.external_part = here;
3463
3464   return true;
3465 }
3466
3467
3468 static CONST unsigned char exten[] =
3469 {
3470   0xf0, 0x20, 0x00,
3471   0xf1, 0xce, 0x20, 0x00, 37, 3, 3,     /* Set version 3 rev 3          */
3472   0xf1, 0xce, 0x20, 0x00, 39, 2,/* keep symbol in  original case */
3473   0xf1, 0xce, 0x20, 0x00, 38    /* set object type relocateable to x */
3474 };
3475
3476 static CONST unsigned char envi[] =
3477 {
3478   0xf0, 0x21, 0x00,
3479
3480 /*    0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
3481     0x19, 0x2c,
3482 */
3483   0xf1, 0xce, 0x21, 00, 52, 0x00,       /* exec ok */
3484
3485   0xf1, 0xce, 0x21, 0, 53, 0x03,/* host unix */
3486 /*    0xf1, 0xce, 0x21, 0, 54, 2,1,1    tool & version # */
3487 };
3488
3489 static boolean
3490 ieee_write_me_part (abfd)
3491      bfd *abfd;
3492 {
3493   ieee_data_type *ieee = IEEE_DATA (abfd);
3494   ieee->w.r.trailer_part = bfd_tell (abfd);
3495   if (abfd->start_address)
3496     {
3497       if (! ieee_write_2bytes (abfd, ieee_value_starting_address_enum)
3498           || ! ieee_write_byte (abfd, ieee_function_either_open_b_enum)
3499           || ! ieee_write_int (abfd, abfd->start_address)
3500           || ! ieee_write_byte (abfd, ieee_function_either_close_b_enum))
3501         return false;
3502     }
3503   ieee->w.r.me_record = bfd_tell (abfd);
3504   if (! ieee_write_byte (abfd, ieee_module_end_enum))
3505     return false;
3506   return true;
3507 }
3508
3509 /* Write out the IEEE processor ID.  */
3510
3511 static boolean
3512 ieee_write_processor (abfd)
3513      bfd *abfd;
3514 {
3515   const bfd_arch_info_type *arch;
3516
3517   arch = bfd_get_arch_info (abfd);
3518   switch (arch->arch)
3519     {
3520     default:
3521       if (! ieee_write_id (abfd, bfd_printable_name (abfd)))
3522         return false;
3523       break;
3524
3525     case bfd_arch_a29k:
3526       if (! ieee_write_id (abfd, "29000"))
3527         return false;
3528       break;
3529
3530     case bfd_arch_h8300:
3531       if (! ieee_write_id (abfd, "H8/300"))
3532         return false;
3533       break;
3534
3535     case bfd_arch_h8500:
3536       if (! ieee_write_id (abfd, "H8/500"))
3537         return false;
3538       break;
3539
3540     case bfd_arch_i960:
3541       switch (arch->mach)
3542         {
3543         default:
3544         case bfd_mach_i960_core:
3545         case bfd_mach_i960_ka_sa:
3546           if (! ieee_write_id (abfd, "80960KA"))
3547             return false;
3548           break;
3549
3550         case bfd_mach_i960_kb_sb:
3551           if (! ieee_write_id (abfd, "80960KB"))
3552             return false;
3553           break;
3554
3555         case bfd_mach_i960_ca:
3556           if (! ieee_write_id (abfd, "80960CA"))
3557             return false;
3558           break;
3559
3560         case bfd_mach_i960_mc:
3561         case bfd_mach_i960_xa:
3562           if (! ieee_write_id (abfd, "80960MC"))
3563             return false;
3564           break;
3565         }
3566       break;
3567
3568     case bfd_arch_m68k:
3569       {
3570         const char *id;
3571
3572         switch (arch->mach)
3573           {
3574           default:              id = "68020"; break;
3575           case bfd_mach_m68000: id = "68000"; break;
3576           case bfd_mach_m68008: id = "68008"; break;
3577           case bfd_mach_m68010: id = "68010"; break;
3578           case bfd_mach_m68020: id = "68020"; break;
3579           case bfd_mach_m68030: id = "68030"; break;
3580           case bfd_mach_m68040: id = "68040"; break;
3581           case bfd_mach_m68060: id = "68060"; break;
3582           case bfd_mach_cpu32:  id = "cpu32"; break;
3583           }
3584
3585         if (! ieee_write_id (abfd, id))
3586           return false;
3587       }
3588       break;
3589     }
3590
3591   return true;
3592 }
3593
3594 boolean
3595 ieee_write_object_contents (abfd)
3596      bfd *abfd;
3597 {
3598   ieee_data_type *ieee = IEEE_DATA (abfd);
3599   unsigned int i;
3600   file_ptr old;
3601
3602   /* Fast forward over the header area */
3603   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
3604     return false;
3605
3606   if (! ieee_write_byte (abfd, ieee_module_beginning_enum)
3607       || ! ieee_write_processor (abfd)
3608       || ! ieee_write_id (abfd, abfd->filename))
3609     return false;
3610
3611   /* Fast forward over the variable bits */
3612   if (! ieee_write_byte (abfd, ieee_address_descriptor_enum))
3613     return false;
3614
3615   /* Bits per MAU */
3616   if (! ieee_write_byte (abfd, (bfd_byte) (bfd_arch_bits_per_byte (abfd))))
3617     return false;
3618   /* MAU's per address */
3619   if (! ieee_write_byte (abfd,
3620                          (bfd_byte) (bfd_arch_bits_per_address (abfd)
3621                                      / bfd_arch_bits_per_byte (abfd))))
3622     return false;
3623
3624   old = bfd_tell (abfd);
3625   if (bfd_seek (abfd, (file_ptr) (8 * N_W_VARIABLES), SEEK_CUR) != 0)
3626     return false;
3627
3628   ieee->w.r.extension_record = bfd_tell (abfd);
3629   if (bfd_write ((char *) exten, 1, sizeof (exten), abfd) != sizeof (exten))
3630     return false;
3631   if (abfd->flags & EXEC_P)
3632     {
3633       if (! ieee_write_byte (abfd, 0x1)) /* Absolute */
3634         return false;
3635     }
3636   else
3637     {
3638       if (! ieee_write_byte (abfd, 0x2)) /* Relocateable */
3639         return false;
3640     }
3641
3642   ieee->w.r.environmental_record = bfd_tell (abfd);
3643   if (bfd_write ((char *) envi, 1, sizeof (envi), abfd) != sizeof (envi))
3644     return false;
3645
3646   /* The HP emulator database requires a timestamp in the file.  */
3647   {
3648     time_t now;
3649     const struct tm *t;
3650
3651     time (&now);
3652     t = (struct tm *) localtime (&now);
3653     if (! ieee_write_2bytes (abfd, (int) ieee_atn_record_enum)
3654         || ! ieee_write_byte (abfd, 0x21)
3655         || ! ieee_write_byte (abfd, 0)
3656         || ! ieee_write_byte (abfd, 50)
3657         || ! ieee_write_int (abfd, t->tm_year + 1900)
3658         || ! ieee_write_int (abfd, t->tm_mon + 1)
3659         || ! ieee_write_int (abfd, t->tm_mday)
3660         || ! ieee_write_int (abfd, t->tm_hour)
3661         || ! ieee_write_int (abfd, t->tm_min)
3662         || ! ieee_write_int (abfd, t->tm_sec))
3663       return false;
3664   }
3665
3666   output_bfd = abfd;
3667
3668   flush ();
3669
3670   if (! ieee_write_section_part (abfd))
3671     return false;
3672   /* First write the symbols.  This changes their values into table
3673     indeces so we cant use it after this point.  */
3674   if (! ieee_write_external_part (abfd))
3675     return false;
3676
3677   /*  ieee_write_byte(abfd, ieee_record_seperator_enum);*/
3678
3679   /*  ieee_write_byte(abfd, ieee_record_seperator_enum);*/
3680
3681
3682   /* Write any debugs we have been told about.  */
3683   if (! ieee_write_debug_part (abfd))
3684     return false;
3685
3686   /* Can only write the data once the symbols have been written, since
3687      the data contains relocation information which points to the
3688      symbols.  */
3689   if (! ieee_write_data_part (abfd))
3690     return false;
3691
3692   /* At the end we put the end!  */
3693   if (! ieee_write_me_part (abfd))
3694     return false;
3695
3696   /* Generate the header */
3697   if (bfd_seek (abfd, old, SEEK_SET) != 0)
3698     return false;
3699
3700   for (i = 0; i < N_W_VARIABLES; i++)
3701     {
3702       if (! ieee_write_2bytes (abfd, ieee_assign_value_to_variable_enum)
3703           || ! ieee_write_byte (abfd, (bfd_byte) i)
3704           || ! ieee_write_int5_out (abfd, ieee->w.offset[i]))
3705         return false;
3706     }
3707
3708   return true;
3709 }
3710 \f
3711 /* Native-level interface to symbols. */
3712
3713 /* We read the symbols into a buffer, which is discarded when this
3714    function exits.  We read the strings into a buffer large enough to
3715    hold them all plus all the cached symbol entries. */
3716
3717 asymbol *
3718 ieee_make_empty_symbol (abfd)
3719      bfd *abfd;
3720 {
3721   ieee_symbol_type *new =
3722     (ieee_symbol_type *) bfd_zmalloc (sizeof (ieee_symbol_type));
3723   if (!new)
3724     return NULL;
3725   new->symbol.the_bfd = abfd;
3726   return &new->symbol;
3727 }
3728
3729 static bfd *
3730 ieee_openr_next_archived_file (arch, prev)
3731      bfd *arch;
3732      bfd *prev;
3733 {
3734   ieee_ar_data_type *ar = IEEE_AR_DATA (arch);
3735   /* take the next one from the arch state, or reset */
3736   if (prev == (bfd *) NULL)
3737     {
3738       /* Reset the index - the first two entries are bogus*/
3739       ar->element_index = 2;
3740     }
3741   while (true)
3742     {
3743       ieee_ar_obstack_type *p = ar->elements + ar->element_index;
3744       ar->element_index++;
3745       if (ar->element_index <= ar->element_count)
3746         {
3747           if (p->file_offset != (file_ptr) 0)
3748             {
3749               if (p->abfd == (bfd *) NULL)
3750                 {
3751                   p->abfd = _bfd_create_empty_archive_element_shell (arch);
3752                   p->abfd->origin = p->file_offset;
3753                 }
3754               return p->abfd;
3755             }
3756         }
3757       else
3758         {
3759           bfd_set_error (bfd_error_no_more_archived_files);
3760           return (bfd *) NULL;
3761         }
3762
3763     }
3764 }
3765
3766 static boolean
3767 ieee_find_nearest_line (abfd,
3768                         section,
3769                         symbols,
3770                         offset,
3771                         filename_ptr,
3772                         functionname_ptr,
3773                         line_ptr)
3774      bfd *abfd ATTRIBUTE_UNUSED;
3775      asection *section ATTRIBUTE_UNUSED;
3776      asymbol **symbols ATTRIBUTE_UNUSED;
3777      bfd_vma offset ATTRIBUTE_UNUSED;
3778      const char **filename_ptr ATTRIBUTE_UNUSED;
3779      const char **functionname_ptr ATTRIBUTE_UNUSED;
3780      unsigned int *line_ptr ATTRIBUTE_UNUSED;
3781 {
3782   return false;
3783 }
3784
3785 static int
3786 ieee_generic_stat_arch_elt (abfd, buf)
3787      bfd *abfd;
3788      struct stat *buf;
3789 {
3790   ieee_ar_data_type *ar = (ieee_ar_data_type *) NULL;
3791   ieee_data_type *ieee;
3792
3793   if (abfd->my_archive != NULL)
3794     ar = abfd->my_archive->tdata.ieee_ar_data;
3795   if (ar == (ieee_ar_data_type *) NULL)
3796     {
3797       bfd_set_error (bfd_error_invalid_operation);
3798       return -1;
3799     }
3800
3801   if (IEEE_DATA (abfd) == NULL)
3802     {
3803       if (ieee_object_p (abfd) == NULL)
3804         {
3805           bfd_set_error (bfd_error_wrong_format);
3806           return -1;
3807         }
3808     }
3809
3810   ieee = IEEE_DATA (abfd);
3811
3812   buf->st_size = ieee->w.r.me_record + 1;
3813   buf->st_mode = 0644;
3814   return 0;
3815 }
3816
3817 static int
3818 ieee_sizeof_headers (abfd, x)
3819      bfd *abfd ATTRIBUTE_UNUSED;
3820      boolean x ATTRIBUTE_UNUSED;
3821 {
3822   return 0;
3823 }
3824
3825
3826 /* The debug info routines are never used.  */
3827 #if 0
3828
3829 static void
3830 ieee_bfd_debug_info_start (abfd)
3831      bfd *abfd;
3832 {
3833
3834 }
3835
3836 static void
3837 ieee_bfd_debug_info_end (abfd)
3838      bfd *abfd;
3839 {
3840
3841 }
3842
3843
3844 /* Add this section to the list of sections we have debug info for, to
3845    be ready to output it at close time
3846    */
3847 static void
3848 ieee_bfd_debug_info_accumulate (abfd, section)
3849      bfd *abfd;
3850      asection *section;
3851 {
3852   ieee_data_type *ieee = IEEE_DATA (section->owner);
3853   ieee_data_type *output_ieee = IEEE_DATA (abfd);
3854   /* can only accumulate data from other ieee bfds */
3855   if (section->owner->xvec != abfd->xvec)
3856     return;
3857   /* Only bother once per bfd */
3858   if (ieee->done_debug == true)
3859     return;
3860   ieee->done_debug = true;
3861
3862   /* Don't bother if there is no debug info */
3863   if (ieee->w.r.debug_information_part == 0)
3864     return;
3865
3866
3867   /* Add to chain */
3868   {
3869     bfd_chain_type *n = (bfd_chain_type *) bfd_alloc (abfd, sizeof (bfd_chain_type));
3870     if (!n)
3871       abort ();         /* FIXME */
3872     n->this = section->owner;
3873     n->next = (bfd_chain_type *) NULL;
3874
3875     if (output_ieee->chain_head)
3876       {
3877         output_ieee->chain_head->next = n;
3878       }
3879     else
3880       {
3881         output_ieee->chain_root = n;
3882
3883       }
3884     output_ieee->chain_head = n;
3885   }
3886 }
3887
3888 #endif
3889
3890 #define ieee_close_and_cleanup _bfd_generic_close_and_cleanup
3891 #define ieee_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
3892
3893 #define ieee_slurp_armap bfd_true
3894 #define ieee_slurp_extended_name_table bfd_true
3895 #define ieee_construct_extended_name_table \
3896   ((boolean (*) PARAMS ((bfd *, char **, bfd_size_type *, const char **))) \
3897    bfd_true)
3898 #define ieee_truncate_arname bfd_dont_truncate_arname
3899 #define ieee_write_armap \
3900   ((boolean (*) \
3901     PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int))) \
3902    bfd_true)
3903 #define ieee_read_ar_hdr bfd_nullvoidptr
3904 #define ieee_update_armap_timestamp bfd_true
3905 #define ieee_get_elt_at_index _bfd_generic_get_elt_at_index
3906
3907 #define ieee_bfd_is_local_label_name bfd_generic_is_local_label_name
3908 #define ieee_get_lineno _bfd_nosymbols_get_lineno
3909 #define ieee_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
3910 #define ieee_read_minisymbols _bfd_generic_read_minisymbols
3911 #define ieee_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
3912
3913 #define ieee_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
3914
3915 #define ieee_set_arch_mach _bfd_generic_set_arch_mach
3916
3917 #define ieee_get_section_contents_in_window \
3918   _bfd_generic_get_section_contents_in_window
3919 #define ieee_bfd_get_relocated_section_contents \
3920   bfd_generic_get_relocated_section_contents
3921 #define ieee_bfd_relax_section bfd_generic_relax_section
3922 #define ieee_bfd_gc_sections bfd_generic_gc_sections
3923 #define ieee_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
3924 #define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols
3925 #define ieee_bfd_final_link _bfd_generic_final_link
3926 #define ieee_bfd_link_split_section  _bfd_generic_link_split_section
3927
3928 /*SUPPRESS 460 */
3929 const bfd_target ieee_vec =
3930 {
3931   "ieee",                       /* name */
3932   bfd_target_ieee_flavour,
3933   BFD_ENDIAN_UNKNOWN,           /* target byte order */
3934   BFD_ENDIAN_UNKNOWN,           /* target headers byte order */
3935   (HAS_RELOC | EXEC_P |         /* object flags */
3936    HAS_LINENO | HAS_DEBUG |
3937    HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
3938   (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
3939    | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
3940   '_',                          /* leading underscore */
3941   ' ',                          /* ar_pad_char */
3942   16,                           /* ar_max_namelen */
3943   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
3944   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
3945   bfd_getb16, bfd_getb_signed_16, bfd_putb16,   /* data */
3946   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
3947   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
3948   bfd_getb16, bfd_getb_signed_16, bfd_putb16,   /* hdrs */
3949
3950   {_bfd_dummy_target,
3951    ieee_object_p,               /* bfd_check_format */
3952    ieee_archive_p,
3953    _bfd_dummy_target,
3954   },
3955   {
3956     bfd_false,
3957     ieee_mkobject,
3958     _bfd_generic_mkarchive,
3959     bfd_false
3960   },
3961   {
3962     bfd_false,
3963     ieee_write_object_contents,
3964     _bfd_write_archive_contents,
3965     bfd_false,
3966   },
3967
3968   BFD_JUMP_TABLE_GENERIC (ieee),
3969   BFD_JUMP_TABLE_COPY (_bfd_generic),
3970   BFD_JUMP_TABLE_CORE (_bfd_nocore),
3971   BFD_JUMP_TABLE_ARCHIVE (ieee),
3972   BFD_JUMP_TABLE_SYMBOLS (ieee),
3973   BFD_JUMP_TABLE_RELOCS (ieee),
3974   BFD_JUMP_TABLE_WRITE (ieee),
3975   BFD_JUMP_TABLE_LINK (ieee),
3976   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
3977
3978   NULL,
3979   
3980   (PTR) 0
3981 };