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