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