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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [binutils-2.18.50/] [binutils/] [ieee.c] - Blame information for rev 868

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

Line No. Rev Author Line
1 38 julius
/* ieee.c -- Read and write IEEE-695 debugging information.
2
   Copyright 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2006, 2007
3
   Free Software Foundation, Inc.
4
   Written by Ian Lance Taylor <ian@cygnus.com>.
5
 
6
   This file is part of GNU Binutils.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3 of the License, or
11
   (at your option) any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program; if not, write to the Free Software
20
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
21
   02110-1301, USA.  */
22
 
23
/* This file reads and writes IEEE-695 debugging information.  */
24
 
25
#include "sysdep.h"
26
#include <assert.h>
27
#include "bfd.h"
28
#include "ieee.h"
29
#include "libiberty.h"
30
#include "debug.h"
31
#include "budbg.h"
32
#include "filenames.h"
33
 
34
/* This structure holds an entry on the block stack.  */
35
 
36
struct ieee_block
37
{
38
  /* The kind of block.  */
39
  int kind;
40
  /* The source file name, for a BB5 block.  */
41
  const char *filename;
42
  /* The index of the function type, for a BB4 or BB6 block.  */
43
  unsigned int fnindx;
44
  /* TRUE if this function is being skipped.  */
45
  bfd_boolean skip;
46
};
47
 
48
/* This structure is the block stack.  */
49
 
50
#define BLOCKSTACK_SIZE (16)
51
 
52
struct ieee_blockstack
53
{
54
  /* The stack pointer.  */
55
  struct ieee_block *bsp;
56
  /* The stack.  */
57
  struct ieee_block stack[BLOCKSTACK_SIZE];
58
};
59
 
60
/* This structure holds information for a variable.  */
61
 
62
struct ieee_var
63
{
64
  /* Start of name.  */
65
  const char *name;
66
  /* Length of name.  */
67
  unsigned long namlen;
68
  /* Type.  */
69
  debug_type type;
70
  /* Slot if we make an indirect type.  */
71
  debug_type *pslot;
72
  /* Kind of variable or function.  */
73
  enum
74
    {
75
      IEEE_UNKNOWN,
76
      IEEE_EXTERNAL,
77
      IEEE_GLOBAL,
78
      IEEE_STATIC,
79
      IEEE_LOCAL,
80
      IEEE_FUNCTION
81
    } kind;
82
};
83
 
84
/* This structure holds all the variables.  */
85
 
86
struct ieee_vars
87
{
88
  /* Number of slots allocated.  */
89
  unsigned int alloc;
90
  /* Variables.  */
91
  struct ieee_var *vars;
92
};
93
 
94
/* This structure holds information for a type.  We need this because
95
   we don't want to represent bitfields as real types.  */
96
 
97
struct ieee_type
98
{
99
  /* Type.  */
100
  debug_type type;
101
  /* Slot if this is type is referenced before it is defined.  */
102
  debug_type *pslot;
103
  /* Slots for arguments if we make indirect types for them.  */
104
  debug_type *arg_slots;
105
  /* If this is a bitfield, this is the size in bits.  If this is not
106
     a bitfield, this is zero.  */
107
  unsigned long bitsize;
108
};
109
 
110
/* This structure holds all the type information.  */
111
 
112
struct ieee_types
113
{
114
  /* Number of slots allocated.  */
115
  unsigned int alloc;
116
  /* Types.  */
117
  struct ieee_type *types;
118
  /* Builtin types.  */
119
#define BUILTIN_TYPE_COUNT (60)
120
  debug_type builtins[BUILTIN_TYPE_COUNT];
121
};
122
 
123
/* This structure holds a linked last of structs with their tag names,
124
   so that we can convert them to C++ classes if necessary.  */
125
 
126
struct ieee_tag
127
{
128
  /* Next tag.  */
129
  struct ieee_tag *next;
130
  /* This tag name.  */
131
  const char *name;
132
  /* The type of the tag.  */
133
  debug_type type;
134
  /* The tagged type is an indirect type pointing at this slot.  */
135
  debug_type slot;
136
  /* This is an array of slots used when a field type is converted
137
     into a indirect type, in case it needs to be later converted into
138
     a reference type.  */
139
  debug_type *fslots;
140
};
141
 
142
/* This structure holds the information we pass around to the parsing
143
   functions.  */
144
 
145
struct ieee_info
146
{
147
  /* The debugging handle.  */
148
  void *dhandle;
149
  /* The BFD.  */
150
  bfd *abfd;
151
  /* The start of the bytes to be parsed.  */
152
  const bfd_byte *bytes;
153
  /* The end of the bytes to be parsed.  */
154
  const bfd_byte *pend;
155
  /* The block stack.  */
156
  struct ieee_blockstack blockstack;
157
  /* Whether we have seen a BB1 or BB2.  */
158
  bfd_boolean saw_filename;
159
  /* The variables.  */
160
  struct ieee_vars vars;
161
  /* The global variables, after a global typedef block.  */
162
  struct ieee_vars *global_vars;
163
  /* The types.  */
164
  struct ieee_types types;
165
  /* The global types, after a global typedef block.  */
166
  struct ieee_types *global_types;
167
  /* The list of tagged structs.  */
168
  struct ieee_tag *tags;
169
};
170
 
171
/* Basic builtin types, not including the pointers.  */
172
 
173
enum builtin_types
174
{
175
  builtin_unknown = 0,
176
  builtin_void = 1,
177
  builtin_signed_char = 2,
178
  builtin_unsigned_char = 3,
179
  builtin_signed_short_int = 4,
180
  builtin_unsigned_short_int = 5,
181
  builtin_signed_long = 6,
182
  builtin_unsigned_long = 7,
183
  builtin_signed_long_long = 8,
184
  builtin_unsigned_long_long = 9,
185
  builtin_float = 10,
186
  builtin_double = 11,
187
  builtin_long_double = 12,
188
  builtin_long_long_double = 13,
189
  builtin_quoted_string = 14,
190
  builtin_instruction_address = 15,
191
  builtin_int = 16,
192
  builtin_unsigned = 17,
193
  builtin_unsigned_int = 18,
194
  builtin_char = 19,
195
  builtin_long = 20,
196
  builtin_short = 21,
197
  builtin_unsigned_short = 22,
198
  builtin_short_int = 23,
199
  builtin_signed_short = 24,
200
  builtin_bcd_float = 25
201
};
202
 
203
/* These are the values found in the derivation flags of a 'b'
204
   component record of a 'T' type extension record in a C++ pmisc
205
   record.  These are bitmasks.  */
206
 
207
/* Set for a private base class, clear for a public base class.
208
   Protected base classes are not supported.  */
209
#define BASEFLAGS_PRIVATE (0x1)
210
/* Set for a virtual base class.  */
211
#define BASEFLAGS_VIRTUAL (0x2)
212
/* Set for a friend class, clear for a base class.  */
213
#define BASEFLAGS_FRIEND (0x10)
214
 
215
/* These are the values found in the specs flags of a 'd', 'm', or 'v'
216
   component record of a 'T' type extension record in a C++ pmisc
217
   record.  The same flags are used for a 'M' record in a C++ pmisc
218
   record.  */
219
 
220
/* The lower two bits hold visibility information.  */
221
#define CXXFLAGS_VISIBILITY (0x3)
222
/* This value in the lower two bits indicates a public member.  */
223
#define CXXFLAGS_VISIBILITY_PUBLIC (0x0)
224
/* This value in the lower two bits indicates a private member.  */
225
#define CXXFLAGS_VISIBILITY_PRIVATE (0x1)
226
/* This value in the lower two bits indicates a protected member.  */
227
#define CXXFLAGS_VISIBILITY_PROTECTED (0x2)
228
/* Set for a static member.  */
229
#define CXXFLAGS_STATIC (0x4)
230
/* Set for a virtual override.  */
231
#define CXXFLAGS_OVERRIDE (0x8)
232
/* Set for a friend function.  */
233
#define CXXFLAGS_FRIEND (0x10)
234
/* Set for a const function.  */
235
#define CXXFLAGS_CONST (0x20)
236
/* Set for a volatile function.  */
237
#define CXXFLAGS_VOLATILE (0x40)
238
/* Set for an overloaded function.  */
239
#define CXXFLAGS_OVERLOADED (0x80)
240
/* Set for an operator function.  */
241
#define CXXFLAGS_OPERATOR (0x100)
242
/* Set for a constructor or destructor.  */
243
#define CXXFLAGS_CTORDTOR (0x400)
244
/* Set for a constructor.  */
245
#define CXXFLAGS_CTOR (0x200)
246
/* Set for an inline function.  */
247
#define CXXFLAGS_INLINE (0x800)
248
 
249
/* Local functions.  */
250
 
251
static void ieee_error (struct ieee_info *, const bfd_byte *, const char *);
252
static void ieee_eof (struct ieee_info *);
253
static char *savestring (const char *, unsigned long);
254
static bfd_boolean ieee_read_number
255
  (struct ieee_info *, const bfd_byte **, bfd_vma *);
256
static bfd_boolean ieee_read_optional_number
257
  (struct ieee_info *, const bfd_byte **, bfd_vma *, bfd_boolean *);
258
static bfd_boolean ieee_read_id
259
  (struct ieee_info *, const bfd_byte **, const char **, unsigned long *);
260
static bfd_boolean ieee_read_optional_id
261
  (struct ieee_info *, const bfd_byte **, const char **, unsigned long *,
262
   bfd_boolean *);
263
static bfd_boolean ieee_read_expression
264
  (struct ieee_info *, const bfd_byte **, bfd_vma *);
265
static debug_type ieee_builtin_type
266
  (struct ieee_info *, const bfd_byte *, unsigned int);
267
static bfd_boolean ieee_alloc_type
268
  (struct ieee_info *, unsigned int, bfd_boolean);
269
static bfd_boolean ieee_read_type_index
270
  (struct ieee_info *, const bfd_byte **, debug_type *);
271
static int ieee_regno_to_genreg (bfd *, int);
272
static int ieee_genreg_to_regno (bfd *, int);
273
static bfd_boolean parse_ieee_bb (struct ieee_info *, const bfd_byte **);
274
static bfd_boolean parse_ieee_be (struct ieee_info *, const bfd_byte **);
275
static bfd_boolean parse_ieee_nn (struct ieee_info *, const bfd_byte **);
276
static bfd_boolean parse_ieee_ty (struct ieee_info *, const bfd_byte **);
277
static bfd_boolean parse_ieee_atn (struct ieee_info *, const bfd_byte **);
278
static bfd_boolean ieee_read_cxx_misc
279
  (struct ieee_info *, const bfd_byte **, unsigned long);
280
static bfd_boolean ieee_read_cxx_class
281
  (struct ieee_info *, const bfd_byte **, unsigned long);
282
static bfd_boolean ieee_read_cxx_defaults
283
  (struct ieee_info *, const bfd_byte **, unsigned long);
284
static bfd_boolean ieee_read_reference
285
  (struct ieee_info *, const bfd_byte **);
286
static bfd_boolean ieee_require_asn
287
  (struct ieee_info *, const bfd_byte **, bfd_vma *);
288
static bfd_boolean ieee_require_atn65
289
  (struct ieee_info *, const bfd_byte **, const char **, unsigned long *);
290
 
291
/* Report an error in the IEEE debugging information.  */
292
 
293
static void
294
ieee_error (struct ieee_info *info, const bfd_byte *p, const char *s)
295
{
296
  if (p != NULL)
297
    fprintf (stderr, "%s: 0x%lx: %s (0x%x)\n", bfd_get_filename (info->abfd),
298
             (unsigned long) (p - info->bytes), s, *p);
299
  else
300
    fprintf (stderr, "%s: %s\n", bfd_get_filename (info->abfd), s);
301
}
302
 
303
/* Report an unexpected EOF in the IEEE debugging information.  */
304
 
305
static void
306
ieee_eof (struct ieee_info *info)
307
{
308
  ieee_error (info, (const bfd_byte *) NULL,
309
              _("unexpected end of debugging information"));
310
}
311
 
312
/* Save a string in memory.  */
313
 
314
static char *
315
savestring (const char *start, unsigned long len)
316
{
317
  char *ret;
318
 
319
  ret = (char *) xmalloc (len + 1);
320
  memcpy (ret, start, len);
321
  ret[len] = '\0';
322
  return ret;
323
}
324
 
325
/* Read a number which must be present in an IEEE file.  */
326
 
327
static bfd_boolean
328
ieee_read_number (struct ieee_info *info, const bfd_byte **pp, bfd_vma *pv)
329
{
330
  return ieee_read_optional_number (info, pp, pv, (bfd_boolean *) NULL);
331
}
332
 
333
/* Read a number in an IEEE file.  If ppresent is not NULL, the number
334
   need not be there.  */
335
 
336
static bfd_boolean
337
ieee_read_optional_number (struct ieee_info *info, const bfd_byte **pp,
338
                           bfd_vma *pv, bfd_boolean *ppresent)
339
{
340
  ieee_record_enum_type b;
341
 
342
  if (*pp >= info->pend)
343
    {
344
      if (ppresent != NULL)
345
        {
346
          *ppresent = FALSE;
347
          return TRUE;
348
        }
349
      ieee_eof (info);
350
      return FALSE;
351
    }
352
 
353
  b = (ieee_record_enum_type) **pp;
354
  ++*pp;
355
 
356
  if (b <= ieee_number_end_enum)
357
    {
358
      *pv = (bfd_vma) b;
359
      if (ppresent != NULL)
360
        *ppresent = TRUE;
361
      return TRUE;
362
    }
363
 
364
  if (b >= ieee_number_repeat_start_enum && b <= ieee_number_repeat_end_enum)
365
    {
366
      unsigned int i;
367
 
368
      i = (int) b - (int) ieee_number_repeat_start_enum;
369
      if (*pp + i - 1 >= info->pend)
370
        {
371
          ieee_eof (info);
372
          return FALSE;
373
        }
374
 
375
      *pv = 0;
376
      for (; i > 0; i--)
377
        {
378
          *pv <<= 8;
379
          *pv += **pp;
380
          ++*pp;
381
        }
382
 
383
      if (ppresent != NULL)
384
        *ppresent = TRUE;
385
 
386
      return TRUE;
387
    }
388
 
389
  if (ppresent != NULL)
390
    {
391
      --*pp;
392
      *ppresent = FALSE;
393
      return TRUE;
394
    }
395
 
396
  ieee_error (info, *pp - 1, _("invalid number"));
397
  return FALSE;
398
}
399
 
400
/* Read a required string from an IEEE file.  */
401
 
402
static bfd_boolean
403
ieee_read_id (struct ieee_info *info, const bfd_byte **pp,
404
              const char **pname, unsigned long *pnamlen)
405
{
406
  return ieee_read_optional_id (info, pp, pname, pnamlen, (bfd_boolean *) NULL);
407
}
408
 
409
/* Read a string from an IEEE file.  If ppresent is not NULL, the
410
   string is optional.  */
411
 
412
static bfd_boolean
413
ieee_read_optional_id (struct ieee_info *info, const bfd_byte **pp,
414
                       const char **pname, unsigned long *pnamlen,
415
                       bfd_boolean *ppresent)
416
{
417
  bfd_byte b;
418
  unsigned long len;
419
 
420
  if (*pp >= info->pend)
421
    {
422
      ieee_eof (info);
423
      return FALSE;
424
    }
425
 
426
  b = **pp;
427
  ++*pp;
428
 
429
  if (b <= 0x7f)
430
    len = b;
431
  else if ((ieee_record_enum_type) b == ieee_extension_length_1_enum)
432
    {
433
      len = **pp;
434
      ++*pp;
435
    }
436
  else if ((ieee_record_enum_type) b == ieee_extension_length_2_enum)
437
    {
438
      len = (**pp << 8) + (*pp)[1];
439
      *pp += 2;
440
    }
441
  else
442
    {
443
      if (ppresent != NULL)
444
        {
445
          --*pp;
446
          *ppresent = FALSE;
447
          return TRUE;
448
        }
449
      ieee_error (info, *pp - 1, _("invalid string length"));
450
      return FALSE;
451
    }
452
 
453
  if ((unsigned long) (info->pend - *pp) < len)
454
    {
455
      ieee_eof (info);
456
      return FALSE;
457
    }
458
 
459
  *pname = (const char *) *pp;
460
  *pnamlen = len;
461
  *pp += len;
462
 
463
  if (ppresent != NULL)
464
    *ppresent = TRUE;
465
 
466
  return TRUE;
467
}
468
 
469
/* Read an expression from an IEEE file.  Since this code is only used
470
   to parse debugging information, I haven't bothered to write a full
471
   blown IEEE expression parser.  I've only thrown in the things I've
472
   seen in debugging information.  This can be easily extended if
473
   necessary.  */
474
 
475
static bfd_boolean
476
ieee_read_expression (struct ieee_info *info, const bfd_byte **pp,
477
                      bfd_vma *pv)
478
{
479
  const bfd_byte *expr_start;
480
#define EXPR_STACK_SIZE (10)
481
  bfd_vma expr_stack[EXPR_STACK_SIZE];
482
  bfd_vma *esp;
483
 
484
  expr_start = *pp;
485
 
486
  esp = expr_stack;
487
 
488
  while (1)
489
    {
490
      const bfd_byte *start;
491
      bfd_vma val;
492
      bfd_boolean present;
493
      ieee_record_enum_type c;
494
 
495
      start = *pp;
496
 
497
      if (! ieee_read_optional_number (info, pp, &val, &present))
498
        return FALSE;
499
 
500
      if (present)
501
        {
502
          if (esp - expr_stack >= EXPR_STACK_SIZE)
503
            {
504
              ieee_error (info, start, _("expression stack overflow"));
505
              return FALSE;
506
            }
507
          *esp++ = val;
508
          continue;
509
        }
510
 
511
      c = (ieee_record_enum_type) **pp;
512
 
513
      if (c >= ieee_module_beginning_enum)
514
        break;
515
 
516
      ++*pp;
517
 
518
      if (c == ieee_comma)
519
        break;
520
 
521
      switch (c)
522
        {
523
        default:
524
          ieee_error (info, start, _("unsupported IEEE expression operator"));
525
          break;
526
 
527
        case ieee_variable_R_enum:
528
          {
529
            bfd_vma indx;
530
            asection *s;
531
 
532
            if (! ieee_read_number (info, pp, &indx))
533
              return FALSE;
534
            for (s = info->abfd->sections; s != NULL; s = s->next)
535
              if ((bfd_vma) s->target_index == indx)
536
                break;
537
            if (s == NULL)
538
              {
539
                ieee_error (info, start, _("unknown section"));
540
                return FALSE;
541
              }
542
 
543
            if (esp - expr_stack >= EXPR_STACK_SIZE)
544
              {
545
                ieee_error (info, start, _("expression stack overflow"));
546
                return FALSE;
547
              }
548
 
549
            *esp++ = bfd_get_section_vma (info->abfd, s);
550
          }
551
          break;
552
 
553
        case ieee_function_plus_enum:
554
        case ieee_function_minus_enum:
555
          {
556
            bfd_vma v1, v2;
557
 
558
            if (esp - expr_stack < 2)
559
              {
560
                ieee_error (info, start, _("expression stack underflow"));
561
                return FALSE;
562
              }
563
 
564
            v1 = *--esp;
565
            v2 = *--esp;
566
            *esp++ = v1 + v2;
567
          }
568
          break;
569
        }
570
    }
571
 
572
  if (esp - 1 != expr_stack)
573
    {
574
      ieee_error (info, expr_start, _("expression stack mismatch"));
575
      return FALSE;
576
    }
577
 
578
  *pv = *--esp;
579
 
580
  return TRUE;
581
}
582
 
583
/* Return an IEEE builtin type.  */
584
 
585
static debug_type
586
ieee_builtin_type (struct ieee_info *info, const bfd_byte *p,
587
                   unsigned int indx)
588
{
589
  void *dhandle;
590
  debug_type type;
591
  const char *name;
592
 
593
  if (indx < BUILTIN_TYPE_COUNT
594
      && info->types.builtins[indx] != DEBUG_TYPE_NULL)
595
    return info->types.builtins[indx];
596
 
597
  dhandle = info->dhandle;
598
 
599
  if (indx >= 32 && indx < 64)
600
    {
601
      type = debug_make_pointer_type (dhandle,
602
                                      ieee_builtin_type (info, p, indx - 32));
603
      assert (indx < BUILTIN_TYPE_COUNT);
604
      info->types.builtins[indx] = type;
605
      return type;
606
    }
607
 
608
  switch ((enum builtin_types) indx)
609
    {
610
    default:
611
      ieee_error (info, p, _("unknown builtin type"));
612
      return NULL;
613
 
614
    case builtin_unknown:
615
      type = debug_make_void_type (dhandle);
616
      name = NULL;
617
      break;
618
 
619
    case builtin_void:
620
      type = debug_make_void_type (dhandle);
621
      name = "void";
622
      break;
623
 
624
    case builtin_signed_char:
625
      type = debug_make_int_type (dhandle, 1, FALSE);
626
      name = "signed char";
627
      break;
628
 
629
    case builtin_unsigned_char:
630
      type = debug_make_int_type (dhandle, 1, TRUE);
631
      name = "unsigned char";
632
      break;
633
 
634
    case builtin_signed_short_int:
635
      type = debug_make_int_type (dhandle, 2, FALSE);
636
      name = "signed short int";
637
      break;
638
 
639
    case builtin_unsigned_short_int:
640
      type = debug_make_int_type (dhandle, 2, TRUE);
641
      name = "unsigned short int";
642
      break;
643
 
644
    case builtin_signed_long:
645
      type = debug_make_int_type (dhandle, 4, FALSE);
646
      name = "signed long";
647
      break;
648
 
649
    case builtin_unsigned_long:
650
      type = debug_make_int_type (dhandle, 4, TRUE);
651
      name = "unsigned long";
652
      break;
653
 
654
    case builtin_signed_long_long:
655
      type = debug_make_int_type (dhandle, 8, FALSE);
656
      name = "signed long long";
657
      break;
658
 
659
    case builtin_unsigned_long_long:
660
      type = debug_make_int_type (dhandle, 8, TRUE);
661
      name = "unsigned long long";
662
      break;
663
 
664
    case builtin_float:
665
      type = debug_make_float_type (dhandle, 4);
666
      name = "float";
667
      break;
668
 
669
    case builtin_double:
670
      type = debug_make_float_type (dhandle, 8);
671
      name = "double";
672
      break;
673
 
674
    case builtin_long_double:
675
      /* FIXME: The size for this type should depend upon the
676
         processor.  */
677
      type = debug_make_float_type (dhandle, 12);
678
      name = "long double";
679
      break;
680
 
681
    case builtin_long_long_double:
682
      type = debug_make_float_type (dhandle, 16);
683
      name = "long long double";
684
      break;
685
 
686
    case builtin_quoted_string:
687
      type = debug_make_array_type (dhandle,
688
                                    ieee_builtin_type (info, p,
689
                                                       ((unsigned int)
690
                                                        builtin_char)),
691
                                    ieee_builtin_type (info, p,
692
                                                       ((unsigned int)
693
                                                        builtin_int)),
694
                                    0, -1, TRUE);
695
      name = "QUOTED STRING";
696
      break;
697
 
698
    case builtin_instruction_address:
699
      /* FIXME: This should be a code address.  */
700
      type = debug_make_int_type (dhandle, 4, TRUE);
701
      name = "instruction address";
702
      break;
703
 
704
    case builtin_int:
705
      /* FIXME: The size for this type should depend upon the
706
         processor.  */
707
      type = debug_make_int_type (dhandle, 4, FALSE);
708
      name = "int";
709
      break;
710
 
711
    case builtin_unsigned:
712
      /* FIXME: The size for this type should depend upon the
713
         processor.  */
714
      type = debug_make_int_type (dhandle, 4, TRUE);
715
      name = "unsigned";
716
      break;
717
 
718
    case builtin_unsigned_int:
719
      /* FIXME: The size for this type should depend upon the
720
         processor.  */
721
      type = debug_make_int_type (dhandle, 4, TRUE);
722
      name = "unsigned int";
723
      break;
724
 
725
    case builtin_char:
726
      type = debug_make_int_type (dhandle, 1, FALSE);
727
      name = "char";
728
      break;
729
 
730
    case builtin_long:
731
      type = debug_make_int_type (dhandle, 4, FALSE);
732
      name = "long";
733
      break;
734
 
735
    case builtin_short:
736
      type = debug_make_int_type (dhandle, 2, FALSE);
737
      name = "short";
738
      break;
739
 
740
    case builtin_unsigned_short:
741
      type = debug_make_int_type (dhandle, 2, TRUE);
742
      name = "unsigned short";
743
      break;
744
 
745
    case builtin_short_int:
746
      type = debug_make_int_type (dhandle, 2, FALSE);
747
      name = "short int";
748
      break;
749
 
750
    case builtin_signed_short:
751
      type = debug_make_int_type (dhandle, 2, FALSE);
752
      name = "signed short";
753
      break;
754
 
755
    case builtin_bcd_float:
756
      ieee_error (info, p, _("BCD float type not supported"));
757
      return DEBUG_TYPE_NULL;
758
    }
759
 
760
  if (name != NULL)
761
    type = debug_name_type (dhandle, name, type);
762
 
763
  assert (indx < BUILTIN_TYPE_COUNT);
764
 
765
  info->types.builtins[indx] = type;
766
 
767
  return type;
768
}
769
 
770
/* Allocate more space in the type table.  If ref is TRUE, this is a
771
   reference to the type; if it is not already defined, we should set
772
   up an indirect type.  */
773
 
774
static bfd_boolean
775
ieee_alloc_type (struct ieee_info *info, unsigned int indx, bfd_boolean ref)
776
{
777
  unsigned int nalloc;
778
  register struct ieee_type *t;
779
  struct ieee_type *tend;
780
 
781
  if (indx >= info->types.alloc)
782
    {
783
      nalloc = info->types.alloc;
784
      if (nalloc == 0)
785
        nalloc = 4;
786
      while (indx >= nalloc)
787
        nalloc *= 2;
788
 
789
      info->types.types = ((struct ieee_type *)
790
                           xrealloc (info->types.types,
791
                                     nalloc * sizeof *info->types.types));
792
 
793
      memset (info->types.types + info->types.alloc, 0,
794
              (nalloc - info->types.alloc) * sizeof *info->types.types);
795
 
796
      tend = info->types.types + nalloc;
797
      for (t = info->types.types + info->types.alloc; t < tend; t++)
798
        t->type = DEBUG_TYPE_NULL;
799
 
800
      info->types.alloc = nalloc;
801
    }
802
 
803
  if (ref)
804
    {
805
      t = info->types.types + indx;
806
      if (t->type == NULL)
807
        {
808
          t->pslot = (debug_type *) xmalloc (sizeof *t->pslot);
809
          *t->pslot = DEBUG_TYPE_NULL;
810
          t->type = debug_make_indirect_type (info->dhandle, t->pslot,
811
                                              (const char *) NULL);
812
          if (t->type == NULL)
813
            return FALSE;
814
        }
815
    }
816
 
817
  return TRUE;
818
}
819
 
820
/* Read a type index and return the corresponding type.  */
821
 
822
static bfd_boolean
823
ieee_read_type_index (struct ieee_info *info, const bfd_byte **pp,
824
                      debug_type *ptype)
825
{
826
  const bfd_byte *start;
827
  bfd_vma indx;
828
 
829
  start = *pp;
830
 
831
  if (! ieee_read_number (info, pp, &indx))
832
    return FALSE;
833
 
834
  if (indx < 256)
835
    {
836
      *ptype = ieee_builtin_type (info, start, indx);
837
      if (*ptype == NULL)
838
        return FALSE;
839
      return TRUE;
840
    }
841
 
842
  indx -= 256;
843
  if (! ieee_alloc_type (info, indx, TRUE))
844
    return FALSE;
845
 
846
  *ptype = info->types.types[indx].type;
847
 
848
  return TRUE;
849
}
850
 
851
/* Parse IEEE debugging information for a file.  This is passed the
852
   bytes which compose the Debug Information Part of an IEEE file.  */
853
 
854
bfd_boolean
855
parse_ieee (void *dhandle, bfd *abfd, const bfd_byte *bytes, bfd_size_type len)
856
{
857
  struct ieee_info info;
858
  unsigned int i;
859
  const bfd_byte *p, *pend;
860
 
861
  info.dhandle = dhandle;
862
  info.abfd = abfd;
863
  info.bytes = bytes;
864
  info.pend = bytes + len;
865
  info.blockstack.bsp = info.blockstack.stack;
866
  info.saw_filename = FALSE;
867
  info.vars.alloc = 0;
868
  info.vars.vars = NULL;
869
  info.global_vars = NULL;
870
  info.types.alloc = 0;
871
  info.types.types = NULL;
872
  info.global_types = NULL;
873
  info.tags = NULL;
874
  for (i = 0; i < BUILTIN_TYPE_COUNT; i++)
875
    info.types.builtins[i] = DEBUG_TYPE_NULL;
876
 
877
  p = bytes;
878
  pend = info.pend;
879
  while (p < pend)
880
    {
881
      const bfd_byte *record_start;
882
      ieee_record_enum_type c;
883
 
884
      record_start = p;
885
 
886
      c = (ieee_record_enum_type) *p++;
887
 
888
      if (c == ieee_at_record_enum)
889
        c = (ieee_record_enum_type) (((unsigned int) c << 8) | *p++);
890
 
891
      if (c <= ieee_number_repeat_end_enum)
892
        {
893
          ieee_error (&info, record_start, _("unexpected number"));
894
          return FALSE;
895
        }
896
 
897
      switch (c)
898
        {
899
        default:
900
          ieee_error (&info, record_start, _("unexpected record type"));
901
          return FALSE;
902
 
903
        case ieee_bb_record_enum:
904
          if (! parse_ieee_bb (&info, &p))
905
            return FALSE;
906
          break;
907
 
908
        case ieee_be_record_enum:
909
          if (! parse_ieee_be (&info, &p))
910
            return FALSE;
911
          break;
912
 
913
        case ieee_nn_record:
914
          if (! parse_ieee_nn (&info, &p))
915
            return FALSE;
916
          break;
917
 
918
        case ieee_ty_record_enum:
919
          if (! parse_ieee_ty (&info, &p))
920
            return FALSE;
921
          break;
922
 
923
        case ieee_atn_record_enum:
924
          if (! parse_ieee_atn (&info, &p))
925
            return FALSE;
926
          break;
927
        }
928
    }
929
 
930
  if (info.blockstack.bsp != info.blockstack.stack)
931
    {
932
      ieee_error (&info, (const bfd_byte *) NULL,
933
                  _("blocks left on stack at end"));
934
      return FALSE;
935
    }
936
 
937
  return TRUE;
938
}
939
 
940
/* Handle an IEEE BB record.  */
941
 
