* Sanitization fixes to retain new files.
[binutils-gdb.git] / binutils / ieee.c
blob2756ba138eaa011ce534553a5f872af19b57b869
1 /* ieee.c -- Read and write IEEE-695 debugging information.
2 Copyright (C) 1996 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor <ian@cygnus.com>.
5 This file is part of GNU Binutils.
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.
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.
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. */
22 /* This file reads and writes IEEE-695 debugging information. */
24 #include <stdio.h>
25 #include <assert.h>
27 #include "bfd.h"
28 #include "ieee.h"
29 #include "bucomm.h"
30 #include "libiberty.h"
31 #include "debug.h"
32 #include "budbg.h"
34 /* This structure holds an entry on the block stack. */
36 struct ieee_block
38 /* The kind of block. */
39 int kind;
40 /* The source file name, for a BB5 block. */
41 const char *filename;
42 /* The index of the function type, for a BB4 or BB6 block. */
43 unsigned int fnindx;
44 /* True if this function is being skipped. */
45 boolean skip;
48 /* This structure is the block stack. */
50 #define BLOCKSTACK_SIZE (16)
52 struct ieee_blockstack
54 /* The stack pointer. */
55 struct ieee_block *bsp;
56 /* The stack. */
57 struct ieee_block stack[BLOCKSTACK_SIZE];
60 /* This structure holds information for a variable. */
62 struct ieee_var
64 /* Start of name. */
65 const char *name;
66 /* Length of name. */
67 unsigned long namlen;
68 /* Type. */
69 debug_type type;
70 /* Slot if we make an indirect type. */
71 debug_type *pslot;
72 /* Kind of variable or function. */
73 enum
75 IEEE_UNKNOWN,
76 IEEE_EXTERNAL,
77 IEEE_GLOBAL,
78 IEEE_STATIC,
79 IEEE_LOCAL,
80 IEEE_FUNCTION
81 } kind;
84 /* This structure holds all the variables. */
86 struct ieee_vars
88 /* Number of slots allocated. */
89 unsigned int alloc;
90 /* Variables. */
91 struct ieee_var *vars;
94 /* This structure holds information for a type. We need this because
95 we don't want to represent bitfields as real types. */
97 struct ieee_type
99 /* Type. */
100 debug_type type;
101 /* Slot if this is type is referenced before it is defined. */
102 debug_type *pslot;
103 /* Slots for arguments if we make indirect types for them. */
104 debug_type *arg_slots;
105 /* If this is a bitfield, this is the size in bits. If this is not
106 a bitfield, this is zero. */
107 unsigned long bitsize;
110 /* This structure holds all the type information. */
112 struct ieee_types
114 /* Number of slots allocated. */
115 unsigned int alloc;
116 /* Types. */
117 struct ieee_type *types;
118 /* Builtin types. */
119 #define BUILTIN_TYPE_COUNT (60)
120 debug_type builtins[BUILTIN_TYPE_COUNT];
123 /* This structure holds a linked last of structs with their tag names,
124 so that we can convert them to C++ classes if necessary. */
126 struct ieee_tag
128 /* Next tag. */
129 struct ieee_tag *next;
130 /* This tag name. */
131 const char *name;
132 /* The type of the tag. */
133 debug_type type;
134 /* The tagged type is an indirect type pointing at this slot. */
135 debug_type slot;
136 /* This is an array of slots used when a field type is converted
137 into a indirect type, in case it needs to be later converted into
138 a reference type. */
139 debug_type *fslots;
142 /* This structure holds the information we pass around to the parsing
143 functions. */
145 struct ieee_info
147 /* The debugging handle. */
148 PTR dhandle;
149 /* The BFD. */
150 bfd *abfd;
151 /* The start of the bytes to be parsed. */
152 const bfd_byte *bytes;
153 /* The end of the bytes to be parsed. */
154 const bfd_byte *pend;
155 /* The block stack. */
156 struct ieee_blockstack blockstack;
157 /* Whether we have seen a BB1 or BB2. */
158 boolean saw_filename;
159 /* The variables. */
160 struct ieee_vars vars;
161 /* The global variables, after a global typedef block. */
162 struct ieee_vars *global_vars;
163 /* The types. */
164 struct ieee_types types;
165 /* The global types, after a global typedef block. */
166 struct ieee_types *global_types;
167 /* The list of tagged structs. */
168 struct ieee_tag *tags;
171 /* Basic builtin types, not including the pointers. */
173 enum builtin_types
175 builtin_unknown = 0,
176 builtin_void = 1,
177 builtin_signed_char = 2,
178 builtin_unsigned_char = 3,
179 builtin_signed_short_int = 4,
180 builtin_unsigned_short_int = 5,
181 builtin_signed_long = 6,
182 builtin_unsigned_long = 7,
183 builtin_signed_long_long = 8,
184 builtin_unsigned_long_long = 9,
185 builtin_float = 10,
186 builtin_double = 11,
187 builtin_long_double = 12,
188 builtin_long_long_double = 13,
189 builtin_quoted_string = 14,
190 builtin_instruction_address = 15,
191 builtin_int = 16,
192 builtin_unsigned = 17,
193 builtin_unsigned_int = 18,
194 builtin_char = 19,
195 builtin_long = 20,
196 builtin_short = 21,
197 builtin_unsigned_short = 22,
198 builtin_short_int = 23,
199 builtin_signed_short = 24,
200 builtin_bcd_float = 25
203 /* These are the values found in the derivation flags of a 'b'
204 component record of a 'T' type extension record in a C++ pmisc
205 record. These are bitmasks. */
207 /* Set for a private base class, clear for a public base class.
208 Protected base classes are not supported. */
209 #define BASEFLAGS_PRIVATE (0x1)
210 /* Set for a virtual base class. */
211 #define BASEFLAGS_VIRTUAL (0x2)
212 /* Set for a friend class, clear for a base class. */
213 #define BASEFLAGS_FRIEND (0x10)
215 /* These are the values found in the specs flags of a 'd', 'm', or 'v'
216 component record of a 'T' type extension record in a C++ pmisc
217 record. The same flags are used for a 'M' record in a C++ pmisc
218 record. */
220 /* The lower two bits hold visibility information. */
221 #define CXXFLAGS_VISIBILITY (0x3)
222 /* This value in the lower two bits indicates a public member. */
223 #define CXXFLAGS_VISIBILITY_PUBLIC (0x0)
224 /* This value in the lower two bits indicates a private member. */
225 #define CXXFLAGS_VISIBILITY_PRIVATE (0x1)
226 /* This value in the lower two bits indicates a protected member. */
227 #define CXXFLAGS_VISIBILITY_PROTECTED (0x2)
228 /* Set for a static member. */
229 #define CXXFLAGS_STATIC (0x4)
230 /* Set for a virtual override. */
231 #define CXXFLAGS_OVERRIDE (0x8)
232 /* Set for a friend function. */
233 #define CXXFLAGS_FRIEND (0x10)
234 /* Set for a const function. */
235 #define CXXFLAGS_CONST (0x20)
236 /* Set for a volatile function. */
237 #define CXXFLAGS_VOLATILE (0x40)
238 /* Set for an overloaded function. */
239 #define CXXFLAGS_OVERLOADED (0x80)
240 /* Set for an operator function. */
241 #define CXXFLAGS_OPERATOR (0x100)
242 /* Set for a constructor or destructor. */
243 #define CXXFLAGS_CTORDTOR (0x400)
244 /* Set for a constructor. */
245 #define CXXFLAGS_CTOR (0x200)
246 /* Set for an inline function. */
247 #define CXXFLAGS_INLINE (0x800)
249 /* Local functions. */
251 static void ieee_error
252 PARAMS ((struct ieee_info *, const bfd_byte *, const char *));
253 static void ieee_eof PARAMS ((struct ieee_info *));
254 static char *savestring PARAMS ((const char *, unsigned long));
255 static boolean ieee_read_number
256 PARAMS ((struct ieee_info *, const bfd_byte **, bfd_vma *));
257 static boolean ieee_read_optional_number
258 PARAMS ((struct ieee_info *, const bfd_byte **, bfd_vma *, boolean *));
259 static boolean ieee_read_id
260 PARAMS ((struct ieee_info *, const bfd_byte **, const char **,
261 unsigned long *));
262 static boolean ieee_read_optional_id
263 PARAMS ((struct ieee_info *, const bfd_byte **, const char **,
264 unsigned long *, boolean *));
265 static boolean ieee_read_expression
266 PARAMS ((struct ieee_info *, const bfd_byte **, bfd_vma *));
267 static debug_type ieee_builtin_type
268 PARAMS ((struct ieee_info *, const bfd_byte *, unsigned int));
269 static boolean ieee_alloc_type
270 PARAMS ((struct ieee_info *, unsigned int, boolean));
271 static boolean ieee_read_type_index
272 PARAMS ((struct ieee_info *, const bfd_byte **, debug_type *));
273 static int ieee_regno_to_genreg PARAMS ((bfd *, int));
274 static int ieee_genreg_to_regno PARAMS ((bfd *, int));
275 static boolean parse_ieee_bb PARAMS ((struct ieee_info *, const bfd_byte **));
276 static boolean parse_ieee_be PARAMS ((struct ieee_info *, const bfd_byte **));
277 static boolean parse_ieee_nn PARAMS ((struct ieee_info *, const bfd_byte **));
278 static boolean parse_ieee_ty PARAMS ((struct ieee_info *, const bfd_byte **));
279 static boolean parse_ieee_atn PARAMS ((struct ieee_info *, const bfd_byte **));
280 static boolean ieee_read_cxx_misc
281 PARAMS ((struct ieee_info *, const bfd_byte **, unsigned long));
282 static boolean ieee_read_cxx_class
283 PARAMS ((struct ieee_info *, const bfd_byte **, unsigned long));
284 static boolean ieee_read_cxx_defaults
285 PARAMS ((struct ieee_info *, const bfd_byte **, unsigned long));
286 static boolean ieee_read_reference
287 PARAMS ((struct ieee_info *, const bfd_byte **));
288 static boolean ieee_require_asn
289 PARAMS ((struct ieee_info *, const bfd_byte **, bfd_vma *));
290 static boolean ieee_require_atn65
291 PARAMS ((struct ieee_info *, const bfd_byte **, const char **,
292 unsigned long *));
294 /* Report an error in the IEEE debugging information. */
296 static void
297 ieee_error (info, p, s)
298 struct ieee_info *info;
299 const bfd_byte *p;
300 const char *s;
302 if (p != NULL)
303 fprintf (stderr, "%s: 0x%lx: %s (0x%x)\n", bfd_get_filename (info->abfd),
304 (unsigned long) (p - info->bytes), s, *p);
305 else
306 fprintf (stderr, "%s: %s\n", bfd_get_filename (info->abfd), s);
309 /* Report an unexpected EOF in the IEEE debugging information. */
311 static void
312 ieee_eof (info)
313 struct ieee_info *info;
315 ieee_error (info, (const bfd_byte *) NULL,
316 "unexpected end of debugging information");
319 /* Save a string in memory. */
321 static char *
322 savestring (start, len)
323 const char *start;
324 unsigned long len;
326 char *ret;
328 ret = (char *) xmalloc (len + 1);
329 memcpy (ret, start, len);
330 ret[len] = '\0';
331 return ret;
334 /* Read a number which must be present in an IEEE file. */
336 static boolean
337 ieee_read_number (info, pp, pv)
338 struct ieee_info *info;
339 const bfd_byte **pp;
340 bfd_vma *pv;
342 return ieee_read_optional_number (info, pp, pv, (boolean *) NULL);
345 /* Read a number in an IEEE file. If ppresent is not NULL, the number
346 need not be there. */
348 static boolean
349 ieee_read_optional_number (info, pp, pv, ppresent)
350 struct ieee_info *info;
351 const bfd_byte **pp;
352 bfd_vma *pv;
353 boolean *ppresent;
355 ieee_record_enum_type b;
357 if (*pp >= info->pend)
359 if (ppresent != NULL)
361 *ppresent = false;
362 return true;
364 ieee_eof (info);
365 return false;
368 b = (ieee_record_enum_type) **pp;
369 ++*pp;
371 if (b <= ieee_number_end_enum)
373 *pv = (bfd_vma) b;
374 if (ppresent != NULL)
375 *ppresent = true;
376 return true;
379 if (b >= ieee_number_repeat_start_enum && b <= ieee_number_repeat_end_enum)
381 unsigned int i;
383 i = (int) b - (int) ieee_number_repeat_start_enum;
384 if (*pp + i - 1 >= info->pend)
386 ieee_eof (info);
387 return false;
390 *pv = 0;
391 for (; i > 0; i--)
393 *pv <<= 8;
394 *pv += **pp;
395 ++*pp;
398 if (ppresent != NULL)
399 *ppresent = true;
401 return true;
404 if (ppresent != NULL)
406 --*pp;
407 *ppresent = false;
408 return true;
411 ieee_error (info, *pp - 1, "invalid number");
412 return false;
415 /* Read a required string from an IEEE file. */
417 static boolean
418 ieee_read_id (info, pp, pname, pnamlen)
419 struct ieee_info *info;
420 const bfd_byte **pp;
421 const char **pname;
422 unsigned long *pnamlen;
424 return ieee_read_optional_id (info, pp, pname, pnamlen, (boolean *) NULL);
427 /* Read a string from an IEEE file. If ppresent is not NULL, the
428 string is optional. */
430 static boolean
431 ieee_read_optional_id (info, pp, pname, pnamlen, ppresent)
432 struct ieee_info *info;
433 const bfd_byte **pp;
434 const char **pname;
435 unsigned long *pnamlen;
436 boolean *ppresent;
438 bfd_byte b;
439 unsigned long len;
441 if (*pp >= info->pend)
443 ieee_eof (info);
444 return false;
447 b = **pp;
448 ++*pp;
450 if (b <= 0x7f)
451 len = b;
452 else if ((ieee_record_enum_type) b == ieee_extension_length_1_enum)
454 len = **pp;
455 ++*pp;
457 else if ((ieee_record_enum_type) b == ieee_extension_length_2_enum)
459 len = (**pp << 8) + (*pp)[1];
460 *pp += 2;
462 else
464 if (ppresent != NULL)
466 --*pp;
467 *ppresent = false;
468 return true;
470 ieee_error (info, *pp - 1, "invalid string length");
471 return false;
474 if ((unsigned long) (info->pend - *pp) < len)
476 ieee_eof (info);
477 return false;
480 *pname = (const char *) *pp;
481 *pnamlen = len;
482 *pp += len;
484 if (ppresent != NULL)
485 *ppresent = true;
487 return true;
490 /* Read an expression from an IEEE file. Since this code is only used
491 to parse debugging information, I haven't bothered to write a full
492 blown IEEE expression parser. I've only thrown in the things I've
493 seen in debugging information. This can be easily extended if
494 necessary. */
496 static boolean
497 ieee_read_expression (info, pp, pv)
498 struct ieee_info *info;
499 const bfd_byte **pp;
500 bfd_vma *pv;
502 const bfd_byte *expr_start;
503 #define EXPR_STACK_SIZE (10)
504 bfd_vma expr_stack[EXPR_STACK_SIZE];
505 bfd_vma *esp;
507 expr_start = *pp;
509 esp = expr_stack;
511 while (1)
513 const bfd_byte *start;
514 bfd_vma val;
515 boolean present;
516 ieee_record_enum_type c;
518 start = *pp;
520 if (! ieee_read_optional_number (info, pp, &val, &present))
521 return false;
523 if (present)
525 if (esp - expr_stack >= EXPR_STACK_SIZE)
527 ieee_error (info, start, "expression stack overflow");
528 return false;
530 *esp++ = val;
531 continue;
534 c = (ieee_record_enum_type) **pp;
536 if (c >= ieee_module_beginning_enum)
537 break;
539 ++*pp;
541 if (c == ieee_comma)
542 break;
544 switch (c)
546 default:
547 ieee_error (info, start, "unsupported IEEE expression operator");
548 break;
550 case ieee_variable_R_enum:
552 bfd_vma indx;
553 asection *s;
555 if (! ieee_read_number (info, pp, &indx))
556 return false;
557 for (s = info->abfd->sections; s != NULL; s = s->next)
558 if ((bfd_vma) s->target_index == indx)
559 break;
560 if (s == NULL)
562 ieee_error (info, start, "unknown section");
563 return false;
566 if (esp - expr_stack >= EXPR_STACK_SIZE)
568 ieee_error (info, start, "expression stack overflow");
569 return false;
572 *esp++ = bfd_get_section_vma (info->abfd, s);
574 break;
576 case ieee_function_plus_enum:
577 case ieee_function_minus_enum:
579 bfd_vma v1, v2;
581 if (esp - expr_stack < 2)
583 ieee_error (info, start, "expression stack underflow");
584 return false;
587 v1 = *--esp;
588 v2 = *--esp;
589 *esp++ = v1 + v2;
591 break;
595 if (esp - 1 != expr_stack)
597 ieee_error (info, expr_start, "expression stack mismatch");
598 return false;
601 *pv = *--esp;
603 return true;
606 /* Return an IEEE builtin type. */
608 static debug_type
609 ieee_builtin_type (info, p, indx)
610 struct ieee_info *info;
611 const bfd_byte *p;
612 unsigned int indx;
614 PTR dhandle;
615 debug_type type;
616 const char *name;
618 if (indx < BUILTIN_TYPE_COUNT
619 && info->types.builtins[indx] != DEBUG_TYPE_NULL)
620 return info->types.builtins[indx];
622 dhandle = info->dhandle;
624 if (indx >= 32 && indx < 64)
626 type = debug_make_pointer_type (dhandle,
627 ieee_builtin_type (info, p, indx - 32));
628 assert (indx < BUILTIN_TYPE_COUNT);
629 info->types.builtins[indx] = type;
630 return type;
633 switch ((enum builtin_types) indx)
635 default:
636 ieee_error (info, p, "unknown builtin type");
637 return NULL;
639 case builtin_unknown:
640 type = debug_make_void_type (dhandle);
641 name = NULL;
642 break;
644 case builtin_void:
645 type = debug_make_void_type (dhandle);
646 name = "void";
647 break;
649 case builtin_signed_char:
650 type = debug_make_int_type (dhandle, 1, false);
651 name = "signed char";
652 break;
654 case builtin_unsigned_char:
655 type = debug_make_int_type (dhandle, 1, true);
656 name = "unsigned char";
657 break;
659 case builtin_signed_short_int:
660 type = debug_make_int_type (dhandle, 2, false);
661 name = "signed short int";
662 break;
664 case builtin_unsigned_short_int:
665 type = debug_make_int_type (dhandle, 2, true);
666 name = "unsigned short int";
667 break;
669 case builtin_signed_long:
670 type = debug_make_int_type (dhandle, 4, false);
671 name = "signed long";
672 break;
674 case builtin_unsigned_long:
675 type = debug_make_int_type (dhandle, 4, true);
676 name = "unsigned long";
677 break;
679 case builtin_signed_long_long:
680 type = debug_make_int_type (dhandle, 8, false);
681 name = "signed long long";
682 break;
684 case builtin_unsigned_long_long:
685 type = debug_make_int_type (dhandle, 8, true);
686 name = "unsigned long long";
687 break;
689 case builtin_float:
690 type = debug_make_float_type (dhandle, 4);
691 name = "float";
692 break;
694 case builtin_double:
695 type = debug_make_float_type (dhandle, 8);
696 name = "double";
697 break;
699 case builtin_long_double:
700 /* FIXME: The size for this type should depend upon the
701 processor. */
702 type = debug_make_float_type (dhandle, 12);
703 name = "long double";
704 break;
706 case builtin_long_long_double:
707 type = debug_make_float_type (dhandle, 16);
708 name = "long long double";
709 break;
711 case builtin_quoted_string:
712 type = debug_make_array_type (dhandle,
713 ieee_builtin_type (info, p,
714 ((unsigned int)
715 builtin_char)),
716 ieee_builtin_type (info, p,
717 ((unsigned int)
718 builtin_int)),
719 0, -1, true);
720 name = "QUOTED STRING";
721 break;
723 case builtin_instruction_address:
724 /* FIXME: This should be a code address. */
725 type = debug_make_int_type (dhandle, 4, true);
726 name = "instruction address";
727 break;
729 case builtin_int:
730 /* FIXME: The size for this type should depend upon the
731 processor. */
732 type = debug_make_int_type (dhandle, 4, false);
733 name = "int";
734 break;
736 case builtin_unsigned:
737 /* FIXME: The size for this type should depend upon the
738 processor. */
739 type = debug_make_int_type (dhandle, 4, true);
740 name = "unsigned";
741 break;
743 case builtin_unsigned_int:
744 /* FIXME: The size for this type should depend upon the
745 processor. */
746 type = debug_make_int_type (dhandle, 4, true);
747 name = "unsigned int";
748 break;
750 case builtin_char:
751 type = debug_make_int_type (dhandle, 1, false);
752 name = "char";
753 break;
755 case builtin_long:
756 type = debug_make_int_type (dhandle, 4, false);
757 name = "long";
758 break;
760 case builtin_short:
761 type = debug_make_int_type (dhandle, 2, false);
762 name = "short";
763 break;
765 case builtin_unsigned_short:
766 type = debug_make_int_type (dhandle, 2, true);
767 name = "unsigned short";
768 break;
770 case builtin_short_int:
771 type = debug_make_int_type (dhandle, 2, false);
772 name = "short int";
773 break;
775 case builtin_signed_short:
776 type = debug_make_int_type (dhandle, 2, false);
777 name = "signed short";
778 break;
780 case builtin_bcd_float:
781 ieee_error (info, p, "BCD float type not supported");
782 return false;
785 if (name != NULL)
786 type = debug_name_type (dhandle, name, type);
788 assert (indx < BUILTIN_TYPE_COUNT);
790 info->types.builtins[indx] = type;
792 return type;
795 /* Allocate more space in the type table. If ref is true, this is a
796 reference to the type; if it is not already defined, we should set
797 up an indirect type. */
799 static boolean
800 ieee_alloc_type (info, indx, ref)
801 struct ieee_info *info;
802 unsigned int indx;
803 boolean ref;
805 unsigned int nalloc;
806 register struct ieee_type *t;
807 struct ieee_type *tend;
809 if (indx >= info->types.alloc)
811 nalloc = info->types.alloc;
812 if (nalloc == 0)
813 nalloc = 4;
814 while (indx >= nalloc)
815 nalloc *= 2;
817 info->types.types = ((struct ieee_type *)
818 xrealloc (info->types.types,
819 nalloc * sizeof *info->types.types));
821 memset (info->types.types + info->types.alloc, 0,
822 (nalloc - info->types.alloc) * sizeof *info->types.types);
824 tend = info->types.types + nalloc;
825 for (t = info->types.types + info->types.alloc; t < tend; t++)
826 t->type = DEBUG_TYPE_NULL;
828 info->types.alloc = nalloc;
831 if (ref)
833 t = info->types.types + indx;
834 if (t->type == NULL)
836 t->pslot = (debug_type *) xmalloc (sizeof *t->pslot);
837 *t->pslot = DEBUG_TYPE_NULL;
838 t->type = debug_make_indirect_type (info->dhandle, t->pslot,
839 (const char *) NULL);
840 if (t->type == NULL)
841 return false;
845 return true;
848 /* Read a type index and return the corresponding type. */
850 static boolean
851 ieee_read_type_index (info, pp, ptype)
852 struct ieee_info *info;
853 const bfd_byte **pp;
854 debug_type *ptype;
856 const bfd_byte *start;
857 bfd_vma indx;
859 start = *pp;
861 if (! ieee_read_number (info, pp, &indx))
862 return false;
864 if (indx < 256)
866 *ptype = ieee_builtin_type (info, start, indx);
867 if (*ptype == NULL)
868 return false;
869 return true;
872 indx -= 256;
873 if (! ieee_alloc_type (info, indx, true))
874 return false;
876 *ptype = info->types.types[indx].type;
878 return true;
881 /* Parse IEEE debugging information for a file. This is passed the
882 bytes which compose the Debug Information Part of an IEEE file. */
884 boolean
885 parse_ieee (dhandle, abfd, bytes, len)
886 PTR dhandle;
887 bfd *abfd;
888 const bfd_byte *bytes;
889 bfd_size_type len;
891 struct ieee_info info;
892 unsigned int i;
893 const bfd_byte *p, *pend;
895 info.dhandle = dhandle;
896 info.abfd = abfd;
897 info.bytes = bytes;
898 info.pend = bytes + len;
899 info.blockstack.bsp = info.blockstack.stack;
900 info.saw_filename = false;
901 info.vars.alloc = 0;
902 info.vars.vars = NULL;
903 info.types.alloc = 0;
904 info.types.types = NULL;
905 info.tags = NULL;
906 for (i = 0; i < BUILTIN_TYPE_COUNT; i++)
907 info.types.builtins[i] = DEBUG_TYPE_NULL;
909 p = bytes;
910 pend = info.pend;
911 while (p < pend)
913 const bfd_byte *record_start;
914 ieee_record_enum_type c;
916 record_start = p;
918 c = (ieee_record_enum_type) *p++;
920 if (c == ieee_at_record_enum)
921 c = (ieee_record_enum_type) (((unsigned int) c << 8) | *p++);
923 if (c <= ieee_number_repeat_end_enum)
925 ieee_error (&info, record_start, "unexpected number");
926 return false;
929 switch (c)
931 default:
932 ieee_error (&info, record_start, "unexpected record type");
933 return false;
935 case ieee_bb_record_enum:
936 if (! parse_ieee_bb (&info, &p))
937 return false;
938 break;
940 case ieee_be_record_enum:
941 if (! parse_ieee_be (&info, &p))
942 return false;
943 break;
945 case ieee_nn_record:
946 if (! parse_ieee_nn (&info, &p))
947 return false;
948 break;
950 case ieee_ty_record_enum:
951 if (! parse_ieee_ty (&info, &p))
952 return false;
953 break;
955 case ieee_atn_record_enum:
956 if (! parse_ieee_atn (&info, &p))
957 return false;
958 break;
962 if (info.blockstack.bsp != info.blockstack.stack)
964 ieee_error (&info, (const bfd_byte *) NULL,
965 "blocks left on stack at end");
966 return false;
969 return true;
972 /* Handle an IEEE BB record. */
974 static boolean
975 parse_ieee_bb (info, pp)
976 struct ieee_info *info;
977 const bfd_byte **pp;
979 const bfd_byte *block_start;
980 bfd_byte b;
981 bfd_vma size;
982 const char *name;
983 unsigned long namlen;
984 char *namcopy;
985 unsigned int fnindx;
986 boolean skip;
988 block_start = *pp;
990 b = **pp;
991 ++*pp;
993 if (! ieee_read_number (info, pp, &size)
994 || ! ieee_read_id (info, pp, &name, &namlen))
995 return false;
997 fnindx = (unsigned int) -1;
998 skip = false;
1000 switch (b)
1002 case 1:
1003 /* BB1: Type definitions local to a module. */
1004 namcopy = savestring (name, namlen);
1005 if (namcopy == NULL)
1006 return false;
1007 if (! debug_set_filename (info->dhandle, namcopy))
1008 return false;
1009 info->saw_filename = true;
1011 /* Discard any variables or types we may have seen before. */
1012 if (info->vars.vars != NULL)
1013 free (info->vars.vars);
1014 info->vars.vars = NULL;
1015 info->vars.alloc = 0;
1016 if (info->types.types != NULL)
1017 free (info->types.types);
1018 info->types.types = NULL;
1019 info->types.alloc = 0;
1021 /* Initialize the types to the global types. */
1022 if (info->global_types != NULL)
1024 info->types.alloc = info->global_types->alloc;
1025 info->types.types = ((struct ieee_type *)
1026 xmalloc (info->types.alloc
1027 * sizeof (*info->types.types)));
1028 memcpy (info->types.types, info->global_types->types,
1029 info->types.alloc * sizeof (*info->types.types));
1032 break;
1034 case 2:
1035 /* BB2: Global type definitions. The name is supposed to be
1036 empty, but we don't check. */
1037 if (! debug_set_filename (info->dhandle, "*global*"))
1038 return false;
1039 info->saw_filename = true;
1040 break;
1042 case 3:
1043 /* BB3: High level module block begin. We don't have to do
1044 anything here. The name is supposed to be the same as for
1045 the BB1, but we don't check. */
1046 break;
1048 case 4:
1049 /* BB4: Global function. */
1051 bfd_vma stackspace, typindx, offset;
1052 debug_type return_type;
1054 if (! ieee_read_number (info, pp, &stackspace)
1055 || ! ieee_read_number (info, pp, &typindx)
1056 || ! ieee_read_expression (info, pp, &offset))
1057 return false;
1059 /* We have no way to record the stack space. FIXME. */
1061 if (typindx < 256)
1063 return_type = ieee_builtin_type (info, block_start, typindx);
1064 if (return_type == DEBUG_TYPE_NULL)
1065 return false;
1067 else
1069 typindx -= 256;
1070 if (! ieee_alloc_type (info, typindx, true))
1071 return false;
1072 fnindx = typindx;
1073 return_type = info->types.types[typindx].type;
1074 if (debug_get_type_kind (info->dhandle, return_type)
1075 == DEBUG_KIND_FUNCTION)
1076 return_type = debug_get_return_type (info->dhandle,
1077 return_type);
1080 namcopy = savestring (name, namlen);
1081 if (namcopy == NULL)
1082 return false;
1083 if (! debug_record_function (info->dhandle, namcopy, return_type,
1084 true, offset))
1085 return false;
1087 break;
1089 case 5:
1090 /* BB5: File name for source line numbers. */
1092 unsigned int i;
1094 /* We ignore the date and time. FIXME. */
1095 for (i = 0; i < 6; i++)
1097 bfd_vma ignore;
1098 boolean present;
1100 if (! ieee_read_optional_number (info, pp, &ignore, &present))
1101 return false;
1102 if (! present)
1103 break;
1106 namcopy = savestring (name, namlen);
1107 if (namcopy == NULL)
1108 return false;
1109 if (! debug_start_source (info->dhandle, namcopy))
1110 return false;
1112 break;
1114 case 6:
1115 /* BB6: Local function or block. */
1117 bfd_vma stackspace, typindx, offset;
1119 if (! ieee_read_number (info, pp, &stackspace)
1120 || ! ieee_read_number (info, pp, &typindx)
1121 || ! ieee_read_expression (info, pp, &offset))
1122 return false;
1124 /* We have no way to record the stack space. FIXME. */
1126 if (namlen == 0)
1128 if (! debug_start_block (info->dhandle, offset))
1129 return false;
1130 /* Change b to indicate that this is a block
1131 rather than a function. */
1132 b = 0x86;
1134 else
1136 /* The MRI C++ compiler will output a fake function named
1137 __XRYCPP to hold C++ debugging information. We skip
1138 that function. This is not crucial, but it makes
1139 converting from IEEE to other debug formats work
1140 better. */
1141 if (strncmp (name, "__XRYCPP", namlen) == 0)
1142 skip = true;
1143 else
1145 debug_type return_type;
1147 if (typindx < 256)
1149 return_type = ieee_builtin_type (info, block_start,
1150 typindx);
1151 if (return_type == NULL)
1152 return false;
1154 else
1156 typindx -= 256;
1157 if (! ieee_alloc_type (info, typindx, true))
1158 return false;
1159 fnindx = typindx;
1160 return_type = info->types.types[typindx].type;
1161 if (debug_get_type_kind (info->dhandle, return_type)
1162 == DEBUG_KIND_FUNCTION)
1163 return_type = debug_get_return_type (info->dhandle,
1164 return_type);
1167 namcopy = savestring (name, namlen);
1168 if (namcopy == NULL)
1169 return false;
1170 if (! debug_record_function (info->dhandle, namcopy,
1171 return_type, false, offset))
1172 return false;
1176 break;
1178 case 10:
1179 /* BB10: Assembler module scope. In the normal case, we
1180 completely ignore all this information. FIXME. */
1182 const char *inam, *vstr;
1183 unsigned long inamlen, vstrlen;
1184 bfd_vma tool_type;
1185 boolean present;
1186 unsigned int i;
1188 if (! info->saw_filename)
1190 namcopy = savestring (name, namlen);
1191 if (namcopy == NULL)
1192 return false;
1193 if (! debug_set_filename (info->dhandle, namcopy))
1194 return false;
1195 info->saw_filename = true;
1198 if (! ieee_read_id (info, pp, &inam, &inamlen)
1199 || ! ieee_read_number (info, pp, &tool_type)
1200 || ! ieee_read_optional_id (info, pp, &vstr, &vstrlen, &present))
1201 return false;
1202 for (i = 0; i < 6; i++)
1204 bfd_vma ignore;
1206 if (! ieee_read_optional_number (info, pp, &ignore, &present))
1207 return false;
1208 if (! present)
1209 break;
1212 break;
1214 case 11:
1215 /* BB11: Module section. We completely ignore all this
1216 information. FIXME. */
1218 bfd_vma sectype, secindx, offset, map;
1219 boolean present;
1221 if (! ieee_read_number (info, pp, &sectype)
1222 || ! ieee_read_number (info, pp, &secindx)
1223 || ! ieee_read_expression (info, pp, &offset)
1224 || ! ieee_read_optional_number (info, pp, &map, &present))
1225 return false;
1227 break;
1229 default:
1230 ieee_error (info, block_start, "unknown BB type");
1231 return false;
1235 /* Push this block on the block stack. */
1237 if (info->blockstack.bsp >= info->blockstack.stack + BLOCKSTACK_SIZE)
1239 ieee_error (info, (const bfd_byte *) NULL, "stack overflow");
1240 return false;
1243 info->blockstack.bsp->kind = b;
1244 if (b == 5)
1245 info->blockstack.bsp->filename = namcopy;
1246 info->blockstack.bsp->fnindx = fnindx;
1247 info->blockstack.bsp->skip = skip;
1248 ++info->blockstack.bsp;
1250 return true;
1253 /* Handle an IEEE BE record. */
1255 static boolean
1256 parse_ieee_be (info, pp)
1257 struct ieee_info *info;
1258 const bfd_byte **pp;
1260 bfd_vma offset;
1262 if (info->blockstack.bsp <= info->blockstack.stack)
1264 ieee_error (info, *pp, "stack underflow");
1265 return false;
1267 --info->blockstack.bsp;
1269 switch (info->blockstack.bsp->kind)
1271 case 2:
1272 /* When we end the global typedefs block, we copy out the the
1273 contents of info->vars. This is because the variable indices
1274 may be reused in the local blocks. However, we need to
1275 preserve them so that we can locate a function returning a
1276 reference variable whose type is named in the global typedef
1277 block. */
1278 info->global_vars = ((struct ieee_vars *)
1279 xmalloc (sizeof *info->global_vars));
1280 info->global_vars->alloc = info->vars.alloc;
1281 info->global_vars->vars = ((struct ieee_var *)
1282 xmalloc (info->vars.alloc
1283 * sizeof (*info->vars.vars)));
1284 memcpy (info->global_vars->vars, info->vars.vars,
1285 info->vars.alloc * sizeof (*info->vars.vars));
1287 /* We also copy out the non builtin parts of info->types, since
1288 the types are discarded when we start a new block. */
1289 info->global_types = ((struct ieee_types *)
1290 xmalloc (sizeof *info->global_types));
1291 info->global_types->alloc = info->types.alloc;
1292 info->global_types->types = ((struct ieee_type *)
1293 xmalloc (info->types.alloc
1294 * sizeof (*info->types.types)));
1295 memcpy (info->global_types->types, info->types.types,
1296 info->types.alloc * sizeof (*info->types.types));
1297 memset (info->global_types->builtins, 0,
1298 sizeof (info->global_types->builtins));
1300 break;
1302 case 4:
1303 case 6:
1304 if (! ieee_read_expression (info, pp, &offset))
1305 return false;
1306 if (! info->blockstack.bsp->skip)
1308 if (! debug_end_function (info->dhandle, offset + 1))
1309 return false;
1311 break;
1313 case 0x86:
1314 /* This is BE6 when BB6 started a block rather than a local
1315 function. */
1316 if (! ieee_read_expression (info, pp, &offset))
1317 return false;
1318 if (! debug_end_block (info->dhandle, offset + 1))
1319 return false;
1320 break;
1322 case 5:
1323 /* When we end a BB5, we look up the stack for the last BB5, if
1324 there is one, so that we can call debug_start_source. */
1325 if (info->blockstack.bsp > info->blockstack.stack)
1327 struct ieee_block *bl;
1329 bl = info->blockstack.bsp;
1332 --bl;
1333 if (bl->kind == 5)
1335 if (! debug_start_source (info->dhandle, bl->filename))
1336 return false;
1337 break;
1340 while (bl != info->blockstack.stack);
1342 break;
1344 case 11:
1345 if (! ieee_read_expression (info, pp, &offset))
1346 return false;
1347 /* We just ignore the module size. FIXME. */
1348 break;
1350 default:
1351 /* Other block types do not have any trailing information. */
1352 break;
1355 return true;
1358 /* Parse an NN record. */
1360 static boolean
1361 parse_ieee_nn (info, pp)
1362 struct ieee_info *info;
1363 const bfd_byte **pp;
1365 const bfd_byte *nn_start;
1366 bfd_vma varindx;
1367 const char *name;
1368 unsigned long namlen;
1370 nn_start = *pp;
1372 if (! ieee_read_number (info, pp, &varindx)
1373 || ! ieee_read_id (info, pp, &name, &namlen))
1374 return false;
1376 if (varindx < 32)
1378 ieee_error (info, nn_start, "illegal variable index");
1379 return false;
1381 varindx -= 32;
1383 if (varindx >= info->vars.alloc)
1385 unsigned int alloc;
1387 alloc = info->vars.alloc;
1388 if (alloc == 0)
1389 alloc = 4;
1390 while (varindx >= alloc)
1391 alloc *= 2;
1392 info->vars.vars = ((struct ieee_var *)
1393 xrealloc (info->vars.vars,
1394 alloc * sizeof *info->vars.vars));
1395 memset (info->vars.vars + info->vars.alloc, 0,
1396 (alloc - info->vars.alloc) * sizeof *info->vars.vars);
1397 info->vars.alloc = alloc;
1400 info->vars.vars[varindx].name = name;
1401 info->vars.vars[varindx].namlen = namlen;
1403 return true;
1406 /* Parse a TY record. */
1408 static boolean
1409 parse_ieee_ty (info, pp)
1410 struct ieee_info *info;
1411 const bfd_byte **pp;
1413 const bfd_byte *ty_start, *ty_var_start, *ty_code_start;
1414 bfd_vma typeindx, varindx, tc;
1415 PTR dhandle;
1416 boolean tag, typdef;
1417 debug_type *arg_slots;
1418 unsigned long type_bitsize;
1419 debug_type type;
1421 ty_start = *pp;
1423 if (! ieee_read_number (info, pp, &typeindx))
1424 return false;
1426 if (typeindx < 256)
1428 ieee_error (info, ty_start, "illegal type index");
1429 return false;
1432 typeindx -= 256;
1433 if (! ieee_alloc_type (info, typeindx, false))
1434 return false;
1436 if (**pp != 0xce)
1438 ieee_error (info, *pp, "unknown TY code");
1439 return false;
1441 ++*pp;
1443 ty_var_start = *pp;
1445 if (! ieee_read_number (info, pp, &varindx))
1446 return false;
1448 if (varindx < 32)
1450 ieee_error (info, ty_var_start, "illegal variable index");
1451 return false;
1453 varindx -= 32;
1455 if (varindx >= info->vars.alloc || info->vars.vars[varindx].name == NULL)
1457 ieee_error (info, ty_var_start, "undefined variable in TY");
1458 return false;
1461 ty_code_start = *pp;
1463 if (! ieee_read_number (info, pp, &tc))
1464 return false;
1466 dhandle = info->dhandle;
1468 tag = false;
1469 typdef = false;
1470 arg_slots = NULL;
1471 type_bitsize = 0;
1472 switch (tc)
1474 default:
1475 ieee_error (info, ty_code_start, "unknown TY code");
1476 return false;
1478 case '!':
1479 /* Unknown type, with size. We treat it as int. FIXME. */
1481 bfd_vma size;
1483 if (! ieee_read_number (info, pp, &size))
1484 return false;
1485 type = debug_make_int_type (dhandle, size, false);
1487 break;
1489 case 'A': /* Array. */
1490 case 'a': /* FORTRAN array in column/row order. FIXME: Not
1491 distinguished from normal array. */
1493 debug_type ele_type;
1494 bfd_vma lower, upper;
1496 if (! ieee_read_type_index (info, pp, &ele_type)
1497 || ! ieee_read_number (info, pp, &lower)
1498 || ! ieee_read_number (info, pp, &upper))
1499 return false;
1500 type = debug_make_array_type (dhandle, ele_type,
1501 ieee_builtin_type (info, ty_code_start,
1502 ((unsigned int)
1503 builtin_int)),
1504 (bfd_signed_vma) lower,
1505 (bfd_signed_vma) upper,
1506 false);
1508 break;
1510 case 'E':
1511 /* Simple enumeration. */
1513 bfd_vma size;
1514 unsigned int alloc;
1515 const char **names;
1516 unsigned int c;
1517 bfd_signed_vma *vals;
1518 unsigned int i;
1520 if (! ieee_read_number (info, pp, &size))
1521 return false;
1522 /* FIXME: we ignore the enumeration size. */
1524 alloc = 10;
1525 names = (const char **) xmalloc (alloc * sizeof *names);
1526 memset (names, 0, alloc * sizeof *names);
1527 c = 0;
1528 while (1)
1530 const char *name;
1531 unsigned long namlen;
1532 boolean present;
1534 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1535 return false;
1536 if (! present)
1537 break;
1539 if (c + 1 >= alloc)
1541 alloc += 10;
1542 names = ((const char **)
1543 xrealloc (names, alloc * sizeof *names));
1546 names[c] = savestring (name, namlen);
1547 if (names[c] == NULL)
1548 return false;
1549 ++c;
1552 names[c] = NULL;
1554 vals = (bfd_signed_vma *) xmalloc (c * sizeof *vals);
1555 for (i = 0; i < c; i++)
1556 vals[i] = i;
1558 type = debug_make_enum_type (dhandle, names, vals);
1559 tag = true;
1561 break;
1563 case 'G':
1564 /* Struct with bit fields. */
1566 bfd_vma size;
1567 unsigned int alloc;
1568 debug_field *fields;
1569 unsigned int c;
1571 if (! ieee_read_number (info, pp, &size))
1572 return false;
1574 alloc = 10;
1575 fields = (debug_field *) xmalloc (alloc * sizeof *fields);
1576 c = 0;
1577 while (1)
1579 const char *name;
1580 unsigned long namlen;
1581 boolean present;
1582 debug_type ftype;
1583 bfd_vma bitpos, bitsize;
1585 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1586 return false;
1587 if (! present)
1588 break;
1589 if (! ieee_read_type_index (info, pp, &ftype)
1590 || ! ieee_read_number (info, pp, &bitpos)
1591 || ! ieee_read_number (info, pp, &bitsize))
1592 return false;
1594 if (c + 1 >= alloc)
1596 alloc += 10;
1597 fields = ((debug_field *)
1598 xrealloc (fields, alloc * sizeof *fields));
1601 fields[c] = debug_make_field (dhandle, savestring (name, namlen),
1602 ftype, bitpos, bitsize,
1603 DEBUG_VISIBILITY_PUBLIC);
1604 if (fields[c] == NULL)
1605 return false;
1606 ++c;
1609 fields[c] = NULL;
1611 type = debug_make_struct_type (dhandle, true, size, fields);
1612 tag = true;
1614 break;
1616 case 'N':
1617 /* Enumeration. */
1619 unsigned int alloc;
1620 const char **names;
1621 bfd_signed_vma *vals;
1622 unsigned int c;
1624 alloc = 10;
1625 names = (const char **) xmalloc (alloc * sizeof *names);
1626 vals = (bfd_signed_vma *) xmalloc (alloc * sizeof *names);
1627 c = 0;
1628 while (1)
1630 const char *name;
1631 unsigned long namlen;
1632 boolean present;
1633 bfd_vma val;
1635 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1636 return false;
1637 if (! present)
1638 break;
1639 if (! ieee_read_number (info, pp, &val))
1640 return false;
1642 /* If the length of the name is zero, then the value is
1643 actually the size of the enum. We ignore this
1644 information. FIXME. */
1645 if (namlen == 0)
1646 continue;
1648 if (c + 1 >= alloc)
1650 alloc += 10;
1651 names = ((const char **)
1652 xrealloc (names, alloc * sizeof *names));
1653 vals = ((bfd_signed_vma *)
1654 xrealloc (vals, alloc * sizeof *vals));
1657 names[c] = savestring (name, namlen);
1658 if (names[c] == NULL)
1659 return false;
1660 vals[c] = (bfd_signed_vma) val;
1661 ++c;
1664 names[c] = NULL;
1666 type = debug_make_enum_type (dhandle, names, vals);
1667 tag = true;
1669 break;
1671 case 'O': /* Small pointer. We don't distinguish small and large
1672 pointers. FIXME. */
1673 case 'P': /* Large pointer. */
1675 debug_type t;
1677 if (! ieee_read_type_index (info, pp, &t))
1678 return false;
1679 type = debug_make_pointer_type (dhandle, t);
1681 break;
1683 case 'R':
1684 /* Range. */
1686 bfd_vma low, high, signedp, size;
1688 if (! ieee_read_number (info, pp, &low)
1689 || ! ieee_read_number (info, pp, &high)
1690 || ! ieee_read_number (info, pp, &signedp)
1691 || ! ieee_read_number (info, pp, &size))
1692 return false;
1694 type = debug_make_range_type (dhandle,
1695 debug_make_int_type (dhandle, size,
1696 ! signedp),
1697 (bfd_signed_vma) low,
1698 (bfd_signed_vma) high);
1700 break;
1702 case 'S': /* Struct. */
1703 case 'U': /* Union. */
1705 bfd_vma size;
1706 unsigned int alloc;
1707 debug_field *fields;
1708 unsigned int c;
1710 if (! ieee_read_number (info, pp, &size))
1711 return false;
1713 alloc = 10;
1714 fields = (debug_field *) xmalloc (alloc * sizeof *fields);
1715 c = 0;
1716 while (1)
1718 const char *name;
1719 unsigned long namlen;
1720 boolean present;
1721 bfd_vma tindx;
1722 bfd_vma offset;
1723 debug_type ftype;
1724 bfd_vma bitsize;
1726 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1727 return false;
1728 if (! present)
1729 break;
1730 if (! ieee_read_number (info, pp, &tindx)
1731 || ! ieee_read_number (info, pp, &offset))
1732 return false;
1734 if (tindx < 256)
1736 ftype = ieee_builtin_type (info, ty_code_start, tindx);
1737 bitsize = 0;
1738 offset *= 8;
1740 else
1742 struct ieee_type *t;
1744 tindx -= 256;
1745 if (! ieee_alloc_type (info, tindx, true))
1746 return false;
1747 t = info->types.types + tindx;
1748 ftype = t->type;
1749 bitsize = t->bitsize;
1750 if (bitsize == 0)
1751 offset *= 8;
1754 if (c + 1 >= alloc)
1756 alloc += 10;
1757 fields = ((debug_field *)
1758 xrealloc (fields, alloc * sizeof *fields));
1761 fields[c] = debug_make_field (dhandle, savestring (name, namlen),
1762 ftype, offset, bitsize,
1763 DEBUG_VISIBILITY_PUBLIC);
1764 if (fields[c] == NULL)
1765 return false;
1766 ++c;
1769 fields[c] = NULL;
1771 type = debug_make_struct_type (dhandle, tc == 'S', size, fields);
1772 tag = true;
1774 break;
1776 case 'T':
1777 /* Typedef. */
1778 if (! ieee_read_type_index (info, pp, &type))
1779 return false;
1780 typdef = true;
1781 break;
1783 case 'X':
1784 /* Procedure. FIXME: This is an extern declaration, which we
1785 have no way of representing. */
1787 bfd_vma attr;
1788 debug_type rtype;
1789 bfd_vma nargs;
1790 boolean present;
1791 struct ieee_var *pv;
1793 /* FIXME: We ignore the attribute and the argument names. */
1795 if (! ieee_read_number (info, pp, &attr)
1796 || ! ieee_read_type_index (info, pp, &rtype)
1797 || ! ieee_read_number (info, pp, &nargs))
1798 return false;
1801 const char *name;
1802 unsigned long namlen;
1804 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1805 return false;
1807 while (present);
1809 pv = info->vars.vars + varindx;
1810 pv->kind = IEEE_EXTERNAL;
1811 if (pv->namlen > 0
1812 && debug_get_type_kind (dhandle, rtype) == DEBUG_KIND_POINTER)
1814 /* Set up the return type as an indirect type pointing to
1815 the variable slot, so that we can change it to a
1816 reference later if appropriate. */
1817 pv->pslot = (debug_type *) xmalloc (sizeof *pv->pslot);
1818 *pv->pslot = rtype;
1819 rtype = debug_make_indirect_type (dhandle, pv->pslot,
1820 (const char *) NULL);
1823 type = debug_make_function_type (dhandle, rtype, (debug_type *) NULL,
1824 false);
1826 break;
1828 case 'V':
1829 /* Void. This is not documented, but the MRI compiler emits it. */
1830 type = debug_make_void_type (dhandle);
1831 break;
1833 case 'Z':
1834 /* Array with 0 lower bound. */
1836 debug_type etype;
1837 bfd_vma high;
1839 if (! ieee_read_type_index (info, pp, &etype)
1840 || ! ieee_read_number (info, pp, &high))
1841 return false;
1843 type = debug_make_array_type (dhandle, etype,
1844 ieee_builtin_type (info, ty_code_start,
1845 ((unsigned int)
1846 builtin_int)),
1847 0, (bfd_signed_vma) high, false);
1849 break;
1851 case 'c': /* Complex. */
1852 case 'd': /* Double complex. */
1854 const char *name;
1855 unsigned long namlen;
1857 /* FIXME: I don't know what the name means. */
1859 if (! ieee_read_id (info, pp, &name, &namlen))
1860 return false;
1862 type = debug_make_complex_type (dhandle, tc == 'c' ? 4 : 8);
1864 break;
1866 case 'f':
1867 /* Pascal file name. FIXME. */
1868 ieee_error (info, ty_code_start, "Pascal file name not supported");
1869 return false;
1871 case 'g':
1872 /* Bitfield type. */
1874 bfd_vma signedp, bitsize, dummy;
1875 const bfd_byte *hold;
1876 boolean present;
1878 if (! ieee_read_number (info, pp, &signedp)
1879 || ! ieee_read_number (info, pp, &bitsize))
1880 return false;
1882 /* I think the documentation says that there is a type index,
1883 but some actual files do not have one. */
1884 hold = *pp;
1885 if (! ieee_read_optional_number (info, pp, &dummy, &present))
1886 return false;
1887 if (! present)
1889 /* FIXME: This is just a guess. */
1890 type = debug_make_int_type (dhandle, 4,
1891 signedp ? false : true);
1893 else
1895 *pp = hold;
1896 if (! ieee_read_type_index (info, pp, &type))
1897 return false;
1899 type_bitsize = bitsize;
1901 break;
1903 case 'n':
1904 /* Qualifier. */
1906 bfd_vma kind;
1907 debug_type t;
1909 if (! ieee_read_number (info, pp, &kind)
1910 || ! ieee_read_type_index (info, pp, &t))
1911 return false;
1913 switch (kind)
1915 default:
1916 ieee_error (info, ty_start, "unsupported qualifer");
1917 return false;
1919 case 1:
1920 type = debug_make_const_type (dhandle, t);
1921 break;
1923 case 2:
1924 type = debug_make_volatile_type (dhandle, t);
1925 break;
1928 break;
1930 case 's':
1931 /* Set. */
1933 bfd_vma size;
1934 debug_type etype;
1936 if (! ieee_read_number (info, pp, &size)
1937 || ! ieee_read_type_index (info, pp, &etype))
1938 return false;
1940 /* FIXME: We ignore the size. */
1942 type = debug_make_set_type (dhandle, etype, false);
1944 break;
1946 case 'x':
1947 /* Procedure with compiler dependencies. */
1949 struct ieee_var *pv;
1950 bfd_vma attr, frame_type, push_mask, nargs, level, father;
1951 debug_type rtype;
1952 debug_type *arg_types;
1953 boolean varargs;
1954 boolean present;
1956 /* FIXME: We ignore some of this information. */
1958 pv = info->vars.vars + varindx;
1960 if (! ieee_read_number (info, pp, &attr)
1961 || ! ieee_read_number (info, pp, &frame_type)
1962 || ! ieee_read_number (info, pp, &push_mask)
1963 || ! ieee_read_type_index (info, pp, &rtype)
1964 || ! ieee_read_number (info, pp, &nargs))
1965 return false;
1966 if (nargs == (bfd_vma) -1)
1968 arg_types = NULL;
1969 varargs = false;
1971 else
1973 unsigned int i;
1975 arg_types = ((debug_type *)
1976 xmalloc ((nargs + 1) * sizeof *arg_types));
1977 for (i = 0; i < nargs; i++)
1978 if (! ieee_read_type_index (info, pp, arg_types + i))
1979 return false;
1981 /* If the last type is pointer to void, this is really a
1982 varargs function. */
1983 varargs = false;
1984 if (nargs > 0)
1986 debug_type last;
1988 last = arg_types[nargs - 1];
1989 if (debug_get_type_kind (dhandle, last) == DEBUG_KIND_POINTER
1990 && (debug_get_type_kind (dhandle,
1991 debug_get_target_type (dhandle,
1992 last))
1993 == DEBUG_KIND_VOID))
1995 --nargs;
1996 varargs = true;
2000 /* If there are any pointer arguments, turn them into
2001 indirect types in case we later need to convert them to
2002 reference types. */
2003 for (i = 0; i < nargs; i++)
2005 if (debug_get_type_kind (dhandle, arg_types[i])
2006 == DEBUG_KIND_POINTER)
2008 if (arg_slots == NULL)
2010 arg_slots = ((debug_type *)
2011 xmalloc (nargs * sizeof *arg_slots));
2012 memset (arg_slots, 0, nargs * sizeof *arg_slots);
2014 arg_slots[i] = arg_types[i];
2015 arg_types[i] =
2016 debug_make_indirect_type (dhandle,
2017 arg_slots + i,
2018 (const char *) NULL);
2022 arg_types[nargs] = DEBUG_TYPE_NULL;
2024 if (! ieee_read_number (info, pp, &level)
2025 || ! ieee_read_optional_number (info, pp, &father, &present))
2026 return false;
2028 /* We can't distinguish between a global function and a static
2029 function. */
2030 pv->kind = IEEE_FUNCTION;
2032 if (pv->namlen > 0
2033 && debug_get_type_kind (dhandle, rtype) == DEBUG_KIND_POINTER)
2035 /* Set up the return type as an indirect type pointing to
2036 the variable slot, so that we can change it to a
2037 reference later if appropriate. */
2038 pv->pslot = (debug_type *) xmalloc (sizeof *pv->pslot);
2039 *pv->pslot = rtype;
2040 rtype = debug_make_indirect_type (dhandle, pv->pslot,
2041 (const char *) NULL);
2044 type = debug_make_function_type (dhandle, rtype, arg_types, varargs);
2046 break;
2049 /* Record the type in the table. */
2051 if (type == DEBUG_TYPE_NULL)
2052 return false;
2054 info->vars.vars[varindx].type = type;
2056 if ((tag || typdef)
2057 && info->vars.vars[varindx].namlen > 0)
2059 const char *name;
2061 name = savestring (info->vars.vars[varindx].name,
2062 info->vars.vars[varindx].namlen);
2063 if (typdef)
2064 type = debug_name_type (dhandle, name, type);
2065 else if (tc == 'E' || tc == 'N')
2066 type = debug_tag_type (dhandle, name, type);
2067 else
2069 struct ieee_tag *it;
2071 /* We must allocate all struct tags as indirect types, so
2072 that if we later see a definition of the tag as a C++
2073 record we can update the indirect slot and automatically
2074 change all the existing references. */
2075 it = (struct ieee_tag *) xmalloc (sizeof *it);
2076 memset (it, 0, sizeof *it);
2077 it->next = info->tags;
2078 info->tags = it;
2079 it->name = name;
2080 it->slot = type;
2082 type = debug_make_indirect_type (dhandle, &it->slot, name);
2083 type = debug_tag_type (dhandle, name, type);
2085 it->type = type;
2087 if (type == NULL)
2088 return false;
2091 info->types.types[typeindx].type = type;
2092 info->types.types[typeindx].arg_slots = arg_slots;
2093 info->types.types[typeindx].bitsize = type_bitsize;
2095 /* We may have already allocated type as an indirect type pointing
2096 to slot. It does no harm to replace the indirect type with the
2097 real type. Filling in slot as well handles the indirect types
2098 which are already hanging around. */
2099 if (info->types.types[typeindx].pslot != NULL)
2100 *info->types.types[typeindx].pslot = type;
2102 return true;
2105 /* Parse an ATN record. */
2107 static boolean
2108 parse_ieee_atn (info, pp)
2109 struct ieee_info *info;
2110 const bfd_byte **pp;
2112 const bfd_byte *atn_start, *atn_code_start;
2113 bfd_vma varindx;
2114 struct ieee_var *pvar;
2115 debug_type type;
2116 bfd_vma atn_code;
2117 PTR dhandle;
2118 bfd_vma v, v2, v3, v4, v5;
2119 const char *name;
2120 unsigned long namlen;
2121 char *namcopy;
2122 boolean present;
2123 int blocktype;
2125 atn_start = *pp;
2127 if (! ieee_read_number (info, pp, &varindx)
2128 || ! ieee_read_type_index (info, pp, &type))
2129 return false;
2131 atn_code_start = *pp;
2133 if (! ieee_read_number (info, pp, &atn_code))
2134 return false;
2136 if (varindx == 0)
2138 pvar = NULL;
2139 name = "";
2140 namlen = 0;
2142 else if (varindx < 32)
2144 ieee_error (info, atn_start, "illegal variable index");
2145 return false;
2147 else
2149 varindx -= 32;
2150 if (varindx >= info->vars.alloc
2151 || info->vars.vars[varindx].name == NULL)
2153 /* The MRI compiler or linker sometimes omits the NN record
2154 for a pmisc record. */
2155 if (atn_code == 62)
2157 if (varindx >= info->vars.alloc)
2159 unsigned int alloc;
2161 alloc = info->vars.alloc;
2162 if (alloc == 0)
2163 alloc = 4;
2164 while (varindx >= alloc)
2165 alloc *= 2;
2166 info->vars.vars = ((struct ieee_var *)
2167 xrealloc (info->vars.vars,
2168 (alloc
2169 * sizeof *info->vars.vars)));
2170 memset (info->vars.vars + info->vars.alloc, 0,
2171 ((alloc - info->vars.alloc)
2172 * sizeof *info->vars.vars));
2173 info->vars.alloc = alloc;
2176 pvar = info->vars.vars + varindx;
2177 pvar->name = "";
2178 pvar->namlen = 0;
2180 else
2182 ieee_error (info, atn_start, "undefined variable in ATN");
2183 return false;
2187 pvar = info->vars.vars + varindx;
2189 pvar->type = type;
2191 name = pvar->name;
2192 namlen = pvar->namlen;
2195 dhandle = info->dhandle;
2197 /* If we are going to call debug_record_variable with a pointer
2198 type, change the type to an indirect type so that we can later
2199 change it to a reference type if we encounter a C++ pmisc 'R'
2200 record. */
2201 if (pvar != NULL
2202 && type != DEBUG_TYPE_NULL
2203 && debug_get_type_kind (dhandle, type) == DEBUG_KIND_POINTER)
2205 switch (atn_code)
2207 case 1:
2208 case 2:
2209 case 3:
2210 case 5:
2211 case 8:
2212 case 10:
2213 pvar->pslot = (debug_type *) xmalloc (sizeof *pvar->pslot);
2214 *pvar->pslot = type;
2215 type = debug_make_indirect_type (dhandle, pvar->pslot,
2216 (const char *) NULL);
2217 pvar->type = type;
2218 break;
2222 switch (atn_code)
2224 default:
2225 ieee_error (info, atn_code_start, "unknown ATN type");
2226 return false;
2228 case 1:
2229 /* Automatic variable. */
2230 if (! ieee_read_number (info, pp, &v))
2231 return false;
2232 namcopy = savestring (name, namlen);
2233 if (type == NULL)
2234 type = debug_make_void_type (dhandle);
2235 if (pvar != NULL)
2236 pvar->kind = IEEE_LOCAL;
2237 return debug_record_variable (dhandle, namcopy, type, DEBUG_LOCAL, v);
2239 case 2:
2240 /* Register variable. */
2241 if (! ieee_read_number (info, pp, &v))
2242 return false;
2243 namcopy = savestring (name, namlen);
2244 if (type == NULL)
2245 type = debug_make_void_type (dhandle);
2246 if (pvar != NULL)
2247 pvar->kind = IEEE_LOCAL;
2248 return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER,
2249 ieee_regno_to_genreg (info->abfd, v));
2251 case 3:
2252 /* Static variable. */
2253 if (! ieee_require_asn (info, pp, &v))
2254 return false;
2255 namcopy = savestring (name, namlen);
2256 if (type == NULL)
2257 type = debug_make_void_type (dhandle);
2258 if (info->blockstack.bsp <= info->blockstack.stack)
2259 blocktype = 0;
2260 else
2261 blocktype = info->blockstack.bsp[-1].kind;
2262 if (pvar != NULL)
2264 if (blocktype == 4 || blocktype == 6)
2265 pvar->kind = IEEE_LOCAL;
2266 else
2267 pvar->kind = IEEE_STATIC;
2269 return debug_record_variable (dhandle, namcopy, type,
2270 (blocktype == 4 || blocktype == 6
2271 ? DEBUG_LOCAL_STATIC
2272 : DEBUG_STATIC),
2275 case 4:
2276 /* External function. We don't currently record these. FIXME. */
2277 if (pvar != NULL)
2278 pvar->kind = IEEE_EXTERNAL;
2279 return true;
2281 case 5:
2282 /* External variable. We don't currently record these. FIXME. */
2283 if (pvar != NULL)
2284 pvar->kind = IEEE_EXTERNAL;
2285 return true;
2287 case 7:
2288 if (! ieee_read_number (info, pp, &v)
2289 || ! ieee_read_number (info, pp, &v2)
2290 || ! ieee_read_optional_number (info, pp, &v3, &present))
2291 return false;
2292 if (present)
2294 if (! ieee_read_optional_number (info, pp, &v4, &present))
2295 return false;
2298 /* We just ignore the two optional fields in v3 and v4, since
2299 they are not defined. */
2301 if (! ieee_require_asn (info, pp, &v3))
2302 return false;
2304 /* We have no way to record the column number. FIXME. */
2306 return debug_record_line (dhandle, v, v3);
2308 case 8:
2309 /* Global variable. */
2310 if (! ieee_require_asn (info, pp, &v))
2311 return false;
2312 namcopy = savestring (name, namlen);
2313 if (type == NULL)
2314 type = debug_make_void_type (dhandle);
2315 if (pvar != NULL)
2316 pvar->kind = IEEE_GLOBAL;
2317 return debug_record_variable (dhandle, namcopy, type, DEBUG_GLOBAL, v);
2319 case 9:
2320 /* Variable lifetime information. */
2321 if (! ieee_read_number (info, pp, &v))
2322 return false;
2324 /* We have no way to record this information. FIXME. */
2325 return true;
2327 case 10:
2328 /* Locked register. The spec says that there are two required
2329 fields, but at least on occasion the MRI compiler only emits
2330 one. */
2331 if (! ieee_read_number (info, pp, &v)
2332 || ! ieee_read_optional_number (info, pp, &v2, &present))
2333 return false;
2335 /* I think this means a variable that is both in a register and
2336 a frame slot. We ignore the frame slot. FIXME. */
2338 namcopy = savestring (name, namlen);
2339 if (type == NULL)
2340 type = debug_make_void_type (dhandle);
2341 if (pvar != NULL)
2342 pvar->kind = IEEE_LOCAL;
2343 return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER, v);
2345 case 11:
2346 /* Reserved for FORTRAN common. */
2347 ieee_error (info, atn_code_start, "unsupported ATN11");
2349 /* Return true to keep going. */
2350 return true;
2352 case 12:
2353 /* Based variable. */
2354 v3 = 0;
2355 v4 = 0x80;
2356 v5 = 0;
2357 if (! ieee_read_number (info, pp, &v)
2358 || ! ieee_read_number (info, pp, &v2)
2359 || ! ieee_read_optional_number (info, pp, &v3, &present))
2360 return false;
2361 if (present)
2363 if (! ieee_read_optional_number (info, pp, &v4, &present))
2364 return false;
2365 if (present)
2367 if (! ieee_read_optional_number (info, pp, &v5, &present))
2368 return false;
2372 /* We have no way to record this information. FIXME. */
2374 ieee_error (info, atn_code_start, "unsupported ATN12");
2376 /* Return true to keep going. */
2377 return true;
2379 case 16:
2380 /* Constant. The description of this that I have is ambiguous,
2381 so I'm not going to try to implement it. */
2382 if (! ieee_read_number (info, pp, &v)
2383 || ! ieee_read_optional_number (info, pp, &v2, &present))
2384 return false;
2385 if (present)
2387 if (! ieee_read_optional_number (info, pp, &v2, &present))
2388 return false;
2389 if (present)
2391 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
2392 return false;
2396 if ((ieee_record_enum_type) **pp == ieee_e2_first_byte_enum)
2398 if (! ieee_require_asn (info, pp, &v3))
2399 return false;
2402 return true;
2404 case 19:
2405 /* Static variable from assembler. */
2406 v2 = 0;
2407 if (! ieee_read_number (info, pp, &v)
2408 || ! ieee_read_optional_number (info, pp, &v2, &present)
2409 || ! ieee_require_asn (info, pp, &v3))
2410 return false;
2411 namcopy = savestring (name, namlen);
2412 /* We don't really handle this correctly. FIXME. */
2413 return debug_record_variable (dhandle, namcopy,
2414 debug_make_void_type (dhandle),
2415 v2 != 0 ? DEBUG_GLOBAL : DEBUG_STATIC,
2416 v3);
2418 case 62:
2419 /* Procedure miscellaneous information. */
2420 case 63:
2421 /* Variable miscellaneous information. */
2422 case 64:
2423 /* Module miscellaneous information. */
2424 if (! ieee_read_number (info, pp, &v)
2425 || ! ieee_read_number (info, pp, &v2)
2426 || ! ieee_read_optional_id (info, pp, &name, &namlen, &present))
2427 return false;
2429 if (atn_code == 62 && v == 80)
2431 if (present)
2433 ieee_error (info, atn_code_start,
2434 "unexpected string in C++ misc");
2435 return false;
2437 return ieee_read_cxx_misc (info, pp, v2);
2440 /* We just ignore all of this stuff. FIXME. */
2442 for (; v2 > 0; --v2)
2444 switch ((ieee_record_enum_type) **pp)
2446 default:
2447 ieee_error (info, *pp, "bad misc record");
2448 return false;
2450 case ieee_at_record_enum:
2451 if (! ieee_require_atn65 (info, pp, &name, &namlen))
2452 return false;
2453 break;
2455 case ieee_e2_first_byte_enum:
2456 if (! ieee_require_asn (info, pp, &v3))
2457 return false;
2458 break;
2462 return true;
2465 /*NOTREACHED*/
2468 /* Handle C++ debugging miscellaneous records. This is called for
2469 procedure miscellaneous records of type 80. */
2471 static boolean
2472 ieee_read_cxx_misc (info, pp, count)
2473 struct ieee_info *info;
2474 const bfd_byte **pp;
2475 unsigned long count;
2477 const bfd_byte *start;
2478 bfd_vma category;
2480 start = *pp;
2482 /* Get the category of C++ misc record. */
2483 if (! ieee_require_asn (info, pp, &category))
2484 return false;
2485 --count;
2487 switch (category)
2489 default:
2490 ieee_error (info, start, "unrecognized C++ misc record");
2491 return false;
2493 case 'T':
2494 if (! ieee_read_cxx_class (info, pp, count))
2495 return false;
2496 break;
2498 case 'M':
2500 bfd_vma flags;
2501 const char *name;
2502 unsigned long namlen;
2504 /* The IEEE spec indicates that the 'M' record only has a
2505 flags field. The MRI compiler also emits the name of the
2506 function. */
2508 if (! ieee_require_asn (info, pp, &flags))
2509 return false;
2510 if (*pp < info->pend
2511 && (ieee_record_enum_type) **pp == ieee_at_record_enum)
2513 if (! ieee_require_atn65 (info, pp, &name, &namlen))
2514 return false;
2517 /* This is emitted for method functions, but I don't think we
2518 care very much. It might help if it told us useful
2519 information like the class with which this function is
2520 associated, but it doesn't, so it isn't helpful. */
2522 break;
2524 case 'B':
2525 if (! ieee_read_cxx_defaults (info, pp, count))
2526 return false;
2527 break;
2529 case 'z':
2531 const char *name, *mangled, *class;
2532 unsigned long namlen, mangledlen, classlen;
2533 bfd_vma control;
2535 /* Pointer to member. */
2537 if (! ieee_require_atn65 (info, pp, &name, &namlen)
2538 || ! ieee_require_atn65 (info, pp, &mangled, &mangledlen)
2539 || ! ieee_require_atn65 (info, pp, &class, &classlen)
2540 || ! ieee_require_asn (info, pp, &control))
2541 return false;
2543 /* FIXME: We should now track down name and change its type. */
2545 break;
2547 case 'R':
2548 if (! ieee_read_reference (info, pp))
2549 return false;
2550 break;
2553 return true;
2556 /* Read a C++ class definition. This is a pmisc type 80 record of
2557 category 'T'. */
2559 static boolean
2560 ieee_read_cxx_class (info, pp, count)
2561 struct ieee_info *info;
2562 const bfd_byte **pp;
2563 unsigned long count;
2565 const bfd_byte *start;
2566 bfd_vma class;
2567 const char *tag;
2568 unsigned long taglen;
2569 struct ieee_tag *it;
2570 PTR dhandle;
2571 debug_field *fields;
2572 unsigned int field_count, field_alloc;
2573 debug_baseclass *baseclasses;
2574 unsigned int baseclasses_count, baseclasses_alloc;
2575 const debug_field *structfields;
2576 struct ieee_method
2578 const char *name;
2579 unsigned long namlen;
2580 debug_method_variant *variants;
2581 unsigned count;
2582 unsigned int alloc;
2583 } *methods;
2584 unsigned int methods_count, methods_alloc;
2585 debug_type vptrbase;
2586 boolean ownvptr;
2587 debug_method *dmethods;
2589 start = *pp;
2591 if (! ieee_require_asn (info, pp, &class))
2592 return false;
2593 --count;
2595 if (! ieee_require_atn65 (info, pp, &tag, &taglen))
2596 return false;
2597 --count;
2599 /* Find the C struct with this name. */
2600 for (it = info->tags; it != NULL; it = it->next)
2601 if (it->name[0] == tag[0]
2602 && strncmp (it->name, tag, taglen) == 0
2603 && strlen (it->name) == taglen)
2604 break;
2605 if (it == NULL)
2607 ieee_error (info, start, "undefined C++ object");
2608 return false;
2611 dhandle = info->dhandle;
2613 fields = NULL;
2614 field_count = 0;
2615 field_alloc = 0;
2616 baseclasses = NULL;
2617 baseclasses_count = 0;
2618 baseclasses_alloc = 0;
2619 methods = NULL;
2620 methods_count = 0;
2621 methods_alloc = 0;
2622 vptrbase = DEBUG_TYPE_NULL;
2623 ownvptr = false;
2625 structfields = debug_get_fields (dhandle, it->type);
2627 while (count > 0)
2629 bfd_vma id;
2630 const bfd_byte *spec_start;
2632 spec_start = *pp;
2634 if (! ieee_require_asn (info, pp, &id))
2635 return false;
2636 --count;
2638 switch (id)
2640 default:
2641 ieee_error (info, spec_start, "unrecognized C++ object spec");
2642 return false;
2644 case 'b':
2646 bfd_vma flags, cinline;
2647 const char *basename, *fieldname;
2648 unsigned long baselen, fieldlen;
2649 char *basecopy;
2650 debug_type basetype;
2651 bfd_vma bitpos;
2652 boolean virtualp;
2653 enum debug_visibility visibility;
2654 debug_baseclass baseclass;
2656 /* This represents a base or friend class. */
2658 if (! ieee_require_asn (info, pp, &flags)
2659 || ! ieee_require_atn65 (info, pp, &basename, &baselen)
2660 || ! ieee_require_asn (info, pp, &cinline)
2661 || ! ieee_require_atn65 (info, pp, &fieldname, &fieldlen))
2662 return false;
2663 count -= 4;
2665 /* We have no way of recording friend information, so we
2666 just ignore it. */
2667 if ((flags & BASEFLAGS_FRIEND) != 0)
2668 break;
2670 /* I assume that either all of the members of the
2671 baseclass are included in the object, starting at the
2672 beginning of the object, or that none of them are
2673 included. */
2675 if ((fieldlen == 0) == (cinline == 0))
2677 ieee_error (info, start, "unsupported C++ object type");
2678 return false;
2681 basecopy = savestring (basename, baselen);
2682 basetype = debug_find_tagged_type (dhandle, basecopy,
2683 DEBUG_KIND_ILLEGAL);
2684 free (basecopy);
2685 if (basetype == DEBUG_TYPE_NULL)
2687 ieee_error (info, start, "C++ base class not defined");
2688 return false;
2691 if (fieldlen == 0)
2692 bitpos = 0;
2693 else
2695 const debug_field *pf;
2697 if (structfields == NULL)
2699 ieee_error (info, start, "C++ object has no fields");
2700 return false;
2703 for (pf = structfields; *pf != DEBUG_FIELD_NULL; pf++)
2705 const char *fname;
2707 fname = debug_get_field_name (dhandle, *pf);
2708 if (fname == NULL)
2709 return false;
2710 if (fname[0] == fieldname[0]
2711 && strncmp (fname, fieldname, fieldlen) == 0
2712 && strlen (fname) == fieldlen)
2713 break;
2715 if (*pf == DEBUG_FIELD_NULL)
2717 ieee_error (info, start,
2718 "C++ base class not found in container");
2719 return false;
2722 bitpos = debug_get_field_bitpos (dhandle, *pf);
2725 if ((flags & BASEFLAGS_VIRTUAL) != 0)
2726 virtualp = true;
2727 else
2728 virtualp = false;
2729 if ((flags & BASEFLAGS_PRIVATE) != 0)
2730 visibility = DEBUG_VISIBILITY_PRIVATE;
2731 else
2732 visibility = DEBUG_VISIBILITY_PUBLIC;
2734 baseclass = debug_make_baseclass (dhandle, basetype, bitpos,
2735 virtualp, visibility);
2736 if (baseclass == DEBUG_BASECLASS_NULL)
2737 return false;
2739 if (baseclasses_count + 1 >= baseclasses_alloc)
2741 baseclasses_alloc += 10;
2742 baseclasses = ((debug_baseclass *)
2743 xrealloc (baseclasses,
2744 (baseclasses_alloc
2745 * sizeof *baseclasses)));
2748 baseclasses[baseclasses_count] = baseclass;
2749 ++baseclasses_count;
2750 baseclasses[baseclasses_count] = DEBUG_BASECLASS_NULL;
2752 break;
2754 case 'd':
2756 bfd_vma flags;
2757 const char *fieldname, *mangledname;
2758 unsigned long fieldlen, mangledlen;
2759 char *fieldcopy;
2760 boolean staticp;
2761 debug_type ftype;
2762 const debug_field *pf;
2763 enum debug_visibility visibility;
2764 debug_field field;
2766 /* This represents a data member. */
2768 if (! ieee_require_asn (info, pp, &flags)
2769 || ! ieee_require_atn65 (info, pp, &fieldname, &fieldlen)
2770 || ! ieee_require_atn65 (info, pp, &mangledname, &mangledlen))
2771 return false;
2772 count -= 3;
2774 fieldcopy = savestring (fieldname, fieldlen);
2776 staticp = (flags & CXXFLAGS_STATIC) != 0 ? true : false;
2778 if (staticp)
2780 struct ieee_var *pv, *pvend;
2782 /* See if we can find a definition for this variable. */
2783 pv = info->vars.vars;
2784 pvend = pv + info->vars.alloc;
2785 for (; pv < pvend; pv++)
2786 if (pv->namlen == mangledlen
2787 && strncmp (pv->name, mangledname, mangledlen) == 0)
2788 break;
2789 if (pv < pvend)
2790 ftype = pv->type;
2791 else
2793 /* This can happen if the variable is never used. */
2794 ftype = ieee_builtin_type (info, start,
2795 (unsigned int) builtin_void);
2798 else
2800 unsigned int findx;
2802 if (structfields == NULL)
2804 ieee_error (info, start, "C++ object has no fields");
2805 return false;
2808 for (pf = structfields, findx = 0;
2809 *pf != DEBUG_FIELD_NULL;
2810 pf++, findx++)
2812 const char *fname;
2814 fname = debug_get_field_name (dhandle, *pf);
2815 if (fname == NULL)
2816 return false;
2817 if (fname[0] == mangledname[0]
2818 && strncmp (fname, mangledname, mangledlen) == 0
2819 && strlen (fname) == mangledlen)
2820 break;
2822 if (*pf == DEBUG_FIELD_NULL)
2824 ieee_error (info, start,
2825 "C++ data member not found in container");
2826 return false;
2829 ftype = debug_get_field_type (dhandle, *pf);
2831 if (debug_get_type_kind (dhandle, ftype) == DEBUG_KIND_POINTER)
2833 /* We might need to convert this field into a
2834 reference type later on, so make it an indirect
2835 type. */
2836 if (it->fslots == NULL)
2838 unsigned int fcnt;
2839 const debug_field *pfcnt;
2841 fcnt = 0;
2842 for (pfcnt = structfields;
2843 *pfcnt != DEBUG_FIELD_NULL;
2844 pfcnt++)
2845 ++fcnt;
2846 it->fslots = ((debug_type *)
2847 xmalloc (fcnt * sizeof *it->fslots));
2848 memset (it->fslots, 0,
2849 fcnt * sizeof *it->fslots);
2852 if (ftype == DEBUG_TYPE_NULL)
2853 return false;
2854 it->fslots[findx] = ftype;
2855 ftype = debug_make_indirect_type (dhandle,
2856 it->fslots + findx,
2857 (const char *) NULL);
2860 if (ftype == DEBUG_TYPE_NULL)
2861 return false;
2863 switch (flags & CXXFLAGS_VISIBILITY)
2865 default:
2866 ieee_error (info, start, "unknown C++ visibility");
2867 return false;
2869 case CXXFLAGS_VISIBILITY_PUBLIC:
2870 visibility = DEBUG_VISIBILITY_PUBLIC;
2871 break;
2873 case CXXFLAGS_VISIBILITY_PRIVATE:
2874 visibility = DEBUG_VISIBILITY_PRIVATE;
2875 break;
2877 case CXXFLAGS_VISIBILITY_PROTECTED:
2878 visibility = DEBUG_VISIBILITY_PROTECTED;
2879 break;
2882 if (staticp)
2884 char *mangledcopy;
2886 mangledcopy = savestring (mangledname, mangledlen);
2888 field = debug_make_static_member (dhandle, fieldcopy,
2889 ftype, mangledcopy,
2890 visibility);
2892 else
2894 bfd_vma bitpos, bitsize;
2896 bitpos = debug_get_field_bitpos (dhandle, *pf);
2897 bitsize = debug_get_field_bitsize (dhandle, *pf);
2898 if (bitpos == (bfd_vma) -1 || bitsize == (bfd_vma) -1)
2900 ieee_error (info, start, "bad C++ field bit pos or size");
2901 return false;
2903 field = debug_make_field (dhandle, fieldcopy, ftype, bitpos,
2904 bitsize, visibility);
2907 if (field == DEBUG_FIELD_NULL)
2908 return false;
2910 if (field_count + 1 >= field_alloc)
2912 field_alloc += 10;
2913 fields = ((debug_field *)
2914 xrealloc (fields, field_alloc * sizeof *fields));
2917 fields[field_count] = field;
2918 ++field_count;
2919 fields[field_count] = DEBUG_FIELD_NULL;
2921 break;
2923 case 'm':
2924 case 'v':
2926 bfd_vma flags, voffset, control;
2927 const char *name, *mangled;
2928 unsigned long namlen, mangledlen;
2929 struct ieee_var *pv, *pvend;
2930 debug_type type;
2931 enum debug_visibility visibility;
2932 boolean constp, volatilep;
2933 char *mangledcopy;
2934 debug_method_variant mv;
2935 struct ieee_method *meth;
2936 unsigned int im;
2938 if (! ieee_require_asn (info, pp, &flags)
2939 || ! ieee_require_atn65 (info, pp, &name, &namlen)
2940 || ! ieee_require_atn65 (info, pp, &mangled, &mangledlen))
2941 return false;
2942 count -= 3;
2943 if (id != 'v')
2944 voffset = 0;
2945 else
2947 if (! ieee_require_asn (info, pp, &voffset))
2948 return false;
2949 --count;
2951 if (! ieee_require_asn (info, pp, &control))
2952 return false;
2953 --count;
2955 /* We just ignore the control information. */
2957 /* We have no way to represent friend information, so we
2958 just ignore it. */
2959 if ((flags & CXXFLAGS_FRIEND) != 0)
2960 break;
2962 /* We should already have seen a type for the function. */
2963 pv = info->vars.vars;
2964 pvend = pv + info->vars.alloc;
2965 for (; pv < pvend; pv++)
2966 if (pv->namlen == mangledlen
2967 && strncmp (pv->name, mangled, mangledlen) == 0)
2968 break;
2970 if (pv >= pvend)
2972 /* We won't have type information for this function if
2973 it is not included in this file. We don't try to
2974 handle this case. FIXME. */
2975 type = (debug_make_function_type
2976 (dhandle,
2977 ieee_builtin_type (info, start,
2978 (unsigned int) builtin_void),
2979 (debug_type *) NULL,
2980 false));
2982 else
2984 debug_type return_type;
2985 const debug_type *arg_types;
2986 boolean varargs;
2988 if (debug_get_type_kind (dhandle, pv->type)
2989 != DEBUG_KIND_FUNCTION)
2991 ieee_error (info, start,
2992 "bad type for C++ method function");
2993 return false;
2996 return_type = debug_get_return_type (dhandle, pv->type);
2997 arg_types = debug_get_parameter_types (dhandle, pv->type,
2998 &varargs);
2999 if (return_type == DEBUG_TYPE_NULL || arg_types == NULL)
3001 ieee_error (info, start,
3002 "no type information for C++ method function");
3003 return false;
3006 type = debug_make_method_type (dhandle, return_type, it->type,
3007 (debug_type *) arg_types,
3008 varargs);
3010 if (type == DEBUG_TYPE_NULL)
3011 return false;
3013 switch (flags & CXXFLAGS_VISIBILITY)
3015 default:
3016 ieee_error (info, start, "unknown C++ visibility");
3017 return false;
3019 case CXXFLAGS_VISIBILITY_PUBLIC:
3020 visibility = DEBUG_VISIBILITY_PUBLIC;
3021 break;
3023 case CXXFLAGS_VISIBILITY_PRIVATE:
3024 visibility = DEBUG_VISIBILITY_PRIVATE;
3025 break;
3027 case CXXFLAGS_VISIBILITY_PROTECTED:
3028 visibility = DEBUG_VISIBILITY_PROTECTED;
3029 break;
3032 constp = (flags & CXXFLAGS_CONST) != 0 ? true : false;
3033 volatilep = (flags & CXXFLAGS_VOLATILE) != 0 ? true : false;
3035 mangledcopy = savestring (mangled, mangledlen);
3037 if ((flags & CXXFLAGS_STATIC) != 0)
3039 if (id == 'v')
3041 ieee_error (info, start, "C++ static virtual method");
3042 return false;
3044 mv = debug_make_static_method_variant (dhandle, mangledcopy,
3045 type, visibility,
3046 constp, volatilep);
3048 else
3050 debug_type vcontext;
3052 if (id != 'v')
3053 vcontext = DEBUG_TYPE_NULL;
3054 else
3056 /* FIXME: How can we calculate this correctly? */
3057 vcontext = it->type;
3059 mv = debug_make_method_variant (dhandle, mangledcopy, type,
3060 visibility, constp,
3061 volatilep, voffset,
3062 vcontext);
3064 if (mv == DEBUG_METHOD_VARIANT_NULL)
3065 return false;
3067 for (meth = methods, im = 0; im < methods_count; meth++, im++)
3068 if (meth->namlen == namlen
3069 && strncmp (meth->name, name, namlen) == 0)
3070 break;
3071 if (im >= methods_count)
3073 if (methods_count >= methods_alloc)
3075 methods_alloc += 10;
3076 methods = ((struct ieee_method *)
3077 xrealloc (methods,
3078 methods_alloc * sizeof *methods));
3080 methods[methods_count].name = name;
3081 methods[methods_count].namlen = namlen;
3082 methods[methods_count].variants = NULL;
3083 methods[methods_count].count = 0;
3084 methods[methods_count].alloc = 0;
3085 meth = methods + methods_count;
3086 ++methods_count;
3089 if (meth->count + 1 >= meth->alloc)
3091 meth->alloc += 10;
3092 meth->variants = ((debug_method_variant *)
3093 xrealloc (meth->variants,
3094 (meth->alloc
3095 * sizeof *meth->variants)));
3098 meth->variants[meth->count] = mv;
3099 ++meth->count;
3100 meth->variants[meth->count] = DEBUG_METHOD_VARIANT_NULL;
3102 break;
3104 case 'o':
3106 bfd_vma spec;
3108 /* We have no way to store this information, so we just
3109 ignore it. */
3110 if (! ieee_require_asn (info, pp, &spec))
3111 return false;
3112 --count;
3113 if ((spec & 4) != 0)
3115 const char *filename;
3116 unsigned long filenamlen;
3117 bfd_vma lineno;
3119 if (! ieee_require_atn65 (info, pp, &filename, &filenamlen)
3120 || ! ieee_require_asn (info, pp, &lineno))
3121 return false;
3122 count -= 2;
3124 else if ((spec & 8) != 0)
3126 const char *mangled;
3127 unsigned long mangledlen;
3129 if (! ieee_require_atn65 (info, pp, &mangled, &mangledlen))
3130 return false;
3131 --count;
3133 else
3135 ieee_error (info, start,
3136 "unrecognized C++ object overhead spec");
3137 return false;
3140 break;
3142 case 'z':
3144 const char *vname, *basename;
3145 unsigned long vnamelen, baselen;
3146 bfd_vma vsize, control;
3148 /* A virtual table pointer. */
3150 if (! ieee_require_atn65 (info, pp, &vname, &vnamelen)
3151 || ! ieee_require_asn (info, pp, &vsize)
3152 || ! ieee_require_atn65 (info, pp, &basename, &baselen)
3153 || ! ieee_require_asn (info, pp, &control))
3154 return false;
3155 count -= 4;
3157 /* We just ignore the control number. We don't care what
3158 the virtual table name is. We have no way to store the
3159 virtual table size, and I don't think we care anyhow. */
3161 /* FIXME: We can't handle multiple virtual table pointers. */
3163 if (baselen == 0)
3164 ownvptr = true;
3165 else
3167 char *basecopy;
3169 basecopy = savestring (basename, baselen);
3170 vptrbase = debug_find_tagged_type (dhandle, basecopy,
3171 DEBUG_KIND_ILLEGAL);
3172 free (basecopy);
3173 if (vptrbase == DEBUG_TYPE_NULL)
3175 ieee_error (info, start, "undefined C++ vtable");
3176 return false;
3180 break;
3184 /* Now that we have seen all the method variants, we can call
3185 debug_make_method for each one. */
3187 if (methods_count == 0)
3188 dmethods = NULL;
3189 else
3191 unsigned int i;
3193 dmethods = ((debug_method *)
3194 xmalloc ((methods_count + 1) * sizeof *dmethods));
3195 for (i = 0; i < methods_count; i++)
3197 char *namcopy;
3199 namcopy = savestring (methods[i].name, methods[i].namlen);
3200 dmethods[i] = debug_make_method (dhandle, namcopy,
3201 methods[i].variants);
3202 if (dmethods[i] == DEBUG_METHOD_NULL)
3203 return false;
3205 dmethods[i] = DEBUG_METHOD_NULL;
3206 free (methods);
3209 /* The struct type was created as an indirect type pointing at
3210 it->slot. We update it->slot to automatically update all
3211 references to this struct. */
3212 it->slot = debug_make_object_type (dhandle,
3213 class != 'u',
3214 debug_get_type_size (dhandle,
3215 it->slot),
3216 fields, baseclasses, dmethods,
3217 vptrbase, ownvptr);
3218 if (it->slot == DEBUG_TYPE_NULL)
3219 return false;
3221 return true;
3224 /* Read C++ default argument value and reference type information. */
3226 static boolean
3227 ieee_read_cxx_defaults (info, pp, count)
3228 struct ieee_info *info;
3229 const bfd_byte **pp;
3230 unsigned long count;
3232 const bfd_byte *start;
3233 const char *fnname;
3234 unsigned long fnlen;
3235 bfd_vma defcount;
3237 start = *pp;
3239 /* Giving the function name before the argument count is an addendum
3240 to the spec. The function name is demangled, though, so this
3241 record must always refer to the current function. */
3243 if (info->blockstack.bsp <= info->blockstack.stack
3244 || info->blockstack.bsp[-1].fnindx == (unsigned int) -1)
3246 ieee_error (info, start, "C++ default values not in a function");
3247 return false;
3250 if (! ieee_require_atn65 (info, pp, &fnname, &fnlen)
3251 || ! ieee_require_asn (info, pp, &defcount))
3252 return false;
3253 count -= 2;
3255 while (defcount-- > 0)
3257 bfd_vma type, val;
3258 const char *strval;
3259 unsigned long strvallen;
3261 if (! ieee_require_asn (info, pp, &type))
3262 return false;
3263 --count;
3265 switch (type)
3267 case 0:
3268 case 4:
3269 break;
3271 case 1:
3272 case 2:
3273 if (! ieee_require_asn (info, pp, &val))
3274 return false;
3275 --count;
3276 break;
3278 case 3:
3279 case 7:
3280 if (! ieee_require_atn65 (info, pp, &strval, &strvallen))
3281 return false;
3282 --count;
3283 break;
3285 default:
3286 ieee_error (info, start, "unrecognized C++ default type");
3287 return false;
3290 /* We have no way to record the default argument values, so we
3291 just ignore them. FIXME. */
3294 /* Any remaining arguments are indices of parameters that are really
3295 reference type. */
3296 if (count > 0)
3298 PTR dhandle;
3299 debug_type *arg_slots;
3301 dhandle = info->dhandle;
3302 arg_slots = info->types.types[info->blockstack.bsp[-1].fnindx].arg_slots;
3303 while (count-- > 0)
3305 bfd_vma indx;
3306 debug_type target;
3308 if (! ieee_require_asn (info, pp, &indx))
3309 return false;
3310 /* The index is 1 based. */
3311 --indx;
3312 if (arg_slots == NULL
3313 || arg_slots[indx] == DEBUG_TYPE_NULL
3314 || (debug_get_type_kind (dhandle, arg_slots[indx])
3315 != DEBUG_KIND_POINTER))
3317 ieee_error (info, start, "reference parameter is not a pointer");
3318 return false;
3321 target = debug_get_target_type (dhandle, arg_slots[indx]);
3322 arg_slots[indx] = debug_make_reference_type (dhandle, target);
3323 if (arg_slots[indx] == DEBUG_TYPE_NULL)
3324 return false;
3328 return true;
3331 /* Read a C++ reference definition. */
3333 static boolean
3334 ieee_read_reference (info, pp)
3335 struct ieee_info *info;
3336 const bfd_byte **pp;
3338 const bfd_byte *start;
3339 bfd_vma flags;
3340 const char *class, *name;
3341 unsigned long classlen, namlen;
3342 debug_type *pslot;
3343 debug_type target;
3345 start = *pp;
3347 if (! ieee_require_asn (info, pp, &flags))
3348 return false;
3350 /* Giving the class name before the member name is in an addendum to
3351 the spec. */
3352 if (flags == 3)
3354 if (! ieee_require_atn65 (info, pp, &class, &classlen))
3355 return false;
3358 if (! ieee_require_atn65 (info, pp, &name, &namlen))
3359 return false;
3361 pslot = NULL;
3362 if (flags != 3)
3364 int pass;
3366 /* We search from the last variable indices to the first in
3367 hopes of finding local variables correctly. We search the
3368 local variables on the first pass, and the global variables
3369 on the second. FIXME: This probably won't work in all cases.
3370 On the other hand, I don't know what will. */
3371 for (pass = 0; pass < 2; pass++)
3373 struct ieee_vars *vars;
3374 int i;
3375 struct ieee_var *pv = NULL;
3377 if (pass == 0)
3378 vars = &info->vars;
3379 else
3381 vars = info->global_vars;
3382 if (vars == NULL)
3383 break;
3386 for (i = (int) vars->alloc - 1; i >= 0; i--)
3388 boolean found;
3390 pv = vars->vars + i;
3392 if (pv->pslot == NULL
3393 || pv->namlen != namlen
3394 || strncmp (pv->name, name, namlen) != 0)
3395 continue;
3397 found = false;
3398 switch (flags)
3400 default:
3401 ieee_error (info, start,
3402 "unrecognized C++ reference type");
3403 return false;
3405 case 0:
3406 /* Global variable or function. */
3407 if (pv->kind == IEEE_GLOBAL
3408 || pv->kind == IEEE_EXTERNAL
3409 || pv->kind == IEEE_FUNCTION)
3410 found = true;
3411 break;
3413 case 1:
3414 /* Global static variable or function. */
3415 if (pv->kind == IEEE_STATIC
3416 || pv->kind == IEEE_FUNCTION)
3417 found = true;
3418 break;
3420 case 2:
3421 /* Local variable. */
3422 if (pv->kind == IEEE_LOCAL)
3423 found = true;
3424 break;
3427 if (found)
3428 break;
3431 if (i >= 0)
3433 pslot = pv->pslot;
3434 break;
3438 else
3440 struct ieee_tag *it;
3442 for (it = info->tags; it != NULL; it = it->next)
3444 if (it->name[0] == class[0]
3445 && strncmp (it->name, class, classlen) == 0
3446 && strlen (it->name) == classlen)
3448 if (it->fslots != NULL)
3450 const debug_field *pf;
3451 unsigned int findx;
3453 pf = debug_get_fields (info->dhandle, it->type);
3454 if (pf == NULL)
3456 ieee_error (info, start,
3457 "C++ reference in class with no fields");
3458 return false;
3461 for (findx = 0; *pf != DEBUG_FIELD_NULL; pf++, findx++)
3463 const char *fname;
3465 fname = debug_get_field_name (info->dhandle, *pf);
3466 if (fname == NULL)
3467 return false;
3468 if (strncmp (fname, name, namlen) == 0
3469 && strlen (fname) == namlen)
3471 pslot = it->fslots + findx;
3472 break;
3477 break;
3482 if (pslot == NULL)
3484 ieee_error (info, start, "C++ reference not found");
3485 return false;
3488 /* We allocated the type of the object as an indirect type pointing
3489 to *pslot, which we can now update to be a reference type. */
3490 if (debug_get_type_kind (info->dhandle, *pslot) != DEBUG_KIND_POINTER)
3492 ieee_error (info, start, "C++ reference is not pointer");
3493 return false;
3496 target = debug_get_target_type (info->dhandle, *pslot);
3497 *pslot = debug_make_reference_type (info->dhandle, target);
3498 if (*pslot == DEBUG_TYPE_NULL)
3499 return false;
3501 return true;
3504 /* Require an ASN record. */
3506 static boolean
3507 ieee_require_asn (info, pp, pv)
3508 struct ieee_info *info;
3509 const bfd_byte **pp;
3510 bfd_vma *pv;
3512 const bfd_byte *start;
3513 ieee_record_enum_type c;
3514 bfd_vma varindx;
3516 start = *pp;
3518 c = (ieee_record_enum_type) **pp;
3519 if (c != ieee_e2_first_byte_enum)
3521 ieee_error (info, start, "missing required ASN");
3522 return false;
3524 ++*pp;
3526 c = (ieee_record_enum_type) (((unsigned int) c << 8) | **pp);
3527 if (c != ieee_asn_record_enum)
3529 ieee_error (info, start, "missing required ASN");
3530 return false;
3532 ++*pp;
3534 /* Just ignore the variable index. */
3535 if (! ieee_read_number (info, pp, &varindx))
3536 return false;
3538 return ieee_read_expression (info, pp, pv);
3541 /* Require an ATN65 record. */
3543 static boolean
3544 ieee_require_atn65 (info, pp, pname, pnamlen)
3545 struct ieee_info *info;
3546 const bfd_byte **pp;
3547 const char **pname;
3548 unsigned long *pnamlen;
3550 const bfd_byte *start;
3551 ieee_record_enum_type c;
3552 bfd_vma name_indx, type_indx, atn_code;
3554 start = *pp;
3556 c = (ieee_record_enum_type) **pp;
3557 if (c != ieee_at_record_enum)
3559 ieee_error (info, start, "missing required ATN65");
3560 return false;
3562 ++*pp;
3564 c = (ieee_record_enum_type) (((unsigned int) c << 8) | **pp);
3565 if (c != ieee_atn_record_enum)
3567 ieee_error (info, start, "missing required ATN65");
3568 return false;
3570 ++*pp;
3572 if (! ieee_read_number (info, pp, &name_indx)
3573 || ! ieee_read_number (info, pp, &type_indx)
3574 || ! ieee_read_number (info, pp, &atn_code))
3575 return false;
3577 /* Just ignore name_indx. */
3579 if (type_indx != 0 || atn_code != 65)
3581 ieee_error (info, start, "bad ATN65 record");
3582 return false;
3585 return ieee_read_id (info, pp, pname, pnamlen);
3588 /* Convert a register number in IEEE debugging information into a
3589 generic register number. */
3591 static int
3592 ieee_regno_to_genreg (abfd, r)
3593 bfd *abfd;
3594 int r;
3596 switch (bfd_get_arch (abfd))
3598 case bfd_arch_m68k:
3599 /* For some reasons stabs adds 2 to the floating point register
3600 numbers. */
3601 if (r >= 16)
3602 r += 2;
3603 break;
3605 case bfd_arch_i960:
3606 /* Stabs uses 0 to 15 for r0 to r15, 16 to 31 for g0 to g15, and
3607 32 to 35 for fp0 to fp3. */
3608 --r;
3609 break;
3611 default:
3612 break;
3615 return r;
3618 /* Convert a generic register number to an IEEE specific one. */
3620 static int
3621 ieee_genreg_to_regno (abfd, r)
3622 bfd *abfd;
3623 int r;
3625 switch (bfd_get_arch (abfd))
3627 case bfd_arch_m68k:
3628 /* For some reason stabs add 2 to the floating point register
3629 numbers. */
3630 if (r >= 18)
3631 r -= 2;
3632 break;
3634 case bfd_arch_i960:
3635 /* Stabs uses 0 to 15 for r0 to r15, 16 to 31 for g0 to g15, and
3636 32 to 35 for fp0 to fp3. */
3637 ++r;
3638 break;
3640 default:
3641 break;
3644 return r;
3647 /* These routines build IEEE debugging information out of the generic
3648 debugging information. */
3650 /* We build the IEEE debugging information byte by byte. Rather than
3651 waste time copying data around, we use a linked list of buffers to
3652 hold the data. */
3654 #define IEEE_BUFSIZE (490)
3656 struct ieee_buf
3658 /* Next buffer. */
3659 struct ieee_buf *next;
3660 /* Number of data bytes in this buffer. */
3661 unsigned int c;
3662 /* Bytes. */
3663 bfd_byte buf[IEEE_BUFSIZE];
3666 /* A list of buffers. */
3668 struct ieee_buflist
3670 /* Head of list. */
3671 struct ieee_buf *head;
3672 /* Tail--last buffer on list. */
3673 struct ieee_buf *tail;
3676 /* In order to generate the BB11 blocks required by the HP emulator,
3677 we keep track of ranges of addresses which correspond to a given
3678 compilation unit. */
3680 struct ieee_range
3682 /* Next range. */
3683 struct ieee_range *next;
3684 /* Low address. */
3685 bfd_vma low;
3686 /* High address. */
3687 bfd_vma high;
3690 /* This structure holds information for a class on the type stack. */
3692 struct ieee_type_class
3694 /* The name index in the debugging information. */
3695 unsigned int indx;
3696 /* The pmisc records for the class. */
3697 struct ieee_buflist pmiscbuf;
3698 /* The number of pmisc records. */
3699 unsigned int pmisccount;
3700 /* The name of the class holding the virtual table, if not this
3701 class. */
3702 const char *vclass;
3703 /* Whether this class holds its own virtual table. */
3704 boolean ownvptr;
3705 /* The largest virtual table offset seen so far. */
3706 bfd_vma voffset;
3707 /* The current method. */
3708 const char *method;
3709 /* Additional pmisc records used to record fields of reference type. */
3710 struct ieee_buflist refs;
3713 /* This is how we store types for the writing routines. Most types
3714 are simply represented by a type index. */
3716 struct ieee_write_type
3718 /* Type index. */
3719 unsigned int indx;
3720 /* The size of the type, if known. */
3721 unsigned int size;
3722 /* The name of the type, if any. */
3723 const char *name;
3724 /* If this is a function or method type, we build the type here, and
3725 only add it to the output buffers if we need it. */
3726 struct ieee_buflist fndef;
3727 /* If this is a struct, this is where the struct definition is
3728 built. */
3729 struct ieee_buflist strdef;
3730 /* If this is a class, this is where the class information is built. */
3731 struct ieee_type_class *classdef;
3732 /* Whether the type is unsigned. */
3733 unsigned int unsignedp : 1;
3734 /* Whether this is a reference type. */
3735 unsigned int referencep : 1;
3736 /* Whether this is in the local type block. */
3737 unsigned int localp : 1;
3738 /* Whether this is a duplicate struct definition which we are
3739 ignoring. */
3740 unsigned int ignorep : 1;
3743 /* This is the type stack used by the debug writing routines. FIXME:
3744 We could generate more efficient output if we remembered when we
3745 have output a particular type before. */
3747 struct ieee_type_stack
3749 /* Next entry on stack. */
3750 struct ieee_type_stack *next;
3751 /* Type information. */
3752 struct ieee_write_type type;
3755 /* This is a list of associations between a name and some types.
3756 These are used for typedefs and tags. */
3758 struct ieee_name_type
3760 /* Next type for this name. */
3761 struct ieee_name_type *next;
3762 /* ID number. For a typedef, this is the index of the type to which
3763 this name is typedefed. */
3764 unsigned int id;
3765 /* Type. */
3766 struct ieee_write_type type;
3767 /* If this is a tag which has not yet been defined, this is the
3768 kind. If the tag has been defined, this is DEBUG_KIND_ILLEGAL. */
3769 enum debug_type_kind kind;
3772 /* We use a hash table to associate names and types. */
3774 struct ieee_name_type_hash_table
3776 struct bfd_hash_table root;
3779 struct ieee_name_type_hash_entry
3781 struct bfd_hash_entry root;
3782 /* Information for this name. */
3783 struct ieee_name_type *types;
3786 /* This is a list of enums. */
3788 struct ieee_defined_enum
3790 /* Next enum. */
3791 struct ieee_defined_enum *next;
3792 /* Type index. */
3793 unsigned int indx;
3794 /* Whether this enum has been defined. */
3795 boolean defined;
3796 /* Tag. */
3797 const char *tag;
3798 /* Names. */
3799 const char **names;
3800 /* Values. */
3801 bfd_signed_vma *vals;
3804 /* We keep a list of modified versions of types, so that we don't
3805 output them more than once. */
3807 struct ieee_modified_type
3809 /* Pointer to this type. */
3810 unsigned int pointer;
3811 /* Function with unknown arguments returning this type. */
3812 unsigned int function;
3813 /* Const version of this type. */
3814 unsigned int const_qualified;
3815 /* Volatile version of this type. */
3816 unsigned int volatile_qualified;
3817 /* List of arrays of this type of various bounds. */
3818 struct ieee_modified_array_type *arrays;
3821 /* A list of arrays bounds. */
3823 struct ieee_modified_array_type
3825 /* Next array bounds. */
3826 struct ieee_modified_array_type *next;
3827 /* Type index with these bounds. */
3828 unsigned int indx;
3829 /* Low bound. */
3830 bfd_signed_vma low;
3831 /* High bound. */
3832 bfd_signed_vma high;
3835 /* This is a list of pending function parameter information. We don't
3836 output them until we see the first block. */
3838 struct ieee_pending_parm
3840 /* Next pending parameter. */
3841 struct ieee_pending_parm *next;
3842 /* Name. */
3843 const char *name;
3844 /* Type index. */
3845 unsigned int type;
3846 /* Whether the type is a reference. */
3847 boolean referencep;
3848 /* Kind. */
3849 enum debug_parm_kind kind;
3850 /* Value. */
3851 bfd_vma val;
3854 /* This is the handle passed down by debug_write. */
3856 struct ieee_handle
3858 /* BFD we are writing to. */
3859 bfd *abfd;
3860 /* Whether we got an error in a subroutine called via traverse or
3861 map_over_sections. */
3862 boolean error;
3863 /* Current data buffer list. */
3864 struct ieee_buflist *current;
3865 /* Current data buffer. */
3866 struct ieee_buf *curbuf;
3867 /* Filename of current compilation unit. */
3868 const char *filename;
3869 /* Module name of current compilation unit. */
3870 const char *modname;
3871 /* List of buffer for global types. */
3872 struct ieee_buflist global_types;
3873 /* List of finished data buffers. */
3874 struct ieee_buflist data;
3875 /* List of buffers for typedefs in the current compilation unit. */
3876 struct ieee_buflist types;
3877 /* List of buffers for variables and functions in the current
3878 compilation unit. */
3879 struct ieee_buflist vars;
3880 /* List of buffers for C++ class definitions in the current
3881 compilation unit. */
3882 struct ieee_buflist cxx;
3883 /* List of buffers for line numbers in the current compilation unit. */
3884 struct ieee_buflist linenos;
3885 /* Ranges for the current compilation unit. */
3886 struct ieee_range *ranges;
3887 /* Ranges for all debugging information. */
3888 struct ieee_range *global_ranges;
3889 /* Nested pending ranges. */
3890 struct ieee_range *pending_ranges;
3891 /* Type stack. */
3892 struct ieee_type_stack *type_stack;
3893 /* Next unallocated type index. */
3894 unsigned int type_indx;
3895 /* Next unallocated name index. */
3896 unsigned int name_indx;
3897 /* Typedefs. */
3898 struct ieee_name_type_hash_table typedefs;
3899 /* Tags. */
3900 struct ieee_name_type_hash_table tags;
3901 /* Enums. */
3902 struct ieee_defined_enum *enums;
3903 /* Modified versions of types. */
3904 struct ieee_modified_type *modified;
3905 /* Number of entries allocated in modified. */
3906 unsigned int modified_alloc;
3907 /* 4 byte complex type. */
3908 unsigned int complex_float_index;
3909 /* 8 byte complex type. */
3910 unsigned int complex_double_index;
3911 /* The depth of block nesting. This is 0 outside a function, and 1
3912 just after start_function is called. */
3913 unsigned int block_depth;
3914 /* The name of the current function. */
3915 const char *fnname;
3916 /* List of buffers for the type of the function we are currently
3917 writing out. */
3918 struct ieee_buflist fntype;
3919 /* List of buffers for the parameters of the function we are
3920 currently writing out. */
3921 struct ieee_buflist fnargs;
3922 /* Number of arguments written to fnargs. */
3923 unsigned int fnargcount;
3924 /* Pending function parameters. */
3925 struct ieee_pending_parm *pending_parms;
3926 /* Current line number filename. */
3927 const char *lineno_filename;
3928 /* Line number name index. */
3929 unsigned int lineno_name_indx;
3930 /* Filename of pending line number. */
3931 const char *pending_lineno_filename;
3932 /* Pending line number. */
3933 unsigned long pending_lineno;
3934 /* Address of pending line number. */
3935 bfd_vma pending_lineno_addr;
3936 /* Highest address seen at end of procedure. */
3937 bfd_vma highaddr;
3940 static boolean ieee_init_buffer
3941 PARAMS ((struct ieee_handle *, struct ieee_buflist *));
3942 static boolean ieee_change_buffer
3943 PARAMS ((struct ieee_handle *, struct ieee_buflist *));
3944 static boolean ieee_append_buffer
3945 PARAMS ((struct ieee_handle *, struct ieee_buflist *,
3946 struct ieee_buflist *));
3947 static boolean ieee_real_write_byte PARAMS ((struct ieee_handle *, int));
3948 static boolean ieee_write_2bytes PARAMS ((struct ieee_handle *, int));
3949 static boolean ieee_write_number PARAMS ((struct ieee_handle *, bfd_vma));
3950 static boolean ieee_write_id PARAMS ((struct ieee_handle *, const char *));
3951 static boolean ieee_write_asn
3952 PARAMS ((struct ieee_handle *, unsigned int, bfd_vma));
3953 static boolean ieee_write_atn65
3954 PARAMS ((struct ieee_handle *, unsigned int, const char *));
3955 static boolean ieee_push_type
3956 PARAMS ((struct ieee_handle *, unsigned int, unsigned int, boolean,
3957 boolean));
3958 static unsigned int ieee_pop_type PARAMS ((struct ieee_handle *));
3959 static void ieee_pop_unused_type PARAMS ((struct ieee_handle *));
3960 static unsigned int ieee_pop_type_used
3961 PARAMS ((struct ieee_handle *, boolean));
3962 static boolean ieee_add_range
3963 PARAMS ((struct ieee_handle *, boolean, bfd_vma, bfd_vma));
3964 static boolean ieee_start_range PARAMS ((struct ieee_handle *, bfd_vma));
3965 static boolean ieee_end_range PARAMS ((struct ieee_handle *, bfd_vma));
3966 static boolean ieee_define_type
3967 PARAMS ((struct ieee_handle *, unsigned int, boolean, boolean));
3968 static boolean ieee_define_named_type
3969 PARAMS ((struct ieee_handle *, const char *, unsigned int, unsigned int,
3970 boolean, boolean, struct ieee_buflist *));
3971 static struct ieee_modified_type *ieee_get_modified_info
3972 PARAMS ((struct ieee_handle *, unsigned int));
3973 static struct bfd_hash_entry *ieee_name_type_newfunc
3974 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
3975 static boolean ieee_write_undefined_tag
3976 PARAMS ((struct ieee_name_type_hash_entry *, PTR));
3977 static boolean ieee_finish_compilation_unit PARAMS ((struct ieee_handle *));
3978 static void ieee_add_bb11_blocks PARAMS ((bfd *, asection *, PTR));
3979 static boolean ieee_add_bb11
3980 PARAMS ((struct ieee_handle *, asection *, bfd_vma, bfd_vma));
3981 static boolean ieee_output_pending_parms PARAMS ((struct ieee_handle *));
3982 static unsigned int ieee_vis_to_flags PARAMS ((enum debug_visibility));
3983 static boolean ieee_class_method_var
3984 PARAMS ((struct ieee_handle *, const char *, enum debug_visibility, boolean,
3985 boolean, boolean, bfd_vma, boolean));
3987 static boolean ieee_start_compilation_unit PARAMS ((PTR, const char *));
3988 static boolean ieee_start_source PARAMS ((PTR, const char *));
3989 static boolean ieee_empty_type PARAMS ((PTR));
3990 static boolean ieee_void_type PARAMS ((PTR));
3991 static boolean ieee_int_type PARAMS ((PTR, unsigned int, boolean));
3992 static boolean ieee_float_type PARAMS ((PTR, unsigned int));
3993 static boolean ieee_complex_type PARAMS ((PTR, unsigned int));
3994 static boolean ieee_bool_type PARAMS ((PTR, unsigned int));
3995 static boolean ieee_enum_type
3996 PARAMS ((PTR, const char *, const char **, bfd_signed_vma *));
3997 static boolean ieee_pointer_type PARAMS ((PTR));
3998 static boolean ieee_function_type PARAMS ((PTR, int, boolean));
3999 static boolean ieee_reference_type PARAMS ((PTR));
4000 static boolean ieee_range_type PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma));
4001 static boolean ieee_array_type
4002 PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma, boolean));
4003 static boolean ieee_set_type PARAMS ((PTR, boolean));
4004 static boolean ieee_offset_type PARAMS ((PTR));
4005 static boolean ieee_method_type PARAMS ((PTR, boolean, int, boolean));
4006 static boolean ieee_const_type PARAMS ((PTR));
4007 static boolean ieee_volatile_type PARAMS ((PTR));
4008 static boolean ieee_start_struct_type
4009 PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int));
4010 static boolean ieee_struct_field
4011 PARAMS ((PTR, const char *, bfd_vma, bfd_vma, enum debug_visibility));
4012 static boolean ieee_end_struct_type PARAMS ((PTR));
4013 static boolean ieee_start_class_type
4014 PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int, boolean,
4015 boolean));
4016 static boolean ieee_class_static_member
4017 PARAMS ((PTR, const char *, const char *, enum debug_visibility));
4018 static boolean ieee_class_baseclass
4019 PARAMS ((PTR, bfd_vma, boolean, enum debug_visibility));
4020 static boolean ieee_class_start_method PARAMS ((PTR, const char *));
4021 static boolean ieee_class_method_variant
4022 PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean,
4023 bfd_vma, boolean));
4024 static boolean ieee_class_static_method_variant
4025 PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean));
4026 static boolean ieee_class_end_method PARAMS ((PTR));
4027 static boolean ieee_end_class_type PARAMS ((PTR));
4028 static boolean ieee_typedef_type PARAMS ((PTR, const char *));
4029 static boolean ieee_tag_type
4030 PARAMS ((PTR, const char *, unsigned int, enum debug_type_kind));
4031 static boolean ieee_typdef PARAMS ((PTR, const char *));
4032 static boolean ieee_tag PARAMS ((PTR, const char *));
4033 static boolean ieee_int_constant PARAMS ((PTR, const char *, bfd_vma));
4034 static boolean ieee_float_constant PARAMS ((PTR, const char *, double));
4035 static boolean ieee_typed_constant PARAMS ((PTR, const char *, bfd_vma));
4036 static boolean ieee_variable
4037 PARAMS ((PTR, const char *, enum debug_var_kind, bfd_vma));
4038 static boolean ieee_start_function PARAMS ((PTR, const char *, boolean));
4039 static boolean ieee_function_parameter
4040 PARAMS ((PTR, const char *, enum debug_parm_kind, bfd_vma));
4041 static boolean ieee_start_block PARAMS ((PTR, bfd_vma));
4042 static boolean ieee_end_block PARAMS ((PTR, bfd_vma));
4043 static boolean ieee_end_function PARAMS ((PTR));
4044 static boolean ieee_lineno
4045 PARAMS ((PTR, const char *, unsigned long, bfd_vma));
4047 static const struct debug_write_fns ieee_fns =
4049 ieee_start_compilation_unit,
4050 ieee_start_source,
4051 ieee_empty_type,
4052 ieee_void_type,
4053 ieee_int_type,
4054 ieee_float_type,
4055 ieee_complex_type,
4056 ieee_bool_type,
4057 ieee_enum_type,
4058 ieee_pointer_type,
4059 ieee_function_type,
4060 ieee_reference_type,
4061 ieee_range_type,
4062 ieee_array_type,
4063 ieee_set_type,
4064 ieee_offset_type,
4065 ieee_method_type,
4066 ieee_const_type,
4067 ieee_volatile_type,
4068 ieee_start_struct_type,
4069 ieee_struct_field,
4070 ieee_end_struct_type,
4071 ieee_start_class_type,
4072 ieee_class_static_member,
4073 ieee_class_baseclass,
4074 ieee_class_start_method,
4075 ieee_class_method_variant,
4076 ieee_class_static_method_variant,
4077 ieee_class_end_method,
4078 ieee_end_class_type,
4079 ieee_typedef_type,
4080 ieee_tag_type,
4081 ieee_typdef,
4082 ieee_tag,
4083 ieee_int_constant,
4084 ieee_float_constant,
4085 ieee_typed_constant,
4086 ieee_variable,
4087 ieee_start_function,
4088 ieee_function_parameter,
4089 ieee_start_block,
4090 ieee_end_block,
4091 ieee_end_function,
4092 ieee_lineno
4095 /* Initialize a buffer to be empty. */
4097 /*ARGSUSED*/
4098 static boolean
4099 ieee_init_buffer (info, buflist)
4100 struct ieee_handle *info;
4101 struct ieee_buflist *buflist;
4103 buflist->head = NULL;
4104 buflist->tail = NULL;
4105 return true;
4108 /* See whether a buffer list has any data. */
4110 #define ieee_buffer_emptyp(buflist) ((buflist)->head == NULL)
4112 /* Change the current buffer to a specified buffer chain. */
4114 static boolean
4115 ieee_change_buffer (info, buflist)
4116 struct ieee_handle *info;
4117 struct ieee_buflist *buflist;
4119 if (buflist->head == NULL)
4121 struct ieee_buf *buf;
4123 buf = (struct ieee_buf *) xmalloc (sizeof *buf);
4124 buf->next = NULL;
4125 buf->c = 0;
4126 buflist->head = buf;
4127 buflist->tail = buf;
4130 info->current = buflist;
4131 info->curbuf = buflist->tail;
4133 return true;
4136 /* Append a buffer chain. */
4138 /*ARGSUSED*/
4139 static boolean
4140 ieee_append_buffer (info, mainbuf, newbuf)
4141 struct ieee_handle *info;
4142 struct ieee_buflist *mainbuf;
4143 struct ieee_buflist *newbuf;
4145 if (newbuf->head != NULL)
4147 if (mainbuf->head == NULL)
4148 mainbuf->head = newbuf->head;
4149 else
4150 mainbuf->tail->next = newbuf->head;
4151 mainbuf->tail = newbuf->tail;
4153 return true;
4156 /* Write a byte into the buffer. We use a macro for speed and a
4157 function for the complex cases. */
4159 #define ieee_write_byte(info, b) \
4160 ((info)->curbuf->c < IEEE_BUFSIZE \
4161 ? ((info)->curbuf->buf[(info)->curbuf->c++] = (b), true) \
4162 : ieee_real_write_byte ((info), (b)))
4164 static boolean
4165 ieee_real_write_byte (info, b)
4166 struct ieee_handle *info;
4167 int b;
4169 if (info->curbuf->c >= IEEE_BUFSIZE)
4171 struct ieee_buf *n;
4173 n = (struct ieee_buf *) xmalloc (sizeof *n);
4174 n->next = NULL;
4175 n->c = 0;
4176 if (info->current->head == NULL)
4177 info->current->head = n;
4178 else
4179 info->current->tail->next = n;
4180 info->current->tail = n;
4181 info->curbuf = n;
4184 info->curbuf->buf[info->curbuf->c] = b;
4185 ++info->curbuf->c;
4187 return true;
4190 /* Write out two bytes. */
4192 static boolean
4193 ieee_write_2bytes (info, i)
4194 struct ieee_handle *info;
4195 int i;
4197 return (ieee_write_byte (info, i >> 8)
4198 && ieee_write_byte (info, i & 0xff));
4201 /* Write out an integer. */
4203 static boolean
4204 ieee_write_number (info, v)
4205 struct ieee_handle *info;
4206 bfd_vma v;
4208 bfd_vma t;
4209 bfd_byte ab[20];
4210 bfd_byte *p;
4211 unsigned int c;
4213 if (v <= (bfd_vma) ieee_number_end_enum)
4214 return ieee_write_byte (info, (int) v);
4216 t = v;
4217 p = ab + sizeof ab;
4218 while (t != 0)
4220 *--p = t & 0xff;
4221 t >>= 8;
4223 c = (ab + 20) - p;
4225 if (c > (unsigned int) (ieee_number_repeat_end_enum
4226 - ieee_number_repeat_start_enum))
4228 fprintf (stderr, "IEEE numeric overflow: 0x");
4229 fprintf_vma (stderr, v);
4230 fprintf (stderr, "\n");
4231 return false;
4234 if (! ieee_write_byte (info, (int) ieee_number_repeat_start_enum + c))
4235 return false;
4236 for (; c > 0; --c, ++p)
4238 if (! ieee_write_byte (info, *p))
4239 return false;
4242 return true;
4245 /* Write out a string. */
4247 static boolean
4248 ieee_write_id (info, s)
4249 struct ieee_handle *info;
4250 const char *s;
4252 unsigned int len;
4254 len = strlen (s);
4255 if (len <= 0x7f)
4257 if (! ieee_write_byte (info, len))
4258 return false;
4260 else if (len <= 0xff)
4262 if (! ieee_write_byte (info, (int) ieee_extension_length_1_enum)
4263 || ! ieee_write_byte (info, len))
4264 return false;
4266 else if (len <= 0xffff)
4268 if (! ieee_write_byte (info, (int) ieee_extension_length_2_enum)
4269 || ! ieee_write_2bytes (info, len))
4270 return false;
4272 else
4274 fprintf (stderr, "IEEE string length overflow: %u\n", len);
4275 return false;
4278 for (; *s != '\0'; s++)
4279 if (! ieee_write_byte (info, *s))
4280 return false;
4282 return true;
4285 /* Write out an ASN record. */
4287 static boolean
4288 ieee_write_asn (info, indx, val)
4289 struct ieee_handle *info;
4290 unsigned int indx;
4291 bfd_vma val;
4293 return (ieee_write_2bytes (info, (int) ieee_asn_record_enum)
4294 && ieee_write_number (info, indx)
4295 && ieee_write_number (info, val));
4298 /* Write out an ATN65 record. */
4300 static boolean
4301 ieee_write_atn65 (info, indx, s)
4302 struct ieee_handle *info;
4303 unsigned int indx;
4304 const char *s;
4306 return (ieee_write_2bytes (info, (int) ieee_atn_record_enum)
4307 && ieee_write_number (info, indx)
4308 && ieee_write_number (info, 0)
4309 && ieee_write_number (info, 65)
4310 && ieee_write_id (info, s));
4313 /* Push a type index onto the type stack. */
4315 static boolean
4316 ieee_push_type (info, indx, size, unsignedp, localp)
4317 struct ieee_handle *info;
4318 unsigned int indx;
4319 unsigned int size;
4320 boolean unsignedp;
4321 boolean localp;
4323 struct ieee_type_stack *ts;
4325 ts = (struct ieee_type_stack *) xmalloc (sizeof *ts);
4326 memset (ts, 0, sizeof *ts);
4328 ts->type.indx = indx;
4329 ts->type.size = size;
4330 ts->type.unsignedp = unsignedp;
4331 ts->type.localp = localp;
4333 ts->next = info->type_stack;
4334 info->type_stack = ts;
4336 return true;
4339 /* Pop a type index off the type stack. */
4341 static unsigned int
4342 ieee_pop_type (info)
4343 struct ieee_handle *info;
4345 return ieee_pop_type_used (info, true);
4348 /* Pop an unused type index off the type stack. */
4350 static void
4351 ieee_pop_unused_type (info)
4352 struct ieee_handle *info;
4354 (void) ieee_pop_type_used (info, false);
4357 /* Pop a used or unused type index off the type stack. */
4359 static unsigned int
4360 ieee_pop_type_used (info, used)
4361 struct ieee_handle *info;
4362 boolean used;
4364 struct ieee_type_stack *ts;
4365 unsigned int ret;
4367 ts = info->type_stack;
4368 assert (ts != NULL);
4370 /* If this is a function type, and we need it, we need to append the
4371 actual definition to the typedef block now. */
4372 if (used && ! ieee_buffer_emptyp (&ts->type.fndef))
4374 struct ieee_buflist *buflist;
4376 if (ts->type.localp)
4378 /* Make sure we have started the types block. */
4379 if (ieee_buffer_emptyp (&info->types))
4381 if (! ieee_change_buffer (info, &info->types)
4382 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4383 || ! ieee_write_byte (info, 1)
4384 || ! ieee_write_number (info, 0)
4385 || ! ieee_write_id (info, info->modname))
4386 return false;
4388 buflist = &info->types;
4390 else
4392 /* Make sure we started the global type block. */
4393 if (ieee_buffer_emptyp (&info->global_types))
4395 if (! ieee_change_buffer (info, &info->global_types)
4396 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4397 || ! ieee_write_byte (info, 2)
4398 || ! ieee_write_number (info, 0)
4399 || ! ieee_write_id (info, ""))
4400 return false;
4402 buflist = &info->global_types;
4405 if (! ieee_append_buffer (info, buflist, &ts->type.fndef))
4406 return false;
4409 ret = ts->type.indx;
4410 info->type_stack = ts->next;
4411 free (ts);
4412 return ret;
4415 /* Add a range of bytes included in the current compilation unit. */
4417 static boolean
4418 ieee_add_range (info, global, low, high)
4419 struct ieee_handle *info;
4420 boolean global;
4421 bfd_vma low;
4422 bfd_vma high;
4424 struct ieee_range **plist, *r, **pr;
4426 if (low == (bfd_vma) -1 || high == (bfd_vma) -1 || low == high)
4427 return true;
4429 if (global)
4430 plist = &info->global_ranges;
4431 else
4432 plist = &info->ranges;
4434 for (r = *plist; r != NULL; r = r->next)
4436 if (high >= r->low && low <= r->high)
4438 /* The new range overlaps r. */
4439 if (low < r->low)
4440 r->low = low;
4441 if (high > r->high)
4442 r->high = high;
4443 pr = &r->next;
4444 while (*pr != NULL && (*pr)->low <= r->high)
4446 struct ieee_range *n;
4448 if ((*pr)->high > r->high)
4449 r->high = (*pr)->high;
4450 n = (*pr)->next;
4451 free (*pr);
4452 *pr = n;
4454 return true;
4458 r = (struct ieee_range *) xmalloc (sizeof *r);
4459 memset (r, 0, sizeof *r);
4461 r->low = low;
4462 r->high = high;
4464 /* Store the ranges sorted by address. */
4465 for (pr = plist; *pr != NULL; pr = &(*pr)->next)
4466 if ((*pr)->low > high)
4467 break;
4468 r->next = *pr;
4469 *pr = r;
4471 return true;
4474 /* Start a new range for which we only have the low address. */
4476 static boolean
4477 ieee_start_range (info, low)
4478 struct ieee_handle *info;
4479 bfd_vma low;
4481 struct ieee_range *r;
4483 r = (struct ieee_range *) xmalloc (sizeof *r);
4484 memset (r, 0, sizeof *r);
4485 r->low = low;
4486 r->next = info->pending_ranges;
4487 info->pending_ranges = r;
4488 return true;
4491 /* Finish a range started by ieee_start_range. */
4493 static boolean
4494 ieee_end_range (info, high)
4495 struct ieee_handle *info;
4496 bfd_vma high;
4498 struct ieee_range *r;
4499 bfd_vma low;
4501 assert (info->pending_ranges != NULL);
4502 r = info->pending_ranges;
4503 low = r->low;
4504 info->pending_ranges = r->next;
4505 free (r);
4506 return ieee_add_range (info, false, low, high);
4509 /* Start defining a type. */
4511 static boolean
4512 ieee_define_type (info, size, unsignedp, localp)
4513 struct ieee_handle *info;
4514 unsigned int size;
4515 boolean unsignedp;
4516 boolean localp;
4518 return ieee_define_named_type (info, (const char *) NULL,
4519 (unsigned int) -1, size, unsignedp,
4520 localp, (struct ieee_buflist *) NULL);
4523 /* Start defining a named type. */
4525 static boolean
4526 ieee_define_named_type (info, name, indx, size, unsignedp, localp, buflist)
4527 struct ieee_handle *info;
4528 const char *name;
4529 unsigned int indx;
4530 unsigned int size;
4531 boolean unsignedp;
4532 boolean localp;
4533 struct ieee_buflist *buflist;
4535 unsigned int type_indx;
4536 unsigned int name_indx;
4538 if (indx != (unsigned int) -1)
4539 type_indx = indx;
4540 else
4542 type_indx = info->type_indx;
4543 ++info->type_indx;
4546 name_indx = info->name_indx;
4547 ++info->name_indx;
4549 if (name == NULL)
4550 name = "";
4552 /* If we were given a buffer, use it; otherwise, use either the
4553 local or the global type information, and make sure that the type
4554 block is started. */
4555 if (buflist != NULL)
4557 if (! ieee_change_buffer (info, buflist))
4558 return false;
4560 else if (localp)
4562 if (! ieee_buffer_emptyp (&info->types))
4564 if (! ieee_change_buffer (info, &info->types))
4565 return false;
4567 else
4569 if (! ieee_change_buffer (info, &info->types)
4570 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4571 || ! ieee_write_byte (info, 1)
4572 || ! ieee_write_number (info, 0)
4573 || ! ieee_write_id (info, info->modname))
4574 return false;
4577 else
4579 if (! ieee_buffer_emptyp (&info->global_types))
4581 if (! ieee_change_buffer (info, &info->global_types))
4582 return false;
4584 else
4586 if (! ieee_change_buffer (info, &info->global_types)
4587 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4588 || ! ieee_write_byte (info, 2)
4589 || ! ieee_write_number (info, 0)
4590 || ! ieee_write_id (info, ""))
4591 return false;
4595 /* Push the new type on the type stack, write out an NN record, and
4596 write out the start of a TY record. The caller will then finish
4597 the TY record. */
4598 if (! ieee_push_type (info, type_indx, size, unsignedp, localp))
4599 return false;
4601 return (ieee_write_byte (info, (int) ieee_nn_record)
4602 && ieee_write_number (info, name_indx)
4603 && ieee_write_id (info, name)
4604 && ieee_write_byte (info, (int) ieee_ty_record_enum)
4605 && ieee_write_number (info, type_indx)
4606 && ieee_write_byte (info, 0xce)
4607 && ieee_write_number (info, name_indx));
4610 /* Get an entry to the list of modified versions of a type. */
4612 static struct ieee_modified_type *
4613 ieee_get_modified_info (info, indx)
4614 struct ieee_handle *info;
4615 unsigned int indx;
4617 if (indx >= info->modified_alloc)
4619 unsigned int nalloc;
4621 nalloc = info->modified_alloc;
4622 if (nalloc == 0)
4623 nalloc = 16;
4624 while (indx >= nalloc)
4625 nalloc *= 2;
4626 info->modified = ((struct ieee_modified_type *)
4627 xrealloc (info->modified,
4628 nalloc * sizeof *info->modified));
4629 memset (info->modified + info->modified_alloc, 0,
4630 (nalloc - info->modified_alloc) * sizeof *info->modified);
4631 info->modified_alloc = nalloc;
4634 return info->modified + indx;
4637 /* Routines for the hash table mapping names to types. */
4639 /* Initialize an entry in the hash table. */
4641 static struct bfd_hash_entry *
4642 ieee_name_type_newfunc (entry, table, string)
4643 struct bfd_hash_entry *entry;
4644 struct bfd_hash_table *table;
4645 const char *string;
4647 struct ieee_name_type_hash_entry *ret =
4648 (struct ieee_name_type_hash_entry *) entry;
4650 /* Allocate the structure if it has not already been allocated by a
4651 subclass. */
4652 if (ret == NULL)
4653 ret = ((struct ieee_name_type_hash_entry *)
4654 bfd_hash_allocate (table, sizeof *ret));
4655 if (ret == NULL)
4656 return NULL;
4658 /* Call the allocation method of the superclass. */
4659 ret = ((struct ieee_name_type_hash_entry *)
4660 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
4661 if (ret)
4663 /* Set local fields. */
4664 ret->types = NULL;
4667 return (struct bfd_hash_entry *) ret;
4670 /* Look up an entry in the hash table. */
4672 #define ieee_name_type_hash_lookup(table, string, create, copy) \
4673 ((struct ieee_name_type_hash_entry *) \
4674 bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
4676 /* Traverse the hash table. */
4678 #define ieee_name_type_hash_traverse(table, func, info) \
4679 (bfd_hash_traverse \
4680 (&(table)->root, \
4681 (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) (func), \
4682 (info)))
4684 /* The general routine to write out IEEE debugging information. */
4686 boolean
4687 write_ieee_debugging_info (abfd, dhandle)
4688 bfd *abfd;
4689 PTR dhandle;
4691 struct ieee_handle info;
4692 asection *s;
4693 const char *err;
4694 struct ieee_buf *b;
4696 memset (&info, 0, sizeof info);
4697 info.abfd = abfd;
4698 info.type_indx = 256;
4699 info.name_indx = 32;
4701 if (! bfd_hash_table_init (&info.typedefs.root, ieee_name_type_newfunc)
4702 || ! bfd_hash_table_init (&info.tags.root, ieee_name_type_newfunc))
4703 return false;
4705 if (! ieee_init_buffer (&info, &info.global_types)
4706 || ! ieee_init_buffer (&info, &info.data)
4707 || ! ieee_init_buffer (&info, &info.types)
4708 || ! ieee_init_buffer (&info, &info.vars)
4709 || ! ieee_init_buffer (&info, &info.cxx)
4710 || ! ieee_init_buffer (&info, &info.linenos)
4711 || ! ieee_init_buffer (&info, &info.fntype)
4712 || ! ieee_init_buffer (&info, &info.fnargs))
4713 return false;
4715 if (! debug_write (dhandle, &ieee_fns, (PTR) &info))
4716 return false;
4718 if (info.filename != NULL)
4720 if (! ieee_finish_compilation_unit (&info))
4721 return false;
4724 /* Put any undefined tags in the global typedef information. */
4725 info.error = false;
4726 ieee_name_type_hash_traverse (&info.tags,
4727 ieee_write_undefined_tag,
4728 (PTR) &info);
4729 if (info.error)
4730 return false;
4732 /* Prepend the global typedef information to the other data. */
4733 if (! ieee_buffer_emptyp (&info.global_types))
4735 /* The HP debugger seems to have a bug in which it ignores the
4736 last entry in the global types, so we add a dummy entry. */
4737 if (! ieee_change_buffer (&info, &info.global_types)
4738 || ! ieee_write_byte (&info, (int) ieee_nn_record)
4739 || ! ieee_write_number (&info, info.name_indx)
4740 || ! ieee_write_id (&info, "")
4741 || ! ieee_write_byte (&info, (int) ieee_ty_record_enum)
4742 || ! ieee_write_number (&info, info.type_indx)
4743 || ! ieee_write_byte (&info, 0xce)
4744 || ! ieee_write_number (&info, info.name_indx)
4745 || ! ieee_write_number (&info, 'P')
4746 || ! ieee_write_number (&info, (int) builtin_void + 32)
4747 || ! ieee_write_byte (&info, (int) ieee_be_record_enum))
4748 return false;
4750 if (! ieee_append_buffer (&info, &info.global_types, &info.data))
4751 return false;
4752 info.data = info.global_types;
4755 /* Make sure that we have declare BB11 blocks for each range in the
4756 file. They are added to info->vars. */
4757 info.error = false;
4758 if (! ieee_init_buffer (&info, &info.vars))
4759 return false;
4760 bfd_map_over_sections (abfd, ieee_add_bb11_blocks, (PTR) &info);
4761 if (info.error)
4762 return false;
4763 if (! ieee_buffer_emptyp (&info.vars))
4765 if (! ieee_change_buffer (&info, &info.vars)
4766 || ! ieee_write_byte (&info, (int) ieee_be_record_enum))
4767 return false;
4769 if (! ieee_append_buffer (&info, &info.data, &info.vars))
4770 return false;
4773 /* Now all the data is in info.data. Write it out to the BFD. We
4774 normally would need to worry about whether all the other sections
4775 are set up yet, but the IEEE backend will handle this particular
4776 case correctly regardless. */
4777 if (ieee_buffer_emptyp (&info.data))
4779 /* There is no debugging information. */
4780 return true;
4782 err = NULL;
4783 s = bfd_make_section (abfd, ".debug");
4784 if (s == NULL)
4785 err = "bfd_make_section";
4786 if (err == NULL)
4788 if (! bfd_set_section_flags (abfd, s, SEC_DEBUGGING | SEC_HAS_CONTENTS))
4789 err = "bfd_set_section_flags";
4791 if (err == NULL)
4793 bfd_size_type size;
4795 size = 0;
4796 for (b = info.data.head; b != NULL; b = b->next)
4797 size += b->c;
4798 if (! bfd_set_section_size (abfd, s, size))
4799 err = "bfd_set_section_size";
4801 if (err == NULL)
4803 file_ptr offset;
4805 offset = 0;
4806 for (b = info.data.head; b != NULL; b = b->next)
4808 if (! bfd_set_section_contents (abfd, s, b->buf, offset, b->c))
4810 err = "bfd_set_section_contents";
4811 break;
4813 offset += b->c;
4817 if (err != NULL)
4819 fprintf (stderr, "%s: %s: %s\n", bfd_get_filename (abfd), err,
4820 bfd_errmsg (bfd_get_error ()));
4821 return false;
4824 bfd_hash_table_free (&info.typedefs.root);
4825 bfd_hash_table_free (&info.tags.root);
4827 return true;
4830 /* Write out information for an undefined tag. This is called via
4831 ieee_name_type_hash_traverse. */
4833 static boolean
4834 ieee_write_undefined_tag (h, p)
4835 struct ieee_name_type_hash_entry *h;
4836 PTR p;
4838 struct ieee_handle *info = (struct ieee_handle *) p;
4839 struct ieee_name_type *nt;
4841 for (nt = h->types; nt != NULL; nt = nt->next)
4843 unsigned int name_indx;
4844 char code;
4846 if (nt->kind == DEBUG_KIND_ILLEGAL)
4847 continue;
4849 if (ieee_buffer_emptyp (&info->global_types))
4851 if (! ieee_change_buffer (info, &info->global_types)
4852 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4853 || ! ieee_write_byte (info, 2)
4854 || ! ieee_write_number (info, 0)
4855 || ! ieee_write_id (info, ""))
4857 info->error = true;
4858 return false;
4861 else
4863 if (! ieee_change_buffer (info, &info->global_types))
4865 info->error = true;
4866 return false;
4870 name_indx = info->name_indx;
4871 ++info->name_indx;
4872 if (! ieee_write_byte (info, (int) ieee_nn_record)
4873 || ! ieee_write_number (info, name_indx)
4874 || ! ieee_write_id (info, nt->type.name)
4875 || ! ieee_write_byte (info, (int) ieee_ty_record_enum)
4876 || ! ieee_write_number (info, nt->type.indx)
4877 || ! ieee_write_byte (info, 0xce)
4878 || ! ieee_write_number (info, name_indx))
4880 info->error = true;
4881 return false;
4884 switch (nt->kind)
4886 default:
4887 abort ();
4888 info->error = true;
4889 return false;
4890 case DEBUG_KIND_STRUCT:
4891 case DEBUG_KIND_CLASS:
4892 code = 'S';
4893 break;
4894 case DEBUG_KIND_UNION:
4895 case DEBUG_KIND_UNION_CLASS:
4896 code = 'U';
4897 break;
4898 case DEBUG_KIND_ENUM:
4899 code = 'E';
4900 break;
4902 if (! ieee_write_number (info, code)
4903 || ! ieee_write_number (info, 0))
4905 info->error = true;
4906 return false;
4910 return true;
4913 /* Start writing out information for a compilation unit. */
4915 static boolean
4916 ieee_start_compilation_unit (p, filename)
4917 PTR p;
4918 const char *filename;
4920 struct ieee_handle *info = (struct ieee_handle *) p;
4921 const char *modname;
4922 char *c, *s;
4923 unsigned int nindx;
4925 if (info->filename != NULL)
4927 if (! ieee_finish_compilation_unit (info))
4928 return false;
4931 info->filename = filename;
4932 modname = strrchr (filename, '/');
4933 if (modname != NULL)
4934 ++modname;
4935 else
4937 modname = strrchr (filename, '\\');
4938 if (modname != NULL)
4939 ++modname;
4940 else
4941 modname = filename;
4943 c = xstrdup (modname);
4944 s = strrchr (c, '.');
4945 if (s != NULL)
4946 *s = '\0';
4947 info->modname = c;
4949 if (! ieee_init_buffer (info, &info->types)
4950 || ! ieee_init_buffer (info, &info->vars)
4951 || ! ieee_init_buffer (info, &info->cxx)
4952 || ! ieee_init_buffer (info, &info->linenos))
4953 return false;
4954 info->ranges = NULL;
4956 /* Always include a BB1 and a BB3 block. That is what the output of
4957 the MRI linker seems to look like. */
4958 if (! ieee_change_buffer (info, &info->types)
4959 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4960 || ! ieee_write_byte (info, 1)
4961 || ! ieee_write_number (info, 0)
4962 || ! ieee_write_id (info, info->modname))
4963 return false;
4965 nindx = info->name_indx;
4966 ++info->name_indx;
4967 if (! ieee_change_buffer (info, &info->vars)
4968 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4969 || ! ieee_write_byte (info, 3)
4970 || ! ieee_write_number (info, 0)
4971 || ! ieee_write_id (info, info->modname))
4972 return false;
4974 return true;
4977 /* Finish up a compilation unit. */
4979 static boolean
4980 ieee_finish_compilation_unit (info)
4981 struct ieee_handle *info;
4983 struct ieee_range *r;
4985 if (! ieee_buffer_emptyp (&info->types))
4987 if (! ieee_change_buffer (info, &info->types)
4988 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
4989 return false;
4992 if (! ieee_buffer_emptyp (&info->cxx))
4994 /* Append any C++ information to the global function and
4995 variable information. */
4996 assert (! ieee_buffer_emptyp (&info->vars));
4997 if (! ieee_change_buffer (info, &info->vars))
4998 return false;
5000 /* We put the pmisc records in a dummy procedure, just as the
5001 MRI compiler does. */
5002 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
5003 || ! ieee_write_byte (info, 6)
5004 || ! ieee_write_number (info, 0)
5005 || ! ieee_write_id (info, "__XRYCPP")
5006 || ! ieee_write_number (info, 0)
5007 || ! ieee_write_number (info, 0)
5008 || ! ieee_write_number (info, info->highaddr - 1)
5009 || ! ieee_append_buffer (info, &info->vars, &info->cxx)
5010 || ! ieee_change_buffer (info, &info->vars)
5011 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
5012 || ! ieee_write_number (info, info->highaddr - 1))
5013 return false;
5016 if (! ieee_buffer_emptyp (&info->vars))
5018 if (! ieee_change_buffer (info, &info->vars)
5019 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
5020 return false;
5023 if (info->pending_lineno_filename != NULL)
5025 /* Force out the pending line number. */
5026 if (! ieee_lineno ((PTR) info, (const char *) NULL, 0, (bfd_vma) -1))
5027 return false;
5029 if (! ieee_buffer_emptyp (&info->linenos))
5031 if (! ieee_change_buffer (info, &info->linenos)
5032 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
5033 return false;
5034 if (strcmp (info->filename, info->lineno_filename) != 0)
5036 /* We were not in the main file. We just closed the
5037 included line number block, and now we must close the
5038 main line number block. */
5039 if (! ieee_write_byte (info, (int) ieee_be_record_enum))
5040 return false;
5044 if (! ieee_append_buffer (info, &info->data, &info->types)
5045 || ! ieee_append_buffer (info, &info->data, &info->vars)
5046 || ! ieee_append_buffer (info, &info->data, &info->linenos))
5047 return false;
5049 /* Build BB10/BB11 blocks based on the ranges we recorded. */
5050 if (! ieee_change_buffer (info, &info->data))
5051 return false;
5053 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
5054 || ! ieee_write_byte (info, 10)
5055 || ! ieee_write_number (info, 0)
5056 || ! ieee_write_id (info, info->modname)
5057 || ! ieee_write_id (info, "")
5058 || ! ieee_write_number (info, 0)
5059 || ! ieee_write_id (info, "GNU objcopy"))
5060 return false;
5062 for (r = info->ranges; r != NULL; r = r->next)
5064 bfd_vma low, high;
5065 asection *s;
5066 int kind;
5068 low = r->low;
5069 high = r->high;
5071 /* Find the section corresponding to this range. */
5072 for (s = info->abfd->sections; s != NULL; s = s->next)
5074 if (bfd_get_section_vma (info->abfd, s) <= low
5075 && high <= (bfd_get_section_vma (info->abfd, s)
5076 + bfd_section_size (info->abfd, s)))
5077 break;
5080 if (s == NULL)
5082 /* Just ignore this range. */
5083 continue;
5086 /* Coalesce ranges if it seems reasonable. */
5087 while (r->next != NULL
5088 && high + 0x1000 >= r->next->low
5089 && (r->next->high
5090 <= (bfd_get_section_vma (info->abfd, s)
5091 + bfd_section_size (info->abfd, s))))
5093 r = r->next;
5094 high = r->high;
5097 if ((s->flags & SEC_CODE) != 0)
5098 kind = 1;
5099 else if ((s->flags & SEC_READONLY) != 0)
5100 kind = 3;
5101 else
5102 kind = 2;
5104 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
5105 || ! ieee_write_byte (info, 11)
5106 || ! ieee_write_number (info, 0)
5107 || ! ieee_write_id (info, "")
5108 || ! ieee_write_number (info, kind)
5109 || ! ieee_write_number (info, s->index + IEEE_SECTION_NUMBER_BASE)
5110 || ! ieee_write_number (info, low)
5111 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
5112 || ! ieee_write_number (info, high - low))
5113 return false;
5115 /* Add this range to the list of global ranges. */
5116 if (! ieee_add_range (info, true, low, high))
5117 return false;
5120 if (! ieee_write_byte (info, (int) ieee_be_record_enum))
5121 return false;
5123 return true;
5126 /* Add BB11 blocks describing each range that we have not already
5127 described. */
5129 static void
5130 ieee_add_bb11_blocks (abfd, sec, data)
5131 bfd *abfd;
5132 asection *sec;
5133 PTR data;
5135 struct ieee_handle *info = (struct ieee_handle *) data;
5136 bfd_vma low, high;
5137 struct ieee_range *r;
5139 low = bfd_get_section_vma (abfd, sec);
5140 high = low + bfd_section_size (abfd, sec);
5142 /* Find the first range at or after this section. The ranges are
5143 sorted by address. */
5144 for (r = info->global_ranges; r != NULL; r = r->next)
5145 if (r->high > low)
5146 break;
5148 while (low < high)
5150 if (r == NULL || r->low >= high)
5152 if (! ieee_add_bb11 (info, sec, low, high))
5153 info->error = true;
5154 return;
5157 if (low < r->low
5158 && r->low - low > 0x100)
5160 if (! ieee_add_bb11 (info, sec, low, r->low))
5162 info->error = true;
5163 return;
5166 low = r->high;
5168 r = r->next;
5172 /* Add a single BB11 block for a range. We add it to info->vars. */
5174 static boolean
5175 ieee_add_bb11 (info, sec, low, high)
5176 struct ieee_handle *info;
5177 asection *sec;
5178 bfd_vma low;
5179 bfd_vma high;
5181 int kind;
5183 if (! ieee_buffer_emptyp (&info->vars))
5185 if (! ieee_change_buffer (info, &info->vars))
5186 return false;
5188 else
5190 const char *filename, *modname;
5191 char *c, *s;
5193 /* Start the enclosing BB10 block. */
5194 filename = bfd_get_filename (info->abfd);
5195 modname = strrchr (filename, '/');
5196 if (modname != NULL)
5197 ++modname;
5198 else
5200 modname = strrchr (filename, '\\');
5201 if (modname != NULL)
5202 ++modname;
5203 else
5204 modname = filename;
5206 c = xstrdup (modname);
5207 s = strrchr (c, '.');
5208 if (s != NULL)
5209 *s = '\0';
5211 if (! ieee_change_buffer (info, &info->vars)
5212 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
5213 || ! ieee_write_byte (info, 10)
5214 || ! ieee_write_number (info, 0)
5215 || ! ieee_write_id (info, c)
5216 || ! ieee_write_id (info, "")
5217 || ! ieee_write_number (info, 0)
5218 || ! ieee_write_id (info, "GNU objcopy"))
5219 return false;
5221 free (c);
5224 if ((sec->flags & SEC_CODE) != 0)
5225 kind = 1;
5226 else if ((sec->flags & SEC_READONLY) != 0)
5227 kind = 3;
5228 else
5229 kind = 2;
5231 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
5232 || ! ieee_write_byte (info, 11)
5233 || ! ieee_write_number (info, 0)
5234 || ! ieee_write_id (info, "")
5235 || ! ieee_write_number (info, kind)
5236 || ! ieee_write_number (info, sec->index + IEEE_SECTION_NUMBER_BASE)
5237 || ! ieee_write_number (info, low)
5238 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
5239 || ! ieee_write_number (info, high - low))
5240 return false;
5242 return true;
5245 /* Start recording information from a particular source file. This is
5246 used to record which file defined which types, variables, etc. It
5247 is not used for line numbers, since the lineno entry point passes
5248 down the file name anyhow. IEEE debugging information doesn't seem
5249 to store this information anywhere. */
5251 /*ARGSUSED*/
5252 static boolean
5253 ieee_start_source (p, filename)
5254 PTR p;
5255 const char *filename;
5257 return true;
5260 /* Make an empty type. */
5262 static boolean
5263 ieee_empty_type (p)
5264 PTR p;
5266 struct ieee_handle *info = (struct ieee_handle *) p;
5268 return ieee_push_type (info, (int) builtin_unknown, 0, false, false);
5271 /* Make a void type. */
5273 static boolean
5274 ieee_void_type (p)
5275 PTR p;
5277 struct ieee_handle *info = (struct ieee_handle *) p;
5279 return ieee_push_type (info, (int) builtin_void, 0, false, false);
5282 /* Make an integer type. */
5284 static boolean
5285 ieee_int_type (p, size, unsignedp)
5286 PTR p;
5287 unsigned int size;
5288 boolean unsignedp;
5290 struct ieee_handle *info = (struct ieee_handle *) p;
5291 unsigned int indx;
5293 switch (size)
5295 case 1:
5296 indx = (int) builtin_signed_char;
5297 break;
5298 case 2:
5299 indx = (int) builtin_signed_short_int;
5300 break;
5301 case 4:
5302 indx = (int) builtin_signed_long;
5303 break;
5304 case 8:
5305 indx = (int) builtin_signed_long_long;
5306 break;
5307 default:
5308 fprintf (stderr, "IEEE unsupported integer type size %u\n", size);
5309 return false;
5312 if (unsignedp)
5313 ++indx;
5315 return ieee_push_type (info, indx, size, unsignedp, false);
5318 /* Make a floating point type. */
5320 static boolean
5321 ieee_float_type (p, size)
5322 PTR p;
5323 unsigned int size;
5325 struct ieee_handle *info = (struct ieee_handle *) p;
5326 unsigned int indx;
5328 switch (size)
5330 case 4:
5331 indx = (int) builtin_float;
5332 break;
5333 case 8:
5334 indx = (int) builtin_double;
5335 break;
5336 case 12:
5337 /* FIXME: This size really depends upon the processor. */
5338 indx = (int) builtin_long_double;
5339 break;
5340 case 16:
5341 indx = (int) builtin_long_long_double;
5342 break;
5343 default:
5344 fprintf (stderr, "IEEE unsupported float type size %u\n", size);
5345 return false;
5348 return ieee_push_type (info, indx, size, false, false);
5351 /* Make a complex type. */
5353 static boolean
5354 ieee_complex_type (p, size)
5355 PTR p;
5356 unsigned int size;
5358 struct ieee_handle *info = (struct ieee_handle *) p;
5359 char code;
5361 switch (size)
5363 case 4:
5364 if (info->complex_float_index != 0)
5365 return ieee_push_type (info, info->complex_float_index, size * 2,
5366 false, false);
5367 code = 'c';
5368 break;
5369 case 12:
5370 case 16:
5371 /* These cases can be output by gcc -gstabs. Outputting the
5372 wrong type is better than crashing. */
5373 case 8:
5374 if (info->complex_double_index != 0)
5375 return ieee_push_type (info, info->complex_double_index, size * 2,
5376 false, false);
5377 code = 'd';
5378 break;
5379 default:
5380 fprintf (stderr, "IEEE unsupported complex type size %u\n", size);
5381 return false;
5384 /* FIXME: I don't know what the string is for. */
5385 if (! ieee_define_type (info, size * 2, false, false)
5386 || ! ieee_write_number (info, code)
5387 || ! ieee_write_id (info, ""))
5388 return false;
5390 if (size == 4)
5391 info->complex_float_index = info->type_stack->type.indx;
5392 else
5393 info->complex_double_index = info->type_stack->type.indx;
5395 return true;
5398 /* Make a boolean type. IEEE doesn't support these, so we just make
5399 an integer type instead. */
5401 static boolean
5402 ieee_bool_type (p, size)
5403 PTR p;
5404 unsigned int size;
5406 return ieee_int_type (p, size, true);
5409 /* Make an enumeration. */
5411 static boolean
5412 ieee_enum_type (p, tag, names, vals)
5413 PTR p;
5414 const char *tag;
5415 const char **names;
5416 bfd_signed_vma *vals;
5418 struct ieee_handle *info = (struct ieee_handle *) p;
5419 struct ieee_defined_enum *e;
5420 boolean localp, simple;
5421 unsigned int indx;
5422 int i;
5424 localp = false;
5425 indx = (unsigned int) -1;
5426 for (e = info->enums; e != NULL; e = e->next)
5428 if (tag == NULL)
5430 if (e->tag != NULL)
5431 continue;
5433 else
5435 if (e->tag == NULL
5436 || tag[0] != e->tag[0]
5437 || strcmp (tag, e->tag) != 0)
5438 continue;
5441 if (! e->defined)
5443 /* This enum tag has been seen but not defined. */
5444 indx = e->indx;
5445 break;
5448 if (names != NULL && e->names != NULL)
5450 for (i = 0; names[i] != NULL && e->names[i] != NULL; i++)
5452 if (names[i][0] != e->names[i][0]
5453 || vals[i] != e->vals[i]
5454 || strcmp (names[i], e->names[i]) != 0)
5455 break;
5459 if ((names == NULL && e->names == NULL)
5460 || (names != NULL
5461 && e->names != NULL
5462 && names[i] == NULL
5463 && e->names[i] == NULL))
5465 /* We've seen this enum before. */
5466 return ieee_push_type (info, e->indx, 0, true, false);
5469 if (tag != NULL)
5471 /* We've already seen an enum of the same name, so we must make
5472 sure to output this one locally. */
5473 localp = true;
5474 break;
5478 /* If this is a simple enumeration, in which the values start at 0
5479 and always increment by 1, we can use type E. Otherwise we must
5480 use type N. */
5482 simple = true;
5483 if (names != NULL)
5485 for (i = 0; names[i] != NULL; i++)
5487 if (vals[i] != i)
5489 simple = false;
5490 break;
5495 if (! ieee_define_named_type (info, tag, indx, 0, true, localp,
5496 (struct ieee_buflist *) NULL)
5497 || ! ieee_write_number (info, simple ? 'E' : 'N'))
5498 return false;
5499 if (simple)
5501 /* FIXME: This is supposed to be the enumeration size, but we
5502 don't store that. */
5503 if (! ieee_write_number (info, 4))
5504 return false;
5506 if (names != NULL)
5508 for (i = 0; names[i] != NULL; i++)
5510 if (! ieee_write_id (info, names[i]))
5511 return false;
5512 if (! simple)
5514 if (! ieee_write_number (info, vals[i]))
5515 return false;
5520 if (! localp)
5522 if (indx == (unsigned int) -1)
5524 e = (struct ieee_defined_enum *) xmalloc (sizeof *e);
5525 memset (e, 0, sizeof *e);
5526 e->indx = info->type_stack->type.indx;
5527 e->tag = tag;
5529 e->next = info->enums;
5530 info->enums = e;
5533 e->names = names;
5534 e->vals = vals;
5535 e->defined = true;
5538 return true;
5541 /* Make a pointer type. */
5543 static boolean
5544 ieee_pointer_type (p)
5545 PTR p;
5547 struct ieee_handle *info = (struct ieee_handle *) p;
5548 boolean localp;
5549 unsigned int indx;
5550 struct ieee_modified_type *m = NULL;
5552 localp = info->type_stack->type.localp;
5553 indx = ieee_pop_type (info);
5555 /* A pointer to a simple builtin type can be obtained by adding 32.
5556 FIXME: Will this be a short pointer, and will that matter? */
5557 if (indx < 32)
5558 return ieee_push_type (info, indx + 32, 0, true, false);
5560 if (! localp)
5562 m = ieee_get_modified_info (p, indx);
5563 if (m == NULL)
5564 return false;
5566 /* FIXME: The size should depend upon the architecture. */
5567 if (m->pointer > 0)
5568 return ieee_push_type (info, m->pointer, 4, true, false);
5571 if (! ieee_define_type (info, 4, true, localp)
5572 || ! ieee_write_number (info, 'P')
5573 || ! ieee_write_number (info, indx))
5574 return false;
5576 if (! localp)
5577 m->pointer = info->type_stack->type.indx;
5579 return true;
5582 /* Make a function type. This will be called for a method, but we
5583 don't want to actually add it to the type table in that case. We
5584 handle this by defining the type in a private buffer, and only
5585 adding that buffer to the typedef block if we are going to use it. */
5587 static boolean
5588 ieee_function_type (p, argcount, varargs)
5589 PTR p;
5590 int argcount;
5591 boolean varargs;
5593 struct ieee_handle *info = (struct ieee_handle *) p;
5594 boolean localp;
5595 unsigned int *args = NULL;
5596 int i;
5597 unsigned int retindx;
5598 struct ieee_buflist fndef;
5599 struct ieee_modified_type *m;
5601 localp = false;
5603 if (argcount > 0)
5605 args = (unsigned int *) xmalloc (argcount * sizeof *args);
5606 for (i = argcount - 1; i >= 0; i--)
5608 if (info->type_stack->type.localp)
5609 localp = true;
5610 args[i] = ieee_pop_type (info);
5613 else if (argcount < 0)
5614 varargs = false;
5616 if (info->type_stack->type.localp)
5617 localp = true;
5618 retindx = ieee_pop_type (info);
5620 m = NULL;
5621 if (argcount < 0 && ! localp)
5623 m = ieee_get_modified_info (p, retindx);
5624 if (m == NULL)
5625 return false;
5627 if (m->function > 0)
5628 return ieee_push_type (info, m->function, 0, true, false);
5631 /* An attribute of 0x41 means that the frame and push mask are
5632 unknown. */
5633 if (! ieee_init_buffer (info, &fndef)
5634 || ! ieee_define_named_type (info, (const char *) NULL,
5635 (unsigned int) -1, 0, true, localp,
5636 &fndef)
5637 || ! ieee_write_number (info, 'x')
5638 || ! ieee_write_number (info, 0x41)
5639 || ! ieee_write_number (info, 0)
5640 || ! ieee_write_number (info, 0)
5641 || ! ieee_write_number (info, retindx)
5642 || ! ieee_write_number (info, (bfd_vma) argcount + (varargs ? 1 : 0)))
5643 return false;
5644 if (argcount > 0)
5646 for (i = 0; i < argcount; i++)
5647 if (! ieee_write_number (info, args[i]))
5648 return false;
5649 free (args);
5651 if (varargs)
5653 /* A varargs function is represented by writing out the last
5654 argument as type void *, although this makes little sense. */
5655 if (! ieee_write_number (info, (bfd_vma) builtin_void + 32))
5656 return false;
5659 if (! ieee_write_number (info, 0))
5660 return false;
5662 /* We wrote the information into fndef, in case we don't need it.
5663 It will be appended to info->types by ieee_pop_type. */
5664 info->type_stack->type.fndef = fndef;
5666 if (m != NULL)
5667 m->function = info->type_stack->type.indx;
5669 return true;
5672 /* Make a reference type. */
5674 static boolean
5675 ieee_reference_type (p)
5676 PTR p;
5678 struct ieee_handle *info = (struct ieee_handle *) p;
5680 /* IEEE appears to record a normal pointer type, and then use a
5681 pmisc record to indicate that it is really a reference. */
5683 if (! ieee_pointer_type (p))
5684 return false;
5685 info->type_stack->type.referencep = true;
5686 return true;
5689 /* Make a range type. */
5691 static boolean
5692 ieee_range_type (p, low, high)
5693 PTR p;
5694 bfd_signed_vma low;
5695 bfd_signed_vma high;
5697 struct ieee_handle *info = (struct ieee_handle *) p;
5698 unsigned int size;
5699 boolean unsignedp, localp;
5701 size = info->type_stack->type.size;
5702 unsignedp = info->type_stack->type.unsignedp;
5703 localp = info->type_stack->type.localp;
5704 ieee_pop_unused_type (info);
5705 return (ieee_define_type (info, size, unsignedp, localp)
5706 && ieee_write_number (info, 'R')
5707 && ieee_write_number (info, (bfd_vma) low)
5708 && ieee_write_number (info, (bfd_vma) high)
5709 && ieee_write_number (info, unsignedp ? 0 : 1)
5710 && ieee_write_number (info, size));
5713 /* Make an array type. */
5715 /*ARGSUSED*/
5716 static boolean
5717 ieee_array_type (p, low, high, stringp)
5718 PTR p;
5719 bfd_signed_vma low;
5720 bfd_signed_vma high;
5721 boolean stringp;
5723 struct ieee_handle *info = (struct ieee_handle *) p;
5724 unsigned int eleindx;
5725 boolean localp;
5726 unsigned int size;
5727 struct ieee_modified_type *m = NULL;
5728 struct ieee_modified_array_type *a;
5730 /* IEEE does not store the range, so we just ignore it. */
5731 ieee_pop_unused_type (info);
5732 localp = info->type_stack->type.localp;
5733 size = info->type_stack->type.size;
5734 eleindx = ieee_pop_type (info);
5736 /* If we don't know the range, treat the size as exactly one
5737 element. */
5738 if (low < high)
5739 size *= (high - low) + 1;
5741 if (! localp)
5743 m = ieee_get_modified_info (info, eleindx);
5744 if (m == NULL)
5745 return false;
5747 for (a = m->arrays; a != NULL; a = a->next)
5749 if (a->low == low && a->high == high)
5750 return ieee_push_type (info, a->indx, size, false, false);
5754 if (! ieee_define_type (info, size, false, localp)
5755 || ! ieee_write_number (info, low == 0 ? 'Z' : 'C')
5756 || ! ieee_write_number (info, eleindx))
5757 return false;
5758 if (low != 0)
5760 if (! ieee_write_number (info, low))
5761 return false;
5764 if (! ieee_write_number (info, high + 1))
5765 return false;
5767 if (! localp)
5769 a = (struct ieee_modified_array_type *) xmalloc (sizeof *a);
5770 memset (a, 0, sizeof *a);
5772 a->indx = info->type_stack->type.indx;
5773 a->low = low;
5774 a->high = high;
5776 a->next = m->arrays;
5777 m->arrays = a;
5780 return true;
5783 /* Make a set type. */
5785 static boolean
5786 ieee_set_type (p, bitstringp)
5787 PTR p;
5788 boolean bitstringp;
5790 struct ieee_handle *info = (struct ieee_handle *) p;
5791 boolean localp;
5792 unsigned int eleindx;
5794 localp = info->type_stack->type.localp;
5795 eleindx = ieee_pop_type (info);
5797 /* FIXME: We don't know the size, so we just use 4. */
5799 return (ieee_define_type (info, 0, true, localp)
5800 && ieee_write_number (info, 's')
5801 && ieee_write_number (info, 4)
5802 && ieee_write_number (info, eleindx));
5805 /* Make an offset type. */
5807 static boolean
5808 ieee_offset_type (p)
5809 PTR p;
5811 struct ieee_handle *info = (struct ieee_handle *) p;
5812 unsigned int targetindx, baseindx;
5814 targetindx = ieee_pop_type (info);
5815 baseindx = ieee_pop_type (info);
5817 /* FIXME: The MRI C++ compiler does not appear to generate any
5818 useful type information about an offset type. It just records a
5819 pointer to member as an integer. The MRI/HP IEEE spec does
5820 describe a pmisc record which can be used for a pointer to
5821 member. Unfortunately, it does not describe the target type,
5822 which seems pretty important. I'm going to punt this for now. */
5824 return ieee_int_type (p, 4, true);
5827 /* Make a method type. */
5829 static boolean
5830 ieee_method_type (p, domain, argcount, varargs)
5831 PTR p;
5832 boolean domain;
5833 int argcount;
5834 boolean varargs;
5836 struct ieee_handle *info = (struct ieee_handle *) p;
5838 /* FIXME: The MRI/HP IEEE spec defines a pmisc record to use for a
5839 method, but the definition is incomplete. We just output an 'x'
5840 type. */
5842 if (domain)
5843 ieee_pop_unused_type (info);
5845 return ieee_function_type (p, argcount, varargs);
5848 /* Make a const qualified type. */
5850 static boolean
5851 ieee_const_type (p)
5852 PTR p;
5854 struct ieee_handle *info = (struct ieee_handle *) p;
5855 unsigned int size;
5856 boolean unsignedp, localp;
5857 unsigned int indx;
5858 struct ieee_modified_type *m = NULL;
5860 size = info->type_stack->type.size;
5861 unsignedp = info->type_stack->type.unsignedp;
5862 localp = info->type_stack->type.localp;
5863 indx = ieee_pop_type (info);
5865 if (! localp)
5867 m = ieee_get_modified_info (info, indx);
5868 if (m == NULL)
5869 return false;
5871 if (m->const_qualified > 0)
5872 return ieee_push_type (info, m->const_qualified, size, unsignedp,
5873 false);
5876 if (! ieee_define_type (info, size, unsignedp, localp)
5877 || ! ieee_write_number (info, 'n')
5878 || ! ieee_write_number (info, 1)
5879 || ! ieee_write_number (info, indx))
5880 return false;
5882 if (! localp)
5883 m->const_qualified = info->type_stack->type.indx;
5885 return true;
5888 /* Make a volatile qualified type. */
5890 static boolean
5891 ieee_volatile_type (p)
5892 PTR p;
5894 struct ieee_handle *info = (struct ieee_handle *) p;
5895 unsigned int size;
5896 boolean unsignedp, localp;
5897 unsigned int indx;
5898 struct ieee_modified_type *m = NULL;
5900 size = info->type_stack->type.size;
5901 unsignedp = info->type_stack->type.unsignedp;
5902 localp = info->type_stack->type.localp;
5903 indx = ieee_pop_type (info);
5905 if (! localp)
5907 m = ieee_get_modified_info (info, indx);
5908 if (m == NULL)
5909 return false;
5911 if (m->volatile_qualified > 0)
5912 return ieee_push_type (info, m->volatile_qualified, size, unsignedp,
5913 false);
5916 if (! ieee_define_type (info, size, unsignedp, localp)
5917 || ! ieee_write_number (info, 'n')
5918 || ! ieee_write_number (info, 2)
5919 || ! ieee_write_number (info, indx))
5920 return false;
5922 if (! localp)
5923 m->volatile_qualified = info->type_stack->type.indx;
5925 return true;
5928 /* Convert an enum debug_visibility into a CXXFLAGS value. */
5930 static unsigned int
5931 ieee_vis_to_flags (visibility)
5932 enum debug_visibility visibility;
5934 switch (visibility)
5936 default:
5937 abort ();
5938 case DEBUG_VISIBILITY_PUBLIC:
5939 return CXXFLAGS_VISIBILITY_PUBLIC;
5940 case DEBUG_VISIBILITY_PRIVATE:
5941 return CXXFLAGS_VISIBILITY_PRIVATE;
5942 case DEBUG_VISIBILITY_PROTECTED:
5943 return CXXFLAGS_VISIBILITY_PROTECTED;
5945 /*NOTREACHED*/
5948 /* Start defining a struct type. We build it in the strdef field on
5949 the stack, to avoid confusing type definitions required by the
5950 fields with the struct type itself. */
5952 static boolean
5953 ieee_start_struct_type (p, tag, id, structp, size)
5954 PTR p;
5955 const char *tag;
5956 unsigned int id;
5957 boolean structp;
5958 unsigned int size;
5960 struct ieee_handle *info = (struct ieee_handle *) p;
5961 boolean localp, ignorep;
5962 boolean copy;
5963 char ab[20];
5964 const char *look;
5965 struct ieee_name_type_hash_entry *h;
5966 struct ieee_name_type *nt, *ntlook;
5967 struct ieee_buflist strdef;
5969 localp = false;
5970 ignorep = false;
5972 /* We need to create a tag for internal use even if we don't want
5973 one for external use. This will let us refer to an anonymous
5974 struct. */
5975 if (tag != NULL)
5977 look = tag;
5978 copy = false;
5980 else
5982 sprintf (ab, "__anon%u", id);
5983 look = ab;
5984 copy = true;
5987 /* If we already have references to the tag, we must use the
5988 existing type index. */
5989 h = ieee_name_type_hash_lookup (&info->tags, look, true, copy);
5990 if (h == NULL)
5991 return false;
5993 nt = NULL;
5994 for (ntlook = h->types; ntlook != NULL; ntlook = ntlook->next)
5996 if (ntlook->id == id)
5997 nt = ntlook;
5998 else if (! ntlook->type.localp)
6000 /* We are creating a duplicate definition of a globally
6001 defined tag. Force it to be local to avoid
6002 confusion. */
6003 localp = true;
6007 if (nt != NULL)
6009 assert (localp == nt->type.localp);
6010 if (nt->kind == DEBUG_KIND_ILLEGAL && ! localp)
6012 /* We've already seen a global definition of the type.
6013 Ignore this new definition. */
6014 ignorep = true;
6017 else
6019 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
6020 memset (nt, 0, sizeof *nt);
6021 nt->id = id;
6022 nt->type.name = h->root.string;
6023 nt->next = h->types;
6024 h->types = nt;
6025 nt->type.indx = info->type_indx;
6026 ++info->type_indx;
6029 nt->kind = DEBUG_KIND_ILLEGAL;
6031 if (! ieee_init_buffer (info, &strdef)
6032 || ! ieee_define_named_type (info, tag, nt->type.indx, size, true,
6033 localp, &strdef)
6034 || ! ieee_write_number (info, structp ? 'S' : 'U')
6035 || ! ieee_write_number (info, size))
6036 return false;
6038 if (! ignorep)
6040 const char *hold;
6042 /* We never want nt->type.name to be NULL. We want the rest of
6043 the type to be the object set up on the type stack; it will
6044 have a NULL name if tag is NULL. */
6045 hold = nt->type.name;
6046 nt->type = info->type_stack->type;
6047 nt->type.name = hold;
6050 info->type_stack->type.name = tag;
6051 info->type_stack->type.strdef = strdef;
6052 info->type_stack->type.ignorep = ignorep;
6054 return true;
6057 /* Add a field to a struct. */
6059 static boolean
6060 ieee_struct_field (p, name, bitpos, bitsize, visibility)
6061 PTR p;
6062 const char *name;
6063 bfd_vma bitpos;
6064 bfd_vma bitsize;
6065 enum debug_visibility visibility;
6067 struct ieee_handle *info = (struct ieee_handle *) p;
6068 unsigned int size;
6069 boolean unsignedp;
6070 boolean referencep;
6071 boolean localp;
6072 unsigned int indx;
6073 bfd_vma offset;
6075 assert (info->type_stack != NULL
6076 && info->type_stack->next != NULL
6077 && ! ieee_buffer_emptyp (&info->type_stack->next->type.strdef));
6079 /* If we are ignoring this struct definition, just pop and ignore
6080 the type. */
6081 if (info->type_stack->next->type.ignorep)
6083 ieee_pop_unused_type (info);
6084 return true;
6087 size = info->type_stack->type.size;
6088 unsignedp = info->type_stack->type.unsignedp;
6089 referencep = info->type_stack->type.referencep;
6090 localp = info->type_stack->type.localp;
6091 indx = ieee_pop_type (info);
6093 if (localp)
6094 info->type_stack->type.localp = true;
6096 if (info->type_stack->type.classdef != NULL)
6098 unsigned int flags;
6099 unsigned int nindx;
6101 /* This is a class. We must add a description of this field to
6102 the class records we are building. */
6104 flags = ieee_vis_to_flags (visibility);
6105 nindx = info->type_stack->type.classdef->indx;
6106 if (! ieee_change_buffer (info,
6107 &info->type_stack->type.classdef->pmiscbuf)
6108 || ! ieee_write_asn (info, nindx, 'd')
6109 || ! ieee_write_asn (info, nindx, flags)
6110 || ! ieee_write_atn65 (info, nindx, name)
6111 || ! ieee_write_atn65 (info, nindx, name))
6112 return false;
6113 info->type_stack->type.classdef->pmisccount += 4;
6115 if (referencep)
6117 unsigned int nindx;
6119 /* We need to output a record recording that this field is
6120 really of reference type. We put this on the refs field
6121 of classdef, so that it can be appended to the C++
6122 records after the class is defined. */
6124 nindx = info->name_indx;
6125 ++info->name_indx;
6127 if (! ieee_change_buffer (info,
6128 &info->type_stack->type.classdef->refs)
6129 || ! ieee_write_byte (info, (int) ieee_nn_record)
6130 || ! ieee_write_number (info, nindx)
6131 || ! ieee_write_id (info, "")
6132 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
6133 || ! ieee_write_number (info, nindx)
6134 || ! ieee_write_number (info, 0)
6135 || ! ieee_write_number (info, 62)
6136 || ! ieee_write_number (info, 80)
6137 || ! ieee_write_number (info, 4)
6138 || ! ieee_write_asn (info, nindx, 'R')
6139 || ! ieee_write_asn (info, nindx, 3)
6140 || ! ieee_write_atn65 (info, nindx, info->type_stack->type.name)
6141 || ! ieee_write_atn65 (info, nindx, name))
6142 return false;
6146 /* If the bitsize doesn't match the expected size, we need to output
6147 a bitfield type. */
6148 if (size == 0 || bitsize == 0 || bitsize == size * 8)
6149 offset = bitpos / 8;
6150 else
6152 if (! ieee_define_type (info, 0, unsignedp,
6153 info->type_stack->type.localp)
6154 || ! ieee_write_number (info, 'g')
6155 || ! ieee_write_number (info, unsignedp ? 0 : 1)
6156 || ! ieee_write_number (info, bitsize)
6157 || ! ieee_write_number (info, indx))
6158 return false;
6159 indx = ieee_pop_type (info);
6160 offset = bitpos;
6163 /* Switch to the struct we are building in order to output this
6164 field definition. */
6165 return (ieee_change_buffer (info, &info->type_stack->type.strdef)
6166 && ieee_write_id (info, name)
6167 && ieee_write_number (info, indx)
6168 && ieee_write_number (info, offset));
6171 /* Finish up a struct type. */
6173 static boolean
6174 ieee_end_struct_type (p)
6175 PTR p;
6177 struct ieee_handle *info = (struct ieee_handle *) p;
6178 struct ieee_buflist *pb;
6180 assert (info->type_stack != NULL
6181 && ! ieee_buffer_emptyp (&info->type_stack->type.strdef));
6183 /* If we were ignoring this struct definition because it was a
6184 duplicate defintion, just through away whatever bytes we have
6185 accumulated. Leave the type on the stack. */
6186 if (info->type_stack->type.ignorep)
6187 return true;
6189 /* If this is not a duplicate definition of this tag, then localp
6190 will be false, and we can put it in the global type block.
6191 FIXME: We should avoid outputting duplicate definitions which are
6192 the same. */
6193 if (! info->type_stack->type.localp)
6195 /* Make sure we have started the global type block. */
6196 if (ieee_buffer_emptyp (&info->global_types))
6198 if (! ieee_change_buffer (info, &info->global_types)
6199 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
6200 || ! ieee_write_byte (info, 2)
6201 || ! ieee_write_number (info, 0)
6202 || ! ieee_write_id (info, ""))
6203 return false;
6205 pb = &info->global_types;
6207 else
6209 /* Make sure we have started the types block. */
6210 if (ieee_buffer_emptyp (&info->types))
6212 if (! ieee_change_buffer (info, &info->types)
6213 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
6214 || ! ieee_write_byte (info, 1)
6215 || ! ieee_write_number (info, 0)
6216 || ! ieee_write_id (info, info->modname))
6217 return false;
6219 pb = &info->types;
6222 /* Append the struct definition to the types. */
6223 if (! ieee_append_buffer (info, pb, &info->type_stack->type.strdef)
6224 || ! ieee_init_buffer (info, &info->type_stack->type.strdef))
6225 return false;
6227 /* Leave the struct on the type stack. */
6229 return true;
6232 /* Start a class type. */
6234 static boolean
6235 ieee_start_class_type (p, tag, id, structp, size, vptr, ownvptr)
6236 PTR p;
6237 const char *tag;
6238 unsigned int id;
6239 boolean structp;
6240 unsigned int size;
6241 boolean vptr;
6242 boolean ownvptr;
6244 struct ieee_handle *info = (struct ieee_handle *) p;
6245 const char *vclass;
6246 struct ieee_buflist pmiscbuf;
6247 unsigned int indx;
6248 struct ieee_type_class *classdef;
6250 /* A C++ class is output as a C++ struct along with a set of pmisc
6251 records describing the class. */
6253 /* We need to have a name so that we can associate the struct and
6254 the class. */
6255 if (tag == NULL)
6257 char *t;
6259 t = (char *) xmalloc (20);
6260 sprintf (t, "__anon%u", id);
6261 tag = t;
6264 /* We can't write out the virtual table information until we have
6265 finished the class, because we don't know the virtual table size.
6266 We get the size from the largest voffset we see. */
6267 vclass = NULL;
6268 if (vptr && ! ownvptr)
6270 vclass = info->type_stack->type.name;
6271 assert (vclass != NULL);
6272 /* We don't call ieee_pop_unused_type, since the class should
6273 get defined. */
6274 (void) ieee_pop_type (info);
6277 if (! ieee_start_struct_type (p, tag, id, structp, size))
6278 return false;
6280 indx = info->name_indx;
6281 ++info->name_indx;
6283 /* We write out pmisc records into the classdef field. We will
6284 write out the pmisc start after we know the number of records we
6285 need. */
6286 if (! ieee_init_buffer (info, &pmiscbuf)
6287 || ! ieee_change_buffer (info, &pmiscbuf)
6288 || ! ieee_write_asn (info, indx, 'T')
6289 || ! ieee_write_asn (info, indx, structp ? 'o' : 'u')
6290 || ! ieee_write_atn65 (info, indx, tag))
6291 return false;
6293 classdef = (struct ieee_type_class *) xmalloc (sizeof *classdef);
6294 memset (classdef, 0, sizeof *classdef);
6296 classdef->indx = indx;
6297 classdef->pmiscbuf = pmiscbuf;
6298 classdef->pmisccount = 3;
6299 classdef->vclass = vclass;
6300 classdef->ownvptr = ownvptr;
6302 info->type_stack->type.classdef = classdef;
6304 return true;
6307 /* Add a static member to a class. */
6309 static boolean
6310 ieee_class_static_member (p, name, physname, visibility)
6311 PTR p;
6312 const char *name;
6313 const char *physname;
6314 enum debug_visibility visibility;
6316 struct ieee_handle *info = (struct ieee_handle *) p;
6317 unsigned int flags;
6318 unsigned int nindx;
6320 /* We don't care about the type. Hopefully there will be a call to
6321 ieee_variable declaring the physical name and the type, since
6322 that is where an IEEE consumer must get the type. */
6323 ieee_pop_unused_type (info);
6325 assert (info->type_stack != NULL
6326 && info->type_stack->type.classdef != NULL);
6328 flags = ieee_vis_to_flags (visibility);
6329 flags |= CXXFLAGS_STATIC;
6331 nindx = info->type_stack->type.classdef->indx;
6333 if (! ieee_change_buffer (info, &info->type_stack->type.classdef->pmiscbuf)
6334 || ! ieee_write_asn (info, nindx, 'd')
6335 || ! ieee_write_asn (info, nindx, flags)
6336 || ! ieee_write_atn65 (info, nindx, name)
6337 || ! ieee_write_atn65 (info, nindx, physname))
6338 return false;
6339 info->type_stack->type.classdef->pmisccount += 4;
6341 return true;
6344 /* Add a base class to a class. */
6346 static boolean
6347 ieee_class_baseclass (p, bitpos, virtual, visibility)
6348 PTR p;
6349 bfd_vma bitpos;
6350 boolean virtual;
6351 enum debug_visibility visibility;
6353 struct ieee_handle *info = (struct ieee_handle *) p;
6354 const char *bname;
6355 boolean localp;
6356 unsigned int bindx;
6357 char *fname;
6358 unsigned int flags;
6359 unsigned int nindx;
6361 assert (info->type_stack != NULL
6362 && info->type_stack->type.name != NULL
6363 && info->type_stack->next != NULL
6364 && info->type_stack->next->type.classdef != NULL
6365 && ! ieee_buffer_emptyp (&info->type_stack->next->type.strdef));
6367 bname = info->type_stack->type.name;
6368 localp = info->type_stack->type.localp;
6369 bindx = ieee_pop_type (info);
6371 /* We are currently defining both a struct and a class. We must
6372 write out a field definition in the struct which holds the base
6373 class. The stabs debugging reader will create a field named
6374 _vb$CLASS for a virtual base class, so we just use that. FIXME:
6375 we should not depend upon a detail of stabs debugging. */
6376 if (virtual)
6378 fname = (char *) xmalloc (strlen (bname) + sizeof "_vb$");
6379 sprintf (fname, "_vb$%s", bname);
6380 flags = BASEFLAGS_VIRTUAL;
6382 else
6384 if (localp)
6385 info->type_stack->type.localp = true;
6387 fname = (char *) xmalloc (strlen (bname) + sizeof "_b$");
6388 sprintf (fname, "_b$%s", bname);
6390 if (! ieee_change_buffer (info, &info->type_stack->type.strdef)
6391 || ! ieee_write_id (info, fname)
6392 || ! ieee_write_number (info, bindx)
6393 || ! ieee_write_number (info, bitpos / 8))
6394 return false;
6395 flags = 0;
6398 if (visibility == DEBUG_VISIBILITY_PRIVATE)
6399 flags |= BASEFLAGS_PRIVATE;
6401 nindx = info->type_stack->type.classdef->indx;
6403 if (! ieee_change_buffer (info, &info->type_stack->type.classdef->pmiscbuf)
6404 || ! ieee_write_asn (info, nindx, 'b')
6405 || ! ieee_write_asn (info, nindx, flags)
6406 || ! ieee_write_atn65 (info, nindx, bname)
6407 || ! ieee_write_asn (info, nindx, 0)
6408 || ! ieee_write_atn65 (info, nindx, fname))
6409 return false;
6410 info->type_stack->type.classdef->pmisccount += 5;
6412 free (fname);
6414 return true;
6417 /* Start building a method for a class. */
6419 static boolean
6420 ieee_class_start_method (p, name)
6421 PTR p;
6422 const char *name;
6424 struct ieee_handle *info = (struct ieee_handle *) p;
6426 assert (info->type_stack != NULL
6427 && info->type_stack->type.classdef != NULL
6428 && info->type_stack->type.classdef->method == NULL);
6430 info->type_stack->type.classdef->method = name;
6432 return true;
6435 /* Define a new method variant, either static or not. */
6437 static boolean
6438 ieee_class_method_var (info, physname, visibility, staticp, constp,
6439 volatilep, voffset, context)
6440 struct ieee_handle *info;
6441 const char *physname;
6442 enum debug_visibility visibility;
6443 boolean staticp;
6444 boolean constp;
6445 boolean volatilep;
6446 bfd_vma voffset;
6447 boolean context;
6449 unsigned int flags;
6450 unsigned int nindx;
6451 boolean virtual;
6453 /* We don't need the type of the method. An IEEE consumer which
6454 wants the type must track down the function by the physical name
6455 and get the type from that. */
6456 ieee_pop_unused_type (info);
6458 /* We don't use the context. FIXME: We probably ought to use it to
6459 adjust the voffset somehow, but I don't really know how. */
6460 if (context)
6461 ieee_pop_unused_type (info);
6463 assert (info->type_stack != NULL
6464 && info->type_stack->type.classdef != NULL
6465 && info->type_stack->type.classdef->method != NULL);
6467 flags = ieee_vis_to_flags (visibility);
6469 /* FIXME: We never set CXXFLAGS_OVERRIDE, CXXFLAGS_OPERATOR,
6470 CXXFLAGS_CTORDTOR, CXXFLAGS_CTOR, or CXXFLAGS_INLINE. */
6472 if (staticp)
6473 flags |= CXXFLAGS_STATIC;
6474 if (constp)
6475 flags |= CXXFLAGS_CONST;
6476 if (volatilep)
6477 flags |= CXXFLAGS_VOLATILE;
6479 nindx = info->type_stack->type.classdef->indx;
6481 virtual = context || voffset > 0;
6483 if (! ieee_change_buffer (info,
6484 &info->type_stack->type.classdef->pmiscbuf)
6485 || ! ieee_write_asn (info, nindx, virtual ? 'v' : 'm')
6486 || ! ieee_write_asn (info, nindx, flags)
6487 || ! ieee_write_atn65 (info, nindx,
6488 info->type_stack->type.classdef->method)
6489 || ! ieee_write_atn65 (info, nindx, physname))
6490 return false;
6492 if (virtual)
6494 if (voffset > info->type_stack->type.classdef->voffset)
6495 info->type_stack->type.classdef->voffset = voffset;
6496 if (! ieee_write_asn (info, nindx, voffset))
6497 return false;
6498 ++info->type_stack->type.classdef->pmisccount;
6501 if (! ieee_write_asn (info, nindx, 0))
6502 return false;
6504 info->type_stack->type.classdef->pmisccount += 5;
6506 return true;
6509 /* Define a new method variant. */
6511 static boolean
6512 ieee_class_method_variant (p, physname, visibility, constp, volatilep,
6513 voffset, context)
6514 PTR p;
6515 const char *physname;
6516 enum debug_visibility visibility;
6517 boolean constp;
6518 boolean volatilep;
6519 bfd_vma voffset;
6520 boolean context;
6522 struct ieee_handle *info = (struct ieee_handle *) p;
6524 return ieee_class_method_var (info, physname, visibility, false, constp,
6525 volatilep, voffset, context);
6528 /* Define a new static method variant. */
6530 static boolean
6531 ieee_class_static_method_variant (p, physname, visibility, constp, volatilep)
6532 PTR p;
6533 const char *physname;
6534 enum debug_visibility visibility;
6535 boolean constp;
6536 boolean volatilep;
6538 struct ieee_handle *info = (struct ieee_handle *) p;
6540 return ieee_class_method_var (info, physname, visibility, true, constp,
6541 volatilep, 0, false);
6544 /* Finish up a method. */
6546 static boolean
6547 ieee_class_end_method (p)
6548 PTR p;
6550 struct ieee_handle *info = (struct ieee_handle *) p;
6552 assert (info->type_stack != NULL
6553 && info->type_stack->type.classdef != NULL
6554 && info->type_stack->type.classdef->method != NULL);
6556 info->type_stack->type.classdef->method = NULL;
6558 return true;
6561 /* Finish up a class. */
6563 static boolean
6564 ieee_end_class_type (p)
6565 PTR p;
6567 struct ieee_handle *info = (struct ieee_handle *) p;
6568 unsigned int nindx;
6570 assert (info->type_stack != NULL
6571 && info->type_stack->type.classdef != NULL);
6573 /* If we were ignoring this class definition because it was a
6574 duplicate definition, just through away whatever bytes we have
6575 accumulated. Leave the type on the stack. */
6576 if (info->type_stack->type.ignorep)
6577 return true;
6579 nindx = info->type_stack->type.classdef->indx;
6581 /* If we have a virtual table, we can write out the information now. */
6582 if (info->type_stack->type.classdef->vclass != NULL
6583 || info->type_stack->type.classdef->ownvptr)
6585 if (! ieee_change_buffer (info,
6586 &info->type_stack->type.classdef->pmiscbuf)
6587 || ! ieee_write_asn (info, nindx, 'z')
6588 || ! ieee_write_atn65 (info, nindx, "")
6589 || ! ieee_write_asn (info, nindx,
6590 info->type_stack->type.classdef->voffset))
6591 return false;
6592 if (info->type_stack->type.classdef->ownvptr)
6594 if (! ieee_write_atn65 (info, nindx, ""))
6595 return false;
6597 else
6599 if (! ieee_write_atn65 (info, nindx,
6600 info->type_stack->type.classdef->vclass))
6601 return false;
6603 if (! ieee_write_asn (info, nindx, 0))
6604 return false;
6605 info->type_stack->type.classdef->pmisccount += 5;
6608 /* Now that we know the number of pmisc records, we can write out
6609 the atn62 which starts the pmisc records, and append them to the
6610 C++ buffers. */
6612 if (! ieee_change_buffer (info, &info->cxx)
6613 || ! ieee_write_byte (info, (int) ieee_nn_record)
6614 || ! ieee_write_number (info, nindx)
6615 || ! ieee_write_id (info, "")
6616 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
6617 || ! ieee_write_number (info, nindx)
6618 || ! ieee_write_number (info, 0)
6619 || ! ieee_write_number (info, 62)
6620 || ! ieee_write_number (info, 80)
6621 || ! ieee_write_number (info,
6622 info->type_stack->type.classdef->pmisccount))
6623 return false;
6625 if (! ieee_append_buffer (info, &info->cxx,
6626 &info->type_stack->type.classdef->pmiscbuf))
6627 return false;
6628 if (! ieee_buffer_emptyp (&info->type_stack->type.classdef->refs))
6630 if (! ieee_append_buffer (info, &info->cxx,
6631 &info->type_stack->type.classdef->refs))
6632 return false;
6635 return ieee_end_struct_type (p);
6638 /* Push a previously seen typedef onto the type stack. */
6640 static boolean
6641 ieee_typedef_type (p, name)
6642 PTR p;
6643 const char *name;
6645 struct ieee_handle *info = (struct ieee_handle *) p;
6646 struct ieee_name_type_hash_entry *h;
6647 struct ieee_name_type *nt;
6649 h = ieee_name_type_hash_lookup (&info->typedefs, name, false, false);
6651 /* h should never be NULL, since that would imply that the generic
6652 debugging code has asked for a typedef which it has not yet
6653 defined. */
6654 assert (h != NULL);
6656 /* We always use the most recently defined type for this name, which
6657 will be the first one on the list. */
6659 nt = h->types;
6660 if (! ieee_push_type (info, nt->type.indx, nt->type.size,
6661 nt->type.unsignedp, nt->type.localp))
6662 return false;
6664 /* Copy over any other type information we may have. */
6665 info->type_stack->type = nt->type;
6667 return true;
6670 /* Push a tagged type onto the type stack. */
6672 static boolean
6673 ieee_tag_type (p, name, id, kind)
6674 PTR p;
6675 const char *name;
6676 unsigned int id;
6677 enum debug_type_kind kind;
6679 struct ieee_handle *info = (struct ieee_handle *) p;
6680 boolean localp;
6681 boolean copy;
6682 char ab[20];
6683 struct ieee_name_type_hash_entry *h;
6684 struct ieee_name_type *nt;
6686 if (kind == DEBUG_KIND_ENUM)
6688 struct ieee_defined_enum *e;
6690 if (name == NULL)
6691 abort ();
6692 for (e = info->enums; e != NULL; e = e->next)
6693 if (e->tag != NULL && strcmp (e->tag, name) == 0)
6694 return ieee_push_type (info, e->indx, 0, true, false);
6696 e = (struct ieee_defined_enum *) xmalloc (sizeof *e);
6697 memset (e, 0, sizeof *e);
6699 e->indx = info->type_indx;
6700 ++info->type_indx;
6701 e->tag = name;
6702 e->defined = false;
6704 e->next = info->enums;
6705 info->enums = e;
6707 return ieee_push_type (info, e->indx, 0, true, false);
6710 localp = false;
6712 copy = false;
6713 if (name == NULL)
6715 sprintf (ab, "__anon%u", id);
6716 name = ab;
6717 copy = true;
6720 h = ieee_name_type_hash_lookup (&info->tags, name, true, copy);
6721 if (h == NULL)
6722 return false;
6724 for (nt = h->types; nt != NULL; nt = nt->next)
6726 if (nt->id == id)
6728 if (! ieee_push_type (info, nt->type.indx, nt->type.size,
6729 nt->type.unsignedp, nt->type.localp))
6730 return false;
6731 /* Copy over any other type information we may have. */
6732 info->type_stack->type = nt->type;
6733 return true;
6736 if (! nt->type.localp)
6738 /* This is a duplicate of a global type, so it must be
6739 local. */
6740 localp = true;
6744 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
6745 memset (nt, 0, sizeof *nt);
6747 nt->id = id;
6748 nt->type.name = h->root.string;
6749 nt->type.indx = info->type_indx;
6750 nt->type.localp = localp;
6751 ++info->type_indx;
6752 nt->kind = kind;
6754 nt->next = h->types;
6755 h->types = nt;
6757 if (! ieee_push_type (info, nt->type.indx, 0, false, localp))
6758 return false;
6760 info->type_stack->type.name = h->root.string;
6762 return true;
6765 /* Output a typedef. */
6767 static boolean
6768 ieee_typdef (p, name)
6769 PTR p;
6770 const char *name;
6772 struct ieee_handle *info = (struct ieee_handle *) p;
6773 struct ieee_write_type type;
6774 unsigned int indx;
6775 boolean found;
6776 boolean localp;
6777 struct ieee_name_type_hash_entry *h;
6778 struct ieee_name_type *nt;
6780 type = info->type_stack->type;
6781 indx = type.indx;
6783 /* If this is a simple builtin type using a builtin name, we don't
6784 want to output the typedef itself. We also want to change the
6785 type index to correspond to the name being used. We recognize
6786 names used in stabs debugging output even if they don't exactly
6787 correspond to the names used for the IEEE builtin types. */
6788 found = false;
6789 if (indx <= (unsigned int) builtin_bcd_float)
6791 switch ((enum builtin_types) indx)
6793 default:
6794 break;
6796 case builtin_void:
6797 if (strcmp (name, "void") == 0)
6798 found = true;
6799 break;
6801 case builtin_signed_char:
6802 case builtin_char:
6803 if (strcmp (name, "signed char") == 0)
6805 indx = (unsigned int) builtin_signed_char;
6806 found = true;
6808 else if (strcmp (name, "char") == 0)
6810 indx = (unsigned int) builtin_char;
6811 found = true;
6813 break;
6815 case builtin_unsigned_char:
6816 if (strcmp (name, "unsigned char") == 0)
6817 found = true;
6818 break;
6820 case builtin_signed_short_int:
6821 case builtin_short:
6822 case builtin_short_int:
6823 case builtin_signed_short:
6824 if (strcmp (name, "signed short int") == 0)
6826 indx = (unsigned int) builtin_signed_short_int;
6827 found = true;
6829 else if (strcmp (name, "short") == 0)
6831 indx = (unsigned int) builtin_short;
6832 found = true;
6834 else if (strcmp (name, "short int") == 0)
6836 indx = (unsigned int) builtin_short_int;
6837 found = true;
6839 else if (strcmp (name, "signed short") == 0)
6841 indx = (unsigned int) builtin_signed_short;
6842 found = true;
6844 break;
6846 case builtin_unsigned_short_int:
6847 case builtin_unsigned_short:
6848 if (strcmp (name, "unsigned short int") == 0
6849 || strcmp (name, "short unsigned int") == 0)
6851 indx = builtin_unsigned_short_int;
6852 found = true;
6854 else if (strcmp (name, "unsigned short") == 0)
6856 indx = builtin_unsigned_short;
6857 found = true;
6859 break;
6861 case builtin_signed_long:
6862 case builtin_int: /* FIXME: Size depends upon architecture. */
6863 case builtin_long:
6864 if (strcmp (name, "signed long") == 0)
6866 indx = builtin_signed_long;
6867 found = true;
6869 else if (strcmp (name, "int") == 0)
6871 indx = builtin_int;
6872 found = true;
6874 else if (strcmp (name, "long") == 0
6875 || strcmp (name, "long int") == 0)
6877 indx = builtin_long;
6878 found = true;
6880 break;
6882 case builtin_unsigned_long:
6883 case builtin_unsigned: /* FIXME: Size depends upon architecture. */
6884 case builtin_unsigned_int: /* FIXME: Like builtin_unsigned. */
6885 if (strcmp (name, "unsigned long") == 0
6886 || strcmp (name, "long unsigned int") == 0)
6888 indx = builtin_unsigned_long;
6889 found = true;
6891 else if (strcmp (name, "unsigned") == 0)
6893 indx = builtin_unsigned;
6894 found = true;
6896 else if (strcmp (name, "unsigned int") == 0)
6898 indx = builtin_unsigned_int;
6899 found = true;
6901 break;
6903 case builtin_signed_long_long:
6904 if (strcmp (name, "signed long long") == 0
6905 || strcmp (name, "long long int") == 0)
6906 found = true;
6907 break;
6909 case builtin_unsigned_long_long:
6910 if (strcmp (name, "unsigned long long") == 0
6911 || strcmp (name, "long long unsigned int") == 0)
6912 found = true;
6913 break;
6915 case builtin_float:
6916 if (strcmp (name, "float") == 0)
6917 found = true;
6918 break;
6920 case builtin_double:
6921 if (strcmp (name, "double") == 0)
6922 found = true;
6923 break;
6925 case builtin_long_double:
6926 if (strcmp (name, "long double") == 0)
6927 found = true;
6928 break;
6930 case builtin_long_long_double:
6931 if (strcmp (name, "long long double") == 0)
6932 found = true;
6933 break;
6936 if (found)
6937 type.indx = indx;
6940 h = ieee_name_type_hash_lookup (&info->typedefs, name, true, false);
6941 if (h == NULL)
6942 return false;
6944 /* See if we have already defined this type with this name. */
6945 localp = type.localp;
6946 for (nt = h->types; nt != NULL; nt = nt->next)
6948 if (nt->id == indx)
6950 /* If this is a global definition, then we don't need to
6951 do anything here. */
6952 if (! nt->type.localp)
6954 ieee_pop_unused_type (info);
6955 return true;
6958 else
6960 /* This is a duplicate definition, so make this one local. */
6961 localp = true;
6965 /* We need to add a new typedef for this type. */
6967 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
6968 memset (nt, 0, sizeof *nt);
6969 nt->id = indx;
6970 nt->type = type;
6971 nt->type.name = name;
6972 nt->type.localp = localp;
6973 nt->kind = DEBUG_KIND_ILLEGAL;
6975 nt->next = h->types;
6976 h->types = nt;
6978 if (found)
6980 /* This is one of the builtin typedefs, so we don't need to
6981 actually define it. */
6982 ieee_pop_unused_type (info);
6983 return true;
6986 indx = ieee_pop_type (info);
6988 if (! ieee_define_named_type (info, name, (unsigned int) -1, type.size,
6989 type.unsignedp, localp,
6990 (struct ieee_buflist *) NULL)
6991 || ! ieee_write_number (info, 'T')
6992 || ! ieee_write_number (info, indx))
6993 return false;
6995 /* Remove the type we just added to the type stack. This should not
6996 be ieee_pop_unused_type, since the type is used, we just don't
6997 need it now. */
6998 (void) ieee_pop_type (info);
7000 return true;
7003 /* Output a tag for a type. We don't have to do anything here. */
7005 static boolean
7006 ieee_tag (p, name)
7007 PTR p;
7008 const char *name;
7010 struct ieee_handle *info = (struct ieee_handle *) p;
7012 /* This should not be ieee_pop_unused_type, since we want the type
7013 to be defined. */
7014 (void) ieee_pop_type (info);
7015 return true;
7018 /* Output an integer constant. */
7020 static boolean
7021 ieee_int_constant (p, name, val)
7022 PTR p;
7023 const char *name;
7024 bfd_vma val;
7026 /* FIXME. */
7027 return true;
7030 /* Output a floating point constant. */
7032 static boolean
7033 ieee_float_constant (p, name, val)
7034 PTR p;
7035 const char *name;
7036 double val;
7038 /* FIXME. */
7039 return true;
7042 /* Output a typed constant. */
7044 static boolean
7045 ieee_typed_constant (p, name, val)
7046 PTR p;
7047 const char *name;
7048 bfd_vma val;
7050 struct ieee_handle *info = (struct ieee_handle *) p;
7052 /* FIXME. */
7053 ieee_pop_unused_type (info);
7054 return true;
7057 /* Output a variable. */
7059 static boolean
7060 ieee_variable (p, name, kind, val)
7061 PTR p;
7062 const char *name;
7063 enum debug_var_kind kind;
7064 bfd_vma val;
7066 struct ieee_handle *info = (struct ieee_handle *) p;
7067 unsigned int name_indx;
7068 unsigned int size;
7069 boolean referencep;
7070 unsigned int type_indx;
7071 boolean asn;
7072 int refflag;
7074 size = info->type_stack->type.size;
7075 referencep = info->type_stack->type.referencep;
7076 type_indx = ieee_pop_type (info);
7078 assert (! ieee_buffer_emptyp (&info->vars));
7079 if (! ieee_change_buffer (info, &info->vars))
7080 return false;
7082 name_indx = info->name_indx;
7083 ++info->name_indx;
7085 /* Write out an NN and an ATN record for this variable. */
7086 if (! ieee_write_byte (info, (int) ieee_nn_record)
7087 || ! ieee_write_number (info, name_indx)
7088 || ! ieee_write_id (info, name)
7089 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7090 || ! ieee_write_number (info, name_indx)
7091 || ! ieee_write_number (info, type_indx))
7092 return false;
7093 switch (kind)
7095 default:
7096 abort ();
7097 return false;
7098 case DEBUG_GLOBAL:
7099 if (! ieee_write_number (info, 8)
7100 || ! ieee_add_range (info, false, val, val + size))
7101 return false;
7102 refflag = 0;
7103 asn = true;
7104 break;
7105 case DEBUG_STATIC:
7106 if (! ieee_write_number (info, 3)
7107 || ! ieee_add_range (info, false, val, val + size))
7108 return false;
7109 refflag = 1;
7110 asn = true;
7111 break;
7112 case DEBUG_LOCAL_STATIC:
7113 if (! ieee_write_number (info, 3)
7114 || ! ieee_add_range (info, false, val, val + size))
7115 return false;
7116 refflag = 2;
7117 asn = true;
7118 break;
7119 case DEBUG_LOCAL:
7120 if (! ieee_write_number (info, 1)
7121 || ! ieee_write_number (info, val))
7122 return false;
7123 refflag = 2;
7124 asn = false;
7125 break;
7126 case DEBUG_REGISTER:
7127 if (! ieee_write_number (info, 2)
7128 || ! ieee_write_number (info,
7129 ieee_genreg_to_regno (info->abfd, val)))
7130 return false;
7131 refflag = 2;
7132 asn = false;
7133 break;
7136 if (asn)
7138 if (! ieee_write_asn (info, name_indx, val))
7139 return false;
7142 /* If this is really a reference type, then we just output it with
7143 pointer type, and must now output a C++ record indicating that it
7144 is really reference type. */
7145 if (referencep)
7147 unsigned int nindx;
7149 nindx = info->name_indx;
7150 ++info->name_indx;
7152 /* If this is a global variable, we want to output the misc
7153 record in the C++ misc record block. Otherwise, we want to
7154 output it just after the variable definition, which is where
7155 the current buffer is. */
7156 if (refflag != 2)
7158 if (! ieee_change_buffer (info, &info->cxx))
7159 return false;
7162 if (! ieee_write_byte (info, (int) ieee_nn_record)
7163 || ! ieee_write_number (info, nindx)
7164 || ! ieee_write_id (info, "")
7165 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7166 || ! ieee_write_number (info, nindx)
7167 || ! ieee_write_number (info, 0)
7168 || ! ieee_write_number (info, 62)
7169 || ! ieee_write_number (info, 80)
7170 || ! ieee_write_number (info, 3)
7171 || ! ieee_write_asn (info, nindx, 'R')
7172 || ! ieee_write_asn (info, nindx, refflag)
7173 || ! ieee_write_atn65 (info, nindx, name))
7174 return false;
7177 return true;
7180 /* Start outputting information for a function. */
7182 static boolean
7183 ieee_start_function (p, name, global)
7184 PTR p;
7185 const char *name;
7186 boolean global;
7188 struct ieee_handle *info = (struct ieee_handle *) p;
7189 boolean referencep;
7190 unsigned int retindx, typeindx;
7192 referencep = info->type_stack->type.referencep;
7193 retindx = ieee_pop_type (info);
7195 /* Besides recording a BB4 or BB6 block, we record the type of the
7196 function in the BB1 typedef block. We can't write out the full
7197 type until we have seen all the parameters, so we accumulate it
7198 in info->fntype and info->fnargs. */
7199 if (! ieee_buffer_emptyp (&info->fntype))
7201 /* FIXME: This might happen someday if we support nested
7202 functions. */
7203 abort ();
7206 info->fnname = name;
7208 /* An attribute of 0x40 means that the push mask is unknown. */
7209 if (! ieee_define_named_type (info, name, (unsigned int) -1, 0, false, true,
7210 &info->fntype)
7211 || ! ieee_write_number (info, 'x')
7212 || ! ieee_write_number (info, 0x40)
7213 || ! ieee_write_number (info, 0)
7214 || ! ieee_write_number (info, 0)
7215 || ! ieee_write_number (info, retindx))
7216 return false;
7218 typeindx = ieee_pop_type (info);
7220 if (! ieee_init_buffer (info, &info->fnargs))
7221 return false;
7222 info->fnargcount = 0;
7224 /* If the function return value is actually a reference type, we
7225 must add a record indicating that. */
7226 if (referencep)
7228 unsigned int nindx;
7230 nindx = info->name_indx;
7231 ++info->name_indx;
7232 if (! ieee_change_buffer (info, &info->cxx)
7233 || ! ieee_write_byte (info, (int) ieee_nn_record)
7234 || ! ieee_write_number (info, nindx)
7235 || ! ieee_write_id (info, "")
7236 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7237 || ! ieee_write_number (info, nindx)
7238 || ! ieee_write_number (info, 0)
7239 || ! ieee_write_number (info, 62)
7240 || ! ieee_write_number (info, 80)
7241 || ! ieee_write_number (info, 3)
7242 || ! ieee_write_asn (info, nindx, 'R')
7243 || ! ieee_write_asn (info, nindx, global ? 0 : 1)
7244 || ! ieee_write_atn65 (info, nindx, name))
7245 return false;
7248 assert (! ieee_buffer_emptyp (&info->vars));
7249 if (! ieee_change_buffer (info, &info->vars))
7250 return false;
7252 /* The address is written out as the first block. */
7254 ++info->block_depth;
7256 return (ieee_write_byte (info, (int) ieee_bb_record_enum)
7257 && ieee_write_byte (info, global ? 4 : 6)
7258 && ieee_write_number (info, 0)
7259 && ieee_write_id (info, name)
7260 && ieee_write_number (info, 0)
7261 && ieee_write_number (info, typeindx));
7264 /* Add a function parameter. This will normally be called before the
7265 first block, so we postpone them until we see the block. */
7267 static boolean
7268 ieee_function_parameter (p, name, kind, val)
7269 PTR p;
7270 const char *name;
7271 enum debug_parm_kind kind;
7272 bfd_vma val;
7274 struct ieee_handle *info = (struct ieee_handle *) p;
7275 struct ieee_pending_parm *m, **pm;
7277 assert (info->block_depth == 1);
7279 m = (struct ieee_pending_parm *) xmalloc (sizeof *m);
7280 memset (m, 0, sizeof *m);
7282 m->next = NULL;
7283 m->name = name;
7284 m->referencep = info->type_stack->type.referencep;
7285 m->type = ieee_pop_type (info);
7286 m->kind = kind;
7287 m->val = val;
7289 for (pm = &info->pending_parms; *pm != NULL; pm = &(*pm)->next)
7291 *pm = m;
7293 /* Add the type to the fnargs list. */
7294 if (! ieee_change_buffer (info, &info->fnargs)
7295 || ! ieee_write_number (info, m->type))
7296 return false;
7297 ++info->fnargcount;
7299 return true;
7302 /* Output pending function parameters. */
7304 static boolean
7305 ieee_output_pending_parms (info)
7306 struct ieee_handle *info;
7308 struct ieee_pending_parm *m;
7309 unsigned int refcount;
7311 refcount = 0;
7312 for (m = info->pending_parms; m != NULL; m = m->next)
7314 enum debug_var_kind vkind;
7316 switch (m->kind)
7318 default:
7319 abort ();
7320 return false;
7321 case DEBUG_PARM_STACK:
7322 case DEBUG_PARM_REFERENCE:
7323 vkind = DEBUG_LOCAL;
7324 break;
7325 case DEBUG_PARM_REG:
7326 case DEBUG_PARM_REF_REG:
7327 vkind = DEBUG_REGISTER;
7328 break;
7331 if (! ieee_push_type (info, m->type, 0, false, false))
7332 return false;
7333 info->type_stack->type.referencep = m->referencep;
7334 if (m->referencep)
7335 ++refcount;
7336 if (! ieee_variable ((PTR) info, m->name, vkind, m->val))
7337 return false;
7340 /* If there are any reference parameters, we need to output a
7341 miscellaneous record indicating them. */
7342 if (refcount > 0)
7344 unsigned int nindx, varindx;
7346 /* FIXME: The MRI compiler outputs the demangled function name
7347 here, but we are outputting the mangled name. */
7348 nindx = info->name_indx;
7349 ++info->name_indx;
7350 if (! ieee_change_buffer (info, &info->vars)
7351 || ! ieee_write_byte (info, (int) ieee_nn_record)
7352 || ! ieee_write_number (info, nindx)
7353 || ! ieee_write_id (info, "")
7354 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7355 || ! ieee_write_number (info, nindx)
7356 || ! ieee_write_number (info, 0)
7357 || ! ieee_write_number (info, 62)
7358 || ! ieee_write_number (info, 80)
7359 || ! ieee_write_number (info, refcount + 3)
7360 || ! ieee_write_asn (info, nindx, 'B')
7361 || ! ieee_write_atn65 (info, nindx, info->fnname)
7362 || ! ieee_write_asn (info, nindx, 0))
7363 return false;
7364 for (m = info->pending_parms, varindx = 1;
7365 m != NULL;
7366 m = m->next, varindx++)
7368 if (m->referencep)
7370 if (! ieee_write_asn (info, nindx, varindx))
7371 return false;
7376 m = info->pending_parms;
7377 while (m != NULL)
7379 struct ieee_pending_parm *next;
7381 next = m->next;
7382 free (m);
7383 m = next;
7386 info->pending_parms = NULL;
7388 return true;
7391 /* Start a block. If this is the first block, we output the address
7392 to finish the BB4 or BB6, and then output the function parameters. */
7394 static boolean
7395 ieee_start_block (p, addr)
7396 PTR p;
7397 bfd_vma addr;
7399 struct ieee_handle *info = (struct ieee_handle *) p;
7401 if (! ieee_change_buffer (info, &info->vars))
7402 return false;
7404 if (info->block_depth == 1)
7406 if (! ieee_write_number (info, addr)
7407 || ! ieee_output_pending_parms (info))
7408 return false;
7410 else
7412 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
7413 || ! ieee_write_byte (info, 6)
7414 || ! ieee_write_number (info, 0)
7415 || ! ieee_write_id (info, "")
7416 || ! ieee_write_number (info, 0)
7417 || ! ieee_write_number (info, 0)
7418 || ! ieee_write_number (info, addr))
7419 return false;
7422 if (! ieee_start_range (info, addr))
7423 return false;
7425 ++info->block_depth;
7427 return true;
7430 /* End a block. */
7432 static boolean
7433 ieee_end_block (p, addr)
7434 PTR p;
7435 bfd_vma addr;
7437 struct ieee_handle *info = (struct ieee_handle *) p;
7439 /* The address we are given is the end of the block, but IEEE seems
7440 to want to the address of the last byte in the block, so we
7441 subtract one. */
7442 if (! ieee_change_buffer (info, &info->vars)
7443 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
7444 || ! ieee_write_number (info, addr - 1))
7445 return false;
7447 if (! ieee_end_range (info, addr))
7448 return false;
7450 --info->block_depth;
7452 if (addr > info->highaddr)
7453 info->highaddr = addr;
7455 return true;
7458 /* End a function. */
7460 static boolean
7461 ieee_end_function (p)
7462 PTR p;
7464 struct ieee_handle *info = (struct ieee_handle *) p;
7466 assert (info->block_depth == 1);
7468 --info->block_depth;
7470 /* Now we can finish up fntype, and add it to the typdef section.
7471 At this point, fntype is the 'x' type up to the argument count,
7472 and fnargs is the argument types. We must add the argument
7473 count, and we must add the level. FIXME: We don't record varargs
7474 functions correctly. In fact, stabs debugging does not give us
7475 enough information to do so. */
7476 if (! ieee_change_buffer (info, &info->fntype)
7477 || ! ieee_write_number (info, info->fnargcount)
7478 || ! ieee_change_buffer (info, &info->fnargs)
7479 || ! ieee_write_number (info, 0))
7480 return false;
7482 /* Make sure the typdef block has been started. */
7483 if (ieee_buffer_emptyp (&info->types))
7485 if (! ieee_change_buffer (info, &info->types)
7486 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
7487 || ! ieee_write_byte (info, 1)
7488 || ! ieee_write_number (info, 0)
7489 || ! ieee_write_id (info, info->modname))
7490 return false;
7493 if (! ieee_append_buffer (info, &info->types, &info->fntype)
7494 || ! ieee_append_buffer (info, &info->types, &info->fnargs))
7495 return false;
7497 info->fnname = NULL;
7498 if (! ieee_init_buffer (info, &info->fntype)
7499 || ! ieee_init_buffer (info, &info->fnargs))
7500 return false;
7501 info->fnargcount = 0;
7503 return true;
7506 /* Record line number information. */
7508 static boolean
7509 ieee_lineno (p, filename, lineno, addr)
7510 PTR p;
7511 const char *filename;
7512 unsigned long lineno;
7513 bfd_vma addr;
7515 struct ieee_handle *info = (struct ieee_handle *) p;
7517 assert (info->filename != NULL);
7519 /* The HP simulator seems to get confused when more than one line is
7520 listed for the same address, at least if they are in different
7521 files. We handle this by always listing the last line for a
7522 given address, since that seems to be the one that gdb uses. */
7523 if (info->pending_lineno_filename != NULL
7524 && addr != info->pending_lineno_addr)
7526 /* Make sure we have a line number block. */
7527 if (! ieee_buffer_emptyp (&info->linenos))
7529 if (! ieee_change_buffer (info, &info->linenos))
7530 return false;
7532 else
7534 info->lineno_name_indx = info->name_indx;
7535 ++info->name_indx;
7536 if (! ieee_change_buffer (info, &info->linenos)
7537 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
7538 || ! ieee_write_byte (info, 5)
7539 || ! ieee_write_number (info, 0)
7540 || ! ieee_write_id (info, info->filename)
7541 || ! ieee_write_byte (info, (int) ieee_nn_record)
7542 || ! ieee_write_number (info, info->lineno_name_indx)
7543 || ! ieee_write_id (info, ""))
7544 return false;
7545 info->lineno_filename = info->filename;
7548 if (strcmp (info->pending_lineno_filename, info->lineno_filename) != 0)
7550 if (strcmp (info->filename, info->lineno_filename) != 0)
7552 /* We were not in the main file. Close the block for the
7553 included file. */
7554 if (! ieee_write_byte (info, (int) ieee_be_record_enum))
7555 return false;
7556 if (strcmp (info->filename, info->pending_lineno_filename) == 0)
7558 /* We need a new NN record, and we aren't about to
7559 output one. */
7560 info->lineno_name_indx = info->name_indx;
7561 ++info->name_indx;
7562 if (! ieee_write_byte (info, (int) ieee_nn_record)
7563 || ! ieee_write_number (info, info->lineno_name_indx)
7564 || ! ieee_write_id (info, ""))
7565 return false;
7568 if (strcmp (info->filename, info->pending_lineno_filename) != 0)
7570 /* We are not changing to the main file. Open a block for
7571 the new included file. */
7572 info->lineno_name_indx = info->name_indx;
7573 ++info->name_indx;
7574 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
7575 || ! ieee_write_byte (info, 5)
7576 || ! ieee_write_number (info, 0)
7577 || ! ieee_write_id (info, info->pending_lineno_filename)
7578 || ! ieee_write_byte (info, (int) ieee_nn_record)
7579 || ! ieee_write_number (info, info->lineno_name_indx)
7580 || ! ieee_write_id (info, ""))
7581 return false;
7583 info->lineno_filename = info->pending_lineno_filename;
7586 if (! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7587 || ! ieee_write_number (info, info->lineno_name_indx)
7588 || ! ieee_write_number (info, 0)
7589 || ! ieee_write_number (info, 7)
7590 || ! ieee_write_number (info, info->pending_lineno)
7591 || ! ieee_write_number (info, 0)
7592 || ! ieee_write_asn (info, info->lineno_name_indx,
7593 info->pending_lineno_addr))
7594 return false;
7597 if (addr < info->highaddr)
7599 info->pending_lineno_filename = filename;
7600 info->pending_lineno = lineno;
7601 info->pending_lineno_addr = addr;
7604 return true;