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