942
static bfd_boolean
943
parse_ieee_bb (struct ieee_info *info, const bfd_byte **pp)
944
{
945
  const bfd_byte *block_start;
946
  bfd_byte b;
947
  bfd_vma size;
948
  const char *name;
949
  unsigned long namlen;
950
  char *namcopy = NULL;
951
  unsigned int fnindx;
952
  bfd_boolean skip;
953
 
954
  block_start = *pp;
955
 
956
  b = **pp;
957
  ++*pp;
958
 
959
  if (! ieee_read_number (info, pp, &size)
960
      || ! ieee_read_id (info, pp, &name, &namlen))
961
    return FALSE;
962
 
963
  fnindx = (unsigned int) -1;
964
  skip = FALSE;
965
 
966
  switch (b)
967
    {
968
    case 1:
969
      /* BB1: Type definitions local to a module.  */
970
      namcopy = savestring (name, namlen);
971
      if (namcopy == NULL)
972
        return FALSE;
973
      if (! debug_set_filename (info->dhandle, namcopy))
974
        return FALSE;
975
      info->saw_filename = TRUE;
976
 
977
      /* Discard any variables or types we may have seen before.  */
978
      if (info->vars.vars != NULL)
979
        free (info->vars.vars);
980
      info->vars.vars = NULL;
981
      info->vars.alloc = 0;
982
      if (info->types.types != NULL)
983
        free (info->types.types);
984
      info->types.types = NULL;
985
      info->types.alloc = 0;
986
 
987
      /* Initialize the types to the global types.  */
988
      if (info->global_types != NULL)
989
        {
990
          info->types.alloc = info->global_types->alloc;
991
          info->types.types = ((struct ieee_type *)
992
                               xmalloc (info->types.alloc
993
                                        * sizeof (*info->types.types)));
994
          memcpy (info->types.types, info->global_types->types,
995
                  info->types.alloc * sizeof (*info->types.types));
996
        }
997
 
998
      break;
999
 
1000
    case 2:
1001
      /* BB2: Global type definitions.  The name is supposed to be
1002
         empty, but we don't check.  */
1003
      if (! debug_set_filename (info->dhandle, "*global*"))
1004
        return FALSE;
1005
      info->saw_filename = TRUE;
1006
      break;
1007
 
1008
    case 3:
1009
      /* BB3: High level module block begin.  We don't have to do
1010
         anything here.  The name is supposed to be the same as for
1011
         the BB1, but we don't check.  */
1012
      break;
1013
 
1014
    case 4:
1015
      /* BB4: Global function.  */
1016
      {
1017
        bfd_vma stackspace, typindx, offset;
1018
        debug_type return_type;
1019
 
1020
        if (! ieee_read_number (info, pp, &stackspace)
1021
            || ! ieee_read_number (info, pp, &typindx)
1022
            || ! ieee_read_expression (info, pp, &offset))
1023
          return FALSE;
1024
 
1025
        /* We have no way to record the stack space.  FIXME.  */
1026
 
1027
        if (typindx < 256)
1028
          {
1029
            return_type = ieee_builtin_type (info, block_start, typindx);
1030
            if (return_type == DEBUG_TYPE_NULL)
1031
              return FALSE;
1032
          }
1033
        else
1034
          {
1035
            typindx -= 256;
1036
            if (! ieee_alloc_type (info, typindx, TRUE))
1037
              return FALSE;
1038
            fnindx = typindx;
1039
            return_type = info->types.types[typindx].type;
1040
            if (debug_get_type_kind (info->dhandle, return_type)
1041
                == DEBUG_KIND_FUNCTION)
1042
              return_type = debug_get_return_type (info->dhandle,
1043
                                                   return_type);
1044
          }
1045
 
1046
        namcopy = savestring (name, namlen);
1047
        if (namcopy == NULL)
1048
          return FALSE;
1049
        if (! debug_record_function (info->dhandle, namcopy, return_type,
1050
                                     TRUE, offset))
1051
          return FALSE;
1052
      }
1053
      break;
1054
 
1055
    case 5:
1056
      /* BB5: File name for source line numbers.  */
1057
      {
1058
        unsigned int i;
1059
 
1060
        /* We ignore the date and time.  FIXME.  */
1061
        for (i = 0; i < 6; i++)
1062
          {
1063
            bfd_vma ignore;
1064
            bfd_boolean present;
1065
 
1066
            if (! ieee_read_optional_number (info, pp, &ignore, &present))
1067
              return FALSE;
1068
            if (! present)
1069
              break;
1070
          }
1071
 
1072
        namcopy = savestring (name, namlen);
1073
        if (namcopy == NULL)
1074
          return FALSE;
1075
        if (! debug_start_source (info->dhandle, namcopy))
1076
          return FALSE;
1077
      }
1078
      break;
1079
 
1080
    case 6:
1081
      /* BB6: Local function or block.  */
1082
      {
1083
        bfd_vma stackspace, typindx, offset;
1084
 
1085
        if (! ieee_read_number (info, pp, &stackspace)
1086
            || ! ieee_read_number (info, pp, &typindx)
1087
            || ! ieee_read_expression (info, pp, &offset))
1088
          return FALSE;
1089
 
1090
        /* We have no way to record the stack space.  FIXME.  */
1091
 
1092
        if (namlen == 0)
1093
          {
1094
            if (! debug_start_block (info->dhandle, offset))
1095
              return FALSE;
1096
            /* Change b to indicate that this is a block
1097
               rather than a function.  */
1098
            b = 0x86;
1099
          }
1100
        else
1101
          {
1102
            /* The MRI C++ compiler will output a fake function named
1103
               __XRYCPP to hold C++ debugging information.  We skip
1104
               that function.  This is not crucial, but it makes
1105
               converting from IEEE to other debug formats work
1106
               better.  */
1107
            if (strncmp (name, "__XRYCPP", namlen) == 0)
1108
              skip = TRUE;
1109
            else
1110
              {
1111
                debug_type return_type;
1112
 
1113
                if (typindx < 256)
1114
                  {
1115
                    return_type = ieee_builtin_type (info, block_start,
1116
                                                     typindx);
1117
                    if (return_type == NULL)
1118
                      return FALSE;
1119
                  }
1120
                else
1121
                  {
1122
                    typindx -= 256;
1123
                    if (! ieee_alloc_type (info, typindx, TRUE))
1124
                      return FALSE;
1125
                    fnindx = typindx;
1126
                    return_type = info->types.types[typindx].type;
1127
                    if (debug_get_type_kind (info->dhandle, return_type)
1128
                        == DEBUG_KIND_FUNCTION)
1129
                      return_type = debug_get_return_type (info->dhandle,
1130
                                                           return_type);
1131
                  }
1132
 
1133
                namcopy = savestring (name, namlen);
1134
                if (namcopy == NULL)
1135
                  return FALSE;
1136
                if (! debug_record_function (info->dhandle, namcopy,
1137
                                             return_type, FALSE, offset))
1138
                  return FALSE;
1139
              }
1140
          }
1141
      }
1142
      break;
1143
 
1144
    case 10:
1145
      /* BB10: Assembler module scope.  In the normal case, we
1146
         completely ignore all this information.  FIXME.  */
1147
      {
1148
        const char *inam, *vstr;
1149
        unsigned long inamlen, vstrlen;
1150
        bfd_vma tool_type;
1151
        bfd_boolean present;
1152
        unsigned int i;
1153
 
1154
        if (! info->saw_filename)
1155
          {
1156
            namcopy = savestring (name, namlen);
1157
            if (namcopy == NULL)
1158
              return FALSE;
1159
            if (! debug_set_filename (info->dhandle, namcopy))
1160
              return FALSE;
1161
            info->saw_filename = TRUE;
1162
          }
1163
 
1164
        if (! ieee_read_id (info, pp, &inam, &inamlen)
1165
            || ! ieee_read_number (info, pp, &tool_type)
1166
            || ! ieee_read_optional_id (info, pp, &vstr, &vstrlen, &present))
1167
          return FALSE;
1168
        for (i = 0; i < 6; i++)
1169
          {
1170
            bfd_vma ignore;
1171
 
1172
            if (! ieee_read_optional_number (info, pp, &ignore, &present))
1173
              return FALSE;
1174
            if (! present)
1175
              break;
1176
          }
1177
      }
1178
      break;
1179
 
1180
    case 11:
1181
      /* BB11: Module section.  We completely ignore all this
1182
         information.  FIXME.  */
1183
      {
1184
        bfd_vma sectype, secindx, offset, map;
1185
        bfd_boolean present;
1186
 
1187
        if (! ieee_read_number (info, pp, &sectype)
1188
            || ! ieee_read_number (info, pp, &secindx)
1189
            || ! ieee_read_expression (info, pp, &offset)
1190
            || ! ieee_read_optional_number (info, pp, &map, &present))
1191
          return FALSE;
1192
      }
1193
      break;
1194
 
1195
    default:
1196
      ieee_error (info, block_start, _("unknown BB type"));
1197
      return FALSE;
1198
    }
1199
 
1200
 
1201
  /* Push this block on the block stack.  */
1202
 
1203
  if (info->blockstack.bsp >= info->blockstack.stack + BLOCKSTACK_SIZE)
1204
    {
1205
      ieee_error (info, (const bfd_byte *) NULL, _("stack overflow"));
1206
      return FALSE;
1207
    }
1208
 
1209
  info->blockstack.bsp->kind = b;
1210
  if (b == 5)
1211
    info->blockstack.bsp->filename = namcopy;
1212
  info->blockstack.bsp->fnindx = fnindx;
1213
  info->blockstack.bsp->skip = skip;
1214
  ++info->blockstack.bsp;
1215
 
1216
  return TRUE;
1217
}
1218
 
1219
/* Handle an IEEE BE record.  */
1220
 
1221
static bfd_boolean
1222
parse_ieee_be (struct ieee_info *info, const bfd_byte **pp)
1223
{
1224
  bfd_vma offset;
1225
 
1226
  if (info->blockstack.bsp <= info->blockstack.stack)
1227
    {
1228
      ieee_error (info, *pp, _("stack underflow"));
1229
      return FALSE;
1230
    }
1231
  --info->blockstack.bsp;
1232
 
1233
  switch (info->blockstack.bsp->kind)
1234
    {
1235
    case 2:
1236
      /* When we end the global typedefs block, we copy out the
1237
         contents of info->vars.  This is because the variable indices
1238
         may be reused in the local blocks.  However, we need to
1239
         preserve them so that we can locate a function returning a
1240
         reference variable whose type is named in the global typedef
1241
         block.  */
1242
      info->global_vars = ((struct ieee_vars *)
1243
                           xmalloc (sizeof *info->global_vars));
1244
      info->global_vars->alloc = info->vars.alloc;
1245
      info->global_vars->vars = ((struct ieee_var *)
1246
                                 xmalloc (info->vars.alloc
1247
                                          * sizeof (*info->vars.vars)));
1248
      memcpy (info->global_vars->vars, info->vars.vars,
1249
              info->vars.alloc * sizeof (*info->vars.vars));
1250
 
1251
      /* We also copy out the non builtin parts of info->types, since
1252
         the types are discarded when we start a new block.  */
1253
      info->global_types = ((struct ieee_types *)
1254
                            xmalloc (sizeof *info->global_types));
1255
      info->global_types->alloc = info->types.alloc;
1256
      info->global_types->types = ((struct ieee_type *)
1257
                                   xmalloc (info->types.alloc
1258
                                            * sizeof (*info->types.types)));
1259
      memcpy (info->global_types->types, info->types.types,
1260
              info->types.alloc * sizeof (*info->types.types));
1261
      memset (info->global_types->builtins, 0,
1262
              sizeof (info->global_types->builtins));
1263
 
1264
      break;
1265
 
1266
    case 4:
1267
    case 6:
1268
      if (! ieee_read_expression (info, pp, &offset))
1269
        return FALSE;
1270
      if (! info->blockstack.bsp->skip)
1271
        {
1272
          if (! debug_end_function (info->dhandle, offset + 1))
1273
            return FALSE;
1274
        }
1275
      break;
1276
 
1277
    case 0x86:
1278
      /* This is BE6 when BB6 started a block rather than a local
1279
         function.  */
1280
      if (! ieee_read_expression (info, pp, &offset))
1281
        return FALSE;
1282
      if (! debug_end_block (info->dhandle, offset + 1))
1283
        return FALSE;
1284
      break;
1285
 
1286
    case 5:
1287
      /* When we end a BB5, we look up the stack for the last BB5, if
1288
         there is one, so that we can call debug_start_source.  */
1289
      if (info->blockstack.bsp > info->blockstack.stack)
1290
        {
1291
          struct ieee_block *bl;
1292
 
1293
          bl = info->blockstack.bsp;
1294
          do
1295
            {
1296
              --bl;
1297
              if (bl->kind == 5)
1298
                {
1299
                  if (! debug_start_source (info->dhandle, bl->filename))
1300
                    return FALSE;
1301
                  break;
1302
                }
1303
            }
1304
          while (bl != info->blockstack.stack);
1305
        }
1306
      break;
1307
 
1308
    case 11:
1309
      if (! ieee_read_expression (info, pp, &offset))
1310
        return FALSE;
1311
      /* We just ignore the module size.  FIXME.  */
1312
      break;
1313
 
1314
    default:
1315
      /* Other block types do not have any trailing information.  */
1316
      break;
1317
    }
1318
 
1319
  return TRUE;
1320
}
1321
 
1322
/* Parse an NN record.  */
1323
 
1324
static bfd_boolean
1325
parse_ieee_nn (struct ieee_info *info, const bfd_byte **pp)
1326
{
1327
  const bfd_byte *nn_start;
1328
  bfd_vma varindx;
1329
  const char *name;
1330
  unsigned long namlen;
1331
 
1332
  nn_start = *pp;
1333
 
1334
  if (! ieee_read_number (info, pp, &varindx)
1335
      || ! ieee_read_id (info, pp, &name, &namlen))
1336
    return FALSE;
1337
 
1338
  if (varindx < 32)
1339
    {
1340
      ieee_error (info, nn_start, _("illegal variable index"));
1341
      return FALSE;
1342
    }
1343
  varindx -= 32;
1344
 
1345
  if (varindx >= info->vars.alloc)
1346
    {
1347
      unsigned int alloc;
1348
 
1349
      alloc = info->vars.alloc;
1350
      if (alloc == 0)
1351
        alloc = 4;
1352
      while (varindx >= alloc)
1353
        alloc *= 2;
1354
      info->vars.vars = ((struct ieee_var *)
1355
                         xrealloc (info->vars.vars,
1356
                                   alloc * sizeof *info->vars.vars));
1357
      memset (info->vars.vars + info->vars.alloc, 0,
1358
              (alloc - info->vars.alloc) * sizeof *info->vars.vars);
1359
      info->vars.alloc = alloc;
1360
    }
1361
 
1362
  info->vars.vars[varindx].name = name;
1363
  info->vars.vars[varindx].namlen = namlen;
1364
 
1365
  return TRUE;
1366
}
1367
 
1368
/* Parse a TY record.  */
1369
 
1370
static bfd_boolean
1371
parse_ieee_ty (struct ieee_info *info, const bfd_byte **pp)
1372
{
1373
  const bfd_byte *ty_start, *ty_var_start, *ty_code_start;
1374
  bfd_vma typeindx, varindx, tc;
1375
  void *dhandle;
1376
  bfd_boolean tag, typdef;
1377
  debug_type *arg_slots;
1378
  unsigned long type_bitsize;
1379
  debug_type type;
1380
 
1381
  ty_start = *pp;
1382
 
1383
  if (! ieee_read_number (info, pp, &typeindx))
1384
    return FALSE;
1385
 
1386
  if (typeindx < 256)
1387
    {
1388
      ieee_error (info, ty_start, _("illegal type index"));
1389
      return FALSE;
1390
    }
1391
 
1392
  typeindx -= 256;
1393
  if (! ieee_alloc_type (info, typeindx, FALSE))
1394
    return FALSE;
1395
 
1396
  if (**pp != 0xce)
1397
    {
1398
      ieee_error (info, *pp, _("unknown TY code"));
1399
      return FALSE;
1400
    }
1401
  ++*pp;
1402
 
1403
  ty_var_start = *pp;
1404
 
1405
  if (! ieee_read_number (info, pp, &varindx))
1406
    return FALSE;
1407
 
1408
  if (varindx < 32)
1409
    {
1410
      ieee_error (info, ty_var_start, _("illegal variable index"));
1411
      return FALSE;
1412
    }
1413
  varindx -= 32;
1414
 
1415
  if (varindx >= info->vars.alloc || info->vars.vars[varindx].name == NULL)
1416
    {
1417
      ieee_error (info, ty_var_start, _("undefined variable in TY"));
1418
      return FALSE;
1419
    }
1420
 
1421
  ty_code_start = *pp;
1422
 
1423
  if (! ieee_read_number (info, pp, &tc))
1424
    return FALSE;
1425
 
1426
  dhandle = info->dhandle;
1427
 
1428
  tag = FALSE;
1429
  typdef = FALSE;
1430
  arg_slots = NULL;
1431
  type_bitsize = 0;
1432
  switch (tc)
1433
    {
1434
    default:
1435
      ieee_error (info, ty_code_start, _("unknown TY code"));
1436
      return FALSE;
1437
 
1438
    case '!':
1439
      /* Unknown type, with size.  We treat it as int.  FIXME.  */
1440
      {
1441
        bfd_vma size;
1442
 
1443
        if (! ieee_read_number (info, pp, &size))
1444
          return FALSE;
1445
        type = debug_make_int_type (dhandle, size, FALSE);
1446
      }
1447
      break;
1448
 
1449
    case 'A': /* Array.  */
1450
    case 'a': /* FORTRAN array in column/row order.  FIXME: Not
1451
                 distinguished from normal array.  */
1452
      {
1453
        debug_type ele_type;
1454
        bfd_vma lower, upper;
1455
 
1456
        if (! ieee_read_type_index (info, pp, &ele_type)
1457
            || ! ieee_read_number (info, pp, &lower)
1458
            || ! ieee_read_number (info, pp, &upper))
1459
          return FALSE;
1460
        type = debug_make_array_type (dhandle, ele_type,
1461
                                      ieee_builtin_type (info, ty_code_start,
1462
                                                         ((unsigned int)
1463
                                                          builtin_int)),
1464
                                      (bfd_signed_vma) lower,
1465
                                      (bfd_signed_vma) upper,
1466
                                      FALSE);
1467
      }
1468
      break;
1469
 
1470
    case 'E':
1471
      /* Simple enumeration.  */
1472
      {
1473
        bfd_vma size;
1474
        unsigned int alloc;
1475
        const char **names;
1476
        unsigned int c;
1477
        bfd_signed_vma *vals;
1478
        unsigned int i;
1479
 
1480
        if (! ieee_read_number (info, pp, &size))
1481
          return FALSE;
1482
        /* FIXME: we ignore the enumeration size.  */
1483
 
1484
        alloc = 10;
1485
        names = (const char **) xmalloc (alloc * sizeof *names);
1486
        memset (names, 0, alloc * sizeof *names);
1487
        c = 0;
1488
        while (1)
1489
          {
1490
            const char *name;
1491
            unsigned long namlen;
1492
            bfd_boolean present;
1493
 
1494
            if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1495
              return FALSE;
1496
            if (! present)
1497
              break;
1498
 
1499
            if (c + 1 >= alloc)
1500
              {
1501
                alloc += 10;
1502
                names = ((const char **)
1503
                         xrealloc (names, alloc * sizeof *names));
1504
              }
1505
 
1506
            names[c] = savestring (name, namlen);
1507
            if (names[c] == NULL)
1508
              return FALSE;
1509
            ++c;
1510
          }
1511
 
1512
        names[c] = NULL;
1513
 
1514
        vals = (bfd_signed_vma *) xmalloc (c * sizeof *vals);
1515
        for (i = 0; i < c; i++)
1516
          vals[i] = i;
1517
 
1518
        type = debug_make_enum_type (dhandle, names, vals);
1519
        tag = TRUE;
1520
      }
1521
      break;
1522
 
1523
    case 'G':
1524
      /* Struct with bit fields.  */
1525
      {
1526
        bfd_vma size;
1527
        unsigned int alloc;
1528
        debug_field *fields;
1529
        unsigned int c;
1530
 
1531
        if (! ieee_read_number (info, pp, &size))
1532
          return FALSE;
1533
 
1534
        alloc = 10;
1535
        fields = (debug_field *) xmalloc (alloc * sizeof *fields);
1536
        c = 0;
1537
        while (1)
1538
          {
1539
            const char *name;
1540
            unsigned long namlen;
1541
            bfd_boolean present;
1542
            debug_type ftype;
1543
            bfd_vma bitpos, bitsize;
1544
 
1545
            if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1546
              return FALSE;
1547
            if (! present)
1548
              break;
1549
            if (! ieee_read_type_index (info, pp, &ftype)
1550
                || ! ieee_read_number (info, pp, &bitpos)
1551
                || ! ieee_read_number (info, pp, &bitsize))
1552
              return FALSE;
1553
 
1554
            if (c + 1 >= alloc)
1555
              {
1556
                alloc += 10;
1557
                fields = ((debug_field *)
1558
                          xrealloc (fields, alloc * sizeof *fields));
1559
              }
1560
 
1561
            fields[c] = debug_make_field (dhandle, savestring (name, namlen),
1562
                                          ftype, bitpos, bitsize,
1563
                                          DEBUG_VISIBILITY_PUBLIC);
1564
            if (fields[c] == NULL)
1565
              return FALSE;
1566
            ++c;
1567
          }
1568
 
1569
        fields[c] = NULL;
1570
 
1571
        type = debug_make_struct_type (dhandle, TRUE, size, fields);
1572
        tag = TRUE;
1573
      }
1574
      break;
1575
 
1576
    case 'N':
1577
      /* Enumeration.  */
1578
      {
1579
        unsigned int alloc;
1580
        const char **names;
1581
        bfd_signed_vma *vals;
1582
        unsigned int c;
1583
 
1584
        alloc = 10;
1585
        names = (const char **) xmalloc (alloc * sizeof *names);
1586
        vals = (bfd_signed_vma *) xmalloc (alloc * sizeof *names);
1587
        c = 0;
1588
        while (1)
1589
          {
1590
            const char *name;
1591
            unsigned long namlen;
1592
            bfd_boolean present;
1593
            bfd_vma val;
1594
 
1595
            if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1596
              return FALSE;
1597
            if (! present)
1598
              break;
1599
            if (! ieee_read_number (info, pp, &val))
1600
              return FALSE;
1601
 
1602
            /* If the length of the name is zero, then the value is
1603
               actually the size of the enum.  We ignore this
1604
               information.  FIXME.  */
1605
            if (namlen == 0)
1606
              continue;
1607
 
1608
            if (c + 1 >= alloc)
1609
              {
1610
                alloc += 10;
1611
                names = ((const char **)
1612
                         xrealloc (names, alloc * sizeof *names));
1613
                vals = ((bfd_signed_vma *)
1614
                        xrealloc (vals, alloc * sizeof *vals));
1615
              }
1616
 
1617
            names[c] = savestring (name, namlen);
1618
            if (names[c] == NULL)
1619
              return FALSE;
1620
            vals[c] = (bfd_signed_vma) val;
1621
            ++c;
1622
          }
1623
 
1624
        names[c] = NULL;
1625
 
1626
        type = debug_make_enum_type (dhandle, names, vals);
1627
        tag = TRUE;
1628
      }
1629
      break;
1630
 
1631
    case 'O': /* Small pointer.  We don't distinguish small and large
1632
                 pointers.  FIXME.  */
1633
    case 'P': /* Large pointer.  */
1634
      {
1635
        debug_type t;
1636
 
1637
        if (! ieee_read_type_index (info, pp, &t))
1638
          return FALSE;
1639
        type = debug_make_pointer_type (dhandle, t);
1640
      }
1641
      break;
1642
 
1643
    case 'R':
1644
      /* Range.  */
1645
      {
1646
        bfd_vma low, high, signedp, size;
1647
 
1648
        if (! ieee_read_number (info, pp, &low)
1649
            || ! ieee_read_number (info, pp, &high)
1650
            || ! ieee_read_number (info, pp, &signedp)
1651
            || ! ieee_read_number (info, pp, &size))
1652
          return FALSE;
1653
 
1654
        type = debug_make_range_type (dhandle,
1655
                                      debug_make_int_type (dhandle, size,
1656
                                                           ! signedp),
1657
                                      (bfd_signed_vma) low,
1658
                                      (bfd_signed_vma) high);
1659
      }
1660
      break;
1661
 
1662
    case 'S': /* Struct.  */
1663
    case 'U': /* Union.  */
1664
      {
1665
        bfd_vma size;
1666
        unsigned int alloc;
1667
        debug_field *fields;
1668
        unsigned int c;
1669
 
1670
        if (! ieee_read_number (info, pp, &size))
1671
          return FALSE;
1672
 
1673
        alloc = 10;
1674
        fields = (debug_field *) xmalloc (alloc * sizeof *fields);
1675
        c = 0;
1676
        while (1)
1677
          {
1678
            const char *name;
1679
            unsigned long namlen;
1680
            bfd_boolean present;
1681
            bfd_vma tindx;
1682
            bfd_vma offset;
1683
            debug_type ftype;
1684
            bfd_vma bitsize;
1685
 
1686
            if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1687
              return FALSE;
1688
            if (! present)
1689
              break;
1690
            if (! ieee_read_number (info, pp, &tindx)
1691
                || ! ieee_read_number (info, pp, &offset))
1692
              return FALSE;
1693
 
1694
            if (tindx < 256)
1695
              {
1696
                ftype = ieee_builtin_type (info, ty_code_start, tindx);
1697
                bitsize = 0;
1698
                offset *= 8;
1699
              }
1700
            else
1701
              {
1702
                struct ieee_type *t;
1703
 
1704
                tindx -= 256;
1705
                if (! ieee_alloc_type (info, tindx, TRUE))
1706
                  return FALSE;
1707
                t = info->types.types + tindx;
1708
                ftype = t->type;
1709
                bitsize = t->bitsize;
1710
                if (bitsize == 0)
1711
                  offset *= 8;
1712
              }
1713
 
1714
            if (c + 1 >= alloc)
1715
              {
1716
                alloc += 10;
1717
                fields = ((debug_field *)
1718
                          xrealloc (fields, alloc * sizeof *fields));
1719
              }
1720
 
1721
            fields[c] = debug_make_field (dhandle, savestring (name, namlen),
1722
                                          ftype, offset, bitsize,
1723
                                          DEBUG_VISIBILITY_PUBLIC);
1724
            if (fields[c] == NULL)
1725
              return FALSE;
1726
            ++c;
1727
          }
1728
 
1729
        fields[c] = NULL;
1730
 
1731
        type = debug_make_struct_type (dhandle, tc == 'S', size, fields);
1732
        tag = TRUE;
1733
      }
1734
      break;
1735
 
1736
    case 'T':
1737
      /* Typedef.  */
1738
      if (! ieee_read_type_index (info, pp, &type))
1739
        return FALSE;
1740
      typdef = TRUE;
1741
      break;
1742
 
1743
    case 'X':
1744
      /* Procedure.  FIXME: This is an extern declaration, which we
1745
         have no way of representing.  */
1746
      {
1747
        bfd_vma attr;
1748
        debug_type rtype;
1749
        bfd_vma nargs;
1750
        bfd_boolean present;
1751
        struct ieee_var *pv;
1752
 
1753
        /* FIXME: We ignore the attribute and the argument names.  */
1754
 
1755
        if (! ieee_read_number (info, pp, &attr)
1756
            || ! ieee_read_type_index (info, pp, &rtype)
1757
            || ! ieee_read_number (info, pp, &nargs))
1758
          return FALSE;
1759
        do
1760
          {
1761
            const char *name;
1762
            unsigned long namlen;
1763
 
1764
            if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1765
              return FALSE;
1766
          }
1767
        while (present);
1768
 
1769
        pv = info->vars.vars + varindx;
1770
        pv->kind = IEEE_EXTERNAL;
1771
        if (pv->namlen > 0
1772
            && debug_get_type_kind (dhandle, rtype) == DEBUG_KIND_POINTER)
1773
          {
1774
            /* Set up the return type as an indirect type pointing to
1775
               the variable slot, so that we can change it to a
1776
               reference later if appropriate.  */
1777
            pv->pslot = (debug_type *) xmalloc (sizeof *pv->pslot);
1778
            *pv->pslot = rtype;
1779
            rtype = debug_make_indirect_type (dhandle, pv->pslot,
1780
                                              (const char *) NULL);
1781
          }
1782
 
1783
        type = debug_make_function_type (dhandle, rtype, (debug_type *) NULL,
1784
                                         FALSE);
1785
      }
1786
      break;
1787
 
1788
    case 'V':
1789
      /* Void.  This is not documented, but the MRI compiler emits it.  */
1790
      type = debug_make_void_type (dhandle);
1791
      break;
1792
 
1793
    case 'Z':
1794
      /* Array with 0 lower bound.  */
1795
      {
1796
        debug_type etype;
1797
        bfd_vma high;
1798
 
1799
        if (! ieee_read_type_index (info, pp, &etype)
1800
            || ! ieee_read_number (info, pp, &high))
1801
          return FALSE;
1802
 
1803
        type = debug_make_array_type (dhandle, etype,
1804
                                      ieee_builtin_type (info, ty_code_start,
1805
                                                         ((unsigned int)
1806
                                                          builtin_int)),
1807
                                      0, (bfd_signed_vma) high, FALSE);
1808
      }
1809
      break;
1810
 
1811
    case 'c': /* Complex.  */
1812
    case 'd': /* Double complex.  */
1813
      {
1814
        const char *name;
1815
        unsigned long namlen;
1816
 
1817
        /* FIXME: I don't know what the name means.  */
1818
 
1819
        if (! ieee_read_id (info, pp, &name, &namlen))
1820
          return FALSE;
1821
 
1822
        type = debug_make_complex_type (dhandle, tc == 'c' ? 4 : 8);
1823
      }
1824
      break;
1825
 
1826
    case 'f':
1827
      /* Pascal file name.  FIXME.  */
1828
      ieee_error (info, ty_code_start, _("Pascal file name not supported"));
1829
      return FALSE;
1830
 
1831
    case 'g':
1832
      /* Bitfield type.  */
1833
      {
1834
        bfd_vma signedp, bitsize, dummy;
1835
        const bfd_byte *hold;
1836
        bfd_boolean present;
1837
 
1838
        if (! ieee_read_number (info, pp, &signedp)
1839
            || ! ieee_read_number (info, pp, &bitsize))
1840
          return FALSE;
1841
 
1842
        /* I think the documentation says that there is a type index,
1843
           but some actual files do not have one.  */
1844
        hold = *pp;
1845
        if (! ieee_read_optional_number (info, pp, &dummy, &present))
1846
          return FALSE;
1847
        if (! present)
1848
          {
1849
            /* FIXME: This is just a guess.  */
1850
            type = debug_make_int_type (dhandle, 4,
1851
                                        signedp ? FALSE : TRUE);
1852
          }
1853
        else
1854
          {
1855
            *pp = hold;
1856
            if (! ieee_read_type_index (info, pp, &type))
1857
              return FALSE;
1858
          }
1859
        type_bitsize = bitsize;
1860
      }
1861
      break;
1862
 
1863
    case 'n':
1864
      /* Qualifier.  */
1865
      {
1866
        bfd_vma kind;
1867
        debug_type t;
1868
 
1869
        if (! ieee_read_number (info, pp, &kind)
1870
            || ! ieee_read_type_index (info, pp, &t))
1871
          return FALSE;
1872
 
1873
        switch (kind)
1874
          {
1875
          default:
1876
            ieee_error (info, ty_start, _("unsupported qualifier"));
1877
            return FALSE;
1878
 
1879
          case 1:
1880
            type = debug_make_const_type (dhandle, t);
1881
            break;
1882
 
1883
          case 2:
1884
            type = debug_make_volatile_type (dhandle, t);
1885
            break;
1886
          }
1887
      }
1888
      break;
1889
 
1890
    case 's':
1891
      /* Set.  */
1892
      {
1893
        bfd_vma size;
1894
        debug_type etype;
1895
 
1896
        if (! ieee_read_number (info, pp, &size)
1897
            || ! ieee_read_type_index (info, pp, &etype))
1898
          return FALSE;
1899
 
1900
        /* FIXME: We ignore the size.  */
1901
 
1902
        type = debug_make_set_type (dhandle, etype, FALSE);
1903
      }
1904
      break;
1905
 
1906
    case 'x':
1907
      /* Procedure with compiler dependencies.  */
1908
      {
1909
        struct ieee_var *pv;
1910
        bfd_vma attr, frame_type, push_mask, nargs, level, father;
1911
        debug_type rtype;
1912
        debug_type *arg_types;
1913
        bfd_boolean varargs;
1914
        bfd_boolean present;
1915
 
1916
        /* FIXME: We ignore some of this information.  */
1917
 
1918
        pv = info->vars.vars + varindx;
1919
 
1920
        if (! ieee_read_number (info, pp, &attr)
1921
            || ! ieee_read_number (info, pp, &frame_type)
1922
            || ! ieee_read_number (info, pp, &push_mask)
1923
            || ! ieee_read_type_index (info, pp, &rtype)
1924
            || ! ieee_read_number (info, pp, &nargs))
1925
          return FALSE;
1926
        if (nargs == (bfd_vma) -1)
1927
          {
1928
            arg_types = NULL;
1929
            varargs = FALSE;
1930
          }
1931
        else
1932
          {
1933
            unsigned int i;
1934
 
1935
            arg_types = ((debug_type *)
1936
                         xmalloc ((nargs + 1) * sizeof *arg_types));
1937
            for (i = 0; i < nargs; i++)
1938
              if (! ieee_read_type_index (info, pp, arg_types + i))
1939
                return FALSE;
1940
 
1941
            /* If the last type is pointer to void, this is really a
1942
               varargs function.  */
1943
            varargs = FALSE;
1944
            if (nargs > 0)
1945
              {
1946
                debug_type last;
1947
 
1948
                last = arg_types[nargs - 1];
1949
                if (debug_get_type_kind (dhandle, last) == DEBUG_KIND_POINTER
1950
                    && (debug_get_type_kind (dhandle,
1951
                                             debug_get_target_type (dhandle,
1952
                                                                    last))
1953
                        == DEBUG_KIND_VOID))
1954
                  {
1955
                    --nargs;
1956
                    varargs = TRUE;
1957
                  }
1958
              }
1959
 
1960
            /* If there are any pointer arguments, turn them into
1961
               indirect types in case we later need to convert them to
1962
               reference types.  */
1963
            for (i = 0; i < nargs; i++)
1964
              {
1965
                if (debug_get_type_kind (dhandle, arg_types[i])
1966
                    == DEBUG_KIND_POINTER)
1967
                  {
1968
                    if (arg_slots == NULL)
1969
                      {
1970
                        arg_slots = ((debug_type *)
1971
                                     xmalloc (nargs * sizeof *arg_slots));
1972
                        memset (arg_slots, 0, nargs * sizeof *arg_slots);
1973
                      }
1974
                    arg_slots[i] = arg_types[i];
1975
                    arg_types[i] =
1976
                      debug_make_indirect_type (dhandle,
1977
                                                arg_slots + i,
1978
                                                (const char *) NULL);
1979
                  }
1980
              }
1981
 
1982
            arg_types[nargs] = DEBUG_TYPE_NULL;
1983
          }
1984
        if (! ieee_read_number (info, pp, &level)
1985
            || ! ieee_read_optional_number (info, pp, &father, &present))
1986
          return FALSE;
1987
 
1988
        /* We can't distinguish between a global function and a static
1989
           function.  */
1990
        pv->kind = IEEE_FUNCTION;
1991
 
1992
        if (pv->namlen > 0
1993
            && debug_get_type_kind (dhandle, rtype) == DEBUG_KIND_POINTER)
1994
          {
1995
            /* Set up the return type as an indirect type pointing to
1996
               the variable slot, so that we can change it to a
1997
               reference later if appropriate.  */
1998
            pv->pslot = (debug_type *) xmalloc (sizeof *pv->pslot);
1999
            *pv->pslot = rtype;
2000
            rtype = debug_make_indirect_type (dhandle, pv->pslot,
2001
                                              (const char *) NULL);
2002
          }
2003
 
2004
        type = debug_make_function_type (dhandle, rtype, arg_types, varargs);
2005
      }
2006
      break;
2007
    }
2008
 
2009
  /* Record the type in the table.  */
2010
 
2011
  if (type == DEBUG_TYPE_NULL)
2012
    return FALSE;
2013
 
2014
  info->vars.vars[varindx].type = type;
2015
 
2016
  if ((tag || typdef)
2017
      && info->vars.vars[varindx].namlen > 0)
2018
    {
2019
      const char *name;
2020
 
2021
      name = savestring (info->vars.vars[varindx].name,
2022
                         info->vars.vars[varindx].namlen);
2023
      if (typdef)
2024
        type = debug_name_type (dhandle, name, type);
2025
      else if (tc == 'E' || tc == 'N')
2026
        type = debug_tag_type (dhandle, name, type);
2027
      else
2028
        {
2029
          struct ieee_tag *it;
2030
 
2031
          /* We must allocate all struct tags as indirect types, so
2032
             that if we later see a definition of the tag as a C++
2033
             record we can update the indirect slot and automatically
2034
             change all the existing references.  */
2035
          it = (struct ieee_tag *) xmalloc (sizeof *it);
2036
          memset (it, 0, sizeof *it);
2037
          it->next = info->tags;
2038
          info->tags = it;
2039
          it->name = name;
2040
          it->slot = type;
2041
 
2042
          type = debug_make_indirect_type (dhandle, &it->slot, name);
2043
          type = debug_tag_type (dhandle, name, type);
2044
 
2045
          it->type = type;
2046
        }
2047
      if (type == NULL)
2048
        return FALSE;
2049
    }
2050
 
2051
  info->types.types[typeindx].type = type;
2052
  info->types.types[typeindx].arg_slots = arg_slots;
2053
  info->types.types[typeindx].bitsize = type_bitsize;
2054
 
2055
  /* We may have already allocated type as an indirect type pointing
2056
     to slot.  It does no harm to replace the indirect type with the
2057
     real type.  Filling in slot as well handles the indirect types
2058
     which are already hanging around.  */
2059
  if (info->types.types[typeindx].pslot != NULL)
2060
    *info->types.types[typeindx].pslot = type;
2061
 
2062
  return TRUE;
2063
}
2064
 
