OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [ieee.c] - Blame information for rev 279

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 14 khays
/* BFD back-end for ieee-695 objects.
2
   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 148 khays
   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011
4 14 khays
   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, &section);
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 161 khays
#define ieee_bfd_lookup_section_flags bfd_generic_lookup_section_flags
3776 14 khays
#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 148 khays
  0,                             /* match priority.  */
3806 14 khays
  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
};

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.