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