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