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