2065
/* Parse an ATN record.  */
2066
 
2067
static bfd_boolean
2068
parse_ieee_atn (struct ieee_info *info, const bfd_byte **pp)
2069
{
2070
  const bfd_byte *atn_start, *atn_code_start;
2071
  bfd_vma varindx;
2072
  struct ieee_var *pvar;
2073
  debug_type type;
2074
  bfd_vma atn_code;
2075
  void *dhandle;
2076
  bfd_vma v, v2, v3, v4, v5;
2077
  const char *name;
2078
  unsigned long namlen;
2079
  char *namcopy;
2080
  bfd_boolean present;
2081
  int blocktype;
2082
 
2083
  atn_start = *pp;
2084
 
2085
  if (! ieee_read_number (info, pp, &varindx)
2086
      || ! ieee_read_type_index (info, pp, &type))
2087
    return FALSE;
2088
 
2089
  atn_code_start = *pp;
2090
 
2091
  if (! ieee_read_number (info, pp, &atn_code))
2092
    return FALSE;
2093
 
2094
  if (varindx == 0)
2095
    {
2096
      pvar = NULL;
2097
      name = "";
2098
      namlen = 0;
2099
    }
2100
  else if (varindx < 32)
2101
    {
2102
      /* The MRI compiler reportedly sometimes emits variable lifetime
2103
         information for a register.  We just ignore it.  */
2104
      if (atn_code == 9)
2105
        return ieee_read_number (info, pp, &v);
2106
 
2107
      ieee_error (info, atn_start, _("illegal variable index"));
2108
      return FALSE;
2109
    }
2110
  else
2111
    {
2112
      varindx -= 32;
2113
      if (varindx >= info->vars.alloc
2114
          || info->vars.vars[varindx].name == NULL)
2115
        {
2116
          /* The MRI compiler or linker sometimes omits the NN record
2117
             for a pmisc record.  */
2118
          if (atn_code == 62)
2119
            {
2120
              if (varindx >= info->vars.alloc)
2121
                {
2122
                  unsigned int alloc;
2123
 
2124
                  alloc = info->vars.alloc;
2125
                  if (alloc == 0)
2126
                    alloc = 4;
2127
                  while (varindx >= alloc)
2128
                    alloc *= 2;
2129
                  info->vars.vars = ((struct ieee_var *)
2130
                                     xrealloc (info->vars.vars,
2131
                                               (alloc
2132
                                                * sizeof *info->vars.vars)));
2133
                  memset (info->vars.vars + info->vars.alloc, 0,
2134
                          ((alloc - info->vars.alloc)
2135
                           * sizeof *info->vars.vars));
2136
                  info->vars.alloc = alloc;
2137
                }
2138
 
2139
              pvar = info->vars.vars + varindx;
2140
              pvar->name = "";
2141
              pvar->namlen = 0;
2142
            }
2143
          else
2144
            {
2145
              ieee_error (info, atn_start, _("undefined variable in ATN"));
2146
              return FALSE;
2147
            }
2148
        }
2149
 
2150
      pvar = info->vars.vars + varindx;
2151
 
2152
      pvar->type = type;
2153
 
2154
      name = pvar->name;
2155
      namlen = pvar->namlen;
2156
    }
2157
 
2158
  dhandle = info->dhandle;
2159
 
2160
  /* If we are going to call debug_record_variable with a pointer
2161
     type, change the type to an indirect type so that we can later
2162
     change it to a reference type if we encounter a C++ pmisc 'R'
2163
     record.  */
2164
  if (pvar != NULL
2165
      && type != DEBUG_TYPE_NULL
2166
      && debug_get_type_kind (dhandle, type) == DEBUG_KIND_POINTER)
2167
    {
2168
      switch (atn_code)
2169
        {
2170
        case 1:
2171
        case 2:
2172
        case 3:
2173
        case 5:
2174
        case 8:
2175
        case 10:
2176
          pvar->pslot = (debug_type *) xmalloc (sizeof *pvar->pslot);
2177
          *pvar->pslot = type;
2178
          type = debug_make_indirect_type (dhandle, pvar->pslot,
2179
                                           (const char *) NULL);
2180
          pvar->type = type;
2181
          break;
2182
        }
2183
    }
2184
 
2185
  switch (atn_code)
2186
    {
2187
    default:
2188
      ieee_error (info, atn_code_start, _("unknown ATN type"));
2189
      return FALSE;
2190
 
2191
    case 1:
2192
      /* Automatic variable.  */
2193
      if (! ieee_read_number (info, pp, &v))
2194
        return FALSE;
2195
      namcopy = savestring (name, namlen);
2196
      if (type == NULL)
2197
        type = debug_make_void_type (dhandle);
2198
      if (pvar != NULL)
2199
        pvar->kind = IEEE_LOCAL;
2200
      return debug_record_variable (dhandle, namcopy, type, DEBUG_LOCAL, v);
2201
 
2202
    case 2:
2203
      /* Register variable.  */
2204
      if (! ieee_read_number (info, pp, &v))
2205
        return FALSE;
2206
      namcopy = savestring (name, namlen);
2207
      if (type == NULL)
2208
        type = debug_make_void_type (dhandle);
2209
      if (pvar != NULL)
2210
        pvar->kind = IEEE_LOCAL;
2211
      return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER,
2212
                                    ieee_regno_to_genreg (info->abfd, v));
2213
 
2214
    case 3:
2215
      /* Static variable.  */
2216
      if (! ieee_require_asn (info, pp, &v))
2217
        return FALSE;
2218
      namcopy = savestring (name, namlen);
2219
      if (type == NULL)
2220
        type = debug_make_void_type (dhandle);
2221
      if (info->blockstack.bsp <= info->blockstack.stack)
2222
        blocktype = 0;
2223
      else
2224
        blocktype = info->blockstack.bsp[-1].kind;
2225
      if (pvar != NULL)
2226
        {
2227
          if (blocktype == 4 || blocktype == 6)
2228
            pvar->kind = IEEE_LOCAL;
2229
          else
2230
            pvar->kind = IEEE_STATIC;
2231
        }
2232
      return debug_record_variable (dhandle, namcopy, type,
2233
                                    (blocktype == 4 || blocktype == 6
2234
                                     ? DEBUG_LOCAL_STATIC
2235
                                     : DEBUG_STATIC),
2236
                                    v);
2237
 
2238
    case 4:
2239
      /* External function.  We don't currently record these.  FIXME.  */
2240
      if (pvar != NULL)
2241
        pvar->kind = IEEE_EXTERNAL;
2242
      return TRUE;
2243
 
2244
    case 5:
2245
      /* External variable.  We don't currently record these.  FIXME.  */
2246
      if (pvar != NULL)
2247
        pvar->kind = IEEE_EXTERNAL;
2248
      return TRUE;
2249
 
2250
    case 7:
2251
      if (! ieee_read_number (info, pp, &v)
2252
          || ! ieee_read_number (info, pp, &v2)
2253
          || ! ieee_read_optional_number (info, pp, &v3, &present))
2254
        return FALSE;
2255
      if (present)
2256
        {
2257
          if (! ieee_read_optional_number (info, pp, &v4, &present))
2258
            return FALSE;
2259
        }
2260
 
2261
      /* We just ignore the two optional fields in v3 and v4, since
2262
         they are not defined.  */
2263
 
2264
      if (! ieee_require_asn (info, pp, &v3))
2265
        return FALSE;
2266
 
2267
      /* We have no way to record the column number.  FIXME.  */
2268
 
2269
      return debug_record_line (dhandle, v, v3);
2270
 
2271
    case 8:
2272
      /* Global variable.  */
2273
      if (! ieee_require_asn (info, pp, &v))
2274
        return FALSE;
2275
      namcopy = savestring (name, namlen);
2276
      if (type == NULL)
2277
        type = debug_make_void_type (dhandle);
2278
      if (pvar != NULL)
2279
        pvar->kind = IEEE_GLOBAL;
2280
      return debug_record_variable (dhandle, namcopy, type, DEBUG_GLOBAL, v);
2281
 
2282
    case 9:
2283
      /* Variable lifetime information.  */
2284
      if (! ieee_read_number (info, pp, &v))
2285
        return FALSE;
2286
 
2287
      /* We have no way to record this information.  FIXME.  */
2288
      return TRUE;
2289
 
2290
    case 10:
2291
      /* Locked register.  The spec says that there are two required
2292
         fields, but at least on occasion the MRI compiler only emits
2293
         one.  */
2294
      if (! ieee_read_number (info, pp, &v)
2295
          || ! ieee_read_optional_number (info, pp, &v2, &present))
2296
        return FALSE;
2297
 
2298
      /* I think this means a variable that is both in a register and
2299
         a frame slot.  We ignore the frame slot.  FIXME.  */
2300
 
2301
      namcopy = savestring (name, namlen);
2302
      if (type == NULL)
2303
        type = debug_make_void_type (dhandle);
2304
      if (pvar != NULL)
2305
        pvar->kind = IEEE_LOCAL;
2306
      return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER, v);
2307
 
2308
    case 11:
2309
      /* Reserved for FORTRAN common.  */
2310
      ieee_error (info, atn_code_start, _("unsupported ATN11"));
2311
 
2312
      /* Return TRUE to keep going.  */
2313
      return TRUE;
2314
 
2315
    case 12:
2316
      /* Based variable.  */
2317
      v3 = 0;
2318
      v4 = 0x80;
2319
      v5 = 0;
2320
      if (! ieee_read_number (info, pp, &v)
2321
          || ! ieee_read_number (info, pp, &v2)
2322
          || ! ieee_read_optional_number (info, pp, &v3, &present))
2323
        return FALSE;
2324
      if (present)
2325
        {
2326
          if (! ieee_read_optional_number (info, pp, &v4, &present))
2327
            return FALSE;
2328
          if (present)
2329
            {
2330
              if (! ieee_read_optional_number (info, pp, &v5, &present))
2331
                return FALSE;
2332
            }
2333
        }
2334
 
2335
      /* We have no way to record this information.  FIXME.  */
2336
 
2337
      ieee_error (info, atn_code_start, _("unsupported ATN12"));
2338
 
2339
      /* Return TRUE to keep going.  */
2340
      return TRUE;
2341
 
2342
    case 16:
2343
      /* Constant.  The description of this that I have is ambiguous,
2344
         so I'm not going to try to implement it.  */
2345
      if (! ieee_read_number (info, pp, &v)
2346
          || ! ieee_read_optional_number (info, pp, &v2, &present))
2347
        return FALSE;
2348
      if (present)
2349
        {
2350
          if (! ieee_read_optional_number (info, pp, &v2, &present))
2351
            return FALSE;
2352
          if (present)
2353
            {
2354
              if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
2355
                return FALSE;
2356
            }
2357
        }
2358
 
2359
      if ((ieee_record_enum_type) **pp == ieee_e2_first_byte_enum)
2360
        {
2361
          if (! ieee_require_asn (info, pp, &v3))
2362
            return FALSE;
2363
        }
2364
 
2365
      return TRUE;
2366
 
2367
    case 19:
2368
      /* Static variable from assembler.  */
2369
      v2 = 0;
2370
      if (! ieee_read_number (info, pp, &v)
2371
          || ! ieee_read_optional_number (info, pp, &v2, &present)
2372
          || ! ieee_require_asn (info, pp, &v3))
2373
        return FALSE;
2374
      namcopy = savestring (name, namlen);
2375
      /* We don't really handle this correctly.  FIXME.  */
2376
      return debug_record_variable (dhandle, namcopy,
2377
                                    debug_make_void_type (dhandle),
2378
                                    v2 != 0 ? DEBUG_GLOBAL : DEBUG_STATIC,
2379
                                    v3);
2380
 
2381
    case 62:
2382
      /* Procedure miscellaneous information.  */
2383
    case 63:
2384
      /* Variable miscellaneous information.  */
2385
    case 64:
2386
      /* Module miscellaneous information.  */
2387
      if (! ieee_read_number (info, pp, &v)
2388
          || ! ieee_read_number (info, pp, &v2)
2389
          || ! ieee_read_optional_id (info, pp, &name, &namlen, &present))
2390
        return FALSE;
2391
 
2392
      if (atn_code == 62 && v == 80)
2393
        {
2394
          if (present)
2395
            {
2396
              ieee_error (info, atn_code_start,
2397
                          _("unexpected string in C++ misc"));
2398
              return FALSE;
2399
            }
2400
          return ieee_read_cxx_misc (info, pp, v2);
2401
        }
2402
 
2403
      /* We just ignore all of this stuff.  FIXME.  */
2404
 
2405
      for (; v2 > 0; --v2)
2406
        {
2407
          switch ((ieee_record_enum_type) **pp)
2408
            {
2409
            default:
2410
              ieee_error (info, *pp, _("bad misc record"));
2411
              return FALSE;
2412
 
2413
            case ieee_at_record_enum:
2414
              if (! ieee_require_atn65 (info, pp, &name, &namlen))
2415
                return FALSE;
2416
              break;
2417
 
2418
            case ieee_e2_first_byte_enum:
2419
              if (! ieee_require_asn (info, pp, &v3))
2420
                return FALSE;
2421
              break;
2422
            }
2423
        }
2424
 
2425
      return TRUE;
2426
    }
2427
 
2428
  /*NOTREACHED*/
2429
}
2430
 
2431
/* Handle C++ debugging miscellaneous records.  This is called for
2432
   procedure miscellaneous records of type 80.  */
2433
 
2434
static bfd_boolean
2435
ieee_read_cxx_misc (struct ieee_info *info, const bfd_byte **pp,
2436
                    unsigned long count)
2437
{
2438
  const bfd_byte *start;
2439
  bfd_vma category;
2440
 
2441
  start = *pp;
2442
 
2443
  /* Get the category of C++ misc record.  */
2444
  if (! ieee_require_asn (info, pp, &category))
2445
    return FALSE;
2446
  --count;
2447
 
2448
  switch (category)
2449
    {
2450
    default:
2451
      ieee_error (info, start, _("unrecognized C++ misc record"));
2452
      return FALSE;
2453
 
2454
    case 'T':
2455
      if (! ieee_read_cxx_class (info, pp, count))
2456
        return FALSE;
2457
      break;
2458
 
2459
    case 'M':
2460
      {
2461
        bfd_vma flags;
2462
        const char *name;
2463
        unsigned long namlen;
2464
 
2465
        /* The IEEE spec indicates that the 'M' record only has a
2466
           flags field.  The MRI compiler also emits the name of the
2467
           function.  */
2468
 
2469
        if (! ieee_require_asn (info, pp, &flags))
2470
          return FALSE;
2471
        if (*pp < info->pend
2472
            && (ieee_record_enum_type) **pp == ieee_at_record_enum)
2473
          {
2474
            if (! ieee_require_atn65 (info, pp, &name, &namlen))
2475
              return FALSE;
2476
          }
2477
 
2478
        /* This is emitted for method functions, but I don't think we
2479
           care very much.  It might help if it told us useful
2480
           information like the class with which this function is
2481
           associated, but it doesn't, so it isn't helpful.  */
2482
      }
2483
      break;
2484
 
2485
    case 'B':
2486
      if (! ieee_read_cxx_defaults (info, pp, count))
2487
        return FALSE;
2488
      break;
2489
 
2490
    case 'z':
2491
      {
2492
        const char *name, *mangled, *class;
2493
        unsigned long namlen, mangledlen, classlen;
2494
        bfd_vma control;
2495
 
2496
        /* Pointer to member.  */
2497
 
2498
        if (! ieee_require_atn65 (info, pp, &name, &namlen)
2499
            || ! ieee_require_atn65 (info, pp, &mangled, &mangledlen)
2500
            || ! ieee_require_atn65 (info, pp, &class, &classlen)
2501
            || ! ieee_require_asn (info, pp, &control))
2502
          return FALSE;
2503
 
2504
        /* FIXME: We should now track down name and change its type.  */
2505
      }
2506
      break;
2507
 
2508
    case 'R':
2509
      if (! ieee_read_reference (info, pp))
2510
        return FALSE;
2511
      break;
2512
    }
2513
 
2514
  return TRUE;
2515
}
2516
 
2517
/* Read a C++ class definition.  This is a pmisc type 80 record of
2518
   category 'T'.  */
2519
 
2520
static bfd_boolean
2521
ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp,
2522
                     unsigned long count)
2523
{
2524
  const bfd_byte *start;
2525
  bfd_vma class;
2526
  const char *tag;
2527
  unsigned long taglen;
2528
  struct ieee_tag *it;
2529
  void *dhandle;
2530
  debug_field *fields;
2531
  unsigned int field_count, field_alloc;
2532
  debug_baseclass *baseclasses;
2533
  unsigned int baseclasses_count, baseclasses_alloc;
2534
  const debug_field *structfields;
2535
  struct ieee_method
2536
    {
2537
      const char *name;
2538
      unsigned long namlen;
2539
      debug_method_variant *variants;
2540
      unsigned count;
2541
      unsigned int alloc;
2542
    } *methods;
2543
  unsigned int methods_count, methods_alloc;
2544
  debug_type vptrbase;
2545
  bfd_boolean ownvptr;
2546
  debug_method *dmethods;
2547
 
2548
  start = *pp;
2549
 
2550
  if (! ieee_require_asn (info, pp, &class))
2551
    return FALSE;
2552
  --count;
2553
 
2554
  if (! ieee_require_atn65 (info, pp, &tag, &taglen))
2555
    return FALSE;
2556
  --count;
2557
 
2558
  /* Find the C struct with this name.  */
2559
  for (it = info->tags; it != NULL; it = it->next)
2560
    if (it->name[0] == tag[0]
2561
        && strncmp (it->name, tag, taglen) == 0
2562
        && strlen (it->name) == taglen)
2563
      break;
2564
  if (it == NULL)
2565
    {
2566
      ieee_error (info, start, _("undefined C++ object"));
2567
      return FALSE;
2568
    }
2569
 
2570
  dhandle = info->dhandle;
2571
 
2572
  fields = NULL;
2573
  field_count = 0;
2574
  field_alloc = 0;
2575
  baseclasses = NULL;
2576
  baseclasses_count = 0;
2577
  baseclasses_alloc = 0;
2578
  methods = NULL;
2579
  methods_count = 0;
2580
  methods_alloc = 0;
2581
  vptrbase = DEBUG_TYPE_NULL;
2582
  ownvptr = FALSE;
2583
 
2584
  structfields = debug_get_fields (dhandle, it->type);
2585
 
2586
  while (count > 0)
2587
    {
2588
      bfd_vma id;
2589
      const bfd_byte *spec_start;
2590
 
2591
      spec_start = *pp;
2592
 
2593
      if (! ieee_require_asn (info, pp, &id))
2594
        return FALSE;
2595
      --count;
2596
 
2597
      switch (id)
2598
        {
2599
        default:
2600
          ieee_error (info, spec_start, _("unrecognized C++ object spec"));
2601
          return FALSE;
2602
 
2603
        case 'b':
2604
          {
2605
            bfd_vma flags, cinline;
2606
            const char *basename, *fieldname;
2607
            unsigned long baselen, fieldlen;
2608
            char *basecopy;
2609
            debug_type basetype;
2610
            bfd_vma bitpos;
2611
            bfd_boolean virtualp;
2612
            enum debug_visibility visibility;
2613
            debug_baseclass baseclass;
2614
 
2615
            /* This represents a base or friend class.  */
2616
 
2617
            if (! ieee_require_asn (info, pp, &flags)
2618
                || ! ieee_require_atn65 (info, pp, &basename, &baselen)
2619
                || ! ieee_require_asn (info, pp, &cinline)
2620
                || ! ieee_require_atn65 (info, pp, &fieldname, &fieldlen))
2621
              return FALSE;
2622
            count -= 4;
2623
 
2624
            /* We have no way of recording friend information, so we
2625
               just ignore it.  */
2626
            if ((flags & BASEFLAGS_FRIEND) != 0)
2627
              break;
2628
 
2629
            /* I assume that either all of the members of the
2630
               baseclass are included in the object, starting at the
2631
               beginning of the object, or that none of them are
2632
               included.  */
2633
 
2634
            if ((fieldlen == 0) == (cinline == 0))
2635
              {
2636
                ieee_error (info, start, _("unsupported C++ object type"));
2637
                return FALSE;
2638
              }
2639
 
2640
            basecopy = savestring (basename, baselen);
2641
            basetype = debug_find_tagged_type (dhandle, basecopy,
2642
                                               DEBUG_KIND_ILLEGAL);
2643
            free (basecopy);
2644
            if (basetype == DEBUG_TYPE_NULL)
2645
              {
2646
                ieee_error (info, start, _("C++ base class not defined"));
2647
                return FALSE;
2648
              }
2649
 
2650
            if (fieldlen == 0)
2651
              bitpos = 0;
2652
            else
2653
              {
2654
                const debug_field *pf;
2655
 
2656
                if (structfields == NULL)
2657
                  {
2658
                    ieee_error (info, start, _("C++ object has no fields"));
2659
                    return FALSE;
2660
                  }
2661
 
2662
                for (pf = structfields; *pf != DEBUG_FIELD_NULL; pf++)
2663
                  {
2664
                    const char *fname;
2665
 
2666
                    fname = debug_get_field_name (dhandle, *pf);
2667
                    if (fname == NULL)
2668
                      return FALSE;
2669
                    if (fname[0] == fieldname[0]
2670
                        && strncmp (fname, fieldname, fieldlen) == 0
2671
                        && strlen (fname) == fieldlen)
2672
                      break;
2673
                  }
2674
                if (*pf == DEBUG_FIELD_NULL)
2675
                  {
2676
                    ieee_error (info, start,
2677
                                _("C++ base class not found in container"));
2678
                    return FALSE;
2679
                  }
2680
 
2681
                bitpos = debug_get_field_bitpos (dhandle, *pf);
2682
              }
2683
 
2684
            if ((flags & BASEFLAGS_VIRTUAL) != 0)
2685
              virtualp = TRUE;
2686
            else
2687
              virtualp = FALSE;
2688
            if ((flags & BASEFLAGS_PRIVATE) != 0)
2689
              visibility = DEBUG_VISIBILITY_PRIVATE;
2690
            else
2691
              visibility = DEBUG_VISIBILITY_PUBLIC;
2692
 
2693
            baseclass = debug_make_baseclass (dhandle, basetype, bitpos,
2694
                                              virtualp, visibility);
2695
            if (baseclass == DEBUG_BASECLASS_NULL)
2696
              return FALSE;
2697
 
2698
            if (baseclasses_count + 1 >= baseclasses_alloc)
2699
              {
2700
                baseclasses_alloc += 10;
2701
                baseclasses = ((debug_baseclass *)
2702
                               xrealloc (baseclasses,
2703
                                         (baseclasses_alloc
2704
                                          * sizeof *baseclasses)));
2705
              }
2706
 
2707
            baseclasses[baseclasses_count] = baseclass;
2708
            ++baseclasses_count;
2709
            baseclasses[baseclasses_count] = DEBUG_BASECLASS_NULL;
2710
          }
2711
          break;
2712
 
2713
        case 'd':
2714
          {
2715
            bfd_vma flags;
2716
            const char *fieldname, *mangledname;
2717
            unsigned long fieldlen, mangledlen;
2718
            char *fieldcopy;
2719
            bfd_boolean staticp;
2720
            debug_type ftype;
2721
            const debug_field *pf = NULL;
2722
            enum debug_visibility visibility;
2723
            debug_field field;
2724
 
2725
            /* This represents a data member.  */
2726
 
2727
            if (! ieee_require_asn (info, pp, &flags)
2728
                || ! ieee_require_atn65 (info, pp, &fieldname, &fieldlen)
2729
                || ! ieee_require_atn65 (info, pp, &mangledname, &mangledlen))
2730
              return FALSE;
2731
            count -= 3;
2732
 
2733
            fieldcopy = savestring (fieldname, fieldlen);
2734
 
2735
            staticp = (flags & CXXFLAGS_STATIC) != 0 ? TRUE : FALSE;
2736
 
2737
            if (staticp)
2738
              {
2739
                struct ieee_var *pv, *pvend;
2740
 
2741
                /* See if we can find a definition for this variable.  */
2742
                pv = info->vars.vars;
2743
                pvend = pv + info->vars.alloc;
2744
                for (; pv < pvend; pv++)
2745
                  if (pv->namlen == mangledlen
2746
                      && strncmp (pv->name, mangledname, mangledlen) == 0)
2747
                    break;
2748
                if (pv < pvend)
2749
                  ftype = pv->type;
2750
                else
2751
                  {
2752
                    /* This can happen if the variable is never used.  */
2753
                    ftype = ieee_builtin_type (info, start,
2754
                                               (unsigned int) builtin_void);
2755
                  }
2756
              }
2757
            else
2758
              {
2759
                unsigned int findx;
2760
 
2761
                if (structfields == NULL)
2762
                  {
2763
                    ieee_error (info, start, _("C++ object has no fields"));
2764
                    return FALSE;
2765
                  }
2766
 
2767
                for (pf = structfields, findx = 0;
2768
                     *pf != DEBUG_FIELD_NULL;
2769
                     pf++, findx++)
2770
                  {
2771
                    const char *fname;
2772
 
2773
                    fname = debug_get_field_name (dhandle, *pf);
2774
                    if (fname == NULL)
2775
                      return FALSE;
2776
                    if (fname[0] == mangledname[0]
2777
                        && strncmp (fname, mangledname, mangledlen) == 0
2778
                        && strlen (fname) == mangledlen)
2779
                      break;
2780
                  }
2781
                if (*pf == DEBUG_FIELD_NULL)
2782
                  {
2783
                    ieee_error (info, start,
2784
                                _("C++ data member not found in container"));
2785
                    return FALSE;
2786
                  }
2787
 
2788
                ftype = debug_get_field_type (dhandle, *pf);
2789
 
2790
                if (debug_get_type_kind (dhandle, ftype) == DEBUG_KIND_POINTER)
2791
                  {
2792
                    /* We might need to convert this field into a
2793
                       reference type later on, so make it an indirect
2794
                       type.  */
2795
                    if (it->fslots == NULL)
2796
                      {
2797
                        unsigned int fcnt;
2798
                        const debug_field *pfcnt;
2799
 
2800
                        fcnt = 0;
2801
                        for (pfcnt = structfields;
2802
                             *pfcnt != DEBUG_FIELD_NULL;
2803
                             pfcnt++)
2804
                          ++fcnt;
2805
                        it->fslots = ((debug_type *)
2806
                                      xmalloc (fcnt * sizeof *it->fslots));
2807
                        memset (it->fslots, 0,
2808
                                fcnt * sizeof *it->fslots);
2809
                      }
2810
 
2811
                    if (ftype == DEBUG_TYPE_NULL)
2812
                      return FALSE;
2813
                    it->fslots[findx] = ftype;
2814
                    ftype = debug_make_indirect_type (dhandle,
2815
                                                      it->fslots + findx,
2816
                                                      (const char *) NULL);
2817
                  }
2818
              }
2819
            if (ftype == DEBUG_TYPE_NULL)
2820
              return FALSE;
2821
 
2822
            switch (flags & CXXFLAGS_VISIBILITY)
2823
              {
2824
              default:
2825
                ieee_error (info, start, _("unknown C++ visibility"));
2826
                return FALSE;
2827
 
2828
              case CXXFLAGS_VISIBILITY_PUBLIC:
2829
                visibility = DEBUG_VISIBILITY_PUBLIC;
2830
                break;
2831
 
2832
              case CXXFLAGS_VISIBILITY_PRIVATE:
2833
                visibility = DEBUG_VISIBILITY_PRIVATE;
2834
                break;
2835
 
2836
              case CXXFLAGS_VISIBILITY_PROTECTED:
2837
                visibility = DEBUG_VISIBILITY_PROTECTED;
2838
                break;
2839
              }
2840
 
2841
            if (staticp)
2842
              {
2843
                char *mangledcopy;
2844
 
2845
                mangledcopy = savestring (mangledname, mangledlen);
2846
 
2847
                field = debug_make_static_member (dhandle, fieldcopy,
2848
                                                  ftype, mangledcopy,
2849
                                                  visibility);
2850
              }
2851
            else
2852
              {
2853
                bfd_vma bitpos, bitsize;
2854
 
2855
                bitpos = debug_get_field_bitpos (dhandle, *pf);
2856
                bitsize = debug_get_field_bitsize (dhandle, *pf);
2857
                if (bitpos == (bfd_vma) -1 || bitsize == (bfd_vma) -1)
2858
                  {
2859
                    ieee_error (info, start, _("bad C++ field bit pos or size"));
2860
                    return FALSE;
2861
                  }
2862
                field = debug_make_field (dhandle, fieldcopy, ftype, bitpos,
2863
                                          bitsize, visibility);
2864
              }
2865
 
2866
            if (field == DEBUG_FIELD_NULL)
2867
              return FALSE;
2868
 
2869
            if (field_count + 1 >= field_alloc)
2870
              {
2871
                field_alloc += 10;
2872
                fields = ((debug_field *)
2873
                          xrealloc (fields, field_alloc * sizeof *fields));
2874
              }
2875
 
2876
            fields[field_count] = field;
2877
            ++field_count;
2878
            fields[field_count] = DEBUG_FIELD_NULL;
2879
          }
2880
          break;
2881
 
2882
        case 'm':
2883
        case 'v':
2884
          {
2885
            bfd_vma flags, voffset, control;
2886
            const char *name, *mangled;
2887
            unsigned long namlen, mangledlen;
2888
            struct ieee_var *pv, *pvend;
2889
            debug_type type;
2890
            enum debug_visibility visibility;
2891
            bfd_boolean constp, volatilep;
2892
            char *mangledcopy;
2893
            debug_method_variant mv;
2894
            struct ieee_method *meth;
2895
            unsigned int im;
2896
 
2897
            if (! ieee_require_asn (info, pp, &flags)
2898
                || ! ieee_require_atn65 (info, pp, &name, &namlen)
2899
                || ! ieee_require_atn65 (info, pp, &mangled, &mangledlen))
2900
              return FALSE;
2901
            count -= 3;
2902
            if (id != 'v')
2903
              voffset = 0;
2904
            else
2905
              {
2906
                if (! ieee_require_asn (info, pp, &voffset))
2907
                  return FALSE;
2908
                --count;
2909
              }
2910
            if (! ieee_require_asn (info, pp, &control))
2911
              return FALSE;
2912
            --count;
2913
 
2914
            /* We just ignore the control information.  */
2915
 
2916
            /* We have no way to represent friend information, so we
2917
               just ignore it.  */
2918
            if ((flags & CXXFLAGS_FRIEND) != 0)
2919
              break;
2920
 
2921
            /* We should already have seen a type for the function.  */
2922
            pv = info->vars.vars;
2923
            pvend = pv + info->vars.alloc;
2924
            for (; pv < pvend; pv++)
2925
              if (pv->namlen == mangledlen
2926
                  && strncmp (pv->name, mangled, mangledlen) == 0)
2927
                break;
2928
 
2929
            if (pv >= pvend)
2930
              {
2931
                /* We won't have type information for this function if
2932
                   it is not included in this file.  We don't try to
2933
                   handle this case.  FIXME.  */
2934
                type = (debug_make_function_type
2935
                        (dhandle,
2936
                         ieee_builtin_type (info, start,
2937
                                            (unsigned int) builtin_void),
2938
                         (debug_type *) NULL,
2939
                         FALSE));
2940
              }
2941
            else
2942
              {
2943
                debug_type return_type;
2944
                const debug_type *arg_types;
2945
                bfd_boolean varargs;
2946
 
2947
                if (debug_get_type_kind (dhandle, pv->type)
2948
                    != DEBUG_KIND_FUNCTION)
2949
                  {
2950
                    ieee_error (info, start,
2951
                                _("bad type for C++ method function"));
2952
                    return FALSE;
2953
                  }
2954
 
2955
                return_type = debug_get_return_type (dhandle, pv->type);
2956
                arg_types = debug_get_parameter_types (dhandle, pv->type,
2957
                                                       &varargs);
2958
                if (return_type == DEBUG_TYPE_NULL || arg_types == NULL)
2959
                  {
2960
                    ieee_error (info, start,
2961
                                _("no type information for C++ method function"));
2962
                    return FALSE;
2963
                  }
2964
 
2965
                type = debug_make_method_type (dhandle, return_type, it->type,
2966
                                               (debug_type *) arg_types,
2967
                                               varargs);
2968
              }
2969
            if (type == DEBUG_TYPE_NULL)
2970
              return FALSE;
2971
 
2972
            switch (flags & CXXFLAGS_VISIBILITY)
2973
              {
2974
              default:
2975
                ieee_error (info, start, _("unknown C++ visibility"));
2976
                return FALSE;
2977
 
2978
              case CXXFLAGS_VISIBILITY_PUBLIC:
2979
                visibility = DEBUG_VISIBILITY_PUBLIC;
2980
                break;
2981
 
2982
              case CXXFLAGS_VISIBILITY_PRIVATE:
2983
                visibility = DEBUG_VISIBILITY_PRIVATE;
2984
                break;
2985
 
2986
              case CXXFLAGS_VISIBILITY_PROTECTED:
2987
                visibility = DEBUG_VISIBILITY_PROTECTED;
2988
                break;
2989
              }
2990
 
2991
            constp = (flags & CXXFLAGS_CONST) != 0 ? TRUE : FALSE;
2992
            volatilep = (flags & CXXFLAGS_VOLATILE) != 0 ? TRUE : FALSE;
2993
 
2994
            mangledcopy = savestring (mangled, mangledlen);
2995
 
2996
            if ((flags & CXXFLAGS_STATIC) != 0)
2997
              {
2998
                if (id == 'v')
2999
                  {
3000
                    ieee_error (info, start, _("C++ static virtual method"));
3001
                    return FALSE;
3002
                  }
3003
                mv = debug_make_static_method_variant (dhandle, mangledcopy,
3004
                                                       type, visibility,
3005
                                                       constp, volatilep);
3006
              }
3007
            else
3008
              {
3009
                debug_type vcontext;
3010
 
3011
                if (id != 'v')
3012
                  vcontext = DEBUG_TYPE_NULL;
3013
                else
3014
                  {
3015
                    /* FIXME: How can we calculate this correctly?  */
3016
                    vcontext = it->type;
3017
                  }
3018
                mv = debug_make_method_variant (dhandle, mangledcopy, type,
3019
                                                visibility, constp,
3020
                                                volatilep, voffset,
3021
                                                vcontext);
3022
              }
3023
            if (mv == DEBUG_METHOD_VARIANT_NULL)
3024
              return FALSE;
3025
 
3026
            for (meth = methods, im = 0; im < methods_count; meth++, im++)
3027
              if (meth->namlen == namlen
3028
                  && strncmp (meth->name, name, namlen) == 0)
3029
                break;
3030
            if (im >= methods_count)
3031
              {
3032
                if (methods_count >= methods_alloc)
3033
                  {
3034
                    methods_alloc += 10;
3035
                    methods = ((struct ieee_method *)
3036
                               xrealloc (methods,
3037
                                         methods_alloc * sizeof *methods));
3038
                  }
3039
                methods[methods_count].name = name;
3040
                methods[methods_count].namlen = namlen;
3041
                methods[methods_count].variants = NULL;
3042
                methods[methods_count].count = 0;
3043
                methods[methods_count].alloc = 0;
3044
                meth = methods + methods_count;
3045
                ++methods_count;
3046
              }
3047
 
3048
            if (meth->count + 1 >= meth->alloc)
3049
              {
3050
                meth->alloc += 10;
3051
                meth->variants = ((debug_method_variant *)
3052
                                  xrealloc (meth->variants,
3053
                                            (meth->alloc
3054
                                             * sizeof *meth->variants)));
3055
              }
3056
 
3057
            meth->variants[meth->count] = mv;
3058
            ++meth->count;
3059
            meth->variants[meth->count] = DEBUG_METHOD_VARIANT_NULL;
3060
          }
3061
          break;
3062
 
3063
        case 'o':
3064
          {
3065
            bfd_vma spec;
3066
 
3067
            /* We have no way to store this information, so we just
3068
               ignore it.  */
3069
            if (! ieee_require_asn (info, pp, &spec))
3070
              return FALSE;
3071
            --count;
3072
            if ((spec & 4) != 0)
3073
              {
3074
                const char *filename;
3075
                unsigned long filenamlen;
3076
                bfd_vma lineno;
3077
 
3078
                if (! ieee_require_atn65 (info, pp, &filename, &filenamlen)
3079
                    || ! ieee_require_asn (info, pp, &lineno))
3080
                  return FALSE;
3081
                count -= 2;
3082
              }
3083
            else if ((spec & 8) != 0)
3084
              {
3085
                const char *mangled;
3086
                unsigned long mangledlen;
3087
 
3088
                if (! ieee_require_atn65 (info, pp, &mangled, &mangledlen))
3089
                  return FALSE;
3090
                --count;
3091
              }
3092
            else
3093
              {
3094
                ieee_error (info, start,
3095
                            _("unrecognized C++ object overhead spec"));
3096
                return FALSE;
3097
              }
3098
          }
3099
          break;
3100
 
3101
        case 'z':
3102
          {
3103
            const char *vname, *basename;
3104
            unsigned long vnamelen, baselen;
3105
            bfd_vma vsize, control;
3106
 
3107
            /* A virtual table pointer.  */
3108
 
3109
            if (! ieee_require_atn65 (info, pp, &vname, &vnamelen)
3110
                || ! ieee_require_asn (info, pp, &vsize)
3111
                || ! ieee_require_atn65 (info, pp, &basename, &baselen)
3112
                || ! ieee_require_asn (info, pp, &control))
3113
              return FALSE;
3114
            count -= 4;
3115
 
3116
            /* We just ignore the control number.  We don't care what
3117
               the virtual table name is.  We have no way to store the
3118
               virtual table size, and I don't think we care anyhow.  */
3119
 
3120
            /* FIXME: We can't handle multiple virtual table pointers.  */
3121
 
3122
            if (baselen == 0)
3123
              ownvptr = TRUE;
3124
            else
3125
              {
3126
                char *basecopy;
3127
 
3128
                basecopy = savestring (basename, baselen);
3129
                vptrbase = debug_find_tagged_type (dhandle, basecopy,
3130
                                                   DEBUG_KIND_ILLEGAL);
3131
                free (basecopy);
3132
                if (vptrbase == DEBUG_TYPE_NULL)
3133
                  {
3134
                    ieee_error (info, start, _("undefined C++ vtable"));
3135
                    return FALSE;
3136
                  }
3137
              }
3138
          }
3139
          break;
3140
        }
3141
    }
3142
 
3143
  /* Now that we have seen all the method variants, we can call
3144
     debug_make_method for each one.  */
3145
 
3146
  if (methods_count == 0)
3147
    dmethods = NULL;
3148
  else
3149
    {
3150
      unsigned int i;
3151
 
3152
      dmethods = ((debug_method *)
3153
                  xmalloc ((methods_count + 1) * sizeof *dmethods));
3154
      for (i = 0; i < methods_count; i++)
3155
        {
3156
          char *namcopy;
3157
 
3158
          namcopy = savestring (methods[i].name, methods[i].namlen);
3159
          dmethods[i] = debug_make_method (dhandle, namcopy,
3160
                                           methods[i].variants);
3161
          if (dmethods[i] == DEBUG_METHOD_NULL)
3162
            return FALSE;
3163
        }
3164
      dmethods[i] = DEBUG_METHOD_NULL;
3165
      free (methods);
3166
    }
3167
 
3168
  /* The struct type was created as an indirect type pointing at
3169
     it->slot.  We update it->slot to automatically update all
3170
     references to this struct.  */
3171
  it->slot = debug_make_object_type (dhandle,
3172
                                     class != 'u',
3173
                                     debug_get_type_size (dhandle,
3174
                                                          it->slot),
3175
                                     fields, baseclasses, dmethods,
3176
                                     vptrbase, ownvptr);
3177
  if (it->slot == DEBUG_TYPE_NULL)
3178
    return FALSE;
3179
 
3180
  return TRUE;
3181
}
3182
 
