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