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