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