3183
/* Read C++ default argument value and reference type information.  */
3184
 
3185
static bfd_boolean
3186
ieee_read_cxx_defaults (struct ieee_info *info, const bfd_byte **pp,
3187
                        unsigned long count)
3188
{
3189
  const bfd_byte *start;
3190
  const char *fnname;
3191
  unsigned long fnlen;
3192
  bfd_vma defcount;
3193
 
3194
  start = *pp;
3195
 
3196
  /* Giving the function name before the argument count is an addendum
3197
     to the spec.  The function name is demangled, though, so this
3198
     record must always refer to the current function.  */
3199
 
3200
  if (info->blockstack.bsp <= info->blockstack.stack
3201
      || info->blockstack.bsp[-1].fnindx == (unsigned int) -1)
3202
    {
3203
      ieee_error (info, start, _("C++ default values not in a function"));
3204
      return FALSE;
3205
    }
3206
 
3207
  if (! ieee_require_atn65 (info, pp, &fnname, &fnlen)
3208
      || ! ieee_require_asn (info, pp, &defcount))
3209
    return FALSE;
3210
  count -= 2;
3211
 
3212
  while (defcount-- > 0)
3213
    {
3214
      bfd_vma type, val;
3215
      const char *strval;
3216
      unsigned long strvallen;
3217
 
3218
      if (! ieee_require_asn (info, pp, &type))
3219
        return FALSE;
3220
      --count;
3221
 
3222
      switch (type)
3223
        {
3224
        case 0:
3225
        case 4:
3226
          break;
3227
 
3228
        case 1:
3229
        case 2:
3230
          if (! ieee_require_asn (info, pp, &val))
3231
            return FALSE;
3232
          --count;
3233
          break;
3234
 
3235
        case 3:
3236
        case 7:
3237
          if (! ieee_require_atn65 (info, pp, &strval, &strvallen))
3238
            return FALSE;
3239
          --count;
3240
          break;
3241
 
3242
        default:
3243
          ieee_error (info, start, _("unrecognized C++ default type"));
3244
          return FALSE;
3245
        }
3246
 
3247
      /* We have no way to record the default argument values, so we
3248
         just ignore them.  FIXME.  */
3249
    }
3250
 
3251
  /* Any remaining arguments are indices of parameters that are really
3252
     reference type.  */
3253
  if (count > 0)
3254
    {
3255
      void *dhandle;
3256
      debug_type *arg_slots;
3257
 
3258
      dhandle = info->dhandle;
3259
      arg_slots = info->types.types[info->blockstack.bsp[-1].fnindx].arg_slots;
3260
      while (count-- > 0)
3261
        {
3262
          bfd_vma indx;
3263
          debug_type target;
3264
 
3265
          if (! ieee_require_asn (info, pp, &indx))
3266
            return FALSE;
3267
          /* The index is 1 based.  */
3268
          --indx;
3269
          if (arg_slots == NULL
3270
              || arg_slots[indx] == DEBUG_TYPE_NULL
3271
              || (debug_get_type_kind (dhandle, arg_slots[indx])
3272
                  != DEBUG_KIND_POINTER))
3273
            {
3274
              ieee_error (info, start, _("reference parameter is not a pointer"));
3275
              return FALSE;
3276
            }
3277
 
3278
          target = debug_get_target_type (dhandle, arg_slots[indx]);
3279
          arg_slots[indx] = debug_make_reference_type (dhandle, target);
3280
          if (arg_slots[indx] == DEBUG_TYPE_NULL)
3281
            return FALSE;
3282
        }
3283
    }
3284
 
3285
  return TRUE;
3286
}
3287
 
3288
/* Read a C++ reference definition.  */
3289
 
3290
static bfd_boolean
3291
ieee_read_reference (struct ieee_info *info, const bfd_byte **pp)
3292
{
3293
  const bfd_byte *start;
3294
  bfd_vma flags;
3295
  const char *class, *name;
3296
  unsigned long classlen, namlen;
3297
  debug_type *pslot;
3298
  debug_type target;
3299
 
3300
  start = *pp;
3301
 
3302
  if (! ieee_require_asn (info, pp, &flags))
3303
    return FALSE;
3304
 
3305
  /* Giving the class name before the member name is in an addendum to
3306
     the spec.  */
3307
  if (flags == 3)
3308
    {
3309
      if (! ieee_require_atn65 (info, pp, &class, &classlen))
3310
        return FALSE;
3311
    }
3312
 
3313
  if (! ieee_require_atn65 (info, pp, &name, &namlen))
3314
    return FALSE;
3315
 
3316
  pslot = NULL;
3317
  if (flags != 3)
3318
    {
3319
      int pass;
3320
 
3321
      /* We search from the last variable indices to the first in
3322
         hopes of finding local variables correctly.  We search the
3323
         local variables on the first pass, and the global variables
3324
         on the second.  FIXME: This probably won't work in all cases.
3325
         On the other hand, I don't know what will.  */
3326
      for (pass = 0; pass < 2; pass++)
3327
        {
3328
          struct ieee_vars *vars;
3329
          int i;
3330
          struct ieee_var *pv = NULL;
3331
 
3332
          if (pass == 0)
3333
            vars = &info->vars;
3334
          else
3335
            {
3336
              vars = info->global_vars;
3337
              if (vars == NULL)
3338
                break;
3339
            }
3340
 
3341
          for (i = (int) vars->alloc - 1; i >= 0; i--)
3342
            {
3343
              bfd_boolean found;
3344
 
3345
              pv = vars->vars + i;
3346
 
3347
              if (pv->pslot == NULL
3348
                  || pv->namlen != namlen
3349
                  || strncmp (pv->name, name, namlen) != 0)
3350
                continue;
3351
 
3352
              found = FALSE;
3353
              switch (flags)
3354
                {
3355
                default:
3356
                  ieee_error (info, start,
3357
                              _("unrecognized C++ reference type"));
3358
                  return FALSE;
3359
 
3360
                case 0:
3361
                  /* Global variable or function.  */
3362
                  if (pv->kind == IEEE_GLOBAL
3363
                      || pv->kind == IEEE_EXTERNAL
3364
                      || pv->kind == IEEE_FUNCTION)
3365
                    found = TRUE;
3366
                  break;
3367
 
3368
                case 1:
3369
                  /* Global static variable or function.  */
3370
                  if (pv->kind == IEEE_STATIC
3371
                      || pv->kind == IEEE_FUNCTION)
3372
                    found = TRUE;
3373
                  break;
3374
 
3375
                case 2:
3376
                  /* Local variable.  */
3377
                  if (pv->kind == IEEE_LOCAL)
3378
                    found = TRUE;
3379
                  break;
3380
                }
3381
 
3382
              if (found)
3383
                break;
3384
            }
3385
 
3386
          if (i >= 0)
3387
            {
3388
              pslot = pv->pslot;
3389
              break;
3390
            }
3391
        }
3392
    }
3393
  else
3394
    {
3395
      struct ieee_tag *it;
3396
 
3397
      for (it = info->tags; it != NULL; it = it->next)
3398
        {
3399
          if (it->name[0] == class[0]
3400
              && strncmp (it->name, class, classlen) == 0
3401
              && strlen (it->name) == classlen)
3402
            {
3403
              if (it->fslots != NULL)
3404
                {
3405
                  const debug_field *pf;
3406
                  unsigned int findx;
3407
 
3408
                  pf = debug_get_fields (info->dhandle, it->type);
3409
                  if (pf == NULL)
3410
                    {
3411
                      ieee_error (info, start,
3412
                                  "C++ reference in class with no fields");
3413
                      return FALSE;
3414
                    }
3415
 
3416
                  for (findx = 0; *pf != DEBUG_FIELD_NULL; pf++, findx++)
3417
                    {
3418
                      const char *fname;
3419
 
3420
                      fname = debug_get_field_name (info->dhandle, *pf);
3421
                      if (fname == NULL)
3422
                        return FALSE;
3423
                      if (strncmp (fname, name, namlen) == 0
3424
                          && strlen (fname) == namlen)
3425
                        {
3426
                          pslot = it->fslots + findx;
3427
                          break;
3428
                        }
3429
                    }
3430
                }
3431
 
3432
              break;
3433
            }
3434
        }
3435
    }
3436
 
3437
  if (pslot == NULL)
3438
    {
3439
      ieee_error (info, start, _("C++ reference not found"));
3440
      return FALSE;
3441
    }
3442
 
3443
  /* We allocated the type of the object as an indirect type pointing
3444
     to *pslot, which we can now update to be a reference type.  */
3445
  if (debug_get_type_kind (info->dhandle, *pslot) != DEBUG_KIND_POINTER)
3446
    {
3447
      ieee_error (info, start, _("C++ reference is not pointer"));
3448
      return FALSE;
3449
    }
3450
 
3451
  target = debug_get_target_type (info->dhandle, *pslot);
3452
  *pslot = debug_make_reference_type (info->dhandle, target);
3453
  if (*pslot == DEBUG_TYPE_NULL)
3454
    return FALSE;
3455
 
3456
  return TRUE;
3457
}
3458
 
3459
/* Require an ASN record.  */
3460
 
3461
static bfd_boolean
3462
ieee_require_asn (struct ieee_info *info, const bfd_byte **pp, bfd_vma *pv)
3463
{
3464
  const bfd_byte *start;
3465
  ieee_record_enum_type c;
3466
  bfd_vma varindx;
3467
 
3468
  start = *pp;
3469
 
3470
  c = (ieee_record_enum_type) **pp;
3471
  if (c != ieee_e2_first_byte_enum)
3472
    {
3473
      ieee_error (info, start, _("missing required ASN"));
3474
      return FALSE;
3475
    }
3476
  ++*pp;
3477
 
3478
  c = (ieee_record_enum_type) (((unsigned int) c << 8) | **pp);
3479
  if (c != ieee_asn_record_enum)
3480
    {
3481
      ieee_error (info, start, _("missing required ASN"));
3482
      return FALSE;
3483
    }
3484
  ++*pp;
3485
 
3486
  /* Just ignore the variable index.  */
3487
  if (! ieee_read_number (info, pp, &varindx))
3488
    return FALSE;
3489
 
3490
  return ieee_read_expression (info, pp, pv);
3491
}
3492
 
3493
/* Require an ATN65 record.  */
3494
 
3495
static bfd_boolean
3496
ieee_require_atn65 (struct ieee_info *info, const bfd_byte **pp,
3497
                    const char **pname, unsigned long *pnamlen)
3498
{
3499
  const bfd_byte *start;
3500
  ieee_record_enum_type c;
3501
  bfd_vma name_indx, type_indx, atn_code;
3502
 
3503
  start = *pp;
3504
 
3505
  c = (ieee_record_enum_type) **pp;
3506
  if (c != ieee_at_record_enum)
3507
    {
3508
      ieee_error (info, start, _("missing required ATN65"));
3509
      return FALSE;
3510
    }
3511
  ++*pp;
3512
 
3513
  c = (ieee_record_enum_type) (((unsigned int) c << 8) | **pp);
3514
  if (c != ieee_atn_record_enum)
3515
    {
3516
      ieee_error (info, start, _("missing required ATN65"));
3517
      return FALSE;
3518
    }
3519
  ++*pp;
3520
 
3521
  if (! ieee_read_number (info, pp, &name_indx)
3522
      || ! ieee_read_number (info, pp, &type_indx)
3523
      || ! ieee_read_number (info, pp, &atn_code))
3524
    return FALSE;
3525
 
3526
  /* Just ignore name_indx.  */
3527
 
3528
  if (type_indx != 0 || atn_code != 65)
3529
    {
3530
      ieee_error (info, start, _("bad ATN65 record"));
3531
      return FALSE;
3532
    }
3533
 
3534
  return ieee_read_id (info, pp, pname, pnamlen);
3535
}
3536
 
3537
/* Convert a register number in IEEE debugging information into a
3538
   generic register number.  */
3539
 
3540
static int
3541
ieee_regno_to_genreg (bfd *abfd, int r)
3542
{
3543
  switch (bfd_get_arch (abfd))
3544
    {
3545
    case bfd_arch_m68k:
3546
      /* For some reasons stabs adds 2 to the floating point register
3547
         numbers.  */
3548
      if (r >= 16)
3549
        r += 2;
3550
      break;
3551
 
3552
    case bfd_arch_i960:
3553
      /* Stabs uses 0 to 15 for r0 to r15, 16 to 31 for g0 to g15, and
3554
         32 to 35 for fp0 to fp3.  */
3555
      --r;
3556
      break;
3557
 
3558
    default:
3559
      break;
3560
    }
3561
 
3562
  return r;
3563
}
3564
 
3565
/* Convert a generic register number to an IEEE specific one.  */
3566
 
3567
static int
3568
ieee_genreg_to_regno (bfd *abfd, int r)
3569
{
3570
  switch (bfd_get_arch (abfd))
3571
    {
3572
    case bfd_arch_m68k:
3573
      /* For some reason stabs add 2 to the floating point register
3574
         numbers.  */
3575
      if (r >= 18)
3576
        r -= 2;
3577
      break;
3578
 
3579
    case bfd_arch_i960:
3580
      /* Stabs uses 0 to 15 for r0 to r15, 16 to 31 for g0 to g15, and
3581
         32 to 35 for fp0 to fp3.  */
3582
      ++r;
3583
      break;
3584
 
3585
    default:
3586
      break;
3587
    }
3588
 
3589
  return r;
3590
}
3591
 
3592
/* These routines build IEEE debugging information out of the generic
3593
   debugging information.  */
3594
 
3595
/* We build the IEEE debugging information byte by byte.  Rather than
3596
   waste time copying data around, we use a linked list of buffers to
3597
   hold the data.  */
3598
 
3599
#define IEEE_BUFSIZE (490)
3600
 
3601
struct ieee_buf
3602
{
3603
  /* Next buffer.  */
3604
  struct ieee_buf *next;
3605
  /* Number of data bytes in this buffer.  */
3606
  unsigned int c;
3607
  /* Bytes.  */
3608
  bfd_byte buf[IEEE_BUFSIZE];
3609
};
3610
 
3611
/* A list of buffers.  */
3612
 
3613
struct ieee_buflist
3614
{
3615
  /* Head of list.  */
3616
  struct ieee_buf *head;
3617
  /* Tail--last buffer on list.  */
3618
  struct ieee_buf *tail;
3619
};
3620
 
3621
/* In order to generate the BB11 blocks required by the HP emulator,
3622
   we keep track of ranges of addresses which correspond to a given
3623
   compilation unit.  */
3624
 
3625
struct ieee_range
3626
{
3627
  /* Next range.  */
3628
  struct ieee_range *next;
3629
  /* Low address.  */
3630
  bfd_vma low;
3631
  /* High address.  */
3632
  bfd_vma high;
3633
};
3634
 
3635
/* This structure holds information for a class on the type stack.  */
3636
 
3637
struct ieee_type_class
3638
{
3639
  /* The name index in the debugging information.  */
3640
  unsigned int indx;
3641
  /* The pmisc records for the class.  */
3642
  struct ieee_buflist pmiscbuf;
3643
  /* The number of pmisc records.  */
3644
  unsigned int pmisccount;
3645
  /* The name of the class holding the virtual table, if not this
3646
     class.  */
3647
  const char *vclass;
3648
  /* Whether this class holds its own virtual table.  */
3649
  bfd_boolean ownvptr;
3650
  /* The largest virtual table offset seen so far.  */
3651
  bfd_vma voffset;
3652
  /* The current method.  */
3653
  const char *method;
3654
  /* Additional pmisc records used to record fields of reference type.  */
3655
  struct ieee_buflist refs;
3656
};
3657
 
3658
/* This is how we store types for the writing routines.  Most types
3659
   are simply represented by a type index.  */
3660
 
3661
struct ieee_write_type
3662
{
3663
  /* Type index.  */
3664
  unsigned int indx;
3665
  /* The size of the type, if known.  */
3666
  unsigned int size;
3667
  /* The name of the type, if any.  */
3668
  const char *name;
3669
  /* If this is a function or method type, we build the type here, and
3670
     only add it to the output buffers if we need it.  */
3671
  struct ieee_buflist fndef;
3672
  /* If this is a struct, this is where the struct definition is
3673
     built.  */
3674
  struct ieee_buflist strdef;
3675
  /* If this is a class, this is where the class information is built.  */
3676
  struct ieee_type_class *classdef;
3677
  /* Whether the type is unsigned.  */
3678
  unsigned int unsignedp : 1;
3679
  /* Whether this is a reference type.  */
3680
  unsigned int referencep : 1;
3681
  /* Whether this is in the local type block.  */
3682
  unsigned int localp : 1;
3683
  /* Whether this is a duplicate struct definition which we are
3684
     ignoring.  */
3685
  unsigned int ignorep : 1;
3686
};
3687
 
3688
/* This is the type stack used by the debug writing routines.  FIXME:
3689
   We could generate more efficient output if we remembered when we
3690
   have output a particular type before.  */
3691
 
3692
struct ieee_type_stack
3693
{
3694
  /* Next entry on stack.  */
3695
  struct ieee_type_stack *next;
3696
  /* Type information.  */
3697
  struct ieee_write_type type;
3698
};
3699
 
3700
/* This is a list of associations between a name and some types.
3701
   These are used for typedefs and tags.  */
3702
 
3703
struct ieee_name_type
3704
{
3705
  /* Next type for this name.  */
3706
  struct ieee_name_type *next;
3707
  /* ID number.  For a typedef, this is the index of the type to which
3708
     this name is typedefed.  */
3709
  unsigned int id;
3710
  /* Type.  */
3711
  struct ieee_write_type type;
3712
  /* If this is a tag which has not yet been defined, this is the
3713
     kind.  If the tag has been defined, this is DEBUG_KIND_ILLEGAL.  */
3714
  enum debug_type_kind kind;
3715
};
3716
 
3717
/* We use a hash table to associate names and types.  */
3718
 
3719
struct ieee_name_type_hash_table
3720
{
3721
  struct bfd_hash_table root;
3722
};
3723
 
3724
struct ieee_name_type_hash_entry
3725
{
3726
  struct bfd_hash_entry root;
3727
  /* Information for this name.  */
3728
  struct ieee_name_type *types;
3729
};
3730
 
3731
/* This is a list of enums.  */
3732
 
3733
struct ieee_defined_enum
3734
{
3735
  /* Next enum.  */
3736
  struct ieee_defined_enum *next;
3737
  /* Type index.  */
3738
  unsigned int indx;
3739
  /* Whether this enum has been defined.  */
3740
  bfd_boolean defined;
3741
  /* Tag.  */
3742
  const char *tag;
3743
  /* Names.  */
3744
  const char **names;
3745
  /* Values.  */
3746
  bfd_signed_vma *vals;
3747
};
3748
 
3749
/* We keep a list of modified versions of types, so that we don't
3750
   output them more than once.  */
3751
 
3752
struct ieee_modified_type
3753
{
3754
  /* Pointer to this type.  */
3755
  unsigned int pointer;
3756
  /* Function with unknown arguments returning this type.  */
3757
  unsigned int function;
3758
  /* Const version of this type.  */
3759
  unsigned int const_qualified;
3760
  /* Volatile version of this type.  */
3761
  unsigned int volatile_qualified;
3762
  /* List of arrays of this type of various bounds.  */
3763
  struct ieee_modified_array_type *arrays;
3764
};
3765
 
3766
/* A list of arrays bounds.  */
3767
 
3768
struct ieee_modified_array_type
3769
{
3770
  /* Next array bounds.  */
3771
  struct ieee_modified_array_type *next;
3772
  /* Type index with these bounds.  */
3773
  unsigned int indx;
3774
  /* Low bound.  */
3775
  bfd_signed_vma low;
3776
  /* High bound.  */
3777
  bfd_signed_vma high;
3778
};
3779
 
3780
/* This is a list of pending function parameter information.  We don't
3781
   output them until we see the first block.  */
3782
 
3783
struct ieee_pending_parm
3784
{
3785
  /* Next pending parameter.  */
3786
  struct ieee_pending_parm *next;
3787
  /* Name.  */
3788
  const char *name;
3789
  /* Type index.  */
3790
  unsigned int type;
3791
  /* Whether the type is a reference.  */
3792
  bfd_boolean referencep;
3793
  /* Kind.  */
3794
  enum debug_parm_kind kind;
3795
  /* Value.  */
3796
  bfd_vma val;
3797
};
3798
 
3799
/* This is the handle passed down by debug_write.  */
3800
 
3801
struct ieee_handle
3802
{
3803
  /* BFD we are writing to.  */
3804
  bfd *abfd;
3805
  /* Whether we got an error in a subroutine called via traverse or
3806
     map_over_sections.  */
3807
  bfd_boolean error;
3808
  /* Current data buffer list.  */
3809
  struct ieee_buflist *current;
3810
  /* Current data buffer.  */
3811
  struct ieee_buf *curbuf;
3812
  /* Filename of current compilation unit.  */
3813
  const char *filename;
3814
  /* Module name of current compilation unit.  */
3815
  const char *modname;
3816
  /* List of buffer for global types.  */
3817
  struct ieee_buflist global_types;
3818
  /* List of finished data buffers.  */
3819
  struct ieee_buflist data;
3820
  /* List of buffers for typedefs in the current compilation unit.  */
3821
  struct ieee_buflist types;
3822
  /* List of buffers for variables and functions in the current
3823
     compilation unit.  */
3824
  struct ieee_buflist vars;
3825
  /* List of buffers for C++ class definitions in the current
3826
     compilation unit.  */
3827
  struct ieee_buflist cxx;
3828
  /* List of buffers for line numbers in the current compilation unit.  */
3829
  struct ieee_buflist linenos;
3830
  /* Ranges for the current compilation unit.  */
3831
  struct ieee_range *ranges;
3832
  /* Ranges for all debugging information.  */
3833
  struct ieee_range *global_ranges;
3834
  /* Nested pending ranges.  */
3835
  struct ieee_range *pending_ranges;
3836
  /* Type stack.  */
3837
  struct ieee_type_stack *type_stack;
3838
  /* Next unallocated type index.  */
3839
  unsigned int type_indx;
3840
  /* Next unallocated name index.  */
3841
  unsigned int name_indx;
3842
  /* Typedefs.  */
3843
  struct ieee_name_type_hash_table typedefs;
3844
  /* Tags.  */
3845
  struct ieee_name_type_hash_table tags;
3846
  /* Enums.  */
3847
  struct ieee_defined_enum *enums;
3848
  /* Modified versions of types.  */
3849
  struct ieee_modified_type *modified;
3850
  /* Number of entries allocated in modified.  */
3851
  unsigned int modified_alloc;
3852
  /* 4 byte complex type.  */
3853
  unsigned int complex_float_index;
3854
  /* 8 byte complex type.  */
3855
  unsigned int complex_double_index;
3856
  /* The depth of block nesting.  This is 0 outside a function, and 1
3857
     just after start_function is called.  */
3858
  unsigned int block_depth;
3859
  /* The name of the current function.  */
3860
  const char *fnname;
3861
  /* List of buffers for the type of the function we are currently
3862
     writing out.  */
3863
  struct ieee_buflist fntype;
3864
  /* List of buffers for the parameters of the function we are
3865
     currently writing out.  */
3866
  struct ieee_buflist fnargs;
3867
  /* Number of arguments written to fnargs.  */
3868
  unsigned int fnargcount;
3869
  /* Pending function parameters.  */
3870
  struct ieee_pending_parm *pending_parms;
3871
  /* Current line number filename.  */
3872
  const char *lineno_filename;
3873
  /* Line number name index.  */
3874
  unsigned int lineno_name_indx;
3875
  /* Filename of pending line number.  */
3876
  const char *pending_lineno_filename;
3877
  /* Pending line number.  */
3878
  unsigned long pending_lineno;
3879
  /* Address of pending line number.  */
3880
  bfd_vma pending_lineno_addr;
3881
  /* Highest address seen at end of procedure.  */
3882
  bfd_vma highaddr;
3883
};
3884
 
