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