* ieee.c (struct ieee_write_type): Add reflocalp field.
[platform/upstream/binutils.git] / binutils / ieee.c
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
36 struct ieee_block
37 {
38   /* The kind of block.  */
39   int kind;
40   /* The source file name, for a BB5 block.  */
41   const char *filename;
42   /* The index of the function type, for a BB4 or BB6 block.  */
43   unsigned int fnindx;
44   /* True if this function is being skipped.  */
45   boolean skip;
46 };
47
48 /* This structure is the block stack.  */
49
50 #define BLOCKSTACK_SIZE (16)
51
52 struct ieee_blockstack
53 {
54   /* The stack pointer.  */
55   struct ieee_block *bsp;
56   /* The stack.  */
57   struct ieee_block stack[BLOCKSTACK_SIZE];
58 };
59
60 /* This structure holds information for a variable.  */
61
62 struct ieee_var
63 {
64   /* Start of name.  */
65   const char *name;
66   /* Length of name.  */
67   unsigned long namlen;
68   /* Type.  */
69   debug_type type;
70   /* Slot if we make an indirect type.  */
71   debug_type *pslot;
72   /* Kind of variable or function.  */
73   enum
74     {
75       IEEE_UNKNOWN,
76       IEEE_EXTERNAL,
77       IEEE_GLOBAL,
78       IEEE_STATIC,
79       IEEE_LOCAL,
80       IEEE_FUNCTION
81     } kind;
82 };
83
84 /* This structure holds all the variables.  */
85
86 struct ieee_vars
87 {
88   /* Number of slots allocated.  */
89   unsigned int alloc;
90   /* Variables.  */
91   struct ieee_var *vars;
92 };
93
94 /* This structure holds information for a type.  We need this because
95    we don't want to represent bitfields as real types.  */
96
97 struct ieee_type
98 {
99   /* Type.  */
100   debug_type type;
101   /* Slot if this is type is referenced before it is defined.  */
102   debug_type *pslot;
103   /* Slots for arguments if we make indirect types for them.  */
104   debug_type *arg_slots;
105   /* If this is a bitfield, this is the size in bits.  If this is not
106      a bitfield, this is zero.  */
107   unsigned long bitsize;
108 };
109
110 /* This structure holds all the type information.  */
111
112 struct ieee_types
113 {
114   /* Number of slots allocated.  */
115   unsigned int alloc;
116   /* Types.  */
117   struct ieee_type *types;
118   /* Builtin types.  */
119 #define BUILTIN_TYPE_COUNT (60)
120   debug_type builtins[BUILTIN_TYPE_COUNT];
121 };
122
123 /* This structure holds a linked last of structs with their tag names,
124    so that we can convert them to C++ classes if necessary.  */
125
126 struct ieee_tag
127 {
128   /* Next tag.  */
129   struct ieee_tag *next;
130   /* This tag name.  */
131   const char *name;
132   /* The type of the tag.  */
133   debug_type type;
134   /* The tagged type is an indirect type pointing at this slot.  */
135   debug_type slot;
136   /* This is an array of slots used when a field type is converted
137      into a indirect type, in case it needs to be later converted into
138      a reference type.  */
139   debug_type *fslots;
140 };
141
142 /* This structure holds the information we pass around to the parsing
143    functions.  */
144
145 struct ieee_info
146 {
147   /* The debugging handle.  */
148   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
173 enum builtin_types
174 {
175   builtin_unknown = 0,
176   builtin_void = 1,
177   builtin_signed_char = 2,
178   builtin_unsigned_char = 3,
179   builtin_signed_short_int = 4,
180   builtin_unsigned_short_int = 5,
181   builtin_signed_long = 6,
182   builtin_unsigned_long = 7,
183   builtin_signed_long_long = 8,
184   builtin_unsigned_long_long = 9,
185   builtin_float = 10,
186   builtin_double = 11,
187   builtin_long_double = 12,
188   builtin_long_long_double = 13,
189   builtin_quoted_string = 14,
190   builtin_instruction_address = 15,
191   builtin_int = 16,
192   builtin_unsigned = 17,
193   builtin_unsigned_int = 18,
194   builtin_char = 19,
195   builtin_long = 20,
196   builtin_short = 21,
197   builtin_unsigned_short = 22,
198   builtin_short_int = 23,
199   builtin_signed_short = 24,
200   builtin_bcd_float = 25
201 };
202
203 /* These are the values found in the derivation flags of a 'b'
204    component record of a 'T' type extension record in a C++ pmisc
205    record.  These are bitmasks.  */
206
207 /* Set for a private base class, clear for a public base class.
208    Protected base classes are not supported.  */
209 #define BASEFLAGS_PRIVATE (0x1)
210 /* Set for a virtual base class.  */
211 #define BASEFLAGS_VIRTUAL (0x2)
212 /* Set for a friend class, clear for a base class.  */
213 #define BASEFLAGS_FRIEND (0x10)
214
215 /* These are the values found in the specs flags of a 'd', 'm', or 'v'
216    component record of a 'T' type extension record in a C++ pmisc
217    record.  The same flags are used for a 'M' record in a C++ pmisc
218    record.  */
219
220 /* The lower two bits hold visibility information.  */
221 #define CXXFLAGS_VISIBILITY (0x3)
222 /* This value in the lower two bits indicates a public member.  */
223 #define CXXFLAGS_VISIBILITY_PUBLIC (0x0)
224 /* This value in the lower two bits indicates a private member.  */
225 #define CXXFLAGS_VISIBILITY_PRIVATE (0x1)
226 /* This value in the lower two bits indicates a protected member.  */
227 #define CXXFLAGS_VISIBILITY_PROTECTED (0x2)
228 /* Set for a static member.  */
229 #define CXXFLAGS_STATIC (0x4)
230 /* Set for a virtual override.  */
231 #define CXXFLAGS_OVERRIDE (0x8)
232 /* Set for a friend function.  */
233 #define CXXFLAGS_FRIEND (0x10)
234 /* Set for a const function.  */
235 #define CXXFLAGS_CONST (0x20)
236 /* Set for a volatile function.  */
237 #define CXXFLAGS_VOLATILE (0x40)
238 /* Set for an overloaded function.  */
239 #define CXXFLAGS_OVERLOADED (0x80)
240 /* Set for an operator function.  */
241 #define CXXFLAGS_OPERATOR (0x100)
242 /* Set for a constructor or destructor.  */
243 #define CXXFLAGS_CTORDTOR (0x400)
244 /* Set for a constructor.  */
245 #define CXXFLAGS_CTOR (0x200)
246 /* Set for an inline function.  */
247 #define CXXFLAGS_INLINE (0x800)
248
249 /* Local functions.  */
250
251 static void ieee_error
252   PARAMS ((struct ieee_info *, const bfd_byte *, const char *));
253 static void ieee_eof PARAMS ((struct ieee_info *));
254 static char *savestring PARAMS ((const char *, unsigned long));
255 static boolean ieee_read_number
256   PARAMS ((struct ieee_info *, const bfd_byte **, bfd_vma *));
257 static boolean ieee_read_optional_number
258   PARAMS ((struct ieee_info *, const bfd_byte **, bfd_vma *, boolean *));
259 static boolean ieee_read_id
260   PARAMS ((struct ieee_info *, const bfd_byte **, const char **,
261            unsigned long *));
262 static boolean ieee_read_optional_id
263   PARAMS ((struct ieee_info *, const bfd_byte **, const char **,
264            unsigned long *, boolean *));
265 static boolean ieee_read_expression
266   PARAMS ((struct ieee_info *, const bfd_byte **, bfd_vma *));
267 static debug_type ieee_builtin_type
268   PARAMS ((struct ieee_info *, const bfd_byte *, unsigned int));
269 static boolean ieee_alloc_type
270   PARAMS ((struct ieee_info *, unsigned int, boolean));
271 static boolean ieee_read_type_index
272   PARAMS ((struct ieee_info *, const bfd_byte **, debug_type *));
273 static int ieee_regno_to_genreg PARAMS ((bfd *, int));
274 static int ieee_genreg_to_regno PARAMS ((bfd *, int));
275 static boolean parse_ieee_bb PARAMS ((struct ieee_info *, const bfd_byte **));
276 static boolean parse_ieee_be PARAMS ((struct ieee_info *, const bfd_byte **));
277 static boolean parse_ieee_nn PARAMS ((struct ieee_info *, const bfd_byte **));
278 static boolean parse_ieee_ty PARAMS ((struct ieee_info *, const bfd_byte **));
279 static boolean parse_ieee_atn PARAMS ((struct ieee_info *, const bfd_byte **));
280 static boolean ieee_read_cxx_misc
281   PARAMS ((struct ieee_info *, const bfd_byte **, unsigned long));
282 static boolean ieee_read_cxx_class
283   PARAMS ((struct ieee_info *, const bfd_byte **, unsigned long));
284 static boolean ieee_read_cxx_defaults
285   PARAMS ((struct ieee_info *, const bfd_byte **, unsigned long));
286 static boolean ieee_read_reference
287   PARAMS ((struct ieee_info *, const bfd_byte **));
288 static boolean ieee_require_asn
289   PARAMS ((struct ieee_info *, const bfd_byte **, bfd_vma *));
290 static 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
296 static void
297 ieee_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
311 static void
312 ieee_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
321 static char *
322 savestring (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
336 static boolean
337 ieee_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
348 static boolean
349 ieee_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
417 static boolean
418 ieee_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
430 static boolean
431 ieee_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
496 static boolean
497 ieee_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
608 static debug_type
609 ieee_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
799 static boolean
800 ieee_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
850 static boolean
851 ieee_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
884 boolean
885 parse_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
974 static boolean
975 parse_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;
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
1255 static boolean
1256 parse_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
1360 static boolean
1361 parse_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
1408 static boolean
1409 parse_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
2107 static boolean
2108 parse_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
2471 static boolean
2472 ieee_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
2559 static boolean
2560 ieee_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;
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
3226 static boolean
3227 ieee_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
3333 static boolean
3334 ieee_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
3506 static boolean
3507 ieee_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
3543 static boolean
3544 ieee_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 \f
3588 /* Convert a register number in IEEE debugging information into a
3589    generic register number.  */
3590
3591 static int
3592 ieee_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
3620 static int
3621 ieee_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 \f
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
3656 struct 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
3668 struct 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
3680 struct 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
3692 struct 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
3716 struct 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   /* If this is not local, whether a reference to this type should be
3739      local.  */
3740   unsigned reflocalp : 1;
3741   /* Whether this is a duplicate struct definition which we are
3742      ignoring.  */
3743   unsigned int ignorep : 1;
3744 };
3745
3746 /* This is the type stack used by the debug writing routines.  FIXME:
3747    We could generate more efficient output if we remembered when we
3748    have output a particular type before.  */
3749
3750 struct ieee_type_stack
3751 {
3752   /* Next entry on stack.  */
3753   struct ieee_type_stack *next;
3754   /* Type information.  */
3755   struct ieee_write_type type;
3756 };
3757
3758 /* This is a list of associations between a name and some types.
3759    These are used for typedefs and tags.  */
3760
3761 struct ieee_name_type
3762 {
3763   /* Next type for this name.  */
3764   struct ieee_name_type *next;
3765   /* ID number.  For a typedef, this is the index of the type to which
3766      this name is typedefed.  */
3767   unsigned int id;
3768   /* Type.  */
3769   struct ieee_write_type type;
3770   /* If this is a tag which has not yet been defined, this is the
3771      kind.  If the tag has been defined, this is DEBUG_KIND_ILLEGAL.  */
3772   enum debug_type_kind kind;
3773 };
3774
3775 /* We use a hash table to associate names and types.  */
3776
3777 struct ieee_name_type_hash_table
3778 {
3779   struct bfd_hash_table root;
3780 };
3781
3782 struct ieee_name_type_hash_entry
3783 {
3784   struct bfd_hash_entry root;
3785   /* Information for this name.  */
3786   struct ieee_name_type *types;
3787 };
3788
3789 /* This is a list of enums.  */
3790
3791 struct ieee_defined_enum
3792 {
3793   /* Next enum.  */
3794   struct ieee_defined_enum *next;
3795   /* Type index.  */
3796   unsigned int indx;
3797   /* Tag.  */
3798   const char *tag;
3799   /* Names.  */
3800   const char **names;
3801   /* Values.  */
3802   bfd_signed_vma *vals;
3803 };
3804
3805 /* We keep a list of modified versions of types, so that we don't
3806    output them more than once.  */
3807
3808 struct ieee_modified_type
3809 {
3810   /* Pointer to this type.  */
3811   unsigned int pointer;
3812   /* Function with unknown arguments returning this type.  */
3813   unsigned int function;
3814   /* Const version of this type.  */
3815   unsigned int const_qualified;
3816   /* Volatile version of this type.  */
3817   unsigned int volatile_qualified;
3818   /* List of arrays of this type of various bounds.  */
3819   struct ieee_modified_array_type *arrays;
3820 };
3821
3822 /* A list of arrays bounds.  */
3823
3824 struct ieee_modified_array_type
3825 {
3826   /* Next array bounds.  */
3827   struct ieee_modified_array_type *next;
3828   /* Type index with these bounds.  */
3829   unsigned int indx;
3830   /* Low bound.  */
3831   bfd_signed_vma low;
3832   /* High bound.  */
3833   bfd_signed_vma high;
3834 };
3835
3836 /* This is a list of pending function parameter information.  We don't
3837    output them until we see the first block.  */
3838
3839 struct ieee_pending_parm
3840 {
3841   /* Next pending parameter.  */
3842   struct ieee_pending_parm *next;
3843   /* Name.  */
3844   const char *name;
3845   /* Type index.  */
3846   unsigned int type;
3847   /* Whether the type is a reference.  */
3848   boolean referencep;
3849   /* Kind.  */
3850   enum debug_parm_kind kind;
3851   /* Value.  */
3852   bfd_vma val;
3853 };
3854
3855 /* This is the handle passed down by debug_write.  */
3856
3857 struct ieee_handle
3858 {
3859   /* BFD we are writing to.  */
3860   bfd *abfd;
3861   /* Whether we got an error in a subroutine called via traverse or
3862      map_over_sections.  */
3863   boolean error;
3864   /* Current data buffer list.  */
3865   struct ieee_buflist *current;
3866   /* Current data buffer.  */
3867   struct ieee_buf *curbuf;
3868   /* Filename of current compilation unit.  */
3869   const char *filename;
3870   /* Module name of current compilation unit.  */
3871   const char *modname;
3872   /* List of buffer for global types.  */
3873   struct ieee_buflist global_types;
3874   /* List of finished data buffers.  */
3875   struct ieee_buflist data;
3876   /* List of buffers for typedefs in the current compilation unit.  */
3877   struct ieee_buflist types;
3878   /* List of buffers for variables and functions in the current
3879      compilation unit.  */
3880   struct ieee_buflist vars;
3881   /* List of buffers for C++ class definitions in the current
3882      compilation unit.  */
3883   struct ieee_buflist cxx;
3884   /* List of buffers for line numbers in the current compilation unit.  */
3885   struct ieee_buflist linenos;
3886   /* Ranges for the current compilation unit.  */
3887   struct ieee_range *ranges;
3888   /* Ranges for all debugging information.  */
3889   struct ieee_range *global_ranges;
3890   /* Nested pending ranges.  */
3891   struct ieee_range *pending_ranges;
3892   /* Type stack.  */
3893   struct ieee_type_stack *type_stack;
3894   /* Next unallocated type index.  */
3895   unsigned int type_indx;
3896   /* Next unallocated name index.  */
3897   unsigned int name_indx;
3898   /* Typedefs.  */
3899   struct ieee_name_type_hash_table typedefs;
3900   /* Tags.  */
3901   struct ieee_name_type_hash_table tags;
3902   /* Enums.  */
3903   struct ieee_defined_enum *enums;
3904   /* Modified versions of types.  */
3905   struct ieee_modified_type *modified;
3906   /* Number of entries allocated in modified.  */
3907   unsigned int modified_alloc;
3908   /* 4 byte complex type.  */
3909   unsigned int complex_float_index;
3910   /* 8 byte complex type.  */
3911   unsigned int complex_double_index;
3912   /* The depth of block nesting.  This is 0 outside a function, and 1
3913      just after start_function is called.  */
3914   unsigned int block_depth;
3915   /* The name of the current function.  */
3916   const char *fnname;
3917   /* List of buffers for the type of the function we are currently
3918      writing out.  */
3919   struct ieee_buflist fntype;
3920   /* List of buffers for the parameters of the function we are
3921      currently writing out.  */
3922   struct ieee_buflist fnargs;
3923   /* Number of arguments written to fnargs.  */
3924   unsigned int fnargcount;
3925   /* Pending function parameters.  */
3926   struct ieee_pending_parm *pending_parms;
3927   /* Current line number filename.  */
3928   const char *lineno_filename;
3929   /* Line number name index.  */
3930   unsigned int lineno_name_indx;
3931   /* Filename of pending line number.  */
3932   const char *pending_lineno_filename;
3933   /* Pending line number.  */
3934   unsigned long pending_lineno;
3935   /* Address of pending line number.  */
3936   bfd_vma pending_lineno_addr;
3937   /* Highest address seen at end of procedure.  */
3938   bfd_vma highaddr;
3939 };
3940
3941 static boolean ieee_init_buffer
3942   PARAMS ((struct ieee_handle *, struct ieee_buflist *));
3943 static boolean ieee_change_buffer
3944   PARAMS ((struct ieee_handle *, struct ieee_buflist *));
3945 static boolean ieee_append_buffer
3946   PARAMS ((struct ieee_handle *, struct ieee_buflist *,
3947            struct ieee_buflist *));
3948 static boolean ieee_real_write_byte PARAMS ((struct ieee_handle *, int));
3949 static boolean ieee_write_2bytes PARAMS ((struct ieee_handle *, int));
3950 static boolean ieee_write_number PARAMS ((struct ieee_handle *, bfd_vma));
3951 static boolean ieee_write_id PARAMS ((struct ieee_handle *, const char *));
3952 static boolean ieee_write_asn
3953   PARAMS ((struct ieee_handle *, unsigned int, bfd_vma));
3954 static boolean ieee_write_atn65
3955   PARAMS ((struct ieee_handle *, unsigned int, const char *));
3956 static boolean ieee_push_type
3957   PARAMS ((struct ieee_handle *, unsigned int, unsigned int, boolean,
3958            boolean));
3959 static unsigned int ieee_pop_type PARAMS ((struct ieee_handle *));
3960 static void ieee_pop_unused_type PARAMS ((struct ieee_handle *));
3961 static unsigned int ieee_pop_type_used
3962   PARAMS ((struct ieee_handle *, boolean));
3963 static boolean ieee_add_range
3964   PARAMS ((struct ieee_handle *, boolean, bfd_vma, bfd_vma));
3965 static boolean ieee_start_range PARAMS ((struct ieee_handle *, bfd_vma));
3966 static boolean ieee_end_range PARAMS ((struct ieee_handle *, bfd_vma));
3967 static boolean ieee_define_type
3968   PARAMS ((struct ieee_handle *, unsigned int, boolean, boolean));
3969 static boolean ieee_define_named_type
3970   PARAMS ((struct ieee_handle *, const char *, unsigned int, unsigned int,
3971            boolean, boolean, struct ieee_buflist *));
3972 static struct ieee_modified_type *ieee_get_modified_info
3973   PARAMS ((struct ieee_handle *, unsigned int));
3974 static struct bfd_hash_entry *ieee_name_type_newfunc
3975   PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
3976 static boolean ieee_write_undefined_tag
3977   PARAMS ((struct ieee_name_type_hash_entry *, PTR));
3978 static boolean ieee_finish_compilation_unit PARAMS ((struct ieee_handle *));
3979 static void ieee_add_bb11_blocks PARAMS ((bfd *, asection *, PTR));
3980 static boolean ieee_add_bb11
3981   PARAMS ((struct ieee_handle *, asection *, bfd_vma, bfd_vma));
3982 static boolean ieee_output_pending_parms PARAMS ((struct ieee_handle *));
3983 static unsigned int ieee_vis_to_flags PARAMS ((enum debug_visibility));
3984 static boolean ieee_class_method_var
3985   PARAMS ((struct ieee_handle *, const char *, enum debug_visibility, boolean,
3986            boolean, boolean, bfd_vma, boolean));
3987
3988 static boolean ieee_start_compilation_unit PARAMS ((PTR, const char *));
3989 static boolean ieee_start_source PARAMS ((PTR, const char *));
3990 static boolean ieee_empty_type PARAMS ((PTR));
3991 static boolean ieee_void_type PARAMS ((PTR));
3992 static boolean ieee_int_type PARAMS ((PTR, unsigned int, boolean));
3993 static boolean ieee_float_type PARAMS ((PTR, unsigned int));
3994 static boolean ieee_complex_type PARAMS ((PTR, unsigned int));
3995 static boolean ieee_bool_type PARAMS ((PTR, unsigned int));
3996 static boolean ieee_enum_type
3997   PARAMS ((PTR, const char *, const char **, bfd_signed_vma *));
3998 static boolean ieee_pointer_type PARAMS ((PTR));
3999 static boolean ieee_function_type PARAMS ((PTR, int, boolean));
4000 static boolean ieee_reference_type PARAMS ((PTR));
4001 static boolean ieee_range_type PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma));
4002 static boolean ieee_array_type
4003   PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma, boolean));
4004 static boolean ieee_set_type PARAMS ((PTR, boolean));
4005 static boolean ieee_offset_type PARAMS ((PTR));
4006 static boolean ieee_method_type PARAMS ((PTR, boolean, int, boolean));
4007 static boolean ieee_const_type PARAMS ((PTR));
4008 static boolean ieee_volatile_type PARAMS ((PTR));
4009 static boolean ieee_start_struct_type
4010   PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int));
4011 static boolean ieee_struct_field
4012   PARAMS ((PTR, const char *, bfd_vma, bfd_vma, enum debug_visibility));
4013 static boolean ieee_end_struct_type PARAMS ((PTR));
4014 static boolean ieee_start_class_type
4015   PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int, boolean,
4016            boolean));
4017 static boolean ieee_class_static_member
4018   PARAMS ((PTR, const char *, const char *, enum debug_visibility));
4019 static boolean ieee_class_baseclass
4020   PARAMS ((PTR, bfd_vma, boolean, enum debug_visibility));
4021 static boolean ieee_class_start_method PARAMS ((PTR, const char *));
4022 static boolean ieee_class_method_variant
4023   PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean,
4024            bfd_vma, boolean));
4025 static boolean ieee_class_static_method_variant
4026   PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean));
4027 static boolean ieee_class_end_method PARAMS ((PTR));
4028 static boolean ieee_end_class_type PARAMS ((PTR));
4029 static boolean ieee_typedef_type PARAMS ((PTR, const char *));
4030 static boolean ieee_tag_type
4031   PARAMS ((PTR, const char *, unsigned int, enum debug_type_kind));
4032 static boolean ieee_typdef PARAMS ((PTR, const char *));
4033 static boolean ieee_tag PARAMS ((PTR, const char *));
4034 static boolean ieee_int_constant PARAMS ((PTR, const char *, bfd_vma));
4035 static boolean ieee_float_constant PARAMS ((PTR, const char *, double));
4036 static boolean ieee_typed_constant PARAMS ((PTR, const char *, bfd_vma));
4037 static boolean ieee_variable
4038   PARAMS ((PTR, const char *, enum debug_var_kind, bfd_vma));
4039 static boolean ieee_start_function PARAMS ((PTR, const char *, boolean));
4040 static boolean ieee_function_parameter
4041   PARAMS ((PTR, const char *, enum debug_parm_kind, bfd_vma));
4042 static boolean ieee_start_block PARAMS ((PTR, bfd_vma));
4043 static boolean ieee_end_block PARAMS ((PTR, bfd_vma));
4044 static boolean ieee_end_function PARAMS ((PTR));
4045 static boolean ieee_lineno
4046   PARAMS ((PTR, const char *, unsigned long, bfd_vma));
4047
4048 static const struct debug_write_fns ieee_fns =
4049 {
4050   ieee_start_compilation_unit,
4051   ieee_start_source,
4052   ieee_empty_type,
4053   ieee_void_type,
4054   ieee_int_type,
4055   ieee_float_type,
4056   ieee_complex_type,
4057   ieee_bool_type,
4058   ieee_enum_type,
4059   ieee_pointer_type,
4060   ieee_function_type,
4061   ieee_reference_type,
4062   ieee_range_type,
4063   ieee_array_type,
4064   ieee_set_type,
4065   ieee_offset_type,
4066   ieee_method_type,
4067   ieee_const_type,
4068   ieee_volatile_type,
4069   ieee_start_struct_type,
4070   ieee_struct_field,
4071   ieee_end_struct_type,
4072   ieee_start_class_type,
4073   ieee_class_static_member,
4074   ieee_class_baseclass,
4075   ieee_class_start_method,
4076   ieee_class_method_variant,
4077   ieee_class_static_method_variant,
4078   ieee_class_end_method,
4079   ieee_end_class_type,
4080   ieee_typedef_type,
4081   ieee_tag_type,
4082   ieee_typdef,
4083   ieee_tag,
4084   ieee_int_constant,
4085   ieee_float_constant,
4086   ieee_typed_constant,
4087   ieee_variable,
4088   ieee_start_function,
4089   ieee_function_parameter,
4090   ieee_start_block,
4091   ieee_end_block,
4092   ieee_end_function,
4093   ieee_lineno
4094 };
4095
4096 /* Initialize a buffer to be empty.  */
4097
4098 /*ARGSUSED*/
4099 static boolean
4100 ieee_init_buffer (info, buflist)
4101      struct ieee_handle *info;
4102      struct ieee_buflist *buflist;
4103 {
4104   buflist->head = NULL;
4105   buflist->tail = NULL;
4106   return true;
4107 }
4108
4109 /* See whether a buffer list has any data.  */
4110
4111 #define ieee_buffer_emptyp(buflist) ((buflist)->head == NULL)
4112
4113 /* Change the current buffer to a specified buffer chain.  */
4114
4115 static boolean
4116 ieee_change_buffer (info, buflist)
4117      struct ieee_handle *info;
4118      struct ieee_buflist *buflist;
4119 {
4120   if (buflist->head == NULL)
4121     {
4122       struct ieee_buf *buf;
4123
4124       buf = (struct ieee_buf *) xmalloc (sizeof *buf);
4125       buf->next = NULL;
4126       buf->c = 0;
4127       buflist->head = buf;
4128       buflist->tail = buf;
4129     }
4130
4131   info->current = buflist;
4132   info->curbuf = buflist->tail;
4133
4134   return true;
4135 }
4136
4137 /* Append a buffer chain.  */
4138
4139 /*ARGSUSED*/
4140 static boolean
4141 ieee_append_buffer (info, mainbuf, newbuf)
4142      struct ieee_handle *info;
4143      struct ieee_buflist *mainbuf;
4144      struct ieee_buflist *newbuf;
4145 {
4146   if (newbuf->head != NULL)
4147     {
4148       if (mainbuf->head == NULL)
4149         mainbuf->head = newbuf->head;
4150       else
4151         mainbuf->tail->next = newbuf->head;
4152       mainbuf->tail = newbuf->tail;
4153     }
4154   return true;
4155 }
4156
4157 /* Write a byte into the buffer.  We use a macro for speed and a
4158    function for the complex cases.  */
4159
4160 #define ieee_write_byte(info, b)                                \
4161   ((info)->curbuf->c < IEEE_BUFSIZE                             \
4162    ? ((info)->curbuf->buf[(info)->curbuf->c++] = (b), true)     \
4163    : ieee_real_write_byte ((info), (b)))
4164
4165 static boolean
4166 ieee_real_write_byte (info, b)
4167      struct ieee_handle *info;
4168      int b;
4169 {
4170   if (info->curbuf->c >= IEEE_BUFSIZE)
4171     {
4172       struct ieee_buf *n;
4173
4174       n = (struct ieee_buf *) xmalloc (sizeof *n);
4175       n->next = NULL;
4176       n->c = 0;
4177       if (info->current->head == NULL)
4178         info->current->head = n;
4179       else
4180         info->current->tail->next = n;
4181       info->current->tail = n;
4182       info->curbuf = n;
4183     }
4184
4185   info->curbuf->buf[info->curbuf->c] = b;
4186   ++info->curbuf->c;
4187
4188   return true;
4189 }
4190
4191 /* Write out two bytes.  */
4192
4193 static boolean
4194 ieee_write_2bytes (info, i)
4195      struct ieee_handle *info;
4196      int i;
4197 {
4198   return (ieee_write_byte (info, i >> 8)
4199           && ieee_write_byte (info, i & 0xff));
4200 }
4201
4202 /* Write out an integer.  */
4203
4204 static boolean
4205 ieee_write_number (info, v)
4206      struct ieee_handle *info;
4207      bfd_vma v;
4208 {
4209   bfd_vma t;
4210   bfd_byte ab[20];
4211   bfd_byte *p;
4212   unsigned int c;
4213
4214   if (v <= (bfd_vma) ieee_number_end_enum)
4215     return ieee_write_byte (info, (int) v);
4216
4217   t = v;
4218   p = ab + sizeof ab;
4219   while (t != 0)
4220     {
4221       *--p = t & 0xff;
4222       t >>= 8;
4223     }
4224   c = (ab + 20) - p;
4225
4226   if (c > (unsigned int) (ieee_number_repeat_end_enum
4227                           - ieee_number_repeat_start_enum))
4228     {
4229       fprintf (stderr, "IEEE numeric overflow: 0x");
4230       fprintf_vma (stderr, v);
4231       fprintf (stderr, "\n");
4232       return false;
4233     }
4234
4235   if (! ieee_write_byte (info, (int) ieee_number_repeat_start_enum + c))
4236     return false;
4237   for (; c > 0; --c, ++p)
4238     {
4239       if (! ieee_write_byte (info, *p))
4240         return false;
4241     }
4242
4243   return true;
4244 }
4245
4246 /* Write out a string.  */
4247
4248 static boolean
4249 ieee_write_id (info, s)
4250      struct ieee_handle *info;
4251      const char *s;
4252 {
4253   unsigned int len;
4254
4255   len = strlen (s);
4256   if (len <= 0x7f)
4257     {
4258       if (! ieee_write_byte (info, len))
4259         return false;
4260     }
4261   else if (len <= 0xff)
4262     {
4263       if (! ieee_write_byte (info, (int) ieee_extension_length_1_enum)
4264           || ! ieee_write_byte (info, len))
4265         return false;
4266     }
4267   else if (len <= 0xffff)
4268     {
4269       if (! ieee_write_byte (info, (int) ieee_extension_length_2_enum)
4270           || ! ieee_write_2bytes (info, len))
4271         return false;
4272     }
4273   else
4274     {
4275       fprintf (stderr, "IEEE string length overflow: %u\n", len);
4276       return false;
4277     }
4278
4279   for (; *s != '\0'; s++)
4280     if (! ieee_write_byte (info, *s))
4281       return false;
4282
4283   return true;
4284 }
4285
4286 /* Write out an ASN record.  */
4287
4288 static boolean
4289 ieee_write_asn (info, indx, val)
4290      struct ieee_handle *info;
4291      unsigned int indx;
4292      bfd_vma val;
4293 {
4294   return (ieee_write_2bytes (info, (int) ieee_asn_record_enum)
4295           && ieee_write_number (info, indx)
4296           && ieee_write_number (info, val));
4297 }
4298
4299 /* Write out an ATN65 record.  */
4300
4301 static boolean
4302 ieee_write_atn65 (info, indx, s)
4303      struct ieee_handle *info;
4304      unsigned int indx;
4305      const char *s;
4306 {
4307   return (ieee_write_2bytes (info, (int) ieee_atn_record_enum)
4308           && ieee_write_number (info, indx)
4309           && ieee_write_number (info, 0)
4310           && ieee_write_number (info, 65)
4311           && ieee_write_id (info, s));
4312 }
4313
4314 /* Push a type index onto the type stack.  */
4315
4316 static boolean
4317 ieee_push_type (info, indx, size, unsignedp, localp)
4318      struct ieee_handle *info;
4319      unsigned int indx;
4320      unsigned int size;
4321      boolean unsignedp;
4322      boolean localp;
4323 {
4324   struct ieee_type_stack *ts;
4325
4326   ts = (struct ieee_type_stack *) xmalloc (sizeof *ts);
4327   memset (ts, 0, sizeof *ts);
4328
4329   ts->type.indx = indx;
4330   ts->type.size = size;
4331   ts->type.unsignedp = unsignedp;
4332   ts->type.localp = localp;
4333
4334   ts->next = info->type_stack;
4335   info->type_stack = ts;
4336
4337   return true;
4338 }
4339
4340 /* Pop a type index off the type stack.  */
4341
4342 static unsigned int
4343 ieee_pop_type (info)
4344      struct ieee_handle *info;
4345 {
4346   return ieee_pop_type_used (info, true);
4347 }
4348
4349 /* Pop an unused type index off the type stack.  */
4350
4351 static void
4352 ieee_pop_unused_type (info)
4353      struct ieee_handle *info;
4354 {
4355   (void) ieee_pop_type_used (info, false);
4356 }
4357
4358 /* Pop a used or unused type index off the type stack.  */
4359
4360 static unsigned int
4361 ieee_pop_type_used (info, used)
4362      struct ieee_handle *info;
4363      boolean used;
4364 {
4365   struct ieee_type_stack *ts;
4366   unsigned int ret;
4367
4368   ts = info->type_stack;
4369   assert (ts != NULL);
4370
4371   /* If this is a function type, and we need it, we need to append the
4372      actual definition to the typedef block now.  */
4373   if (used && ! ieee_buffer_emptyp (&ts->type.fndef))
4374     {
4375       struct ieee_buflist *buflist;
4376
4377       if (ts->type.localp)
4378         {
4379           /* Make sure we have started the types block.  */
4380           if (ieee_buffer_emptyp (&info->types))
4381             {
4382               if (! ieee_change_buffer (info, &info->types)
4383                   || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4384                   || ! ieee_write_byte (info, 1)
4385                   || ! ieee_write_number (info, 0)
4386                   || ! ieee_write_id (info, info->modname))
4387                 return false;
4388             }
4389           buflist = &info->types;
4390         }
4391       else
4392         {
4393           /* Make sure we started the global type block.  */
4394           if (ieee_buffer_emptyp (&info->global_types))
4395             {
4396               if (! ieee_change_buffer (info, &info->global_types)
4397                   || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4398                   || ! ieee_write_byte (info, 2)
4399                   || ! ieee_write_number (info, 0)
4400                   || ! ieee_write_id (info, ""))
4401                 return false;
4402             }
4403           buflist = &info->global_types;
4404         }
4405
4406       if (! ieee_append_buffer (info, buflist, &ts->type.fndef))
4407         return false;
4408     }
4409
4410   ret = ts->type.indx;
4411   info->type_stack = ts->next;
4412   free (ts);
4413   return ret;
4414 }
4415
4416 /* Add a range of bytes included in the current compilation unit.  */
4417
4418 static boolean
4419 ieee_add_range (info, global, low, high)
4420      struct ieee_handle *info;
4421      boolean global;
4422      bfd_vma low;
4423      bfd_vma high;
4424 {
4425   struct ieee_range **plist, *r, **pr;
4426
4427   if (low == (bfd_vma) -1 || high == (bfd_vma) -1 || low == high)
4428     return true;
4429
4430   if (global)
4431     plist = &info->global_ranges;
4432   else
4433     plist = &info->ranges;
4434
4435   for (r = *plist; r != NULL; r = r->next)
4436     {
4437       if (high >= r->low && low <= r->high)
4438         {
4439           /* The new range overlaps r.  */
4440           if (low < r->low)
4441             r->low = low;
4442           if (high > r->high)
4443             r->high = high;
4444           pr = &r->next;
4445           while (*pr != NULL && (*pr)->low <= r->high)
4446             {
4447               struct ieee_range *n;
4448
4449               if ((*pr)->high > r->high)
4450                 r->high = (*pr)->high;
4451               n = (*pr)->next;
4452               free (*pr);
4453               *pr = n;
4454             }
4455           return true;
4456         }
4457     }
4458
4459   r = (struct ieee_range *) xmalloc (sizeof *r);
4460   memset (r, 0, sizeof *r);
4461
4462   r->low = low;
4463   r->high = high;
4464
4465   /* Store the ranges sorted by address.  */
4466   for (pr = plist; *pr != NULL; pr = &(*pr)->next)
4467     if ((*pr)->low > high)
4468       break;
4469   r->next = *pr;
4470   *pr = r;
4471
4472   return true;
4473 }
4474
4475 /* Start a new range for which we only have the low address.  */
4476
4477 static boolean
4478 ieee_start_range (info, low)
4479      struct ieee_handle *info;
4480      bfd_vma low;
4481 {
4482   struct ieee_range *r;
4483
4484   r = (struct ieee_range *) xmalloc (sizeof *r);
4485   memset (r, 0, sizeof *r);
4486   r->low = low;
4487   r->next = info->pending_ranges;
4488   info->pending_ranges = r;
4489   return true;
4490 }  
4491
4492 /* Finish a range started by ieee_start_range.  */
4493
4494 static boolean
4495 ieee_end_range (info, high)
4496      struct ieee_handle *info;
4497      bfd_vma high;
4498 {
4499   struct ieee_range *r;
4500   bfd_vma low;
4501
4502   assert (info->pending_ranges != NULL);
4503   r = info->pending_ranges;
4504   low = r->low;
4505   info->pending_ranges = r->next;
4506   free (r);
4507   return ieee_add_range (info, false, low, high);
4508 }
4509
4510 /* Start defining a type.  */
4511
4512 static boolean
4513 ieee_define_type (info, size, unsignedp, localp)
4514      struct ieee_handle *info;
4515      unsigned int size;
4516      boolean unsignedp;
4517      boolean localp;
4518 {
4519   return ieee_define_named_type (info, (const char *) NULL,
4520                                  (unsigned int) -1, size, unsignedp,
4521                                  localp, (struct ieee_buflist *) NULL);
4522 }
4523
4524 /* Start defining a named type.  */
4525
4526 static boolean
4527 ieee_define_named_type (info, name, indx, size, unsignedp, localp, buflist)
4528      struct ieee_handle *info;
4529      const char *name;
4530      unsigned int indx;
4531      unsigned int size;
4532      boolean unsignedp;
4533      boolean localp;
4534      struct ieee_buflist *buflist;
4535 {
4536   unsigned int type_indx;
4537   unsigned int name_indx;
4538
4539   if (indx != (unsigned int) -1)
4540     type_indx = indx;
4541   else
4542     {
4543       type_indx = info->type_indx;
4544       ++info->type_indx;
4545     }
4546
4547   name_indx = info->name_indx;
4548   ++info->name_indx;
4549
4550   if (name == NULL)
4551     name = "";
4552
4553   /* If we were given a buffer, use it; otherwise, use either the
4554      local or the global type information, and make sure that the type
4555      block is started.  */
4556   if (buflist != NULL)
4557     {
4558       if (! ieee_change_buffer (info, buflist))
4559         return false;
4560     }
4561   else if (localp)
4562     {
4563       if (! ieee_buffer_emptyp (&info->types))
4564         {
4565           if (! ieee_change_buffer (info, &info->types))
4566             return false;
4567         }
4568       else
4569         {
4570           if (! ieee_change_buffer (info, &info->types)
4571               || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4572               || ! ieee_write_byte (info, 1)
4573               || ! ieee_write_number (info, 0)
4574               || ! ieee_write_id (info, info->modname))
4575             return false;
4576         }
4577     }
4578   else
4579     {
4580       if (! ieee_buffer_emptyp (&info->global_types))
4581         {
4582           if (! ieee_change_buffer (info, &info->global_types))
4583             return false;
4584         }
4585       else
4586         {
4587           if (! ieee_change_buffer (info, &info->global_types)
4588               || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4589               || ! ieee_write_byte (info, 2)
4590               || ! ieee_write_number (info, 0)
4591               || ! ieee_write_id (info, ""))
4592             return false;
4593         }
4594     }
4595
4596   /* Push the new type on the type stack, write out an NN record, and
4597      write out the start of a TY record.  The caller will then finish
4598      the TY record.  */
4599   if (! ieee_push_type (info, type_indx, size, unsignedp, localp))
4600     return false;
4601
4602   return (ieee_write_byte (info, (int) ieee_nn_record)
4603           && ieee_write_number (info, name_indx)
4604           && ieee_write_id (info, name)
4605           && ieee_write_byte (info, (int) ieee_ty_record_enum)
4606           && ieee_write_number (info, type_indx)
4607           && ieee_write_byte (info, 0xce)
4608           && ieee_write_number (info, name_indx));
4609 }
4610
4611 /* Get an entry to the list of modified versions of a type.  */
4612
4613 static struct ieee_modified_type *
4614 ieee_get_modified_info (info, indx)
4615      struct ieee_handle *info;
4616      unsigned int indx;
4617 {
4618   if (indx >= info->modified_alloc)
4619     {
4620       unsigned int nalloc;
4621
4622       nalloc = info->modified_alloc;
4623       if (nalloc == 0)
4624         nalloc = 16;
4625       while (indx >= nalloc)
4626         nalloc *= 2;
4627       info->modified = ((struct ieee_modified_type *)
4628                         xrealloc (info->modified,
4629                                   nalloc * sizeof *info->modified));
4630       memset (info->modified + info->modified_alloc, 0,
4631               (nalloc - info->modified_alloc) * sizeof *info->modified);
4632       info->modified_alloc = nalloc;
4633     }
4634
4635   return info->modified + indx;
4636 }
4637 \f
4638 /* Routines for the hash table mapping names to types.  */
4639
4640 /* Initialize an entry in the hash table.  */
4641
4642 static struct bfd_hash_entry *
4643 ieee_name_type_newfunc (entry, table, string)
4644      struct bfd_hash_entry *entry;
4645      struct bfd_hash_table *table;
4646      const char *string;
4647 {
4648   struct ieee_name_type_hash_entry *ret =
4649     (struct ieee_name_type_hash_entry *) entry;
4650
4651   /* Allocate the structure if it has not already been allocated by a
4652      subclass.  */
4653   if (ret == NULL)
4654     ret = ((struct ieee_name_type_hash_entry *)
4655            bfd_hash_allocate (table, sizeof *ret));
4656   if (ret == NULL)
4657     return NULL;
4658
4659   /* Call the allocation method of the superclass.  */
4660   ret = ((struct ieee_name_type_hash_entry *)
4661          bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
4662   if (ret)
4663     {
4664       /* Set local fields.  */
4665       ret->types = NULL;
4666     }
4667
4668   return (struct bfd_hash_entry *) ret;
4669 }
4670
4671 /* Look up an entry in the hash table.  */
4672
4673 #define ieee_name_type_hash_lookup(table, string, create, copy) \
4674   ((struct ieee_name_type_hash_entry *) \
4675    bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
4676
4677 /* Traverse the hash table.  */
4678
4679 #define ieee_name_type_hash_traverse(table, func, info)                 \
4680   (bfd_hash_traverse                                                    \
4681    (&(table)->root,                                                     \
4682     (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) (func),       \
4683     (info)))
4684 \f
4685 /* The general routine to write out IEEE debugging information.  */
4686
4687 boolean
4688 write_ieee_debugging_info (abfd, dhandle)
4689      bfd *abfd;
4690      PTR dhandle;
4691 {
4692   struct ieee_handle info;
4693   asection *s;
4694   const char *err;
4695   struct ieee_buf *b;
4696
4697   memset (&info, 0, sizeof info);
4698   info.abfd = abfd;
4699   info.type_indx = 256;
4700   info.name_indx = 32;
4701
4702   if (! bfd_hash_table_init (&info.typedefs.root, ieee_name_type_newfunc)
4703       || ! bfd_hash_table_init (&info.tags.root, ieee_name_type_newfunc))
4704     return false;
4705
4706   if (! ieee_init_buffer (&info, &info.global_types)
4707       || ! ieee_init_buffer (&info, &info.data)
4708       || ! ieee_init_buffer (&info, &info.types)
4709       || ! ieee_init_buffer (&info, &info.vars)
4710       || ! ieee_init_buffer (&info, &info.cxx)
4711       || ! ieee_init_buffer (&info, &info.linenos)
4712       || ! ieee_init_buffer (&info, &info.fntype)
4713       || ! ieee_init_buffer (&info, &info.fnargs))
4714     return false;
4715
4716   if (! debug_write (dhandle, &ieee_fns, (PTR) &info))
4717     return false;
4718
4719   if (info.filename != NULL)
4720     {
4721       if (! ieee_finish_compilation_unit (&info))
4722         return false;
4723     }
4724
4725   /* Put any undefined tags in the global typedef information.  */
4726   info.error = false;
4727   ieee_name_type_hash_traverse (&info.tags,
4728                                 ieee_write_undefined_tag,
4729                                 (PTR) &info);
4730   if (info.error)
4731     return false;
4732
4733   /* Prepend the global typedef information to the other data.  */
4734   if (! ieee_buffer_emptyp (&info.global_types))
4735     {
4736       if (! ieee_change_buffer (&info, &info.global_types)
4737           || ! ieee_write_byte (&info, (int) ieee_be_record_enum))
4738         return false;
4739
4740       if (! ieee_append_buffer (&info, &info.global_types, &info.data))
4741         return false;
4742       info.data = info.global_types;
4743     }
4744
4745   /* Make sure that we have declare BB11 blocks for each range in the
4746      file.  They are added to info->vars.  */
4747   info.error = false;
4748   if (! ieee_init_buffer (&info, &info.vars))
4749     return false;
4750   bfd_map_over_sections (abfd, ieee_add_bb11_blocks, (PTR) &info);
4751   if (info.error)
4752     return false;
4753   if (! ieee_buffer_emptyp (&info.vars))
4754     {
4755       if (! ieee_change_buffer (&info, &info.vars)
4756           || ! ieee_write_byte (&info, (int) ieee_be_record_enum))
4757         return false;
4758
4759       if (! ieee_append_buffer (&info, &info.data, &info.vars))
4760         return false;
4761     }
4762
4763   /* Now all the data is in info.data.  Write it out to the BFD.  We
4764      normally would need to worry about whether all the other sections
4765      are set up yet, but the IEEE backend will handle this particular
4766      case correctly regardless.  */
4767   if (ieee_buffer_emptyp (&info.data))
4768     {
4769       /* There is no debugging information.  */
4770       return true;
4771     }
4772   err = NULL;
4773   s = bfd_make_section (abfd, ".debug");
4774   if (s == NULL)
4775     err = "bfd_make_section";
4776   if (err == NULL)
4777     {
4778       if (! bfd_set_section_flags (abfd, s, SEC_DEBUGGING | SEC_HAS_CONTENTS))
4779         err = "bfd_set_section_flags";
4780     }
4781   if (err == NULL)
4782     {
4783       bfd_size_type size;
4784
4785       size = 0;
4786       for (b = info.data.head; b != NULL; b = b->next)
4787         size += b->c;
4788       if (! bfd_set_section_size (abfd, s, size))
4789         err = "bfd_set_section_size";
4790     }
4791   if (err == NULL)
4792     {
4793       file_ptr offset;
4794
4795       offset = 0;
4796       for (b = info.data.head; b != NULL; b = b->next)
4797         {
4798           if (! bfd_set_section_contents (abfd, s, b->buf, offset, b->c))
4799             {
4800               err = "bfd_set_section_contents";
4801               break;
4802             }
4803           offset += b->c;
4804         }
4805     }
4806
4807   if (err != NULL)
4808     {
4809       fprintf (stderr, "%s: %s: %s\n", bfd_get_filename (abfd), err,
4810                bfd_errmsg (bfd_get_error ()));
4811       return false;
4812     }
4813
4814   bfd_hash_table_free (&info.typedefs.root);
4815   bfd_hash_table_free (&info.tags.root);
4816
4817   return true;
4818 }
4819
4820 /* Write out information for an undefined tag.  This is called via
4821    ieee_name_type_hash_traverse.  */
4822
4823 static boolean
4824 ieee_write_undefined_tag (h, p)
4825      struct ieee_name_type_hash_entry *h;
4826      PTR p;
4827 {
4828   struct ieee_handle *info = (struct ieee_handle *) p;
4829   struct ieee_name_type *nt;
4830
4831   for (nt = h->types; nt != NULL; nt = nt->next)
4832     {
4833       unsigned int name_indx;
4834       char code;
4835
4836       if (nt->kind == DEBUG_KIND_ILLEGAL)
4837         continue;
4838
4839       if (ieee_buffer_emptyp (&info->global_types))
4840         {
4841           if (! ieee_change_buffer (info, &info->global_types)
4842               || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4843               || ! ieee_write_byte (info, 2)
4844               || ! ieee_write_number (info, 0)
4845               || ! ieee_write_id (info, ""))
4846             {
4847               info->error = true;
4848               return false;
4849             }
4850         }
4851       else
4852         {
4853           if (! ieee_change_buffer (info, &info->global_types))
4854             {
4855               info->error = true;
4856               return false;
4857             }
4858         }
4859
4860       name_indx = info->name_indx;
4861       ++info->name_indx;
4862       if (! ieee_write_byte (info, (int) ieee_nn_record)
4863           || ! ieee_write_number (info, name_indx)
4864           || ! ieee_write_id (info, nt->type.name)
4865           || ! ieee_write_byte (info, (int) ieee_ty_record_enum)
4866           || ! ieee_write_number (info, nt->type.indx)
4867           || ! ieee_write_byte (info, 0xce)
4868           || ! ieee_write_number (info, name_indx))
4869         {
4870           info->error = true;
4871           return false;
4872         }
4873
4874       switch (nt->kind)
4875         {
4876         default:
4877           abort ();
4878           info->error = true;
4879           return false;
4880         case DEBUG_KIND_STRUCT:
4881         case DEBUG_KIND_CLASS:
4882           code = 'S';
4883           break;
4884         case DEBUG_KIND_UNION:
4885         case DEBUG_KIND_UNION_CLASS:
4886           code = 'U';
4887           break;
4888         case DEBUG_KIND_ENUM:
4889           code = 'E';
4890           break;
4891         }
4892       if (! ieee_write_number (info, code)
4893           || ! ieee_write_number (info, 0))
4894         {
4895           info->error = true;
4896           return false;
4897         }
4898     }
4899
4900   return true;
4901 }
4902
4903 /* Start writing out information for a compilation unit.  */
4904
4905 static boolean
4906 ieee_start_compilation_unit (p, filename)
4907      PTR p;
4908      const char *filename;
4909 {
4910   struct ieee_handle *info = (struct ieee_handle *) p;
4911   const char *modname;
4912   char *c, *s;
4913   unsigned int nindx;
4914
4915   if (info->filename != NULL)
4916     {
4917       if (! ieee_finish_compilation_unit (info))
4918         return false;
4919     }
4920
4921   info->filename = filename;
4922   modname = strrchr (filename, '/');
4923   if (modname != NULL)
4924     ++modname;
4925   else
4926     {
4927       modname = strrchr (filename, '\\');
4928       if (modname != NULL)
4929         ++modname;
4930       else
4931         modname = filename;
4932     }
4933   c = xstrdup (modname);
4934   s = strrchr (c, '.');
4935   if (s != NULL)
4936     *s = '\0';
4937   info->modname = c;
4938
4939   if (! ieee_init_buffer (info, &info->types)
4940       || ! ieee_init_buffer (info, &info->vars)
4941       || ! ieee_init_buffer (info, &info->cxx)
4942       || ! ieee_init_buffer (info, &info->linenos))
4943     return false;
4944   info->ranges = NULL;
4945
4946   /* Always include a BB1 and a BB3 block.  That is what the output of
4947      the MRI linker seems to look like.  */
4948   if (! ieee_change_buffer (info, &info->types)
4949       || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4950       || ! ieee_write_byte (info, 1)
4951       || ! ieee_write_number (info, 0)
4952       || ! ieee_write_id (info, info->modname))
4953     return false;
4954
4955   nindx = info->name_indx;
4956   ++info->name_indx;
4957   if (! ieee_change_buffer (info, &info->vars)
4958       || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4959       || ! ieee_write_byte (info, 3)
4960       || ! ieee_write_number (info, 0)
4961       || ! ieee_write_id (info, info->modname))
4962     return false;
4963
4964   return true;
4965 }
4966
4967 /* Finish up a compilation unit.  */
4968
4969 static boolean
4970 ieee_finish_compilation_unit (info)
4971      struct ieee_handle *info;
4972 {
4973   struct ieee_range *r;
4974
4975   if (! ieee_buffer_emptyp (&info->types))
4976     {
4977       if (! ieee_change_buffer (info, &info->types)
4978           || ! ieee_write_byte (info, (int) ieee_be_record_enum))
4979         return false;
4980     }
4981
4982   if (! ieee_buffer_emptyp (&info->cxx))
4983     {
4984       /* Append any C++ information to the global function and
4985          variable information.  */
4986       assert (! ieee_buffer_emptyp (&info->vars));
4987       if (! ieee_change_buffer (info, &info->vars))
4988         return false;
4989
4990       /* We put the pmisc records in a dummy procedure, just as the
4991          MRI compiler does.  */
4992       if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
4993           || ! ieee_write_byte (info, 6)
4994           || ! ieee_write_number (info, 0)
4995           || ! ieee_write_id (info, "__XRYCPP")
4996           || ! ieee_write_number (info, 0)
4997           || ! ieee_write_number (info, 0)
4998           || ! ieee_write_number (info, info->highaddr - 1)
4999           || ! ieee_append_buffer (info, &info->vars, &info->cxx)
5000           || ! ieee_change_buffer (info, &info->vars)
5001           || ! ieee_write_byte (info, (int) ieee_be_record_enum)
5002           || ! ieee_write_number (info, info->highaddr - 1))
5003         return false;
5004     }
5005
5006   if (! ieee_buffer_emptyp (&info->vars))
5007     {
5008       if (! ieee_change_buffer (info, &info->vars)
5009           || ! ieee_write_byte (info, (int) ieee_be_record_enum))
5010         return false;
5011     }
5012
5013   if (info->pending_lineno_filename != NULL)
5014     {
5015       /* Force out the pending line number.  */
5016       if (! ieee_lineno ((PTR) info, (const char *) NULL, 0, (bfd_vma) -1))
5017         return false;
5018     }
5019   if (! ieee_buffer_emptyp (&info->linenos))
5020     {
5021       if (! ieee_change_buffer (info, &info->linenos)
5022           || ! ieee_write_byte (info, (int) ieee_be_record_enum))
5023         return false;
5024       if (strcmp (info->filename, info->lineno_filename) != 0)
5025         {
5026           /* We were not in the main file.  We just closed the
5027              included line number block, and now we must close the
5028              main line number block.  */
5029           if (! ieee_write_byte (info, (int) ieee_be_record_enum))
5030             return false;
5031         }
5032     }
5033
5034   if (! ieee_append_buffer (info, &info->data, &info->types)
5035       || ! ieee_append_buffer (info, &info->data, &info->vars)
5036       || ! ieee_append_buffer (info, &info->data, &info->linenos))
5037     return false;
5038
5039   /* Build BB10/BB11 blocks based on the ranges we recorded.  */
5040   if (! ieee_change_buffer (info, &info->data))
5041     return false;
5042
5043   if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
5044       || ! ieee_write_byte (info, 10)
5045       || ! ieee_write_number (info, 0)
5046       || ! ieee_write_id (info, info->modname)
5047       || ! ieee_write_id (info, "")
5048       || ! ieee_write_number (info, 0)
5049       || ! ieee_write_id (info, "GNU objcopy"))
5050     return false;
5051
5052   for (r = info->ranges; r != NULL; r = r->next)
5053     {
5054       bfd_vma low, high;
5055       asection *s;
5056       int kind;
5057
5058       low = r->low;
5059       high = r->high;
5060
5061       /* Find the section corresponding to this range.  */
5062       for (s = info->abfd->sections; s != NULL; s = s->next)
5063         {
5064           if (bfd_get_section_vma (info->abfd, s) <= low
5065               && high <= (bfd_get_section_vma (info->abfd, s)
5066                           + bfd_section_size (info->abfd, s)))
5067             break;
5068         }
5069
5070       if (s == NULL)
5071         {
5072           /* Just ignore this range.  */
5073           continue;
5074         }
5075
5076       /* Coalesce ranges if it seems reasonable.  */
5077       while (r->next != NULL
5078              && high + 64 >= r->next->low
5079              && (r->next->high
5080                  <= (bfd_get_section_vma (info->abfd, s)
5081                      + bfd_section_size (info->abfd, s))))
5082         {
5083           r = r->next;
5084           high = r->high;
5085         }
5086
5087       if ((s->flags & SEC_CODE) != 0)
5088         kind = 1;
5089       else if ((s->flags & SEC_READONLY) != 0)
5090         kind = 3;
5091       else
5092         kind = 2;
5093
5094       if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
5095           || ! ieee_write_byte (info, 11)
5096           || ! ieee_write_number (info, 0)
5097           || ! ieee_write_id (info, "")
5098           || ! ieee_write_number (info, kind)
5099           || ! ieee_write_number (info, s->index + IEEE_SECTION_NUMBER_BASE)
5100           || ! ieee_write_number (info, low)
5101           || ! ieee_write_byte (info, (int) ieee_be_record_enum)
5102           || ! ieee_write_number (info, high - low))
5103         return false;
5104
5105       /* Add this range to the list of global ranges.  */
5106       if (! ieee_add_range (info, true, low, high))
5107         return false;
5108     }
5109
5110   if (! ieee_write_byte (info, (int) ieee_be_record_enum))
5111     return false;
5112
5113   return true;
5114 }
5115
5116 /* Add BB11 blocks describing each range that we have not already
5117    described.  */
5118
5119 static void
5120 ieee_add_bb11_blocks (abfd, sec, data)
5121      bfd *abfd;
5122      asection *sec;
5123      PTR data;
5124 {
5125   struct ieee_handle *info = (struct ieee_handle *) data;
5126   bfd_vma low, high;
5127   struct ieee_range *r;
5128
5129   low = bfd_get_section_vma (abfd, sec);
5130   high = low + bfd_section_size (abfd, sec);
5131
5132   /* Find the first range at or after this section.  The ranges are
5133      sorted by address.  */
5134   for (r = info->global_ranges; r != NULL; r = r->next)
5135     if (r->high > low)
5136       break;
5137
5138   while (low < high)
5139     {
5140       if (r == NULL || r->low >= high)
5141         {
5142           if (! ieee_add_bb11 (info, sec, low, high))
5143             info->error = true;
5144           return;
5145         }
5146
5147       if (low < r->low)
5148         {
5149           if (! ieee_add_bb11 (info, sec, low, r->low))
5150             {
5151               info->error = true;
5152               return;
5153             }
5154         }
5155       low = r->high;
5156
5157       r = r->next;
5158     }
5159 }
5160
5161 /* Add a single BB11 block for a range.  We add it to info->vars.  */
5162
5163 static boolean
5164 ieee_add_bb11 (info, sec, low, high)
5165      struct ieee_handle *info;
5166      asection *sec;
5167      bfd_vma low;
5168      bfd_vma high;
5169 {
5170   int kind;
5171
5172   if (! ieee_buffer_emptyp (&info->vars))
5173     {
5174       if (! ieee_change_buffer (info, &info->vars))
5175         return false;
5176     }
5177   else
5178     {
5179       const char *filename, *modname;
5180       char *c, *s;
5181
5182       /* Start the enclosing BB10 block.  */
5183       filename = bfd_get_filename (info->abfd);
5184       modname = strrchr (filename, '/');
5185       if (modname != NULL)
5186         ++modname;
5187       else
5188         {
5189           modname = strrchr (filename, '\\');
5190           if (modname != NULL)
5191             ++modname;
5192           else
5193             modname = filename;
5194         }
5195       c = xstrdup (modname);
5196       s = strrchr (c, '.');
5197       if (s != NULL)
5198         *s = '\0';
5199
5200       if (! ieee_change_buffer (info, &info->vars)
5201           || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
5202           || ! ieee_write_byte (info, 10)
5203           || ! ieee_write_number (info, 0)
5204           || ! ieee_write_id (info, c)
5205           || ! ieee_write_id (info, "")
5206           || ! ieee_write_number (info, 0)
5207           || ! ieee_write_id (info, "GNU objcopy"))
5208         return false;
5209
5210       free (c);
5211     }
5212
5213   if ((sec->flags & SEC_CODE) != 0)
5214     kind = 1;
5215   else if ((sec->flags & SEC_READONLY) != 0)
5216     kind = 3;
5217   else
5218     kind = 2;
5219
5220   if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
5221       || ! ieee_write_byte (info, 11)
5222       || ! ieee_write_number (info, 0)
5223       || ! ieee_write_id (info, "")
5224       || ! ieee_write_number (info, kind)
5225       || ! ieee_write_number (info, sec->index + IEEE_SECTION_NUMBER_BASE)
5226       || ! ieee_write_number (info, low)
5227       || ! ieee_write_byte (info, (int) ieee_be_record_enum)
5228       || ! ieee_write_number (info, high - low))
5229     return false;
5230
5231   return true;
5232 }
5233
5234 /* Start recording information from a particular source file.  This is
5235    used to record which file defined which types, variables, etc.  It
5236    is not used for line numbers, since the lineno entry point passes
5237    down the file name anyhow.  IEEE debugging information doesn't seem
5238    to store this information anywhere.  */
5239
5240 /*ARGSUSED*/
5241 static boolean
5242 ieee_start_source (p, filename)
5243      PTR p;
5244      const char *filename;
5245 {
5246   return true;
5247 }
5248
5249 /* Make an empty type.  */
5250
5251 static boolean
5252 ieee_empty_type (p)
5253      PTR p;
5254 {
5255   struct ieee_handle *info = (struct ieee_handle *) p;
5256
5257   return ieee_push_type (info, (int) builtin_unknown, 0, false, false);
5258 }
5259
5260 /* Make a void type.  */
5261
5262 static boolean
5263 ieee_void_type (p)
5264      PTR p;
5265 {
5266   struct ieee_handle *info = (struct ieee_handle *) p;
5267
5268   return ieee_push_type (info, (int) builtin_void, 0, false, false);
5269 }
5270
5271 /* Make an integer type.  */
5272
5273 static boolean
5274 ieee_int_type (p, size, unsignedp)
5275      PTR p;
5276      unsigned int size;
5277      boolean unsignedp;
5278 {
5279   struct ieee_handle *info = (struct ieee_handle *) p;
5280   unsigned int indx;
5281
5282   switch (size)
5283     {
5284     case 1:
5285       indx = (int) builtin_signed_char;
5286       break;
5287     case 2:
5288       indx = (int) builtin_signed_short_int;
5289       break;
5290     case 4:
5291       indx = (int) builtin_signed_long;
5292       break;
5293     case 8:
5294       indx = (int) builtin_signed_long_long;
5295       break;
5296     default:
5297       fprintf (stderr, "IEEE unsupported integer type size %u\n", size);
5298       return false;
5299     }
5300
5301   if (unsignedp)
5302     ++indx;
5303
5304   return ieee_push_type (info, indx, size, unsignedp, false);
5305 }
5306
5307 /* Make a floating point type.  */
5308
5309 static boolean
5310 ieee_float_type (p, size)
5311      PTR p;
5312      unsigned int size;
5313 {
5314   struct ieee_handle *info = (struct ieee_handle *) p;
5315   unsigned int indx;
5316
5317   switch (size)
5318     {
5319     case 4:
5320       indx = (int) builtin_float;
5321       break;
5322     case 8:
5323       indx = (int) builtin_double;
5324       break;
5325     case 12:
5326       /* FIXME: This size really depends upon the processor.  */
5327       indx = (int) builtin_long_double;
5328       break;
5329     case 16:
5330       indx = (int) builtin_long_long_double;
5331       break;
5332     default:
5333       fprintf (stderr, "IEEE unsupported float type size %u\n", size);
5334       return false;
5335     }
5336
5337   return ieee_push_type (info, indx, size, false, false);
5338 }
5339
5340 /* Make a complex type.  */
5341
5342 static boolean
5343 ieee_complex_type (p, size)
5344      PTR p;
5345      unsigned int size;
5346 {
5347   struct ieee_handle *info = (struct ieee_handle *) p;
5348   char code;
5349
5350   switch (size)
5351     {
5352     case 4:
5353       if (info->complex_float_index != 0)
5354         return ieee_push_type (info, info->complex_float_index, size * 2,
5355                                false, false);
5356       code = 'c';
5357       break;
5358     case 12:
5359     case 16:
5360       /* These cases can be output by gcc -gstabs.  Outputting the
5361          wrong type is better than crashing.  */
5362     case 8:
5363       if (info->complex_double_index != 0)
5364         return ieee_push_type (info, info->complex_double_index, size * 2,
5365                                false, false);
5366       code = 'd';
5367       break;
5368     default:
5369       fprintf (stderr, "IEEE unsupported complex type size %u\n", size);
5370       return false;
5371     }
5372
5373   /* FIXME: I don't know what the string is for.  */
5374   if (! ieee_define_type (info, size * 2, false, false)
5375       || ! ieee_write_number (info, code)
5376       || ! ieee_write_id (info, ""))
5377     return false;
5378
5379   if (size == 4)
5380     info->complex_float_index = info->type_stack->type.indx;
5381   else
5382     info->complex_double_index = info->type_stack->type.indx;
5383
5384   return true;
5385 }
5386
5387 /* Make a boolean type.  IEEE doesn't support these, so we just make
5388    an integer type instead.  */
5389
5390 static boolean
5391 ieee_bool_type (p, size)
5392      PTR p;
5393      unsigned int size;
5394 {
5395   return ieee_int_type (p, size, true);
5396 }
5397
5398 /* Make an enumeration.  */
5399
5400 static boolean
5401 ieee_enum_type (p, tag, names, vals)
5402      PTR p;
5403      const char *tag;
5404      const char **names;
5405      bfd_signed_vma *vals;
5406 {
5407   struct ieee_handle *info = (struct ieee_handle *) p;
5408   struct ieee_defined_enum *e;
5409   boolean localp, simple;
5410   int i;
5411
5412   localp = false;
5413   for (e = info->enums; e != NULL; e = e->next)
5414     {
5415       if (tag == NULL)
5416         {
5417           if (e->tag != NULL)
5418             continue;
5419         }
5420       else
5421         {
5422           if (e->tag == NULL
5423               || tag[0] != e->tag[0]
5424               || strcmp (tag, e->tag) != 0)
5425             continue;
5426         }
5427
5428       if (names != NULL && e->names != NULL)
5429         {
5430           for (i = 0; names[i] != NULL && e->names[i] != NULL; i++)
5431             {
5432               if (names[i][0] != e->names[i][0]
5433                   || vals[i] != e->vals[i]
5434                   || strcmp (names[i], e->names[i]) != 0)
5435                 break;
5436             }
5437         }
5438
5439       if ((names == NULL && e->names == NULL)
5440           || (names != NULL
5441               && e->names != NULL
5442               && names[i] == NULL
5443               && e->names[i] == NULL))
5444         {
5445           /* We've seen this enum before.  */
5446           return ieee_push_type (info, e->indx, 0, true, false);
5447         }
5448
5449       if (tag != NULL)
5450         {
5451           /* We've already seen an enum of the same name, so we must make
5452              sure to output this one locally.  */
5453           localp = true;
5454           break;
5455         }
5456     }
5457
5458   /* If this is a simple enumeration, in which the values start at 0
5459      and always increment by 1, we can use type E.  Otherwise we must
5460      use type N.  */
5461
5462   simple = true;
5463   if (names != NULL)
5464     {
5465       for (i = 0; names[i] != NULL; i++)
5466         {
5467           if (vals[i] != i)
5468             {
5469               simple = false;
5470               break;
5471             }
5472         }
5473     }
5474
5475   if (! ieee_define_named_type (info, tag, (unsigned int) -1, 0,
5476                                 true, localp, (struct ieee_buflist *) NULL)
5477       || ! ieee_write_number (info, simple ? 'E' : 'N'))
5478     return false;
5479   if (simple)
5480     {
5481       /* FIXME: This is supposed to be the enumeration size, but we
5482          don't store that.  */
5483       if (! ieee_write_number (info, 4))
5484         return false;
5485     }
5486   if (names != NULL)
5487     {
5488       for (i = 0; names[i] != NULL; i++)
5489         {
5490           if (! ieee_write_id (info, names[i]))
5491             return false;
5492           if (! simple)
5493             {
5494               if (! ieee_write_number (info, vals[i]))
5495                 return false;
5496             }
5497         }
5498     }
5499
5500   if (! localp)
5501     {
5502       e = (struct ieee_defined_enum *) xmalloc (sizeof *e);
5503       memset (e, 0, sizeof *e);
5504
5505       e->indx = info->type_stack->type.indx;
5506       e->tag = tag;
5507       e->names = names;
5508       e->vals = vals;
5509
5510       e->next = info->enums;
5511       info->enums = e;
5512     }
5513
5514   return true;
5515 }
5516
5517 /* Make a pointer type.  The HP debugger seems to sometimes get
5518  confused by global pointers to global pointers.  Therefore, we mark
5519  all pointers as reflocalp, so that references to global pointers are
5520  forced to be local.  This is probably less efficient than possible.  */
5521
5522 static boolean
5523 ieee_pointer_type (p)
5524      PTR p;
5525 {
5526   struct ieee_handle *info = (struct ieee_handle *) p;
5527   boolean localp;
5528   unsigned int indx;
5529   struct ieee_modified_type *m = NULL;
5530
5531   localp = info->type_stack->type.localp || info->type_stack->type.reflocalp;
5532   indx = ieee_pop_type (info);
5533
5534   /* A pointer to a simple builtin type can be obtained by adding 32.
5535      FIXME: Will this be a short pointer, and will that matter?  */
5536   if (indx < 32)
5537     {
5538       if (! ieee_push_type (info, indx + 32, 0, true, false))
5539         return false;
5540       /* I don't think we need to set reflocalp for this case.  */
5541       return true;
5542     }
5543
5544   if (! localp)
5545     {
5546       m = ieee_get_modified_info (p, indx);
5547       if (m == NULL)
5548         return false;
5549
5550       /* FIXME: The size should depend upon the architecture.  */
5551       if (m->pointer > 0)
5552         {
5553           if (! ieee_push_type (info, m->pointer, 4, true, false))
5554             return false;
5555           info->type_stack->type.reflocalp = true;
5556           return true;
5557         }
5558     }
5559
5560   if (! ieee_define_type (info, 4, true, localp)
5561       || ! ieee_write_number (info, 'P')
5562       || ! ieee_write_number (info, indx))
5563     return false;
5564
5565   if (! localp)
5566     m->pointer = info->type_stack->type.indx;
5567
5568   info->type_stack->type.reflocalp = true;
5569
5570   return true;
5571 }
5572
5573 /* Make a function type.  This will be called for a method, but we
5574    don't want to actually add it to the type table in that case.  We
5575    handle this by defining the type in a private buffer, and only
5576    adding that buffer to the typedef block if we are going to use it.  */
5577
5578 static boolean
5579 ieee_function_type (p, argcount, varargs)
5580      PTR p;
5581      int argcount;
5582      boolean varargs;
5583 {
5584   struct ieee_handle *info = (struct ieee_handle *) p;
5585   boolean localp;
5586   unsigned int *args = NULL;
5587   int i;
5588   unsigned int retindx;
5589   struct ieee_buflist fndef;
5590   struct ieee_modified_type *m;
5591
5592   localp = false;
5593
5594   if (argcount > 0)
5595     {
5596       args = (unsigned int *) xmalloc (argcount * sizeof *args);
5597       for (i = argcount - 1; i >= 0; i--)
5598         {
5599           if (info->type_stack->type.localp
5600               || info->type_stack->type.reflocalp)
5601             localp = true;
5602           args[i] = ieee_pop_type (info);
5603         }
5604     }
5605   else if (argcount < 0)
5606     varargs = false;
5607
5608   if (info->type_stack->type.localp || info->type_stack->type.reflocalp)
5609     localp = true;
5610   retindx = ieee_pop_type (info);
5611
5612   m = NULL;
5613   if (argcount < 0 && ! localp)
5614     {
5615       m = ieee_get_modified_info (p, retindx);
5616       if (m == NULL)
5617         return false;
5618
5619       if (m->function > 0)
5620         return ieee_push_type (info, m->function, 0, true, false);
5621     }
5622
5623   /* An attribute of 0x41 means that the frame and push mask are
5624      unknown.  */
5625   if (! ieee_init_buffer (info, &fndef)
5626       || ! ieee_define_named_type (info, (const char *) NULL,
5627                                    (unsigned int) -1, 0, true, localp,
5628                                    &fndef)
5629       || ! ieee_write_number (info, 'x')
5630       || ! ieee_write_number (info, 0x41)
5631       || ! ieee_write_number (info, 0)
5632       || ! ieee_write_number (info, 0)
5633       || ! ieee_write_number (info, retindx)
5634       || ! ieee_write_number (info, (bfd_vma) argcount + (varargs ? 1 : 0)))
5635     return false;
5636   if (argcount > 0)
5637     {
5638       for (i = 0; i < argcount; i++)
5639         if (! ieee_write_number (info, args[i]))
5640           return false;
5641       free (args);
5642     }
5643   if (varargs)
5644     {
5645       /* A varargs function is represented by writing out the last
5646          argument as type void *, although this makes little sense.  */
5647       if (! ieee_write_number (info, (bfd_vma) builtin_void + 32))
5648         return false;
5649     }
5650
5651   if (! ieee_write_number (info, 0))
5652     return false;
5653
5654   /* We wrote the information into fndef, in case we don't need it.
5655      It will be appended to info->types by ieee_pop_type.  */
5656   info->type_stack->type.fndef = fndef;
5657
5658   if (m != NULL)
5659     m->function = info->type_stack->type.indx;
5660
5661   return true;
5662 }
5663
5664 /* Make a reference type.  */
5665
5666 static boolean
5667 ieee_reference_type (p)
5668      PTR p;
5669 {
5670   struct ieee_handle *info = (struct ieee_handle *) p;
5671
5672   /* IEEE appears to record a normal pointer type, and then use a
5673      pmisc record to indicate that it is really a reference.  */
5674
5675   if (! ieee_pointer_type (p))
5676     return false;
5677   info->type_stack->type.referencep = true;
5678   return true;
5679 }
5680
5681 /* Make a range type.  */
5682
5683 static boolean
5684 ieee_range_type (p, low, high)
5685      PTR p;
5686      bfd_signed_vma low;
5687      bfd_signed_vma high;
5688 {
5689   struct ieee_handle *info = (struct ieee_handle *) p;
5690   unsigned int size;
5691   boolean unsignedp, localp;
5692
5693   size = info->type_stack->type.size;
5694   unsignedp = info->type_stack->type.unsignedp;
5695   localp = info->type_stack->type.localp || info->type_stack->type.reflocalp;
5696   ieee_pop_unused_type (info);
5697   return (ieee_define_type (info, size, unsignedp, localp)
5698           && ieee_write_number (info, 'R')
5699           && ieee_write_number (info, (bfd_vma) low)
5700           && ieee_write_number (info, (bfd_vma) high)
5701           && ieee_write_number (info, unsignedp ? 0 : 1)
5702           && ieee_write_number (info, size));
5703 }
5704
5705 /* Make an array type.  */
5706
5707 /*ARGSUSED*/
5708 static boolean
5709 ieee_array_type (p, low, high, stringp)
5710      PTR p;
5711      bfd_signed_vma low;
5712      bfd_signed_vma high;
5713      boolean stringp;
5714 {
5715   struct ieee_handle *info = (struct ieee_handle *) p;
5716   unsigned int eleindx;
5717   boolean localp;
5718   struct ieee_modified_type *m = NULL;
5719   struct ieee_modified_array_type *a;
5720
5721   /* IEEE does not store the range, so we just ignore it.  */
5722   ieee_pop_unused_type (info);
5723   localp = info->type_stack->type.localp || info->type_stack->type.reflocalp;
5724   eleindx = ieee_pop_type (info);
5725
5726   if (! localp)
5727     {
5728       m = ieee_get_modified_info (info, eleindx);
5729       if (m == NULL)
5730         return false;
5731
5732       for (a = m->arrays; a != NULL; a = a->next)
5733         {
5734           if (a->low == low && a->high == high)
5735             return ieee_push_type (info, a->indx, 0, false, false);
5736         }
5737     }
5738
5739   if (! ieee_define_type (info, 0, false, localp)
5740       || ! ieee_write_number (info, low == 0 ? 'Z' : 'C')
5741       || ! ieee_write_number (info, eleindx))
5742     return false;
5743   if (low != 0)
5744     {
5745       if (! ieee_write_number (info, low))
5746         return false;
5747     }
5748
5749   if (! ieee_write_number (info, high + 1))
5750     return false;
5751
5752   if (! localp)
5753     {
5754       a = (struct ieee_modified_array_type *) xmalloc (sizeof *a);
5755       memset (a, 0, sizeof *a);
5756
5757       a->indx = info->type_stack->type.indx;
5758       a->low = low;
5759       a->high = high;
5760
5761       a->next = m->arrays;
5762       m->arrays = a;
5763     }
5764
5765   return true;
5766 }
5767
5768 /* Make a set type.  */
5769
5770 static boolean
5771 ieee_set_type (p, bitstringp)
5772      PTR p;
5773      boolean bitstringp;
5774 {
5775   struct ieee_handle *info = (struct ieee_handle *) p;
5776   boolean localp;
5777   unsigned int eleindx;
5778
5779   localp = info->type_stack->type.localp || info->type_stack->type.reflocalp;
5780   eleindx = ieee_pop_type (info);
5781
5782   /* FIXME: We don't know the size, so we just use 4.  */
5783
5784   return (ieee_define_type (info, 0, true, localp)
5785           && ieee_write_number (info, 's')
5786           && ieee_write_number (info, 4)
5787           && ieee_write_number (info, eleindx));
5788 }
5789
5790 /* Make an offset type.  */
5791
5792 static boolean
5793 ieee_offset_type (p)
5794      PTR p;
5795 {
5796   struct ieee_handle *info = (struct ieee_handle *) p;
5797   unsigned int targetindx, baseindx;
5798
5799   targetindx = ieee_pop_type (info);
5800   baseindx = ieee_pop_type (info);
5801
5802   /* FIXME: The MRI C++ compiler does not appear to generate any
5803      useful type information about an offset type.  It just records a
5804      pointer to member as an integer.  The MRI/HP IEEE spec does
5805      describe a pmisc record which can be used for a pointer to
5806      member.  Unfortunately, it does not describe the target type,
5807      which seems pretty important.  I'm going to punt this for now.  */
5808
5809   return ieee_int_type (p, 4, true);
5810 }  
5811
5812 /* Make a method type.  */
5813
5814 static boolean
5815 ieee_method_type (p, domain, argcount, varargs)
5816      PTR p;
5817      boolean domain;
5818      int argcount;
5819      boolean varargs;
5820 {
5821   struct ieee_handle *info = (struct ieee_handle *) p;
5822
5823   /* FIXME: The MRI/HP IEEE spec defines a pmisc record to use for a
5824      method, but the definition is incomplete.  We just output an 'x'
5825      type.  */
5826
5827   if (domain)
5828     ieee_pop_unused_type (info);
5829
5830   return ieee_function_type (p, argcount, varargs);
5831 }
5832
5833 /* Make a const qualified type.  */
5834
5835 static boolean
5836 ieee_const_type (p)
5837      PTR p;
5838 {
5839   struct ieee_handle *info = (struct ieee_handle *) p;
5840   unsigned int size;
5841   boolean unsignedp, localp;
5842   unsigned int indx;
5843   struct ieee_modified_type *m = NULL;
5844
5845   size = info->type_stack->type.size;
5846   unsignedp = info->type_stack->type.unsignedp;
5847   localp = info->type_stack->type.localp || info->type_stack->type.reflocalp;
5848   indx = ieee_pop_type (info);
5849
5850   if (! localp)
5851     {
5852       m = ieee_get_modified_info (info, indx);
5853       if (m == NULL)
5854         return false;
5855
5856       if (m->const_qualified > 0)
5857         return ieee_push_type (info, m->const_qualified, size, unsignedp,
5858                                false);
5859     }
5860
5861   if (! ieee_define_type (info, size, unsignedp, localp)
5862       || ! ieee_write_number (info, 'n')
5863       || ! ieee_write_number (info, 1)
5864       || ! ieee_write_number (info, indx))
5865     return false;
5866
5867   if (! localp)
5868     m->const_qualified = info->type_stack->type.indx;
5869
5870   return true;
5871 }
5872
5873 /* Make a volatile qualified type.  */
5874
5875 static boolean
5876 ieee_volatile_type (p)
5877      PTR p;
5878 {
5879   struct ieee_handle *info = (struct ieee_handle *) p;
5880   unsigned int size;
5881   boolean unsignedp, localp;
5882   unsigned int indx;
5883   struct ieee_modified_type *m = NULL;
5884
5885   size = info->type_stack->type.size;
5886   unsignedp = info->type_stack->type.unsignedp;
5887   localp = info->type_stack->type.localp || info->type_stack->type.reflocalp;
5888   indx = ieee_pop_type (info);
5889
5890   if (! localp)
5891     {
5892       m = ieee_get_modified_info (info, indx);
5893       if (m == NULL)
5894         return false;
5895
5896       if (m->volatile_qualified > 0)
5897         return ieee_push_type (info, m->volatile_qualified, size, unsignedp,
5898                                false);
5899     }
5900
5901   if (! ieee_define_type (info, size, unsignedp, localp)
5902       || ! ieee_write_number (info, 'n')
5903       || ! ieee_write_number (info, 2)
5904       || ! ieee_write_number (info, indx))
5905     return false;
5906
5907   if (! localp)
5908     m->volatile_qualified = info->type_stack->type.indx;
5909
5910   return true;
5911 }
5912
5913 /* Convert an enum debug_visibility into a CXXFLAGS value.  */
5914
5915 static unsigned int
5916 ieee_vis_to_flags (visibility)
5917      enum debug_visibility visibility;
5918 {
5919   switch (visibility)
5920     {
5921     default:
5922       abort ();
5923     case DEBUG_VISIBILITY_PUBLIC:
5924       return CXXFLAGS_VISIBILITY_PUBLIC;
5925     case DEBUG_VISIBILITY_PRIVATE:
5926       return CXXFLAGS_VISIBILITY_PRIVATE;
5927     case DEBUG_VISIBILITY_PROTECTED:
5928       return CXXFLAGS_VISIBILITY_PROTECTED;
5929     }
5930   /*NOTREACHED*/
5931 }
5932
5933 /* Start defining a struct type.  We build it in the strdef field on
5934    the stack, to avoid confusing type definitions required by the
5935    fields with the struct type itself.  */
5936
5937 static boolean
5938 ieee_start_struct_type (p, tag, id, structp, size)
5939      PTR p;
5940      const char *tag;
5941      unsigned int id;
5942      boolean structp;
5943      unsigned int size;
5944 {
5945   struct ieee_handle *info = (struct ieee_handle *) p;
5946   boolean localp, ignorep;
5947   boolean copy;
5948   char ab[20];
5949   const char *look;
5950   struct ieee_name_type_hash_entry *h;
5951   struct ieee_name_type *nt, *ntlook;
5952   struct ieee_buflist strdef;
5953
5954   localp = false;
5955   ignorep = false;
5956
5957   /* We need to create a tag for internal use even if we don't want
5958      one for external use.  This will let us refer to an anonymous
5959      struct.  */
5960   if (tag != NULL)
5961     {
5962       look = tag;
5963       copy = false;
5964     }
5965   else
5966     {
5967       sprintf (ab, "__anon%u", id);
5968       look = ab;
5969       copy = true;
5970     }
5971
5972   /* If we already have references to the tag, we must use the
5973      existing type index.  */
5974   h = ieee_name_type_hash_lookup (&info->tags, look, true, copy);
5975   if (h == NULL)
5976     return false;
5977
5978   nt = NULL;
5979   for (ntlook = h->types; ntlook != NULL; ntlook = ntlook->next)
5980     {
5981       if (ntlook->id == id)
5982         nt = ntlook;
5983       else if (! ntlook->type.localp)
5984         {
5985           /* We are creating a duplicate definition of a globally
5986              defined tag.  Force it to be local to avoid
5987              confusion.  */
5988           localp = true;
5989         }
5990     }
5991
5992   if (nt != NULL)
5993     {
5994       assert (localp == nt->type.localp);
5995       if (nt->kind == DEBUG_KIND_ILLEGAL && ! localp)
5996         {
5997           /* We've already seen a global definition of the type.
5998              Ignore this new definition.  */
5999           ignorep = true;
6000         }
6001     }
6002   else
6003     {
6004       nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
6005       memset (nt, 0, sizeof *nt);
6006       nt->id = id;
6007       nt->type.name = h->root.string;
6008       nt->next = h->types;
6009       h->types = nt;
6010       nt->type.indx = info->type_indx;
6011       ++info->type_indx;
6012     }
6013
6014   nt->kind = DEBUG_KIND_ILLEGAL;
6015
6016   if (! ieee_init_buffer (info, &strdef)
6017       || ! ieee_define_named_type (info, tag, nt->type.indx, size, true,
6018                                    localp, &strdef)
6019       || ! ieee_write_number (info, structp ? 'S' : 'U')
6020       || ! ieee_write_number (info, size))
6021     return false;
6022
6023   if (! ignorep)
6024     {
6025       const char *hold;
6026
6027       /* We never want nt->type.name to be NULL.  We want the rest of
6028          the type to be the object set up on the type stack; it will
6029          have a NULL name if tag is NULL.  */
6030       hold = nt->type.name;
6031       nt->type = info->type_stack->type;
6032       nt->type.name = hold;
6033     }
6034
6035   info->type_stack->type.name = tag;
6036   info->type_stack->type.strdef = strdef;
6037   info->type_stack->type.ignorep = ignorep;
6038
6039   return true;
6040 }
6041
6042 /* Add a field to a struct.  */
6043
6044 static boolean
6045 ieee_struct_field (p, name, bitpos, bitsize, visibility)
6046      PTR p;
6047      const char *name;
6048      bfd_vma bitpos;
6049      bfd_vma bitsize;
6050      enum debug_visibility visibility;
6051 {
6052   struct ieee_handle *info = (struct ieee_handle *) p;
6053   unsigned int size;
6054   boolean unsignedp;
6055   boolean referencep;
6056   boolean localp;
6057   unsigned int indx;
6058   bfd_vma offset;
6059
6060   assert (info->type_stack != NULL
6061           && info->type_stack->next != NULL
6062           && ! ieee_buffer_emptyp (&info->type_stack->next->type.strdef));
6063
6064   /* If we are ignoring this struct definition, just pop and ignore
6065      the type.  */
6066   if (info->type_stack->next->type.ignorep)
6067     {
6068       ieee_pop_unused_type (info);
6069       return true;
6070     }
6071
6072   size = info->type_stack->type.size;
6073   unsignedp = info->type_stack->type.unsignedp;
6074   referencep = info->type_stack->type.referencep;
6075   localp = info->type_stack->type.localp || info->type_stack->type.reflocalp;
6076   indx = ieee_pop_type (info);
6077
6078   if (localp)
6079     info->type_stack->type.localp = true;
6080
6081   if (info->type_stack->type.classdef != NULL)
6082     {
6083       unsigned int flags;
6084       unsigned int nindx;
6085
6086       /* This is a class.  We must add a description of this field to
6087          the class records we are building.  */
6088
6089       flags = ieee_vis_to_flags (visibility);
6090       nindx = info->type_stack->type.classdef->indx;
6091       if (! ieee_change_buffer (info,
6092                                 &info->type_stack->type.classdef->pmiscbuf)
6093           || ! ieee_write_asn (info, nindx, 'd')
6094           || ! ieee_write_asn (info, nindx, flags)
6095           || ! ieee_write_atn65 (info, nindx, name)
6096           || ! ieee_write_atn65 (info, nindx, name))
6097         return false;
6098       info->type_stack->type.classdef->pmisccount += 4;
6099
6100       if (referencep)
6101         {
6102           unsigned int nindx;
6103
6104           /* We need to output a record recording that this field is
6105              really of reference type.  We put this on the refs field
6106              of classdef, so that it can be appended to the C++
6107              records after the class is defined.  */
6108
6109           nindx = info->name_indx;
6110           ++info->name_indx;
6111
6112           if (! ieee_change_buffer (info,
6113                                     &info->type_stack->type.classdef->refs)
6114               || ! ieee_write_byte (info, (int) ieee_nn_record)
6115               || ! ieee_write_number (info, nindx)
6116               || ! ieee_write_id (info, "")
6117               || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
6118               || ! ieee_write_number (info, nindx)
6119               || ! ieee_write_number (info, 0)
6120               || ! ieee_write_number (info, 62)
6121               || ! ieee_write_number (info, 80)
6122               || ! ieee_write_number (info, 4)
6123               || ! ieee_write_asn (info, nindx, 'R')
6124               || ! ieee_write_asn (info, nindx, 3)
6125               || ! ieee_write_atn65 (info, nindx, info->type_stack->type.name)
6126               || ! ieee_write_atn65 (info, nindx, name))
6127             return false;
6128         }
6129     }
6130
6131   /* If the bitsize doesn't match the expected size, we need to output
6132      a bitfield type.  */
6133   if (size == 0 || bitsize == 0 || bitsize == size * 8)
6134     offset = bitpos / 8;
6135   else
6136     {
6137       if (! ieee_define_type (info, 0, unsignedp,
6138                               info->type_stack->type.localp)
6139           || ! ieee_write_number (info, 'g')
6140           || ! ieee_write_number (info, unsignedp ? 0 : 1)
6141           || ! ieee_write_number (info, bitsize)
6142           || ! ieee_write_number (info, indx))
6143         return false;
6144       indx = ieee_pop_type (info);
6145       offset = bitpos;
6146     }
6147
6148   /* Switch to the struct we are building in order to output this
6149      field definition.  */
6150   return (ieee_change_buffer (info, &info->type_stack->type.strdef)
6151           && ieee_write_id (info, name)
6152           && ieee_write_number (info, indx)
6153           && ieee_write_number (info, offset));
6154 }
6155
6156 /* Finish up a struct type.  */
6157
6158 static boolean
6159 ieee_end_struct_type (p)
6160      PTR p;
6161 {
6162   struct ieee_handle *info = (struct ieee_handle *) p;
6163   struct ieee_buflist *pb;
6164
6165   assert (info->type_stack != NULL
6166           && ! ieee_buffer_emptyp (&info->type_stack->type.strdef));
6167
6168   /* If we were ignoring this struct definition because it was a
6169      duplicate defintion, just through away whatever bytes we have
6170      accumulated.  Leave the type on the stack. */
6171   if (info->type_stack->type.ignorep)
6172     return true;
6173
6174   /* If this is not a duplicate definition of this tag, then localp
6175      will be false, and we can put it in the global type block.
6176      FIXME: We should avoid outputting duplicate definitions which are
6177      the same.  */
6178   if (! info->type_stack->type.localp)
6179     {
6180       /* Make sure we have started the global type block.  */
6181       if (ieee_buffer_emptyp (&info->global_types))
6182         {
6183           if (! ieee_change_buffer (info, &info->global_types)
6184               || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
6185               || ! ieee_write_byte (info, 2)
6186               || ! ieee_write_number (info, 0)
6187               || ! ieee_write_id (info, ""))
6188             return false;
6189         }
6190       pb = &info->global_types;
6191     }
6192   else
6193     {
6194       /* Make sure we have started the types block.  */
6195       if (ieee_buffer_emptyp (&info->types))
6196         {
6197           if (! ieee_change_buffer (info, &info->types)
6198               || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
6199               || ! ieee_write_byte (info, 1)
6200               || ! ieee_write_number (info, 0)
6201               || ! ieee_write_id (info, info->modname))
6202             return false;
6203         }
6204       pb = &info->types;
6205     }
6206
6207   /* Append the struct definition to the types.  */
6208   if (! ieee_append_buffer (info, pb, &info->type_stack->type.strdef)
6209       || ! ieee_init_buffer (info, &info->type_stack->type.strdef))
6210     return false;
6211
6212   /* Leave the struct on the type stack.  */
6213
6214   return true;
6215 }
6216
6217 /* Start a class type.  */
6218
6219 static boolean
6220 ieee_start_class_type (p, tag, id, structp, size, vptr, ownvptr)
6221      PTR p;
6222      const char *tag;
6223      unsigned int id;
6224      boolean structp;
6225      unsigned int size;
6226      boolean vptr;
6227      boolean ownvptr;
6228 {
6229   struct ieee_handle *info = (struct ieee_handle *) p;
6230   const char *vclass;
6231   struct ieee_buflist pmiscbuf;
6232   unsigned int indx;
6233   struct ieee_type_class *classdef;
6234
6235   /* A C++ class is output as a C++ struct along with a set of pmisc
6236      records describing the class.  */
6237
6238   /* We need to have a name so that we can associate the struct and
6239      the class.  */
6240   if (tag == NULL)
6241     {
6242       char *t;
6243
6244       t = (char *) xmalloc (20);
6245       sprintf (t, "__anon%u", id);
6246       tag = t;
6247     }
6248
6249   /* We can't write out the virtual table information until we have
6250      finished the class, because we don't know the virtual table size.
6251      We get the size from the largest voffset we see.  */
6252   vclass = NULL;
6253   if (vptr && ! ownvptr)
6254     {
6255       vclass = info->type_stack->type.name;
6256       assert (vclass != NULL);
6257       /* We don't call ieee_pop_unused_type, since the class should
6258          get defined.  */
6259       (void) ieee_pop_type (info);
6260     }
6261
6262   if (! ieee_start_struct_type (p, tag, id, structp, size))
6263     return false;
6264
6265   indx = info->name_indx;
6266   ++info->name_indx;
6267
6268   /* We write out pmisc records into the classdef field.  We will
6269      write out the pmisc start after we know the number of records we
6270      need.  */
6271   if (! ieee_init_buffer (info, &pmiscbuf)
6272       || ! ieee_change_buffer (info, &pmiscbuf)
6273       || ! ieee_write_asn (info, indx, 'T')
6274       || ! ieee_write_asn (info, indx, structp ? 'o' : 'u')
6275       || ! ieee_write_atn65 (info, indx, tag))
6276     return false;
6277
6278   classdef = (struct ieee_type_class *) xmalloc (sizeof *classdef);
6279   memset (classdef, 0, sizeof *classdef);
6280
6281   classdef->indx = indx;
6282   classdef->pmiscbuf = pmiscbuf;
6283   classdef->pmisccount = 3;
6284   classdef->vclass = vclass;
6285   classdef->ownvptr = ownvptr;
6286
6287   info->type_stack->type.classdef = classdef;
6288
6289   return true;
6290 }
6291
6292 /* Add a static member to a class.  */
6293
6294 static boolean
6295 ieee_class_static_member (p, name, physname, visibility)
6296      PTR p;
6297      const char *name;
6298      const char *physname;
6299      enum debug_visibility visibility;
6300 {
6301   struct ieee_handle *info = (struct ieee_handle *) p;
6302   unsigned int flags;
6303   unsigned int nindx;
6304
6305   /* We don't care about the type.  Hopefully there will be a call to
6306      ieee_variable declaring the physical name and the type, since
6307      that is where an IEEE consumer must get the type.  */
6308   ieee_pop_unused_type (info);
6309
6310   assert (info->type_stack != NULL
6311           && info->type_stack->type.classdef != NULL);
6312
6313   flags = ieee_vis_to_flags (visibility);
6314   flags |= CXXFLAGS_STATIC;
6315
6316   nindx = info->type_stack->type.classdef->indx;
6317
6318   if (! ieee_change_buffer (info, &info->type_stack->type.classdef->pmiscbuf)
6319       || ! ieee_write_asn (info, nindx, 'd')
6320       || ! ieee_write_asn (info, nindx, flags)
6321       || ! ieee_write_atn65 (info, nindx, name)
6322       || ! ieee_write_atn65 (info, nindx, physname))
6323     return false;
6324   info->type_stack->type.classdef->pmisccount += 4;
6325
6326   return true;
6327 }
6328
6329 /* Add a base class to a class.  */
6330
6331 static boolean
6332 ieee_class_baseclass (p, bitpos, virtual, visibility)
6333      PTR p;
6334      bfd_vma bitpos;
6335      boolean virtual;
6336      enum debug_visibility visibility;
6337 {
6338   struct ieee_handle *info = (struct ieee_handle *) p;
6339   const char *bname;
6340   boolean localp;
6341   unsigned int bindx;
6342   char *fname;
6343   unsigned int flags;
6344   unsigned int nindx;
6345
6346   assert (info->type_stack != NULL
6347           && info->type_stack->type.name != NULL
6348           && info->type_stack->next != NULL
6349           && info->type_stack->next->type.classdef != NULL
6350           && ! ieee_buffer_emptyp (&info->type_stack->next->type.strdef));
6351
6352   bname = info->type_stack->type.name;
6353   localp = info->type_stack->type.localp || info->type_stack->type.reflocalp;
6354   bindx = ieee_pop_type (info);
6355
6356   /* We are currently defining both a struct and a class.  We must
6357      write out a field definition in the struct which holds the base
6358      class.  The stabs debugging reader will create a field named
6359      _vb$CLASS for a virtual base class, so we just use that.  FIXME:
6360      we should not depend upon a detail of stabs debugging.  */
6361   if (virtual)
6362     {
6363       fname = (char *) xmalloc (strlen (bname) + sizeof "_vb$");
6364       sprintf (fname, "_vb$%s", bname);
6365       flags = BASEFLAGS_VIRTUAL;
6366     }
6367   else
6368     {
6369       if (localp)
6370         info->type_stack->type.localp = true;
6371
6372       fname = (char *) xmalloc (strlen (bname) + sizeof "_b$");
6373       sprintf (fname, "_b$%s", bname);
6374
6375       if (! ieee_change_buffer (info, &info->type_stack->type.strdef)
6376           || ! ieee_write_id (info, fname)
6377           || ! ieee_write_number (info, bindx)
6378           || ! ieee_write_number (info, bitpos / 8))
6379         return false;
6380       flags = 0;
6381     }
6382
6383   if (visibility == DEBUG_VISIBILITY_PRIVATE)
6384     flags |= BASEFLAGS_PRIVATE;
6385
6386   nindx = info->type_stack->type.classdef->indx;
6387
6388   if (! ieee_change_buffer (info, &info->type_stack->type.classdef->pmiscbuf)
6389       || ! ieee_write_asn (info, nindx, 'b')
6390       || ! ieee_write_asn (info, nindx, flags)
6391       || ! ieee_write_atn65 (info, nindx, bname)
6392       || ! ieee_write_asn (info, nindx, 0)
6393       || ! ieee_write_atn65 (info, nindx, fname))
6394     return false;
6395   info->type_stack->type.classdef->pmisccount += 5;
6396
6397   free (fname);
6398
6399   return true;
6400 }
6401
6402 /* Start building a method for a class.  */
6403
6404 static boolean
6405 ieee_class_start_method (p, name)
6406      PTR p;
6407      const char *name;
6408 {
6409   struct ieee_handle *info = (struct ieee_handle *) p;
6410
6411   assert (info->type_stack != NULL
6412           && info->type_stack->type.classdef != NULL
6413           && info->type_stack->type.classdef->method == NULL);
6414
6415   info->type_stack->type.classdef->method = name;
6416
6417   return true;
6418 }
6419
6420 /* Define a new method variant, either static or not.  */
6421
6422 static boolean
6423 ieee_class_method_var (info, physname, visibility, staticp, constp,
6424                        volatilep, voffset, context)
6425      struct ieee_handle *info;
6426      const char *physname;
6427      enum debug_visibility visibility;
6428      boolean staticp;
6429      boolean constp;
6430      boolean volatilep;
6431      bfd_vma voffset;
6432      boolean context;
6433 {
6434   unsigned int flags;
6435   unsigned int nindx;
6436   boolean virtual;
6437
6438   /* We don't need the type of the method.  An IEEE consumer which
6439      wants the type must track down the function by the physical name
6440      and get the type from that.  */
6441   ieee_pop_unused_type (info);
6442
6443   /* We don't use the context.  FIXME: We probably ought to use it to
6444      adjust the voffset somehow, but I don't really know how.  */
6445   if (context)
6446     ieee_pop_unused_type (info);
6447
6448   assert (info->type_stack != NULL
6449           && info->type_stack->type.classdef != NULL
6450           && info->type_stack->type.classdef->method != NULL);
6451
6452   flags = ieee_vis_to_flags (visibility);
6453
6454   /* FIXME: We never set CXXFLAGS_OVERRIDE, CXXFLAGS_OPERATOR,
6455      CXXFLAGS_CTORDTOR, CXXFLAGS_CTOR, or CXXFLAGS_INLINE.  */
6456
6457   if (staticp)
6458     flags |= CXXFLAGS_STATIC;
6459   if (constp)
6460     flags |= CXXFLAGS_CONST;
6461   if (volatilep)
6462     flags |= CXXFLAGS_VOLATILE;
6463
6464   nindx = info->type_stack->type.classdef->indx;
6465
6466   virtual = context || voffset > 0;
6467
6468   if (! ieee_change_buffer (info,
6469                             &info->type_stack->type.classdef->pmiscbuf)
6470       || ! ieee_write_asn (info, nindx, virtual ? 'v' : 'm')
6471       || ! ieee_write_asn (info, nindx, flags)
6472       || ! ieee_write_atn65 (info, nindx,
6473                              info->type_stack->type.classdef->method)
6474       || ! ieee_write_atn65 (info, nindx, physname))
6475     return false;
6476
6477   if (virtual)
6478     {
6479       if (voffset > info->type_stack->type.classdef->voffset)
6480         info->type_stack->type.classdef->voffset = voffset;
6481       if (! ieee_write_asn (info, nindx, voffset))
6482         return false;
6483       ++info->type_stack->type.classdef->pmisccount;
6484     }
6485
6486   if (! ieee_write_asn (info, nindx, 0))
6487     return false;
6488
6489   info->type_stack->type.classdef->pmisccount += 5;
6490
6491   return true;
6492 }
6493
6494 /* Define a new method variant.  */
6495
6496 static boolean
6497 ieee_class_method_variant (p, physname, visibility, constp, volatilep,
6498                            voffset, context)
6499      PTR p;
6500      const char *physname;
6501      enum debug_visibility visibility;
6502      boolean constp;
6503      boolean volatilep;
6504      bfd_vma voffset;
6505      boolean context;
6506 {
6507   struct ieee_handle *info = (struct ieee_handle *) p;
6508
6509   return ieee_class_method_var (info, physname, visibility, false, constp,
6510                                 volatilep, voffset, context);
6511 }
6512
6513 /* Define a new static method variant.  */
6514
6515 static boolean
6516 ieee_class_static_method_variant (p, physname, visibility, constp, volatilep)
6517      PTR p;
6518      const char *physname;
6519      enum debug_visibility visibility;
6520      boolean constp;
6521      boolean volatilep;
6522 {
6523   struct ieee_handle *info = (struct ieee_handle *) p;
6524
6525   return ieee_class_method_var (info, physname, visibility, true, constp,
6526                                 volatilep, 0, false);
6527 }
6528
6529 /* Finish up a method.  */
6530
6531 static boolean
6532 ieee_class_end_method (p)
6533      PTR p;
6534 {
6535   struct ieee_handle *info = (struct ieee_handle *) p;
6536
6537   assert (info->type_stack != NULL
6538           && info->type_stack->type.classdef != NULL
6539           && info->type_stack->type.classdef->method != NULL);
6540
6541   info->type_stack->type.classdef->method = NULL;
6542
6543   return true;
6544 }
6545
6546 /* Finish up a class.  */
6547
6548 static boolean
6549 ieee_end_class_type (p)
6550      PTR p;
6551 {
6552   struct ieee_handle *info = (struct ieee_handle *) p;
6553   unsigned int nindx;
6554
6555   assert (info->type_stack != NULL
6556           && info->type_stack->type.classdef != NULL);
6557
6558   /* If we were ignoring this class definition because it was a
6559      duplicate definition, just through away whatever bytes we have
6560      accumulated.  Leave the type on the stack.  */
6561   if (info->type_stack->type.ignorep)
6562     return true;
6563
6564   nindx = info->type_stack->type.classdef->indx;
6565
6566   /* If we have a virtual table, we can write out the information now.  */
6567   if (info->type_stack->type.classdef->vclass != NULL
6568       || info->type_stack->type.classdef->ownvptr)
6569     {
6570       if (! ieee_change_buffer (info,
6571                                 &info->type_stack->type.classdef->pmiscbuf)
6572           || ! ieee_write_asn (info, nindx, 'z')
6573           || ! ieee_write_atn65 (info, nindx, "")
6574           || ! ieee_write_asn (info, nindx,
6575                                info->type_stack->type.classdef->voffset))
6576         return false;
6577       if (info->type_stack->type.classdef->ownvptr)
6578         {
6579           if (! ieee_write_atn65 (info, nindx, ""))
6580             return false;
6581         }
6582       else
6583         {
6584           if (! ieee_write_atn65 (info, nindx,
6585                                   info->type_stack->type.classdef->vclass))
6586             return false;
6587         }
6588       if (! ieee_write_asn (info, nindx, 0))
6589         return false;
6590       info->type_stack->type.classdef->pmisccount += 5;
6591     }
6592
6593   /* Now that we know the number of pmisc records, we can write out
6594      the atn62 which starts the pmisc records, and append them to the
6595      C++ buffers.  */
6596
6597   if (! ieee_change_buffer (info, &info->cxx)
6598       || ! ieee_write_byte (info, (int) ieee_nn_record)
6599       || ! ieee_write_number (info, nindx)
6600       || ! ieee_write_id (info, "")
6601       || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
6602       || ! ieee_write_number (info, nindx)
6603       || ! ieee_write_number (info, 0)
6604       || ! ieee_write_number (info, 62)
6605       || ! ieee_write_number (info, 80)
6606       || ! ieee_write_number (info,
6607                               info->type_stack->type.classdef->pmisccount))
6608     return false;
6609
6610   if (! ieee_append_buffer (info, &info->cxx,
6611                             &info->type_stack->type.classdef->pmiscbuf))
6612     return false;
6613   if (! ieee_buffer_emptyp (&info->type_stack->type.classdef->refs))
6614     {
6615       if (! ieee_append_buffer (info, &info->cxx,
6616                                 &info->type_stack->type.classdef->refs))
6617         return false;
6618     }
6619
6620   return ieee_end_struct_type (p);
6621 }
6622
6623 /* Push a previously seen typedef onto the type stack.  */
6624
6625 static boolean
6626 ieee_typedef_type (p, name)
6627      PTR p;
6628      const char *name;
6629 {
6630   struct ieee_handle *info = (struct ieee_handle *) p;
6631   struct ieee_name_type_hash_entry *h;
6632   struct ieee_name_type *nt;
6633
6634   h = ieee_name_type_hash_lookup (&info->typedefs, name, false, false);
6635
6636   /* h should never be NULL, since that would imply that the generic
6637      debugging code has asked for a typedef which it has not yet
6638      defined.  */
6639   assert (h != NULL);
6640
6641   /* We always use the most recently defined type for this name, which
6642      will be the first one on the list.  */
6643
6644   nt = h->types;
6645   if (! ieee_push_type (info, nt->type.indx, nt->type.size,
6646                         nt->type.unsignedp, nt->type.localp))
6647     return false;
6648
6649   /* Copy over any other type information we may have.  */
6650   info->type_stack->type = nt->type;
6651
6652   return true;
6653 }
6654
6655 /* Push a tagged type onto the type stack.  */
6656
6657 static boolean
6658 ieee_tag_type (p, name, id, kind)
6659      PTR p;
6660      const char *name;
6661      unsigned int id;
6662      enum debug_type_kind kind;
6663 {
6664   struct ieee_handle *info = (struct ieee_handle *) p;
6665   boolean localp;
6666   boolean copy;
6667   char ab[20];
6668   struct ieee_name_type_hash_entry *h;
6669   struct ieee_name_type *nt;
6670
6671   if (kind == DEBUG_KIND_ENUM)
6672     {
6673       struct ieee_defined_enum *e;
6674
6675       if (name == NULL)
6676         abort ();
6677       for (e = info->enums; e != NULL; e = e->next)
6678         if (e->tag != NULL && strcmp (e->tag, name) == 0)
6679           return ieee_push_type (info, e->indx, 0, true, false);
6680       abort ();
6681     }
6682
6683   localp = false;
6684
6685   copy = false;
6686   if (name == NULL)
6687     {
6688       sprintf (ab, "__anon%u", id);
6689       name = ab;
6690       copy = true;
6691     }
6692
6693   h = ieee_name_type_hash_lookup (&info->tags, name, true, copy);
6694   if (h == NULL)
6695     return false;
6696
6697   for (nt = h->types; nt != NULL; nt = nt->next)
6698     {
6699       if (nt->id == id)
6700         {
6701           if (! ieee_push_type (info, nt->type.indx, nt->type.size,
6702                                 nt->type.unsignedp, nt->type.localp))
6703             return false;
6704           /* Copy over any other type information we may have.  */
6705           info->type_stack->type = nt->type;
6706           return true;
6707         }
6708
6709       if (! nt->type.localp)
6710         {
6711           /* This is a duplicate of a global type, so it must be
6712              local. */
6713           localp = true;
6714         }
6715     }
6716
6717   nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
6718   memset (nt, 0, sizeof *nt);
6719
6720   nt->id = id;
6721   nt->type.name = h->root.string;
6722   nt->type.indx = info->type_indx;
6723   nt->type.localp = localp;
6724   ++info->type_indx;
6725   nt->kind = kind;
6726
6727   nt->next = h->types;
6728   h->types = nt;
6729
6730   if (! ieee_push_type (info, nt->type.indx, 0, false, localp))
6731     return false;
6732
6733   info->type_stack->type.name = h->root.string;
6734
6735   return true;
6736 }
6737
6738 /* Output a typedef.  */
6739
6740 static boolean
6741 ieee_typdef (p, name)
6742      PTR p;
6743      const char *name;
6744 {
6745   struct ieee_handle *info = (struct ieee_handle *) p;
6746   struct ieee_write_type type;
6747   unsigned int indx;
6748   boolean found;
6749   boolean localp;
6750   struct ieee_name_type_hash_entry *h;
6751   struct ieee_name_type *nt;
6752
6753   type = info->type_stack->type;
6754   indx = type.indx;
6755
6756   /* If this is a simple builtin type using a builtin name, we don't
6757      want to output the typedef itself.  We also want to change the
6758      type index to correspond to the name being used.  We recognize
6759      names used in stabs debugging output even if they don't exactly
6760      correspond to the names used for the IEEE builtin types.  */
6761   found = false;
6762   if (indx <= (unsigned int) builtin_bcd_float)
6763     {
6764       switch ((enum builtin_types) indx)
6765         {
6766         default:
6767           break;
6768
6769         case builtin_void:
6770           if (strcmp (name, "void") == 0)
6771             found = true;
6772           break;
6773
6774         case builtin_signed_char:
6775         case builtin_char:
6776           if (strcmp (name, "signed char") == 0)
6777             {
6778               indx = (unsigned int) builtin_signed_char;
6779               found = true;
6780             }
6781           else if (strcmp (name, "char") == 0)
6782             {
6783               indx = (unsigned int) builtin_char;
6784               found = true;
6785             }
6786           break;
6787
6788         case builtin_unsigned_char:
6789           if (strcmp (name, "unsigned char") == 0)
6790             found = true;
6791           break;
6792
6793         case builtin_signed_short_int:
6794         case builtin_short:
6795         case builtin_short_int:
6796         case builtin_signed_short:
6797           if (strcmp (name, "signed short int") == 0)
6798             {
6799               indx = (unsigned int) builtin_signed_short_int;
6800               found = true;
6801             }
6802           else if (strcmp (name, "short") == 0)
6803             {
6804               indx = (unsigned int) builtin_short;
6805               found = true;
6806             }
6807           else if (strcmp (name, "short int") == 0)
6808             {
6809               indx = (unsigned int) builtin_short_int;
6810               found = true;
6811             }
6812           else if (strcmp (name, "signed short") == 0)
6813             {
6814               indx = (unsigned int) builtin_signed_short;
6815               found = true;
6816             }
6817           break;
6818
6819         case builtin_unsigned_short_int:
6820         case builtin_unsigned_short:
6821           if (strcmp (name, "unsigned short int") == 0
6822               || strcmp (name, "short unsigned int") == 0)
6823             {
6824               indx = builtin_unsigned_short_int;
6825               found = true;
6826             }
6827           else if (strcmp (name, "unsigned short") == 0)
6828             {
6829               indx = builtin_unsigned_short;
6830               found = true;
6831             }
6832           break;
6833
6834         case builtin_signed_long:
6835         case builtin_int: /* FIXME: Size depends upon architecture.  */
6836         case builtin_long:
6837           if (strcmp (name, "signed long") == 0)
6838             {
6839               indx = builtin_signed_long;
6840               found = true;
6841             }
6842           else if (strcmp (name, "int") == 0)
6843             {
6844               indx = builtin_int;
6845               found = true;
6846             }
6847           else if (strcmp (name, "long") == 0
6848                    || strcmp (name, "long int") == 0)
6849             {
6850               indx = builtin_long;
6851               found = true;
6852             }
6853           break;
6854
6855         case builtin_unsigned_long:
6856         case builtin_unsigned: /* FIXME: Size depends upon architecture.  */
6857         case builtin_unsigned_int: /* FIXME: Like builtin_unsigned.  */
6858           if (strcmp (name, "unsigned long") == 0
6859               || strcmp (name, "long unsigned int") == 0)
6860             {
6861               indx = builtin_unsigned_long;
6862               found = true;
6863             }
6864           else if (strcmp (name, "unsigned") == 0)
6865             {
6866               indx = builtin_unsigned;
6867               found = true;
6868             }
6869           else if (strcmp (name, "unsigned int") == 0)
6870             {
6871               indx = builtin_unsigned_int;
6872               found = true;
6873             }
6874           break;
6875
6876         case builtin_signed_long_long:
6877           if (strcmp (name, "signed long long") == 0
6878               || strcmp (name, "long long int") == 0)
6879             found = true;
6880           break;
6881
6882         case builtin_unsigned_long_long:
6883           if (strcmp (name, "unsigned long long") == 0
6884               || strcmp (name, "long long unsigned int") == 0)
6885             found = true;
6886           break;
6887
6888         case builtin_float:
6889           if (strcmp (name, "float") == 0)
6890             found = true;
6891           break;
6892
6893         case builtin_double:
6894           if (strcmp (name, "double") == 0)
6895             found = true;
6896           break;
6897
6898         case builtin_long_double:
6899           if (strcmp (name, "long double") == 0)
6900             found = true;
6901           break;
6902
6903         case builtin_long_long_double:
6904           if (strcmp (name, "long long double") == 0)
6905             found = true;
6906           break;
6907         }
6908
6909       if (found)
6910         type.indx = indx;
6911     }
6912
6913   h = ieee_name_type_hash_lookup (&info->typedefs, name, true, false);
6914   if (h == NULL)
6915     return false;
6916
6917   /* See if we have already defined this type with this name.  */
6918   localp = type.localp;
6919   for (nt = h->types; nt != NULL; nt = nt->next)
6920     {
6921       if (nt->id == indx)
6922         {
6923           /* If this is a global definition, then we don't need to
6924              do anything here.  */
6925           if (! nt->type.localp)
6926             {
6927               ieee_pop_unused_type (info);
6928               return true;
6929             }
6930         }
6931       else
6932         {
6933           /* This is a duplicate definition, so make this one local.  */
6934           localp = true;
6935         }
6936     }
6937
6938   /* We need to add a new typedef for this type.  */
6939
6940   nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
6941   memset (nt, 0, sizeof *nt);
6942   nt->id = indx;
6943   nt->type = type;
6944   nt->type.name = name;
6945   nt->type.localp = localp;
6946   nt->kind = DEBUG_KIND_ILLEGAL;
6947
6948   nt->next = h->types;
6949   h->types = nt;
6950
6951   if (found)
6952     {
6953       /* This is one of the builtin typedefs, so we don't need to
6954          actually define it.  */
6955       ieee_pop_unused_type (info);
6956       return true;
6957     }
6958
6959   indx = ieee_pop_type (info);
6960
6961   if (! ieee_define_named_type (info, name, (unsigned int) -1, type.size,
6962                                 type.unsignedp, localp,
6963                                 (struct ieee_buflist *) NULL)
6964       || ! ieee_write_number (info, 'T')
6965       || ! ieee_write_number (info, indx))
6966     return false;
6967
6968   /* Remove the type we just added to the type stack.  This should not
6969      be ieee_pop_unused_type, since the type is used, we just don't
6970      need it now.  */
6971   (void) ieee_pop_type (info);
6972
6973   return true;
6974 }
6975
6976 /* Output a tag for a type.  We don't have to do anything here.  */
6977
6978 static boolean
6979 ieee_tag (p, name)
6980      PTR p;
6981      const char *name;
6982 {
6983   struct ieee_handle *info = (struct ieee_handle *) p;
6984
6985   /* This should not be ieee_pop_unused_type, since we want the type
6986      to be defined.  */
6987   (void) ieee_pop_type (info);
6988   return true;
6989 }
6990
6991 /* Output an integer constant.  */
6992
6993 static boolean
6994 ieee_int_constant (p, name, val)
6995      PTR p;
6996      const char *name;
6997      bfd_vma val;
6998 {
6999   /* FIXME.  */
7000   return true;
7001 }
7002
7003 /* Output a floating point constant.  */
7004
7005 static boolean
7006 ieee_float_constant (p, name, val)
7007      PTR p;
7008      const char *name;
7009      double val;
7010 {
7011   /* FIXME.  */
7012   return true;
7013 }
7014
7015 /* Output a typed constant.  */
7016
7017 static boolean
7018 ieee_typed_constant (p, name, val)
7019      PTR p;
7020      const char *name;
7021      bfd_vma val;
7022 {
7023   struct ieee_handle *info = (struct ieee_handle *) p;
7024
7025   /* FIXME.  */
7026   ieee_pop_unused_type (info);
7027   return true;
7028 }
7029
7030 /* Output a variable.  */
7031
7032 static boolean
7033 ieee_variable (p, name, kind, val)
7034      PTR p;
7035      const char *name;
7036      enum debug_var_kind kind;
7037      bfd_vma val;
7038 {
7039   struct ieee_handle *info = (struct ieee_handle *) p;
7040   unsigned int name_indx;
7041   unsigned int size;
7042   boolean referencep;
7043   unsigned int type_indx;
7044   boolean asn;
7045   int refflag;
7046
7047   size = info->type_stack->type.size;
7048   referencep = info->type_stack->type.referencep;
7049   type_indx = ieee_pop_type (info);
7050
7051   assert (! ieee_buffer_emptyp (&info->vars));
7052   if (! ieee_change_buffer (info, &info->vars))
7053     return false;
7054
7055   name_indx = info->name_indx;
7056   ++info->name_indx;
7057
7058   /* Write out an NN and an ATN record for this variable.  */
7059   if (! ieee_write_byte (info, (int) ieee_nn_record)
7060       || ! ieee_write_number (info, name_indx)
7061       || ! ieee_write_id (info, name)
7062       || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7063       || ! ieee_write_number (info, name_indx)
7064       || ! ieee_write_number (info, type_indx))
7065     return false;
7066   switch (kind)
7067     {
7068     default:
7069       abort ();
7070       return false;
7071     case DEBUG_GLOBAL:
7072       if (! ieee_write_number (info, 8)
7073           || ! ieee_add_range (info, false, val, val + size))
7074         return false;
7075       refflag = 0;
7076       asn = true;
7077       break;
7078     case DEBUG_STATIC:
7079       if (! ieee_write_number (info, 3)
7080           || ! ieee_add_range (info, false, val, val + size))
7081         return false;
7082       refflag = 1;
7083       asn = true;
7084       break;
7085     case DEBUG_LOCAL_STATIC:
7086       if (! ieee_write_number (info, 3)
7087           || ! ieee_add_range (info, false, val, val + size))
7088         return false;
7089       refflag = 2;
7090       asn = true;
7091       break;
7092     case DEBUG_LOCAL:
7093       if (! ieee_write_number (info, 1)
7094           || ! ieee_write_number (info, val))
7095         return false;
7096       refflag = 2;
7097       asn = false;
7098       break;
7099     case DEBUG_REGISTER:
7100       if (! ieee_write_number (info, 2)
7101           || ! ieee_write_number (info,
7102                                   ieee_genreg_to_regno (info->abfd, val)))
7103         return false;
7104       refflag = 2;
7105       asn = false;
7106       break;
7107     }
7108
7109   if (asn)
7110     {
7111       if (! ieee_write_asn (info, name_indx, val))
7112         return false;
7113     }
7114
7115   /* If this is really a reference type, then we just output it with
7116      pointer type, and must now output a C++ record indicating that it
7117      is really reference type.  */
7118   if (referencep)
7119     {
7120       unsigned int nindx;
7121
7122       nindx = info->name_indx;
7123       ++info->name_indx;
7124
7125       /* If this is a global variable, we want to output the misc
7126          record in the C++ misc record block.  Otherwise, we want to
7127          output it just after the variable definition, which is where
7128          the current buffer is.  */
7129       if (refflag != 2)
7130         {
7131           if (! ieee_change_buffer (info, &info->cxx))
7132             return false;
7133         }
7134
7135       if (! ieee_write_byte (info, (int) ieee_nn_record)
7136           || ! ieee_write_number (info, nindx)
7137           || ! ieee_write_id (info, "")
7138           || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7139           || ! ieee_write_number (info, nindx)
7140           || ! ieee_write_number (info, 0)
7141           || ! ieee_write_number (info, 62)
7142           || ! ieee_write_number (info, 80)
7143           || ! ieee_write_number (info, 3)
7144           || ! ieee_write_asn (info, nindx, 'R')
7145           || ! ieee_write_asn (info, nindx, refflag)
7146           || ! ieee_write_atn65 (info, nindx, name))
7147         return false;
7148     }
7149
7150   return true;
7151 }
7152
7153 /* Start outputting information for a function.  */
7154
7155 static boolean
7156 ieee_start_function (p, name, global)
7157      PTR p;
7158      const char *name;
7159      boolean global;
7160 {
7161   struct ieee_handle *info = (struct ieee_handle *) p;
7162   boolean referencep;
7163   unsigned int retindx, typeindx;
7164
7165   referencep = info->type_stack->type.referencep;
7166   retindx = ieee_pop_type (info);
7167
7168   /* Besides recording a BB4 or BB6 block, we record the type of the
7169      function in the BB1 typedef block.  We can't write out the full
7170      type until we have seen all the parameters, so we accumulate it
7171      in info->fntype and info->fnargs.  */
7172   if (! ieee_buffer_emptyp (&info->fntype))
7173     {
7174       /* FIXME: This might happen someday if we support nested
7175          functions.  */
7176       abort ();
7177     }
7178
7179   info->fnname = name;
7180
7181   /* An attribute of 0x40 means that the push mask is unknown.  */
7182   if (! ieee_define_named_type (info, name, (unsigned int) -1, 0, false, true,
7183                                 &info->fntype)
7184       || ! ieee_write_number (info, 'x')
7185       || ! ieee_write_number (info, 0x40)
7186       || ! ieee_write_number (info, 0)
7187       || ! ieee_write_number (info, 0)
7188       || ! ieee_write_number (info, retindx))
7189     return false;
7190
7191   typeindx = ieee_pop_type (info);
7192
7193   if (! ieee_init_buffer (info, &info->fnargs))
7194     return false;
7195   info->fnargcount = 0;
7196
7197   /* If the function return value is actually a reference type, we
7198      must add a record indicating that.  */
7199   if (referencep)
7200     {
7201       unsigned int nindx;
7202
7203       nindx = info->name_indx;
7204       ++info->name_indx;
7205       if (! ieee_change_buffer (info, &info->cxx)
7206           || ! ieee_write_byte (info, (int) ieee_nn_record)
7207           || ! ieee_write_number (info, nindx)
7208           || ! ieee_write_id (info, "")
7209           || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7210           || ! ieee_write_number (info, nindx)
7211           || ! ieee_write_number (info, 0)
7212           || ! ieee_write_number (info, 62)
7213           || ! ieee_write_number (info, 80)
7214           || ! ieee_write_number (info, 3)
7215           || ! ieee_write_asn (info, nindx, 'R')
7216           || ! ieee_write_asn (info, nindx, global ? 0 : 1)
7217           || ! ieee_write_atn65 (info, nindx, name))
7218         return false;
7219     }
7220
7221   assert (! ieee_buffer_emptyp (&info->vars));
7222   if (! ieee_change_buffer (info, &info->vars))
7223     return false;
7224
7225   /* The address is written out as the first block.  */
7226
7227   ++info->block_depth;
7228
7229   return (ieee_write_byte (info, (int) ieee_bb_record_enum)
7230           && ieee_write_byte (info, global ? 4 : 6)
7231           && ieee_write_number (info, 0)
7232           && ieee_write_id (info, name)
7233           && ieee_write_number (info, 0)
7234           && ieee_write_number (info, typeindx));
7235 }
7236
7237 /* Add a function parameter.  This will normally be called before the
7238    first block, so we postpone them until we see the block.  */
7239
7240 static boolean
7241 ieee_function_parameter (p, name, kind, val)
7242      PTR p;
7243      const char *name;
7244      enum debug_parm_kind kind;
7245      bfd_vma val;
7246 {
7247   struct ieee_handle *info = (struct ieee_handle *) p;
7248   struct ieee_pending_parm *m, **pm;
7249
7250   assert (info->block_depth == 1);
7251
7252   m = (struct ieee_pending_parm *) xmalloc (sizeof *m);
7253   memset (m, 0, sizeof *m);
7254
7255   m->next = NULL;
7256   m->name = name;
7257   m->referencep = info->type_stack->type.referencep;
7258   m->type = ieee_pop_type (info);
7259   m->kind = kind;
7260   m->val = val;
7261
7262   for (pm = &info->pending_parms; *pm != NULL; pm = &(*pm)->next)
7263     ;
7264   *pm = m;
7265
7266   /* Add the type to the fnargs list.  */
7267   if (! ieee_change_buffer (info, &info->fnargs)
7268       || ! ieee_write_number (info, m->type))
7269     return false;
7270   ++info->fnargcount;
7271
7272   return true;  
7273 }
7274
7275 /* Output pending function parameters.  */
7276
7277 static boolean
7278 ieee_output_pending_parms (info)
7279      struct ieee_handle *info;
7280 {
7281   struct ieee_pending_parm *m;
7282   unsigned int refcount;
7283
7284   refcount = 0;
7285   for (m = info->pending_parms; m != NULL; m = m->next)
7286     {
7287       enum debug_var_kind vkind;
7288
7289       switch (m->kind)
7290         {
7291         default:
7292           abort ();
7293           return false;
7294         case DEBUG_PARM_STACK:
7295         case DEBUG_PARM_REFERENCE:
7296           vkind = DEBUG_LOCAL;
7297           break;
7298         case DEBUG_PARM_REG:
7299         case DEBUG_PARM_REF_REG:
7300           vkind = DEBUG_REGISTER;
7301           break;
7302         }
7303
7304       if (! ieee_push_type (info, m->type, 0, false, false))
7305         return false;
7306       info->type_stack->type.referencep = m->referencep;
7307       if (m->referencep)
7308         ++refcount;
7309       if (! ieee_variable ((PTR) info, m->name, vkind, m->val))
7310         return false;
7311     }
7312
7313   /* If there are any reference parameters, we need to output a
7314      miscellaneous record indicating them.  */
7315   if (refcount > 0)
7316     {
7317       unsigned int nindx, varindx;
7318
7319       /* FIXME: The MRI compiler outputs the demangled function name
7320          here, but we are outputting the mangled name.  */
7321       nindx = info->name_indx;
7322       ++info->name_indx;
7323       if (! ieee_change_buffer (info, &info->vars)
7324           || ! ieee_write_byte (info, (int) ieee_nn_record)
7325           || ! ieee_write_number (info, nindx)
7326           || ! ieee_write_id (info, "")
7327           || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7328           || ! ieee_write_number (info, nindx)
7329           || ! ieee_write_number (info, 0)
7330           || ! ieee_write_number (info, 62)
7331           || ! ieee_write_number (info, 80)
7332           || ! ieee_write_number (info, refcount + 3)
7333           || ! ieee_write_asn (info, nindx, 'B')
7334           || ! ieee_write_atn65 (info, nindx, info->fnname)
7335           || ! ieee_write_asn (info, nindx, 0))
7336         return false;
7337       for (m = info->pending_parms, varindx = 1;
7338            m != NULL;
7339            m = m->next, varindx++)
7340         {
7341           if (m->referencep)
7342             {
7343               if (! ieee_write_asn (info, nindx, varindx))
7344                 return false;
7345             }
7346         }
7347     }
7348
7349   m = info->pending_parms;
7350   while (m != NULL)
7351     {
7352       struct ieee_pending_parm *next;
7353
7354       next = m->next;
7355       free (m);
7356       m = next;
7357     }
7358
7359   info->pending_parms = NULL;
7360
7361   return true;
7362 }
7363
7364 /* Start a block.  If this is the first block, we output the address
7365    to finish the BB4 or BB6, and then output the function parameters.  */
7366
7367 static boolean
7368 ieee_start_block (p, addr)
7369      PTR p;
7370      bfd_vma addr;
7371 {
7372   struct ieee_handle *info = (struct ieee_handle *) p;
7373
7374   if (! ieee_change_buffer (info, &info->vars))
7375     return false;
7376
7377   if (info->block_depth == 1)
7378     {
7379       if (! ieee_write_number (info, addr)
7380           || ! ieee_output_pending_parms (info))
7381         return false;
7382     }
7383   else
7384     {
7385       if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
7386           || ! ieee_write_byte (info, 6)
7387           || ! ieee_write_number (info, 0)
7388           || ! ieee_write_id (info, "")
7389           || ! ieee_write_number (info, 0)
7390           || ! ieee_write_number (info, 0)
7391           || ! ieee_write_number (info, addr))
7392         return false;
7393     }
7394
7395   if (! ieee_start_range (info, addr))
7396     return false;
7397
7398   ++info->block_depth;
7399
7400   return true;
7401 }
7402
7403 /* End a block.  */
7404
7405 static boolean
7406 ieee_end_block (p, addr)
7407      PTR p;
7408      bfd_vma addr;
7409 {
7410   struct ieee_handle *info = (struct ieee_handle *) p;
7411
7412   /* The address we are given is the end of the block, but IEEE seems
7413      to want to the address of the last byte in the block, so we
7414      subtract one.  */
7415   if (! ieee_change_buffer (info, &info->vars)
7416       || ! ieee_write_byte (info, (int) ieee_be_record_enum)
7417       || ! ieee_write_number (info, addr - 1))
7418     return false;
7419
7420   if (! ieee_end_range (info, addr))
7421     return false;
7422
7423   --info->block_depth;
7424
7425   if (addr > info->highaddr)
7426     info->highaddr = addr;
7427
7428   return true;
7429 }
7430
7431 /* End a function.  */
7432
7433 static boolean
7434 ieee_end_function (p)
7435      PTR p;
7436 {
7437   struct ieee_handle *info = (struct ieee_handle *) p;
7438
7439   assert (info->block_depth == 1);
7440
7441   --info->block_depth;
7442
7443   /* Now we can finish up fntype, and add it to the typdef section.
7444      At this point, fntype is the 'x' type up to the argument count,
7445      and fnargs is the argument types.  We must add the argument
7446      count, and we must add the level.  FIXME: We don't record varargs
7447      functions correctly.  In fact, stabs debugging does not give us
7448      enough information to do so.  */
7449   if (! ieee_change_buffer (info, &info->fntype)
7450       || ! ieee_write_number (info, info->fnargcount)
7451       || ! ieee_change_buffer (info, &info->fnargs)
7452       || ! ieee_write_number (info, 0))
7453     return false;
7454
7455   /* Make sure the typdef block has been started.  */
7456   if (ieee_buffer_emptyp (&info->types))
7457     {
7458       if (! ieee_change_buffer (info, &info->types)
7459           || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
7460           || ! ieee_write_byte (info, 1)
7461           || ! ieee_write_number (info, 0)
7462           || ! ieee_write_id (info, info->modname))
7463         return false;
7464     }
7465
7466   if (! ieee_append_buffer (info, &info->types, &info->fntype)
7467       || ! ieee_append_buffer (info, &info->types, &info->fnargs))
7468     return false;
7469
7470   info->fnname = NULL;
7471   if (! ieee_init_buffer (info, &info->fntype)
7472       || ! ieee_init_buffer (info, &info->fnargs))
7473     return false;
7474   info->fnargcount = 0;
7475
7476   return true;
7477 }
7478
7479 /* Record line number information.  */
7480
7481 static boolean
7482 ieee_lineno (p, filename, lineno, addr)
7483      PTR p;
7484      const char *filename;
7485      unsigned long lineno;
7486      bfd_vma addr;
7487 {
7488   struct ieee_handle *info = (struct ieee_handle *) p;
7489
7490   assert (info->filename != NULL);
7491
7492   /* The HP simulator seems to get confused when more than one line is
7493      listed for the same address, at least if they are in different
7494      files.  We handle this by always listing the last line for a
7495      given address, since that seems to be the one that gdb uses.  */
7496   if (info->pending_lineno_filename != NULL
7497       && addr != info->pending_lineno_addr)
7498     {
7499       /* Make sure we have a line number block.  */
7500       if (! ieee_buffer_emptyp (&info->linenos))
7501         {
7502           if (! ieee_change_buffer (info, &info->linenos))
7503             return false;
7504         }
7505       else
7506         {
7507           info->lineno_name_indx = info->name_indx;
7508           ++info->name_indx;
7509           if (! ieee_change_buffer (info, &info->linenos)
7510               || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
7511               || ! ieee_write_byte (info, 5)
7512               || ! ieee_write_number (info, 0)
7513               || ! ieee_write_id (info, info->filename)
7514               || ! ieee_write_byte (info, (int) ieee_nn_record)
7515               || ! ieee_write_number (info, info->lineno_name_indx)
7516               || ! ieee_write_id (info, ""))
7517             return false;
7518           info->lineno_filename = info->filename;
7519         }
7520
7521       if (strcmp (info->pending_lineno_filename, info->lineno_filename) != 0)
7522         {
7523           if (strcmp (info->filename, info->lineno_filename) != 0)
7524             {
7525               /* We were not in the main file.  Close the block for the
7526                  included file.  */
7527               if (! ieee_write_byte (info, (int) ieee_be_record_enum))
7528                 return false;
7529               if (strcmp (info->filename, info->pending_lineno_filename) == 0)
7530                 {
7531                   /* We need a new NN record, and we aren't about to
7532                      output one.  */
7533                   info->lineno_name_indx = info->name_indx;
7534                   ++info->name_indx;
7535                   if (! ieee_write_byte (info, (int) ieee_nn_record)
7536                       || ! ieee_write_number (info, info->lineno_name_indx)
7537                       || ! ieee_write_id (info, ""))
7538                     return false;
7539                 }
7540             }
7541           if (strcmp (info->filename, info->pending_lineno_filename) != 0)
7542             {
7543               /* We are not changing to the main file.  Open a block for
7544                  the new included file.  */
7545               info->lineno_name_indx = info->name_indx;
7546               ++info->name_indx;
7547               if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
7548                   || ! ieee_write_byte (info, 5)
7549                   || ! ieee_write_number (info, 0)
7550                   || ! ieee_write_id (info, info->pending_lineno_filename)
7551                   || ! ieee_write_byte (info, (int) ieee_nn_record)
7552                   || ! ieee_write_number (info, info->lineno_name_indx)
7553                   || ! ieee_write_id (info, ""))
7554                 return false;
7555             }
7556           info->lineno_filename = info->pending_lineno_filename;
7557         }
7558
7559       if (! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7560           || ! ieee_write_number (info, info->lineno_name_indx)
7561           || ! ieee_write_number (info, 0)
7562           || ! ieee_write_number (info, 7)
7563           || ! ieee_write_number (info, info->pending_lineno)
7564           || ! ieee_write_number (info, 0)
7565           || ! ieee_write_asn (info, info->lineno_name_indx,
7566                                info->pending_lineno_addr))
7567         return false;
7568     }
7569
7570   info->pending_lineno_filename = filename;
7571   info->pending_lineno = lineno;
7572   info->pending_lineno_addr = addr;
7573
7574   return true;
7575 }