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