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