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