3885
static bfd_boolean ieee_init_buffer
3886
  (struct ieee_handle *, struct ieee_buflist *);
3887
static bfd_boolean ieee_change_buffer
3888
  (struct ieee_handle *, struct ieee_buflist *);
3889
static bfd_boolean ieee_append_buffer
3890
  (struct ieee_handle *, struct ieee_buflist *, struct ieee_buflist *);
3891
static bfd_boolean ieee_real_write_byte (struct ieee_handle *, int);
3892
static bfd_boolean ieee_write_2bytes (struct ieee_handle *, int);
3893
static bfd_boolean ieee_write_number (struct ieee_handle *, bfd_vma);
3894
static bfd_boolean ieee_write_id (struct ieee_handle *, const char *);
3895
static bfd_boolean ieee_write_asn
3896
  (struct ieee_handle *, unsigned int, bfd_vma);
3897
static bfd_boolean ieee_write_atn65
3898
  (struct ieee_handle *, unsigned int, const char *);
3899
static bfd_boolean ieee_push_type
3900
  (struct ieee_handle *, unsigned int, unsigned int, bfd_boolean,
3901
   bfd_boolean);
3902
static unsigned int ieee_pop_type (struct ieee_handle *);
3903
static void ieee_pop_unused_type (struct ieee_handle *);
3904
static unsigned int ieee_pop_type_used (struct ieee_handle *, bfd_boolean);
3905
static bfd_boolean ieee_add_range
3906
  (struct ieee_handle *, bfd_boolean, bfd_vma, bfd_vma);
3907
static bfd_boolean ieee_start_range (struct ieee_handle *, bfd_vma);
3908
static bfd_boolean ieee_end_range (struct ieee_handle *, bfd_vma);
3909
static bfd_boolean ieee_define_type
3910
  (struct ieee_handle *, unsigned int, bfd_boolean, bfd_boolean);
3911
static bfd_boolean ieee_define_named_type
3912
  (struct ieee_handle *, const char *, unsigned int, unsigned int,
3913
   bfd_boolean, bfd_boolean, struct ieee_buflist *);
3914
static struct ieee_modified_type *ieee_get_modified_info
3915
  (struct ieee_handle *, unsigned int);
3916
static struct bfd_hash_entry *ieee_name_type_newfunc
3917
  (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
3918
static bfd_boolean ieee_write_undefined_tag
3919
  (struct ieee_name_type_hash_entry *, void *);
3920
static bfd_boolean ieee_finish_compilation_unit (struct ieee_handle *);
3921
static void ieee_add_bb11_blocks (bfd *, asection *, void *);
3922
static bfd_boolean ieee_add_bb11
3923
  (struct ieee_handle *, asection *, bfd_vma, bfd_vma);
3924
static bfd_boolean ieee_output_pending_parms (struct ieee_handle *);
3925
static unsigned int ieee_vis_to_flags (enum debug_visibility);
3926
static bfd_boolean ieee_class_method_var
3927
  (struct ieee_handle *, const char *, enum debug_visibility, bfd_boolean,
3928
   bfd_boolean, bfd_boolean, bfd_vma, bfd_boolean);
3929
 
3930
static bfd_boolean ieee_start_compilation_unit (void *, const char *);
3931
static bfd_boolean ieee_start_source (void *, const char *);
3932
static bfd_boolean ieee_empty_type (void *);
3933
static bfd_boolean ieee_void_type (void *);
3934
static bfd_boolean ieee_int_type (void *, unsigned int, bfd_boolean);
3935
static bfd_boolean ieee_float_type (void *, unsigned int);
3936
static bfd_boolean ieee_complex_type (void *, unsigned int);
3937
static bfd_boolean ieee_bool_type (void *, unsigned int);
3938
static bfd_boolean ieee_enum_type
3939
  (void *, const char *, const char **, bfd_signed_vma *);
3940
static bfd_boolean ieee_pointer_type (void *);
3941
static bfd_boolean ieee_function_type (void *, int, bfd_boolean);
3942
static bfd_boolean ieee_reference_type (void *);
3943
static bfd_boolean ieee_range_type (void *, bfd_signed_vma, bfd_signed_vma);
3944
static bfd_boolean ieee_array_type
3945
  (void *, bfd_signed_vma, bfd_signed_vma, bfd_boolean);
3946
static bfd_boolean ieee_set_type (void *, bfd_boolean);
3947
static bfd_boolean ieee_offset_type (void *);
3948
static bfd_boolean ieee_method_type (void *, bfd_boolean, int, bfd_boolean);
3949
static bfd_boolean ieee_const_type (void *);
3950
static bfd_boolean ieee_volatile_type (void *);
3951
static bfd_boolean ieee_start_struct_type
3952
  (void *, const char *, unsigned int, bfd_boolean, unsigned int);
3953
static bfd_boolean ieee_struct_field
3954
  (void *, const char *, bfd_vma, bfd_vma, enum debug_visibility);
3955
static bfd_boolean ieee_end_struct_type (void *);
3956
static bfd_boolean ieee_start_class_type
3957
  (void *, const char *, unsigned int, bfd_boolean, unsigned int, bfd_boolean,
3958
   bfd_boolean);
3959
static bfd_boolean ieee_class_static_member
3960
  (void *, const char *, const char *, enum debug_visibility);
3961
static bfd_boolean ieee_class_baseclass
3962
  (void *, bfd_vma, bfd_boolean, enum debug_visibility);
3963
static bfd_boolean ieee_class_start_method (void *, const char *);
3964
static bfd_boolean ieee_class_method_variant
3965
  (void *, const char *, enum debug_visibility, bfd_boolean, bfd_boolean,
3966
   bfd_vma, bfd_boolean);
3967
static bfd_boolean ieee_class_static_method_variant
3968
  (void *, const char *, enum debug_visibility, bfd_boolean, bfd_boolean);
3969
static bfd_boolean ieee_class_end_method (void *);
3970
static bfd_boolean ieee_end_class_type (void *);
3971
static bfd_boolean ieee_typedef_type (void *, const char *);
3972
static bfd_boolean ieee_tag_type
3973
  (void *, const char *, unsigned int, enum debug_type_kind);
3974
static bfd_boolean ieee_typdef (void *, const char *);
3975
static bfd_boolean ieee_tag (void *, const char *);
3976
static bfd_boolean ieee_int_constant (void *, const char *, bfd_vma);
3977
static bfd_boolean ieee_float_constant (void *, const char *, double);
3978
static bfd_boolean ieee_typed_constant (void *, const char *, bfd_vma);
3979
static bfd_boolean ieee_variable
3980
  (void *, const char *, enum debug_var_kind, bfd_vma);
3981
static bfd_boolean ieee_start_function (void *, const char *, bfd_boolean);
3982
static bfd_boolean ieee_function_parameter
3983
  (void *, const char *, enum debug_parm_kind, bfd_vma);
3984
static bfd_boolean ieee_start_block (void *, bfd_vma);
3985
static bfd_boolean ieee_end_block (void *, bfd_vma);
3986
static bfd_boolean ieee_end_function (void *);
3987
static bfd_boolean ieee_lineno (void *, const char *, unsigned long, bfd_vma);
3988
 
3989
static const struct debug_write_fns ieee_fns =
3990
{
3991
  ieee_start_compilation_unit,
3992
  ieee_start_source,
3993
  ieee_empty_type,
3994
  ieee_void_type,
3995
  ieee_int_type,
3996
  ieee_float_type,
3997
  ieee_complex_type,
3998
  ieee_bool_type,
3999
  ieee_enum_type,
4000
  ieee_pointer_type,
4001
  ieee_function_type,
4002
  ieee_reference_type,
4003
  ieee_range_type,
4004
  ieee_array_type,
4005
  ieee_set_type,
4006
  ieee_offset_type,
4007
  ieee_method_type,
4008
  ieee_const_type,
4009
  ieee_volatile_type,
4010
  ieee_start_struct_type,
4011
  ieee_struct_field,
4012
  ieee_end_struct_type,
4013
  ieee_start_class_type,
4014
  ieee_class_static_member,
4015
  ieee_class_baseclass,
4016
  ieee_class_start_method,
4017
  ieee_class_method_variant,
4018
  ieee_class_static_method_variant,
4019
  ieee_class_end_method,
4020
  ieee_end_class_type,
4021
  ieee_typedef_type,
4022
  ieee_tag_type,
4023
  ieee_typdef,
4024
  ieee_tag,
4025
  ieee_int_constant,
4026
  ieee_float_constant,
4027
  ieee_typed_constant,
4028
  ieee_variable,
4029
  ieee_start_function,
4030
  ieee_function_parameter,
4031
  ieee_start_block,
4032
  ieee_end_block,
4033
  ieee_end_function,
4034
  ieee_lineno
4035
};
4036
 
4037
/* Initialize a buffer to be empty.  */
4038
 
4039
static bfd_boolean
4040
ieee_init_buffer (struct ieee_handle *info ATTRIBUTE_UNUSED,
4041
                  struct ieee_buflist *buflist)
4042
{
4043
  buflist->head = NULL;
4044
  buflist->tail = NULL;
4045
  return TRUE;
4046
}
4047
 
4048
/* See whether a buffer list has any data.  */
4049
 
4050
#define ieee_buffer_emptyp(buflist) ((buflist)->head == NULL)
4051
 
4052
/* Change the current buffer to a specified buffer chain.  */
4053
 
4054
static bfd_boolean
4055
ieee_change_buffer (struct ieee_handle *info, struct ieee_buflist *buflist)
4056
{
4057
  if (buflist->head == NULL)
4058
    {
4059
      struct ieee_buf *buf;
4060
 
4061
      buf = (struct ieee_buf *) xmalloc (sizeof *buf);
4062
      buf->next = NULL;
4063
      buf->c = 0;
4064
      buflist->head = buf;
4065
      buflist->tail = buf;
4066
    }
4067
 
4068
  info->current = buflist;
4069
  info->curbuf = buflist->tail;
4070
 
4071
  return TRUE;
4072
}
4073
 
4074
/* Append a buffer chain.  */
4075
 
4076
static bfd_boolean
4077
ieee_append_buffer (struct ieee_handle *info ATTRIBUTE_UNUSED,
4078
                    struct ieee_buflist *mainbuf,
4079
                    struct ieee_buflist *newbuf)
4080
{
4081
  if (newbuf->head != NULL)
4082
    {
4083
      if (mainbuf->head == NULL)
4084
        mainbuf->head = newbuf->head;
4085
      else
4086
        mainbuf->tail->next = newbuf->head;
4087
      mainbuf->tail = newbuf->tail;
4088
    }
4089
  return TRUE;
4090
}
4091
 
4092
/* Write a byte into the buffer.  We use a macro for speed and a
4093
   function for the complex cases.  */
4094
 
4095
#define ieee_write_byte(info, b)                                \
4096
  ((info)->curbuf->c < IEEE_BUFSIZE                             \
4097
   ? ((info)->curbuf->buf[(info)->curbuf->c++] = (b), TRUE)     \
4098
   : ieee_real_write_byte ((info), (b)))
4099
 
4100
static bfd_boolean
4101
ieee_real_write_byte (struct ieee_handle *info, int b)
4102
{
4103
  if (info->curbuf->c >= IEEE_BUFSIZE)
4104
    {
4105
      struct ieee_buf *n;
4106
 
4107
      n = (struct ieee_buf *) xmalloc (sizeof *n);
4108
      n->next = NULL;
4109
      n->c = 0;
4110
      if (info->current->head == NULL)
4111
        info->current->head = n;
4112
      else
4113
        info->current->tail->next = n;
4114
      info->current->tail = n;
4115
      info->curbuf = n;
4116
    }
4117
 
4118
  info->curbuf->buf[info->curbuf->c] = b;
4119
  ++info->curbuf->c;
4120
 
4121
  return TRUE;
4122
}
4123
 
4124
/* Write out two bytes.  */
4125
 
4126
static bfd_boolean
4127
ieee_write_2bytes (struct ieee_handle *info, int i)
4128
{
4129
  return (ieee_write_byte (info, i >> 8)
4130
          && ieee_write_byte (info, i & 0xff));
4131
}
4132
 
4133
/* Write out an integer.  */
4134
 
4135
static bfd_boolean
4136
ieee_write_number (struct ieee_handle *info, bfd_vma v)
4137
{
4138
  bfd_vma t;
4139
  bfd_byte ab[20];
4140
  bfd_byte *p;
4141
  unsigned int c;
4142
 
4143
  if (v <= (bfd_vma) ieee_number_end_enum)
4144
    return ieee_write_byte (info, (int) v);
4145
 
4146
  t = v;
4147
  p = ab + sizeof ab;
4148
  while (t != 0)
4149
    {
4150
      *--p = t & 0xff;
4151
      t >>= 8;
4152
    }
4153
  c = (ab + 20) - p;
4154
 
4155
  if (c > (unsigned int) (ieee_number_repeat_end_enum
4156
                          - ieee_number_repeat_start_enum))
4157
    {
4158
      fprintf (stderr, _("IEEE numeric overflow: 0x"));
4159
      fprintf_vma (stderr, v);
4160
      fprintf (stderr, "\n");
4161
      return FALSE;
4162
    }
4163
 
4164
  if (! ieee_write_byte (info, (int) ieee_number_repeat_start_enum + c))
4165
    return FALSE;
4166
  for (; c > 0; --c, ++p)
4167
    {
4168
      if (! ieee_write_byte (info, *p))
4169
        return FALSE;
4170
    }
4171
 
4172
  return TRUE;
4173
}
4174
 
4175
/* Write out a string.  */
4176
 
4177
static bfd_boolean
4178
ieee_write_id (struct ieee_handle *info, const char *s)
4179
{
4180
  unsigned int len;
4181
 
4182
  len = strlen (s);
4183
  if (len <= 0x7f)
4184
    {
4185
      if (! ieee_write_byte (info, len))
4186
        return FALSE;
4187
    }
4188
  else if (len <= 0xff)
4189
    {
4190
      if (! ieee_write_byte (info, (int) ieee_extension_length_1_enum)
4191
          || ! ieee_write_byte (info, len))
4192
        return FALSE;
4193
    }
4194
  else if (len <= 0xffff)
4195
    {
4196
      if (! ieee_write_byte (info, (int) ieee_extension_length_2_enum)
4197
          || ! ieee_write_2bytes (info, len))
4198
        return FALSE;
4199
    }
4200
  else
4201
    {
4202
      fprintf (stderr, _("IEEE string length overflow: %u\n"), len);
4203
      return FALSE;
4204
    }
4205
 
4206
  for (; *s != '\0'; s++)
4207
    if (! ieee_write_byte (info, *s))
4208
      return FALSE;
4209
 
4210
  return TRUE;
4211
}
4212
 
4213
/* Write out an ASN record.  */
4214
 
4215
static bfd_boolean
4216
ieee_write_asn (struct ieee_handle *info, unsigned int indx, bfd_vma val)
4217
{
4218
  return (ieee_write_2bytes (info, (int) ieee_asn_record_enum)
4219
          && ieee_write_number (info, indx)
4220
          && ieee_write_number (info, val));
4221
}
4222
 
4223
/* Write out an ATN65 record.  */
4224
 
4225
static bfd_boolean
4226
ieee_write_atn65 (struct ieee_handle *info, unsigned int indx, const char *s)
4227
{
4228
  return (ieee_write_2bytes (info, (int) ieee_atn_record_enum)
4229
          && ieee_write_number (info, indx)
4230
          && ieee_write_number (info, 0)
4231
          && ieee_write_number (info, 65)
4232
          && ieee_write_id (info, s));
4233
}
4234
 
4235
/* Push a type index onto the type stack.  */
4236
 
4237
static bfd_boolean
4238
ieee_push_type (struct ieee_handle *info, unsigned int indx,
4239
                unsigned int size, bfd_boolean unsignedp, bfd_boolean localp)
4240
{
4241
  struct ieee_type_stack *ts;
4242
 
4243
  ts = (struct ieee_type_stack *) xmalloc (sizeof *ts);
4244
  memset (ts, 0, sizeof *ts);
4245
 
4246
  ts->type.indx = indx;
4247
  ts->type.size = size;
4248
  ts->type.unsignedp = unsignedp;
4249
  ts->type.localp = localp;
4250
 
4251
  ts->next = info->type_stack;
4252
  info->type_stack = ts;
4253
 
4254
  return TRUE;
4255
}
4256
 
4257
/* Pop a type index off the type stack.  */
4258
 
4259
static unsigned int
4260
ieee_pop_type (struct ieee_handle *info)
4261
{
4262
  return ieee_pop_type_used (info, TRUE);
4263
}
4264
 
4265
/* Pop an unused type index off the type stack.  */
4266
 
4267
static void
4268
ieee_pop_unused_type (struct ieee_handle *info)
4269
{
4270
  (void) ieee_pop_type_used (info, FALSE);
4271
}
4272
 
4273
/* Pop a used or unused type index off the type stack.  */
4274
 
4275
static unsigned int
4276
ieee_pop_type_used (struct ieee_handle *info, bfd_boolean used)
4277
{
4278
  struct ieee_type_stack *ts;
4279
  unsigned int ret;
4280
 
4281
  ts = info->type_stack;
4282
  assert (ts != NULL);
4283
 
4284
  /* If this is a function type, and we need it, we need to append the
4285
     actual definition to the typedef block now.  */
4286
  if (used && ! ieee_buffer_emptyp (&ts->type.fndef))
4287
    {
4288
      struct ieee_buflist *buflist;
4289
 
4290
      if (ts->type.localp)
4291
        {
4292
          /* Make sure we have started the types block.  */
4293
          if (ieee_buffer_emptyp (&info->types))
4294
            {
4295
              if (! ieee_change_buffer (info, &info->types)
4296
                  || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4297
                  || ! ieee_write_byte (info, 1)
4298
                  || ! ieee_write_number (info, 0)
4299
                  || ! ieee_write_id (info, info->modname))
4300
                return FALSE;
4301
            }
4302
          buflist = &info->types;
4303
        }
4304
      else
4305
        {
4306
          /* Make sure we started the global type block.  */
4307
          if (ieee_buffer_emptyp (&info->global_types))
4308
            {
4309
              if (! ieee_change_buffer (info, &info->global_types)
4310
                  || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4311
                  || ! ieee_write_byte (info, 2)
4312
                  || ! ieee_write_number (info, 0)
4313
                  || ! ieee_write_id (info, ""))
4314
                return FALSE;
4315
            }
4316
          buflist = &info->global_types;
4317
        }
4318
 
4319
      if (! ieee_append_buffer (info, buflist, &ts->type.fndef))
4320
        return FALSE;
4321
    }
4322
 
4323
  ret = ts->type.indx;
4324
  info->type_stack = ts->next;
4325
  free (ts);
4326
  return ret;
4327
}
4328
 
4329
/* Add a range of bytes included in the current compilation unit.  */
4330
 
4331
static bfd_boolean
4332
ieee_add_range (struct ieee_handle *info, bfd_boolean global, bfd_vma low,
4333
                bfd_vma high)
4334
{
4335
  struct ieee_range **plist, *r, **pr;
4336
 
4337
  if (low == (bfd_vma) -1 || high == (bfd_vma) -1 || low == high)
4338
    return TRUE;
4339
 
4340
  if (global)
4341
    plist = &info->global_ranges;
4342
  else
4343
    plist = &info->ranges;
4344
 
4345
  for (r = *plist; r != NULL; r = r->next)
4346
    {
4347
      if (high >= r->low && low <= r->high)
4348
        {
4349
          /* The new range overlaps r.  */
4350
          if (low < r->low)
4351
            r->low = low;
4352
          if (high > r->high)
4353
            r->high = high;
4354
          pr = &r->next;
4355
          while (*pr != NULL && (*pr)->low <= r->high)
4356
            {
4357
              struct ieee_range *n;
4358
 
4359
              if ((*pr)->high > r->high)
4360
                r->high = (*pr)->high;
4361
              n = (*pr)->next;
4362
              free (*pr);
4363
              *pr = n;
4364
            }
4365
          return TRUE;
4366
        }
4367
    }
4368
 
4369
  r = (struct ieee_range *) xmalloc (sizeof *r);
4370
  memset (r, 0, sizeof *r);
4371
 
4372
  r->low = low;
4373
  r->high = high;
4374
 
4375
  /* Store the ranges sorted by address.  */
4376
  for (pr = plist; *pr != NULL; pr = &(*pr)->next)
4377
    if ((*pr)->low > high)
4378
      break;
4379
  r->next = *pr;
4380
  *pr = r;
4381
 
4382
  return TRUE;
4383
}
4384
 
4385
/* Start a new range for which we only have the low address.  */
4386
 
4387
static bfd_boolean
4388
ieee_start_range (struct ieee_handle *info, bfd_vma low)
4389
{
4390
  struct ieee_range *r;
4391
 
4392
  r = (struct ieee_range *) xmalloc (sizeof *r);
4393
  memset (r, 0, sizeof *r);
4394
  r->low = low;
4395
  r->next = info->pending_ranges;
4396
  info->pending_ranges = r;
4397
  return TRUE;
4398
}
4399
 
4400
/* Finish a range started by ieee_start_range.  */
4401
 
4402
static bfd_boolean
4403
ieee_end_range (struct ieee_handle *info, bfd_vma high)
4404
{
4405
  struct ieee_range *r;
4406
  bfd_vma low;
4407
 
4408
  assert (info->pending_ranges != NULL);
4409
  r = info->pending_ranges;
4410
  low = r->low;
4411
  info->pending_ranges = r->next;
4412
  free (r);
4413
  return ieee_add_range (info, FALSE, low, high);
4414
}
4415
 
4416
/* Start defining a type.  */
4417
 
4418
static bfd_boolean
4419
ieee_define_type (struct ieee_handle *info, unsigned int size,
4420
                  bfd_boolean unsignedp, bfd_boolean localp)
4421
{
4422
  return ieee_define_named_type (info, (const char *) NULL,
4423
                                 (unsigned int) -1, size, unsignedp,
4424
                                 localp, (struct ieee_buflist *) NULL);
4425
}
4426
 
4427
/* Start defining a named type.  */
4428
 
4429
static bfd_boolean
4430
ieee_define_named_type (struct ieee_handle *info, const char *name,
4431
                        unsigned int indx, unsigned int size,
4432
                        bfd_boolean unsignedp, bfd_boolean localp,
4433
                        struct ieee_buflist *buflist)
4434
{
4435
  unsigned int type_indx;
4436
  unsigned int name_indx;
4437
 
4438
  if (indx != (unsigned int) -1)
4439
    type_indx = indx;
4440
  else
4441
    {
4442
      type_indx = info->type_indx;
4443
      ++info->type_indx;
4444
    }
4445
 
4446
  name_indx = info->name_indx;
4447
  ++info->name_indx;
4448
 
4449
  if (name == NULL)
4450
    name = "";
4451
 
4452
  /* If we were given a buffer, use it; otherwise, use either the
4453
     local or the global type information, and make sure that the type
4454
     block is started.  */
4455
  if (buflist != NULL)
4456
    {
4457
      if (! ieee_change_buffer (info, buflist))
4458
        return FALSE;
4459
    }
4460
  else if (localp)
4461
    {
4462
      if (! ieee_buffer_emptyp (&info->types))
4463
        {
4464
          if (! ieee_change_buffer (info, &info->types))
4465
            return FALSE;
4466
        }
4467
      else
4468
        {
4469
          if (! ieee_change_buffer (info, &info->types)
4470
              || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4471
              || ! ieee_write_byte (info, 1)
4472
              || ! ieee_write_number (info, 0)
4473
              || ! ieee_write_id (info, info->modname))
4474
            return FALSE;
4475
        }
4476
    }
4477
  else
4478
    {
4479
      if (! ieee_buffer_emptyp (&info->global_types))
4480
        {
4481
          if (! ieee_change_buffer (info, &info->global_types))
4482
            return FALSE;
4483
        }
4484
      else
4485
        {
4486
          if (! ieee_change_buffer (info, &info->global_types)
4487
              || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4488
              || ! ieee_write_byte (info, 2)
4489
              || ! ieee_write_number (info, 0)
4490
              || ! ieee_write_id (info, ""))
4491
            return FALSE;
4492
        }
4493
    }
4494
 
4495
  /* Push the new type on the type stack, write out an NN record, and
4496
     write out the start of a TY record.  The caller will then finish
4497
     the TY record.  */
4498
  if (! ieee_push_type (info, type_indx, size, unsignedp, localp))
4499
    return FALSE;
4500
 
4501
  return (ieee_write_byte (info, (int) ieee_nn_record)
4502
          && ieee_write_number (info, name_indx)
4503
          && ieee_write_id (info, name)
4504
          && ieee_write_byte (info, (int) ieee_ty_record_enum)
4505
          && ieee_write_number (info, type_indx)
4506
          && ieee_write_byte (info, 0xce)
4507
          && ieee_write_number (info, name_indx));
4508
}
4509
 
4510
/* Get an entry to the list of modified versions of a type.  */
4511
 
4512
static struct ieee_modified_type *
4513
ieee_get_modified_info (struct ieee_handle *info, unsigned int indx)
4514
{
4515
  if (indx >= info->modified_alloc)
4516
    {
4517
      unsigned int nalloc;
4518
 
4519
      nalloc = info->modified_alloc;
4520
      if (nalloc == 0)
4521
        nalloc = 16;
4522
      while (indx >= nalloc)
4523
        nalloc *= 2;
4524
      info->modified = ((struct ieee_modified_type *)
4525
                        xrealloc (info->modified,
4526
                                  nalloc * sizeof *info->modified));
4527
      memset (info->modified + info->modified_alloc, 0,
4528
              (nalloc - info->modified_alloc) * sizeof *info->modified);
4529
      info->modified_alloc = nalloc;
4530
    }
4531
 
4532
  return info->modified + indx;
4533
}
4534
 
4535
/* Routines for the hash table mapping names to types.  */
4536
 
4537
/* Initialize an entry in the hash table.  */
4538
 
4539
static struct bfd_hash_entry *
4540
ieee_name_type_newfunc (struct bfd_hash_entry *entry,
4541
                        struct bfd_hash_table *table, const char *string)
4542
{
4543
  struct ieee_name_type_hash_entry *ret =
4544
    (struct ieee_name_type_hash_entry *) entry;
4545
 
4546
  /* Allocate the structure if it has not already been allocated by a
4547
     subclass.  */
4548
  if (ret == NULL)
4549
    ret = ((struct ieee_name_type_hash_entry *)
4550
           bfd_hash_allocate (table, sizeof *ret));
4551
  if (ret == NULL)
4552
    return NULL;
4553
 
4554
  /* Call the allocation method of the superclass.  */
4555
  ret = ((struct ieee_name_type_hash_entry *)
4556
         bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
4557
  if (ret)
4558
    {
4559
      /* Set local fields.  */
4560
      ret->types = NULL;
4561
    }
4562
 
4563
  return (struct bfd_hash_entry *) ret;
4564
}
4565
 
4566
/* Look up an entry in the hash table.  */
4567
 
4568
#define ieee_name_type_hash_lookup(table, string, create, copy) \
4569
  ((struct ieee_name_type_hash_entry *) \
4570
   bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
4571
 
4572
/* Traverse the hash table.  */
4573
 
4574
#define ieee_name_type_hash_traverse(table, func, info)                 \
4575
  (bfd_hash_traverse                                                    \
4576
   (&(table)->root,                                                     \
4577
    (bfd_boolean (*) (struct bfd_hash_entry *, void *)) (func),         \
4578
    (info)))
4579
 
4580
/* The general routine to write out IEEE debugging information.  */
4581
 
4582
bfd_boolean
4583
write_ieee_debugging_info (bfd *abfd, void *dhandle)
4584
{
4585
  struct ieee_handle info;
4586
  asection *s;
4587
  const char *err;
4588
  struct ieee_buf *b;
4589
 
4590
  memset (&info, 0, sizeof info);
4591
  info.abfd = abfd;
4592
  info.type_indx = 256;
4593
  info.name_indx = 32;
4594
 
4595
  if (!bfd_hash_table_init (&info.typedefs.root, ieee_name_type_newfunc,
4596
                            sizeof (struct ieee_name_type_hash_entry))
4597
      || !bfd_hash_table_init (&info.tags.root, ieee_name_type_newfunc,
4598
                               sizeof (struct ieee_name_type_hash_entry)))
4599
    return FALSE;
4600
 
4601
  if (! ieee_init_buffer (&info, &info.global_types)
4602
      || ! ieee_init_buffer (&info, &info.data)
4603
      || ! ieee_init_buffer (&info, &info.types)
4604
      || ! ieee_init_buffer (&info, &info.vars)
4605
      || ! ieee_init_buffer (&info, &info.cxx)
4606
      || ! ieee_init_buffer (&info, &info.linenos)
4607
      || ! ieee_init_buffer (&info, &info.fntype)
4608
      || ! ieee_init_buffer (&info, &info.fnargs))
4609
    return FALSE;
4610
 
4611
  if (! debug_write (dhandle, &ieee_fns, (void *) &info))
4612
    return FALSE;
4613
 
4614
  if (info.filename != NULL)
4615
    {
4616
      if (! ieee_finish_compilation_unit (&info))
4617
        return FALSE;
4618
    }
4619
 
4620
  /* Put any undefined tags in the global typedef information.  */
4621
  info.error = FALSE;
4622
  ieee_name_type_hash_traverse (&info.tags,
4623
                                ieee_write_undefined_tag,
4624
                                (void *) &info);
4625
  if (info.error)
4626
    return FALSE;
4627
 
4628
  /* Prepend the global typedef information to the other data.  */
4629
  if (! ieee_buffer_emptyp (&info.global_types))
4630
    {
4631
      /* The HP debugger seems to have a bug in which it ignores the
4632
         last entry in the global types, so we add a dummy entry.  */
4633
      if (! ieee_change_buffer (&info, &info.global_types)
4634
          || ! ieee_write_byte (&info, (int) ieee_nn_record)
4635
          || ! ieee_write_number (&info, info.name_indx)
4636
          || ! ieee_write_id (&info, "")
4637
          || ! ieee_write_byte (&info, (int) ieee_ty_record_enum)
4638
          || ! ieee_write_number (&info, info.type_indx)
4639
          || ! ieee_write_byte (&info, 0xce)
4640
          || ! ieee_write_number (&info, info.name_indx)
4641
          || ! ieee_write_number (&info, 'P')
4642
          || ! ieee_write_number (&info, (int) builtin_void + 32)
4643
          || ! ieee_write_byte (&info, (int) ieee_be_record_enum))
4644
        return FALSE;
4645
 
4646
      if (! ieee_append_buffer (&info, &info.global_types, &info.data))
4647
        return FALSE;
4648
      info.data = info.global_types;
4649
    }
4650
 
4651
  /* Make sure that we have declare BB11 blocks for each range in the
4652
     file.  They are added to info->vars.  */
4653
  info.error = FALSE;
4654
  if (! ieee_init_buffer (&info, &info.vars))
4655
    return FALSE;
4656
  bfd_map_over_sections (abfd, ieee_add_bb11_blocks, (void *) &info);
4657
  if (info.error)
4658
    return FALSE;
4659
  if (! ieee_buffer_emptyp (&info.vars))
4660
    {
4661
      if (! ieee_change_buffer (&info, &info.vars)
4662
          || ! ieee_write_byte (&info, (int) ieee_be_record_enum))
4663
        return FALSE;
4664
 
4665
      if (! ieee_append_buffer (&info, &info.data, &info.vars))
4666
        return FALSE;
4667
    }
4668
 
4669
  /* Now all the data is in info.data.  Write it out to the BFD.  We
4670
     normally would need to worry about whether all the other sections
4671
     are set up yet, but the IEEE backend will handle this particular
4672
     case correctly regardless.  */
4673
  if (ieee_buffer_emptyp (&info.data))
4674
    {
4675
      /* There is no debugging information.  */
4676
      return TRUE;
4677
    }
4678
  err = NULL;
4679
  s = bfd_make_section (abfd, ".debug");
4680
  if (s == NULL)
4681
    err = "bfd_make_section";
4682
  if (err == NULL)
4683
    {
4684
      if (! bfd_set_section_flags (abfd, s, SEC_DEBUGGING | SEC_HAS_CONTENTS))
4685
        err = "bfd_set_section_flags";
4686
    }
4687
  if (err == NULL)
4688
    {
4689
      bfd_size_type size;
4690
 
4691
      size = 0;
4692
      for (b = info.data.head; b != NULL; b = b->next)
4693
        size += b->c;
4694
      if (! bfd_set_section_size (abfd, s, size))
4695
        err = "bfd_set_section_size";
4696
    }
4697
  if (err == NULL)
4698
    {
4699
      file_ptr offset;
4700
 
4701
      offset = 0;
4702
      for (b = info.data.head; b != NULL; b = b->next)
4703
        {
4704
          if (! bfd_set_section_contents (abfd, s, b->buf, offset, b->c))
4705
            {
4706
              err = "bfd_set_section_contents";
4707
              break;
4708
            }
4709
          offset += b->c;
4710
        }
4711
    }
4712
 
4713
  if (err != NULL)
4714
    {
4715
      fprintf (stderr, "%s: %s: %s\n", bfd_get_filename (abfd), err,
4716
               bfd_errmsg (bfd_get_error ()));
4717
      return FALSE;
4718
    }
4719
 
4720
  bfd_hash_table_free (&info.typedefs.root);
4721
  bfd_hash_table_free (&info.tags.root);
4722
 
4723
  return TRUE;
4724
}
4725
 
4726
/* Write out information for an undefined tag.  This is called via
4727
   ieee_name_type_hash_traverse.  */
4728
 
4729
static bfd_boolean
4730
ieee_write_undefined_tag (struct ieee_name_type_hash_entry *h, void *p)
4731
{
4732
  struct ieee_handle *info = (struct ieee_handle *) p;
4733
  struct ieee_name_type *nt;
4734
 
4735
  for (nt = h->types; nt != NULL; nt = nt->next)
4736
    {
4737
      unsigned int name_indx;
4738
      char code;
4739
 
4740
      if (nt->kind == DEBUG_KIND_ILLEGAL)
4741
        continue;
4742
 
4743
      if (ieee_buffer_emptyp (&info->global_types))
4744
        {
4745
          if (! ieee_change_buffer (info, &info->global_types)
4746
              || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4747
              || ! ieee_write_byte (info, 2)
4748
              || ! ieee_write_number (info, 0)
4749
              || ! ieee_write_id (info, ""))
4750
            {
4751
              info->error = TRUE;
4752
              return FALSE;
4753
            }
4754
        }
4755
      else
4756
        {
4757
          if (! ieee_change_buffer (info, &info->global_types))
4758
            {
4759
              info->error = TRUE;
4760
              return FALSE;
4761
            }
4762
        }
4763
 
4764
      name_indx = info->name_indx;
4765
      ++info->name_indx;
4766
      if (! ieee_write_byte (info, (int) ieee_nn_record)
4767
          || ! ieee_write_number (info, name_indx)
4768
          || ! ieee_write_id (info, nt->type.name)
4769
          || ! ieee_write_byte (info, (int) ieee_ty_record_enum)
4770
          || ! ieee_write_number (info, nt->type.indx)
4771
          || ! ieee_write_byte (info, 0xce)
4772
          || ! ieee_write_number (info, name_indx))
4773
        {
4774
          info->error = TRUE;
4775
          return FALSE;
4776
        }
4777
 
4778
      switch (nt->kind)
4779
        {
4780
        default:
4781
          abort ();
4782
          info->error = TRUE;
4783
          return FALSE;
4784
        case DEBUG_KIND_STRUCT:
4785
        case DEBUG_KIND_CLASS:
4786
          code = 'S';
4787
          break;
4788
        case DEBUG_KIND_UNION:
4789
        case DEBUG_KIND_UNION_CLASS:
4790
          code = 'U';
4791
          break;
4792
        case DEBUG_KIND_ENUM:
4793
          code = 'E';
4794
          break;
4795
        }
4796
      if (! ieee_write_number (info, code)
4797
          || ! ieee_write_number (info, 0))
4798
        {
4799
          info->error = TRUE;
4800
          return FALSE;
4801
        }
4802
    }
4803
 
4804
  return TRUE;
4805
}
4806
 
4807
/* Start writing out information for a compilation unit.  */
4808
 
4809
static bfd_boolean
4810
ieee_start_compilation_unit (void *p, const char *filename)
4811
{
4812
  struct ieee_handle *info = (struct ieee_handle *) p;
4813
  const char *modname;
4814
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
4815
  const char *backslash;
4816
#endif
4817
  char *c, *s;
4818
  unsigned int nindx;
4819
 
4820
  if (info->filename != NULL)
4821
    {
4822
      if (! ieee_finish_compilation_unit (info))
4823
        return FALSE;
4824
    }
4825
 
4826
  info->filename = filename;
4827
  modname = strrchr (filename, '/');
4828
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
4829
  /* We could have a mixed forward/back slash case.  */
4830
  backslash = strrchr (filename, '\\');
4831
  if (modname == NULL || (backslash != NULL && backslash > modname))
4832
    modname = backslash;
4833
#endif
4834
 
4835
  if (modname != NULL)
4836
    ++modname;
4837
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
4838
  else if (filename[0] && filename[1] == ':')
4839
    modname = filename + 2;
4840
#endif
4841
  else
4842
    modname = filename;
4843
 
4844
  c = xstrdup (modname);
4845
  s = strrchr (c, '.');
4846
  if (s != NULL)
4847
    *s = '\0';
4848
  info->modname = c;
4849
 
4850
  if (! ieee_init_buffer (info, &info->types)
4851
      || ! ieee_init_buffer (info, &info->vars)
4852
      || ! ieee_init_buffer (info, &info->cxx)
4853
      || ! ieee_init_buffer (info, &info->linenos))
4854
    return FALSE;
4855
  info->ranges = NULL;
4856
 
4857
  /* Always include a BB1 and a BB3 block.  That is what the output of
4858
     the MRI linker seems to look like.  */
4859
  if (! ieee_change_buffer (info, &info->types)
4860
      || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4861
      || ! ieee_write_byte (info, 1)
4862
      || ! ieee_write_number (info, 0)
4863
      || ! ieee_write_id (info, info->modname))
4864
    return FALSE;
4865
 
4866
  nindx = info->name_indx;
4867
  ++info->name_indx;
4868
  if (! ieee_change_buffer (info, &info->vars)
4869
      || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4870
      || ! ieee_write_byte (info, 3)
4871
      || ! ieee_write_number (info, 0)
4872
      || ! ieee_write_id (info, info->modname))
4873
    return FALSE;
4874
 
4875
  return TRUE;
4876
}
4877
 
4878
/* Finish up a compilation unit.  */
4879
 
4880
static bfd_boolean
4881
ieee_finish_compilation_unit (struct ieee_handle *info)
4882
{
4883
  struct ieee_range *r;
4884
 
4885
  if (! ieee_buffer_emptyp (&info->types))
4886
    {
4887
      if (! ieee_change_buffer (info, &info->types)
4888
          || ! ieee_write_byte (info, (int) ieee_be_record_enum))
4889
        return FALSE;
4890
    }
4891
 
4892
  if (! ieee_buffer_emptyp (&info->cxx))
4893
    {
4894
      /* Append any C++ information to the global function and
4895
         variable information.  */
4896
      assert (! ieee_buffer_emptyp (&info->vars));
4897
      if (! ieee_change_buffer (info, &info->vars))
4898
        return FALSE;
4899
 
4900
      /* We put the pmisc records in a dummy procedure, just as the
4901
         MRI compiler does.  */
4902
      if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
4903
          || ! ieee_write_byte (info, 6)
4904
          || ! ieee_write_number (info, 0)
4905
          || ! ieee_write_id (info, "__XRYCPP")
4906
          || ! ieee_write_number (info, 0)
4907
          || ! ieee_write_number (info, 0)
4908
          || ! ieee_write_number (info, info->highaddr - 1)
4909
          || ! ieee_append_buffer (info, &info->vars, &info->cxx)
4910
          || ! ieee_change_buffer (info, &info->vars)
4911
          || ! ieee_write_byte (info, (int) ieee_be_record_enum)
4912
          || ! ieee_write_number (info, info->highaddr - 1))
4913
        return FALSE;
4914
    }
4915
 
4916
  if (! ieee_buffer_emptyp (&info->vars))
4917
    {
4918
      if (! ieee_change_buffer (info, &info->vars)
4919
          || ! ieee_write_byte (info, (int) ieee_be_record_enum))
4920
        return FALSE;
4921
    }
4922
 
4923
  if (info->pending_lineno_filename != NULL)
4924
    {
4925
      /* Force out the pending line number.  */
4926
      if (! ieee_lineno ((void *) info, (const char *) NULL, 0, (bfd_vma) -1))
4927
        return FALSE;
4928
    }
4929
  if (! ieee_buffer_emptyp (&info->linenos))
4930
    {
4931
      if (! ieee_change_buffer (info, &info->linenos)
4932
          || ! ieee_write_byte (info, (int) ieee_be_record_enum))
4933
        return FALSE;
4934
      if (strcmp (info->filename, info->lineno_filename) != 0)
4935
        {
4936
          /* We were not in the main file.  We just closed the
4937
             included line number block, and now we must close the
4938
             main line number block.  */
4939
          if (! ieee_write_byte (info, (int) ieee_be_record_enum))
4940
            return FALSE;
4941
        }
4942
    }
4943
 
4944
  if (! ieee_append_buffer (info, &info->data, &info->types)
4945
      || ! ieee_append_buffer (info, &info->data, &info->vars)
4946
      || ! ieee_append_buffer (info, &info->data, &info->linenos))
4947
    return FALSE;
4948
 
4949
  /* Build BB10/BB11 blocks based on the ranges we recorded.  */
4950
  if (! ieee_change_buffer (info, &info->data))
4951
    return FALSE;
4952
 
4953
  if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
4954
      || ! ieee_write_byte (info, 10)
4955
      || ! ieee_write_number (info, 0)
4956
      || ! ieee_write_id (info, info->modname)
4957
      || ! ieee_write_id (info, "")
4958
      || ! ieee_write_number (info, 0)
4959
      || ! ieee_write_id (info, "GNU objcopy"))
4960
    return FALSE;
4961
 
4962
  for (r = info->ranges; r != NULL; r = r->next)
4963
    {
4964
      bfd_vma low, high;
4965
      asection *s;
4966
      int kind;
4967
 
4968
      low = r->low;
4969
      high = r->high;
4970
 
4971
      /* Find the section corresponding to this range.  */
4972
      for (s = info->abfd->sections; s != NULL; s = s->next)
4973
        {
4974
          if (bfd_get_section_vma (info->abfd, s) <= low
4975
              && high <= (bfd_get_section_vma (info->abfd, s)
4976
                          + bfd_section_size (info->abfd, s)))
4977
            break;
4978
        }
4979
 
4980
      if (s == NULL)
4981
        {
4982
          /* Just ignore this range.  */
4983
          continue;
4984
        }
4985
 
4986
      /* Coalesce ranges if it seems reasonable.  */
4987
      while (r->next != NULL
4988
             && high + 0x1000 >= r->next->low
4989
             && (r->next->high
4990
                 <= (bfd_get_section_vma (info->abfd, s)
4991
                     + bfd_section_size (info->abfd, s))))
4992
        {
4993
          r = r->next;
4994
          high = r->high;
4995
        }
4996
 
4997
      if ((s->flags & SEC_CODE) != 0)
4998
        kind = 1;
4999
      else if ((s->flags & SEC_READONLY) != 0)
5000
        kind = 3;
5001
      else
5002
        kind = 2;
5003
 
5004
      if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
5005
          || ! ieee_write_byte (info, 11)
5006
          || ! ieee_write_number (info, 0)
5007
          || ! ieee_write_id (info, "")
5008
          || ! ieee_write_number (info, kind)
5009
          || ! ieee_write_number (info, s->index + IEEE_SECTION_NUMBER_BASE)
5010
          || ! ieee_write_number (info, low)
5011
          || ! ieee_write_byte (info, (int) ieee_be_record_enum)
5012
          || ! ieee_write_number (info, high - low))
5013
        return FALSE;
5014
 
5015
      /* Add this range to the list of global ranges.  */
5016
      if (! ieee_add_range (info, TRUE, low, high))
5017
        return FALSE;
5018
    }
5019
 
5020
  if (! ieee_write_byte (info, (int) ieee_be_record_enum))
5021
    return FALSE;
5022
 
5023
  return TRUE;
5024
}
5025
 
