* debug.h (enum debug_type_kind): Add DEBUG_KIND_ILLEGAL.
[platform/upstream/binutils.git] / binutils / ieee.c
1 /* ieee.c -- Write out IEEE-695 debugging information.
2    Copyright (C) 1996 Free Software Foundation, Inc.
3    Written by Ian Lance Taylor <ian@cygnus.com>.
4
5    This file is part of GNU Binutils.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20    02111-1307, USA.  */
21
22 /* This file reads and writes IEEE-695 debugging information.  */
23
24 #include <stdio.h>
25 #include <assert.h>
26
27 #include "bfd.h"
28 #include "ieee.h"
29 #include "bucomm.h"
30 #include "libiberty.h"
31 #include "debug.h"
32 #include "budbg.h"
33
34 /* This structure holds an entry on the block stack.  */
35
36 struct ieee_block
37 {
38   /* The kind of block.  */
39   int kind;
40   /* The source file name, for a BB5 block.  */
41   const char *filename;
42 };
43
44 /* This structure is the block stack.  */
45
46 #define BLOCKSTACK_SIZE (16)
47
48 struct ieee_blockstack
49 {
50   /* The stack pointer.  */
51   struct ieee_block *bsp;
52   /* The stack.  */
53   struct ieee_block stack[BLOCKSTACK_SIZE];
54 };
55
56 /* This structure holds information for a variable.  */
57
58 struct ieee_var
59 {
60   /* Start of name.  */
61   const char *name;
62   /* Length of name.  */
63   unsigned long namlen;
64   /* Type.  */
65   debug_type type;
66 };
67
68 /* This structure holds all the variables.  */
69
70 struct ieee_vars
71 {
72   /* Number of slots allocated.  */
73   unsigned int alloc;
74   /* Variables.  */
75   struct ieee_var *vars;
76 };
77
78 /* This structure holds information for a type.  We need this because
79    we don't want to represent bitfields as real types.  */
80
81 struct ieee_type
82 {
83   /* Type.  */
84   debug_type type;
85   /* Slot if this is type is referenced before it is defined.  */
86   debug_type *pslot;
87   /* If this is a bitfield, this is the size in bits.  If this is not
88      a bitfield, this is zero.  */
89   unsigned long bitsize;
90   /* If this is a function type ('x' or 'X') this is the return type.  */
91   debug_type return_type;
92 };
93
94 /* This structure holds all the type information.  */
95
96 struct ieee_types
97 {
98   /* Number of slots allocated.  */
99   unsigned int alloc;
100   /* Types.  */
101   struct ieee_type *types;
102   /* Builtin types.  */
103 #define BUILTIN_TYPE_COUNT (60)
104   debug_type builtins[BUILTIN_TYPE_COUNT];
105 };
106
107 /* Basic builtin types, not including the pointers.  */
108
109 enum builtin_types
110 {
111   builtin_unknown = 0,
112   builtin_void = 1,
113   builtin_signed_char = 2,
114   builtin_unsigned_char = 3,
115   builtin_signed_short_int = 4,
116   builtin_unsigned_short_int = 5,
117   builtin_signed_long = 6,
118   builtin_unsigned_long = 7,
119   builtin_signed_long_long = 8,
120   builtin_unsigned_long_long = 9,
121   builtin_float = 10,
122   builtin_double = 11,
123   builtin_long_double = 12,
124   builtin_long_long_double = 13,
125   builtin_quoted_string = 14,
126   builtin_instruction_address = 15,
127   builtin_int = 16,
128   builtin_unsigned = 17,
129   builtin_unsigned_int = 18,
130   builtin_char = 19,
131   builtin_long = 20,
132   builtin_short = 21,
133   builtin_unsigned_short = 22,
134   builtin_short_int = 23,
135   builtin_signed_short = 24,
136   builtin_bcd_float = 25
137 };
138
139 static void ieee_error
140   PARAMS ((bfd *, const bfd_byte *, const bfd_byte *, const char *));
141 static void ieee_eof PARAMS ((bfd *));
142 static char *savestring PARAMS ((const char *, unsigned long));
143 static boolean ieee_read_number
144   PARAMS ((bfd *, const bfd_byte *, const bfd_byte **, const bfd_byte *,
145            bfd_vma *));
146 static boolean ieee_read_optional_number
147   PARAMS ((bfd *, const bfd_byte *, const bfd_byte **, const bfd_byte *,
148            bfd_vma *, boolean *));
149 static boolean ieee_read_id
150   PARAMS ((bfd *, const bfd_byte *, const bfd_byte **, const bfd_byte *,
151            const char **, unsigned long *));
152 static boolean ieee_read_optional_id
153   PARAMS ((bfd *, const bfd_byte *, const bfd_byte **, const bfd_byte *,
154            const char **, unsigned long *, boolean *));
155 static boolean ieee_read_expression
156   PARAMS ((bfd *, const bfd_byte *, const bfd_byte **, const bfd_byte *,
157            bfd_vma *));
158 static debug_type ieee_builtin_type
159   PARAMS ((PTR, bfd *, struct ieee_types *, const bfd_byte *,
160            const bfd_byte *, unsigned int));
161 static boolean ieee_alloc_type
162   PARAMS ((PTR, struct ieee_types *, unsigned int, boolean));
163 static boolean ieee_read_type_index
164   PARAMS ((PTR, bfd *, struct ieee_types *, const bfd_byte *,
165            const bfd_byte **, const bfd_byte *, debug_type *));
166 static int ieee_regno_to_genreg PARAMS ((bfd *, int));
167 static int ieee_genreg_to_regno PARAMS ((bfd *, int));
168 static boolean parse_ieee_bb
169   PARAMS ((PTR, bfd *, struct ieee_types *, struct ieee_blockstack *,
170            const bfd_byte *, const bfd_byte **, const bfd_byte *));
171 static boolean parse_ieee_be
172   PARAMS ((PTR, bfd *, struct ieee_blockstack *, const bfd_byte *,
173            const bfd_byte **, const bfd_byte *));
174 static boolean parse_ieee_nn
175   PARAMS ((PTR, bfd *, struct ieee_vars *, const bfd_byte *,
176            const bfd_byte **, const bfd_byte *));
177 static boolean parse_ieee_ty
178   PARAMS ((PTR, bfd *, struct ieee_types *, struct ieee_vars *,
179            const bfd_byte *, const bfd_byte **, const bfd_byte *));
180 static boolean parse_ieee_atn
181   PARAMS ((PTR, bfd *, struct ieee_types *, struct ieee_vars *, int,
182            const bfd_byte *, const bfd_byte **, const bfd_byte *));
183 static boolean ieee_require_asn
184   PARAMS ((bfd *, const bfd_byte *, const bfd_byte **, const bfd_byte *,
185            bfd_vma *));
186
187 /* Report an error in the IEEE debugging information.  */
188
189 static void
190 ieee_error (abfd, bytes, p, s)
191      bfd *abfd;
192      const bfd_byte *bytes;
193      const bfd_byte *p;
194      const char *s;
195 {
196   if (p != NULL)
197     fprintf (stderr, "%s: 0x%lx: %s (0x%x)\n", bfd_get_filename (abfd),
198              (unsigned long) (p - bytes), s, *p);
199   else
200     fprintf (stderr, "%s: %s\n", bfd_get_filename (abfd), s);
201 }
202
203 /* Report an unexpected EOF in the IEEE debugging information.  */
204
205 static void
206 ieee_eof (abfd)
207      bfd *abfd;
208 {
209   ieee_error (abfd, (const bfd_byte *) NULL, (const bfd_byte *) NULL,
210               "unexpected end of debugging information");
211 }
212
213 /* Save a string in memory.  */
214
215 static char *
216 savestring (start, len)
217      const char *start;
218      unsigned long len;
219 {
220   char *ret;
221
222   ret = (char *) xmalloc (len + 1);
223   memcpy (ret, start, len);
224   ret[len] = '\0';
225   return ret;
226 }
227
228 /* Read a number which must be present in an IEEE file.  */
229
230 static boolean
231 ieee_read_number (abfd, bytes, pp, pend, pv)
232      bfd *abfd;
233      const bfd_byte *bytes;
234      const bfd_byte **pp;
235      const bfd_byte *pend;
236      bfd_vma *pv;
237 {
238   return ieee_read_optional_number (abfd, bytes, pp, pend, pv,
239                                     (boolean *) NULL);
240 }
241
242 /* Read a number in an IEEE file.  If ppresent is not NULL, the number
243    need not be there. */
244
245 static boolean
246 ieee_read_optional_number (abfd, bytes, pp, pend, pv, ppresent)
247      bfd *abfd;
248      const bfd_byte *bytes;
249      const bfd_byte **pp;
250      const bfd_byte *pend;
251      bfd_vma *pv;
252      boolean *ppresent;
253 {
254   ieee_record_enum_type b;
255
256   if (*pp >= pend)
257     {
258       if (ppresent != NULL)
259         {
260           *ppresent = false;
261           return true;
262         }
263       ieee_eof (abfd);
264       return false;
265     }
266
267   b = (ieee_record_enum_type) **pp;
268   ++*pp;
269
270   if (b <= ieee_number_end_enum)
271     {
272       *pv = (bfd_vma) b;
273       if (ppresent != NULL)
274         *ppresent = true;
275       return true;
276     }
277
278   if (b >= ieee_number_repeat_start_enum && b <= ieee_number_repeat_end_enum)
279     {
280       unsigned int i;
281
282       i = (int) b - (int) ieee_number_repeat_start_enum;
283       if (*pp + i - 1 >= pend)
284         {
285           ieee_eof (abfd);
286           return false;
287         }
288
289       *pv = 0;
290       for (; i > 0; i--)
291         {
292           *pv <<= 8;
293           *pv += **pp;
294           ++*pp;
295         }
296
297       if (ppresent != NULL)
298         *ppresent = true;
299
300       return true;
301     }
302
303   if (ppresent != NULL)
304     {
305       --*pp;
306       *ppresent = false;
307       return true;
308     }
309
310   ieee_error (abfd, bytes, *pp - 1, "invalid number");
311   return false;  
312 }
313
314 /* Read a required string from an IEEE file.  */
315
316 static boolean
317 ieee_read_id (abfd, bytes, pp, pend, pname, pnamlen)
318      bfd *abfd;
319      const bfd_byte *bytes;
320      const bfd_byte **pp;
321      const bfd_byte *pend;
322      const char **pname;
323      unsigned long *pnamlen;
324 {
325   return ieee_read_optional_id (abfd, bytes, pp, pend, pname, pnamlen,
326                                 (boolean *) NULL);
327 }
328
329 /* Read a string from an IEEE file.  If ppresent is not NULL, the
330    string is optional.  */
331
332 static boolean
333 ieee_read_optional_id (abfd, bytes, pp, pend, pname, pnamlen, ppresent)
334      bfd *abfd;
335      const bfd_byte *bytes;
336      const bfd_byte **pp;
337      const bfd_byte *pend;
338      const char **pname;
339      unsigned long *pnamlen;
340      boolean *ppresent;
341 {
342   bfd_byte b;
343   unsigned long len;
344
345   if (*pp >= pend)
346     {
347       ieee_eof (abfd);
348       return false;
349     }
350
351   b = **pp;
352   ++*pp;
353
354   if (b <= 0x7f)
355     len = b;
356   else if ((ieee_record_enum_type) b == ieee_extension_length_1_enum)
357     {
358       len = **pp;
359       ++*pp;
360     }
361   else if ((ieee_record_enum_type) b == ieee_extension_length_2_enum)
362     {
363       len = (**pp << 8) + (*pp)[1];
364       *pp += 2;
365     }
366   else
367     {
368       if (ppresent != NULL)
369         {
370           --*pp;
371           *ppresent = false;
372           return true;
373         }
374       ieee_error (abfd, bytes, *pp - 1, "invalid string length");
375       return false;
376     }
377
378   if ((unsigned long) (pend - *pp) < len)
379     {
380       ieee_eof (abfd);
381       return false;
382     }
383
384   *pname = (const char *) *pp;
385   *pnamlen = len;
386   *pp += len;
387
388   if (ppresent != NULL)
389     *ppresent = true;
390
391   return true;
392 }
393
394 /* Read an expression from an IEEE file.  Since this code is only used
395    to parse debugging information, I haven't bothered to write a full
396    blown IEEE expression parser.  I've only thrown in the things I've
397    seen in debugging information.  This can be easily extended if
398    necessary.  */
399
400 static boolean
401 ieee_read_expression (abfd, bytes, pp, pend, pv)
402      bfd *abfd;
403      const bfd_byte *bytes;
404      const bfd_byte **pp;
405      const bfd_byte *pend;
406      bfd_vma *pv;
407 {
408   const bfd_byte *expr_start;
409 #define EXPR_STACK_SIZE (10)
410   bfd_vma expr_stack[EXPR_STACK_SIZE];
411   bfd_vma *esp;
412
413   expr_start = *pp;
414
415   esp = expr_stack;
416
417   while (1)
418     {
419       const bfd_byte *start;
420       bfd_vma val;
421       boolean present;
422       ieee_record_enum_type c;
423
424       start = *pp;
425
426       if (! ieee_read_optional_number (abfd, bytes, pp, pend, &val, &present))
427         return false;
428
429       if (present)
430         {
431           if (esp - expr_stack >= EXPR_STACK_SIZE)
432             {
433               ieee_error (abfd, bytes, start, "expression stack overflow");
434               return false;
435             }
436           *esp++ = val;
437           continue;
438         }
439
440       c = (ieee_record_enum_type) **pp;
441
442       if (c >= ieee_module_beginning_enum)
443         break;
444
445       ++*pp;
446
447       if (c == ieee_comma)
448         break;
449
450       switch (c)
451         {
452         default:
453           ieee_error (abfd, bytes, start,
454                       "unsupported IEEE expression operator");
455           break;
456
457         case ieee_variable_R_enum:
458           {
459             bfd_vma indx;
460             asection *s;
461
462             if (! ieee_read_number (abfd, bytes, pp, pend, &indx))
463               return false;
464             for (s = abfd->sections; s != NULL; s = s->next)
465               if ((bfd_vma) s->target_index == indx)
466                 break;
467             if (s == NULL)
468               {
469                 ieee_error (abfd, bytes, start, "unknown section");
470                 return false;
471               }
472             
473             if (esp - expr_stack >= EXPR_STACK_SIZE)
474               {
475                 ieee_error (abfd, bytes, start, "expression stack overflow");
476                 return false;
477               }
478
479             *esp++ = bfd_get_section_vma (abfd, s);
480           }
481           break;
482
483         case ieee_function_plus_enum:
484         case ieee_function_minus_enum:
485           {
486             bfd_vma v1, v2;
487
488             if (esp - expr_stack < 2)
489               {
490                 ieee_error (abfd, bytes, start, "expression stack underflow");
491                 return false;
492               }
493
494             v1 = *--esp;
495             v2 = *--esp;
496             *esp++ = v1 + v2;
497           }
498           break;
499         }
500     }
501
502   if (esp - 1 != expr_stack)
503     {
504       ieee_error (abfd, bytes, expr_start, "expression stack mismatch");
505       return false;
506     }
507
508   *pv = *--esp;
509
510   return true;
511 }
512
513 /* Return an IEEE builtin type.  */
514
515 static debug_type
516 ieee_builtin_type (dhandle, abfd, types, bytes, p, indx)
517      PTR dhandle;
518      bfd *abfd;
519      struct ieee_types *types;
520      const bfd_byte *bytes;
521      const bfd_byte *p;
522      unsigned int indx;
523 {
524   debug_type type;
525   const char *name;
526
527   if (indx < BUILTIN_TYPE_COUNT
528       && types->builtins[indx] != DEBUG_TYPE_NULL)
529     return types->builtins[indx];
530
531   if (indx >= 32 && indx < 64)
532     {
533       type = debug_make_pointer_type (dhandle,
534                                       ieee_builtin_type (dhandle, abfd,
535                                                          types, bytes, p,
536                                                          indx - 32));
537       assert (indx < BUILTIN_TYPE_COUNT);
538       types->builtins[indx] = type;
539       return type;
540     }
541
542   switch ((enum builtin_types) indx)
543     {
544     default:
545       ieee_error (abfd, bytes, p, "unknown builtin type");
546       return NULL;
547
548     case builtin_unknown:
549       type = debug_make_void_type (dhandle);
550       name = NULL;
551       break;
552
553     case builtin_void:
554       type = debug_make_void_type (dhandle);
555       name = "void";
556       break;
557
558     case builtin_signed_char:
559       type = debug_make_int_type (dhandle, 1, false);
560       name = "signed char";
561       break;
562
563     case builtin_unsigned_char:
564       type = debug_make_int_type (dhandle, 1, true);
565       name = "unsigned char";
566       break;
567
568     case builtin_signed_short_int:
569       type = debug_make_int_type (dhandle, 2, false);
570       name = "signed short int";
571       break;
572
573     case builtin_unsigned_short_int:
574       type = debug_make_int_type (dhandle, 2, true);
575       name = "unsigned short int";
576       break;
577
578     case builtin_signed_long:
579       type = debug_make_int_type (dhandle, 4, false);
580       name = "signed long";
581       break;
582
583     case builtin_unsigned_long:
584       type = debug_make_int_type (dhandle, 4, true);
585       name = "unsigned long";
586       break;
587
588     case builtin_signed_long_long:
589       type = debug_make_int_type (dhandle, 8, false);
590       name = "signed long long";
591       break;
592
593     case builtin_unsigned_long_long:
594       type = debug_make_int_type (dhandle, 8, true);
595       name = "unsigned long long";
596       break;
597
598     case builtin_float:
599       type = debug_make_float_type (dhandle, 4);
600       name = "float";
601       break;
602
603     case builtin_double:
604       type = debug_make_float_type (dhandle, 8);
605       name = "double";
606       break;
607
608     case builtin_long_double:
609       /* FIXME: The size for this type should depend upon the
610          processor.  */
611       type = debug_make_float_type (dhandle, 12);
612       name = "long double";
613       break;
614
615     case builtin_long_long_double:
616       type = debug_make_float_type (dhandle, 16);
617       name = "long long double";
618       break;
619
620     case builtin_quoted_string:
621       type = debug_make_array_type (dhandle,
622                                     ieee_builtin_type (dhandle, abfd, types,
623                                                        bytes, p,
624                                                        ((unsigned int)
625                                                         builtin_char)),
626                                     ieee_builtin_type (dhandle, abfd, types,
627                                                        bytes, p,
628                                                        ((unsigned int)
629                                                         builtin_int)),
630                                     0, -1, true);
631       name = "QUOTED STRING";
632       break;
633
634     case builtin_instruction_address:
635       /* FIXME: This should be a code address.  */
636       type = debug_make_int_type (dhandle, 4, true);
637       name = "instruction address";
638       break;
639
640     case builtin_int:
641       /* FIXME: The size for this type should depend upon the
642          processor.  */
643       type = debug_make_int_type (dhandle, 4, false);
644       name = "int";
645       break;
646
647     case builtin_unsigned:
648       /* FIXME: The size for this type should depend upon the
649          processor.  */
650       type = debug_make_int_type (dhandle, 4, true);
651       name = "unsigned";
652       break;
653
654     case builtin_unsigned_int:
655       /* FIXME: The size for this type should depend upon the
656          processor.  */
657       type = debug_make_int_type (dhandle, 4, true);
658       name = "unsigned int";
659       break;
660
661     case builtin_char:
662       type = debug_make_int_type (dhandle, 1, false);
663       name = "char";
664       break;
665
666     case builtin_long:
667       type = debug_make_int_type (dhandle, 4, false);
668       name = "long";
669       break;
670
671     case builtin_short:
672       type = debug_make_int_type (dhandle, 2, false);
673       name = "short";
674       break;
675
676     case builtin_unsigned_short:
677       type = debug_make_int_type (dhandle, 2, true);
678       name = "unsigned short";
679       break;
680
681     case builtin_short_int:
682       type = debug_make_int_type (dhandle, 2, false);
683       name = "short int";
684       break;
685
686     case builtin_signed_short:
687       type = debug_make_int_type (dhandle, 2, false);
688       name = "signed short";
689       break;
690
691     case builtin_bcd_float:
692       ieee_error (abfd, bytes, p, "BCD float type not supported");
693       return false;
694     }
695
696   if (name != NULL)
697     type = debug_name_type (dhandle, name, type);
698
699   assert (indx < BUILTIN_TYPE_COUNT);
700
701   types->builtins[indx] = type;
702
703   return type;
704 }
705
706 /* Allocate more space in the type table.  If ref is true, this is a
707    reference to the type; if it is not already defined, we should set
708    up an indirect type.  */
709
710 static boolean
711 ieee_alloc_type (dhandle, types, indx, ref)
712      PTR dhandle;
713      struct ieee_types *types;
714      unsigned int indx;
715      boolean ref;
716 {
717   unsigned int nalloc;
718   register struct ieee_type *t;
719   struct ieee_type *tend;
720
721   if (indx >= types->alloc)
722     {
723       nalloc = types->alloc;
724       if (nalloc == 0)
725         nalloc = 4;
726       while (indx >= nalloc)
727         nalloc *= 2;
728
729       types->types = ((struct ieee_type *)
730                       xrealloc (types->types, nalloc * sizeof *types->types));
731
732       memset (types->types + types->alloc, 0,
733               (nalloc - types->alloc) * sizeof *types->types);
734
735       tend = types->types + nalloc;
736       for (t = types->types + types->alloc; t < tend; t++)
737         {
738           t->type = DEBUG_TYPE_NULL;
739           t->return_type = DEBUG_TYPE_NULL;
740         }
741
742       types->alloc = nalloc;
743     }
744
745   if (ref)
746     {
747       t = types->types + indx;
748       if (t->type == NULL)
749         {
750           t->pslot = (debug_type *) xmalloc (sizeof *t->pslot);
751           *t->pslot = DEBUG_TYPE_NULL;
752           t->type = debug_make_indirect_type (dhandle, t->pslot,
753                                               (const char *) NULL);
754           if (t->type == NULL)
755             return false;
756         }
757     }
758
759   return true;
760 }
761
762 /* Read a type index and return the corresponding type.  */
763
764 static boolean
765 ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend, ptype)
766      PTR dhandle;
767      bfd *abfd;
768      struct ieee_types *types;
769      const bfd_byte *bytes;
770      const bfd_byte **pp;
771      const bfd_byte *pend;
772      debug_type *ptype;
773 {
774   const bfd_byte *start;
775   bfd_vma indx;
776
777   start = *pp;
778
779   if (! ieee_read_number (abfd, bytes, pp, pend, &indx))
780     return false;
781
782   if (indx < 256)
783     {
784       *ptype = ieee_builtin_type (dhandle, abfd, types, bytes, start, indx);
785       if (*ptype == NULL)
786         return false;
787       return true;
788     }
789
790   indx -= 256;
791   if (! ieee_alloc_type (dhandle, types, indx, true))
792     return false;
793
794   *ptype = types->types[indx].type;
795
796   return true;
797 }
798
799 /* Parse IEEE debugging information for a file.  This is passed the
800    bytes which compose the Debug Information Part of an IEEE file.  */
801
802 boolean
803 parse_ieee (dhandle, abfd, bytes, len)
804      PTR dhandle;
805      bfd *abfd;
806      const bfd_byte *bytes;
807      bfd_size_type len;
808 {
809   struct ieee_blockstack blockstack;
810   struct ieee_vars vars;
811   struct ieee_types types;
812   unsigned int i;
813   const bfd_byte *p, *pend;
814
815   blockstack.bsp = blockstack.stack;
816   vars.alloc = 0;
817   vars.vars = NULL;
818   types.alloc = 0;
819   types.types = NULL;
820   for (i = 0; i < BUILTIN_TYPE_COUNT; i++)
821     types.builtins[i] = DEBUG_TYPE_NULL;
822
823   p = bytes;
824   pend = bytes + len;
825   while (p < pend)
826     {
827       const bfd_byte *record_start;
828       ieee_record_enum_type c;
829
830       record_start = p;
831
832       c = (ieee_record_enum_type) *p++;
833
834       if (c == ieee_at_record_enum)
835         c = (ieee_record_enum_type) (((unsigned int) c << 8) | *p++);
836
837       if (c <= ieee_number_repeat_end_enum)
838         {
839           ieee_error (abfd, bytes, record_start, "unexpected number");
840           return false;
841         }
842
843       switch (c)
844         {
845         default:
846           ieee_error (abfd, bytes, record_start, "unexpected record type");
847           return false;
848
849         case ieee_bb_record_enum:
850           if (! parse_ieee_bb (dhandle, abfd, &types, &blockstack, bytes,
851                                &p, pend))
852             return false;
853           break;
854
855         case ieee_be_record_enum:
856           if (! parse_ieee_be (dhandle, abfd, &blockstack, bytes, &p, pend))
857             return false;
858           break;
859
860         case ieee_nn_record:
861           if (! parse_ieee_nn (dhandle, abfd, &vars, bytes, &p, pend))
862             return false;
863           break;
864
865         case ieee_ty_record_enum:
866           if (! parse_ieee_ty (dhandle, abfd, &types, &vars, bytes, &p, pend))
867             return false;
868           break;
869
870         case ieee_atn_record_enum:
871           if (! parse_ieee_atn (dhandle, abfd, &types, &vars,
872                                 (blockstack.bsp <= blockstack.stack
873                                  ? 0
874                                  : blockstack.bsp[-1].kind),
875                                 bytes, &p, pend))
876             return false;
877           break;
878         }
879     }
880
881   if (blockstack.bsp != blockstack.stack)
882     {
883       ieee_error (abfd, (const bfd_byte *) NULL, (const bfd_byte *) NULL,
884                   "blocks left on stack at end");
885       return false;
886     }
887
888   return true;
889 }
890
891 /* Handle an IEEE BB record.  */
892
893 static boolean
894 parse_ieee_bb (dhandle, abfd, types, blockstack, bytes, pp, pend)
895      PTR dhandle;
896      bfd *abfd;
897      struct ieee_types *types;
898      struct ieee_blockstack *blockstack;
899      const bfd_byte *bytes;
900      const bfd_byte **pp;
901      const bfd_byte *pend;
902 {
903   const bfd_byte *block_start;
904   bfd_byte b;
905   bfd_vma size;
906   const char *name;
907   unsigned long namlen;
908   char *namcopy;
909             
910   block_start = *pp;
911
912   b = **pp;
913   ++*pp;
914
915   if (! ieee_read_number (abfd, bytes, pp, pend, &size)
916       || ! ieee_read_id (abfd, bytes, pp, pend, &name, &namlen))
917     return false;
918
919   switch (b)
920     {
921     case 1:
922       /* BB1: Type definitions local to a module.  */
923       namcopy = savestring (name, namlen);
924       if (namcopy == NULL)
925         return false;
926       if (! debug_set_filename (dhandle, namcopy))
927         return false;
928       break;
929
930     case 2:
931       /* BB2: Global type definitions.  The name is supposed to be
932          empty, but we don't check. */
933       if (! debug_set_filename (dhandle, "*global*"))
934         return false;
935       break;
936
937     case 3:
938       /* BB3: High level module block begin.  We don't have to do
939          anything here.  The name is supposed to be the same as for
940          the BB1, but we don't check.  */
941       break;
942
943     case 4:
944       /* BB4: Global function.  */
945       {
946         bfd_vma stackspace, typindx, offset;
947         debug_type return_type;
948
949         if (! ieee_read_number (abfd, bytes, pp, pend, &stackspace)
950             || ! ieee_read_number (abfd, bytes, pp, pend, &typindx)
951             || ! ieee_read_expression (abfd, bytes, pp, pend, &offset))
952           return false;
953
954         /* We have no way to record the stack space.  FIXME.  */
955
956         if (typindx < 256)
957           {
958             return_type = ieee_builtin_type (dhandle, abfd, types, bytes,
959                                              block_start, typindx);
960             if (return_type == NULL)
961               return false;
962           }
963         else
964           {
965             typindx -= 256;
966             if (! ieee_alloc_type (dhandle, types, typindx, true))
967               return false;
968             return_type = types->types[typindx].return_type;
969             if (return_type == NULL)
970               return_type = types->types[typindx].type;
971           }
972
973         namcopy = savestring (name, namlen);
974         if (namcopy == NULL)
975           return false;
976         if (! debug_record_function (dhandle, namcopy, return_type,
977                                      true, offset))
978           return false;
979       }
980       break;
981
982     case 5:
983       /* BB5: File name for source line numbers.  */
984       {
985         unsigned int i;
986
987         /* We ignore the date and time.  FIXME.  */
988         for (i = 0; i < 6; i++)
989           {
990             bfd_vma ignore;
991             boolean present;
992
993             if (! ieee_read_optional_number (abfd, bytes, pp, pend, &ignore,
994                                              &present))
995               return false;
996             if (! present)
997               break;
998           }
999
1000         namcopy = savestring (name, namlen);
1001         if (namcopy == NULL)
1002           return false;
1003         if (! debug_start_source (dhandle, namcopy))
1004           return false;
1005       }
1006       break;
1007
1008     case 6:
1009       /* BB6: Local function or block.  */
1010       {
1011         bfd_vma stackspace, typindx, offset;
1012
1013         if (! ieee_read_number (abfd, bytes, pp, pend, &stackspace)
1014             || ! ieee_read_number (abfd, bytes, pp, pend, &typindx)
1015             || ! ieee_read_expression (abfd, bytes, pp, pend, &offset))
1016           return false;
1017
1018         /* We have no way to record the stack space.  FIXME.  */
1019
1020         if (namlen == 0)
1021           {
1022             if (! debug_start_block (dhandle, offset))
1023               return false;
1024             /* Change b to indicate that this is a block
1025                rather than a function.  */
1026             b = 0x86;
1027           }
1028         else
1029           {
1030             debug_type return_type;
1031
1032             if (typindx < 256)
1033               {
1034                 return_type = ieee_builtin_type (dhandle, abfd, types, bytes,
1035                                                  block_start, typindx);
1036                 if (return_type == NULL)
1037                   return false;
1038               }
1039             else
1040               {
1041                 typindx -= 256;
1042                 if (! ieee_alloc_type (dhandle, types, typindx, true))
1043                       return false;
1044                 return_type = types->types[typindx].return_type;
1045                 if (return_type == NULL)
1046                   return_type = types->types[typindx].type;
1047               }
1048
1049             namcopy = savestring (name, namlen);
1050             if (namcopy == NULL)
1051               return false;
1052             if (! debug_record_function (dhandle, namcopy, return_type,
1053                                          false, offset))
1054               return false;
1055           }
1056       }
1057       break;
1058
1059     case 10:
1060       /* BB10: Assembler module scope.  We completely ignore all this
1061          information.  FIXME.  */
1062       {
1063         const char *inam, *vstr;
1064         unsigned long inamlen, vstrlen;
1065         bfd_vma tool_type;
1066         boolean present;
1067         unsigned int i;
1068
1069         if (! ieee_read_id (abfd, bytes, pp, pend, &inam, &inamlen)
1070             || ! ieee_read_number (abfd, bytes, pp, pend, &tool_type)
1071             || ! ieee_read_optional_id (abfd, bytes, pp, pend, &vstr, &vstrlen,
1072                                         &present))
1073           return false;
1074         for (i = 0; i < 6; i++)
1075           {
1076             bfd_vma ignore;
1077
1078             if (! ieee_read_optional_number (abfd, bytes, pp, pend, &ignore,
1079                                              &present))
1080               return false;
1081             if (! present)
1082               break;
1083           }
1084       }
1085       break;
1086
1087     case 11:
1088       /* BB11: Module section.  We completely ignore all this
1089          information.  FIXME.  */
1090       {
1091         bfd_vma sectype, secindx, offset, map;
1092         boolean present;
1093
1094         if (! ieee_read_number (abfd, bytes, pp, pend, &sectype)
1095             || ! ieee_read_number (abfd, bytes, pp, pend, &secindx)
1096             || ! ieee_read_expression (abfd, bytes, pp, pend, &offset)
1097             || ! ieee_read_optional_number (abfd, bytes, pp, pend, &map,
1098                                             &present))
1099           return false;
1100       }
1101       break;
1102
1103     default:
1104       ieee_error (abfd, bytes, block_start, "unknown BB type");
1105       return false;
1106     }
1107
1108
1109   /* Push this block on the block stack.  */
1110
1111   if (blockstack->bsp >= blockstack->stack + BLOCKSTACK_SIZE)
1112     {
1113       ieee_error (abfd, (const bfd_byte *) NULL, (const bfd_byte *) NULL,
1114                   "stack overflow");
1115       return false;
1116     }
1117
1118   blockstack->bsp->kind = b;
1119   if (b == 5)
1120     blockstack->bsp->filename = namcopy;
1121   ++blockstack->bsp;
1122
1123   return true;
1124 }
1125
1126 /* Handle an IEEE BE record.  */
1127
1128 static boolean
1129 parse_ieee_be (dhandle, abfd, blockstack, bytes, pp, pend)
1130      PTR dhandle;
1131      bfd *abfd;
1132      struct ieee_blockstack *blockstack;
1133      const bfd_byte *bytes;
1134      const bfd_byte **pp;
1135      const bfd_byte *pend;
1136 {
1137   bfd_vma offset;
1138
1139   if (blockstack->bsp <= blockstack->stack)
1140     {
1141       ieee_error (abfd, bytes, *pp, "stack underflow");
1142       return false;
1143     }
1144   --blockstack->bsp;
1145
1146   switch (blockstack->bsp->kind)
1147     {
1148     case 4:
1149     case 6:
1150       if (! ieee_read_expression (abfd, bytes, pp, pend, &offset))
1151         return false;
1152       if (! debug_end_function (dhandle, offset))
1153         return false;
1154       break;
1155
1156     case 0x86:
1157       /* This is BE6 when BB6 started a block rather than a local
1158          function.  */
1159       if (! ieee_read_expression (abfd, bytes, pp, pend, &offset))
1160         return false;
1161       if (! debug_end_block (dhandle, offset))
1162         return false;
1163       break;
1164
1165     case 5:
1166       /* When we end a BB5, we look up the stack for the last BB5, if
1167          there is one, so that we can call debug_start_source.  */
1168       if (blockstack->bsp > blockstack->stack)
1169         {
1170           struct ieee_block *bl;
1171
1172           bl = blockstack->bsp;
1173           do
1174             {
1175               --bl;
1176               if (bl->kind == 5)
1177                 {
1178                   if (! debug_start_source (dhandle, bl->filename))
1179                     return false;
1180                   break;
1181                 }
1182             }
1183           while (bl != blockstack->stack);
1184         }
1185       break;
1186
1187     case 11:
1188       if (! ieee_read_expression (abfd, bytes, pp, pend, &offset))
1189         return false;
1190       /* We just ignore the module size.  FIXME.  */
1191       break;
1192
1193     default:
1194       /* Other block types do not have any trailing information.  */
1195       break;
1196     }
1197
1198   return true;
1199 }
1200
1201 /* Parse an NN record.  */
1202
1203 static boolean
1204 parse_ieee_nn (dhandle, abfd, vars, bytes, pp, pend)
1205      PTR dhandle;
1206      bfd *abfd;
1207      struct ieee_vars *vars;
1208      const bfd_byte *bytes;
1209      const bfd_byte **pp;
1210      const bfd_byte *pend;
1211 {
1212   const bfd_byte *nn_start;
1213   bfd_vma varindx;
1214   const char *name;
1215   unsigned long namlen;
1216
1217   nn_start = *pp;
1218
1219   if (! ieee_read_number (abfd, bytes, pp, pend, &varindx)
1220       || ! ieee_read_id (abfd, bytes, pp, pend, &name, &namlen))
1221     return false;
1222
1223   if (varindx < 32)
1224     {
1225       ieee_error (abfd, bytes, nn_start, "illegal variable index");
1226       return false;
1227     }
1228   varindx -= 32;
1229
1230   if (varindx >= vars->alloc)
1231     {
1232       unsigned int alloc;
1233
1234       alloc = vars->alloc;
1235       if (alloc == 0)
1236         alloc = 4;
1237       while (varindx >= alloc)
1238         alloc *= 2;
1239       vars->vars = ((struct ieee_var *)
1240                     xrealloc (vars->vars, alloc * sizeof *vars->vars));
1241       memset (vars->vars + vars->alloc, 0,
1242               (alloc - vars->alloc) * sizeof *vars->vars);
1243       vars->alloc = alloc;
1244     }
1245
1246   vars->vars[varindx].name = name;
1247   vars->vars[varindx].namlen = namlen;
1248
1249   return true;
1250 }
1251
1252 /* Parse a TY record.  */
1253
1254 static boolean
1255 parse_ieee_ty (dhandle, abfd, types, vars, bytes, pp, pend)
1256      PTR dhandle;
1257      bfd *abfd;
1258      struct ieee_types *types;
1259      struct ieee_vars *vars;
1260      const bfd_byte *bytes;
1261      const bfd_byte **pp;
1262      const bfd_byte *pend;
1263 {
1264   const bfd_byte *ty_start, *ty_var_start, *ty_code_start;
1265   bfd_vma typeindx, varindx, tc;
1266   debug_type type;
1267   boolean tag, typdef;
1268   unsigned long type_bitsize;
1269   debug_type return_type;
1270
1271   ty_start = *pp;
1272
1273   if (! ieee_read_number (abfd, bytes, pp, pend, &typeindx))
1274     return false;
1275
1276   if (typeindx < 256)
1277     {
1278       ieee_error (abfd, bytes, ty_start, "illegal type index");
1279       return false;
1280     }
1281
1282   typeindx -= 256;
1283   if (! ieee_alloc_type (dhandle, types, typeindx, false))
1284     return false;
1285
1286   if (**pp != 0xce)
1287     {
1288       ieee_error (abfd, bytes, *pp, "unknown TY code");
1289       return false;
1290     }
1291   ++*pp;
1292
1293   ty_var_start = *pp;
1294
1295   if (! ieee_read_number (abfd, bytes, pp, pend, &varindx))
1296     return false;
1297
1298   if (varindx < 32)
1299     {
1300       ieee_error (abfd, bytes, ty_var_start, "illegal variable index");
1301       return false;
1302     }
1303   varindx -= 32;
1304
1305   if (varindx >= vars->alloc || vars->vars[varindx].name == NULL)
1306     {
1307       ieee_error (abfd, bytes, ty_var_start, "undefined variable in TY");
1308       return false;
1309     }
1310
1311   ty_code_start = *pp;
1312
1313   if (! ieee_read_number (abfd, bytes, pp, pend, &tc))
1314     return false;
1315
1316   tag = false;
1317   typdef = false;
1318   type_bitsize = 0;
1319   return_type = DEBUG_TYPE_NULL;
1320   switch (tc)
1321     {
1322     default:
1323       ieee_error (abfd, bytes, ty_code_start, "unknown TY code");
1324       return false;
1325
1326     case '!':
1327       /* Unknown type, with size.  We treat it as int.  FIXME.  */
1328       {
1329         bfd_vma size;
1330
1331         if (! ieee_read_number (abfd, bytes, pp, pend, &size))
1332           return false;
1333         type = debug_make_int_type (dhandle, size, false);
1334       }
1335       break;
1336
1337     case 'A': /* Array.  */
1338     case 'a': /* FORTRAN array in column/row order.  FIXME: Not
1339                  distinguished from normal array.  */
1340       {
1341         debug_type ele_type;
1342         bfd_vma lower, upper;
1343
1344         if (! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1345                                     &ele_type)
1346             || ! ieee_read_number (abfd, bytes, pp, pend, &lower)
1347             || ! ieee_read_number (abfd, bytes, pp, pend, &upper))
1348           return false;
1349         type = debug_make_array_type (dhandle, ele_type,
1350                                       ieee_builtin_type (dhandle, abfd, types,
1351                                                          bytes, ty_code_start,
1352                                                          ((unsigned int)
1353                                                           builtin_int)),
1354                                       (bfd_signed_vma) lower,
1355                                       (bfd_signed_vma) upper,
1356                                       false);
1357       }
1358       break;
1359
1360     case 'E':
1361       /* Simple enumeration.  */
1362       {
1363         bfd_vma size;
1364         unsigned int alloc;
1365         const char **names;
1366         unsigned int c;
1367         bfd_signed_vma *vals;
1368         unsigned int i;
1369
1370         if (! ieee_read_number (abfd, bytes, pp, pend, &size))
1371           return false;
1372         /* FIXME: we ignore the enumeration size.  */
1373
1374         alloc = 10;
1375         names = (const char **) xmalloc (alloc * sizeof *names);
1376         memset (names, 0, alloc * sizeof *names);
1377         c = 0;
1378         while (1)
1379           {
1380             const char *name;
1381             unsigned long namlen;
1382             boolean present;
1383
1384             if (! ieee_read_optional_id (abfd, bytes, pp, pend, &name,
1385                                          &namlen, &present))
1386               return false;
1387             if (! present)
1388               break;
1389
1390             if (c + 1 >= alloc)
1391               {
1392                 alloc += 10;
1393                 names = ((const char **)
1394                          xrealloc (names, alloc * sizeof *names));
1395               }
1396
1397             names[c] = savestring (name, namlen);
1398             if (names[c] == NULL)
1399               return false;
1400             ++c;
1401           }
1402
1403         names[c] = NULL;
1404
1405         vals = (bfd_signed_vma *) xmalloc (c * sizeof *vals);
1406         for (i = 0; i < c; i++)
1407           vals[i] = i;
1408
1409         type = debug_make_enum_type (dhandle, names, vals);
1410         tag = true;
1411       }
1412       break;
1413
1414     case 'G':
1415       /* Struct with bit fields.  */
1416       {
1417         bfd_vma size;
1418         unsigned int alloc;
1419         debug_field *fields;
1420         unsigned int c;
1421
1422         if (! ieee_read_number (abfd, bytes, pp, pend, &size))
1423           return false;
1424
1425         alloc = 10;
1426         fields = (debug_field *) xmalloc (alloc * sizeof *fields);
1427         c = 0;
1428         while (1)
1429           {
1430             const char *name;
1431             unsigned long namlen;
1432             boolean present;
1433             debug_type ftype;
1434             bfd_vma bitpos, bitsize;
1435
1436             if (! ieee_read_optional_id (abfd, bytes, pp, pend, &name,
1437                                          &namlen, &present))
1438               return false;
1439             if (! present)
1440               break;
1441             if (! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1442                                         &ftype)
1443                 || ! ieee_read_number (abfd, bytes, pp, pend, &bitpos)
1444                 || ! ieee_read_number (abfd, bytes, pp, pend, &bitsize))
1445               return false;
1446
1447             if (c + 1 >= alloc)
1448               {
1449                 alloc += 10;
1450                 fields = ((debug_field *)
1451                           xrealloc (fields, alloc * sizeof *fields));
1452               }
1453
1454             fields[c] = debug_make_field (dhandle, savestring (name, namlen),
1455                                           ftype, bitpos, bitsize,
1456                                           DEBUG_VISIBILITY_PUBLIC);
1457             if (fields[c] == NULL)
1458               return false;
1459             ++c;
1460           }
1461
1462         fields[c] = NULL;
1463
1464         type = debug_make_struct_type (dhandle, true, size, fields);
1465         tag = true;
1466       }
1467       break;
1468
1469     case 'N':
1470       /* Enumeration.  */
1471       {
1472         unsigned int alloc;
1473         const char **names;
1474         bfd_signed_vma *vals;
1475         unsigned int c;
1476
1477         alloc = 10;
1478         names = (const char **) xmalloc (alloc * sizeof *names);
1479         vals = (bfd_signed_vma *) xmalloc (alloc * sizeof *names);
1480         c = 0;
1481         while (1)
1482           {
1483             const char *name;
1484             unsigned long namlen;
1485             boolean present;
1486             bfd_vma val;
1487
1488             if (! ieee_read_optional_id (abfd, bytes, pp, pend, &name,
1489                                          &namlen, &present))
1490               return false;
1491             if (! present)
1492               break;
1493             if (! ieee_read_number (abfd, bytes, pp, pend, &val))
1494               return false;
1495
1496             /* If the length of the name is zero, then the value is
1497                actually the size of the enum.  We ignore this
1498                information.  FIXME.  */
1499             if (namlen == 0)
1500               continue;
1501
1502             if (c + 1 >= alloc)
1503               {
1504                 alloc += 10;
1505                 names = ((const char **)
1506                          xrealloc (names, alloc * sizeof *names));
1507                 vals = ((bfd_signed_vma *)
1508                         xrealloc (vals, alloc * sizeof *vals));
1509               }
1510
1511             names[c] = savestring (name, namlen);
1512             if (names[c] == NULL)
1513               return false;
1514             vals[c] = (bfd_signed_vma) val;
1515             ++c;
1516           }
1517
1518         names[c] = NULL;
1519
1520         type = debug_make_enum_type (dhandle, names, vals);
1521         tag = true;
1522       }
1523       break;
1524
1525     case 'O': /* Small pointer.  We don't distinguish small and large
1526                  pointers.  FIXME.  */
1527     case 'P': /* Large pointer.  */
1528       {
1529         debug_type t;
1530
1531         if (! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend, &t))
1532           return false;
1533         type = debug_make_pointer_type (dhandle, t);
1534       }
1535       break;
1536
1537     case 'R':
1538       /* Range.  */
1539       {
1540         bfd_vma low, high, signedp, size;
1541
1542         if (! ieee_read_number (abfd, bytes, pp, pend, &low)
1543             || ! ieee_read_number (abfd, bytes, pp, pend, &high)
1544             || ! ieee_read_number (abfd, bytes, pp, pend, &signedp)
1545             || ! ieee_read_number (abfd, bytes, pp, pend, &size))
1546           return false;
1547
1548         type = debug_make_range_type (dhandle,
1549                                       debug_make_int_type (dhandle, size,
1550                                                            ! signedp),
1551                                       (bfd_signed_vma) low,
1552                                       (bfd_signed_vma) high);
1553       }
1554       break;
1555
1556     case 'S': /* Struct.  */
1557     case 'U': /* Union.  */
1558       {
1559         bfd_vma size;
1560         unsigned int alloc;
1561         debug_field *fields;
1562         unsigned int c;
1563
1564         if (! ieee_read_number (abfd, bytes, pp, pend, &size))
1565           return false;
1566
1567         alloc = 10;
1568         fields = (debug_field *) xmalloc (alloc * sizeof *fields);
1569         c = 0;
1570         while (1)
1571           {
1572             const char *name;
1573             unsigned long namlen;
1574             boolean present;
1575             bfd_vma tindx;
1576             bfd_vma offset;
1577             debug_type ftype;
1578             bfd_vma bitsize;
1579
1580             if (! ieee_read_optional_id (abfd, bytes, pp, pend, &name,
1581                                          &namlen, &present))
1582               return false;
1583             if (! present)
1584               break;
1585             if (! ieee_read_number (abfd, bytes, pp, pend, &tindx)
1586                 || ! ieee_read_number (abfd, bytes, pp, pend, &offset))
1587               return false;
1588
1589             if (tindx < 256)
1590               {
1591                 ftype = ieee_builtin_type (dhandle, abfd, types, bytes,
1592                                            ty_code_start, tindx);
1593                 bitsize = 0;
1594                 offset *= 8;
1595               }
1596             else
1597               {
1598                 struct ieee_type *t;
1599
1600                 tindx -= 256;
1601                 if (! ieee_alloc_type (dhandle, types, tindx, true))
1602                   return false;
1603                 t = types->types + tindx;
1604                 ftype = t->type;
1605                 bitsize = t->bitsize;
1606                 if (bitsize == 0)
1607                   offset *= 8;
1608               }
1609
1610             if (c + 1 >= alloc)
1611               {
1612                 alloc += 10;
1613                 fields = ((debug_field *)
1614                           xrealloc (fields, alloc * sizeof *fields));
1615               }
1616
1617             fields[c] = debug_make_field (dhandle, savestring (name, namlen),
1618                                           ftype, offset, bitsize,
1619                                           DEBUG_VISIBILITY_PUBLIC);
1620             if (fields[c] == NULL)
1621               return false;
1622             ++c;
1623           }
1624
1625         fields[c] = NULL;
1626
1627         type = debug_make_struct_type (dhandle, tc == 'S', size, fields);
1628         tag = true;
1629       }
1630       break;
1631
1632     case 'T':
1633       /* Typedef.  */
1634       if (! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1635                                   &type))
1636         return false;
1637       typdef = true;
1638       break;
1639
1640     case 'X':
1641       /* Procedure.  FIXME: This is an extern declaration, which we
1642          have no way of representing.  */
1643       {
1644         bfd_vma attr;
1645         debug_type rtype;
1646         bfd_vma nargs;
1647         boolean present;
1648
1649         /* FIXME: We ignore the attribute and the argument names.  */
1650
1651         if (! ieee_read_number (abfd, bytes, pp, pend, &attr)
1652             || ! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1653                                        &rtype)
1654             || ! ieee_read_number (abfd, bytes, pp, pend, &nargs))
1655           return false;
1656         do
1657           {
1658             const char *name;
1659             unsigned long namlen;
1660
1661             if (! ieee_read_optional_id (abfd, bytes, pp, pend, &name,
1662                                          &namlen, &present))
1663               return false;
1664           }
1665         while (present);
1666
1667         type = debug_make_function_type (dhandle, rtype);
1668         return_type = rtype;
1669       }
1670       break;
1671
1672     case 'Z':
1673       /* Array with 0 lower bound.  */
1674       {
1675         debug_type etype;
1676         bfd_vma high;
1677
1678         if (! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1679                                     &etype)
1680             || ! ieee_read_number (abfd, bytes, pp, pend, &high))
1681           return false;
1682
1683         type = debug_make_array_type (dhandle, etype,
1684                                       ieee_builtin_type (dhandle, abfd, types,
1685                                                          bytes, ty_code_start,
1686                                                          ((unsigned int)
1687                                                           builtin_int)),
1688                                       0, (bfd_signed_vma) high, false);
1689       }
1690       break;
1691
1692     case 'c': /* Complex.  */
1693     case 'd': /* Double complex.  */
1694       {
1695         const char *name;
1696         unsigned long namlen;
1697
1698         /* FIXME: I don't know what the name means.  */
1699
1700         if (! ieee_read_id (abfd, bytes, pp, pend, &name, &namlen))
1701           return false;
1702
1703         type = debug_make_complex_type (dhandle, tc == 'c' ? 4 : 8);
1704       }
1705       break;
1706
1707     case 'f':
1708       /* Pascal file name.  FIXME.  */
1709       ieee_error (abfd, bytes, ty_code_start,
1710                   "Pascal file name not supported");
1711       return false;
1712
1713     case 'g':
1714       /* Bitfield type.  */
1715       {
1716         bfd_vma signedp, bitsize;
1717
1718         if (! ieee_read_number (abfd, bytes, pp, pend, &signedp)
1719             || ! ieee_read_number (abfd, bytes, pp, pend, &bitsize)
1720             || ! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1721                                        &type))
1722           return false;
1723
1724         /* FIXME: This is just a guess.  */
1725         if (! signedp)
1726           type = debug_make_int_type (dhandle, 4, true);
1727         type_bitsize = bitsize;
1728       }
1729       break;
1730
1731     case 'n':
1732       /* Qualifier.  */
1733       {
1734         bfd_vma kind;
1735         debug_type t;
1736
1737         if (! ieee_read_number (abfd, bytes, pp, pend, &kind)
1738             || ! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1739                                        &t))
1740           return false;
1741
1742         switch (kind)
1743           {
1744           default:
1745             ieee_error (abfd, bytes, ty_start, "unsupported qualifer");
1746             return false;
1747
1748           case 1:
1749             type = debug_make_const_type (dhandle, t);
1750             break;
1751
1752           case 2:
1753             type = debug_make_volatile_type (dhandle, t);
1754             break;
1755           }
1756       }
1757       break;
1758
1759     case 's':
1760       /* Set.  */
1761       {
1762         bfd_vma size;
1763         debug_type etype;
1764
1765         if (! ieee_read_number (abfd, bytes, pp, pend, &size)
1766             || ! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1767                                        &etype))
1768           return false;
1769
1770         /* FIXME: We ignore the size.  */
1771
1772         type = debug_make_set_type (dhandle, etype, false);
1773       }
1774       break;
1775
1776     case 'x':
1777       /* Procedure with compiler dependencies.  FIXME: This is an
1778          extern declaration, which we have no way of representing.  */
1779       {
1780         bfd_vma attr, frame_type, push_mask, nargs, level, father;
1781         debug_type rtype;
1782         boolean present;
1783
1784         /* FIXME: We ignore almost all this information.  */
1785
1786         if (! ieee_read_number (abfd, bytes, pp, pend, &attr)
1787             || ! ieee_read_number (abfd, bytes, pp, pend, &frame_type)
1788             || ! ieee_read_number (abfd, bytes, pp, pend, &push_mask)
1789             || ! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend,
1790                                        &rtype)
1791             || ! ieee_read_number (abfd, bytes, pp, pend, &nargs))
1792           return false;
1793         if (nargs != (bfd_vma) -1)
1794           {
1795             for (; nargs > 0; nargs--)
1796               {
1797                 debug_type atype;
1798
1799                 if (! ieee_read_type_index (dhandle, abfd, types, bytes, pp,
1800                                             pend, &atype))
1801                   return false;
1802               }
1803           }
1804         if (! ieee_read_number (abfd, bytes, pp, pend, &level)
1805             || ! ieee_read_optional_number (abfd, bytes, pp, pend, &father,
1806                                             &present))
1807           return false;
1808
1809         type = debug_make_function_type (dhandle, rtype);
1810         return_type = rtype;
1811       }
1812       break;
1813     }
1814
1815   /* Record the type in the table.  If the corresponding NN record has
1816      a name, name it.  FIXME: Is this always correct?  */
1817
1818   if (type == NULL)
1819     return false;
1820
1821   if ((tag || typdef)
1822       && vars->vars[varindx].namlen > 0)
1823     {
1824       const char *name;
1825
1826       name = savestring (vars->vars[varindx].name,
1827                          vars->vars[varindx].namlen);
1828       if (tag)
1829         type = debug_tag_type (dhandle, name, type);
1830       else
1831         type = debug_name_type (dhandle, name, type);
1832       if (type == NULL)
1833         return false;
1834     }
1835
1836   types->types[typeindx].type = type;
1837   types->types[typeindx].bitsize = type_bitsize;
1838   types->types[typeindx].return_type = return_type;
1839
1840   /* We may have already allocated type as an indirect type pointing
1841      to slot.  It does no harm to replace the indirect type with the
1842      real type.  Filling in slot as well handles the indirect types
1843      which are already hanging around.  */
1844   if (types->types[typeindx].pslot != NULL)
1845     *types->types[typeindx].pslot = type;
1846
1847   return true;
1848 }
1849
1850 /* Parse an ATN record.  */
1851
1852 static boolean
1853 parse_ieee_atn (dhandle, abfd, types, vars, blocktype, bytes, pp, pend)
1854      PTR dhandle;
1855      bfd *abfd;
1856      struct ieee_types *types;
1857      struct ieee_vars *vars;
1858      int blocktype;
1859      const bfd_byte *bytes;
1860      const bfd_byte **pp;
1861      const bfd_byte *pend;
1862 {
1863   const bfd_byte *atn_start, *atn_code_start;
1864   bfd_vma varindx;
1865   boolean zeroindx;
1866   debug_type type;
1867   bfd_vma atn_code;
1868   bfd_vma v, v2, v3, v4, v5;
1869   const char *name;
1870   unsigned long namlen;
1871   char *namcopy;
1872   boolean present;
1873
1874   atn_start = *pp;
1875
1876   if (! ieee_read_number (abfd, bytes, pp, pend, &varindx)
1877       || ! ieee_read_type_index (dhandle, abfd, types, bytes, pp, pend, &type))
1878     return false;
1879
1880   atn_code_start = *pp;
1881
1882   if (! ieee_read_number (abfd, bytes, pp, pend, &atn_code))
1883     return false;
1884
1885   if (varindx == 0)
1886     {
1887       zeroindx = true;
1888       name = "";
1889       namlen = 0;
1890     }
1891   else if (varindx < 32)
1892     {
1893       ieee_error (abfd, bytes, atn_start, "illegal variable index");
1894       return false;
1895     }
1896   else
1897     {
1898       varindx -= 32;
1899       zeroindx = false;
1900       if (varindx >= vars->alloc || vars->vars[varindx].name == NULL)
1901         {
1902           ieee_error (abfd, bytes, atn_start, "undefined variable in ATN");
1903           return false;
1904         }
1905
1906       vars->vars[varindx].type = type;
1907
1908       name = vars->vars[varindx].name;
1909       namlen = vars->vars[varindx].namlen;
1910     }
1911
1912   switch (atn_code)
1913     {
1914     default:
1915       ieee_error (abfd, bytes, atn_code_start, "unknown ATN type");
1916       return false;
1917
1918     case 1:
1919       /* Automatic variable.  */
1920       if (! ieee_read_number (abfd, bytes, pp, pend, &v))
1921         return false;
1922       namcopy = savestring (name, namlen);
1923       if (type == NULL)
1924         type = debug_make_void_type (dhandle);
1925       return debug_record_variable (dhandle, namcopy, type, DEBUG_LOCAL, v);
1926
1927     case 2:
1928       /* Register variable.  */
1929       if (! ieee_read_number (abfd, bytes, pp, pend, &v))
1930         return false;
1931       namcopy = savestring (name, namlen);
1932       if (type == NULL)
1933         type = debug_make_void_type (dhandle);
1934       return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER,
1935                                     ieee_regno_to_genreg (abfd, v));
1936
1937     case 3:
1938       /* Static variable.  */
1939       if (! ieee_require_asn (abfd, bytes, pp, pend, &v))
1940         return false;
1941       namcopy = savestring (name, namlen);
1942       if (type == NULL)
1943         type = debug_make_void_type (dhandle);
1944       return debug_record_variable (dhandle, namcopy, type,
1945                                     (blocktype == 4 || blocktype == 6
1946                                      ? DEBUG_LOCAL_STATIC
1947                                      : DEBUG_STATIC),
1948                                     v);
1949
1950     case 4:
1951       /* External function.  We don't currently record these.  FIXME.  */
1952       return true;
1953
1954     case 5:
1955       /* External variable.  We don't currently record these.  FIXME.  */
1956       return true;
1957
1958     case 7:
1959       if (! ieee_read_number (abfd, bytes, pp, pend, &v)
1960           || ! ieee_read_number (abfd, bytes, pp, pend, &v2)
1961           || ! ieee_read_optional_number (abfd, bytes, pp, pend, &v3,
1962                                           &present))
1963         return false;
1964       if (present)
1965         {
1966           if (! ieee_read_optional_number (abfd, bytes, pp, pend, &v4,
1967                                            &present))
1968             return false;
1969         }
1970
1971       /* We just ignore the two optional fields in v3 and v4, since
1972          they are not defined.  */
1973
1974       if (! ieee_require_asn (abfd, bytes, pp, pend, &v3))
1975         return false;
1976
1977       /* We have no way to record the column number.  FIXME.  */
1978
1979       return debug_record_line (dhandle, v, v3);
1980
1981     case 8:
1982       /* Global variable.  */
1983       if (! ieee_require_asn (abfd, bytes, pp, pend, &v))
1984         return false;
1985       namcopy = savestring (name, namlen);
1986       if (type == NULL)
1987         type = debug_make_void_type (dhandle);
1988       return debug_record_variable (dhandle, namcopy, type, DEBUG_GLOBAL, v);
1989
1990     case 9:
1991       /* Variable lifetime information.  */
1992       if (! ieee_read_number (abfd, bytes, pp, pend, &v))
1993         return false;
1994
1995       /* We have no way to record this information.  FIXME.  */
1996       return true;
1997
1998     case 10:
1999       /* Locked register.  */
2000       if (! ieee_read_number (abfd, bytes, pp, pend, &v)
2001           || ! ieee_read_number (abfd, bytes, pp, pend, &v2))
2002         return false;
2003
2004       /* I think this means a variable that is both in a register and
2005          a frame slot.  We ignore the frame slot.  FIXME.  */
2006
2007       namcopy = savestring (name, namlen);
2008       if (type == NULL)
2009         type = debug_make_void_type (dhandle);
2010       return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER, v);
2011
2012     case 11:
2013       /* Reserved for FORTRAN common.  */
2014       ieee_error (abfd, bytes, atn_code_start, "unsupported ATN11");
2015
2016       /* Return true to keep going.  */
2017       return true;
2018
2019     case 12:
2020       /* Based variable.  */
2021       v3 = 0;
2022       v4 = 0x80;
2023       v5 = 0;
2024       if (! ieee_read_number (abfd, bytes, pp, pend, &v)
2025           || ! ieee_read_number (abfd, bytes, pp, pend, &v2)
2026           || ! ieee_read_optional_number (abfd, bytes, pp, pend, &v3,
2027                                           &present))
2028         return false;
2029       if (present)
2030         {
2031           if (! ieee_read_optional_number (abfd, bytes, pp, pend, &v4,
2032                                            &present))
2033             return false;
2034           if (present)
2035             {
2036               if (! ieee_read_optional_number (abfd, bytes, pp, pend, &v5,
2037                                                &present))
2038                 return false;
2039             }
2040         }
2041
2042       /* We have no way to record this information.  FIXME.  */
2043
2044       ieee_error (abfd, bytes, atn_code_start, "unsupported ATN12");
2045
2046       /* Return true to keep going.  */
2047       return true;
2048
2049     case 16:
2050       /* Constant.  The description of this that I have is ambiguous,
2051          so I'm not going to try to implement it.  */
2052       ieee_error (abfd, bytes, atn_code_start, "unsupported ATN16");
2053       return false;
2054
2055     case 19:
2056       /* Static variable from assembler.  */
2057       v2 = 0;
2058       if (! ieee_read_number (abfd, bytes, pp, pend, &v)
2059           || ! ieee_read_optional_number (abfd, bytes, pp, pend, &v2,
2060                                           &present)
2061           || ! ieee_require_asn (abfd, bytes, pp, pend, &v3))
2062         return false;
2063       namcopy = savestring (name, namlen);
2064       /* We don't really handle this correctly.  FIXME.  */
2065       return debug_record_variable (dhandle, namcopy,
2066                                     debug_make_void_type (dhandle),
2067                                     v2 != 0 ? DEBUG_GLOBAL : DEBUG_STATIC,
2068                                     v3);
2069
2070     case 62:
2071       /* Procedure miscellaneous information.  */
2072     case 63:
2073       /* Variable miscellaneous information.  */
2074     case 64:
2075       /* Module miscellaneous information.  */
2076       if (! ieee_read_number (abfd, bytes, pp, pend, &v)
2077           || ! ieee_read_number (abfd, bytes, pp, pend, &v2)
2078           || ! ieee_read_optional_id (abfd, bytes, pp, pend, &name, &namlen,
2079                                       &present))
2080         return false;
2081
2082       /* We just ignore all of this stuff.  FIXME.  */
2083
2084       for (; v2 > 0; --v2)
2085         {
2086           ieee_record_enum_type c;
2087           bfd_vma vindx;
2088           const char *str;
2089           unsigned long strlen;
2090
2091           c = (ieee_record_enum_type) **pp;
2092           ++*pp;
2093           if (c != ieee_at_record_enum
2094               && c != ieee_e2_first_byte_enum)
2095             {
2096               ieee_error (abfd, bytes, *pp - 1, "bad misc record");
2097               return false;
2098             }
2099
2100           c = (ieee_record_enum_type) (((unsigned int) c << 8) | **pp);
2101           ++*pp;
2102           switch (c)
2103             {
2104             default:
2105               ieee_error (abfd, bytes, *pp - 2, "bad misc record");
2106               return false;
2107
2108             case ieee_atn_record_enum:
2109               if (! ieee_read_number (abfd, bytes, pp, pend, &vindx))
2110                 return false;
2111               if ((*pp)[0] != 0 || (*pp)[1] != 65)
2112                 {
2113                   ieee_error (abfd, bytes, *pp, "bad atn in misc");
2114                   return false;
2115                 }
2116               *pp += 2;
2117               if (! ieee_read_id (abfd, bytes, pp, pend, &str, &strlen))
2118                 return false;
2119               break;
2120
2121             case ieee_asn_record_enum:
2122               if (! ieee_read_number (abfd, bytes, pp, pend, &vindx)
2123                   || ! ieee_read_expression (abfd, bytes, pp, pend, &v3))
2124                 return false;
2125               break;
2126             }
2127         }
2128
2129       return true;
2130     }
2131
2132   /*NOTREACHED*/
2133 }
2134
2135 /* Require an ASN record.  */
2136
2137 static boolean
2138 ieee_require_asn (abfd, bytes, pp, pend, pv)
2139      bfd *abfd;
2140      const bfd_byte *bytes;
2141      const bfd_byte **pp;
2142      const bfd_byte *pend;
2143      bfd_vma *pv;
2144 {
2145   const bfd_byte *start;
2146   ieee_record_enum_type c;
2147   bfd_vma varindx;
2148
2149   start = *pp;
2150
2151   c = (ieee_record_enum_type) **pp;
2152   if (c != ieee_e2_first_byte_enum)
2153     {
2154       ieee_error (abfd, bytes, start, "missing required ASN");
2155       return false;
2156     }
2157   ++*pp;
2158
2159   c = (ieee_record_enum_type) (((unsigned int) c << 8) | **pp);
2160   if (c != ieee_asn_record_enum)
2161     {
2162       ieee_error (abfd, bytes, start, "missing required ASN");
2163       return false;
2164     }
2165   ++*pp;
2166
2167   /* Just ignore the variable index.  */
2168   if (! ieee_read_number (abfd, bytes, pp, pend, &varindx))
2169     return false;
2170
2171   return ieee_read_expression (abfd, bytes, pp, pend, pv);
2172 }
2173 \f
2174 /* Convert a register number in IEEE debugging information into a
2175    generic register number.  */
2176
2177 static int
2178 ieee_regno_to_genreg (abfd, r)
2179      bfd *abfd;
2180      int r;
2181 {
2182   return r;
2183 }
2184
2185 /* Convert a generic register number to an IEEE specific one.  */
2186
2187 static int
2188 ieee_genreg_to_regno (abfd, r)
2189      bfd *abfd;
2190      int r;
2191 {
2192   return r;
2193 }
2194 \f
2195 /* These routines build IEEE debugging information out of the generic
2196    debugging information.  */
2197
2198 /* We build the IEEE debugging information byte by byte.  Rather than
2199    waste time copying data around, we use a linked list of buffers to
2200    hold the data.  */
2201
2202 #define IEEE_BUFSIZE (490)
2203
2204 struct ieee_buf
2205 {
2206   /* Next buffer.  */
2207   struct ieee_buf *next;
2208   /* Number of data bytes in this buffer.  */
2209   unsigned int c;
2210   /* Bytes.  */
2211   bfd_byte buf[IEEE_BUFSIZE];
2212 };
2213
2214 /* In order to generate the BB11 blocks required by the HP emulator,
2215    we keep track of ranges of addresses which correspond to a given
2216    compilation unit.  */
2217
2218 struct ieee_range
2219 {
2220   /* Next range.  */
2221   struct ieee_range *next;
2222   /* Low address.  */
2223   bfd_vma low;
2224   /* High address.  */
2225   bfd_vma high;
2226 };
2227
2228 /* This is how we store types for the writing routines.  Most types
2229    are simply represented by a type index.  */
2230
2231 struct ieee_write_type
2232 {
2233   /* Type index.  */
2234   unsigned int indx;
2235   /* The size of the type, if known.  */
2236   unsigned int size;
2237   /* If this is a struct, this is where the struct definition is
2238      built.  */
2239   struct ieee_buf *strdef;
2240   /* Whether the type is unsigned.  */
2241   unsigned int unsignedp : 1;
2242   /* Whether this is a reference type.  */
2243   unsigned int referencep : 1;
2244 };
2245
2246 /* This is the type stack used by the debug writing routines.  FIXME:
2247    We could generate more efficient output if we remembered when we
2248    have output a particular type before.  */
2249
2250 struct ieee_type_stack
2251 {
2252   /* Next entry on stack.  */
2253   struct ieee_type_stack *next;
2254   /* Type information.  */
2255   struct ieee_write_type type;
2256 };
2257
2258 /* This is a list of associations between names and types.  This could
2259    be more efficiently implemented as a hash table.  */
2260
2261 struct ieee_name_type
2262 {
2263   /* Next name/type assocation.  */
2264   struct ieee_name_type *next;
2265   /* Name.  */
2266   const char *name;
2267   /* Type.  */
2268   struct ieee_write_type type;
2269   /* If this is a tag which has not yet been defined, this is the
2270      kind.  If the tag has been defined, this is DEBUG_KIND_ILLEGAL.  */
2271   enum debug_type_kind kind;
2272 };
2273
2274 /* This is a list of pending function parameter information.  We don't
2275    output them until we see the first block.  */
2276
2277 struct ieee_pending_parm
2278 {
2279   /* Next pending parameter.  */
2280   struct ieee_pending_parm *next;
2281   /* Name.  */
2282   const char *name;
2283   /* Type index.  */
2284   unsigned int type;
2285   /* Kind.  */
2286   enum debug_parm_kind kind;
2287   /* Value.  */
2288   bfd_vma val;
2289 };
2290
2291 /* This is the handle passed down by debug_write.  */
2292
2293 struct ieee_handle
2294 {
2295   /* BFD we are writing to.  */
2296   bfd *abfd;
2297   /* Current data buffer.  */
2298   struct ieee_buf *current;
2299   /* Filename of current compilation unit.  */
2300   const char *filename;
2301   /* Module name of current compilation unit.  */
2302   const char *modname;
2303   /* List of finished data buffers.  */
2304   struct ieee_buf *data;
2305   /* List of buffers for typedefs in the current compilation unit.  */
2306   struct ieee_buf *types;
2307   /* List of buffers for variables and functions in the current
2308      compilation unit.  */
2309   struct ieee_buf *vars;
2310   /* List of buffers for line numbers in the current compilation unit.  */
2311   struct ieee_buf *linenos;
2312   /* Ranges for the current compilation unit.  */
2313   struct ieee_range *ranges;
2314   /* Nested pending ranges.  */
2315   struct ieee_range *pending_ranges;
2316   /* Type stack.  */
2317   struct ieee_type_stack *type_stack;
2318   /* Next unallocated type index.  */
2319   unsigned int type_indx;
2320   /* Next unallocated name index.  */
2321   unsigned int name_indx;
2322   /* Typedefs.  */
2323   struct ieee_name_type *typedefs;
2324   /* Tags.  */
2325   struct ieee_name_type *tags;
2326   /* The depth of block nesting.  This is 0 outside a function, and 1
2327      just after start_function is called.  */
2328   unsigned int block_depth;
2329   /* Pending function parameters.  */
2330   struct ieee_pending_parm *pending_parms;
2331   /* Current line number filename.  */
2332   const char *lineno_filename;
2333   /* Line number name index.  */
2334   unsigned int lineno_name_indx;
2335 };
2336
2337 static boolean ieee_change_buffer
2338   PARAMS ((struct ieee_handle *, struct ieee_buf **));
2339 static boolean ieee_push_type
2340   PARAMS ((struct ieee_handle *, unsigned int, unsigned int, boolean));
2341 static unsigned int ieee_pop_type PARAMS ((struct ieee_handle *));
2342 static boolean ieee_add_range
2343   PARAMS ((struct ieee_handle *, bfd_vma, bfd_vma));
2344 static boolean ieee_start_range PARAMS ((struct ieee_handle *, bfd_vma));
2345 static boolean ieee_end_range PARAMS ((struct ieee_handle *, bfd_vma));
2346 static boolean ieee_real_write_byte PARAMS ((struct ieee_handle *, int));
2347 static boolean ieee_write_2bytes PARAMS ((struct ieee_handle *, int));
2348 static boolean ieee_write_number PARAMS ((struct ieee_handle *, bfd_vma));
2349 static boolean ieee_write_id PARAMS ((struct ieee_handle *, const char *));
2350 static boolean ieee_define_type
2351   PARAMS ((struct ieee_handle *, unsigned int, boolean));
2352 static boolean ieee_define_named_type
2353   PARAMS ((struct ieee_handle *, const char *, boolean, unsigned int, boolean,
2354            struct ieee_buf **));
2355 static boolean ieee_finish_compilation_unit PARAMS ((struct ieee_handle *));
2356 static boolean ieee_output_pending_parms PARAMS ((struct ieee_handle *));
2357
2358 static boolean ieee_start_compilation_unit PARAMS ((PTR, const char *));
2359 static boolean ieee_start_source PARAMS ((PTR, const char *));
2360 static boolean ieee_ellipsis_type PARAMS ((PTR));
2361 static boolean ieee_empty_type PARAMS ((PTR));
2362 static boolean ieee_void_type PARAMS ((PTR));
2363 static boolean ieee_int_type PARAMS ((PTR, unsigned int, boolean));
2364 static boolean ieee_float_type PARAMS ((PTR, unsigned int));
2365 static boolean ieee_complex_type PARAMS ((PTR, unsigned int));
2366 static boolean ieee_bool_type PARAMS ((PTR, unsigned int));
2367 static boolean ieee_enum_type
2368   PARAMS ((PTR, const char *, const char **, bfd_signed_vma *));
2369 static boolean ieee_pointer_type PARAMS ((PTR));
2370 static boolean ieee_function_type PARAMS ((PTR));
2371 static boolean ieee_reference_type PARAMS ((PTR));
2372 static boolean ieee_range_type PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma));
2373 static boolean ieee_array_type
2374   PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma, boolean));
2375 static boolean ieee_set_type PARAMS ((PTR, boolean));
2376 static boolean ieee_offset_type PARAMS ((PTR));
2377 static boolean ieee_method_type PARAMS ((PTR, boolean, int));
2378 static boolean ieee_const_type PARAMS ((PTR));
2379 static boolean ieee_volatile_type PARAMS ((PTR));
2380 static boolean ieee_start_struct_type
2381   PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int));
2382 static boolean ieee_struct_field
2383   PARAMS ((PTR, const char *, bfd_vma, bfd_vma, enum debug_visibility));
2384 static boolean ieee_end_struct_type PARAMS ((PTR));
2385 static boolean ieee_start_class_type
2386   PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int, boolean,
2387            boolean));
2388 static boolean ieee_class_static_member
2389   PARAMS ((PTR, const char *, const char *, enum debug_visibility));
2390 static boolean ieee_class_baseclass
2391   PARAMS ((PTR, bfd_vma, boolean, enum debug_visibility));
2392 static boolean ieee_class_start_method PARAMS ((PTR, const char *));
2393 static boolean ieee_class_method_variant
2394   PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean,
2395            bfd_vma, boolean));
2396 static boolean ieee_class_static_method_variant
2397   PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean));
2398 static boolean ieee_class_end_method PARAMS ((PTR));
2399 static boolean ieee_end_class_type PARAMS ((PTR));
2400 static boolean ieee_typedef_type PARAMS ((PTR, const char *));
2401 static boolean ieee_tag_type
2402   PARAMS ((PTR, const char *, unsigned int, enum debug_type_kind));
2403 static boolean ieee_typdef PARAMS ((PTR, const char *));
2404 static boolean ieee_tag PARAMS ((PTR, const char *));
2405 static boolean ieee_int_constant PARAMS ((PTR, const char *, bfd_vma));
2406 static boolean ieee_float_constant PARAMS ((PTR, const char *, double));
2407 static boolean ieee_typed_constant PARAMS ((PTR, const char *, bfd_vma));
2408 static boolean ieee_variable
2409   PARAMS ((PTR, const char *, enum debug_var_kind, bfd_vma));
2410 static boolean ieee_start_function PARAMS ((PTR, const char *, boolean));
2411 static boolean ieee_function_parameter
2412   PARAMS ((PTR, const char *, enum debug_parm_kind, bfd_vma));
2413 static boolean ieee_start_block PARAMS ((PTR, bfd_vma));
2414 static boolean ieee_end_block PARAMS ((PTR, bfd_vma));
2415 static boolean ieee_end_function PARAMS ((PTR));
2416 static boolean ieee_lineno
2417   PARAMS ((PTR, const char *, unsigned long, bfd_vma));
2418
2419 static const struct debug_write_fns ieee_fns =
2420 {
2421   ieee_start_compilation_unit,
2422   ieee_start_source,
2423   ieee_ellipsis_type,
2424   ieee_empty_type,
2425   ieee_void_type,
2426   ieee_int_type,
2427   ieee_float_type,
2428   ieee_complex_type,
2429   ieee_bool_type,
2430   ieee_enum_type,
2431   ieee_pointer_type,
2432   ieee_function_type,
2433   ieee_reference_type,
2434   ieee_range_type,
2435   ieee_array_type,
2436   ieee_set_type,
2437   ieee_offset_type,
2438   ieee_method_type,
2439   ieee_const_type,
2440   ieee_volatile_type,
2441   ieee_start_struct_type,
2442   ieee_struct_field,
2443   ieee_end_struct_type,
2444   ieee_start_class_type,
2445   ieee_class_static_member,
2446   ieee_class_baseclass,
2447   ieee_class_start_method,
2448   ieee_class_method_variant,
2449   ieee_class_static_method_variant,
2450   ieee_class_end_method,
2451   ieee_end_class_type,
2452   ieee_typedef_type,
2453   ieee_tag_type,
2454   ieee_typdef,
2455   ieee_tag,
2456   ieee_int_constant,
2457   ieee_float_constant,
2458   ieee_typed_constant,
2459   ieee_variable,
2460   ieee_start_function,
2461   ieee_function_parameter,
2462   ieee_start_block,
2463   ieee_end_block,
2464   ieee_end_function,
2465   ieee_lineno
2466 };
2467
2468 /* Change the current buffer to a specified buffer chain.  */
2469
2470 static boolean
2471 ieee_change_buffer (info, ppbuf)
2472      struct ieee_handle *info;
2473      struct ieee_buf **ppbuf;
2474 {
2475   struct ieee_buf *buf;
2476
2477   if (*ppbuf != NULL)
2478     {
2479       for (buf = *ppbuf; buf->next != NULL; buf = buf->next)
2480         ;
2481     }
2482   else
2483     {
2484       buf = (struct ieee_buf *) xmalloc (sizeof *buf);
2485       buf->next = NULL;
2486       buf->c = 0;
2487       *ppbuf = buf;
2488     }
2489
2490   info->current = buf;
2491   return true;
2492 }
2493
2494 /* Push a type index onto the type stack.  */
2495
2496 static boolean
2497 ieee_push_type (info, indx, size, unsignedp)
2498      struct ieee_handle *info;
2499      unsigned int indx;
2500      unsigned int size;
2501      boolean unsignedp;
2502 {
2503   struct ieee_type_stack *ts;
2504
2505   ts = (struct ieee_type_stack *) xmalloc (sizeof *ts);
2506   memset (ts, 0, sizeof *ts);
2507
2508   ts->type.indx = indx;
2509   ts->type.size = size;
2510   ts->type.unsignedp = unsignedp;
2511
2512   ts->next = info->type_stack;
2513   info->type_stack = ts;
2514
2515   return true;
2516 }
2517
2518 /* Pop a type index off the type stack.  */
2519
2520 static unsigned int
2521 ieee_pop_type (info)
2522      struct ieee_handle *info;
2523 {
2524   struct ieee_type_stack *ts;
2525   unsigned int ret;
2526
2527   ts = info->type_stack;
2528   assert (ts != NULL);
2529   ret = ts->type.indx;
2530   info->type_stack = ts->next;
2531   free (ts);
2532   return ret;
2533 }
2534
2535 /* Add a range of bytes included in the current compilation unit.  */
2536
2537 static boolean
2538 ieee_add_range (info, low, high)
2539      struct ieee_handle *info;
2540      bfd_vma low;
2541      bfd_vma high;
2542 {
2543   struct ieee_range *r, **pr;
2544
2545   if (low == (bfd_vma) -1 || high == (bfd_vma) -1)
2546     return true;
2547
2548   for (r = info->ranges; r != NULL; r = r->next)
2549     {
2550       if (high >= r->low && low <= r->high)
2551         {
2552           /* The new range overlaps r.  */
2553           if (low < r->low)
2554             r->low = low;
2555           if (high > r->high)
2556             r->high = high;
2557           pr = &r->next;
2558           while (*pr != NULL && (*pr)->low <= r->high)
2559             {
2560               struct ieee_range *n;
2561
2562               if ((*pr)->high > r->high)
2563                 r->high = (*pr)->high;
2564               n = (*pr)->next;
2565               free (*pr);
2566               *pr = n;
2567             }
2568           return true;
2569         }
2570     }
2571
2572   r = (struct ieee_range *) xmalloc (sizeof *r);
2573   memset (r, 0, sizeof *r);
2574
2575   r->low = low;
2576   r->high = high;
2577
2578   /* Store the ranges sorted by address.  */
2579   for (pr = &info->ranges; *pr != NULL; pr = &(*pr)->next)
2580     if ((*pr)->next != NULL && (*pr)->next->low > high)
2581       break;
2582   r->next = *pr;
2583   *pr = r;
2584
2585   return true;
2586 }
2587
2588 /* Start a new range for which we only have the low address.  */
2589
2590 static boolean
2591 ieee_start_range (info, low)
2592      struct ieee_handle *info;
2593      bfd_vma low;
2594 {
2595   struct ieee_range *r;
2596
2597   r = (struct ieee_range *) xmalloc (sizeof *r);
2598   memset (r, 0, sizeof *r);
2599   r->low = low;
2600   r->next = info->pending_ranges;
2601   info->pending_ranges = r;
2602   return true;
2603 }  
2604
2605 /* Finish a range started by ieee_start_range.  */
2606
2607 static boolean
2608 ieee_end_range (info, high)
2609      struct ieee_handle *info;
2610      bfd_vma high;
2611 {
2612   struct ieee_range *r;
2613   bfd_vma low;
2614
2615   assert (info->pending_ranges != NULL);
2616   r = info->pending_ranges;
2617   low = r->low;
2618   info->pending_ranges = r->next;
2619   free (r);
2620   return ieee_add_range (info, low, high);
2621 }
2622
2623 /* Write a byte into the buffer.  We use a macro for speed and a
2624    function for the complex cases.  */
2625
2626 #define ieee_write_byte(info, b)                                \
2627   ((info)->current->c < IEEE_BUFSIZE                            \
2628    ? ((info)->current->buf[(info)->current->c++] = (b), true)   \
2629    : ieee_real_write_byte ((info), (b)))
2630
2631 static boolean
2632 ieee_real_write_byte (info, b)
2633      struct ieee_handle *info;
2634      int b;
2635 {
2636   if (info->current->c >= IEEE_BUFSIZE)
2637     {
2638       struct ieee_buf *n;
2639
2640       n = (struct ieee_buf *) xmalloc (sizeof *n);
2641       n->next = NULL;
2642       n->c = 0;
2643       info->current->next = n;
2644       info->current = n;
2645     }
2646
2647   info->current->buf[info->current->c] = b;
2648   ++info->current->c;
2649
2650   return true;
2651 }
2652
2653 /* Write out two bytes.  */
2654
2655 static boolean
2656 ieee_write_2bytes (info, i)
2657      struct ieee_handle *info;
2658      int i;
2659 {
2660   return (ieee_write_byte (info, i >> 8)
2661           && ieee_write_byte (info, i & 0xff));
2662 }
2663
2664 /* Write out an integer.  */
2665
2666 static boolean
2667 ieee_write_number (info, v)
2668      struct ieee_handle *info;
2669      bfd_vma v;
2670 {
2671   bfd_vma t;
2672   bfd_byte ab[20];
2673   bfd_byte *p;
2674   unsigned int c;
2675
2676   if (v <= (bfd_vma) ieee_number_end_enum)
2677     return ieee_write_byte (info, (int) v);
2678
2679   t = v;
2680   p = ab + sizeof ab;
2681   while (t != 0)
2682     {
2683       *--p = t & 0xff;
2684       t >>= 8;
2685     }
2686   c = (ab + 20) - p;
2687
2688   if (c > (unsigned int) (ieee_number_repeat_end_enum
2689                           - ieee_number_repeat_start_enum))
2690     {
2691       fprintf (stderr, "IEEE numeric overflow: 0x");
2692       fprintf_vma (stderr, v);
2693       fprintf (stderr, "\n");
2694       return false;
2695     }
2696
2697   if (! ieee_write_byte (info, (int) ieee_number_repeat_start_enum + c))
2698     return false;
2699   for (; c > 0; --c, ++p)
2700     {
2701       if (! ieee_write_byte (info, *p))
2702         return false;
2703     }
2704
2705   return true;
2706 }
2707
2708 /* Write out a string.  */
2709
2710 static boolean
2711 ieee_write_id (info, s)
2712      struct ieee_handle *info;
2713      const char *s;
2714 {
2715   unsigned int len;
2716
2717   len = strlen (s);
2718   if (len <= 0x7f)
2719     {
2720       if (! ieee_write_byte (info, len))
2721         return false;
2722     }
2723   else if (len <= 0xff)
2724     {
2725       if (! ieee_write_byte (info, (int) ieee_extension_length_1_enum)
2726           || ! ieee_write_byte (info, len))
2727         return false;
2728     }
2729   else if (len <= 0xffff)
2730     {
2731       if (! ieee_write_byte (info, (int) ieee_extension_length_2_enum)
2732           || ! ieee_write_2bytes (info, len))
2733         return false;
2734     }
2735   else
2736     {
2737       fprintf (stderr, "IEEE string length overflow: %u\n", len);
2738       return false;
2739     }
2740
2741   for (; *s != '\0'; s++)
2742     if (! ieee_write_byte (info, *s))
2743       return false;
2744
2745   return true;
2746 }
2747
2748 /* Start defining a type.  */
2749
2750 static boolean
2751 ieee_define_type (info, size, unsignedp)
2752      struct ieee_handle *info;
2753      unsigned int size;
2754      boolean unsignedp;
2755 {
2756   return ieee_define_named_type (info, (const char *) NULL, false, size,
2757                                  unsignedp, (struct ieee_buf **) NULL);
2758 }
2759
2760 /* Start defining a named type.  */
2761
2762 static boolean
2763 ieee_define_named_type (info, name, tagp, size, unsignedp, ppbuf)
2764      struct ieee_handle *info;
2765      const char *name;
2766      boolean tagp;
2767      unsigned int size;
2768      boolean unsignedp;
2769      struct ieee_buf **ppbuf;
2770 {
2771   unsigned int type_indx;
2772   unsigned int name_indx;
2773
2774   if (! tagp || name == NULL || *name == '\0')
2775     {
2776       type_indx = info->type_indx;
2777       ++info->type_indx;
2778     }
2779   else
2780     {
2781       struct ieee_name_type *nt;
2782
2783       /* The name is a tag.  If we have already defined the tag, we
2784          must use the existing type index.  */
2785       for (nt = info->tags; nt != NULL; nt = nt->next)
2786         if (nt->name[0] == name[0]
2787             && strcmp (nt->name, name) == 0)
2788           break;
2789
2790       if (nt == NULL)
2791         {
2792           nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
2793           memset (nt, 0, sizeof *nt);
2794           nt->name = name;
2795           nt->next = info->tags;
2796           info->tags = nt;
2797           nt->type.indx = info->type_indx;
2798           ++info->type_indx;
2799         }
2800
2801       nt->type.size = size;
2802       nt->type.unsignedp = unsignedp;
2803       nt->kind = DEBUG_KIND_ILLEGAL;
2804
2805       type_indx = nt->type.indx;
2806     }
2807
2808   name_indx = info->name_indx;
2809   ++info->name_indx;
2810
2811   if (name == NULL)
2812     name = "";
2813
2814   /* If we were given a buffer, use it; otherwise, use the general
2815      type information, and make sure that the type block is started.  */
2816   if (ppbuf != NULL)
2817     {
2818       if (! ieee_change_buffer (info, ppbuf))
2819         return false;
2820     }
2821   else if (info->types != NULL)
2822     {
2823       if (! ieee_change_buffer (info, &info->types))
2824         return false;
2825     }
2826   else
2827     {
2828       if (! ieee_change_buffer (info, &info->types)
2829           || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
2830           || ! ieee_write_byte (info, 1)
2831           || ! ieee_write_number (info, 0)
2832           || ! ieee_write_id (info, info->modname))
2833         return false;
2834     }
2835
2836   /* Push the new type on the type stack, write out an NN record, and
2837      write out the start of a TY record.  The caller will then finish
2838      the TY record.  */
2839   return (ieee_push_type (info, type_indx, size, unsignedp)
2840           && ieee_write_byte (info, (int) ieee_nn_record)
2841           && ieee_write_number (info, name_indx)
2842           && ieee_write_id (info, name)
2843           && ieee_write_byte (info, (int) ieee_ty_record_enum)
2844           && ieee_write_number (info, type_indx)
2845           && ieee_write_byte (info, 0xce)
2846           && ieee_write_number (info, name_indx));
2847 }
2848 \f
2849 /* The general routine to write out IEEE debugging information.  */
2850
2851 boolean
2852 write_ieee_debugging_info (abfd, dhandle)
2853      bfd *abfd;
2854      PTR dhandle;
2855 {
2856   struct ieee_handle info;
2857   struct ieee_buf *tags;
2858   struct ieee_name_type *nt;
2859   asection *s;
2860   const char *err;
2861   struct ieee_buf *b;
2862
2863   memset (&info, 0, sizeof info);
2864   info.abfd = abfd;
2865   info.type_indx = 256;
2866   info.name_indx = 32;
2867
2868   if (! debug_write (dhandle, &ieee_fns, (PTR) &info))
2869     return false;
2870
2871   if (info.filename != NULL)
2872     {
2873       if (! ieee_finish_compilation_unit (&info))
2874         return false;
2875     }
2876
2877   /* Put any undefined tags in the global typedef information.  */
2878   tags = NULL;
2879   for (nt = info.tags; nt != NULL; nt = nt->next)
2880     {
2881       unsigned int name_indx;
2882       char code;
2883
2884       if (nt->kind == DEBUG_KIND_ILLEGAL)
2885         continue;
2886       if (tags == NULL)
2887         {
2888           if (! ieee_change_buffer (&info, &tags)
2889               || ! ieee_write_byte (&info, (int) ieee_bb_record_enum)
2890               || ! ieee_write_byte (&info, 2)
2891               || ! ieee_write_number (&info, 0)
2892               || ! ieee_write_id (&info, ""))
2893             return false;
2894         }
2895       name_indx = info.name_indx;
2896       ++info.name_indx;
2897       if (! ieee_write_byte (&info, (int) ieee_nn_record)
2898           || ! ieee_write_number (&info, name_indx)
2899           || ! ieee_write_id (&info, nt->name)
2900           || ! ieee_write_byte (&info, (int) ieee_ty_record_enum)
2901           || ! ieee_write_number (&info, nt->type.indx)
2902           || ! ieee_write_byte (&info, 0xce)
2903           || ! ieee_write_number (&info, name_indx))
2904         return false;
2905       switch (nt->kind)
2906         {
2907         default:
2908           abort ();
2909           return false;
2910         case DEBUG_KIND_STRUCT:
2911         case DEBUG_KIND_CLASS:
2912           code = 'S';
2913           break;
2914         case DEBUG_KIND_UNION:
2915         case DEBUG_KIND_UNION_CLASS:
2916           code = 'U';
2917           break;
2918         case DEBUG_KIND_ENUM:
2919           code = 'E';
2920           break;
2921         }
2922       if (! ieee_write_number (&info, code)
2923           || ! ieee_write_number (&info, 0))
2924         return false;
2925     }
2926   if (tags != NULL)
2927     {
2928       struct ieee_buf **pb;
2929
2930       if (! ieee_write_byte (&info, (int) ieee_be_record_enum))
2931         return false;
2932
2933       for (pb = &tags; *pb != NULL; pb = &(*pb)->next)
2934         ;
2935       *pb = info.data;
2936       info.data = tags;
2937     }
2938
2939   /* Now all the data is in info.data.  Write it out to the BFD.  We
2940      normally would need to worry about whether all the other sections
2941      are set up yet, but the IEEE backend will handle this particular
2942      case correctly regardless.  */
2943   if (info.data == NULL)
2944     {
2945       /* There is no debugging information.  */
2946       return true;
2947     }
2948   err = NULL;
2949   s = bfd_make_section (abfd, ".debug");
2950   if (s == NULL)
2951     err = "bfd_make_section";
2952   if (err == NULL)
2953     {
2954       if (! bfd_set_section_flags (abfd, s, SEC_DEBUGGING | SEC_HAS_CONTENTS))
2955         err = "bfd_set_section_flags";
2956     }
2957   if (err == NULL)
2958     {
2959       bfd_size_type size;
2960
2961       size = 0;
2962       for (b = info.data; b != NULL; b = b->next)
2963         size += b->c;
2964       if (! bfd_set_section_size (abfd, s, size))
2965         err = "bfd_set_section_size";
2966     }
2967   if (err == NULL)
2968     {
2969       file_ptr offset;
2970
2971       offset = 0;
2972       for (b = info.data; b != NULL; b = b->next)
2973         {
2974           if (! bfd_set_section_contents (abfd, s, b->buf, offset, b->c))
2975             {
2976               err = "bfd_set_section_contents";
2977               break;
2978             }
2979           offset += b->c;
2980         }
2981     }
2982
2983   if (err != NULL)
2984     {
2985       fprintf (stderr, "%s: %s: %s\n", bfd_get_filename (abfd), err,
2986                bfd_errmsg (bfd_get_error ()));
2987       return false;
2988     }
2989
2990   return true;
2991 }
2992
2993 /* Start writing out information for a compilation unit.  */
2994
2995 static boolean
2996 ieee_start_compilation_unit (p, filename)
2997      PTR p;
2998      const char *filename;
2999 {
3000   struct ieee_handle *info = (struct ieee_handle *) p;
3001   const char *modname;
3002   char *c, *s;
3003
3004   if (info->filename != NULL)
3005     {
3006       if (! ieee_finish_compilation_unit (info))
3007         return false;
3008     }
3009
3010   info->filename = filename;
3011   modname = strrchr (filename, '/');
3012   if (modname != NULL)
3013     ++modname;
3014   else
3015     {
3016       modname = strrchr (filename, '\\');
3017       if (modname != NULL)
3018         ++modname;
3019       else
3020         modname = filename;
3021     }
3022   c = xstrdup (modname);
3023   s = strrchr (c, '.');
3024   if (s != NULL)
3025     *s = '\0';
3026   info->modname = c;
3027
3028   info->types = NULL;
3029   info->vars = NULL;
3030   info->linenos = NULL;
3031   info->ranges = NULL;
3032
3033   return true;
3034 }
3035
3036 /* Finish up a compilation unit.  */
3037
3038 static boolean
3039 ieee_finish_compilation_unit (info)
3040      struct ieee_handle *info;
3041 {
3042   struct ieee_buf **pp;
3043   struct ieee_range *r;
3044
3045   if (info->types != NULL)
3046     {
3047       if (! ieee_change_buffer (info, &info->types)
3048           || ! ieee_write_byte (info, (int) ieee_be_record_enum))
3049         return false;
3050     }
3051
3052   if (info->vars != NULL)
3053     {
3054       if (! ieee_change_buffer (info, &info->vars)
3055           || ! ieee_write_byte (info, (int) ieee_be_record_enum))
3056         return false;
3057     }
3058
3059   if (info->linenos != NULL)
3060     {
3061       if (! ieee_change_buffer (info, &info->linenos)
3062           || ! ieee_write_byte (info, (int) ieee_be_record_enum))
3063         return false;
3064     }
3065
3066   for (pp = &info->data; *pp != NULL; pp = &(*pp)->next)
3067     ;
3068   *pp = info->types;
3069   for (; *pp != NULL; pp = &(*pp)->next)
3070     ;
3071   *pp = info->vars;
3072   for (; *pp != NULL; pp = &(*pp)->next)
3073     ;
3074   *pp = info->linenos;
3075
3076   /* Build BB10/BB11 blocks based on the ranges we recorded.  */
3077   if (! ieee_change_buffer (info, &info->data))
3078     return false;
3079
3080   if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
3081       || ! ieee_write_byte (info, 10)
3082       || ! ieee_write_number (info, 0)
3083       || ! ieee_write_id (info, info->modname)
3084       || ! ieee_write_id (info, "")
3085       || ! ieee_write_number (info, 0)
3086       || ! ieee_write_id (info, "GNU objcopy"))
3087     return false;
3088
3089   for (r = info->ranges; r != NULL; r = r->next)
3090     {
3091       bfd_vma low, high;
3092       asection *s;
3093       int kind;
3094
3095       low = r->low;
3096       high = r->high;
3097
3098       /* Find the section corresponding to this range.  */
3099       for (s = info->abfd->sections; s != NULL; s = s->next)
3100         {
3101           if (bfd_get_section_vma (info->abfd, s) <= low
3102               && high <= (bfd_get_section_vma (info->abfd, s)
3103                           + bfd_section_size (info->abfd, s)))
3104             break;
3105         }
3106
3107       if (s == NULL)
3108         {
3109           /* Just ignore this range.  */
3110           continue;
3111         }
3112
3113       /* Coalesce ranges if it seems reasonable.  */
3114       while (r->next != NULL
3115              && high + 64 >= r->next->low
3116              && (r->next->high
3117                  <= (bfd_get_section_vma (info->abfd, s)
3118                      + bfd_section_size (info->abfd, s))))
3119         {
3120           r = r->next;
3121           high = r->next->high;
3122         }
3123
3124       if ((s->flags & SEC_CODE) != 0)
3125         kind = 1;
3126       else if ((s->flags & SEC_READONLY) != 0)
3127         kind = 3;
3128       else
3129         kind = 2;
3130
3131       if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
3132           || ! ieee_write_byte (info, 11)
3133           || ! ieee_write_number (info, 0)
3134           || ! ieee_write_id (info, "")
3135           || ! ieee_write_number (info, kind)
3136           || ! ieee_write_number (info, s->index)
3137           || ! ieee_write_number (info, low)
3138           || ! ieee_write_byte (info, (int) ieee_be_record_enum)
3139           || ! ieee_write_number (info, high - low))
3140         return false;
3141     }
3142
3143   if (! ieee_write_byte (info, (int) ieee_be_record_enum))
3144     return false;
3145
3146   return true;
3147 }
3148
3149 /* Start recording information from a particular source file.  This is
3150    used to record which file defined which types, variables, etc.  It
3151    is not used for line numbers, since the lineno entry point passes
3152    down the file name anyhow.  IEEE debugging information doesn't seem
3153    to store this information anywhere.  */
3154
3155 /*ARGSUSED*/
3156 static boolean
3157 ieee_start_source (p, filename)
3158      PTR p;
3159      const char *filename;
3160 {
3161   return true;
3162 }
3163
3164 /* Make an ellipsis type.  */
3165
3166 static boolean
3167 ieee_ellipsis_type (p)
3168      PTR p;
3169 {
3170   abort ();
3171 }
3172
3173 /* Make an empty type.  */
3174
3175 static boolean
3176 ieee_empty_type (p)
3177      PTR p;
3178 {
3179   struct ieee_handle *info = (struct ieee_handle *) p;
3180
3181   return ieee_push_type (info, 0, 0, false);
3182 }
3183
3184 /* Make a void type.  */
3185
3186 static boolean
3187 ieee_void_type (p)
3188      PTR p;
3189 {
3190   struct ieee_handle *info = (struct ieee_handle *) p;
3191
3192   return ieee_push_type (info, 1, 0, false);
3193 }
3194
3195 /* Make an integer type.  */
3196
3197 static boolean
3198 ieee_int_type (p, size, unsignedp)
3199      PTR p;
3200      unsigned int size;
3201      boolean unsignedp;
3202 {
3203   struct ieee_handle *info = (struct ieee_handle *) p;
3204   unsigned int indx;
3205
3206   switch (size)
3207     {
3208     case 1:
3209       indx = (int) builtin_signed_char;
3210       break;
3211     case 2:
3212       indx = (int) builtin_signed_short_int;
3213       break;
3214     case 4:
3215       indx = (int) builtin_signed_long;
3216       break;
3217     case 8:
3218       indx = (int) builtin_signed_long_long;
3219       break;
3220     default:
3221       fprintf (stderr, "IEEE unsupported integer type size %u\n", size);
3222       return false;
3223     }
3224
3225   if (unsignedp)
3226     ++indx;
3227
3228   return ieee_push_type (info, indx, size, unsignedp);
3229 }
3230
3231 /* Make a floating point type.  */
3232
3233 static boolean
3234 ieee_float_type (p, size)
3235      PTR p;
3236      unsigned int size;
3237 {
3238   struct ieee_handle *info = (struct ieee_handle *) p;
3239   unsigned int indx;
3240
3241   switch (size)
3242     {
3243     case 4:
3244       indx = (int) builtin_float;
3245       break;
3246     case 8:
3247       indx = (int) builtin_double;
3248       break;
3249     case 12:
3250       /* FIXME: This size really depends upon the processor.  */
3251       indx = (int) builtin_long_double;
3252       break;
3253     case 16:
3254       indx = (int) builtin_long_long_double;
3255       break;
3256     default:
3257       fprintf (stderr, "IEEE unsupported float type size %u\n", size);
3258       return false;
3259     }
3260
3261   return ieee_push_type (info, indx, size, false);
3262 }
3263
3264 /* Make a complex type.  */
3265
3266 static boolean
3267 ieee_complex_type (p, size)
3268      PTR p;
3269      unsigned int size;
3270 {
3271   struct ieee_handle *info = (struct ieee_handle *) p;
3272   char code;
3273
3274   switch (size)
3275     {
3276     case 4:
3277       code = 'c';
3278       break;
3279     case 8:
3280       code = 'd';
3281       break;
3282     default:
3283       fprintf (stderr, "IEEE unsupported complex type size %u\n", size);
3284       return false;
3285     }
3286
3287   /* FIXME: I don't know what the string is for.  */
3288   return (ieee_define_type (info, size, false)
3289           && ieee_write_number (info, code)
3290           && ieee_write_id (info, ""));
3291 }
3292
3293 /* Make a boolean type.  IEEE doesn't support these, so we just make
3294    an integer type instead.  */
3295
3296 static boolean
3297 ieee_bool_type (p, size)
3298      PTR p;
3299      unsigned int size;
3300 {
3301   return ieee_int_type (p, size, true);
3302 }
3303
3304 /* Make an enumeration.  */
3305
3306 static boolean
3307 ieee_enum_type (p, tag, names, vals)
3308      PTR p;
3309      const char *tag;
3310      const char **names;
3311      bfd_signed_vma *vals;
3312 {
3313   struct ieee_handle *info = (struct ieee_handle *) p;
3314   boolean simple;
3315   int i;
3316
3317   /* If this is a simple enumeration, in which the values start at 0
3318      and always increment by 1, we can use type E.  Otherwise we must
3319      use type N.  */
3320
3321   simple = true;
3322   if (names != NULL)
3323     {
3324       for (i = 0; names[i] != NULL; i++)
3325         {
3326           if (vals[i] != i)
3327             {
3328               simple = false;
3329               break;
3330             }
3331         }
3332     }
3333
3334   if (! ieee_define_named_type (info, tag, true, 0, true,
3335                                 (struct ieee_buf **) NULL)
3336       || ! ieee_write_number (info, simple ? 'E' : 'N'))
3337     return false;
3338   if (simple)
3339     {
3340       /* FIXME: This is supposed to be the enumeration size, but we
3341          don't store that.  */
3342       if (! ieee_write_number (info, 4))
3343         return false;
3344     }
3345   if (names != NULL)
3346     {
3347       for (i = 0; names[i] != NULL; i++)
3348         {
3349           if (! ieee_write_id (info, names[i]))
3350             return false;
3351           if (! simple)
3352             {
3353               if (! ieee_write_number (info, vals[i]))
3354                 return false;
3355             }
3356         }
3357     }
3358
3359   return true;
3360 }
3361
3362 /* Make a pointer type.  */
3363
3364 static boolean
3365 ieee_pointer_type (p)
3366      PTR p;
3367 {
3368   struct ieee_handle *info = (struct ieee_handle *) p;
3369   unsigned int indx;
3370
3371   indx = ieee_pop_type (info);
3372
3373   /* A pointer to a simple builtin type can be obtained by adding 32.  */
3374   if (indx < 32)
3375     return ieee_push_type (info, indx + 32, 0, true);
3376
3377   return (ieee_define_type (info, 0, true)
3378           && ieee_write_number (info, 'P')
3379           && ieee_write_number (info, indx));
3380 }
3381
3382 /* Make a function type.  */
3383
3384 static boolean
3385 ieee_function_type (p)
3386      PTR p;
3387 {
3388   struct ieee_handle *info = (struct ieee_handle *) p;
3389   unsigned int indx;
3390
3391   indx = ieee_pop_type (info);
3392
3393   /* FIXME: IEEE can represent the argument types for the function,
3394      but we didn't store them.  */
3395
3396   /* An attribute of 0x41 means that the frame and push mask are
3397      unknown.  */
3398   return (ieee_define_type (info, 0, true)
3399           && ieee_write_number (info, 'x')
3400           && ieee_write_number (info, 0x41)
3401           && ieee_write_number (info, 0)
3402           && ieee_write_number (info, 0)
3403           && ieee_write_number (info, indx)
3404           && ieee_write_number (info, (bfd_vma) -1)
3405           && ieee_write_number (info, 0));
3406 }
3407
3408 /* Make a reference type.  */
3409
3410 static boolean
3411 ieee_reference_type (p)
3412      PTR p;
3413 {
3414   struct ieee_handle *info = (struct ieee_handle *) p;
3415
3416   /* IEEE appears to record a normal pointer type, and then use a
3417      pmisc record to indicate that it is really a reference.  */
3418
3419   if (! ieee_pointer_type (p))
3420     return false;
3421   info->type_stack->type.referencep = true;
3422   return true;
3423 }
3424
3425 /* Make a range type.  */
3426
3427 static boolean
3428 ieee_range_type (p, low, high)
3429      PTR p;
3430      bfd_signed_vma low;
3431      bfd_signed_vma high;
3432 {
3433   struct ieee_handle *info = (struct ieee_handle *) p;
3434   unsigned int size;
3435   boolean unsignedp;
3436
3437   size = info->type_stack->type.size;
3438   unsignedp = info->type_stack->type.unsignedp;
3439   (void) ieee_pop_type (info);
3440   return (ieee_define_type (info, size, unsignedp)
3441           && ieee_write_number (info, 'R')
3442           && ieee_write_number (info, (bfd_vma) low)
3443           && ieee_write_number (info, (bfd_vma) high)
3444           && ieee_write_number (info, unsignedp ? 0 : 1)
3445           && ieee_write_number (info, size));
3446 }
3447
3448 /* Make an array type.  */
3449
3450 /*ARGSUSED*/
3451 static boolean
3452 ieee_array_type (p, low, high, stringp)
3453      PTR p;
3454      bfd_signed_vma low;
3455      bfd_signed_vma high;
3456      boolean stringp;
3457 {
3458   struct ieee_handle *info = (struct ieee_handle *) p;
3459   unsigned int eleindx;
3460
3461   /* IEEE does not store the range, so we just ignore it.  */
3462   (void) ieee_pop_type (info);
3463   eleindx = ieee_pop_type (info);
3464
3465   if (! ieee_define_type (info, 0, false)
3466       || ! ieee_write_number (info, low == 0 ? 'Z' : 'C')
3467       || ! ieee_write_number (info, eleindx))
3468     return false;
3469   if (low != 0)
3470     {
3471       if (! ieee_write_number (info, low))
3472         return false;
3473     }
3474
3475   return ieee_write_number (info, high);
3476 }
3477
3478 /* Make a set type.  */
3479
3480 static boolean
3481 ieee_set_type (p, bitstringp)
3482      PTR p;
3483      boolean bitstringp;
3484 {
3485   struct ieee_handle *info = (struct ieee_handle *) p;
3486   unsigned int eleindx;
3487
3488   eleindx = ieee_pop_type (info);
3489
3490   /* FIXME: We don't know the size, so we just use 4.  */
3491
3492   return (ieee_define_type (info, 0, true)
3493           && ieee_write_number (info, 's')
3494           && ieee_write_number (info, 4)
3495           && ieee_write_number (info, eleindx));
3496 }
3497
3498 /* Make an offset type.  */
3499
3500 static boolean
3501 ieee_offset_type (p)
3502      PTR p;
3503 {
3504   struct ieee_handle *info = (struct ieee_handle *) p;
3505   unsigned int targetindx, baseindx;
3506
3507   targetindx = ieee_pop_type (info);
3508   baseindx = ieee_pop_type (info);
3509
3510   /* FIXME: The MRI C++ compiler does not appear to generate any
3511      useful type information about an offset type.  It just records a
3512      pointer to member as an integer.  The MRI/HP IEEE spec does
3513      describe a pmisc record which can be used for a pointer to
3514      member.  Unfortunately, it does not describe the target type,
3515      which seems pretty important.  I'm going to punt this for now.  */
3516
3517   return ieee_int_type (p, 4, true);
3518 }  
3519
3520 /* Make a method type.  */
3521
3522 static boolean
3523 ieee_method_type (p, domain, argcount)
3524      PTR p;
3525      boolean domain;
3526      int argcount;
3527 {
3528   struct ieee_handle *info = (struct ieee_handle *) p;
3529   unsigned int *args = NULL;
3530   int i;
3531   unsigned int retindx;
3532
3533   /* FIXME: The MRI/HP IEEE spec defines a pmisc record to use for a
3534      method, but the definition is incomplete.  We just output an 'x'
3535      type.  */
3536
3537   if (domain)
3538     (void) ieee_pop_type (info);
3539
3540   if (argcount > 0)
3541     {
3542       args = (unsigned int *) xmalloc (argcount * sizeof *args);
3543       for (i = argcount - 1; i >= 0; i--)
3544         args[i] = ieee_pop_type (info);
3545     }
3546
3547   retindx = ieee_pop_type (info);
3548
3549   if (! ieee_define_type (info, 0, true)
3550       || ! ieee_write_number (info, 'x')
3551       || ! ieee_write_number (info, 0x41)
3552       || ! ieee_write_number (info, 0)
3553       || ! ieee_write_number (info, 0)
3554       || ! ieee_write_number (info, retindx)
3555       || ! ieee_write_number (info, (bfd_vma) argcount))
3556     return false;
3557   if (argcount > 0)
3558     {
3559       for (i = 0; i < argcount; i++)
3560         if (! ieee_write_number (info, args[i]))
3561           return false;
3562       free (args);
3563     }
3564
3565   return ieee_write_number (info, 0);
3566 }
3567
3568 /* Make a const qualified type.  */
3569
3570 static boolean
3571 ieee_const_type (p)
3572      PTR p;
3573 {
3574   struct ieee_handle *info = (struct ieee_handle *) p;
3575   unsigned int size;
3576   boolean unsignedp;
3577   unsigned int indx;
3578
3579   size = info->type_stack->type.size;
3580   unsignedp = info->type_stack->type.unsignedp;
3581   indx = ieee_pop_type (info);
3582   return (ieee_define_type (info, size, unsignedp)
3583           && ieee_write_number (info, 'n')
3584           && ieee_write_number (info, 1)
3585           && ieee_write_number (info, indx));
3586 }
3587
3588 /* Make a volatile qualified type.  */
3589
3590 static boolean
3591 ieee_volatile_type (p)
3592      PTR p;
3593 {
3594   struct ieee_handle *info = (struct ieee_handle *) p;
3595   unsigned int size;
3596   boolean unsignedp;
3597   unsigned int indx;
3598
3599   size = info->type_stack->type.size;
3600   unsignedp = info->type_stack->type.unsignedp;
3601   indx = ieee_pop_type (info);
3602   return (ieee_define_type (info, size, unsignedp)
3603           && ieee_write_number (info, 'n')
3604           && ieee_write_number (info, 2)
3605           && ieee_write_number (info, indx));
3606 }
3607
3608 /* Start defining a struct type.  We build it in the strdef field on
3609    the stack, to avoid confusing type definitions required by the
3610    fields with the struct type itself.  */
3611
3612 static boolean
3613 ieee_start_struct_type (p, tag, id, structp, size)
3614      PTR p;
3615      const char *tag;
3616      unsigned int id;
3617      boolean structp;
3618      unsigned int size;
3619 {
3620   struct ieee_handle *info = (struct ieee_handle *) p;
3621   struct ieee_buf *strdef;
3622
3623   strdef = NULL;
3624   if (! ieee_define_named_type (info, tag, true, size, true, &strdef)
3625       || ! ieee_write_number (info, structp ? 'S' : 'U')
3626       || ! ieee_write_number (info, size))
3627     return false;
3628
3629   info->type_stack->type.strdef = strdef;
3630
3631   return true;
3632 }
3633
3634 /* Add a field to a struct.  */
3635
3636 static boolean
3637 ieee_struct_field (p, name, bitpos, bitsize, visibility)
3638      PTR p;
3639      const char *name;
3640      bfd_vma bitpos;
3641      bfd_vma bitsize;
3642      enum debug_visibility visibility;
3643 {
3644   struct ieee_handle *info = (struct ieee_handle *) p;
3645   unsigned int size;
3646   boolean unsignedp;
3647   unsigned int indx;
3648   bfd_vma offset;
3649
3650   size = info->type_stack->type.size;
3651   unsignedp = info->type_stack->type.unsignedp;
3652   indx = ieee_pop_type (info);
3653
3654   assert (info->type_stack != NULL && info->type_stack->type.strdef != NULL);
3655
3656   /* If the bitsize doesn't match the expected size, we need to output
3657      a bitfield type.  */
3658   if (size == 0 || bitsize == size * 8)
3659     offset = bitpos / 8;
3660   else
3661     {
3662       if (! ieee_define_type (info, 0, unsignedp)
3663           || ! ieee_write_number (info, 'g')
3664           || ! ieee_write_number (info, unsignedp ? 0 : 1)
3665           || ! ieee_write_number (info, indx))
3666         return false;
3667       indx = ieee_pop_type (info);
3668       offset = bitpos;
3669     }
3670
3671   /* Switch to the struct we are building in order to output this
3672      field definition.  */
3673   return (ieee_change_buffer (info, &info->type_stack->type.strdef)
3674           && ieee_write_id (info, name)
3675           && ieee_write_number (info, indx)
3676           && ieee_write_number (info, offset));
3677 }
3678
3679 /* Finish up a struct type.  */
3680
3681 static boolean
3682 ieee_end_struct_type (p)
3683      PTR p;
3684 {
3685   struct ieee_handle *info = (struct ieee_handle *) p;
3686   struct ieee_buf **pb;
3687
3688   assert (info->type_stack != NULL && info->type_stack->type.strdef != NULL);
3689
3690   /* Make sure we have started the types block.  */
3691   if (info->types == NULL)
3692     {
3693       if (! ieee_change_buffer (info, &info->types)
3694           || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
3695           || ! ieee_write_byte (info, 1)
3696           || ! ieee_write_number (info, 0)
3697           || ! ieee_write_id (info, info->modname))
3698         return false;
3699     }
3700
3701   /* Append the struct definition to the types.  */
3702   for (pb = &info->types; *pb != NULL; pb = &(*pb)->next)
3703     ;
3704   *pb = info->type_stack->type.strdef;
3705   info->type_stack->type.strdef = NULL;
3706
3707   /* Leave the struct on the type stack.  */
3708
3709   return true;
3710 }
3711
3712 /* Start a class type.  */
3713
3714 static boolean
3715 ieee_start_class_type (p, tag, id, structp, size, vptr, ownvptr)
3716      PTR p;
3717      const char *tag;
3718      unsigned int id;
3719      boolean structp;
3720      unsigned int size;
3721      boolean vptr;
3722      boolean ownvptr;
3723 {
3724   struct ieee_handle *info = (struct ieee_handle *) p;
3725
3726   /* FIXME.  */
3727   if (vptr && ! ownvptr)
3728     (void) ieee_pop_type (info);
3729   return ieee_start_struct_type (p, tag, id, structp, size);
3730 }
3731
3732 /* Add a static member to a class.  */
3733
3734 static boolean
3735 ieee_class_static_member (p, name, physname, visibility)
3736      PTR p;
3737      const char *name;
3738      const char *physname;
3739      enum debug_visibility visibility;
3740 {
3741   struct ieee_handle *info = (struct ieee_handle *) p;
3742
3743   /* FIXME.  */
3744   (void) ieee_pop_type (info);
3745   return true;
3746 }
3747
3748 /* Add a base class to a class.  */
3749
3750 static boolean
3751 ieee_class_baseclass (p, bitpos, virtual, visibility)
3752      PTR p;
3753      bfd_vma bitpos;
3754      boolean virtual;
3755      enum debug_visibility visibility;
3756 {
3757   struct ieee_handle *info = (struct ieee_handle *) p;
3758
3759   /* FIXME.  */
3760   (void) ieee_pop_type (info);
3761   return true;
3762 }
3763
3764 /* Start building a method for a class.  */
3765
3766 static boolean
3767 ieee_class_start_method (p, name)
3768      PTR p;
3769      const char *name;
3770 {
3771   /* FIXME.  */
3772   return true;
3773 }
3774
3775 /* Define a new method variant.  */
3776
3777 static boolean
3778 ieee_class_method_variant (p, physname, visibility, constp, volatilep,
3779                            voffset, context)
3780      PTR p;
3781      const char *physname;
3782      enum debug_visibility visibility;
3783      boolean constp;
3784      boolean volatilep;
3785      bfd_vma voffset;
3786      boolean context;
3787 {
3788   struct ieee_handle *info = (struct ieee_handle *) p;
3789
3790   /* FIXME.  */
3791   (void) ieee_pop_type (info);
3792   if (context)
3793     (void) ieee_pop_type (info);
3794   return true;
3795 }
3796
3797 /* Define a new static method variant.  */
3798
3799 static boolean
3800 ieee_class_static_method_variant (p, physname, visibility, constp, volatilep)
3801      PTR p;
3802      const char *physname;
3803      enum debug_visibility visibility;
3804      boolean constp;
3805      boolean volatilep;
3806 {
3807   struct ieee_handle *info = (struct ieee_handle *) p;
3808
3809   /* FIXME.  */
3810   (void) ieee_pop_type (info);
3811   return true;
3812 }
3813
3814 /* Finish up a method.  */
3815
3816 static boolean
3817 ieee_class_end_method (p)
3818      PTR p;
3819 {
3820   /* FIXME.  */
3821   return true;
3822 }
3823
3824 /* Finish up a class.  */
3825
3826 static boolean
3827 ieee_end_class_type (p)
3828      PTR p;
3829 {
3830   return ieee_end_struct_type (p);
3831 }
3832
3833 /* Push a previously seen typedef onto the type stack.  */
3834
3835 static boolean
3836 ieee_typedef_type (p, name)
3837      PTR p;
3838      const char *name;
3839 {
3840   struct ieee_handle *info = (struct ieee_handle *) p;
3841   register struct ieee_name_type *nt;
3842
3843   for (nt = info->typedefs; nt != NULL; nt = nt->next)
3844     {
3845       if (nt->name[0] == name[0]
3846           && strcmp (nt->name, name) == 0)
3847         {
3848           if (! ieee_push_type (info, nt->type.indx, nt->type.size,
3849                                 nt->type.unsignedp))
3850             return false;
3851           /* Copy over any other type information we may have.  */
3852           info->type_stack->type = nt->type;
3853           return true;
3854         }
3855     }
3856
3857   abort ();
3858 }
3859
3860 /* Push a tagged type onto the type stack.  */
3861
3862 static boolean
3863 ieee_tag_type (p, name, id, kind)
3864      PTR p;
3865      const char *name;
3866      unsigned int id;
3867      enum debug_type_kind kind;
3868 {
3869   struct ieee_handle *info = (struct ieee_handle *) p;
3870   register struct ieee_name_type *nt;
3871
3872   if (name == NULL)
3873     return true;
3874
3875   for (nt = info->tags; nt != NULL; nt = nt->next)
3876     {
3877       if (nt->name[0] == name[0]
3878           && strcmp (nt->name, name) == 0)
3879         {
3880           if (! ieee_push_type (info, nt->type.indx, nt->type.size,
3881                                 nt->type.unsignedp))
3882             return false;
3883           /* Copy over any other type information we may have.  */
3884           info->type_stack->type = nt->type;
3885           return true;
3886         }
3887     }
3888
3889   nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
3890   memset (nt, 0, sizeof *nt);
3891
3892   nt->name = name;
3893   nt->type.indx = info->type_indx;
3894   ++info->type_indx;
3895   nt->kind = kind;
3896
3897   nt->next = info->tags;
3898   info->tags = nt;
3899
3900   return ieee_push_type (info, nt->type.indx, 0, false);
3901 }
3902
3903 /* Output a typedef.  */
3904
3905 static boolean
3906 ieee_typdef (p, name)
3907      PTR p;
3908      const char *name;
3909 {
3910   struct ieee_handle *info = (struct ieee_handle *) p;
3911   struct ieee_name_type *nt;
3912   unsigned int size;
3913   boolean unsignedp;
3914   unsigned int indx;
3915
3916   nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
3917   memset (nt, 0, sizeof *nt);
3918   nt->name = name;
3919   nt->type = info->type_stack->type;
3920   nt->kind = DEBUG_KIND_ILLEGAL;
3921
3922   nt->next = info->typedefs;
3923   info->typedefs = nt;
3924
3925   size = info->type_stack->type.size;
3926   unsignedp = info->type_stack->type.unsignedp;
3927   indx = ieee_pop_type (info);
3928
3929   /* If this is a simple builtin type using a builtin name, we don't
3930      want to output the typedef itself.  We also want to change the
3931      type index to correspond to the name being used.  We recognize
3932      names used in stabs debugging output even if they don't exactly
3933      correspond to the names used for the IEEE builtin types.  */
3934   if (indx <= (unsigned int) builtin_bcd_float)
3935     {
3936       boolean found;
3937
3938       found = false;
3939       switch ((enum builtin_types) indx)
3940         {
3941         default:
3942           break;
3943
3944         case builtin_void:
3945           if (strcmp (name, "void") == 0)
3946             found = true;
3947           break;
3948
3949         case builtin_signed_char:
3950         case builtin_char:
3951           if (strcmp (name, "signed char") == 0)
3952             {
3953               indx = (unsigned int) builtin_signed_char;
3954               found = true;
3955             }
3956           else if (strcmp (name, "char") == 0)
3957             {
3958               indx = (unsigned int) builtin_char;
3959               found = true;
3960             }
3961           break;
3962
3963         case builtin_unsigned_char:
3964           if (strcmp (name, "unsigned char") == 0)
3965             found = true;
3966           break;
3967
3968         case builtin_signed_short_int:
3969         case builtin_short:
3970         case builtin_short_int:
3971         case builtin_signed_short:
3972           if (strcmp (name, "signed short int") == 0)
3973             {
3974               indx = (unsigned int) builtin_signed_short_int;
3975               found = true;
3976             }
3977           else if (strcmp (name, "short") == 0)
3978             {
3979               indx = (unsigned int) builtin_short;
3980               found = true;
3981             }
3982           else if (strcmp (name, "short int") == 0)
3983             {
3984               indx = (unsigned int) builtin_short_int;
3985               found = true;
3986             }
3987           else if (strcmp (name, "signed short") == 0)
3988             {
3989               indx = (unsigned int) builtin_signed_short;
3990               found = true;
3991             }
3992           break;
3993
3994         case builtin_unsigned_short_int:
3995         case builtin_unsigned_short:
3996           if (strcmp (name, "unsigned short int") == 0
3997               || strcmp (name, "short unsigned int") == 0)
3998             {
3999               indx = builtin_unsigned_short_int;
4000               found = true;
4001             }
4002           else if (strcmp (name, "unsigned short") == 0)
4003             {
4004               indx = builtin_unsigned_short;
4005               found = true;
4006             }
4007           break;
4008
4009         case builtin_signed_long:
4010         case builtin_int: /* FIXME: Size depends upon architecture.  */
4011         case builtin_long:
4012           if (strcmp (name, "signed long") == 0)
4013             {
4014               indx = builtin_signed_long;
4015               found = true;
4016             }
4017           else if (strcmp (name, "int") == 0)
4018             {
4019               indx = builtin_int;
4020               found = true;
4021             }
4022           else if (strcmp (name, "long") == 0
4023                    || strcmp (name, "long int") == 0)
4024             {
4025               indx = builtin_long;
4026               found = true;
4027             }
4028           break;
4029
4030         case builtin_unsigned_long:
4031         case builtin_unsigned: /* FIXME: Size depends upon architecture.  */
4032         case builtin_unsigned_int: /* FIXME: Like builtin_unsigned.  */
4033           if (strcmp (name, "unsigned long") == 0
4034               || strcmp (name, "long unsigned int") == 0)
4035             {
4036               indx = builtin_unsigned_long;
4037               found = true;
4038             }
4039           else if (strcmp (name, "unsigned") == 0)
4040             {
4041               indx = builtin_unsigned;
4042               found = true;
4043             }
4044           else if (strcmp (name, "unsigned int") == 0)
4045             {
4046               indx = builtin_unsigned_int;
4047               found = true;
4048             }
4049           break;
4050
4051         case builtin_signed_long_long:
4052           if (strcmp (name, "signed long long") == 0
4053               || strcmp (name, "long long int") == 0)
4054             found = true;
4055           break;
4056
4057         case builtin_unsigned_long_long:
4058           if (strcmp (name, "unsigned long long") == 0
4059               || strcmp (name, "long long unsigned int") == 0)
4060             found = true;
4061           break;
4062
4063         case builtin_float:
4064           if (strcmp (name, "float") == 0)
4065             found = true;
4066           break;
4067
4068         case builtin_double:
4069           if (strcmp (name, "double") == 0)
4070             found = true;
4071           break;
4072
4073         case builtin_long_double:
4074           if (strcmp (name, "long double") == 0)
4075             found = true;
4076           break;
4077
4078         case builtin_long_long_double:
4079           if (strcmp (name, "long long double") == 0)
4080             found = true;
4081           break;
4082         }
4083
4084       if (found)
4085         {
4086           nt->type.indx = indx;
4087           return true;
4088         }
4089     }
4090
4091   if (! ieee_define_named_type (info, name, false, size, unsignedp,
4092                                 (struct ieee_buf **) NULL)
4093       || ! ieee_write_number (info, 'T')
4094       || ! ieee_write_number (info, indx))
4095     return false;
4096
4097   /* Remove the type we just added to the type stack.  */
4098   (void) ieee_pop_type (info);
4099
4100   return true;
4101 }
4102
4103 /* Output a tag for a type.  We don't have to do anything here.  */
4104
4105 static boolean
4106 ieee_tag (p, name)
4107      PTR p;
4108      const char *name;
4109 {
4110   struct ieee_handle *info = (struct ieee_handle *) p;
4111
4112   (void) ieee_pop_type (info);
4113   return true;
4114 }
4115
4116 /* Output an integer constant.  */
4117
4118 static boolean
4119 ieee_int_constant (p, name, val)
4120      PTR p;
4121      const char *name;
4122      bfd_vma val;
4123 {
4124   /* FIXME.  */
4125   return true;
4126 }
4127
4128 /* Output a floating point constant.  */
4129
4130 static boolean
4131 ieee_float_constant (p, name, val)
4132      PTR p;
4133      const char *name;
4134      double val;
4135 {
4136   /* FIXME.  */
4137   return true;
4138 }
4139
4140 /* Output a typed constant.  */
4141
4142 static boolean
4143 ieee_typed_constant (p, name, val)
4144      PTR p;
4145      const char *name;
4146      bfd_vma val;
4147 {
4148   struct ieee_handle *info = (struct ieee_handle *) p;
4149
4150   /* FIXME.  */
4151   (void) ieee_pop_type (info);
4152   return true;
4153 }
4154
4155 /* Output a variable.  */
4156
4157 static boolean
4158 ieee_variable (p, name, kind, val)
4159      PTR p;
4160      const char *name;
4161      enum debug_var_kind kind;
4162      bfd_vma val;
4163 {
4164   struct ieee_handle *info = (struct ieee_handle *) p;
4165   unsigned int name_indx;
4166   unsigned int size;
4167   unsigned int type_indx;
4168   boolean asn;
4169
4170   /* Make sure the variable section is started.  */
4171   if (info->vars != NULL)
4172     {
4173       if (! ieee_change_buffer (info, &info->vars))
4174         return false;
4175     }
4176   else
4177     {
4178       if (! ieee_change_buffer (info, &info->vars)
4179           || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4180           || ! ieee_write_byte (info, 3)
4181           || ! ieee_write_number (info, 0)
4182           || ! ieee_write_id (info, info->modname))
4183         return false;
4184     }
4185
4186   name_indx = info->name_indx;
4187   ++info->name_indx;
4188
4189   size = info->type_stack->type.size;
4190   type_indx = ieee_pop_type (info);
4191
4192   /* Write out an NN and an ATN record for this variable.  */
4193   if (! ieee_write_byte (info, (int) ieee_nn_record)
4194       || ! ieee_write_number (info, name_indx)
4195       || ! ieee_write_id (info, name)
4196       || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
4197       || ! ieee_write_number (info, name_indx)
4198       || ! ieee_write_number (info, type_indx))
4199     return false;
4200   switch (kind)
4201     {
4202     default:
4203       abort ();
4204       return false;
4205     case DEBUG_GLOBAL:
4206       if (! ieee_write_number (info, 8)
4207           || ! ieee_add_range (info, val, val + size))
4208         return false;
4209       asn = true;
4210       break;
4211     case DEBUG_STATIC:
4212     case DEBUG_LOCAL_STATIC:
4213       if (! ieee_write_number (info, 3)
4214           || ! ieee_add_range (info, val, val + size))
4215         return false;
4216       asn = true;
4217       break;
4218     case DEBUG_LOCAL:
4219       if (! ieee_write_number (info, 1)
4220           || ! ieee_write_number (info, val))
4221         return false;
4222       asn = false;
4223       break;
4224     case DEBUG_REGISTER:
4225       if (! ieee_write_number (info, 2)
4226           || ! ieee_write_number (info,
4227                                   ieee_genreg_to_regno (info->abfd, val)))
4228         return false;
4229       asn = false;
4230       break;
4231     }
4232
4233   if (asn)
4234     {
4235       if (! ieee_write_2bytes (info, (int) ieee_asn_record_enum)
4236           || ! ieee_write_number (info, name_indx)
4237           || ! ieee_write_number (info, val))
4238         return false;
4239     }
4240
4241   return true;
4242 }
4243
4244 /* Start outputting information for a function.  */
4245
4246 static boolean
4247 ieee_start_function (p, name, global)
4248      PTR p;
4249      const char *name;
4250      boolean global;
4251 {
4252   struct ieee_handle *info = (struct ieee_handle *) p;
4253   unsigned int indx;
4254
4255   /* Make sure the variable section is started.  */
4256   if (info->vars != NULL)
4257     {
4258       if (! ieee_change_buffer (info, &info->vars))
4259         return false;
4260     }
4261   else
4262     {
4263       if (! ieee_change_buffer (info, &info->vars)
4264           || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4265           || ! ieee_write_byte (info, 3)
4266           || ! ieee_write_number (info, 0)
4267           || ! ieee_write_id (info, info->modname))
4268         return false;
4269     }
4270
4271   indx = ieee_pop_type (info);
4272
4273   /* The address is written out as the first block.  */
4274
4275   ++info->block_depth;
4276
4277   return (ieee_write_byte (info, (int) ieee_bb_record_enum)
4278           && ieee_write_byte (info, global ? 4 : 6)
4279           && ieee_write_number (info, 0)
4280           && ieee_write_id (info, name)
4281           && ieee_write_number (info, 0)
4282           && ieee_write_number (info, indx));
4283 }
4284
4285 /* Add a function parameter.  This will normally be called before the
4286    first block, so we postpone them until we see the block.  */
4287
4288 static boolean
4289 ieee_function_parameter (p, name, kind, val)
4290      PTR p;
4291      const char *name;
4292      enum debug_parm_kind kind;
4293      bfd_vma val;
4294 {
4295   struct ieee_handle *info = (struct ieee_handle *) p;
4296   struct ieee_pending_parm *m, **pm;
4297
4298   assert (info->block_depth == 1);
4299
4300   m = (struct ieee_pending_parm *) xmalloc (sizeof *m);
4301   memset (m, 0, sizeof *m);
4302
4303   m->next = NULL;
4304   m->name = name;
4305   m->type = ieee_pop_type (info);
4306   m->kind = kind;
4307   m->val = val;
4308
4309   for (pm = &info->pending_parms; *pm != NULL; pm = &(*pm)->next)
4310     ;
4311   *pm = m;
4312
4313   return true;  
4314 }
4315
4316 /* Output pending function parameters.  */
4317
4318 static boolean
4319 ieee_output_pending_parms (info)
4320      struct ieee_handle *info;
4321 {
4322   struct ieee_pending_parm *m;
4323
4324   m = info->pending_parms;
4325   while (m != NULL)
4326     {
4327       struct ieee_pending_parm *next;
4328       enum debug_var_kind vkind;
4329
4330       switch (m->kind)
4331         {
4332         default:
4333           abort ();
4334           return false;
4335         case DEBUG_PARM_STACK:
4336         case DEBUG_PARM_REFERENCE:
4337           vkind = DEBUG_LOCAL;
4338           break;
4339         case DEBUG_PARM_REG:
4340         case DEBUG_PARM_REF_REG:
4341           vkind = DEBUG_REGISTER;
4342           break;
4343         }
4344
4345       if (! ieee_push_type (info, m->type, 0, false)
4346           || ! ieee_variable ((PTR) info, m->name, vkind, m->val))
4347         return false;
4348
4349       /* FIXME: We should output a pmisc note here for reference
4350          parameters.  */
4351
4352       next = m->next;
4353       free (m);
4354       m = next;
4355     }
4356   info->pending_parms = NULL;
4357
4358   return true;
4359 }
4360
4361 /* Start a block.  If this is the first block, we output the address
4362    to finish the BB4 or BB6, and then output the function parameters.  */
4363
4364 static boolean
4365 ieee_start_block (p, addr)
4366      PTR p;
4367      bfd_vma addr;
4368 {
4369   struct ieee_handle *info = (struct ieee_handle *) p;
4370
4371   if (! ieee_change_buffer (info, &info->vars))
4372     return false;
4373
4374   if (info->block_depth == 1)
4375     {
4376       if (! ieee_write_number (info, addr)
4377           || ! ieee_output_pending_parms (info))
4378         return false;
4379     }
4380   else
4381     {
4382       if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
4383           || ! ieee_write_byte (info, 6)
4384           || ! ieee_write_byte (info, 0)
4385           || ! ieee_write_id (info, "")
4386           || ! ieee_write_number (info, 0)
4387           || ! ieee_write_number (info, 0)
4388           || ! ieee_write_number (info, addr))
4389         return false;
4390     }
4391
4392   if (! ieee_start_range (info, addr))
4393     return false;
4394
4395   ++info->block_depth;
4396
4397   return true;
4398 }
4399
4400 /* End a block.  */
4401
4402 static boolean
4403 ieee_end_block (p, addr)
4404      PTR p;
4405      bfd_vma addr;
4406 {
4407   struct ieee_handle *info = (struct ieee_handle *) p;
4408
4409   if (! ieee_change_buffer (info, &info->vars)
4410       || ! ieee_write_byte (info, (int) ieee_be_record_enum)
4411       || ! ieee_write_number (info, addr))
4412     return false;
4413
4414   if (! ieee_end_range (info, addr))
4415     return false;
4416
4417   --info->block_depth;
4418
4419   return true;
4420 }
4421
4422 /* End a function.  */
4423
4424 static boolean
4425 ieee_end_function (p)
4426      PTR p;
4427 {
4428   struct ieee_handle *info = (struct ieee_handle *) p;
4429
4430   assert (info->block_depth == 1);
4431
4432   --info->block_depth;
4433
4434   return true;
4435 }
4436
4437 /* Record line number information.  */
4438
4439 static boolean
4440 ieee_lineno (p, filename, lineno, addr)
4441      PTR p;
4442      const char *filename;
4443      unsigned long lineno;
4444      bfd_vma addr;
4445 {
4446   struct ieee_handle *info = (struct ieee_handle *) p;
4447
4448   assert (info->filename != NULL);
4449
4450   /* Make sure we have a line number block.  */
4451   if (info->linenos != NULL)
4452     {
4453       if (! ieee_change_buffer (info, &info->linenos))
4454         return false;
4455     }
4456   else
4457     {
4458       info->lineno_name_indx = info->name_indx;
4459       ++info->name_indx;
4460       if (! ieee_change_buffer (info, &info->linenos)
4461           || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4462           || ! ieee_write_byte (info, 5)
4463           || ! ieee_write_number (info, 0)
4464           || ! ieee_write_id (info, info->filename)
4465           || ! ieee_write_byte (info, (int) ieee_nn_record)
4466           || ! ieee_write_number (info, info->lineno_name_indx)
4467           || ! ieee_write_id (info, ""))
4468         return false;
4469       info->lineno_filename = info->filename;
4470     }
4471
4472   if (strcmp (filename, info->lineno_filename) != 0)
4473     {
4474       if (strcmp (info->filename, info->lineno_filename) != 0)
4475         {
4476           /* We were not in the main file.  Close the block for the
4477              included file.  */
4478           if (! ieee_write_byte (info, (int) ieee_be_record_enum))
4479             return false;
4480         }
4481       if (strcmp (info->filename, filename) != 0)
4482         {
4483           /* We are not changing to the main file.  Open a block for
4484              the new included file.  */
4485           if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
4486               || ! ieee_write_byte (info, 5)
4487               || ! ieee_write_number (info, 0)
4488               || ! ieee_write_id (info, filename))
4489             return false;
4490         }
4491       info->lineno_filename = filename;
4492     }
4493
4494   return (ieee_write_2bytes (info, (int) ieee_atn_record_enum)
4495           && ieee_write_number (info, info->lineno_name_indx)
4496           && ieee_write_number (info, 0)
4497           && ieee_write_number (info, 7)
4498           && ieee_write_number (info, lineno)
4499           && ieee_write_number (info, 0)
4500           && ieee_write_2bytes (info, (int) ieee_asn_record_enum)
4501           && ieee_write_number (info, info->lineno_name_indx)
4502           && ieee_write_number (info, addr));
4503 }