Add new field to bfd_target structure.
[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
1284   if (ieee->w.r.debug_information_part == 0)
1285     return true;
1286
1287   sec = bfd_make_section (abfd, ".debug");
1288   if (sec == NULL)
1289     return false;
1290   sec->flags |= SEC_DEBUGGING | SEC_HAS_CONTENTS;
1291   sec->filepos = ieee->w.r.debug_information_part;
1292   sec->_raw_size = ieee->w.r.data_part - ieee->w.r.debug_information_part;
1293
1294   return true;
1295 }
1296 \f
1297 /***********************************************************************
1298 *  archive stuff
1299 */
1300
1301 const bfd_target *
1302 ieee_archive_p (abfd)
1303      bfd *abfd;
1304 {
1305   char *library;
1306   unsigned int i;
1307   unsigned char buffer[512];
1308   file_ptr buffer_offset = 0;
1309   ieee_ar_data_type *save = abfd->tdata.ieee_ar_data;
1310   ieee_ar_data_type *ieee;
1311   unsigned int alc_elts;
1312   ieee_ar_obstack_type *elts = NULL;
1313
1314   abfd->tdata.ieee_ar_data =
1315     (ieee_ar_data_type *) bfd_alloc (abfd, sizeof (ieee_ar_data_type));
1316   if (!abfd->tdata.ieee_ar_data)
1317     goto error_return;
1318   ieee = IEEE_AR_DATA (abfd);
1319
1320   /* FIXME: Check return value.  I'm not sure whether it needs to read
1321      the entire buffer or not.  */
1322   bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd);
1323
1324   ieee->h.first_byte = buffer;
1325   ieee->h.input_p = buffer;
1326
1327   ieee->h.abfd = abfd;
1328
1329   if (this_byte (&(ieee->h)) != Module_Beginning)
1330     {
1331       abfd->tdata.ieee_ar_data = save;
1332       goto error_return;
1333     }
1334
1335   next_byte (&(ieee->h));
1336   library = read_id (&(ieee->h));
1337   if (strcmp (library, "LIBRARY") != 0)
1338     {
1339       bfd_release (abfd, ieee);
1340       abfd->tdata.ieee_ar_data = save;
1341       goto error_return;
1342     }
1343   /* Throw away the filename */
1344   read_id (&(ieee->h));
1345
1346   ieee->element_count = 0;
1347   ieee->element_index = 0;
1348
1349   next_byte (&(ieee->h));       /* Drop the ad part */
1350   must_parse_int (&(ieee->h));  /* And the two dummy numbers */
1351   must_parse_int (&(ieee->h));
1352
1353   alc_elts = 10;
1354   elts = (ieee_ar_obstack_type *) bfd_malloc (alc_elts * sizeof *elts);
1355   if (elts == NULL)
1356     goto error_return;
1357
1358   /* Read the index of the BB table */
1359   while (1)
1360     {
1361       int rec;
1362       ieee_ar_obstack_type *t;
1363
1364       rec = read_2bytes (&(ieee->h));
1365       if (rec != (int) ieee_assign_value_to_variable_enum)
1366         break;
1367
1368       if (ieee->element_count >= alc_elts)
1369         {
1370           ieee_ar_obstack_type *n;
1371
1372           alc_elts *= 2;
1373           n = ((ieee_ar_obstack_type *)
1374                bfd_realloc (elts, alc_elts * sizeof *elts));
1375           if (n == NULL)
1376             goto error_return;
1377           elts = n;
1378         }
1379
1380       t = &elts[ieee->element_count];
1381       ieee->element_count++;
1382
1383       must_parse_int (&(ieee->h));
1384       t->file_offset = must_parse_int (&(ieee->h));
1385       t->abfd = (bfd *) NULL;
1386
1387       /* Make sure that we don't go over the end of the buffer */
1388
1389       if ((size_t) ieee_pos (abfd) > sizeof (buffer) / 2)
1390         {
1391           /* Past half way, reseek and reprime */
1392           buffer_offset += ieee_pos (abfd);
1393           if (bfd_seek (abfd, buffer_offset, SEEK_SET) != 0)
1394             goto error_return;
1395           /* FIXME: Check return value.  I'm not sure whether it needs
1396              to read the entire buffer or not.  */
1397           bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd);
1398           ieee->h.first_byte = buffer;
1399           ieee->h.input_p = buffer;
1400         }
1401     }
1402
1403   ieee->elements = ((ieee_ar_obstack_type *)
1404                     bfd_alloc (abfd,
1405                                ieee->element_count * sizeof *ieee->elements));
1406   if (ieee->elements == NULL)
1407     goto error_return;
1408   memcpy (ieee->elements, elts,
1409           ieee->element_count * sizeof *ieee->elements);
1410   free (elts);
1411   elts = NULL;
1412
1413   /* Now scan the area again, and replace BB offsets with file */
1414   /* offsets */
1415
1416   for (i = 2; i < ieee->element_count; i++)
1417     {
1418       if (bfd_seek (abfd, ieee->elements[i].file_offset, SEEK_SET) != 0)
1419         goto error_return;
1420       /* FIXME: Check return value.  I'm not sure whether it needs to
1421          read the entire buffer or not.  */
1422       bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd);
1423       ieee->h.first_byte = buffer;
1424       ieee->h.input_p = buffer;
1425
1426       next_byte (&(ieee->h));   /* Drop F8 */
1427       next_byte (&(ieee->h));   /* Drop 14 */
1428       must_parse_int (&(ieee->h));      /* Drop size of block */
1429       if (must_parse_int (&(ieee->h)) != 0)
1430         {
1431           /* This object has been deleted */
1432           ieee->elements[i].file_offset = 0;
1433         }
1434       else
1435         {
1436           ieee->elements[i].file_offset = must_parse_int (&(ieee->h));
1437         }
1438     }
1439
1440   /*  abfd->has_armap = ;*/
1441
1442   return abfd->xvec;
1443
1444  error_return:
1445   if (elts != NULL)
1446     free (elts);
1447   return NULL;
1448 }
1449
1450 static boolean
1451 ieee_mkobject (abfd)
1452      bfd *abfd;
1453 {
1454   abfd->tdata.ieee_data = (ieee_data_type *) bfd_zalloc (abfd, sizeof (ieee_data_type));
1455   return abfd->tdata.ieee_data ? true : false;
1456 }
1457
1458 const bfd_target *
1459 ieee_object_p (abfd)
1460      bfd *abfd;
1461 {
1462   char *processor;
1463   unsigned int part;
1464   ieee_data_type *ieee;
1465   unsigned char buffer[300];
1466   ieee_data_type *save = IEEE_DATA (abfd);
1467
1468   abfd->tdata.ieee_data = 0;
1469   ieee_mkobject (abfd);
1470
1471   ieee = IEEE_DATA (abfd);
1472   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
1473     goto fail;
1474   /* Read the first few bytes in to see if it makes sense */
1475   /* FIXME: Check return value.  I'm not sure whether it needs to read
1476      the entire buffer or not.  */
1477   bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd);
1478
1479   ieee->h.input_p = buffer;
1480   if (this_byte_and_next (&(ieee->h)) != Module_Beginning)
1481     goto got_wrong_format;
1482
1483   ieee->read_symbols = false;
1484   ieee->read_data = false;
1485   ieee->section_count = 0;
1486   ieee->external_symbol_max_index = 0;
1487   ieee->external_symbol_min_index = IEEE_PUBLIC_BASE;
1488   ieee->external_reference_min_index = IEEE_REFERENCE_BASE;
1489   ieee->external_reference_max_index = 0;
1490   ieee->h.abfd = abfd;
1491   ieee->section_table = NULL;
1492   ieee->section_table_size = 0;
1493
1494   processor = ieee->mb.processor = read_id (&(ieee->h));
1495   if (strcmp (processor, "LIBRARY") == 0)
1496     goto got_wrong_format;
1497   ieee->mb.module_name = read_id (&(ieee->h));
1498   if (abfd->filename == (CONST char *) NULL)
1499     {
1500       abfd->filename = ieee->mb.module_name;
1501     }
1502   /* Determine the architecture and machine type of the object file.
1503      */
1504   {
1505     const bfd_arch_info_type *arch;
1506     char family[10];
1507
1508     /* IEEE does not specify the format of the processor identificaton
1509        string, so the compiler is free to put in it whatever it wants.
1510        We try here to recognize different processors belonging to the
1511        m68k family.  Code for other processors can be added here.  */
1512     if ((processor[0] == '6') && (processor[1] == '8'))
1513       {
1514         if (processor[2] == '3')            /* 683xx integrated processors */
1515           {
1516             switch (processor[3])
1517               {
1518               case '0':                     /* 68302, 68306, 68307 */
1519               case '2':                     /* 68322, 68328 */
1520               case '5':                     /* 68356 */
1521                 strcpy (family, "68000");   /* MC68000-based controllers */
1522                 break;
1523
1524               case '3':                     /* 68330, 68331, 68332, 68333,
1525                                                68334, 68335, 68336, 68338 */
1526               case '6':                     /* 68360 */
1527               case '7':                     /* 68376 */
1528                 strcpy (family, "68332");   /* CPU32 and CPU32+ */
1529                 break;
1530
1531               case '4':
1532                 if (processor[4] == '9')    /* 68349 */
1533                   strcpy (family, "68030"); /* CPU030 */
1534                 else                        /* 68340, 68341 */
1535                   strcpy (family, "68332"); /* CPU32 and CPU32+ */
1536                 break;
1537
1538               default:                      /* Does not exist yet */
1539                 strcpy (family, "68332");   /* Guess it will be CPU32 */
1540               }
1541           }
1542         else if (toupper (processor[3]) == 'F')   /* 68F333 */
1543           strcpy (family, "68332");               /* CPU32 */
1544         else if ((toupper (processor[3]) == 'C')  /* Embedded controllers */
1545                  && ((toupper (processor[2]) == 'E')
1546                      || (toupper (processor[2]) == 'H')
1547                      || (toupper (processor[2]) == 'L')))
1548           {
1549             strcpy (family, "68");
1550             strncat (family, processor + 4, 7);
1551             family[9] = '\0';
1552           }
1553         else                             /* "Regular" processors */
1554           {
1555             strncpy (family, processor, 9);
1556             family[9] = '\0';
1557           }
1558       }
1559     else if ((strncmp (processor, "cpu32", 5) == 0) /* CPU32 and CPU32+ */
1560              || (strncmp (processor, "CPU32", 5) == 0))
1561       strcpy (family, "68332");
1562     else
1563       {
1564         strncpy (family, processor, 9);
1565         family[9] = '\0';
1566       }
1567
1568     arch = bfd_scan_arch (family);
1569     if (arch == 0)
1570       goto got_wrong_format;
1571     abfd->arch_info = arch;
1572   }
1573
1574   if (this_byte (&(ieee->h)) != (int) ieee_address_descriptor_enum)
1575     {
1576       goto fail;
1577     }
1578   next_byte (&(ieee->h));
1579
1580   if (parse_int (&(ieee->h), &ieee->ad.number_of_bits_mau) == false)
1581     {
1582       goto fail;
1583     }
1584   if (parse_int (&(ieee->h), &ieee->ad.number_of_maus_in_address) == false)
1585     {
1586       goto fail;
1587     }
1588
1589   /* If there is a byte order info, take it */
1590   if (this_byte (&(ieee->h)) == (int) ieee_variable_L_enum ||
1591       this_byte (&(ieee->h)) == (int) ieee_variable_M_enum)
1592     next_byte (&(ieee->h));
1593
1594   for (part = 0; part < N_W_VARIABLES; part++)
1595     {
1596       boolean ok;
1597       if (read_2bytes (&(ieee->h)) != (int) ieee_assign_value_to_variable_enum)
1598         {
1599           goto fail;
1600         }
1601       if (this_byte_and_next (&(ieee->h)) != part)
1602         {
1603           goto fail;
1604         }
1605
1606       ieee->w.offset[part] = parse_i (&(ieee->h), &ok);
1607       if (ok == false)
1608         {
1609           goto fail;
1610         }
1611
1612     }
1613
1614   if (ieee->w.r.external_part != 0)
1615     abfd->flags = HAS_SYMS;
1616
1617   /* By now we know that this is a real IEEE file, we're going to read
1618      the whole thing into memory so that we can run up and down it
1619      quickly.  We can work out how big the file is from the trailer
1620      record */
1621
1622   IEEE_DATA (abfd)->h.first_byte =
1623     (unsigned char *) bfd_alloc (ieee->h.abfd, ieee->w.r.me_record + 1);
1624   if (!IEEE_DATA (abfd)->h.first_byte)
1625     goto fail;
1626   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
1627     goto fail;
1628   /* FIXME: Check return value.  I'm not sure whether it needs to read
1629      the entire buffer or not.  */
1630   bfd_read ((PTR) (IEEE_DATA (abfd)->h.first_byte), 1,
1631             ieee->w.r.me_record + 1, abfd);
1632
1633   ieee_slurp_sections (abfd);
1634
1635   if (! ieee_slurp_debug (abfd))
1636     goto fail;
1637
1638   /* Parse section data to activate file and section flags implied by
1639      section contents. */
1640
1641   if (! ieee_slurp_section_data (abfd))
1642     goto fail;
1643     
1644   return abfd->xvec;
1645 got_wrong_format:
1646   bfd_set_error (bfd_error_wrong_format);
1647 fail:
1648   (void) bfd_release (abfd, ieee);
1649   abfd->tdata.ieee_data = save;
1650   return (const bfd_target *) NULL;
1651 }
1652
1653 void
1654 ieee_get_symbol_info (ignore_abfd, symbol, ret)
1655      bfd *ignore_abfd ATTRIBUTE_UNUSED;
1656      asymbol *symbol;
1657      symbol_info *ret;
1658 {
1659   bfd_symbol_info (symbol, ret);
1660   if (symbol->name[0] == ' ')
1661     ret->name = "* empty table entry ";
1662   if (!symbol->section)
1663     ret->type = (symbol->flags & BSF_LOCAL) ? 'a' : 'A';
1664 }
1665
1666 void
1667 ieee_print_symbol (ignore_abfd, afile, symbol, how)
1668      bfd *ignore_abfd ATTRIBUTE_UNUSED;
1669      PTR afile;
1670      asymbol *symbol;
1671      bfd_print_symbol_type how;
1672 {
1673   FILE *file = (FILE *) afile;
1674
1675   switch (how)
1676     {
1677     case bfd_print_symbol_name:
1678       fprintf (file, "%s", symbol->name);
1679       break;
1680     case bfd_print_symbol_more:
1681 #if 0
1682       fprintf (file, "%4x %2x", aout_symbol (symbol)->desc & 0xffff,
1683                aout_symbol (symbol)->other & 0xff);
1684 #endif
1685       BFD_FAIL ();
1686       break;
1687     case bfd_print_symbol_all:
1688       {
1689         const char *section_name =
1690           (symbol->section == (asection *) NULL
1691            ? "*abs"
1692            : symbol->section->name);
1693         if (symbol->name[0] == ' ')
1694           {
1695             fprintf (file, "* empty table entry ");
1696           }
1697         else
1698           {
1699             bfd_print_symbol_vandf ((PTR) file, symbol);
1700
1701             fprintf (file, " %-5s %04x %02x %s",
1702                      section_name,
1703                      (unsigned) ieee_symbol (symbol)->index,
1704                      (unsigned) 0,
1705                      symbol->name);
1706           }
1707       }
1708       break;
1709     }
1710 }
1711
1712 static boolean
1713 do_one (ieee, current_map, location_ptr, s, iterations)
1714      ieee_data_type *ieee;
1715      ieee_per_section_type *current_map;
1716      unsigned char *location_ptr;
1717      asection *s;
1718      int iterations;
1719 {
1720   switch (this_byte (&(ieee->h)))
1721     {
1722     case ieee_load_constant_bytes_enum:
1723       {
1724         unsigned int number_of_maus;
1725         unsigned int i;
1726         next_byte (&(ieee->h));
1727         number_of_maus = must_parse_int (&(ieee->h));
1728
1729         for (i = 0; i < number_of_maus; i++)
1730           {
1731             location_ptr[current_map->pc++] = this_byte (&(ieee->h));
1732             next_byte (&(ieee->h));
1733           }
1734       }
1735       break;
1736
1737     case ieee_load_with_relocation_enum:
1738       {
1739         boolean loop = true;
1740         next_byte (&(ieee->h));
1741         while (loop)
1742           {
1743             switch (this_byte (&(ieee->h)))
1744               {
1745               case ieee_variable_R_enum:
1746
1747               case ieee_function_signed_open_b_enum:
1748               case ieee_function_unsigned_open_b_enum:
1749               case ieee_function_either_open_b_enum:
1750                 {
1751                   unsigned int extra = 4;
1752                   boolean pcrel = false;
1753                   asection *section;
1754                   ieee_reloc_type *r =
1755                   (ieee_reloc_type *) bfd_alloc (ieee->h.abfd,
1756                                                  sizeof (ieee_reloc_type));
1757                   if (!r)
1758                     return false;
1759
1760                   *(current_map->reloc_tail_ptr) = r;
1761                   current_map->reloc_tail_ptr = &r->next;
1762                   r->next = (ieee_reloc_type *) NULL;
1763                   next_byte (&(ieee->h));
1764 /*                          abort();*/
1765                   r->relent.sym_ptr_ptr = 0;
1766                   parse_expression (ieee,
1767                                     &r->relent.addend,
1768                                     &r->symbol,
1769                                     &pcrel, &extra, &section);
1770                   r->relent.address = current_map->pc;
1771                   s->flags |= SEC_RELOC;
1772                   s->owner->flags |= HAS_RELOC;
1773                   s->reloc_count++;
1774                   if (r->relent.sym_ptr_ptr == NULL && section != NULL)
1775                     r->relent.sym_ptr_ptr = section->symbol_ptr_ptr;
1776
1777                   if (this_byte (&(ieee->h)) == (int) ieee_comma)
1778                     {
1779                       next_byte (&(ieee->h));
1780                       /* Fetch number of bytes to pad */
1781                       extra = must_parse_int (&(ieee->h));
1782                     };
1783
1784                   switch (this_byte (&(ieee->h)))
1785                     {
1786                     case ieee_function_signed_close_b_enum:
1787                       next_byte (&(ieee->h));
1788                       break;
1789                     case ieee_function_unsigned_close_b_enum:
1790                       next_byte (&(ieee->h));
1791                       break;
1792                     case ieee_function_either_close_b_enum:
1793                       next_byte (&(ieee->h));
1794                       break;
1795                     default:
1796                       break;
1797                     }
1798                   /* Build a relocation entry for this type */
1799                   /* If pc rel then stick -ve pc into instruction
1800                      and take out of reloc ..
1801
1802                      I've changed this. It's all too complicated. I
1803                      keep 0 in the instruction now.  */
1804
1805                   switch (extra)
1806                     {
1807                     case 0:
1808                     case 4:
1809
1810                       if (pcrel == true)
1811                         {
1812 #if KEEPMINUSPCININST
1813                           bfd_put_32 (ieee->h.abfd, -current_map->pc, location_ptr +
1814                                       current_map->pc);
1815                           r->relent.howto = &rel32_howto;
1816                           r->relent.addend -=
1817                             current_map->pc;
1818 #else
1819                           bfd_put_32 (ieee->h.abfd, 0, location_ptr +
1820                                       current_map->pc);
1821                           r->relent.howto = &rel32_howto;
1822 #endif
1823                         }
1824                       else
1825                         {
1826                           bfd_put_32 (ieee->h.abfd, 0, location_ptr +
1827                                       current_map->pc);
1828                           r->relent.howto = &abs32_howto;
1829                         }
1830                       current_map->pc += 4;
1831                       break;
1832                     case 2:
1833                       if (pcrel == true)
1834                         {
1835 #if KEEPMINUSPCININST
1836                           bfd_put_16 (ieee->h.abfd, (int) (-current_map->pc), location_ptr + current_map->pc);
1837                           r->relent.addend -= current_map->pc;
1838                           r->relent.howto = &rel16_howto;
1839 #else
1840
1841                           bfd_put_16 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1842                           r->relent.howto = &rel16_howto;
1843 #endif
1844                         }
1845
1846                       else
1847                         {
1848                           bfd_put_16 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1849                           r->relent.howto = &abs16_howto;
1850                         }
1851                       current_map->pc += 2;
1852                       break;
1853                     case 1:
1854                       if (pcrel == true)
1855                         {
1856 #if KEEPMINUSPCININST
1857                           bfd_put_8 (ieee->h.abfd, (int) (-current_map->pc), location_ptr + current_map->pc);
1858                           r->relent.addend -= current_map->pc;
1859                           r->relent.howto = &rel8_howto;
1860 #else
1861                           bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1862                           r->relent.howto = &rel8_howto;
1863 #endif
1864                         }
1865                       else
1866                         {
1867                           bfd_put_8 (ieee->h.abfd, 0, location_ptr + current_map->pc);
1868                           r->relent.howto = &abs8_howto;
1869                         }
1870                       current_map->pc += 1;
1871                       break;
1872
1873                     default:
1874                       BFD_FAIL ();
1875                       return false;
1876                     }
1877                 }
1878                 break;
1879               default:
1880                 {
1881                   bfd_vma this_size;
1882                   if (parse_int (&(ieee->h), &this_size) == true)
1883                     {
1884                       unsigned int i;
1885                       for (i = 0; i < this_size; i++)
1886                         {
1887                           location_ptr[current_map->pc++] = this_byte (&(ieee->h));
1888                           next_byte (&(ieee->h));
1889                         }
1890                     }
1891                   else
1892                     {
1893                       loop = false;
1894                     }
1895                 }
1896               }
1897
1898             /* Prevent more than the first load-item of an LR record
1899                from being repeated (MRI convention). */
1900             if (iterations != 1)
1901               loop = false;
1902           }
1903       }
1904     }
1905   return true;
1906 }
1907
1908 /* Read in all the section data and relocation stuff too */
1909 static boolean
1910 ieee_slurp_section_data (abfd)
1911      bfd *abfd;
1912 {
1913   bfd_byte *location_ptr = (bfd_byte *) NULL;
1914   ieee_data_type *ieee = IEEE_DATA (abfd);
1915   unsigned int section_number;
1916
1917   ieee_per_section_type *current_map = (ieee_per_section_type *) NULL;
1918   asection *s;
1919   /* Seek to the start of the data area */
1920   if (ieee->read_data == true)
1921     return true;
1922   ieee->read_data = true;
1923   ieee_seek (abfd, ieee->w.r.data_part);
1924
1925   /* Allocate enough space for all the section contents */
1926
1927   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
1928     {
1929       ieee_per_section_type *per = (ieee_per_section_type *) s->used_by_bfd;
1930       if ((s->flags & SEC_DEBUGGING) != 0)
1931         continue;
1932       per->data = (bfd_byte *) bfd_alloc (ieee->h.abfd, s->_raw_size);
1933       if (!per->data)
1934         return false;
1935       /*SUPPRESS 68*/
1936       per->reloc_tail_ptr =
1937         (ieee_reloc_type **) & (s->relocation);
1938     }
1939
1940   while (true)
1941     {
1942       switch (this_byte (&(ieee->h)))
1943         {
1944           /* IF we see anything strange then quit */
1945         default:
1946           return true;
1947
1948         case ieee_set_current_section_enum:
1949           next_byte (&(ieee->h));
1950           section_number = must_parse_int (&(ieee->h));
1951           s = ieee->section_table[section_number];
1952           s->flags |= SEC_LOAD | SEC_HAS_CONTENTS;
1953           current_map = (ieee_per_section_type *) s->used_by_bfd;
1954           location_ptr = current_map->data - s->vma;
1955           /* The document I have says that Microtec's compilers reset */
1956           /* this after a sec section, even though the standard says not */
1957           /* to. SO .. */
1958           current_map->pc = s->vma;
1959           break;
1960
1961         case ieee_e2_first_byte_enum:
1962           next_byte (&(ieee->h));
1963           switch (this_byte (&(ieee->h)))
1964             {
1965             case ieee_set_current_pc_enum & 0xff:
1966               {
1967                 bfd_vma value;
1968                 ieee_symbol_index_type symbol;
1969                 unsigned int extra;
1970                 boolean pcrel;
1971                 next_byte (&(ieee->h));
1972                 must_parse_int (&(ieee->h));    /* Thow away section #*/
1973                 parse_expression (ieee, &value,
1974                                   &symbol,
1975                                   &pcrel, &extra,
1976                                   0);
1977                 current_map->pc = value;
1978                 BFD_ASSERT ((unsigned) (value - s->vma) <= s->_raw_size);
1979               }
1980               break;
1981
1982             case ieee_value_starting_address_enum & 0xff:
1983               next_byte (&(ieee->h));
1984               if (this_byte (&(ieee->h)) == ieee_function_either_open_b_enum)
1985                 next_byte (&(ieee->h));
1986               abfd->start_address = must_parse_int (&(ieee->h));
1987               /* We've got to the end of the data now - */
1988               return true;
1989             default:
1990               BFD_FAIL ();
1991               return false;
1992             }
1993           break;
1994         case ieee_repeat_data_enum:
1995           {
1996             /* Repeat the following LD or LR n times - we do this by
1997                  remembering the stream pointer before running it and
1998                  resetting it and running it n times. We special case
1999                  the repetition of a repeat_data/load_constant
2000                  */
2001
2002             unsigned int iterations;
2003             unsigned char *start;
2004             next_byte (&(ieee->h));
2005             iterations = must_parse_int (&(ieee->h));
2006             start = ieee->h.input_p;
2007             if (start[0] == (int) ieee_load_constant_bytes_enum &&
2008                 start[1] == 1)
2009               {
2010                 while (iterations != 0)
2011                   {
2012                     location_ptr[current_map->pc++] = start[2];
2013                     iterations--;
2014                   }
2015                 next_byte (&(ieee->h));
2016                 next_byte (&(ieee->h));
2017                 next_byte (&(ieee->h));
2018               }
2019             else
2020               {
2021                 while (iterations != 0)
2022                   {
2023                     ieee->h.input_p = start;
2024                     if (!do_one (ieee, current_map, location_ptr, s,
2025                                  iterations))
2026                       return false;
2027                     iterations--;
2028                   }
2029               }
2030           }
2031           break;
2032         case ieee_load_constant_bytes_enum:
2033         case ieee_load_with_relocation_enum:
2034           {
2035             if (!do_one (ieee, current_map, location_ptr, s, 1))
2036               return false;
2037           }
2038         }
2039     }
2040 }
2041
2042 boolean
2043 ieee_new_section_hook (abfd, newsect)
2044      bfd *abfd;
2045      asection *newsect;
2046 {
2047   newsect->used_by_bfd = (PTR)
2048     bfd_alloc (abfd, sizeof (ieee_per_section_type));
2049   if (!newsect->used_by_bfd)
2050     return false;
2051   ieee_per_section (newsect)->data = (bfd_byte *) NULL;
2052   ieee_per_section (newsect)->section = newsect;
2053   return true;
2054 }
2055
2056 long
2057 ieee_get_reloc_upper_bound (abfd, asect)
2058      bfd *abfd;
2059      sec_ptr asect;
2060 {
2061   if ((asect->flags & SEC_DEBUGGING) != 0)
2062     return 0;
2063   if (! ieee_slurp_section_data (abfd))
2064     return -1;
2065   return (asect->reloc_count + 1) * sizeof (arelent *);
2066 }
2067
2068 static boolean
2069 ieee_get_section_contents (abfd, section, location, offset, count)
2070      bfd *abfd;
2071      sec_ptr section;
2072      PTR location;
2073      file_ptr offset;
2074      bfd_size_type count;
2075 {
2076   ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;
2077   if ((section->flags & SEC_DEBUGGING) != 0)
2078     return _bfd_generic_get_section_contents (abfd, section, location,
2079                                               offset, count);
2080   ieee_slurp_section_data (abfd);
2081   (void) memcpy ((PTR) location, (PTR) (p->data + offset), (unsigned) count);
2082   return true;
2083 }
2084
2085 long
2086 ieee_canonicalize_reloc (abfd, section, relptr, symbols)
2087      bfd *abfd;
2088      sec_ptr section;
2089      arelent **relptr;
2090      asymbol **symbols;
2091 {
2092 /*  ieee_per_section_type *p = (ieee_per_section_type *) section->used_by_bfd;*/
2093   ieee_reloc_type *src = (ieee_reloc_type *) (section->relocation);
2094   ieee_data_type *ieee = IEEE_DATA (abfd);
2095
2096   if ((section->flags & SEC_DEBUGGING) != 0)
2097     return 0;
2098
2099   while (src != (ieee_reloc_type *) NULL)
2100     {
2101       /* Work out which symbol to attach it this reloc to */
2102       switch (src->symbol.letter)
2103         {
2104         case 'I':
2105           src->relent.sym_ptr_ptr =
2106             symbols + src->symbol.index + ieee->external_symbol_base_offset;
2107           break;
2108         case 'X':
2109           src->relent.sym_ptr_ptr =
2110             symbols + src->symbol.index + ieee->external_reference_base_offset;
2111           break;
2112         case 0:
2113           if (src->relent.sym_ptr_ptr != NULL)
2114             src->relent.sym_ptr_ptr =
2115               src->relent.sym_ptr_ptr[0]->section->symbol_ptr_ptr;
2116           break;
2117         default:
2118
2119           BFD_FAIL ();
2120         }
2121       *relptr++ = &src->relent;
2122       src = src->next;
2123     }
2124   *relptr = (arelent *) NULL;
2125   return section->reloc_count;
2126 }
2127
2128 static int
2129 comp (ap, bp)
2130      CONST PTR ap;
2131      CONST PTR bp;
2132 {
2133   arelent *a = *((arelent **) ap);
2134   arelent *b = *((arelent **) bp);
2135   return a->address - b->address;
2136 }
2137
2138 /* Write the section headers.  */
2139
2140 static boolean
2141 ieee_write_section_part (abfd)
2142      bfd *abfd;
2143 {
2144   ieee_data_type *ieee = IEEE_DATA (abfd);
2145   asection *s;
2146   ieee->w.r.section_part = bfd_tell (abfd);
2147   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
2148     {
2149       if (! bfd_is_abs_section (s)
2150           && (s->flags & SEC_DEBUGGING) == 0)
2151         {
2152           if (! ieee_write_byte (abfd, ieee_section_type_enum)
2153               || ! ieee_write_byte (abfd,
2154                                     (bfd_byte) (s->index
2155                                                 + IEEE_SECTION_NUMBER_BASE)))
2156             return false;
2157
2158           if (abfd->flags & EXEC_P)
2159             {
2160               /* This image is executable, so output absolute sections */
2161               if (! ieee_write_byte (abfd, ieee_variable_A_enum)
2162                   || ! ieee_write_byte (abfd, ieee_variable_S_enum))
2163                 return false;
2164             }
2165           else
2166             {
2167               if (! ieee_write_byte (abfd, ieee_variable_C_enum))
2168                 return false;
2169             }
2170
2171           switch (s->flags & (SEC_CODE | SEC_DATA | SEC_ROM))
2172             {
2173             case SEC_CODE | SEC_LOAD:
2174             case SEC_CODE:
2175               if (! ieee_write_byte (abfd, ieee_variable_P_enum))
2176                 return false;
2177               break;
2178             case SEC_DATA:
2179             default:
2180               if (! ieee_write_byte (abfd, ieee_variable_D_enum))
2181                 return false;
2182               break;
2183             case SEC_ROM:
2184             case SEC_ROM | SEC_DATA:
2185             case SEC_ROM | SEC_LOAD:
2186             case SEC_ROM | SEC_DATA | SEC_LOAD:
2187               if (! ieee_write_byte (abfd, ieee_variable_R_enum))
2188                 return false;
2189             }
2190
2191
2192           if (! ieee_write_id (abfd, s->name))
2193             return false;
2194 #if 0
2195           ieee_write_int (abfd, 0);     /* Parent */
2196           ieee_write_int (abfd, 0);     /* Brother */
2197           ieee_write_int (abfd, 0);     /* Context */
2198 #endif
2199           /* Alignment */
2200           if (! ieee_write_byte (abfd, ieee_section_alignment_enum)
2201               || ! ieee_write_byte (abfd,
2202                                     (bfd_byte) (s->index
2203                                                 + IEEE_SECTION_NUMBER_BASE))
2204               || ! ieee_write_int (abfd, 1 << s->alignment_power))
2205             return false;
2206
2207           /* Size */
2208           if (! ieee_write_2bytes (abfd, ieee_section_size_enum)
2209               || ! ieee_write_byte (abfd,
2210                                     (bfd_byte) (s->index
2211                                                 + IEEE_SECTION_NUMBER_BASE))
2212               || ! ieee_write_int (abfd, s->_raw_size))
2213             return false;
2214           if (abfd->flags & EXEC_P)
2215             {
2216               /* Relocateable sections don't have asl records */
2217               /* Vma */
2218               if (! ieee_write_2bytes (abfd, ieee_section_base_address_enum)
2219                   || ! ieee_write_byte (abfd,
2220                                         ((bfd_byte)
2221                                          (s->index
2222                                           + IEEE_SECTION_NUMBER_BASE)))
2223                   || ! ieee_write_int (abfd, s->lma))
2224                 return false;
2225             }
2226         }
2227     }
2228
2229   return true;
2230 }
2231
2232
2233 static boolean
2234 do_with_relocs (abfd, s)
2235      bfd *abfd;
2236      asection *s;
2237 {
2238   unsigned int number_of_maus_in_address =
2239     bfd_arch_bits_per_address (abfd) / bfd_arch_bits_per_byte (abfd);
2240   unsigned int relocs_to_go = s->reloc_count;
2241   bfd_byte *stream = ieee_per_section (s)->data;
2242   arelent **p = s->orelocation;
2243   bfd_size_type current_byte_index = 0;
2244
2245   qsort (s->orelocation,
2246          relocs_to_go,
2247          sizeof (arelent **),
2248          comp);
2249
2250   /* Output the section preheader */
2251   if (! ieee_write_byte (abfd, ieee_set_current_section_enum)
2252       || ! ieee_write_byte (abfd,
2253                             (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE))
2254       || ! ieee_write_2bytes (abfd, ieee_set_current_pc_enum)
2255       || ! ieee_write_byte (abfd,
2256                             (bfd_byte) (s->index + IEEE_SECTION_NUMBER_BASE)))
2257     return false;
2258   if ((abfd->flags & EXEC_P) != 0 && relocs_to_go == 0)
2259     {
2260       if (! ieee_write_int (abfd, s->lma))
2261         return false;
2262     }
2263   else
2264     {
2265       if (! ieee_write_expression (abfd, 0, s->symbol, 0, 0))
2266         return false;
2267     }
2268
2269   if (relocs_to_go == 0)
2270     {
2271       /* If there aren't any relocations then output the load constant
2272          byte opcode rather than the load with relocation opcode */
2273
2274       while (current_byte_index < s->_raw_size)
2275         {
2276           bfd_size_type run;
2277           unsigned int MAXRUN = 127;
2278           run = MAXRUN;
2279           if (run > s->_raw_size - current_byte_index)
2280             {
2281               run = s->_raw_size - current_byte_index;
2282             }
2283
2284           if (run != 0)
2285             {
2286               if (! ieee_write_byte (abfd, ieee_load_constant_bytes_enum))
2287                 return false;
2288               /* Output a stream of bytes */
2289               if (! ieee_write_int (abfd, run))
2290                 return false;
2291               if (bfd_write ((PTR) (stream + current_byte_index),
2292                              1,
2293                              run,
2294                              abfd)
2295                   != run)
2296                 return false;
2297               current_byte_index += run;
2298             }
2299         }
2300     }
2301   else
2302     {
2303       if (! ieee_write_byte (abfd, ieee_load_with_relocation_enum))
2304         return false;
2305
2306       /* Output the data stream as the longest sequence of bytes
2307          possible, allowing for the a reasonable packet size and
2308          relocation stuffs.  */
2309
2310       if ((PTR) stream == (PTR) NULL)
2311         {
2312           /* Outputting a section without data, fill it up */
2313           stream = (unsigned char *) (bfd_alloc (abfd, s->_raw_size));
2314           if (!stream)
2315             return false;
2316           memset ((PTR) stream, 0, (size_t) s->_raw_size);
2317         }
2318       while (current_byte_index < s->_raw_size)
2319         {
2320           bfd_size_type run;
2321           unsigned int MAXRUN = 127;
2322           if (relocs_to_go)
2323             {
2324               run = (*p)->address - current_byte_index;
2325               if (run > MAXRUN)
2326                 run = MAXRUN;
2327             }
2328           else
2329             {
2330               run = MAXRUN;
2331             }
2332           if (run > s->_raw_size - current_byte_index)
2333             {
2334               run = s->_raw_size - current_byte_index;
2335             }
2336
2337           if (run != 0)
2338             {
2339               /* Output a stream of bytes */
2340               if (! ieee_write_int (abfd, run))
2341                 return false;
2342               if (bfd_write ((PTR) (stream + current_byte_index),
2343                              1,
2344                              run,
2345                              abfd)
2346                   != run)
2347                 return false;
2348               current_byte_index += run;
2349             }
2350           /* Output any relocations here */
2351           if (relocs_to_go && (*p) && (*p)->address == current_byte_index)
2352             {
2353               while (relocs_to_go
2354                      && (*p) && (*p)->address == current_byte_index)
2355                 {
2356                   arelent *r = *p;
2357                   bfd_signed_vma ov;
2358
2359 #if 0
2360                   if (r->howto->pc_relative)
2361                     {
2362                       r->addend += current_byte_index;
2363                     }
2364 #endif
2365
2366                   switch (r->howto->size)
2367                     {
2368                     case 2:
2369
2370                       ov = bfd_get_signed_32 (abfd,
2371                                               stream + current_byte_index);
2372                       current_byte_index += 4;
2373                       break;
2374                     case 1:
2375                       ov = bfd_get_signed_16 (abfd,
2376                                               stream + current_byte_index);
2377                       current_byte_index += 2;
2378                       break;
2379                     case 0:
2380                       ov = bfd_get_signed_8 (abfd,
2381                                              stream + current_byte_index);
2382                       current_byte_index++;
2383                       break;
2384                     default:
2385                       ov = 0;
2386                       BFD_FAIL ();
2387                       return false;
2388                     }
2389
2390                   ov &= r->howto->src_mask;
2391
2392                   if (r->howto->pc_relative
2393                       && ! r->howto->pcrel_offset)
2394                     ov += r->address;
2395
2396                   if (! ieee_write_byte (abfd,
2397                                          ieee_function_either_open_b_enum))
2398                     return false;
2399
2400 /*                abort();*/
2401
2402                   if (r->sym_ptr_ptr != (asymbol **) NULL)
2403                     {
2404                       if (! ieee_write_expression (abfd, r->addend + ov,
2405                                                    *(r->sym_ptr_ptr),
2406                                                    r->howto->pc_relative,
2407                                                    s->index))
2408                         return false;
2409                     }
2410                   else
2411                     {
2412                       if (! ieee_write_expression (abfd, r->addend + ov,
2413                                                    (asymbol *) NULL,
2414                                                    r->howto->pc_relative,
2415                                                    s->index))
2416                         return false;
2417                     }
2418
2419                   if (number_of_maus_in_address
2420                       != bfd_get_reloc_size (r->howto))
2421                     {
2422                       if (! ieee_write_int (abfd,
2423                                             bfd_get_reloc_size (r->howto)))
2424                         return false;
2425                     }
2426                   if (! ieee_write_byte (abfd,
2427                                          ieee_function_either_close_b_enum))
2428                     return false;
2429
2430                   relocs_to_go--;
2431                   p++;
2432                 }
2433
2434             }
2435         }
2436     }
2437
2438   return true;
2439 }
2440
2441 /* If there are no relocations in the output section then we can be
2442    clever about how we write.  We block items up into a max of 127
2443    bytes.  */
2444
2445 static boolean
2446 do_as_repeat (abfd, s)
2447      bfd *abfd;
2448      asection *s;
2449 {
2450   if (s->_raw_size)
2451     {
2452       if (! ieee_write_byte (abfd, ieee_set_current_section_enum)
2453           || ! ieee_write_byte (abfd,
2454                                 (bfd_byte) (s->index
2455                                             + IEEE_SECTION_NUMBER_BASE))
2456           || ! ieee_write_byte (abfd, ieee_set_current_pc_enum >> 8)
2457           || ! ieee_write_byte (abfd, ieee_set_current_pc_enum & 0xff)
2458           || ! ieee_write_byte (abfd,
2459                                 (bfd_byte) (s->index
2460                                             + IEEE_SECTION_NUMBER_BASE))
2461           || ! ieee_write_int (abfd, s->lma)
2462           || ! ieee_write_byte (abfd, ieee_repeat_data_enum)
2463           || ! ieee_write_int (abfd, s->_raw_size)
2464           || ! ieee_write_byte (abfd, ieee_load_constant_bytes_enum)
2465           || ! ieee_write_byte (abfd, 1)
2466           || ! ieee_write_byte (abfd, 0))
2467         return false;
2468     }
2469
2470   return true;
2471 }
2472
2473 static boolean
2474 do_without_relocs (abfd, s)
2475      bfd *abfd;
2476      asection *s;
2477 {
2478   bfd_byte *stream = ieee_per_section (s)->data;
2479
2480   if (stream == 0 || ((s->flags & SEC_LOAD) == 0))
2481     {
2482       if (! do_as_repeat (abfd, s))
2483         return false;
2484     }
2485   else
2486     {
2487       unsigned int i;
2488       for (i = 0; i < s->_raw_size; i++)
2489         {
2490           if (stream[i] != 0)
2491             {
2492               if (! do_with_relocs (abfd, s))
2493                 return false;
2494               return true;
2495             }
2496         }
2497       if (! do_as_repeat (abfd, s))
2498         return false;
2499     }
2500
2501   return true;
2502 }
2503
2504
2505 static unsigned char *output_ptr_start;
2506 static unsigned char *output_ptr;
2507 static unsigned char *output_ptr_end;
2508 static unsigned char *input_ptr_start;
2509 static unsigned char *input_ptr;
2510 static unsigned char *input_ptr_end;
2511 static bfd *input_bfd;
2512 static bfd *output_bfd;
2513 static int output_buffer;
2514
2515 static void
2516 fill ()
2517 {
2518   /* FIXME: Check return value.  I'm not sure whether it needs to read
2519      the entire buffer or not.  */
2520   bfd_read ((PTR) input_ptr_start, 1, input_ptr_end - input_ptr_start, input_bfd);
2521   input_ptr = input_ptr_start;
2522 }
2523 static void
2524 flush ()
2525 {
2526   if (bfd_write ((PTR) (output_ptr_start), 1, output_ptr - output_ptr_start,
2527                  output_bfd)
2528       != (bfd_size_type) (output_ptr - output_ptr_start))
2529     abort ();
2530   output_ptr = output_ptr_start;
2531   output_buffer++;
2532 }
2533
2534 #define THIS() ( *input_ptr )
2535 #define NEXT() { input_ptr++; if (input_ptr == input_ptr_end) fill(); }
2536 #define OUT(x) { *output_ptr++ = (x); if(output_ptr == output_ptr_end)  flush(); }
2537
2538 static void
2539 write_int (value)
2540      int value;
2541 {
2542   if (value >= 0 && value <= 127)
2543     {
2544       OUT (value);
2545     }
2546   else
2547     {
2548       unsigned int length;
2549       /* How many significant bytes ? */
2550       /* FIXME FOR LONGER INTS */
2551       if (value & 0xff000000)
2552         {
2553           length = 4;
2554         }
2555       else if (value & 0x00ff0000)
2556         {
2557           length = 3;
2558         }
2559       else if (value & 0x0000ff00)
2560         {
2561           length = 2;
2562         }
2563       else
2564         length = 1;
2565
2566       OUT ((int) ieee_number_repeat_start_enum + length);
2567       switch (length)
2568         {
2569         case 4:
2570           OUT (value >> 24);
2571         case 3:
2572           OUT (value >> 16);
2573         case 2:
2574           OUT (value >> 8);
2575         case 1:
2576           OUT (value);
2577         }
2578
2579     }
2580 }
2581
2582 static void
2583 copy_id ()
2584 {
2585   int length = THIS ();
2586   char ch;
2587   OUT (length);
2588   NEXT ();
2589   while (length--)
2590     {
2591       ch = THIS ();
2592       OUT (ch);
2593       NEXT ();
2594     }
2595 }
2596
2597 #define VAR(x) ((x | 0x80))
2598 static void
2599 copy_expression ()
2600 {
2601   int stack[10];
2602   int *tos = stack;
2603   int value = 0;
2604   while (1)
2605     {
2606       switch (THIS ())
2607         {
2608         case 0x84:
2609           NEXT ();
2610           value = THIS ();
2611           NEXT ();
2612           value = (value << 8) | THIS ();
2613           NEXT ();
2614           value = (value << 8) | THIS ();
2615           NEXT ();
2616           value = (value << 8) | THIS ();
2617           NEXT ();
2618           *tos++ = value;
2619           break;
2620         case 0x83:
2621           NEXT ();
2622           value = THIS ();
2623           NEXT ();
2624           value = (value << 8) | THIS ();
2625           NEXT ();
2626           value = (value << 8) | THIS ();
2627           NEXT ();
2628           *tos++ = value;
2629           break;
2630         case 0x82:
2631           NEXT ();
2632           value = THIS ();
2633           NEXT ();
2634           value = (value << 8) | THIS ();
2635           NEXT ();
2636           *tos++ = value;
2637           break;
2638         case 0x81:
2639           NEXT ();
2640           value = THIS ();
2641           NEXT ();
2642           *tos++ = value;
2643           break;
2644         case 0x80:
2645           NEXT ();
2646           *tos++ = 0;
2647           break;
2648         default:
2649           if (THIS () > 0x84)
2650             {
2651               /* Not a number, just bug out with the answer */
2652               write_int (*(--tos));
2653               return;
2654             }
2655           *tos++ = THIS ();
2656           NEXT ();
2657           value = 0;
2658           break;
2659         case 0xa5:
2660           /* PLUS anything */
2661           {
2662             int value = *(--tos);
2663             value += *(--tos);
2664             *tos++ = value;
2665             NEXT ();
2666           }
2667           break;
2668         case VAR ('R'):
2669           {
2670             int section_number;
2671             ieee_data_type *ieee;
2672             asection *s;
2673             NEXT ();
2674             section_number = THIS ();
2675
2676             NEXT ();
2677             ieee = IEEE_DATA (input_bfd);
2678             s = ieee->section_table[section_number];
2679             if (s->output_section)
2680               {
2681                 value = s->output_section->lma;
2682               }
2683             else
2684               {
2685                 value = 0;
2686               }
2687             value += s->output_offset;
2688             *tos++ = value;
2689             value = 0;
2690           }
2691           break;
2692         case 0x90:
2693           {
2694             NEXT ();
2695             write_int (*(--tos));
2696             OUT (0x90);
2697             return;
2698
2699           }
2700         }
2701     }
2702
2703 }
2704
2705 /* Drop the int in the buffer, and copy a null into the gap, which we
2706    will overwrite later */
2707
2708 struct output_buffer_struct
2709 {
2710   unsigned char *ptrp;
2711   int buffer;
2712 };
2713
2714 static void
2715 fill_int (buf)
2716      struct output_buffer_struct *buf;
2717 {
2718   if (buf->buffer == output_buffer)
2719     {
2720       /* Still a chance to output the size */
2721       int value = output_ptr - buf->ptrp + 3;
2722       buf->ptrp[0] = value >> 24;
2723       buf->ptrp[1] = value >> 16;
2724       buf->ptrp[2] = value >> 8;
2725       buf->ptrp[3] = value >> 0;
2726     }
2727 }
2728
2729 static void
2730 drop_int (buf)
2731      struct output_buffer_struct *buf;
2732 {
2733   int type = THIS ();
2734   int ch;
2735   if (type <= 0x84)
2736     {
2737       NEXT ();
2738       switch (type)
2739         {
2740         case 0x84:
2741           ch = THIS ();
2742           NEXT ();
2743         case 0x83:
2744           ch = THIS ();
2745           NEXT ();
2746         case 0x82:
2747           ch = THIS ();
2748           NEXT ();
2749         case 0x81:
2750           ch = THIS ();
2751           NEXT ();
2752         case 0x80:
2753           break;
2754         }
2755     }
2756   OUT (0x84);
2757   buf->ptrp = output_ptr;
2758   buf->buffer = output_buffer;
2759   OUT (0);
2760   OUT (0);
2761   OUT (0);
2762   OUT (0);
2763 }
2764
2765 static void
2766 copy_int ()
2767 {
2768   int type = THIS ();
2769   int ch;
2770   if (type <= 0x84)
2771     {
2772       OUT (type);
2773       NEXT ();
2774       switch (type)
2775         {
2776         case 0x84:
2777           ch = THIS ();
2778           NEXT ();
2779           OUT (ch);
2780         case 0x83:
2781           ch = THIS ();
2782           NEXT ();
2783           OUT (ch);
2784         case 0x82:
2785           ch = THIS ();
2786           NEXT ();
2787           OUT (ch);
2788         case 0x81:
2789           ch = THIS ();
2790           NEXT ();
2791           OUT (ch);
2792         case 0x80:
2793           break;
2794         }
2795     }
2796 }
2797
2798 #define ID copy_id()
2799 #define INT copy_int()
2800 #define EXP copy_expression()
2801 static void copy_till_end ();
2802 #define INTn(q) copy_int()
2803 #define EXPn(q) copy_expression()
2804
2805 static void
2806 f1_record ()
2807 {
2808   int ch;
2809   /* ATN record */
2810   NEXT ();
2811   ch = THIS ();
2812   switch (ch)
2813     {
2814     default:
2815       OUT (0xf1);
2816       OUT (ch);
2817       break;
2818     case 0xc9:
2819       NEXT ();
2820       OUT (0xf1);
2821       OUT (0xc9);
2822       INT;
2823       INT;
2824       ch = THIS ();
2825       switch (ch)
2826         {
2827         case 0x16:
2828           NEXT ();
2829           break;
2830         case 0x01:
2831           NEXT ();
2832           break;
2833         case 0x00:
2834           NEXT ();
2835           INT;
2836           break;
2837         case 0x03:
2838           NEXT ();
2839           INT;
2840           break;
2841         case 0x13:
2842           EXPn (instruction address);
2843           break;
2844         default:
2845           break;
2846         }
2847       break;
2848     case 0xd8:
2849       /* EXternal ref */
2850       NEXT ();
2851       OUT (0xf1);
2852       OUT (0xd8);
2853       EXP;
2854       EXP;
2855       EXP;
2856       EXP;
2857       break;
2858     case 0xce:
2859       NEXT ();
2860       OUT (0xf1);
2861       OUT (0xce);
2862       INT;
2863       INT;
2864       ch = THIS ();
2865       INT;
2866       switch (ch)
2867         {
2868         case 0x01:
2869           INT;
2870           INT;
2871           break;
2872         case 0x02:
2873           INT;
2874           break;
2875         case 0x04:
2876           EXPn (external function);
2877           break;
2878         case 0x05:
2879           break;
2880         case 0x07:
2881           INTn (line number);
2882           INT;
2883         case 0x08:
2884           break;
2885         case 0x0a:
2886           INTn (locked register);
2887           INT;
2888           break;
2889         case 0x3f:
2890           copy_till_end ();
2891           break;
2892         case 0x3e:
2893           copy_till_end ();
2894           break;
2895         case 0x40:
2896           copy_till_end ();
2897           break;
2898         case 0x41:
2899           ID;
2900           break;
2901         }
2902     }
2903
2904 }
2905
2906 static void
2907 f0_record ()
2908 {
2909   /* Attribute record */
2910   NEXT ();
2911   OUT (0xf0);
2912   INTn (Symbol name);
2913   ID;
2914 }
2915
2916 static void
2917 copy_till_end ()
2918 {
2919   int ch = THIS ();
2920   while (1)
2921     {
2922       while (ch <= 0x80)
2923         {
2924           OUT (ch);
2925           NEXT ();
2926           ch = THIS ();
2927         }
2928       switch (ch)
2929         {
2930         case 0x84:
2931           OUT (THIS ());
2932           NEXT ();
2933         case 0x83:
2934           OUT (THIS ());
2935           NEXT ();
2936         case 0x82:
2937           OUT (THIS ());
2938           NEXT ();
2939         case 0x81:
2940           OUT (THIS ());
2941           NEXT ();
2942           OUT (THIS ());
2943           NEXT ();
2944
2945           ch = THIS ();
2946           break;
2947         default:
2948           return;
2949         }
2950     }
2951
2952 }
2953
2954 static void
2955 f2_record ()
2956 {
2957   NEXT ();
2958   OUT (0xf2);
2959   INT;
2960   NEXT ();
2961   OUT (0xce);
2962   INT;
2963   copy_till_end ();
2964 }
2965
2966
2967 static void block ();
2968 static void
2969 f8_record ()
2970 {
2971   int ch;
2972   NEXT ();
2973   ch = THIS ();
2974   switch (ch)
2975     {
2976     case 0x01:
2977     case 0x02:
2978     case 0x03:
2979       /* Unique typedefs for module */
2980       /* GLobal typedefs  */
2981       /* High level module scope beginning */
2982       {
2983         struct output_buffer_struct ob;
2984         NEXT ();
2985         OUT (0xf8);
2986         OUT (ch);
2987         drop_int (&ob);
2988         ID;
2989
2990         block ();
2991
2992         NEXT ();
2993         fill_int (&ob);
2994         OUT (0xf9);
2995       }
2996       break;
2997     case 0x04:
2998       /* Global function */
2999       {
3000         struct output_buffer_struct ob;
3001         NEXT ();
3002         OUT (0xf8);
3003         OUT (0x04);
3004         drop_int (&ob);
3005         ID;
3006         INTn (stack size);
3007         INTn (ret val);
3008         EXPn (offset);
3009
3010         block ();
3011
3012         NEXT ();
3013         OUT (0xf9);
3014         EXPn (size of block);
3015         fill_int (&ob);
3016       }
3017       break;
3018
3019     case 0x05:
3020       /* File name for source line numbers */
3021       {
3022         struct output_buffer_struct ob;
3023         NEXT ();
3024         OUT (0xf8);
3025         OUT (0x05);
3026         drop_int (&ob);
3027         ID;
3028         INTn (year);
3029         INTn (month);
3030         INTn (day);
3031         INTn (hour);
3032         INTn (monute);
3033         INTn (second);
3034         block ();
3035         NEXT ();
3036         OUT (0xf9);
3037         fill_int (&ob);
3038       }
3039       break;
3040
3041     case 0x06:
3042       /* Local function */
3043       {
3044         struct output_buffer_struct ob;
3045         NEXT ();
3046         OUT (0xf8);
3047         OUT (0x06);
3048         drop_int (&ob);
3049         ID;
3050         INTn (stack size);
3051         INTn (type return);
3052         EXPn (offset);
3053         block ();
3054         NEXT ();
3055         OUT (0xf9);
3056         EXPn (size);
3057         fill_int (&ob);
3058       }
3059       break;
3060
3061     case 0x0a:
3062       /* Assembler module scope beginning -*/
3063       {
3064         struct output_buffer_struct ob;
3065
3066         NEXT ();
3067         OUT (0xf8);
3068         OUT (0x0a);
3069         drop_int (&ob);
3070         ID;
3071         ID;
3072         INT;
3073         ID;
3074         INT;
3075         INT;
3076         INT;
3077         INT;
3078         INT;
3079         INT;
3080
3081         block ();
3082
3083         NEXT ();
3084         OUT (0xf9);
3085         fill_int (&ob);
3086       }
3087       break;
3088     case 0x0b:
3089       {
3090         struct output_buffer_struct ob;
3091         NEXT ();
3092         OUT (0xf8);
3093         OUT (0x0b);
3094         drop_int (&ob);
3095         ID;
3096         INT;
3097         INTn (section index);
3098         EXPn (offset);
3099         INTn (stuff);
3100
3101         block ();
3102
3103         OUT (0xf9);
3104         NEXT ();
3105         EXPn (Size in Maus);
3106         fill_int (&ob);
3107       }
3108       break;
3109     }
3110 }
3111
3112 static void
3113 e2_record ()
3114 {
3115   OUT (0xe2);
3116   NEXT ();
3117   OUT (0xce);
3118   NEXT ();
3119   INT;
3120   EXP;
3121 }
3122
3123 static void
3124 block ()
3125 {
3126   int ch;
3127   while (1)
3128     {
3129       ch = THIS ();
3130       switch (ch)
3131         {
3132         case 0xe1:
3133         case 0xe5:
3134           return;
3135         case 0xf9:
3136           return;
3137         case 0xf0:
3138           f0_record ();
3139           break;
3140         case 0xf1:
3141           f1_record ();
3142           break;
3143         case 0xf2:
3144           f2_record ();
3145           break;
3146         case 0xf8:
3147           f8_record ();
3148           break;
3149         case 0xe2:
3150           e2_record ();
3151           break;
3152
3153         }
3154     }
3155 }
3156
3157
3158
3159 /* relocate_debug,
3160    moves all the debug information from the source bfd to the output
3161    bfd, and relocates any expressions it finds
3162 */
3163
3164 static void
3165 relocate_debug (output, input)
3166      bfd *output ATTRIBUTE_UNUSED;
3167      bfd *input;
3168 {
3169 #define IBS 400
3170 #define OBS 400
3171   unsigned char input_buffer[IBS];
3172
3173   input_ptr_start = input_ptr = input_buffer;
3174   input_ptr_end = input_buffer + IBS;
3175   input_bfd = input;
3176   /* FIXME: Check return value.  I'm not sure whether it needs to read
3177      the entire buffer or not.  */
3178   bfd_read ((PTR) input_ptr_start, 1, IBS, input);
3179   block ();
3180 }
3181
3182 /*
3183   During linking, we we told about the bfds which made up our
3184   contents, we have a list of them. They will still be open, so go to
3185   the debug info in each, and copy it out, relocating it as we go.
3186 */
3187
3188 static boolean
3189 ieee_write_debug_part (abfd)
3190      bfd *abfd;
3191 {
3192   ieee_data_type *ieee = IEEE_DATA (abfd);
3193   bfd_chain_type *chain = ieee->chain_root;
3194   unsigned char output_buffer[OBS];
3195   boolean some_debug = false;
3196   file_ptr here = bfd_tell (abfd);
3197
3198   output_ptr_start = output_ptr = output_buffer;
3199   output_ptr_end = output_buffer + OBS;
3200   output_ptr = output_buffer;
3201   output_bfd = abfd;
3202
3203   if (chain == (bfd_chain_type *) NULL)
3204     {
3205       asection *s;
3206
3207       for (s = abfd->sections; s != NULL; s = s->next)
3208         if ((s->flags & SEC_DEBUGGING) != 0)
3209           break;
3210       if (s == NULL)
3211         {
3212           ieee->w.r.debug_information_part = 0;
3213           return true;
3214         }
3215
3216       ieee->w.r.debug_information_part = here;
3217       if (bfd_write (s->contents, 1, s->_raw_size, abfd) != s->_raw_size)
3218         return false;
3219     }
3220   else
3221     {
3222       while (chain != (bfd_chain_type *) NULL)
3223         {
3224           bfd *entry = chain->this;
3225           ieee_data_type *entry_ieee = IEEE_DATA (entry);
3226           if (entry_ieee->w.r.debug_information_part)
3227             {
3228               if (bfd_seek (entry, entry_ieee->w.r.debug_information_part,
3229                             SEEK_SET)
3230                   != 0)
3231                 return false;
3232               relocate_debug (abfd, entry);
3233             }
3234
3235           chain = chain->next;
3236         }
3237       if (some_debug)
3238         {
3239           ieee->w.r.debug_information_part = here;
3240         }
3241       else
3242         {
3243           ieee->w.r.debug_information_part = 0;
3244         }
3245
3246       flush ();
3247     }
3248
3249   return true;
3250 }
3251
3252 /* Write the data in an ieee way.  */
3253
3254 static boolean
3255 ieee_write_data_part (abfd)
3256      bfd *abfd;
3257 {
3258   asection *s;
3259   ieee_data_type *ieee = IEEE_DATA (abfd);
3260   ieee->w.r.data_part = bfd_tell (abfd);
3261   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
3262     {
3263       /* Skip sections that have no loadable contents (.bss,
3264          debugging, etc.)  */
3265       if ((s->flags & SEC_LOAD) == 0)
3266         continue;
3267
3268       /* Sort the reloc records so we can insert them in the correct
3269          places */
3270       if (s->reloc_count != 0)
3271         {
3272           if (! do_with_relocs (abfd, s))
3273             return false;
3274         }
3275       else
3276         {
3277           if (! do_without_relocs (abfd, s))
3278             return false;
3279         }
3280     }
3281
3282   return true;
3283 }
3284
3285
3286 static boolean
3287 init_for_output (abfd)
3288      bfd *abfd;
3289 {
3290   asection *s;
3291   for (s = abfd->sections; s != (asection *) NULL; s = s->next)
3292     {
3293       if ((s->flags & SEC_DEBUGGING) != 0)
3294         continue;
3295       if (s->_raw_size != 0)
3296         {
3297           ieee_per_section (s)->data = (bfd_byte *) (bfd_alloc (abfd, s->_raw_size));
3298           if (!ieee_per_section (s)->data)
3299             return false;
3300         }
3301     }
3302   return true;
3303 }
3304 \f
3305 /** exec and core file sections */
3306
3307 /* set section contents is complicated with IEEE since the format is
3308 * not a byte image, but a record stream.
3309 */
3310 boolean
3311 ieee_set_section_contents (abfd, section, location, offset, count)
3312      bfd *abfd;
3313      sec_ptr section;
3314      PTR location;
3315      file_ptr offset;
3316      bfd_size_type count;
3317 {
3318   if ((section->flags & SEC_DEBUGGING) != 0)
3319     {
3320       if (section->contents == NULL)
3321         {
3322           section->contents = ((unsigned char *)
3323                                bfd_alloc (abfd, section->_raw_size));
3324           if (section->contents == NULL)
3325             return false;
3326         }
3327       /* bfd_set_section_contents has already checked that everything
3328          is within range.  */
3329       memcpy (section->contents + offset, location, count);
3330       return true;
3331     }
3332
3333   if (ieee_per_section (section)->data == (bfd_byte *) NULL)
3334     {
3335       if (!init_for_output (abfd))
3336         return false;
3337     }
3338   memcpy ((PTR) (ieee_per_section (section)->data + offset),
3339           (PTR) location,
3340           (unsigned int) count);
3341   return true;
3342 }
3343
3344 /* Write the external symbols of a file.  IEEE considers two sorts of
3345    external symbols, public, and referenced.  It uses to internal
3346    forms to index them as well.  When we write them out we turn their
3347    symbol values into indexes from the right base.  */
3348
3349 static boolean
3350 ieee_write_external_part (abfd)
3351      bfd *abfd;
3352 {
3353   asymbol **q;
3354   ieee_data_type *ieee = IEEE_DATA (abfd);
3355
3356   unsigned int reference_index = IEEE_REFERENCE_BASE;
3357   unsigned int public_index = IEEE_PUBLIC_BASE + 2;
3358   file_ptr here = bfd_tell (abfd);
3359   boolean hadone = false;
3360   if (abfd->outsymbols != (asymbol **) NULL)
3361     {
3362
3363       for (q = abfd->outsymbols; *q != (asymbol *) NULL; q++)
3364         {
3365           asymbol *p = *q;
3366           if (bfd_is_und_section (p->section))
3367             {
3368               /* This must be a symbol reference .. */
3369               if (! ieee_write_byte (abfd, ieee_external_reference_enum)
3370                   || ! ieee_write_int (abfd, reference_index)
3371                   || ! ieee_write_id (abfd, p->name))
3372                 return false;
3373               p->value = reference_index;
3374               reference_index++;
3375               hadone = true;
3376             }
3377           else if (bfd_is_com_section (p->section))
3378             {
3379               /* This is a weak reference */
3380               if (! ieee_write_byte (abfd, ieee_external_reference_enum)
3381                   || ! ieee_write_int (abfd, reference_index)
3382                   || ! ieee_write_id (abfd, p->name)
3383                   || ! ieee_write_byte (abfd,
3384                                         ieee_weak_external_reference_enum)
3385                   || ! ieee_write_int (abfd, reference_index)
3386                   || ! ieee_write_int (abfd, p->value))
3387                 return false;
3388               p->value = reference_index;
3389               reference_index++;
3390               hadone = true;
3391             }
3392           else if (p->flags & BSF_GLOBAL)
3393             {
3394               /* This must be a symbol definition */
3395
3396               if (! ieee_write_byte (abfd, ieee_external_symbol_enum)
3397                   || ! ieee_write_int (abfd, public_index)
3398                   || ! ieee_write_id (abfd, p->name)
3399                   || ! ieee_write_2bytes (abfd, ieee_attribute_record_enum)
3400                   || ! ieee_write_int (abfd, public_index)
3401                   || ! ieee_write_byte (abfd, 15) /* instruction address */
3402                   || ! ieee_write_byte (abfd, 19) /* static symbol */
3403                   || ! ieee_write_byte (abfd, 1)) /* one of them */
3404                 return false;
3405
3406               /* Write out the value */
3407               if (! ieee_write_2bytes (abfd, ieee_value_record_enum)
3408                   || ! ieee_write_int (abfd, public_index))
3409                 return false;
3410               if (! bfd_is_abs_section (p->section))
3411                 {
3412                   if (abfd->flags & EXEC_P)
3413                     {
3414                       /* If fully linked, then output all symbols
3415                          relocated */
3416                       if (! (ieee_write_int
3417                              (abfd,
3418                               (p->value
3419                                + p->section->output_offset
3420                                + p->section->output_section->vma))))
3421                         return false;
3422                     }
3423                   else
3424                     {
3425                       if (! (ieee_write_expression
3426                              (abfd,
3427                               p->value + p->section->output_offset,
3428                               p->section->output_section->symbol,
3429                               false, 0)))
3430                         return false;
3431                     }
3432                 }
3433               else
3434                 {
3435                   if (! ieee_write_expression (abfd,
3436                                                p->value,
3437                                                bfd_abs_section_ptr->symbol,
3438                                                false, 0))
3439                     return false;
3440                 }
3441               p->value = public_index;
3442               public_index++;
3443               hadone = true;
3444             }
3445           else
3446             {
3447               /* This can happen - when there are gaps in the symbols read */
3448               /* from an input ieee file */
3449             }
3450         }
3451     }
3452   if (hadone)
3453     ieee->w.r.external_part = here;
3454
3455   return true;
3456 }
3457
3458
3459 static CONST unsigned char exten[] =
3460 {
3461   0xf0, 0x20, 0x00,
3462   0xf1, 0xce, 0x20, 0x00, 37, 3, 3,     /* Set version 3 rev 3          */
3463   0xf1, 0xce, 0x20, 0x00, 39, 2,/* keep symbol in  original case */
3464   0xf1, 0xce, 0x20, 0x00, 38    /* set object type relocateable to x */
3465 };
3466
3467 static CONST unsigned char envi[] =
3468 {
3469   0xf0, 0x21, 0x00,
3470
3471 /*    0xf1, 0xce, 0x21, 00, 50, 0x82, 0x07, 0xc7, 0x09, 0x11, 0x11,
3472     0x19, 0x2c,
3473 */
3474   0xf1, 0xce, 0x21, 00, 52, 0x00,       /* exec ok */
3475
3476   0xf1, 0xce, 0x21, 0, 53, 0x03,/* host unix */
3477 /*    0xf1, 0xce, 0x21, 0, 54, 2,1,1    tool & version # */
3478 };
3479
3480 static boolean
3481 ieee_write_me_part (abfd)
3482      bfd *abfd;
3483 {
3484   ieee_data_type *ieee = IEEE_DATA (abfd);
3485   ieee->w.r.trailer_part = bfd_tell (abfd);
3486   if (abfd->start_address)
3487     {
3488       if (! ieee_write_2bytes (abfd, ieee_value_starting_address_enum)
3489           || ! ieee_write_byte (abfd, ieee_function_either_open_b_enum)
3490           || ! ieee_write_int (abfd, abfd->start_address)
3491           || ! ieee_write_byte (abfd, ieee_function_either_close_b_enum))
3492         return false;
3493     }
3494   ieee->w.r.me_record = bfd_tell (abfd);
3495   if (! ieee_write_byte (abfd, ieee_module_end_enum))
3496     return false;
3497   return true;
3498 }
3499
3500 /* Write out the IEEE processor ID.  */
3501
3502 static boolean
3503 ieee_write_processor (abfd)
3504      bfd *abfd;
3505 {
3506   const bfd_arch_info_type *arch;
3507
3508   arch = bfd_get_arch_info (abfd);
3509   switch (arch->arch)
3510     {
3511     default:
3512       if (! ieee_write_id (abfd, bfd_printable_name (abfd)))
3513         return false;
3514       break;
3515
3516     case bfd_arch_a29k:
3517       if (! ieee_write_id (abfd, "29000"))
3518         return false;
3519       break;
3520
3521     case bfd_arch_h8300:
3522       if (! ieee_write_id (abfd, "H8/300"))
3523         return false;
3524       break;
3525
3526     case bfd_arch_h8500:
3527       if (! ieee_write_id (abfd, "H8/500"))
3528         return false;
3529       break;
3530
3531     case bfd_arch_i960:
3532       switch (arch->mach)
3533         {
3534         default:
3535         case bfd_mach_i960_core:
3536         case bfd_mach_i960_ka_sa:
3537           if (! ieee_write_id (abfd, "80960KA"))
3538             return false;
3539           break;
3540
3541         case bfd_mach_i960_kb_sb:
3542           if (! ieee_write_id (abfd, "80960KB"))
3543             return false;
3544           break;
3545
3546         case bfd_mach_i960_ca:
3547           if (! ieee_write_id (abfd, "80960CA"))
3548             return false;
3549           break;
3550
3551         case bfd_mach_i960_mc:
3552         case bfd_mach_i960_xa:
3553           if (! ieee_write_id (abfd, "80960MC"))
3554             return false;
3555           break;
3556         }
3557       break;
3558
3559     case bfd_arch_m68k:
3560       {
3561         const char *id;
3562
3563         switch (arch->mach)
3564           {
3565           default:              id = "68020"; break;
3566           case bfd_mach_m68000: id = "68000"; break;
3567           case bfd_mach_m68008: id = "68008"; break;
3568           case bfd_mach_m68010: id = "68010"; break;
3569           case bfd_mach_m68020: id = "68020"; break;
3570           case bfd_mach_m68030: id = "68030"; break;
3571           case bfd_mach_m68040: id = "68040"; break;
3572           case bfd_mach_m68060: id = "68060"; break;
3573           case bfd_mach_cpu32:  id = "cpu32"; break;
3574           }
3575
3576         if (! ieee_write_id (abfd, id))
3577           return false;
3578       }
3579       break;
3580     }
3581
3582   return true;
3583 }
3584
3585 boolean
3586 ieee_write_object_contents (abfd)
3587      bfd *abfd;
3588 {
3589   ieee_data_type *ieee = IEEE_DATA (abfd);
3590   unsigned int i;
3591   file_ptr old;
3592
3593   /* Fast forward over the header area */
3594   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
3595     return false;
3596
3597   if (! ieee_write_byte (abfd, ieee_module_beginning_enum)
3598       || ! ieee_write_processor (abfd)
3599       || ! ieee_write_id (abfd, abfd->filename))
3600     return false;
3601
3602   /* Fast forward over the variable bits */
3603   if (! ieee_write_byte (abfd, ieee_address_descriptor_enum))
3604     return false;
3605
3606   /* Bits per MAU */
3607   if (! ieee_write_byte (abfd, (bfd_byte) (bfd_arch_bits_per_byte (abfd))))
3608     return false;
3609   /* MAU's per address */
3610   if (! ieee_write_byte (abfd,
3611                          (bfd_byte) (bfd_arch_bits_per_address (abfd)
3612                                      / bfd_arch_bits_per_byte (abfd))))
3613     return false;
3614
3615   old = bfd_tell (abfd);
3616   if (bfd_seek (abfd, (file_ptr) (8 * N_W_VARIABLES), SEEK_CUR) != 0)
3617     return false;
3618
3619   ieee->w.r.extension_record = bfd_tell (abfd);
3620   if (bfd_write ((char *) exten, 1, sizeof (exten), abfd) != sizeof (exten))
3621     return false;
3622   if (abfd->flags & EXEC_P)
3623     {
3624       if (! ieee_write_byte (abfd, 0x1)) /* Absolute */
3625         return false;
3626     }
3627   else
3628     {
3629       if (! ieee_write_byte (abfd, 0x2)) /* Relocateable */
3630         return false;
3631     }
3632
3633   ieee->w.r.environmental_record = bfd_tell (abfd);
3634   if (bfd_write ((char *) envi, 1, sizeof (envi), abfd) != sizeof (envi))
3635     return false;
3636
3637   /* The HP emulator database requires a timestamp in the file.  */
3638   {
3639     time_t now;
3640     const struct tm *t;
3641
3642     time (&now);
3643     t = (struct tm *) localtime (&now);
3644     if (! ieee_write_2bytes (abfd, (int) ieee_atn_record_enum)
3645         || ! ieee_write_byte (abfd, 0x21)
3646         || ! ieee_write_byte (abfd, 0)
3647         || ! ieee_write_byte (abfd, 50)
3648         || ! ieee_write_int (abfd, t->tm_year + 1900)
3649         || ! ieee_write_int (abfd, t->tm_mon + 1)
3650         || ! ieee_write_int (abfd, t->tm_mday)
3651         || ! ieee_write_int (abfd, t->tm_hour)
3652         || ! ieee_write_int (abfd, t->tm_min)
3653         || ! ieee_write_int (abfd, t->tm_sec))
3654       return false;
3655   }
3656
3657   output_bfd = abfd;
3658
3659   flush ();
3660
3661   if (! ieee_write_section_part (abfd))
3662     return false;
3663   /* First write the symbols.  This changes their values into table
3664     indeces so we cant use it after this point.  */
3665   if (! ieee_write_external_part (abfd))
3666     return false;
3667
3668   /*  ieee_write_byte(abfd, ieee_record_seperator_enum);*/
3669
3670   /*  ieee_write_byte(abfd, ieee_record_seperator_enum);*/
3671
3672
3673   /* Write any debugs we have been told about.  */
3674   if (! ieee_write_debug_part (abfd))
3675     return false;
3676
3677   /* Can only write the data once the symbols have been written, since
3678      the data contains relocation information which points to the
3679      symbols.  */
3680   if (! ieee_write_data_part (abfd))
3681     return false;
3682
3683   /* At the end we put the end!  */
3684   if (! ieee_write_me_part (abfd))
3685     return false;
3686
3687   /* Generate the header */
3688   if (bfd_seek (abfd, old, SEEK_SET) != 0)
3689     return false;
3690
3691   for (i = 0; i < N_W_VARIABLES; i++)
3692     {
3693       if (! ieee_write_2bytes (abfd, ieee_assign_value_to_variable_enum)
3694           || ! ieee_write_byte (abfd, (bfd_byte) i)
3695           || ! ieee_write_int5_out (abfd, ieee->w.offset[i]))
3696         return false;
3697     }
3698
3699   return true;
3700 }
3701 \f
3702 /* Native-level interface to symbols. */
3703
3704 /* We read the symbols into a buffer, which is discarded when this
3705    function exits.  We read the strings into a buffer large enough to
3706    hold them all plus all the cached symbol entries. */
3707
3708 asymbol *
3709 ieee_make_empty_symbol (abfd)
3710      bfd *abfd;
3711 {
3712   ieee_symbol_type *new =
3713     (ieee_symbol_type *) bfd_zmalloc (sizeof (ieee_symbol_type));
3714   if (!new)
3715     return NULL;
3716   new->symbol.the_bfd = abfd;
3717   return &new->symbol;
3718 }
3719
3720 static bfd *
3721 ieee_openr_next_archived_file (arch, prev)
3722      bfd *arch;
3723      bfd *prev;
3724 {
3725   ieee_ar_data_type *ar = IEEE_AR_DATA (arch);
3726   /* take the next one from the arch state, or reset */
3727   if (prev == (bfd *) NULL)
3728     {
3729       /* Reset the index - the first two entries are bogus*/
3730       ar->element_index = 2;
3731     }
3732   while (true)
3733     {
3734       ieee_ar_obstack_type *p = ar->elements + ar->element_index;
3735       ar->element_index++;
3736       if (ar->element_index <= ar->element_count)
3737         {
3738           if (p->file_offset != (file_ptr) 0)
3739             {
3740               if (p->abfd == (bfd *) NULL)
3741                 {
3742                   p->abfd = _bfd_create_empty_archive_element_shell (arch);
3743                   p->abfd->origin = p->file_offset;
3744                 }
3745               return p->abfd;
3746             }
3747         }
3748       else
3749         {
3750           bfd_set_error (bfd_error_no_more_archived_files);
3751           return (bfd *) NULL;
3752         }
3753
3754     }
3755 }
3756
3757 static boolean
3758 ieee_find_nearest_line (abfd,
3759                         section,
3760                         symbols,
3761                         offset,
3762                         filename_ptr,
3763                         functionname_ptr,
3764                         line_ptr)
3765      bfd *abfd ATTRIBUTE_UNUSED;
3766      asection *section ATTRIBUTE_UNUSED;
3767      asymbol **symbols ATTRIBUTE_UNUSED;
3768      bfd_vma offset ATTRIBUTE_UNUSED;
3769      const char **filename_ptr ATTRIBUTE_UNUSED;
3770      const char **functionname_ptr ATTRIBUTE_UNUSED;
3771      unsigned int *line_ptr ATTRIBUTE_UNUSED;
3772 {
3773   return false;
3774 }
3775
3776 static int
3777 ieee_generic_stat_arch_elt (abfd, buf)
3778      bfd *abfd;
3779      struct stat *buf;
3780 {
3781   ieee_ar_data_type *ar = (ieee_ar_data_type *) NULL;
3782   ieee_data_type *ieee;
3783
3784   if (abfd->my_archive != NULL)
3785     ar = abfd->my_archive->tdata.ieee_ar_data;
3786   if (ar == (ieee_ar_data_type *) NULL)
3787     {
3788       bfd_set_error (bfd_error_invalid_operation);
3789       return -1;
3790     }
3791
3792   if (IEEE_DATA (abfd) == NULL)
3793     {
3794       if (ieee_object_p (abfd) == NULL)
3795         {
3796           bfd_set_error (bfd_error_wrong_format);
3797           return -1;
3798         }
3799     }
3800
3801   ieee = IEEE_DATA (abfd);
3802
3803   buf->st_size = ieee->w.r.me_record + 1;
3804   buf->st_mode = 0644;
3805   return 0;
3806 }
3807
3808 static int
3809 ieee_sizeof_headers (abfd, x)
3810      bfd *abfd ATTRIBUTE_UNUSED;
3811      boolean x ATTRIBUTE_UNUSED;
3812 {
3813   return 0;
3814 }
3815
3816
3817 /* The debug info routines are never used.  */
3818 #if 0
3819
3820 static void
3821 ieee_bfd_debug_info_start (abfd)
3822      bfd *abfd;
3823 {
3824
3825 }
3826
3827 static void
3828 ieee_bfd_debug_info_end (abfd)
3829      bfd *abfd;
3830 {
3831
3832 }
3833
3834
3835 /* Add this section to the list of sections we have debug info for, to
3836    be ready to output it at close time
3837    */
3838 static void
3839 ieee_bfd_debug_info_accumulate (abfd, section)
3840      bfd *abfd;
3841      asection *section;
3842 {
3843   ieee_data_type *ieee = IEEE_DATA (section->owner);
3844   ieee_data_type *output_ieee = IEEE_DATA (abfd);
3845   /* can only accumulate data from other ieee bfds */
3846   if (section->owner->xvec != abfd->xvec)
3847     return;
3848   /* Only bother once per bfd */
3849   if (ieee->done_debug == true)
3850     return;
3851   ieee->done_debug = true;
3852
3853   /* Don't bother if there is no debug info */
3854   if (ieee->w.r.debug_information_part == 0)
3855     return;
3856
3857
3858   /* Add to chain */
3859   {
3860     bfd_chain_type *n = (bfd_chain_type *) bfd_alloc (abfd, sizeof (bfd_chain_type));
3861     if (!n)
3862       abort ();         /* FIXME */
3863     n->this = section->owner;
3864     n->next = (bfd_chain_type *) NULL;
3865
3866     if (output_ieee->chain_head)
3867       {
3868         output_ieee->chain_head->next = n;
3869       }
3870     else
3871       {
3872         output_ieee->chain_root = n;
3873
3874       }
3875     output_ieee->chain_head = n;
3876   }
3877 }
3878
3879 #endif
3880
3881 #define ieee_close_and_cleanup _bfd_generic_close_and_cleanup
3882 #define ieee_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
3883
3884 #define ieee_slurp_armap bfd_true
3885 #define ieee_slurp_extended_name_table bfd_true
3886 #define ieee_construct_extended_name_table \
3887   ((boolean (*) PARAMS ((bfd *, char **, bfd_size_type *, const char **))) \
3888    bfd_true)
3889 #define ieee_truncate_arname bfd_dont_truncate_arname
3890 #define ieee_write_armap \
3891   ((boolean (*) \
3892     PARAMS ((bfd *, unsigned int, struct orl *, unsigned int, int))) \
3893    bfd_true)
3894 #define ieee_read_ar_hdr bfd_nullvoidptr
3895 #define ieee_update_armap_timestamp bfd_true
3896 #define ieee_get_elt_at_index _bfd_generic_get_elt_at_index
3897
3898 #define ieee_bfd_is_local_label_name bfd_generic_is_local_label_name
3899 #define ieee_get_lineno _bfd_nosymbols_get_lineno
3900 #define ieee_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
3901 #define ieee_read_minisymbols _bfd_generic_read_minisymbols
3902 #define ieee_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
3903
3904 #define ieee_bfd_reloc_type_lookup _bfd_norelocs_bfd_reloc_type_lookup
3905
3906 #define ieee_set_arch_mach _bfd_generic_set_arch_mach
3907
3908 #define ieee_get_section_contents_in_window \
3909   _bfd_generic_get_section_contents_in_window
3910 #define ieee_bfd_get_relocated_section_contents \
3911   bfd_generic_get_relocated_section_contents
3912 #define ieee_bfd_relax_section bfd_generic_relax_section
3913 #define ieee_bfd_gc_sections bfd_generic_gc_sections
3914 #define ieee_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
3915 #define ieee_bfd_link_add_symbols _bfd_generic_link_add_symbols
3916 #define ieee_bfd_final_link _bfd_generic_final_link
3917 #define ieee_bfd_link_split_section  _bfd_generic_link_split_section
3918
3919 /*SUPPRESS 460 */
3920 const bfd_target ieee_vec =
3921 {
3922   "ieee",                       /* name */
3923   bfd_target_ieee_flavour,
3924   BFD_ENDIAN_UNKNOWN,           /* target byte order */
3925   BFD_ENDIAN_UNKNOWN,           /* target headers byte order */
3926   (HAS_RELOC | EXEC_P |         /* object flags */
3927    HAS_LINENO | HAS_DEBUG |
3928    HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
3929   (SEC_CODE | SEC_DATA | SEC_ROM | SEC_HAS_CONTENTS
3930    | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
3931   '_',                          /* leading underscore */
3932   ' ',                          /* ar_pad_char */
3933   16,                           /* ar_max_namelen */
3934   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
3935   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
3936   bfd_getb16, bfd_getb_signed_16, bfd_putb16,   /* data */
3937   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
3938   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
3939   bfd_getb16, bfd_getb_signed_16, bfd_putb16,   /* hdrs */
3940
3941   {_bfd_dummy_target,
3942    ieee_object_p,               /* bfd_check_format */
3943    ieee_archive_p,
3944    _bfd_dummy_target,
3945   },
3946   {
3947     bfd_false,
3948     ieee_mkobject,
3949     _bfd_generic_mkarchive,
3950     bfd_false
3951   },
3952   {
3953     bfd_false,
3954     ieee_write_object_contents,
3955     _bfd_write_archive_contents,
3956     bfd_false,
3957   },
3958
3959   BFD_JUMP_TABLE_GENERIC (ieee),
3960   BFD_JUMP_TABLE_COPY (_bfd_generic),
3961   BFD_JUMP_TABLE_CORE (_bfd_nocore),
3962   BFD_JUMP_TABLE_ARCHIVE (ieee),
3963   BFD_JUMP_TABLE_SYMBOLS (ieee),
3964   BFD_JUMP_TABLE_RELOCS (ieee),
3965   BFD_JUMP_TABLE_WRITE (ieee),
3966   BFD_JUMP_TABLE_LINK (ieee),
3967   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
3968
3969   NULL,
3970   
3971   (PTR) 0
3972 };