5026
/* Add BB11 blocks describing each range that we have not already
5027
   described.  */
5028
 
5029
static void
5030
ieee_add_bb11_blocks (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *data)
5031
{
5032
  struct ieee_handle *info = (struct ieee_handle *) data;
5033
  bfd_vma low, high;
5034
  struct ieee_range *r;
5035
 
5036
  low = bfd_get_section_vma (abfd, sec);
5037
  high = low + bfd_section_size (abfd, sec);
5038
 
5039
  /* Find the first range at or after this section.  The ranges are
5040
     sorted by address.  */
5041
  for (r = info->global_ranges; r != NULL; r = r->next)
5042
    if (r->high > low)
5043
      break;
5044
 
5045
  while (low < high)
5046
    {
5047
      if (r == NULL || r->low >= high)
5048
        {
5049
          if (! ieee_add_bb11 (info, sec, low, high))
5050
            info->error = TRUE;
5051
          return;
5052
        }
5053
 
5054
      if (low < r->low
5055
          && r->low - low > 0x100)
5056
        {
5057
          if (! ieee_add_bb11 (info, sec, low, r->low))
5058
            {
5059
              info->error = TRUE;
5060
              return;
5061
            }
5062
        }
5063
      low = r->high;
5064
 
5065
      r = r->next;
5066
    }
5067
}
5068
 
5069
/* Add a single BB11 block for a range.  We add it to info->vars.  */
5070
 
5071
static bfd_boolean
5072
ieee_add_bb11 (struct ieee_handle *info, asection *sec, bfd_vma low,
5073
               bfd_vma high)
5074
{
5075
  int kind;
5076
 
5077
  if (! ieee_buffer_emptyp (&info->vars))
5078
    {
5079
      if (! ieee_change_buffer (info, &info->vars))
5080
        return FALSE;
5081
    }
5082
  else
5083
    {
5084
      const char *filename, *modname;
5085
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
5086
      const char *backslash;
5087
#endif
5088
      char *c, *s;
5089
 
5090
      /* Start the enclosing BB10 block.  */
5091
      filename = bfd_get_filename (info->abfd);
5092
      modname = strrchr (filename, '/');
5093
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
5094
      backslash = strrchr (filename, '\\');
5095
      if (modname == NULL || (backslash != NULL && backslash > modname))
5096
        modname = backslash;
5097
#endif
5098
 
5099
      if (modname != NULL)
5100
        ++modname;
5101
#ifdef HAVE_DOS_BASED_FILE_SYSTEM
5102
      else if (filename[0] && filename[1] == ':')
5103
        modname = filename + 2;
5104
#endif
5105
      else
5106
        modname = filename;
5107
 
5108
      c = xstrdup (modname);
5109
      s = strrchr (c, '.');
5110
      if (s != NULL)
5111
        *s = '\0';
5112
 
5113
      if (! ieee_change_buffer (info, &info->vars)
5114
          || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
5115
          || ! ieee_write_byte (info, 10)
5116
          || ! ieee_write_number (info, 0)
5117
          || ! ieee_write_id (info, c)
5118
          || ! ieee_write_id (info, "")
5119
          || ! ieee_write_number (info, 0)
5120
          || ! ieee_write_id (info, "GNU objcopy"))
5121
        return FALSE;
5122
 
5123
      free (c);
5124
    }
5125
 
5126
  if ((sec->flags & SEC_CODE) != 0)
5127
    kind = 1;
5128
  else if ((sec->flags & SEC_READONLY) != 0)
5129
    kind = 3;
5130
  else
5131
    kind = 2;
5132
 
5133
  if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
5134
      || ! ieee_write_byte (info, 11)
5135
      || ! ieee_write_number (info, 0)
5136
      || ! ieee_write_id (info, "")
5137
      || ! ieee_write_number (info, kind)
5138
      || ! ieee_write_number (info, sec->index + IEEE_SECTION_NUMBER_BASE)
5139
      || ! ieee_write_number (info, low)
5140
      || ! ieee_write_byte (info, (int) ieee_be_record_enum)
5141
      || ! ieee_write_number (info, high - low))
5142
    return FALSE;
5143
 
5144
  return TRUE;
5145
}
5146
 
5147
/* Start recording information from a particular source file.  This is
5148
   used to record which file defined which types, variables, etc.  It
5149
   is not used for line numbers, since the lineno entry point passes
5150
   down the file name anyhow.  IEEE debugging information doesn't seem
5151
   to store this information anywhere.  */
5152
 
5153
static bfd_boolean
5154
ieee_start_source (void *p ATTRIBUTE_UNUSED,
5155
                   const char *filename ATTRIBUTE_UNUSED)
5156
{
5157
  return TRUE;
5158
}
5159
 
5160
/* Make an empty type.  */
5161
 
5162
static bfd_boolean
5163
ieee_empty_type (void *p)
5164
{
5165
  struct ieee_handle *info = (struct ieee_handle *) p;
5166
 
5167
  return ieee_push_type (info, (int) builtin_unknown, 0, FALSE, FALSE);
5168
}
5169
 
5170
/* Make a void type.  */
5171
 
5172
static bfd_boolean
5173
ieee_void_type (void *p)
5174
{
5175
  struct ieee_handle *info = (struct ieee_handle *) p;
5176
 
5177
  return ieee_push_type (info, (int) builtin_void, 0, FALSE, FALSE);
5178
}
5179
 
5180
/* Make an integer type.  */
5181
 
5182
static bfd_boolean
5183
ieee_int_type (void *p, unsigned int size, bfd_boolean unsignedp)
5184
{
5185
  struct ieee_handle *info = (struct ieee_handle *) p;
5186
  unsigned int indx;
5187
 
5188
  switch (size)
5189
    {
5190
    case 1:
5191
      indx = (int) builtin_signed_char;
5192
      break;
5193
    case 2:
5194
      indx = (int) builtin_signed_short_int;
5195
      break;
5196
    case 4:
5197
      indx = (int) builtin_signed_long;
5198
      break;
5199
    case 8:
5200
      indx = (int) builtin_signed_long_long;
5201
      break;
5202
    default:
5203
      fprintf (stderr, _("IEEE unsupported integer type size %u\n"), size);
5204
      return FALSE;
5205
    }
5206
 
5207
  if (unsignedp)
5208
    ++indx;
5209
 
5210
  return ieee_push_type (info, indx, size, unsignedp, FALSE);
5211
}
5212
 
5213
/* Make a floating point type.  */
5214
 
5215
static bfd_boolean
5216
ieee_float_type (void *p, unsigned int size)
5217
{
5218
  struct ieee_handle *info = (struct ieee_handle *) p;
5219
  unsigned int indx;
5220
 
5221
  switch (size)
5222
    {
5223
    case 4:
5224
      indx = (int) builtin_float;
5225
      break;
5226
    case 8:
5227
      indx = (int) builtin_double;
5228
      break;
5229
    case 12:
5230
      /* FIXME: This size really depends upon the processor.  */
5231
      indx = (int) builtin_long_double;
5232
      break;
5233
    case 16:
5234
      indx = (int) builtin_long_long_double;
5235
      break;
5236
    default:
5237
      fprintf (stderr, _("IEEE unsupported float type size %u\n"), size);
5238
      return FALSE;
5239
    }
5240
 
5241
  return ieee_push_type (info, indx, size, FALSE, FALSE);
5242
}
5243
 
5244
/* Make a complex type.  */
5245
 
5246
static bfd_boolean
5247
ieee_complex_type (void *p, unsigned int size)
5248
{
5249
  struct ieee_handle *info = (struct ieee_handle *) p;
5250
  char code;
5251
 
5252
  switch (size)
5253
    {
5254
    case 4:
5255
      if (info->complex_float_index != 0)
5256
        return ieee_push_type (info, info->complex_float_index, size * 2,
5257
                               FALSE, FALSE);
5258
      code = 'c';
5259
      break;
5260
    case 12:
5261
    case 16:
5262
      /* These cases can be output by gcc -gstabs.  Outputting the
5263
         wrong type is better than crashing.  */
5264
    case 8:
5265
      if (info->complex_double_index != 0)
5266
        return ieee_push_type (info, info->complex_double_index, size * 2,
5267
                               FALSE, FALSE);
5268
      code = 'd';
5269
      break;
5270
    default:
5271
      fprintf (stderr, _("IEEE unsupported complex type size %u\n"), size);
5272
      return FALSE;
5273
    }
5274
 
5275
  /* FIXME: I don't know what the string is for.  */
5276
  if (! ieee_define_type (info, size * 2, FALSE, FALSE)
5277
      || ! ieee_write_number (info, code)
5278
      || ! ieee_write_id (info, ""))
5279
    return FALSE;
5280
 
5281
  if (size == 4)
5282
    info->complex_float_index = info->type_stack->type.indx;
5283
  else
5284
    info->complex_double_index = info->type_stack->type.indx;
5285
 
5286
  return TRUE;
5287
}
5288
 
5289
/* Make a boolean type.  IEEE doesn't support these, so we just make
5290
   an integer type instead.  */
5291
 
5292
static bfd_boolean
5293
ieee_bool_type (void *p, unsigned int size)
5294
{
5295
  return ieee_int_type (p, size, TRUE);
5296
}
5297
 
5298
/* Make an enumeration.  */
5299
 
5300
static bfd_boolean
5301
ieee_enum_type (void *p, const char *tag, const char **names,
5302
                bfd_signed_vma *vals)
5303
{
5304
  struct ieee_handle *info = (struct ieee_handle *) p;
5305
  struct ieee_defined_enum *e;
5306
  bfd_boolean localp, simple;
5307
  unsigned int indx;
5308
  int i = 0;
5309
 
5310
  localp = FALSE;
5311
  indx = (unsigned int) -1;
5312
  for (e = info->enums; e != NULL; e = e->next)
5313
    {
5314
      if (tag == NULL)
5315
        {
5316
          if (e->tag != NULL)
5317
            continue;
5318
        }
5319
      else
5320
        {
5321
          if (e->tag == NULL
5322
              || tag[0] != e->tag[0]
5323
              || strcmp (tag, e->tag) != 0)
5324
            continue;
5325
        }
5326
 
5327
      if (! e->defined)
5328
        {
5329
          /* This enum tag has been seen but not defined.  */
5330
          indx = e->indx;
5331
          break;
5332
        }
5333
 
5334
      if (names != NULL && e->names != NULL)
5335
        {
5336
          for (i = 0; names[i] != NULL && e->names[i] != NULL; i++)
5337
            {
5338
              if (names[i][0] != e->names[i][0]
5339
                  || vals[i] != e->vals[i]
5340
                  || strcmp (names[i], e->names[i]) != 0)
5341
                break;
5342
            }
5343
        }
5344
 
5345
      if ((names == NULL && e->names == NULL)
5346
          || (names != NULL
5347
              && e->names != NULL
5348
              && names[i] == NULL
5349
              && e->names[i] == NULL))
5350
        {
5351
          /* We've seen this enum before.  */
5352
          return ieee_push_type (info, e->indx, 0, TRUE, FALSE);
5353
        }
5354
 
5355
      if (tag != NULL)
5356
        {
5357
          /* We've already seen an enum of the same name, so we must make
5358
             sure to output this one locally.  */
5359
          localp = TRUE;
5360
          break;
5361
        }
5362
    }
5363
 
5364
  /* If this is a simple enumeration, in which the values start at 0
5365
     and always increment by 1, we can use type E.  Otherwise we must
5366
     use type N.  */
5367
 
5368
  simple = TRUE;
5369
  if (names != NULL)
5370
    {
5371
      for (i = 0; names[i] != NULL; i++)
5372
        {
5373
          if (vals[i] != i)
5374
            {
5375
              simple = FALSE;
5376
              break;
5377
            }
5378
        }
5379
    }
5380
 
5381
  if (! ieee_define_named_type (info, tag, indx, 0, TRUE, localp,
5382
                                (struct ieee_buflist *) NULL)
5383
      || ! ieee_write_number (info, simple ? 'E' : 'N'))
5384
    return FALSE;
5385
  if (simple)
5386
    {
5387
      /* FIXME: This is supposed to be the enumeration size, but we
5388
         don't store that.  */
5389
      if (! ieee_write_number (info, 4))
5390
        return FALSE;
5391
    }
5392
  if (names != NULL)
5393
    {
5394
      for (i = 0; names[i] != NULL; i++)
5395
        {
5396
          if (! ieee_write_id (info, names[i]))
5397
            return FALSE;
5398
          if (! simple)
5399
            {
5400
              if (! ieee_write_number (info, vals[i]))
5401
                return FALSE;
5402
            }
5403
        }
5404
    }
5405
 
5406
  if (! localp)
5407
    {
5408
      if (indx == (unsigned int) -1)
5409
        {
5410
          e = (struct ieee_defined_enum *) xmalloc (sizeof *e);
5411
          memset (e, 0, sizeof *e);
5412
          e->indx = info->type_stack->type.indx;
5413
          e->tag = tag;
5414
 
5415
          e->next = info->enums;
5416
          info->enums = e;
5417
        }
5418
 
5419
      e->names = names;
5420
      e->vals = vals;
5421
      e->defined = TRUE;
5422
    }
5423
 
5424
  return TRUE;
5425
}
5426
 
5427
/* Make a pointer type.  */
5428
 
5429
static bfd_boolean
5430
ieee_pointer_type (void *p)
5431
{
5432
  struct ieee_handle *info = (struct ieee_handle *) p;
5433
  bfd_boolean localp;
5434
  unsigned int indx;
5435
  struct ieee_modified_type *m = NULL;
5436
 
5437
  localp = info->type_stack->type.localp;
5438
  indx = ieee_pop_type (info);
5439
 
5440
  /* A pointer to a simple builtin type can be obtained by adding 32.
5441
     FIXME: Will this be a short pointer, and will that matter?  */
5442
  if (indx < 32)
5443
    return ieee_push_type (info, indx + 32, 0, TRUE, FALSE);
5444
 
5445
  if (! localp)
5446
    {
5447
      m = ieee_get_modified_info (p, indx);
5448
      if (m == NULL)
5449
        return FALSE;
5450
 
5451
      /* FIXME: The size should depend upon the architecture.  */
5452
      if (m->pointer > 0)
5453
        return ieee_push_type (info, m->pointer, 4, TRUE, FALSE);
5454
    }
5455
 
5456
  if (! ieee_define_type (info, 4, TRUE, localp)
5457
      || ! ieee_write_number (info, 'P')
5458
      || ! ieee_write_number (info, indx))
5459
    return FALSE;
5460
 
5461
  if (! localp)
5462
    m->pointer = info->type_stack->type.indx;
5463
 
5464
  return TRUE;
5465
}
5466
 
5467
/* Make a function type.  This will be called for a method, but we
5468
   don't want to actually add it to the type table in that case.  We
5469
   handle this by defining the type in a private buffer, and only
5470
   adding that buffer to the typedef block if we are going to use it.  */
5471
 
5472
static bfd_boolean
5473
ieee_function_type (void *p, int argcount, bfd_boolean varargs)
5474
{
5475
  struct ieee_handle *info = (struct ieee_handle *) p;
5476
  bfd_boolean localp;
5477
  unsigned int *args = NULL;
5478
  int i;
5479
  unsigned int retindx;
5480
  struct ieee_buflist fndef;
5481
  struct ieee_modified_type *m;
5482
 
5483
  localp = FALSE;
5484
 
5485
  if (argcount > 0)
5486
    {
5487
      args = (unsigned int *) xmalloc (argcount * sizeof *args);
5488
      for (i = argcount - 1; i >= 0; i--)
5489
        {
5490
          if (info->type_stack->type.localp)
5491
            localp = TRUE;
5492
          args[i] = ieee_pop_type (info);
5493
        }
5494
    }
5495
  else if (argcount < 0)
5496
    varargs = FALSE;
5497
 
5498
  if (info->type_stack->type.localp)
5499
    localp = TRUE;
5500
  retindx = ieee_pop_type (info);
5501
 
5502
  m = NULL;
5503
  if (argcount < 0 && ! localp)
5504
    {
5505
      m = ieee_get_modified_info (p, retindx);
5506
      if (m == NULL)
5507
        return FALSE;
5508
 
5509
      if (m->function > 0)
5510
        return ieee_push_type (info, m->function, 0, TRUE, FALSE);
5511
    }
5512
 
5513
  /* An attribute of 0x41 means that the frame and push mask are
5514
     unknown.  */
5515
  if (! ieee_init_buffer (info, &fndef)
5516
      || ! ieee_define_named_type (info, (const char *) NULL,
5517
                                   (unsigned int) -1, 0, TRUE, localp,
5518
                                   &fndef)
5519
      || ! ieee_write_number (info, 'x')
5520
      || ! ieee_write_number (info, 0x41)
5521
      || ! ieee_write_number (info, 0)
5522
      || ! ieee_write_number (info, 0)
5523
      || ! ieee_write_number (info, retindx)
5524
      || ! ieee_write_number (info, (bfd_vma) argcount + (varargs ? 1 : 0)))
5525
    return FALSE;
5526
  if (argcount > 0)
5527
    {
5528
      for (i = 0; i < argcount; i++)
5529
        if (! ieee_write_number (info, args[i]))
5530
          return FALSE;
5531
      free (args);
5532
    }
5533
  if (varargs)
5534
    {
5535
      /* A varargs function is represented by writing out the last
5536
         argument as type void *, although this makes little sense.  */
5537
      if (! ieee_write_number (info, (bfd_vma) builtin_void + 32))
5538
        return FALSE;
5539
    }
5540
 
5541
  if (! ieee_write_number (info, 0))
5542
    return FALSE;
5543
 
5544
  /* We wrote the information into fndef, in case we don't need it.
5545
     It will be appended to info->types by ieee_pop_type.  */
5546
  info->type_stack->type.fndef = fndef;
5547
 
5548
  if (m != NULL)
5549
    m->function = info->type_stack->type.indx;
5550
 
5551
  return TRUE;
5552
}
5553
 
5554
/* Make a reference type.  */
5555
 
5556
static bfd_boolean
5557
ieee_reference_type (void *p)
5558
{
5559
  struct ieee_handle *info = (struct ieee_handle *) p;
5560
 
5561
  /* IEEE appears to record a normal pointer type, and then use a
5562
     pmisc record to indicate that it is really a reference.  */
5563
 
5564
  if (! ieee_pointer_type (p))
5565
    return FALSE;
5566
  info->type_stack->type.referencep = TRUE;
5567
  return TRUE;
5568
}
5569
 
5570
/* Make a range type.  */
5571
 
5572
static bfd_boolean
5573
ieee_range_type (void *p, bfd_signed_vma low, bfd_signed_vma high)
5574
{
5575
  struct ieee_handle *info = (struct ieee_handle *) p;
5576
  unsigned int size;
5577
  bfd_boolean unsignedp, localp;
5578
 
5579
  size = info->type_stack->type.size;
5580
  unsignedp = info->type_stack->type.unsignedp;
5581
  localp = info->type_stack->type.localp;
5582
  ieee_pop_unused_type (info);
5583
  return (ieee_define_type (info, size, unsignedp, localp)
5584
          && ieee_write_number (info, 'R')
5585
          && ieee_write_number (info, (bfd_vma) low)
5586
          && ieee_write_number (info, (bfd_vma) high)
5587
          && ieee_write_number (info, unsignedp ? 0 : 1)
5588
          && ieee_write_number (info, size));
5589
}
5590
 
5591
/* Make an array type.  */
5592
 
5593
static bfd_boolean
5594
ieee_array_type (void *p, bfd_signed_vma low, bfd_signed_vma high,
5595
                 bfd_boolean stringp ATTRIBUTE_UNUSED)
5596
{
5597
  struct ieee_handle *info = (struct ieee_handle *) p;
5598
  unsigned int eleindx;
5599
  bfd_boolean localp;
5600
  unsigned int size;
5601
  struct ieee_modified_type *m = NULL;
5602
  struct ieee_modified_array_type *a;
5603
 
5604
  /* IEEE does not store the range, so we just ignore it.  */
5605
  ieee_pop_unused_type (info);
5606
  localp = info->type_stack->type.localp;
5607
  size = info->type_stack->type.size;
5608
  eleindx = ieee_pop_type (info);
5609
 
5610
  /* If we don't know the range, treat the size as exactly one
5611
     element.  */
5612
  if (low < high)
5613
    size *= (high - low) + 1;
5614
 
5615
  if (! localp)
5616
    {
5617
      m = ieee_get_modified_info (info, eleindx);
5618
      if (m == NULL)
5619
        return FALSE;
5620
 
5621
      for (a = m->arrays; a != NULL; a = a->next)
5622
        {
5623
          if (a->low == low && a->high == high)
5624
            return ieee_push_type (info, a->indx, size, FALSE, FALSE);
5625
        }
5626
    }
5627
 
5628
  if (! ieee_define_type (info, size, FALSE, localp)
5629
      || ! ieee_write_number (info, low == 0 ? 'Z' : 'C')
5630
      || ! ieee_write_number (info, eleindx))
5631
    return FALSE;
5632
  if (low != 0)
5633
    {
5634
      if (! ieee_write_number (info, low))
5635
        return FALSE;
5636
    }
5637
 
5638
  if (! ieee_write_number (info, high + 1))
5639
    return FALSE;
5640
 
5641
  if (! localp)
5642
    {
5643
      a = (struct ieee_modified_array_type *) xmalloc (sizeof *a);
5644
      memset (a, 0, sizeof *a);
5645
 
5646
      a->indx = info->type_stack->type.indx;
5647
      a->low = low;
5648
      a->high = high;
5649
 
5650
      a->next = m->arrays;
5651
      m->arrays = a;
5652
    }
5653
 
5654
  return TRUE;
5655
}
5656
 
