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