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