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