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