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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [bfd/] [ieee.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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