5657
/* Make a set type.  */
5658
 
5659
static bfd_boolean
5660
ieee_set_type (void *p, bfd_boolean bitstringp ATTRIBUTE_UNUSED)
5661
{
5662
  struct ieee_handle *info = (struct ieee_handle *) p;
5663
  bfd_boolean localp;
5664
  unsigned int eleindx;
5665
 
5666
  localp = info->type_stack->type.localp;
5667
  eleindx = ieee_pop_type (info);
5668
 
5669
  /* FIXME: We don't know the size, so we just use 4.  */
5670
 
5671
  return (ieee_define_type (info, 0, TRUE, localp)
5672
          && ieee_write_number (info, 's')
5673
          && ieee_write_number (info, 4)
5674
          && ieee_write_number (info, eleindx));
5675
}
5676
 
5677
/* Make an offset type.  */
5678
 
5679
static bfd_boolean
5680
ieee_offset_type (void *p)
5681
{
5682
  struct ieee_handle *info = (struct ieee_handle *) p;
5683
  unsigned int targetindx, baseindx;
5684
 
5685
  targetindx = ieee_pop_type (info);
5686
  baseindx = ieee_pop_type (info);
5687
 
5688
  /* FIXME: The MRI C++ compiler does not appear to generate any
5689
     useful type information about an offset type.  It just records a
5690
     pointer to member as an integer.  The MRI/HP IEEE spec does
5691
     describe a pmisc record which can be used for a pointer to
5692
     member.  Unfortunately, it does not describe the target type,
5693
     which seems pretty important.  I'm going to punt this for now.  */
5694
 
5695
  return ieee_int_type (p, 4, TRUE);
5696
}
5697
 
5698
/* Make a method type.  */
5699
 
5700
static bfd_boolean
5701
ieee_method_type (void *p, bfd_boolean domain, int argcount,
5702
                  bfd_boolean varargs)
5703
{
5704
  struct ieee_handle *info = (struct ieee_handle *) p;
5705
 
5706
  /* FIXME: The MRI/HP IEEE spec defines a pmisc record to use for a
5707
     method, but the definition is incomplete.  We just output an 'x'
5708
     type.  */
5709
 
5710
  if (domain)
5711
    ieee_pop_unused_type (info);
5712
 
5713
  return ieee_function_type (p, argcount, varargs);
5714
}
5715
 
5716
/* Make a const qualified type.  */
5717
 
5718
static bfd_boolean
5719
ieee_const_type (void *p)
5720
{
5721
  struct ieee_handle *info = (struct ieee_handle *) p;
5722
  unsigned int size;
5723
  bfd_boolean unsignedp, localp;
5724
  unsigned int indx;
5725
  struct ieee_modified_type *m = NULL;
5726
 
5727
  size = info->type_stack->type.size;
5728
  unsignedp = info->type_stack->type.unsignedp;
5729
  localp = info->type_stack->type.localp;
5730
  indx = ieee_pop_type (info);
5731
 
5732
  if (! localp)
5733
    {
5734
      m = ieee_get_modified_info (info, indx);
5735
      if (m == NULL)
5736
        return FALSE;
5737
 
5738
      if (m->const_qualified > 0)
5739
        return ieee_push_type (info, m->const_qualified, size, unsignedp,
5740
                               FALSE);
5741
    }
5742
 
5743
  if (! ieee_define_type (info, size, unsignedp, localp)
5744
      || ! ieee_write_number (info, 'n')
5745
      || ! ieee_write_number (info, 1)
5746
      || ! ieee_write_number (info, indx))
5747
    return FALSE;
5748
 
5749
  if (! localp)
5750
    m->const_qualified = info->type_stack->type.indx;
5751
 
5752
  return TRUE;
5753
}
5754
 
5755
/* Make a volatile qualified type.  */
5756
 
5757
static bfd_boolean
5758
ieee_volatile_type (void *p)
5759
{
5760
  struct ieee_handle *info = (struct ieee_handle *) p;
5761
  unsigned int size;
5762
  bfd_boolean unsignedp, localp;
5763
  unsigned int indx;
5764
  struct ieee_modified_type *m = NULL;
5765
 
5766
  size = info->type_stack->type.size;
5767
  unsignedp = info->type_stack->type.unsignedp;
5768
  localp = info->type_stack->type.localp;
5769
  indx = ieee_pop_type (info);
5770
 
5771
  if (! localp)
5772
    {
5773
      m = ieee_get_modified_info (info, indx);
5774
      if (m == NULL)
5775
        return FALSE;
5776
 
5777
      if (m->volatile_qualified > 0)
5778
        return ieee_push_type (info, m->volatile_qualified, size, unsignedp,
5779
                               FALSE);
5780
    }
5781
 
5782
  if (! ieee_define_type (info, size, unsignedp, localp)
5783
      || ! ieee_write_number (info, 'n')
5784
      || ! ieee_write_number (info, 2)
5785
      || ! ieee_write_number (info, indx))
5786
    return FALSE;
5787
 
5788
  if (! localp)
5789
    m->volatile_qualified = info->type_stack->type.indx;
5790
 
5791
  return TRUE;
5792
}
5793
 
5794
/* Convert an enum debug_visibility into a CXXFLAGS value.  */
5795
 
5796
static unsigned int
5797
ieee_vis_to_flags (enum debug_visibility visibility)
5798
{
5799
  switch (visibility)
5800
    {
5801
    default:
5802
      abort ();
5803
    case DEBUG_VISIBILITY_PUBLIC:
5804
      return CXXFLAGS_VISIBILITY_PUBLIC;
5805
    case DEBUG_VISIBILITY_PRIVATE:
5806
      return CXXFLAGS_VISIBILITY_PRIVATE;
5807
    case DEBUG_VISIBILITY_PROTECTED:
5808
      return CXXFLAGS_VISIBILITY_PROTECTED;
5809
    }
5810
  /*NOTREACHED*/
5811
}
5812
 
5813
/* Start defining a struct type.  We build it in the strdef field on
5814
   the stack, to avoid confusing type definitions required by the
5815
   fields with the struct type itself.  */
5816
 
5817
static bfd_boolean
5818
ieee_start_struct_type (void *p, const char *tag, unsigned int id,
5819
                        bfd_boolean structp, unsigned int size)
5820
{
5821
  struct ieee_handle *info = (struct ieee_handle *) p;
5822
  bfd_boolean localp, ignorep;
5823
  bfd_boolean copy;
5824
  char ab[20];
5825
  const char *look;
5826
  struct ieee_name_type_hash_entry *h;
5827
  struct ieee_name_type *nt, *ntlook;
5828
  struct ieee_buflist strdef;
5829
 
5830
  localp = FALSE;
5831
  ignorep = FALSE;
5832
 
5833
  /* We need to create a tag for internal use even if we don't want
5834
     one for external use.  This will let us refer to an anonymous
5835
     struct.  */
5836
  if (tag != NULL)
5837
    {
5838
      look = tag;
5839
      copy = FALSE;
5840
    }
5841
  else
5842
    {
5843
      sprintf (ab, "__anon%u", id);
5844
      look = ab;
5845
      copy = TRUE;
5846
    }
5847
 
5848
  /* If we already have references to the tag, we must use the
5849
     existing type index.  */
5850
  h = ieee_name_type_hash_lookup (&info->tags, look, TRUE, copy);
5851
  if (h == NULL)
5852
    return FALSE;
5853
 
5854
  nt = NULL;
5855
  for (ntlook = h->types; ntlook != NULL; ntlook = ntlook->next)
5856
    {
5857
      if (ntlook->id == id)
5858
        nt = ntlook;
5859
      else if (! ntlook->type.localp)
5860
        {
5861
          /* We are creating a duplicate definition of a globally
5862
             defined tag.  Force it to be local to avoid
5863
             confusion.  */
5864
          localp = TRUE;
5865
        }
5866
    }
5867
 
5868
  if (nt != NULL)
5869
    {
5870
      assert (localp == nt->type.localp);
5871
      if (nt->kind == DEBUG_KIND_ILLEGAL && ! localp)
5872
        {
5873
          /* We've already seen a global definition of the type.
5874
             Ignore this new definition.  */
5875
          ignorep = TRUE;
5876
        }
5877
    }
5878
  else
5879
    {
5880
      nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
5881
      memset (nt, 0, sizeof *nt);
5882
      nt->id = id;
5883
      nt->type.name = h->root.string;
5884
      nt->next = h->types;
5885
      h->types = nt;
5886
      nt->type.indx = info->type_indx;
5887
      ++info->type_indx;
5888
    }
5889
 
5890
  nt->kind = DEBUG_KIND_ILLEGAL;
5891
 
5892
  if (! ieee_init_buffer (info, &strdef)
5893
      || ! ieee_define_named_type (info, tag, nt->type.indx, size, TRUE,
5894
                                   localp, &strdef)
5895
      || ! ieee_write_number (info, structp ? 'S' : 'U')
5896
      || ! ieee_write_number (info, size))
5897
    return FALSE;
5898
 
5899
  if (! ignorep)
5900
    {
5901
      const char *hold;
5902
 
5903
      /* We never want nt->type.name to be NULL.  We want the rest of
5904
         the type to be the object set up on the type stack; it will
5905
         have a NULL name if tag is NULL.  */
5906
      hold = nt->type.name;
5907
      nt->type = info->type_stack->type;
5908
      nt->type.name = hold;
5909
    }
5910
 
5911
  info->type_stack->type.name = tag;
5912
  info->type_stack->type.strdef = strdef;
5913
  info->type_stack->type.ignorep = ignorep;
5914
 
5915
  return TRUE;
5916
}
5917
 
5918
/* Add a field to a struct.  */
5919
 
5920
static bfd_boolean
5921
ieee_struct_field (void *p, const char *name, bfd_vma bitpos, bfd_vma bitsize,
5922
                   enum debug_visibility visibility)
5923
{
5924
  struct ieee_handle *info = (struct ieee_handle *) p;
5925
  unsigned int size;
5926
  bfd_boolean unsignedp;
5927
  bfd_boolean referencep;
5928
  bfd_boolean localp;
5929
  unsigned int indx;
5930
  bfd_vma offset;
5931
 
5932
  assert (info->type_stack != NULL
5933
          && info->type_stack->next != NULL
5934
          && ! ieee_buffer_emptyp (&info->type_stack->next->type.strdef));
5935
 
5936
  /* If we are ignoring this struct definition, just pop and ignore
5937
     the type.  */
5938
  if (info->type_stack->next->type.ignorep)
5939
    {
5940
      ieee_pop_unused_type (info);
5941
      return TRUE;
5942
    }
5943
 
5944
  size = info->type_stack->type.size;
5945
  unsignedp = info->type_stack->type.unsignedp;
5946
  referencep = info->type_stack->type.referencep;
5947
  localp = info->type_stack->type.localp;
5948
  indx = ieee_pop_type (info);
5949
 
5950
  if (localp)
5951
    info->type_stack->type.localp = TRUE;
5952
 
5953
  if (info->type_stack->type.classdef != NULL)
5954
    {
5955
      unsigned int flags;
5956
      unsigned int nindx;
5957
 
5958
      /* This is a class.  We must add a description of this field to
5959
         the class records we are building.  */
5960
 
5961
      flags = ieee_vis_to_flags (visibility);
5962
      nindx = info->type_stack->type.classdef->indx;
5963
      if (! ieee_change_buffer (info,
5964
                                &info->type_stack->type.classdef->pmiscbuf)
5965
          || ! ieee_write_asn (info, nindx, 'd')
5966
          || ! ieee_write_asn (info, nindx, flags)
5967
          || ! ieee_write_atn65 (info, nindx, name)
5968
          || ! ieee_write_atn65 (info, nindx, name))
5969
        return FALSE;
5970
      info->type_stack->type.classdef->pmisccount += 4;
5971
 
5972
      if (referencep)
5973
        {
5974
          unsigned int nindx;
5975
 
5976
          /* We need to output a record recording that this field is
5977
             really of reference type.  We put this on the refs field
5978
             of classdef, so that it can be appended to the C++
5979
             records after the class is defined.  */
5980
 
5981
          nindx = info->name_indx;
5982
          ++info->name_indx;
5983
 
5984
          if (! ieee_change_buffer (info,
5985
                                    &info->type_stack->type.classdef->refs)
5986
              || ! ieee_write_byte (info, (int) ieee_nn_record)
5987
              || ! ieee_write_number (info, nindx)
5988
              || ! ieee_write_id (info, "")
5989
              || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
5990
              || ! ieee_write_number (info, nindx)
5991
              || ! ieee_write_number (info, 0)
5992
              || ! ieee_write_number (info, 62)
5993
              || ! ieee_write_number (info, 80)
5994
              || ! ieee_write_number (info, 4)
5995
              || ! ieee_write_asn (info, nindx, 'R')
5996
              || ! ieee_write_asn (info, nindx, 3)
5997
              || ! ieee_write_atn65 (info, nindx, info->type_stack->type.name)
5998
              || ! ieee_write_atn65 (info, nindx, name))
5999
            return FALSE;
6000
        }
6001
    }
6002
 
6003
  /* If the bitsize doesn't match the expected size, we need to output
6004
     a bitfield type.  */
6005
  if (size == 0 || bitsize == 0 || bitsize == size * 8)
6006
    offset = bitpos / 8;
6007
  else
6008
    {
6009
      if (! ieee_define_type (info, 0, unsignedp,
6010
                              info->type_stack->type.localp)
6011
          || ! ieee_write_number (info, 'g')
6012
          || ! ieee_write_number (info, unsignedp ? 0 : 1)
6013
          || ! ieee_write_number (info, bitsize)
6014
          || ! ieee_write_number (info, indx))
6015
        return FALSE;
6016
      indx = ieee_pop_type (info);
6017
      offset = bitpos;
6018
    }
6019
 
6020
  /* Switch to the struct we are building in order to output this
6021
     field definition.  */
6022
  return (ieee_change_buffer (info, &info->type_stack->type.strdef)
6023
          && ieee_write_id (info, name)
6024
          && ieee_write_number (info, indx)
6025
          && ieee_write_number (info, offset));
6026
}
6027
 
6028
/* Finish up a struct type.  */
6029
 
6030
static bfd_boolean
6031
ieee_end_struct_type (void *p)
6032
{
6033
  struct ieee_handle *info = (struct ieee_handle *) p;
6034
  struct ieee_buflist *pb;
6035
 
6036
  assert (info->type_stack != NULL
6037
          && ! ieee_buffer_emptyp (&info->type_stack->type.strdef));
6038
 
6039
  /* If we were ignoring this struct definition because it was a
6040
     duplicate definition, just through away whatever bytes we have
6041
     accumulated.  Leave the type on the stack.  */
6042
  if (info->type_stack->type.ignorep)
6043
    return TRUE;
6044
 
6045
  /* If this is not a duplicate definition of this tag, then localp
6046
     will be FALSE, and we can put it in the global type block.
6047
     FIXME: We should avoid outputting duplicate definitions which are
6048
     the same.  */
6049
  if (! info->type_stack->type.localp)
6050
    {
6051
      /* Make sure we have started the global type block.  */
6052
      if (ieee_buffer_emptyp (&info->global_types))
6053
        {
6054
          if (! ieee_change_buffer (info, &info->global_types)
6055
              || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
6056
              || ! ieee_write_byte (info, 2)
6057
              || ! ieee_write_number (info, 0)
6058
              || ! ieee_write_id (info, ""))
6059
            return FALSE;
6060
        }
6061
      pb = &info->global_types;
6062
    }
6063
  else
6064
    {
6065
      /* Make sure we have started the types block.  */
6066
      if (ieee_buffer_emptyp (&info->types))
6067
        {
6068
          if (! ieee_change_buffer (info, &info->types)
6069
              || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
6070
              || ! ieee_write_byte (info, 1)
6071
              || ! ieee_write_number (info, 0)
6072
              || ! ieee_write_id (info, info->modname))
6073
            return FALSE;
6074
        }
6075
      pb = &info->types;
6076
    }
6077
 
6078
  /* Append the struct definition to the types.  */
6079
  if (! ieee_append_buffer (info, pb, &info->type_stack->type.strdef)
6080
      || ! ieee_init_buffer (info, &info->type_stack->type.strdef))
6081
    return FALSE;
6082
 
6083
  /* Leave the struct on the type stack.  */
6084
 
6085
  return TRUE;
6086
}
6087
 
6088
/* Start a class type.  */
6089
 
6090
static bfd_boolean
6091
ieee_start_class_type (void *p, const char *tag, unsigned int id,
6092
                       bfd_boolean structp, unsigned int size,
6093
                       bfd_boolean vptr, bfd_boolean ownvptr)
6094
{
6095
  struct ieee_handle *info = (struct ieee_handle *) p;
6096
  const char *vclass;
6097
  struct ieee_buflist pmiscbuf;
6098
  unsigned int indx;
6099
  struct ieee_type_class *classdef;
6100
 
6101
  /* A C++ class is output as a C++ struct along with a set of pmisc
6102
     records describing the class.  */
6103
 
6104
  /* We need to have a name so that we can associate the struct and
6105
     the class.  */
6106
  if (tag == NULL)
6107
    {
6108
      char *t;
6109
 
6110
      t = (char *) xmalloc (20);
6111
      sprintf (t, "__anon%u", id);
6112
      tag = t;
6113
    }
6114
 
6115
  /* We can't write out the virtual table information until we have
6116
     finished the class, because we don't know the virtual table size.
6117
     We get the size from the largest voffset we see.  */
6118
  vclass = NULL;
6119
  if (vptr && ! ownvptr)
6120
    {
6121
      vclass = info->type_stack->type.name;
6122
      assert (vclass != NULL);
6123
      /* We don't call ieee_pop_unused_type, since the class should
6124
         get defined.  */
6125
      (void) ieee_pop_type (info);
6126
    }
6127
 
6128
  if (! ieee_start_struct_type (p, tag, id, structp, size))
6129
    return FALSE;
6130
 
6131
  indx = info->name_indx;
6132
  ++info->name_indx;
6133
 
6134
  /* We write out pmisc records into the classdef field.  We will
6135
     write out the pmisc start after we know the number of records we
6136
     need.  */
6137
  if (! ieee_init_buffer (info, &pmiscbuf)
6138
      || ! ieee_change_buffer (info, &pmiscbuf)
6139
      || ! ieee_write_asn (info, indx, 'T')
6140
      || ! ieee_write_asn (info, indx, structp ? 'o' : 'u')
6141
      || ! ieee_write_atn65 (info, indx, tag))
6142
    return FALSE;
6143
 
6144
  classdef = (struct ieee_type_class *) xmalloc (sizeof *classdef);
6145
  memset (classdef, 0, sizeof *classdef);
6146
 
6147
  classdef->indx = indx;
6148
  classdef->pmiscbuf = pmiscbuf;
6149
  classdef->pmisccount = 3;
6150
  classdef->vclass = vclass;
6151
  classdef->ownvptr = ownvptr;
6152
 
6153
  info->type_stack->type.classdef = classdef;
6154
 
6155
  return TRUE;
6156
}
6157
 
6158
/* Add a static member to a class.  */
6159
 
6160
static bfd_boolean
6161
ieee_class_static_member (void *p, const char *name, const char *physname,
6162
                          enum debug_visibility visibility)
6163
{
6164
  struct ieee_handle *info = (struct ieee_handle *) p;
6165
  unsigned int flags;
6166
  unsigned int nindx;
6167
 
6168
  /* We don't care about the type.  Hopefully there will be a call to
6169
     ieee_variable declaring the physical name and the type, since
6170
     that is where an IEEE consumer must get the type.  */
6171
  ieee_pop_unused_type (info);
6172
 
6173
  assert (info->type_stack != NULL
6174
          && info->type_stack->type.classdef != NULL);
6175
 
6176
  flags = ieee_vis_to_flags (visibility);
6177
  flags |= CXXFLAGS_STATIC;
6178
 
6179
  nindx = info->type_stack->type.classdef->indx;
6180
 
6181
  if (! ieee_change_buffer (info, &info->type_stack->type.classdef->pmiscbuf)
6182
      || ! ieee_write_asn (info, nindx, 'd')
6183
      || ! ieee_write_asn (info, nindx, flags)
6184
      || ! ieee_write_atn65 (info, nindx, name)
6185
      || ! ieee_write_atn65 (info, nindx, physname))
6186
    return FALSE;
6187
  info->type_stack->type.classdef->pmisccount += 4;
6188
 
6189
  return TRUE;
6190
}
6191
 
6192
/* Add a base class to a class.  */
6193
 
6194
static bfd_boolean
6195
ieee_class_baseclass (void *p, bfd_vma bitpos, bfd_boolean virtual,
6196
                      enum debug_visibility visibility)
6197
{
6198
  struct ieee_handle *info = (struct ieee_handle *) p;
6199
  const char *bname;
6200
  bfd_boolean localp;
6201
  unsigned int bindx;
6202
  char *fname;
6203
  unsigned int flags;
6204
  unsigned int nindx;
6205
 
6206
  assert (info->type_stack != NULL
6207
          && info->type_stack->type.name != NULL
6208
          && info->type_stack->next != NULL
6209
          && info->type_stack->next->type.classdef != NULL
6210
          && ! ieee_buffer_emptyp (&info->type_stack->next->type.strdef));
6211
 
6212
  bname = info->type_stack->type.name;
6213
  localp = info->type_stack->type.localp;
6214
  bindx = ieee_pop_type (info);
6215
 
6216
  /* We are currently defining both a struct and a class.  We must
6217
     write out a field definition in the struct which holds the base
6218
     class.  The stabs debugging reader will create a field named
6219
     _vb$CLASS for a virtual base class, so we just use that.  FIXME:
6220
     we should not depend upon a detail of stabs debugging.  */
6221
  if (virtual)
6222
    {
6223
      fname = (char *) xmalloc (strlen (bname) + sizeof "_vb$");
6224
      sprintf (fname, "_vb$%s", bname);
6225
      flags = BASEFLAGS_VIRTUAL;
6226
    }
6227
  else
6228
    {
6229
      if (localp)
6230
        info->type_stack->type.localp = TRUE;
6231
 
6232
      fname = (char *) xmalloc (strlen (bname) + sizeof "_b$");
6233
      sprintf (fname, "_b$%s", bname);
6234
 
6235
      if (! ieee_change_buffer (info, &info->type_stack->type.strdef)
6236
          || ! ieee_write_id (info, fname)
6237
          || ! ieee_write_number (info, bindx)
6238
          || ! ieee_write_number (info, bitpos / 8))
6239
        return FALSE;
6240
      flags = 0;
6241
    }
6242
 
6243
  if (visibility == DEBUG_VISIBILITY_PRIVATE)
6244
    flags |= BASEFLAGS_PRIVATE;
6245
 
6246
  nindx = info->type_stack->type.classdef->indx;
6247
 
6248
  if (! ieee_change_buffer (info, &info->type_stack->type.classdef->pmiscbuf)
6249
      || ! ieee_write_asn (info, nindx, 'b')
6250
      || ! ieee_write_asn (info, nindx, flags)
6251
      || ! ieee_write_atn65 (info, nindx, bname)
6252
      || ! ieee_write_asn (info, nindx, 0)
6253
      || ! ieee_write_atn65 (info, nindx, fname))
6254
    return FALSE;
6255
  info->type_stack->type.classdef->pmisccount += 5;
6256
 
6257
  free (fname);
6258
 
6259
  return TRUE;
6260
}
6261
 
6262
/* Start building a method for a class.  */
6263
 
6264
static bfd_boolean
6265
ieee_class_start_method (void *p, const char *name)
6266
{
6267
  struct ieee_handle *info = (struct ieee_handle *) p;
6268
 
6269
  assert (info->type_stack != NULL
6270
          && info->type_stack->type.classdef != NULL
6271
          && info->type_stack->type.classdef->method == NULL);
6272
 
6273
  info->type_stack->type.classdef->method = name;
6274
 
6275
  return TRUE;
6276
}
6277
 
6278
/* Define a new method variant, either static or not.  */
6279
 
6280
static bfd_boolean
6281
ieee_class_method_var (struct ieee_handle *info, const char *physname,
6282
                       enum debug_visibility visibility,
6283
                       bfd_boolean staticp, bfd_boolean constp,
6284
                       bfd_boolean volatilep, bfd_vma voffset,
6285
                       bfd_boolean context)
6286
{
6287
  unsigned int flags;
6288
  unsigned int nindx;
6289
  bfd_boolean virtual;
6290
 
6291
  /* We don't need the type of the method.  An IEEE consumer which
6292
     wants the type must track down the function by the physical name
6293
     and get the type from that.  */
6294
  ieee_pop_unused_type (info);
6295
 
6296
  /* We don't use the context.  FIXME: We probably ought to use it to
6297
     adjust the voffset somehow, but I don't really know how.  */
6298
  if (context)
6299
    ieee_pop_unused_type (info);
6300
 
6301
  assert (info->type_stack != NULL
6302
          && info->type_stack->type.classdef != NULL
6303
          && info->type_stack->type.classdef->method != NULL);
6304
 
6305
  flags = ieee_vis_to_flags (visibility);
6306
 
6307
  /* FIXME: We never set CXXFLAGS_OVERRIDE, CXXFLAGS_OPERATOR,
6308
     CXXFLAGS_CTORDTOR, CXXFLAGS_CTOR, or CXXFLAGS_INLINE.  */
6309
 
6310
  if (staticp)
6311
    flags |= CXXFLAGS_STATIC;
6312
  if (constp)
6313
    flags |= CXXFLAGS_CONST;
6314
  if (volatilep)
6315
    flags |= CXXFLAGS_VOLATILE;
6316
 
6317
  nindx = info->type_stack->type.classdef->indx;
6318
 
6319
  virtual = context || voffset > 0;
6320
 
6321
  if (! ieee_change_buffer (info,
6322
                            &info->type_stack->type.classdef->pmiscbuf)
6323
      || ! ieee_write_asn (info, nindx, virtual ? 'v' : 'm')
6324
      || ! ieee_write_asn (info, nindx, flags)
6325
      || ! ieee_write_atn65 (info, nindx,
6326
                             info->type_stack->type.classdef->method)
6327
      || ! ieee_write_atn65 (info, nindx, physname))
6328
    return FALSE;
6329
 
6330
  if (virtual)
6331
    {
6332
      if (voffset > info->type_stack->type.classdef->voffset)
6333
        info->type_stack->type.classdef->voffset = voffset;
6334
      if (! ieee_write_asn (info, nindx, voffset))
6335
        return FALSE;
6336
      ++info->type_stack->type.classdef->pmisccount;
6337
    }
6338
 
6339
  if (! ieee_write_asn (info, nindx, 0))
6340
    return FALSE;
6341
 
6342
  info->type_stack->type.classdef->pmisccount += 5;
6343
 
6344
  return TRUE;
6345
}
6346
 
6347
/* Define a new method variant.  */
6348
 
6349
static bfd_boolean
6350
ieee_class_method_variant (void *p, const char *physname,
6351
                           enum debug_visibility visibility,
6352
                           bfd_boolean constp, bfd_boolean volatilep,
6353
                           bfd_vma voffset, bfd_boolean context)
6354
{
6355
  struct ieee_handle *info = (struct ieee_handle *) p;
6356
 
6357
  return ieee_class_method_var (info, physname, visibility, FALSE, constp,
6358
                                volatilep, voffset, context);
6359
}
6360
 
6361
/* Define a new static method variant.  */
6362
 
6363
static bfd_boolean
6364
ieee_class_static_method_variant (void *p, const char *physname,
6365
                                  enum debug_visibility visibility,
6366
                                  bfd_boolean constp, bfd_boolean volatilep)
6367
{
6368
  struct ieee_handle *info = (struct ieee_handle *) p;
6369
 
6370
  return ieee_class_method_var (info, physname, visibility, TRUE, constp,
6371
                                volatilep, 0, FALSE);
6372
}
6373
 
6374
/* Finish up a method.  */
6375
 
6376
static bfd_boolean
6377
ieee_class_end_method (void *p)
6378
{
6379
  struct ieee_handle *info = (struct ieee_handle *) p;
6380
 
6381
  assert (info->type_stack != NULL
6382
          && info->type_stack->type.classdef != NULL
6383
          && info->type_stack->type.classdef->method != NULL);
6384
 
6385
  info->type_stack->type.classdef->method = NULL;
6386
 
6387
  return TRUE;
6388
}
6389
 
6390
/* Finish up a class.  */
6391
 
6392
static bfd_boolean
6393
ieee_end_class_type (void *p)
6394
{
6395
  struct ieee_handle *info = (struct ieee_handle *) p;
6396
  unsigned int nindx;
6397
 
6398
  assert (info->type_stack != NULL
6399
          && info->type_stack->type.classdef != NULL);
6400
 
6401
  /* If we were ignoring this class definition because it was a
6402
     duplicate definition, just through away whatever bytes we have
6403
     accumulated.  Leave the type on the stack.  */
6404
  if (info->type_stack->type.ignorep)
6405
    return TRUE;
6406
 
6407
  nindx = info->type_stack->type.classdef->indx;
6408
 
6409
  /* If we have a virtual table, we can write out the information now.  */
6410
  if (info->type_stack->type.classdef->vclass != NULL
6411
      || info->type_stack->type.classdef->ownvptr)
6412
    {
6413
      if (! ieee_change_buffer (info,
6414
                                &info->type_stack->type.classdef->pmiscbuf)
6415
          || ! ieee_write_asn (info, nindx, 'z')
6416
          || ! ieee_write_atn65 (info, nindx, "")
6417
          || ! ieee_write_asn (info, nindx,
6418
                               info->type_stack->type.classdef->voffset))
6419
        return FALSE;
6420
      if (info->type_stack->type.classdef->ownvptr)
6421
        {
6422
          if (! ieee_write_atn65 (info, nindx, ""))
6423
            return FALSE;
6424
        }
6425
      else
6426
        {
6427
          if (! ieee_write_atn65 (info, nindx,
6428
                                  info->type_stack->type.classdef->vclass))
6429
            return FALSE;
6430
        }
6431
      if (! ieee_write_asn (info, nindx, 0))
6432
        return FALSE;
6433
      info->type_stack->type.classdef->pmisccount += 5;
6434
    }
6435
 
6436
  /* Now that we know the number of pmisc records, we can write out
6437
     the atn62 which starts the pmisc records, and append them to the
6438
     C++ buffers.  */
6439
 
6440
  if (! ieee_change_buffer (info, &info->cxx)
6441
      || ! ieee_write_byte (info, (int) ieee_nn_record)
6442
      || ! ieee_write_number (info, nindx)
6443
      || ! ieee_write_id (info, "")
6444
      || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
6445
      || ! ieee_write_number (info, nindx)
6446
      || ! ieee_write_number (info, 0)
6447
      || ! ieee_write_number (info, 62)
6448
      || ! ieee_write_number (info, 80)
6449
      || ! ieee_write_number (info,
6450
                              info->type_stack->type.classdef->pmisccount))
6451
    return FALSE;
6452
 
6453
  if (! ieee_append_buffer (info, &info->cxx,
6454
                            &info->type_stack->type.classdef->pmiscbuf))
6455
    return FALSE;
6456
  if (! ieee_buffer_emptyp (&info->type_stack->type.classdef->refs))
6457
    {
6458
      if (! ieee_append_buffer (info, &info->cxx,
6459
                                &info->type_stack->type.classdef->refs))
6460
        return FALSE;
6461
    }
6462
 
6463
  return ieee_end_struct_type (p);
6464
}
6465
 
6466
/* Push a previously seen typedef onto the type stack.  */
6467
 
6468
static bfd_boolean
6469
ieee_typedef_type (void *p, const char *name)
6470
{
6471
  struct ieee_handle *info = (struct ieee_handle *) p;
6472
  struct ieee_name_type_hash_entry *h;
6473
  struct ieee_name_type *nt;
6474
 
6475
  h = ieee_name_type_hash_lookup (&info->typedefs, name, FALSE, FALSE);
6476
 
6477
  /* h should never be NULL, since that would imply that the generic
6478
     debugging code has asked for a typedef which it has not yet
6479
     defined.  */
6480
  assert (h != NULL);
6481
 
6482
  /* We always use the most recently defined type for this name, which
6483
     will be the first one on the list.  */
6484
 
6485
  nt = h->types;
6486
  if (! ieee_push_type (info, nt->type.indx, nt->type.size,
6487
                        nt->type.unsignedp, nt->type.localp))
6488
    return FALSE;
6489
 
6490
  /* Copy over any other type information we may have.  */
6491
  info->type_stack->type = nt->type;
6492
 
6493
  return TRUE;
6494
}
6495
 
