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