6496
/* Push a tagged type onto the type stack.  */
6497
 
6498
static bfd_boolean
6499
ieee_tag_type (void *p, const char *name, unsigned int id,
6500
               enum debug_type_kind kind)
6501
{
6502
  struct ieee_handle *info = (struct ieee_handle *) p;
6503
  bfd_boolean localp;
6504
  bfd_boolean copy;
6505
  char ab[20];
6506
  struct ieee_name_type_hash_entry *h;
6507
  struct ieee_name_type *nt;
6508
 
6509
  if (kind == DEBUG_KIND_ENUM)
6510
    {
6511
      struct ieee_defined_enum *e;
6512
 
6513
      if (name == NULL)
6514
        abort ();
6515
      for (e = info->enums; e != NULL; e = e->next)
6516
        if (e->tag != NULL && strcmp (e->tag, name) == 0)
6517
          return ieee_push_type (info, e->indx, 0, TRUE, FALSE);
6518
 
6519
      e = (struct ieee_defined_enum *) xmalloc (sizeof *e);
6520
      memset (e, 0, sizeof *e);
6521
 
6522
      e->indx = info->type_indx;
6523
      ++info->type_indx;
6524
      e->tag = name;
6525
      e->defined = FALSE;
6526
 
6527
      e->next = info->enums;
6528
      info->enums = e;
6529
 
6530
      return ieee_push_type (info, e->indx, 0, TRUE, FALSE);
6531
    }
6532
 
6533
  localp = FALSE;
6534
 
6535
  copy = FALSE;
6536
  if (name == NULL)
6537
    {
6538
      sprintf (ab, "__anon%u", id);
6539
      name = ab;
6540
      copy = TRUE;
6541
    }
6542
 
6543
  h = ieee_name_type_hash_lookup (&info->tags, name, TRUE, copy);
6544
  if (h == NULL)
6545
    return FALSE;
6546
 
6547
  for (nt = h->types; nt != NULL; nt = nt->next)
6548
    {
6549
      if (nt->id == id)
6550
        {
6551
          if (! ieee_push_type (info, nt->type.indx, nt->type.size,
6552
                                nt->type.unsignedp, nt->type.localp))
6553
            return FALSE;
6554
          /* Copy over any other type information we may have.  */
6555
          info->type_stack->type = nt->type;
6556
          return TRUE;
6557
        }
6558
 
6559
      if (! nt->type.localp)
6560
        {
6561
          /* This is a duplicate of a global type, so it must be
6562
             local.  */
6563
          localp = TRUE;
6564
        }
6565
    }
6566
 
6567
  nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
6568
  memset (nt, 0, sizeof *nt);
6569
 
6570
  nt->id = id;
6571
  nt->type.name = h->root.string;
6572
  nt->type.indx = info->type_indx;
6573
  nt->type.localp = localp;
6574
  ++info->type_indx;
6575
  nt->kind = kind;
6576
 
6577
  nt->next = h->types;
6578
  h->types = nt;
6579
 
6580
  if (! ieee_push_type (info, nt->type.indx, 0, FALSE, localp))
6581
    return FALSE;
6582
 
6583
  info->type_stack->type.name = h->root.string;
6584
 
6585
  return TRUE;
6586
}
6587
 
6588
/* Output a typedef.  */
6589
 
6590
static bfd_boolean
6591
ieee_typdef (void *p, const char *name)
6592
{
6593
  struct ieee_handle *info = (struct ieee_handle *) p;
6594
  struct ieee_write_type type;
6595
  unsigned int indx;
6596
  bfd_boolean found;
6597
  bfd_boolean localp;
6598
  struct ieee_name_type_hash_entry *h;
6599
  struct ieee_name_type *nt;
6600
 
6601
  type = info->type_stack->type;
6602
  indx = type.indx;
6603
 
6604
  /* If this is a simple builtin type using a builtin name, we don't
6605
     want to output the typedef itself.  We also want to change the
6606
     type index to correspond to the name being used.  We recognize
6607
     names used in stabs debugging output even if they don't exactly
6608
     correspond to the names used for the IEEE builtin types.  */
6609
  found = FALSE;
6610
  if (indx <= (unsigned int) builtin_bcd_float)
6611
    {
6612
      switch ((enum builtin_types) indx)
6613
        {
6614
        default:
6615
          break;
6616
 
6617
        case builtin_void:
6618
          if (strcmp (name, "void") == 0)
6619
            found = TRUE;
6620
          break;
6621
 
6622
        case builtin_signed_char:
6623
        case builtin_char:
6624
          if (strcmp (name, "signed char") == 0)
6625
            {
6626
              indx = (unsigned int) builtin_signed_char;
6627
              found = TRUE;
6628
            }
6629
          else if (strcmp (name, "char") == 0)
6630
            {
6631
              indx = (unsigned int) builtin_char;
6632
              found = TRUE;
6633
            }
6634
          break;
6635
 
6636
        case builtin_unsigned_char:
6637
          if (strcmp (name, "unsigned char") == 0)
6638
            found = TRUE;
6639
          break;
6640
 
6641
        case builtin_signed_short_int:
6642
        case builtin_short:
6643
        case builtin_short_int:
6644
        case builtin_signed_short:
6645
          if (strcmp (name, "signed short int") == 0)
6646
            {
6647
              indx = (unsigned int) builtin_signed_short_int;
6648
              found = TRUE;
6649
            }
6650
          else if (strcmp (name, "short") == 0)
6651
            {
6652
              indx = (unsigned int) builtin_short;
6653
              found = TRUE;
6654
            }
6655
          else if (strcmp (name, "short int") == 0)
6656
            {
6657
              indx = (unsigned int) builtin_short_int;
6658
              found = TRUE;
6659
            }
6660
          else if (strcmp (name, "signed short") == 0)
6661
            {
6662
              indx = (unsigned int) builtin_signed_short;
6663
              found = TRUE;
6664
            }
6665
          break;
6666
 
6667
        case builtin_unsigned_short_int:
6668
        case builtin_unsigned_short:
6669
          if (strcmp (name, "unsigned short int") == 0
6670
              || strcmp (name, "short unsigned int") == 0)
6671
            {
6672
              indx = builtin_unsigned_short_int;
6673
              found = TRUE;
6674
            }
6675
          else if (strcmp (name, "unsigned short") == 0)
6676
            {
6677
              indx = builtin_unsigned_short;
6678
              found = TRUE;
6679
            }
6680
          break;
6681
 
6682
        case builtin_signed_long:
6683
        case builtin_int: /* FIXME: Size depends upon architecture.  */
6684
        case builtin_long:
6685
          if (strcmp (name, "signed long") == 0)
6686
            {
6687
              indx = builtin_signed_long;
6688
              found = TRUE;
6689
            }
6690
          else if (strcmp (name, "int") == 0)
6691
            {
6692
              indx = builtin_int;
6693
              found = TRUE;
6694
            }
6695
          else if (strcmp (name, "long") == 0
6696
                   || strcmp (name, "long int") == 0)
6697
            {
6698
              indx = builtin_long;
6699
              found = TRUE;
6700
            }
6701
          break;
6702
 
6703
        case builtin_unsigned_long:
6704
        case builtin_unsigned: /* FIXME: Size depends upon architecture.  */
6705
        case builtin_unsigned_int: /* FIXME: Like builtin_unsigned.  */
6706
          if (strcmp (name, "unsigned long") == 0
6707
              || strcmp (name, "long unsigned int") == 0)
6708
            {
6709
              indx = builtin_unsigned_long;
6710
              found = TRUE;
6711
            }
6712
          else if (strcmp (name, "unsigned") == 0)
6713
            {
6714
              indx = builtin_unsigned;
6715
              found = TRUE;
6716
            }
6717
          else if (strcmp (name, "unsigned int") == 0)
6718
            {
6719
              indx = builtin_unsigned_int;
6720
              found = TRUE;
6721
            }
6722
          break;
6723
 
6724
        case builtin_signed_long_long:
6725
          if (strcmp (name, "signed long long") == 0
6726
              || strcmp (name, "long long int") == 0)
6727
            found = TRUE;
6728
          break;
6729
 
6730
        case builtin_unsigned_long_long:
6731
          if (strcmp (name, "unsigned long long") == 0
6732
              || strcmp (name, "long long unsigned int") == 0)
6733
            found = TRUE;
6734
          break;
6735
 
6736
        case builtin_float:
6737
          if (strcmp (name, "float") == 0)
6738
            found = TRUE;
6739
          break;
6740
 
6741
        case builtin_double:
6742
          if (strcmp (name, "double") == 0)
6743
            found = TRUE;
6744
          break;
6745
 
6746
        case builtin_long_double:
6747
          if (strcmp (name, "long double") == 0)
6748
            found = TRUE;
6749
          break;
6750
 
6751
        case builtin_long_long_double:
6752
          if (strcmp (name, "long long double") == 0)
6753
            found = TRUE;
6754
          break;
6755
        }
6756
 
6757
      if (found)
6758
        type.indx = indx;
6759
    }
6760
 
6761
  h = ieee_name_type_hash_lookup (&info->typedefs, name, TRUE, FALSE);
6762
  if (h == NULL)
6763
    return FALSE;
6764
 
6765
  /* See if we have already defined this type with this name.  */
6766
  localp = type.localp;
6767
  for (nt = h->types; nt != NULL; nt = nt->next)
6768
    {
6769
      if (nt->id == indx)
6770
        {
6771
          /* If this is a global definition, then we don't need to
6772
             do anything here.  */
6773
          if (! nt->type.localp)
6774
            {
6775
              ieee_pop_unused_type (info);
6776
              return TRUE;
6777
            }
6778
        }
6779
      else
6780
        {
6781
          /* This is a duplicate definition, so make this one local.  */
6782
          localp = TRUE;
6783
        }
6784
    }
6785
 
6786
  /* We need to add a new typedef for this type.  */
6787
 
6788
  nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
6789
  memset (nt, 0, sizeof *nt);
6790
  nt->id = indx;
6791
  nt->type = type;
6792
  nt->type.name = name;
6793
  nt->type.localp = localp;
6794
  nt->kind = DEBUG_KIND_ILLEGAL;
6795
 
6796
  nt->next = h->types;
6797
  h->types = nt;
6798
 
6799
  if (found)
6800
    {
6801
      /* This is one of the builtin typedefs, so we don't need to
6802
         actually define it.  */
6803
      ieee_pop_unused_type (info);
6804
      return TRUE;
6805
    }
6806
 
6807
  indx = ieee_pop_type (info);
6808
 
6809
  if (! ieee_define_named_type (info, name, (unsigned int) -1, type.size,
6810
                                type.unsignedp, localp,
6811
                                (struct ieee_buflist *) NULL)
6812
      || ! ieee_write_number (info, 'T')
6813
      || ! ieee_write_number (info, indx))
6814
    return FALSE;
6815
 
6816
  /* Remove the type we just added to the type stack.  This should not
6817
     be ieee_pop_unused_type, since the type is used, we just don't
6818
     need it now.  */
6819
  (void) ieee_pop_type (info);
6820
 
6821
  return TRUE;
6822
}
6823
 
6824
/* Output a tag for a type.  We don't have to do anything here.  */
6825
 
6826
static bfd_boolean
6827
ieee_tag (void *p, const char *name ATTRIBUTE_UNUSED)
6828
{
6829
  struct ieee_handle *info = (struct ieee_handle *) p;
6830
 
6831
  /* This should not be ieee_pop_unused_type, since we want the type
6832
     to be defined.  */
6833
  (void) ieee_pop_type (info);
6834
  return TRUE;
6835
}
6836
 
6837
/* Output an integer constant.  */
6838
 
6839
static bfd_boolean
6840
ieee_int_constant (void *p ATTRIBUTE_UNUSED, const char *name ATTRIBUTE_UNUSED,
6841
                   bfd_vma val ATTRIBUTE_UNUSED)
6842
{
6843
  /* FIXME.  */
6844
  return TRUE;
6845
}
6846
 
6847
/* Output a floating point constant.  */
6848
 
6849
static bfd_boolean
6850
ieee_float_constant (void *p ATTRIBUTE_UNUSED,
6851
                     const char *name ATTRIBUTE_UNUSED,
6852
                     double val ATTRIBUTE_UNUSED)
6853
{
6854
  /* FIXME.  */
6855
  return TRUE;
6856
}
6857
 
6858
/* Output a typed constant.  */
6859
 
6860
static bfd_boolean
6861
ieee_typed_constant (void *p, const char *name ATTRIBUTE_UNUSED,
6862
                     bfd_vma val ATTRIBUTE_UNUSED)
6863
{
6864
  struct ieee_handle *info = (struct ieee_handle *) p;
6865
 
6866
  /* FIXME.  */
6867
  ieee_pop_unused_type (info);
6868
  return TRUE;
6869
}
6870
 
6871
/* Output a variable.  */
6872
 
6873
static bfd_boolean
6874
ieee_variable (void *p, const char *name, enum debug_var_kind kind,
6875
               bfd_vma val)
6876
{
6877
  struct ieee_handle *info = (struct ieee_handle *) p;
6878
  unsigned int name_indx;
6879
  unsigned int size;
6880
  bfd_boolean referencep;
6881
  unsigned int type_indx;
6882
  bfd_boolean asn;
6883
  int refflag;
6884
 
6885
  size = info->type_stack->type.size;
6886
  referencep = info->type_stack->type.referencep;
6887
  type_indx = ieee_pop_type (info);
6888
 
6889
  assert (! ieee_buffer_emptyp (&info->vars));
6890
  if (! ieee_change_buffer (info, &info->vars))
6891
    return FALSE;
6892
 
6893
  name_indx = info->name_indx;
6894
  ++info->name_indx;
6895
 
6896
  /* Write out an NN and an ATN record for this variable.  */
6897
  if (! ieee_write_byte (info, (int) ieee_nn_record)
6898
      || ! ieee_write_number (info, name_indx)
6899
      || ! ieee_write_id (info, name)
6900
      || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
6901
      || ! ieee_write_number (info, name_indx)
6902
      || ! ieee_write_number (info, type_indx))
6903
    return FALSE;
6904
  switch (kind)
6905
    {
6906
    default:
6907
      abort ();
6908
      return FALSE;
6909
    case DEBUG_GLOBAL:
6910
      if (! ieee_write_number (info, 8)
6911
          || ! ieee_add_range (info, FALSE, val, val + size))
6912
        return FALSE;
6913
      refflag = 0;
6914
      asn = TRUE;
6915
      break;
6916
    case DEBUG_STATIC:
6917
      if (! ieee_write_number (info, 3)
6918
          || ! ieee_add_range (info, FALSE, val, val + size))
6919
        return FALSE;
6920
      refflag = 1;
6921
      asn = TRUE;
6922
      break;
6923
    case DEBUG_LOCAL_STATIC:
6924
      if (! ieee_write_number (info, 3)
6925
          || ! ieee_add_range (info, FALSE, val, val + size))
6926
        return FALSE;
6927
      refflag = 2;
6928
      asn = TRUE;
6929
      break;
6930
    case DEBUG_LOCAL:
6931
      if (! ieee_write_number (info, 1)
6932
          || ! ieee_write_number (info, val))
6933
        return FALSE;
6934
      refflag = 2;
6935
      asn = FALSE;
6936
      break;
6937
    case DEBUG_REGISTER:
6938
      if (! ieee_write_number (info, 2)
6939
          || ! ieee_write_number (info,
6940
                                  ieee_genreg_to_regno (info->abfd, val)))
6941
        return FALSE;
6942
      refflag = 2;
6943
      asn = FALSE;
6944
      break;
6945
    }
6946
 
6947
  if (asn)
6948
    {
6949
      if (! ieee_write_asn (info, name_indx, val))
6950
        return FALSE;
6951
    }
6952
 
6953
  /* If this is really a reference type, then we just output it with
6954
     pointer type, and must now output a C++ record indicating that it
6955
     is really reference type.  */
6956
  if (referencep)
6957
    {
6958
      unsigned int nindx;
6959
 
6960
      nindx = info->name_indx;
6961
      ++info->name_indx;
6962
 
6963
      /* If this is a global variable, we want to output the misc
6964
         record in the C++ misc record block.  Otherwise, we want to
6965
         output it just after the variable definition, which is where
6966
         the current buffer is.  */
6967
      if (refflag != 2)
6968
        {
6969
          if (! ieee_change_buffer (info, &info->cxx))
6970
            return FALSE;
6971
        }
6972
 
6973
      if (! ieee_write_byte (info, (int) ieee_nn_record)
6974
          || ! ieee_write_number (info, nindx)
6975
          || ! ieee_write_id (info, "")
6976
          || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
6977
          || ! ieee_write_number (info, nindx)
6978
          || ! ieee_write_number (info, 0)
6979
          || ! ieee_write_number (info, 62)
6980
          || ! ieee_write_number (info, 80)
6981
          || ! ieee_write_number (info, 3)
6982
          || ! ieee_write_asn (info, nindx, 'R')
6983
          || ! ieee_write_asn (info, nindx, refflag)
6984
          || ! ieee_write_atn65 (info, nindx, name))
6985
        return FALSE;
6986
    }
6987
 
6988
  return TRUE;
6989
}
6990
 
6991
/* Start outputting information for a function.  */
6992
 
6993
static bfd_boolean
6994
ieee_start_function (void *p, const char *name, bfd_boolean global)
6995
{
6996
  struct ieee_handle *info = (struct ieee_handle *) p;
6997
  bfd_boolean referencep;
6998
  unsigned int retindx, typeindx;
6999
 
7000
  referencep = info->type_stack->type.referencep;
7001
  retindx = ieee_pop_type (info);
7002
 
7003
  /* Besides recording a BB4 or BB6 block, we record the type of the
7004
     function in the BB1 typedef block.  We can't write out the full
7005
     type until we have seen all the parameters, so we accumulate it
7006
     in info->fntype and info->fnargs.  */
7007
  if (! ieee_buffer_emptyp (&info->fntype))
7008
    {
7009
      /* FIXME: This might happen someday if we support nested
7010
         functions.  */
7011
      abort ();
7012
    }
7013
 
7014
  info->fnname = name;
7015
 
7016
  /* An attribute of 0x40 means that the push mask is unknown.  */
7017
  if (! ieee_define_named_type (info, name, (unsigned int) -1, 0, FALSE, TRUE,
7018
                                &info->fntype)
7019
      || ! ieee_write_number (info, 'x')
7020
      || ! ieee_write_number (info, 0x40)
7021
      || ! ieee_write_number (info, 0)
7022
      || ! ieee_write_number (info, 0)
7023
      || ! ieee_write_number (info, retindx))
7024
    return FALSE;
7025
 
7026
  typeindx = ieee_pop_type (info);
7027
 
7028
  if (! ieee_init_buffer (info, &info->fnargs))
7029
    return FALSE;
7030
  info->fnargcount = 0;
7031
 
7032
  /* If the function return value is actually a reference type, we
7033
     must add a record indicating that.  */
7034
  if (referencep)
7035
    {
7036
      unsigned int nindx;
7037
 
7038
      nindx = info->name_indx;
7039
      ++info->name_indx;
7040
      if (! ieee_change_buffer (info, &info->cxx)
7041
          || ! ieee_write_byte (info, (int) ieee_nn_record)
7042
          || ! ieee_write_number (info, nindx)
7043
          || ! ieee_write_id (info, "")
7044
          || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7045
          || ! ieee_write_number (info, nindx)
7046
          || ! ieee_write_number (info, 0)
7047
          || ! ieee_write_number (info, 62)
7048
          || ! ieee_write_number (info, 80)
7049
          || ! ieee_write_number (info, 3)
7050
          || ! ieee_write_asn (info, nindx, 'R')
7051
          || ! ieee_write_asn (info, nindx, global ? 0 : 1)
7052
          || ! ieee_write_atn65 (info, nindx, name))
7053
        return FALSE;
7054
    }
7055
 
7056
  assert (! ieee_buffer_emptyp (&info->vars));
7057
  if (! ieee_change_buffer (info, &info->vars))
7058
    return FALSE;
7059
 
7060
  /* The address is written out as the first block.  */
7061
 
7062
  ++info->block_depth;
7063
 
7064
  return (ieee_write_byte (info, (int) ieee_bb_record_enum)
7065
          && ieee_write_byte (info, global ? 4 : 6)
7066
          && ieee_write_number (info, 0)
7067
          && ieee_write_id (info, name)
7068
          && ieee_write_number (info, 0)
7069
          && ieee_write_number (info, typeindx));
7070
}
7071
 
7072
/* Add a function parameter.  This will normally be called before the
7073
   first block, so we postpone them until we see the block.  */
7074
 
7075
static bfd_boolean
7076
ieee_function_parameter (void *p, const char *name, enum debug_parm_kind kind,
7077
                         bfd_vma val)
7078
{
7079
  struct ieee_handle *info = (struct ieee_handle *) p;
7080
  struct ieee_pending_parm *m, **pm;
7081
 
7082
  assert (info->block_depth == 1);
7083
 
7084
  m = (struct ieee_pending_parm *) xmalloc (sizeof *m);
7085
  memset (m, 0, sizeof *m);
7086
 
7087
  m->next = NULL;
7088
  m->name = name;
7089
  m->referencep = info->type_stack->type.referencep;
7090
  m->type = ieee_pop_type (info);
7091
  m->kind = kind;
7092
  m->val = val;
7093
 
7094
  for (pm = &info->pending_parms; *pm != NULL; pm = &(*pm)->next)
7095
    ;
7096
  *pm = m;
7097
 
7098
  /* Add the type to the fnargs list.  */
7099
  if (! ieee_change_buffer (info, &info->fnargs)
7100
      || ! ieee_write_number (info, m->type))
7101
    return FALSE;
7102
  ++info->fnargcount;
7103
 
7104
  return TRUE;
7105
}
7106
 
7107
/* Output pending function parameters.  */
7108
 
7109
static bfd_boolean
7110
ieee_output_pending_parms (struct ieee_handle *info)
7111
{
7112
  struct ieee_pending_parm *m;
7113
  unsigned int refcount;
7114
 
7115
  refcount = 0;
7116
  for (m = info->pending_parms; m != NULL; m = m->next)
7117
    {
7118
      enum debug_var_kind vkind;
7119
 
7120
      switch (m->kind)
7121
        {
7122
        default:
7123
          abort ();
7124
          return FALSE;
7125
        case DEBUG_PARM_STACK:
7126
        case DEBUG_PARM_REFERENCE:
7127
          vkind = DEBUG_LOCAL;
7128
          break;
7129
        case DEBUG_PARM_REG:
7130
        case DEBUG_PARM_REF_REG:
7131
          vkind = DEBUG_REGISTER;
7132
          break;
7133
        }
7134
 
7135
      if (! ieee_push_type (info, m->type, 0, FALSE, FALSE))
7136
        return FALSE;
7137
      info->type_stack->type.referencep = m->referencep;
7138
      if (m->referencep)
7139
        ++refcount;
7140
      if (! ieee_variable ((void *) info, m->name, vkind, m->val))
7141
        return FALSE;
7142
    }
7143
 
7144
  /* If there are any reference parameters, we need to output a
7145
     miscellaneous record indicating them.  */
7146
  if (refcount > 0)
7147
    {
7148
      unsigned int nindx, varindx;
7149
 
7150
      /* FIXME: The MRI compiler outputs the demangled function name
7151
         here, but we are outputting the mangled name.  */
7152
      nindx = info->name_indx;
7153
      ++info->name_indx;
7154
      if (! ieee_change_buffer (info, &info->vars)
7155
          || ! ieee_write_byte (info, (int) ieee_nn_record)
7156
          || ! ieee_write_number (info, nindx)
7157
          || ! ieee_write_id (info, "")
7158
          || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7159
          || ! ieee_write_number (info, nindx)
7160
          || ! ieee_write_number (info, 0)
7161
          || ! ieee_write_number (info, 62)
7162
          || ! ieee_write_number (info, 80)
7163
          || ! ieee_write_number (info, refcount + 3)
7164
          || ! ieee_write_asn (info, nindx, 'B')
7165
          || ! ieee_write_atn65 (info, nindx, info->fnname)
7166
          || ! ieee_write_asn (info, nindx, 0))
7167
        return FALSE;
7168
      for (m = info->pending_parms, varindx = 1;
7169
           m != NULL;
7170
           m = m->next, varindx++)
7171
        {
7172
          if (m->referencep)
7173
            {
7174
              if (! ieee_write_asn (info, nindx, varindx))
7175
                return FALSE;
7176
            }
7177
        }
7178
    }
7179
 
7180
  m = info->pending_parms;
7181
  while (m != NULL)
7182
    {
7183
      struct ieee_pending_parm *next;
7184
 
7185
      next = m->next;
7186
      free (m);
7187
      m = next;
7188
    }
7189
 
7190
  info->pending_parms = NULL;
7191
 
7192
  return TRUE;
7193
}
7194
 
7195
/* Start a block.  If this is the first block, we output the address
7196
   to finish the BB4 or BB6, and then output the function parameters.  */
7197
 
7198
static bfd_boolean
7199
ieee_start_block (void *p, bfd_vma addr)
7200
{
7201
  struct ieee_handle *info = (struct ieee_handle *) p;
7202
 
7203
  if (! ieee_change_buffer (info, &info->vars))
7204
    return FALSE;
7205
 
7206
  if (info->block_depth == 1)
7207
    {
7208
      if (! ieee_write_number (info, addr)
7209
          || ! ieee_output_pending_parms (info))
7210
        return FALSE;
7211
    }
7212
  else
7213
    {
7214
      if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
7215
          || ! ieee_write_byte (info, 6)
7216
          || ! ieee_write_number (info, 0)
7217
          || ! ieee_write_id (info, "")
7218
          || ! ieee_write_number (info, 0)
7219
          || ! ieee_write_number (info, 0)
7220
          || ! ieee_write_number (info, addr))
7221
        return FALSE;
7222
    }
7223
 
7224
  if (! ieee_start_range (info, addr))
7225
    return FALSE;
7226
 
7227
  ++info->block_depth;
7228
 
7229
  return TRUE;
7230
}
7231
 
7232
/* End a block.  */
7233
 
7234
static bfd_boolean
7235
ieee_end_block (void *p, bfd_vma addr)
7236
{
7237
  struct ieee_handle *info = (struct ieee_handle *) p;
7238
 
7239
  /* The address we are given is the end of the block, but IEEE seems
7240
     to want to the address of the last byte in the block, so we
7241
     subtract one.  */
7242
  if (! ieee_change_buffer (info, &info->vars)
7243
      || ! ieee_write_byte (info, (int) ieee_be_record_enum)
7244
      || ! ieee_write_number (info, addr - 1))
7245
    return FALSE;
7246
 
7247
  if (! ieee_end_range (info, addr))
7248
    return FALSE;
7249
 
7250
  --info->block_depth;
7251
 
7252
  if (addr > info->highaddr)
7253
    info->highaddr = addr;
7254
 
7255
  return TRUE;
7256
}
7257
 
7258
/* End a function.  */
7259
 
7260
static bfd_boolean
7261
ieee_end_function (void *p)
7262
{
7263
  struct ieee_handle *info = (struct ieee_handle *) p;
7264
 
7265
  assert (info->block_depth == 1);
7266
 
7267
  --info->block_depth;
7268
 
7269
  /* Now we can finish up fntype, and add it to the typdef section.
7270
     At this point, fntype is the 'x' type up to the argument count,
7271
     and fnargs is the argument types.  We must add the argument
7272
     count, and we must add the level.  FIXME: We don't record varargs
7273
     functions correctly.  In fact, stabs debugging does not give us
7274
     enough information to do so.  */
7275
  if (! ieee_change_buffer (info, &info->fntype)
7276
      || ! ieee_write_number (info, info->fnargcount)
7277
      || ! ieee_change_buffer (info, &info->fnargs)
7278
      || ! ieee_write_number (info, 0))
7279
    return FALSE;
7280
 
7281
  /* Make sure the typdef block has been started.  */
7282
  if (ieee_buffer_emptyp (&info->types))
7283
    {
7284
      if (! ieee_change_buffer (info, &info->types)
7285
          || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
7286
          || ! ieee_write_byte (info, 1)
7287
          || ! ieee_write_number (info, 0)
7288
          || ! ieee_write_id (info, info->modname))
7289
        return FALSE;
7290
    }
7291
 
7292
  if (! ieee_append_buffer (info, &info->types, &info->fntype)
7293
      || ! ieee_append_buffer (info, &info->types, &info->fnargs))
7294
    return FALSE;
7295
 
7296
  info->fnname = NULL;
7297
  if (! ieee_init_buffer (info, &info->fntype)
7298
      || ! ieee_init_buffer (info, &info->fnargs))
7299
    return FALSE;
7300
  info->fnargcount = 0;
7301
 
7302
  return TRUE;
7303
}
7304
 
7305
/* Record line number information.  */
7306
 
7307
static bfd_boolean
7308
ieee_lineno (void *p, const char *filename, unsigned long lineno, bfd_vma addr)
7309
{
7310
  struct ieee_handle *info = (struct ieee_handle *) p;
7311
 
7312
  assert (info->filename != NULL);
7313
 
7314
  /* The HP simulator seems to get confused when more than one line is
7315
     listed for the same address, at least if they are in different
7316
     files.  We handle this by always listing the last line for a
7317
     given address, since that seems to be the one that gdb uses.  */
7318
  if (info->pending_lineno_filename != NULL
7319
      && addr != info->pending_lineno_addr)
7320
    {
7321
      /* Make sure we have a line number block.  */
7322
      if (! ieee_buffer_emptyp (&info->linenos))
7323
        {
7324
          if (! ieee_change_buffer (info, &info->linenos))
7325
            return FALSE;
7326
        }
7327
      else
7328
        {
7329
          info->lineno_name_indx = info->name_indx;
7330
          ++info->name_indx;
7331
          if (! ieee_change_buffer (info, &info->linenos)
7332
              || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
7333
              || ! ieee_write_byte (info, 5)
7334
              || ! ieee_write_number (info, 0)
7335
              || ! ieee_write_id (info, info->filename)
7336
              || ! ieee_write_byte (info, (int) ieee_nn_record)
7337
              || ! ieee_write_number (info, info->lineno_name_indx)
7338
              || ! ieee_write_id (info, ""))
7339
            return FALSE;
7340
          info->lineno_filename = info->filename;
7341
        }
7342
 
7343
      if (strcmp (info->pending_lineno_filename, info->lineno_filename) != 0)
7344
        {
7345
          if (strcmp (info->filename, info->lineno_filename) != 0)
7346
            {
7347
              /* We were not in the main file.  Close the block for the
7348
                 included file.  */
7349
              if (! ieee_write_byte (info, (int) ieee_be_record_enum))
7350
                return FALSE;
7351
              if (strcmp (info->filename, info->pending_lineno_filename) == 0)
7352
                {
7353
                  /* We need a new NN record, and we aren't about to
7354
                     output one.  */
7355
                  info->lineno_name_indx = info->name_indx;
7356
                  ++info->name_indx;
7357
                  if (! ieee_write_byte (info, (int) ieee_nn_record)
7358
                      || ! ieee_write_number (info, info->lineno_name_indx)
7359
                      || ! ieee_write_id (info, ""))
7360
                    return FALSE;
7361
                }
7362
            }
7363
          if (strcmp (info->filename, info->pending_lineno_filename) != 0)
7364
            {
7365
              /* We are not changing to the main file.  Open a block for
7366
                 the new included file.  */
7367
              info->lineno_name_indx = info->name_indx;
7368
              ++info->name_indx;
7369
              if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
7370
                  || ! ieee_write_byte (info, 5)
7371
                  || ! ieee_write_number (info, 0)
7372
                  || ! ieee_write_id (info, info->pending_lineno_filename)
7373
                  || ! ieee_write_byte (info, (int) ieee_nn_record)
7374
                  || ! ieee_write_number (info, info->lineno_name_indx)
7375
                  || ! ieee_write_id (info, ""))
7376
                return FALSE;
7377
            }
7378
          info->lineno_filename = info->pending_lineno_filename;
7379
        }
7380
 
7381
      if (! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7382
          || ! ieee_write_number (info, info->lineno_name_indx)
7383
          || ! ieee_write_number (info, 0)
7384
          || ! ieee_write_number (info, 7)
7385
          || ! ieee_write_number (info, info->pending_lineno)
7386
          || ! ieee_write_number (info, 0)
7387
          || ! ieee_write_asn (info, info->lineno_name_indx,
7388
                               info->pending_lineno_addr))
7389
        return FALSE;
7390
    }
7391
 
7392
  info->pending_lineno_filename = filename;
7393
  info->pending_lineno = lineno;
7394
  info->pending_lineno_addr = addr;
7395
 
7396
  return TRUE;
7397
}

powered by: WebSVN 2.1.0

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