2002-10-02 Nathanael Nerode <neroden@gcc.gnu.org>
[binutils.git] / binutils / ieee.c
blob4735fb31987b104aec5438fa6010794e74eace55
1 /* ieee.c -- Read and write IEEE-695 debugging information.
2 Copyright 1996, 1998, 2000, 2001, 2002 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"
33 #include "filenames.h"
35 /* This structure holds an entry on the block stack. */
37 struct ieee_block
39 /* The kind of block. */
40 int kind;
41 /* The source file name, for a BB5 block. */
42 const char *filename;
43 /* The index of the function type, for a BB4 or BB6 block. */
44 unsigned int fnindx;
45 /* True if this function is being skipped. */
46 boolean skip;
49 /* This structure is the block stack. */
51 #define BLOCKSTACK_SIZE (16)
53 struct ieee_blockstack
55 /* The stack pointer. */
56 struct ieee_block *bsp;
57 /* The stack. */
58 struct ieee_block stack[BLOCKSTACK_SIZE];
61 /* This structure holds information for a variable. */
63 struct ieee_var
65 /* Start of name. */
66 const char *name;
67 /* Length of name. */
68 unsigned long namlen;
69 /* Type. */
70 debug_type type;
71 /* Slot if we make an indirect type. */
72 debug_type *pslot;
73 /* Kind of variable or function. */
74 enum
76 IEEE_UNKNOWN,
77 IEEE_EXTERNAL,
78 IEEE_GLOBAL,
79 IEEE_STATIC,
80 IEEE_LOCAL,
81 IEEE_FUNCTION
82 } kind;
85 /* This structure holds all the variables. */
87 struct ieee_vars
89 /* Number of slots allocated. */
90 unsigned int alloc;
91 /* Variables. */
92 struct ieee_var *vars;
95 /* This structure holds information for a type. We need this because
96 we don't want to represent bitfields as real types. */
98 struct ieee_type
100 /* Type. */
101 debug_type type;
102 /* Slot if this is type is referenced before it is defined. */
103 debug_type *pslot;
104 /* Slots for arguments if we make indirect types for them. */
105 debug_type *arg_slots;
106 /* If this is a bitfield, this is the size in bits. If this is not
107 a bitfield, this is zero. */
108 unsigned long bitsize;
111 /* This structure holds all the type information. */
113 struct ieee_types
115 /* Number of slots allocated. */
116 unsigned int alloc;
117 /* Types. */
118 struct ieee_type *types;
119 /* Builtin types. */
120 #define BUILTIN_TYPE_COUNT (60)
121 debug_type builtins[BUILTIN_TYPE_COUNT];
124 /* This structure holds a linked last of structs with their tag names,
125 so that we can convert them to C++ classes if necessary. */
127 struct ieee_tag
129 /* Next tag. */
130 struct ieee_tag *next;
131 /* This tag name. */
132 const char *name;
133 /* The type of the tag. */
134 debug_type type;
135 /* The tagged type is an indirect type pointing at this slot. */
136 debug_type slot;
137 /* This is an array of slots used when a field type is converted
138 into a indirect type, in case it needs to be later converted into
139 a reference type. */
140 debug_type *fslots;
143 /* This structure holds the information we pass around to the parsing
144 functions. */
146 struct ieee_info
148 /* The debugging handle. */
149 PTR dhandle;
150 /* The BFD. */
151 bfd *abfd;
152 /* The start of the bytes to be parsed. */
153 const bfd_byte *bytes;
154 /* The end of the bytes to be parsed. */
155 const bfd_byte *pend;
156 /* The block stack. */
157 struct ieee_blockstack blockstack;
158 /* Whether we have seen a BB1 or BB2. */
159 boolean saw_filename;
160 /* The variables. */
161 struct ieee_vars vars;
162 /* The global variables, after a global typedef block. */
163 struct ieee_vars *global_vars;
164 /* The types. */
165 struct ieee_types types;
166 /* The global types, after a global typedef block. */
167 struct ieee_types *global_types;
168 /* The list of tagged structs. */
169 struct ieee_tag *tags;
172 /* Basic builtin types, not including the pointers. */
174 enum builtin_types
176 builtin_unknown = 0,
177 builtin_void = 1,
178 builtin_signed_char = 2,
179 builtin_unsigned_char = 3,
180 builtin_signed_short_int = 4,
181 builtin_unsigned_short_int = 5,
182 builtin_signed_long = 6,
183 builtin_unsigned_long = 7,
184 builtin_signed_long_long = 8,
185 builtin_unsigned_long_long = 9,
186 builtin_float = 10,
187 builtin_double = 11,
188 builtin_long_double = 12,
189 builtin_long_long_double = 13,
190 builtin_quoted_string = 14,
191 builtin_instruction_address = 15,
192 builtin_int = 16,
193 builtin_unsigned = 17,
194 builtin_unsigned_int = 18,
195 builtin_char = 19,
196 builtin_long = 20,
197 builtin_short = 21,
198 builtin_unsigned_short = 22,
199 builtin_short_int = 23,
200 builtin_signed_short = 24,
201 builtin_bcd_float = 25
204 /* These are the values found in the derivation flags of a 'b'
205 component record of a 'T' type extension record in a C++ pmisc
206 record. These are bitmasks. */
208 /* Set for a private base class, clear for a public base class.
209 Protected base classes are not supported. */
210 #define BASEFLAGS_PRIVATE (0x1)
211 /* Set for a virtual base class. */
212 #define BASEFLAGS_VIRTUAL (0x2)
213 /* Set for a friend class, clear for a base class. */
214 #define BASEFLAGS_FRIEND (0x10)
216 /* These are the values found in the specs flags of a 'd', 'm', or 'v'
217 component record of a 'T' type extension record in a C++ pmisc
218 record. The same flags are used for a 'M' record in a C++ pmisc
219 record. */
221 /* The lower two bits hold visibility information. */
222 #define CXXFLAGS_VISIBILITY (0x3)
223 /* This value in the lower two bits indicates a public member. */
224 #define CXXFLAGS_VISIBILITY_PUBLIC (0x0)
225 /* This value in the lower two bits indicates a private member. */
226 #define CXXFLAGS_VISIBILITY_PRIVATE (0x1)
227 /* This value in the lower two bits indicates a protected member. */
228 #define CXXFLAGS_VISIBILITY_PROTECTED (0x2)
229 /* Set for a static member. */
230 #define CXXFLAGS_STATIC (0x4)
231 /* Set for a virtual override. */
232 #define CXXFLAGS_OVERRIDE (0x8)
233 /* Set for a friend function. */
234 #define CXXFLAGS_FRIEND (0x10)
235 /* Set for a const function. */
236 #define CXXFLAGS_CONST (0x20)
237 /* Set for a volatile function. */
238 #define CXXFLAGS_VOLATILE (0x40)
239 /* Set for an overloaded function. */
240 #define CXXFLAGS_OVERLOADED (0x80)
241 /* Set for an operator function. */
242 #define CXXFLAGS_OPERATOR (0x100)
243 /* Set for a constructor or destructor. */
244 #define CXXFLAGS_CTORDTOR (0x400)
245 /* Set for a constructor. */
246 #define CXXFLAGS_CTOR (0x200)
247 /* Set for an inline function. */
248 #define CXXFLAGS_INLINE (0x800)
250 /* Local functions. */
252 static void ieee_error
253 PARAMS ((struct ieee_info *, const bfd_byte *, const char *));
254 static void ieee_eof PARAMS ((struct ieee_info *));
255 static char *savestring PARAMS ((const char *, unsigned long));
256 static boolean ieee_read_number
257 PARAMS ((struct ieee_info *, const bfd_byte **, bfd_vma *));
258 static boolean ieee_read_optional_number
259 PARAMS ((struct ieee_info *, const bfd_byte **, bfd_vma *, boolean *));
260 static boolean ieee_read_id
261 PARAMS ((struct ieee_info *, const bfd_byte **, const char **,
262 unsigned long *));
263 static boolean ieee_read_optional_id
264 PARAMS ((struct ieee_info *, const bfd_byte **, const char **,
265 unsigned long *, boolean *));
266 static boolean ieee_read_expression
267 PARAMS ((struct ieee_info *, const bfd_byte **, bfd_vma *));
268 static debug_type ieee_builtin_type
269 PARAMS ((struct ieee_info *, const bfd_byte *, unsigned int));
270 static boolean ieee_alloc_type
271 PARAMS ((struct ieee_info *, unsigned int, boolean));
272 static boolean ieee_read_type_index
273 PARAMS ((struct ieee_info *, const bfd_byte **, debug_type *));
274 static int ieee_regno_to_genreg PARAMS ((bfd *, int));
275 static int ieee_genreg_to_regno PARAMS ((bfd *, int));
276 static boolean parse_ieee_bb PARAMS ((struct ieee_info *, const bfd_byte **));
277 static boolean parse_ieee_be PARAMS ((struct ieee_info *, const bfd_byte **));
278 static boolean parse_ieee_nn PARAMS ((struct ieee_info *, const bfd_byte **));
279 static boolean parse_ieee_ty PARAMS ((struct ieee_info *, const bfd_byte **));
280 static boolean parse_ieee_atn PARAMS ((struct ieee_info *, const bfd_byte **));
281 static boolean ieee_read_cxx_misc
282 PARAMS ((struct ieee_info *, const bfd_byte **, unsigned long));
283 static boolean ieee_read_cxx_class
284 PARAMS ((struct ieee_info *, const bfd_byte **, unsigned long));
285 static boolean ieee_read_cxx_defaults
286 PARAMS ((struct ieee_info *, const bfd_byte **, unsigned long));
287 static boolean ieee_read_reference
288 PARAMS ((struct ieee_info *, const bfd_byte **));
289 static boolean ieee_require_asn
290 PARAMS ((struct ieee_info *, const bfd_byte **, bfd_vma *));
291 static boolean ieee_require_atn65
292 PARAMS ((struct ieee_info *, const bfd_byte **, const char **,
293 unsigned long *));
295 /* Report an error in the IEEE debugging information. */
297 static void
298 ieee_error (info, p, s)
299 struct ieee_info *info;
300 const bfd_byte *p;
301 const char *s;
303 if (p != NULL)
304 fprintf (stderr, "%s: 0x%lx: %s (0x%x)\n", bfd_get_filename (info->abfd),
305 (unsigned long) (p - info->bytes), s, *p);
306 else
307 fprintf (stderr, "%s: %s\n", bfd_get_filename (info->abfd), s);
310 /* Report an unexpected EOF in the IEEE debugging information. */
312 static void
313 ieee_eof (info)
314 struct ieee_info *info;
316 ieee_error (info, (const bfd_byte *) NULL,
317 _("unexpected end of debugging information"));
320 /* Save a string in memory. */
322 static char *
323 savestring (start, len)
324 const char *start;
325 unsigned long len;
327 char *ret;
329 ret = (char *) xmalloc (len + 1);
330 memcpy (ret, start, len);
331 ret[len] = '\0';
332 return ret;
335 /* Read a number which must be present in an IEEE file. */
337 static boolean
338 ieee_read_number (info, pp, pv)
339 struct ieee_info *info;
340 const bfd_byte **pp;
341 bfd_vma *pv;
343 return ieee_read_optional_number (info, pp, pv, (boolean *) NULL);
346 /* Read a number in an IEEE file. If ppresent is not NULL, the number
347 need not be there. */
349 static boolean
350 ieee_read_optional_number (info, pp, pv, ppresent)
351 struct ieee_info *info;
352 const bfd_byte **pp;
353 bfd_vma *pv;
354 boolean *ppresent;
356 ieee_record_enum_type b;
358 if (*pp >= info->pend)
360 if (ppresent != NULL)
362 *ppresent = false;
363 return true;
365 ieee_eof (info);
366 return false;
369 b = (ieee_record_enum_type) **pp;
370 ++*pp;
372 if (b <= ieee_number_end_enum)
374 *pv = (bfd_vma) b;
375 if (ppresent != NULL)
376 *ppresent = true;
377 return true;
380 if (b >= ieee_number_repeat_start_enum && b <= ieee_number_repeat_end_enum)
382 unsigned int i;
384 i = (int) b - (int) ieee_number_repeat_start_enum;
385 if (*pp + i - 1 >= info->pend)
387 ieee_eof (info);
388 return false;
391 *pv = 0;
392 for (; i > 0; i--)
394 *pv <<= 8;
395 *pv += **pp;
396 ++*pp;
399 if (ppresent != NULL)
400 *ppresent = true;
402 return true;
405 if (ppresent != NULL)
407 --*pp;
408 *ppresent = false;
409 return true;
412 ieee_error (info, *pp - 1, _("invalid number"));
413 return false;
416 /* Read a required string from an IEEE file. */
418 static boolean
419 ieee_read_id (info, pp, pname, pnamlen)
420 struct ieee_info *info;
421 const bfd_byte **pp;
422 const char **pname;
423 unsigned long *pnamlen;
425 return ieee_read_optional_id (info, pp, pname, pnamlen, (boolean *) NULL);
428 /* Read a string from an IEEE file. If ppresent is not NULL, the
429 string is optional. */
431 static boolean
432 ieee_read_optional_id (info, pp, pname, pnamlen, ppresent)
433 struct ieee_info *info;
434 const bfd_byte **pp;
435 const char **pname;
436 unsigned long *pnamlen;
437 boolean *ppresent;
439 bfd_byte b;
440 unsigned long len;
442 if (*pp >= info->pend)
444 ieee_eof (info);
445 return false;
448 b = **pp;
449 ++*pp;
451 if (b <= 0x7f)
452 len = b;
453 else if ((ieee_record_enum_type) b == ieee_extension_length_1_enum)
455 len = **pp;
456 ++*pp;
458 else if ((ieee_record_enum_type) b == ieee_extension_length_2_enum)
460 len = (**pp << 8) + (*pp)[1];
461 *pp += 2;
463 else
465 if (ppresent != NULL)
467 --*pp;
468 *ppresent = false;
469 return true;
471 ieee_error (info, *pp - 1, _("invalid string length"));
472 return false;
475 if ((unsigned long) (info->pend - *pp) < len)
477 ieee_eof (info);
478 return false;
481 *pname = (const char *) *pp;
482 *pnamlen = len;
483 *pp += len;
485 if (ppresent != NULL)
486 *ppresent = true;
488 return true;
491 /* Read an expression from an IEEE file. Since this code is only used
492 to parse debugging information, I haven't bothered to write a full
493 blown IEEE expression parser. I've only thrown in the things I've
494 seen in debugging information. This can be easily extended if
495 necessary. */
497 static boolean
498 ieee_read_expression (info, pp, pv)
499 struct ieee_info *info;
500 const bfd_byte **pp;
501 bfd_vma *pv;
503 const bfd_byte *expr_start;
504 #define EXPR_STACK_SIZE (10)
505 bfd_vma expr_stack[EXPR_STACK_SIZE];
506 bfd_vma *esp;
508 expr_start = *pp;
510 esp = expr_stack;
512 while (1)
514 const bfd_byte *start;
515 bfd_vma val;
516 boolean present;
517 ieee_record_enum_type c;
519 start = *pp;
521 if (! ieee_read_optional_number (info, pp, &val, &present))
522 return false;
524 if (present)
526 if (esp - expr_stack >= EXPR_STACK_SIZE)
528 ieee_error (info, start, _("expression stack overflow"));
529 return false;
531 *esp++ = val;
532 continue;
535 c = (ieee_record_enum_type) **pp;
537 if (c >= ieee_module_beginning_enum)
538 break;
540 ++*pp;
542 if (c == ieee_comma)
543 break;
545 switch (c)
547 default:
548 ieee_error (info, start, _("unsupported IEEE expression operator"));
549 break;
551 case ieee_variable_R_enum:
553 bfd_vma indx;
554 asection *s;
556 if (! ieee_read_number (info, pp, &indx))
557 return false;
558 for (s = info->abfd->sections; s != NULL; s = s->next)
559 if ((bfd_vma) s->target_index == indx)
560 break;
561 if (s == NULL)
563 ieee_error (info, start, _("unknown section"));
564 return false;
567 if (esp - expr_stack >= EXPR_STACK_SIZE)
569 ieee_error (info, start, _("expression stack overflow"));
570 return false;
573 *esp++ = bfd_get_section_vma (info->abfd, s);
575 break;
577 case ieee_function_plus_enum:
578 case ieee_function_minus_enum:
580 bfd_vma v1, v2;
582 if (esp - expr_stack < 2)
584 ieee_error (info, start, _("expression stack underflow"));
585 return false;
588 v1 = *--esp;
589 v2 = *--esp;
590 *esp++ = v1 + v2;
592 break;
596 if (esp - 1 != expr_stack)
598 ieee_error (info, expr_start, _("expression stack mismatch"));
599 return false;
602 *pv = *--esp;
604 return true;
607 /* Return an IEEE builtin type. */
609 static debug_type
610 ieee_builtin_type (info, p, indx)
611 struct ieee_info *info;
612 const bfd_byte *p;
613 unsigned int indx;
615 PTR dhandle;
616 debug_type type;
617 const char *name;
619 if (indx < BUILTIN_TYPE_COUNT
620 && info->types.builtins[indx] != DEBUG_TYPE_NULL)
621 return info->types.builtins[indx];
623 dhandle = info->dhandle;
625 if (indx >= 32 && indx < 64)
627 type = debug_make_pointer_type (dhandle,
628 ieee_builtin_type (info, p, indx - 32));
629 assert (indx < BUILTIN_TYPE_COUNT);
630 info->types.builtins[indx] = type;
631 return type;
634 switch ((enum builtin_types) indx)
636 default:
637 ieee_error (info, p, _("unknown builtin type"));
638 return NULL;
640 case builtin_unknown:
641 type = debug_make_void_type (dhandle);
642 name = NULL;
643 break;
645 case builtin_void:
646 type = debug_make_void_type (dhandle);
647 name = "void";
648 break;
650 case builtin_signed_char:
651 type = debug_make_int_type (dhandle, 1, false);
652 name = "signed char";
653 break;
655 case builtin_unsigned_char:
656 type = debug_make_int_type (dhandle, 1, true);
657 name = "unsigned char";
658 break;
660 case builtin_signed_short_int:
661 type = debug_make_int_type (dhandle, 2, false);
662 name = "signed short int";
663 break;
665 case builtin_unsigned_short_int:
666 type = debug_make_int_type (dhandle, 2, true);
667 name = "unsigned short int";
668 break;
670 case builtin_signed_long:
671 type = debug_make_int_type (dhandle, 4, false);
672 name = "signed long";
673 break;
675 case builtin_unsigned_long:
676 type = debug_make_int_type (dhandle, 4, true);
677 name = "unsigned long";
678 break;
680 case builtin_signed_long_long:
681 type = debug_make_int_type (dhandle, 8, false);
682 name = "signed long long";
683 break;
685 case builtin_unsigned_long_long:
686 type = debug_make_int_type (dhandle, 8, true);
687 name = "unsigned long long";
688 break;
690 case builtin_float:
691 type = debug_make_float_type (dhandle, 4);
692 name = "float";
693 break;
695 case builtin_double:
696 type = debug_make_float_type (dhandle, 8);
697 name = "double";
698 break;
700 case builtin_long_double:
701 /* FIXME: The size for this type should depend upon the
702 processor. */
703 type = debug_make_float_type (dhandle, 12);
704 name = "long double";
705 break;
707 case builtin_long_long_double:
708 type = debug_make_float_type (dhandle, 16);
709 name = "long long double";
710 break;
712 case builtin_quoted_string:
713 type = debug_make_array_type (dhandle,
714 ieee_builtin_type (info, p,
715 ((unsigned int)
716 builtin_char)),
717 ieee_builtin_type (info, p,
718 ((unsigned int)
719 builtin_int)),
720 0, -1, true);
721 name = "QUOTED STRING";
722 break;
724 case builtin_instruction_address:
725 /* FIXME: This should be a code address. */
726 type = debug_make_int_type (dhandle, 4, true);
727 name = "instruction address";
728 break;
730 case builtin_int:
731 /* FIXME: The size for this type should depend upon the
732 processor. */
733 type = debug_make_int_type (dhandle, 4, false);
734 name = "int";
735 break;
737 case builtin_unsigned:
738 /* FIXME: The size for this type should depend upon the
739 processor. */
740 type = debug_make_int_type (dhandle, 4, true);
741 name = "unsigned";
742 break;
744 case builtin_unsigned_int:
745 /* FIXME: The size for this type should depend upon the
746 processor. */
747 type = debug_make_int_type (dhandle, 4, true);
748 name = "unsigned int";
749 break;
751 case builtin_char:
752 type = debug_make_int_type (dhandle, 1, false);
753 name = "char";
754 break;
756 case builtin_long:
757 type = debug_make_int_type (dhandle, 4, false);
758 name = "long";
759 break;
761 case builtin_short:
762 type = debug_make_int_type (dhandle, 2, false);
763 name = "short";
764 break;
766 case builtin_unsigned_short:
767 type = debug_make_int_type (dhandle, 2, true);
768 name = "unsigned short";
769 break;
771 case builtin_short_int:
772 type = debug_make_int_type (dhandle, 2, false);
773 name = "short int";
774 break;
776 case builtin_signed_short:
777 type = debug_make_int_type (dhandle, 2, false);
778 name = "signed short";
779 break;
781 case builtin_bcd_float:
782 ieee_error (info, p, _("BCD float type not supported"));
783 return DEBUG_TYPE_NULL;
786 if (name != NULL)
787 type = debug_name_type (dhandle, name, type);
789 assert (indx < BUILTIN_TYPE_COUNT);
791 info->types.builtins[indx] = type;
793 return type;
796 /* Allocate more space in the type table. If ref is true, this is a
797 reference to the type; if it is not already defined, we should set
798 up an indirect type. */
800 static boolean
801 ieee_alloc_type (info, indx, ref)
802 struct ieee_info *info;
803 unsigned int indx;
804 boolean ref;
806 unsigned int nalloc;
807 register struct ieee_type *t;
808 struct ieee_type *tend;
810 if (indx >= info->types.alloc)
812 nalloc = info->types.alloc;
813 if (nalloc == 0)
814 nalloc = 4;
815 while (indx >= nalloc)
816 nalloc *= 2;
818 info->types.types = ((struct ieee_type *)
819 xrealloc (info->types.types,
820 nalloc * sizeof *info->types.types));
822 memset (info->types.types + info->types.alloc, 0,
823 (nalloc - info->types.alloc) * sizeof *info->types.types);
825 tend = info->types.types + nalloc;
826 for (t = info->types.types + info->types.alloc; t < tend; t++)
827 t->type = DEBUG_TYPE_NULL;
829 info->types.alloc = nalloc;
832 if (ref)
834 t = info->types.types + indx;
835 if (t->type == NULL)
837 t->pslot = (debug_type *) xmalloc (sizeof *t->pslot);
838 *t->pslot = DEBUG_TYPE_NULL;
839 t->type = debug_make_indirect_type (info->dhandle, t->pslot,
840 (const char *) NULL);
841 if (t->type == NULL)
842 return false;
846 return true;
849 /* Read a type index and return the corresponding type. */
851 static boolean
852 ieee_read_type_index (info, pp, ptype)
853 struct ieee_info *info;
854 const bfd_byte **pp;
855 debug_type *ptype;
857 const bfd_byte *start;
858 bfd_vma indx;
860 start = *pp;
862 if (! ieee_read_number (info, pp, &indx))
863 return false;
865 if (indx < 256)
867 *ptype = ieee_builtin_type (info, start, indx);
868 if (*ptype == NULL)
869 return false;
870 return true;
873 indx -= 256;
874 if (! ieee_alloc_type (info, indx, true))
875 return false;
877 *ptype = info->types.types[indx].type;
879 return true;
882 /* Parse IEEE debugging information for a file. This is passed the
883 bytes which compose the Debug Information Part of an IEEE file. */
885 boolean
886 parse_ieee (dhandle, abfd, bytes, len)
887 PTR dhandle;
888 bfd *abfd;
889 const bfd_byte *bytes;
890 bfd_size_type len;
892 struct ieee_info info;
893 unsigned int i;
894 const bfd_byte *p, *pend;
896 info.dhandle = dhandle;
897 info.abfd = abfd;
898 info.bytes = bytes;
899 info.pend = bytes + len;
900 info.blockstack.bsp = info.blockstack.stack;
901 info.saw_filename = false;
902 info.vars.alloc = 0;
903 info.vars.vars = NULL;
904 info.global_vars = NULL;
905 info.types.alloc = 0;
906 info.types.types = NULL;
907 info.global_types = NULL;
908 info.tags = NULL;
909 for (i = 0; i < BUILTIN_TYPE_COUNT; i++)
910 info.types.builtins[i] = DEBUG_TYPE_NULL;
912 p = bytes;
913 pend = info.pend;
914 while (p < pend)
916 const bfd_byte *record_start;
917 ieee_record_enum_type c;
919 record_start = p;
921 c = (ieee_record_enum_type) *p++;
923 if (c == ieee_at_record_enum)
924 c = (ieee_record_enum_type) (((unsigned int) c << 8) | *p++);
926 if (c <= ieee_number_repeat_end_enum)
928 ieee_error (&info, record_start, _("unexpected number"));
929 return false;
932 switch (c)
934 default:
935 ieee_error (&info, record_start, _("unexpected record type"));
936 return false;
938 case ieee_bb_record_enum:
939 if (! parse_ieee_bb (&info, &p))
940 return false;
941 break;
943 case ieee_be_record_enum:
944 if (! parse_ieee_be (&info, &p))
945 return false;
946 break;
948 case ieee_nn_record:
949 if (! parse_ieee_nn (&info, &p))
950 return false;
951 break;
953 case ieee_ty_record_enum:
954 if (! parse_ieee_ty (&info, &p))
955 return false;
956 break;
958 case ieee_atn_record_enum:
959 if (! parse_ieee_atn (&info, &p))
960 return false;
961 break;
965 if (info.blockstack.bsp != info.blockstack.stack)
967 ieee_error (&info, (const bfd_byte *) NULL,
968 _("blocks left on stack at end"));
969 return false;
972 return true;
975 /* Handle an IEEE BB record. */
977 static boolean
978 parse_ieee_bb (info, pp)
979 struct ieee_info *info;
980 const bfd_byte **pp;
982 const bfd_byte *block_start;
983 bfd_byte b;
984 bfd_vma size;
985 const char *name;
986 unsigned long namlen;
987 char *namcopy = NULL;
988 unsigned int fnindx;
989 boolean skip;
991 block_start = *pp;
993 b = **pp;
994 ++*pp;
996 if (! ieee_read_number (info, pp, &size)
997 || ! ieee_read_id (info, pp, &name, &namlen))
998 return false;
1000 fnindx = (unsigned int) -1;
1001 skip = false;
1003 switch (b)
1005 case 1:
1006 /* BB1: Type definitions local to a module. */
1007 namcopy = savestring (name, namlen);
1008 if (namcopy == NULL)
1009 return false;
1010 if (! debug_set_filename (info->dhandle, namcopy))
1011 return false;
1012 info->saw_filename = true;
1014 /* Discard any variables or types we may have seen before. */
1015 if (info->vars.vars != NULL)
1016 free (info->vars.vars);
1017 info->vars.vars = NULL;
1018 info->vars.alloc = 0;
1019 if (info->types.types != NULL)
1020 free (info->types.types);
1021 info->types.types = NULL;
1022 info->types.alloc = 0;
1024 /* Initialize the types to the global types. */
1025 if (info->global_types != NULL)
1027 info->types.alloc = info->global_types->alloc;
1028 info->types.types = ((struct ieee_type *)
1029 xmalloc (info->types.alloc
1030 * sizeof (*info->types.types)));
1031 memcpy (info->types.types, info->global_types->types,
1032 info->types.alloc * sizeof (*info->types.types));
1035 break;
1037 case 2:
1038 /* BB2: Global type definitions. The name is supposed to be
1039 empty, but we don't check. */
1040 if (! debug_set_filename (info->dhandle, "*global*"))
1041 return false;
1042 info->saw_filename = true;
1043 break;
1045 case 3:
1046 /* BB3: High level module block begin. We don't have to do
1047 anything here. The name is supposed to be the same as for
1048 the BB1, but we don't check. */
1049 break;
1051 case 4:
1052 /* BB4: Global function. */
1054 bfd_vma stackspace, typindx, offset;
1055 debug_type return_type;
1057 if (! ieee_read_number (info, pp, &stackspace)
1058 || ! ieee_read_number (info, pp, &typindx)
1059 || ! ieee_read_expression (info, pp, &offset))
1060 return false;
1062 /* We have no way to record the stack space. FIXME. */
1064 if (typindx < 256)
1066 return_type = ieee_builtin_type (info, block_start, typindx);
1067 if (return_type == DEBUG_TYPE_NULL)
1068 return false;
1070 else
1072 typindx -= 256;
1073 if (! ieee_alloc_type (info, typindx, true))
1074 return false;
1075 fnindx = typindx;
1076 return_type = info->types.types[typindx].type;
1077 if (debug_get_type_kind (info->dhandle, return_type)
1078 == DEBUG_KIND_FUNCTION)
1079 return_type = debug_get_return_type (info->dhandle,
1080 return_type);
1083 namcopy = savestring (name, namlen);
1084 if (namcopy == NULL)
1085 return false;
1086 if (! debug_record_function (info->dhandle, namcopy, return_type,
1087 true, offset))
1088 return false;
1090 break;
1092 case 5:
1093 /* BB5: File name for source line numbers. */
1095 unsigned int i;
1097 /* We ignore the date and time. FIXME. */
1098 for (i = 0; i < 6; i++)
1100 bfd_vma ignore;
1101 boolean present;
1103 if (! ieee_read_optional_number (info, pp, &ignore, &present))
1104 return false;
1105 if (! present)
1106 break;
1109 namcopy = savestring (name, namlen);
1110 if (namcopy == NULL)
1111 return false;
1112 if (! debug_start_source (info->dhandle, namcopy))
1113 return false;
1115 break;
1117 case 6:
1118 /* BB6: Local function or block. */
1120 bfd_vma stackspace, typindx, offset;
1122 if (! ieee_read_number (info, pp, &stackspace)
1123 || ! ieee_read_number (info, pp, &typindx)
1124 || ! ieee_read_expression (info, pp, &offset))
1125 return false;
1127 /* We have no way to record the stack space. FIXME. */
1129 if (namlen == 0)
1131 if (! debug_start_block (info->dhandle, offset))
1132 return false;
1133 /* Change b to indicate that this is a block
1134 rather than a function. */
1135 b = 0x86;
1137 else
1139 /* The MRI C++ compiler will output a fake function named
1140 __XRYCPP to hold C++ debugging information. We skip
1141 that function. This is not crucial, but it makes
1142 converting from IEEE to other debug formats work
1143 better. */
1144 if (strncmp (name, "__XRYCPP", namlen) == 0)
1145 skip = true;
1146 else
1148 debug_type return_type;
1150 if (typindx < 256)
1152 return_type = ieee_builtin_type (info, block_start,
1153 typindx);
1154 if (return_type == NULL)
1155 return false;
1157 else
1159 typindx -= 256;
1160 if (! ieee_alloc_type (info, typindx, true))
1161 return false;
1162 fnindx = typindx;
1163 return_type = info->types.types[typindx].type;
1164 if (debug_get_type_kind (info->dhandle, return_type)
1165 == DEBUG_KIND_FUNCTION)
1166 return_type = debug_get_return_type (info->dhandle,
1167 return_type);
1170 namcopy = savestring (name, namlen);
1171 if (namcopy == NULL)
1172 return false;
1173 if (! debug_record_function (info->dhandle, namcopy,
1174 return_type, false, offset))
1175 return false;
1179 break;
1181 case 10:
1182 /* BB10: Assembler module scope. In the normal case, we
1183 completely ignore all this information. FIXME. */
1185 const char *inam, *vstr;
1186 unsigned long inamlen, vstrlen;
1187 bfd_vma tool_type;
1188 boolean present;
1189 unsigned int i;
1191 if (! info->saw_filename)
1193 namcopy = savestring (name, namlen);
1194 if (namcopy == NULL)
1195 return false;
1196 if (! debug_set_filename (info->dhandle, namcopy))
1197 return false;
1198 info->saw_filename = true;
1201 if (! ieee_read_id (info, pp, &inam, &inamlen)
1202 || ! ieee_read_number (info, pp, &tool_type)
1203 || ! ieee_read_optional_id (info, pp, &vstr, &vstrlen, &present))
1204 return false;
1205 for (i = 0; i < 6; i++)
1207 bfd_vma ignore;
1209 if (! ieee_read_optional_number (info, pp, &ignore, &present))
1210 return false;
1211 if (! present)
1212 break;
1215 break;
1217 case 11:
1218 /* BB11: Module section. We completely ignore all this
1219 information. FIXME. */
1221 bfd_vma sectype, secindx, offset, map;
1222 boolean present;
1224 if (! ieee_read_number (info, pp, &sectype)
1225 || ! ieee_read_number (info, pp, &secindx)
1226 || ! ieee_read_expression (info, pp, &offset)
1227 || ! ieee_read_optional_number (info, pp, &map, &present))
1228 return false;
1230 break;
1232 default:
1233 ieee_error (info, block_start, _("unknown BB type"));
1234 return false;
1238 /* Push this block on the block stack. */
1240 if (info->blockstack.bsp >= info->blockstack.stack + BLOCKSTACK_SIZE)
1242 ieee_error (info, (const bfd_byte *) NULL, _("stack overflow"));
1243 return false;
1246 info->blockstack.bsp->kind = b;
1247 if (b == 5)
1248 info->blockstack.bsp->filename = namcopy;
1249 info->blockstack.bsp->fnindx = fnindx;
1250 info->blockstack.bsp->skip = skip;
1251 ++info->blockstack.bsp;
1253 return true;
1256 /* Handle an IEEE BE record. */
1258 static boolean
1259 parse_ieee_be (info, pp)
1260 struct ieee_info *info;
1261 const bfd_byte **pp;
1263 bfd_vma offset;
1265 if (info->blockstack.bsp <= info->blockstack.stack)
1267 ieee_error (info, *pp, _("stack underflow"));
1268 return false;
1270 --info->blockstack.bsp;
1272 switch (info->blockstack.bsp->kind)
1274 case 2:
1275 /* When we end the global typedefs block, we copy out the the
1276 contents of info->vars. This is because the variable indices
1277 may be reused in the local blocks. However, we need to
1278 preserve them so that we can locate a function returning a
1279 reference variable whose type is named in the global typedef
1280 block. */
1281 info->global_vars = ((struct ieee_vars *)
1282 xmalloc (sizeof *info->global_vars));
1283 info->global_vars->alloc = info->vars.alloc;
1284 info->global_vars->vars = ((struct ieee_var *)
1285 xmalloc (info->vars.alloc
1286 * sizeof (*info->vars.vars)));
1287 memcpy (info->global_vars->vars, info->vars.vars,
1288 info->vars.alloc * sizeof (*info->vars.vars));
1290 /* We also copy out the non builtin parts of info->types, since
1291 the types are discarded when we start a new block. */
1292 info->global_types = ((struct ieee_types *)
1293 xmalloc (sizeof *info->global_types));
1294 info->global_types->alloc = info->types.alloc;
1295 info->global_types->types = ((struct ieee_type *)
1296 xmalloc (info->types.alloc
1297 * sizeof (*info->types.types)));
1298 memcpy (info->global_types->types, info->types.types,
1299 info->types.alloc * sizeof (*info->types.types));
1300 memset (info->global_types->builtins, 0,
1301 sizeof (info->global_types->builtins));
1303 break;
1305 case 4:
1306 case 6:
1307 if (! ieee_read_expression (info, pp, &offset))
1308 return false;
1309 if (! info->blockstack.bsp->skip)
1311 if (! debug_end_function (info->dhandle, offset + 1))
1312 return false;
1314 break;
1316 case 0x86:
1317 /* This is BE6 when BB6 started a block rather than a local
1318 function. */
1319 if (! ieee_read_expression (info, pp, &offset))
1320 return false;
1321 if (! debug_end_block (info->dhandle, offset + 1))
1322 return false;
1323 break;
1325 case 5:
1326 /* When we end a BB5, we look up the stack for the last BB5, if
1327 there is one, so that we can call debug_start_source. */
1328 if (info->blockstack.bsp > info->blockstack.stack)
1330 struct ieee_block *bl;
1332 bl = info->blockstack.bsp;
1335 --bl;
1336 if (bl->kind == 5)
1338 if (! debug_start_source (info->dhandle, bl->filename))
1339 return false;
1340 break;
1343 while (bl != info->blockstack.stack);
1345 break;
1347 case 11:
1348 if (! ieee_read_expression (info, pp, &offset))
1349 return false;
1350 /* We just ignore the module size. FIXME. */
1351 break;
1353 default:
1354 /* Other block types do not have any trailing information. */
1355 break;
1358 return true;
1361 /* Parse an NN record. */
1363 static boolean
1364 parse_ieee_nn (info, pp)
1365 struct ieee_info *info;
1366 const bfd_byte **pp;
1368 const bfd_byte *nn_start;
1369 bfd_vma varindx;
1370 const char *name;
1371 unsigned long namlen;
1373 nn_start = *pp;
1375 if (! ieee_read_number (info, pp, &varindx)
1376 || ! ieee_read_id (info, pp, &name, &namlen))
1377 return false;
1379 if (varindx < 32)
1381 ieee_error (info, nn_start, _("illegal variable index"));
1382 return false;
1384 varindx -= 32;
1386 if (varindx >= info->vars.alloc)
1388 unsigned int alloc;
1390 alloc = info->vars.alloc;
1391 if (alloc == 0)
1392 alloc = 4;
1393 while (varindx >= alloc)
1394 alloc *= 2;
1395 info->vars.vars = ((struct ieee_var *)
1396 xrealloc (info->vars.vars,
1397 alloc * sizeof *info->vars.vars));
1398 memset (info->vars.vars + info->vars.alloc, 0,
1399 (alloc - info->vars.alloc) * sizeof *info->vars.vars);
1400 info->vars.alloc = alloc;
1403 info->vars.vars[varindx].name = name;
1404 info->vars.vars[varindx].namlen = namlen;
1406 return true;
1409 /* Parse a TY record. */
1411 static boolean
1412 parse_ieee_ty (info, pp)
1413 struct ieee_info *info;
1414 const bfd_byte **pp;
1416 const bfd_byte *ty_start, *ty_var_start, *ty_code_start;
1417 bfd_vma typeindx, varindx, tc;
1418 PTR dhandle;
1419 boolean tag, typdef;
1420 debug_type *arg_slots;
1421 unsigned long type_bitsize;
1422 debug_type type;
1424 ty_start = *pp;
1426 if (! ieee_read_number (info, pp, &typeindx))
1427 return false;
1429 if (typeindx < 256)
1431 ieee_error (info, ty_start, _("illegal type index"));
1432 return false;
1435 typeindx -= 256;
1436 if (! ieee_alloc_type (info, typeindx, false))
1437 return false;
1439 if (**pp != 0xce)
1441 ieee_error (info, *pp, _("unknown TY code"));
1442 return false;
1444 ++*pp;
1446 ty_var_start = *pp;
1448 if (! ieee_read_number (info, pp, &varindx))
1449 return false;
1451 if (varindx < 32)
1453 ieee_error (info, ty_var_start, _("illegal variable index"));
1454 return false;
1456 varindx -= 32;
1458 if (varindx >= info->vars.alloc || info->vars.vars[varindx].name == NULL)
1460 ieee_error (info, ty_var_start, _("undefined variable in TY"));
1461 return false;
1464 ty_code_start = *pp;
1466 if (! ieee_read_number (info, pp, &tc))
1467 return false;
1469 dhandle = info->dhandle;
1471 tag = false;
1472 typdef = false;
1473 arg_slots = NULL;
1474 type_bitsize = 0;
1475 switch (tc)
1477 default:
1478 ieee_error (info, ty_code_start, _("unknown TY code"));
1479 return false;
1481 case '!':
1482 /* Unknown type, with size. We treat it as int. FIXME. */
1484 bfd_vma size;
1486 if (! ieee_read_number (info, pp, &size))
1487 return false;
1488 type = debug_make_int_type (dhandle, size, false);
1490 break;
1492 case 'A': /* Array. */
1493 case 'a': /* FORTRAN array in column/row order. FIXME: Not
1494 distinguished from normal array. */
1496 debug_type ele_type;
1497 bfd_vma lower, upper;
1499 if (! ieee_read_type_index (info, pp, &ele_type)
1500 || ! ieee_read_number (info, pp, &lower)
1501 || ! ieee_read_number (info, pp, &upper))
1502 return false;
1503 type = debug_make_array_type (dhandle, ele_type,
1504 ieee_builtin_type (info, ty_code_start,
1505 ((unsigned int)
1506 builtin_int)),
1507 (bfd_signed_vma) lower,
1508 (bfd_signed_vma) upper,
1509 false);
1511 break;
1513 case 'E':
1514 /* Simple enumeration. */
1516 bfd_vma size;
1517 unsigned int alloc;
1518 const char **names;
1519 unsigned int c;
1520 bfd_signed_vma *vals;
1521 unsigned int i;
1523 if (! ieee_read_number (info, pp, &size))
1524 return false;
1525 /* FIXME: we ignore the enumeration size. */
1527 alloc = 10;
1528 names = (const char **) xmalloc (alloc * sizeof *names);
1529 memset (names, 0, alloc * sizeof *names);
1530 c = 0;
1531 while (1)
1533 const char *name;
1534 unsigned long namlen;
1535 boolean present;
1537 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1538 return false;
1539 if (! present)
1540 break;
1542 if (c + 1 >= alloc)
1544 alloc += 10;
1545 names = ((const char **)
1546 xrealloc (names, alloc * sizeof *names));
1549 names[c] = savestring (name, namlen);
1550 if (names[c] == NULL)
1551 return false;
1552 ++c;
1555 names[c] = NULL;
1557 vals = (bfd_signed_vma *) xmalloc (c * sizeof *vals);
1558 for (i = 0; i < c; i++)
1559 vals[i] = i;
1561 type = debug_make_enum_type (dhandle, names, vals);
1562 tag = true;
1564 break;
1566 case 'G':
1567 /* Struct with bit fields. */
1569 bfd_vma size;
1570 unsigned int alloc;
1571 debug_field *fields;
1572 unsigned int c;
1574 if (! ieee_read_number (info, pp, &size))
1575 return false;
1577 alloc = 10;
1578 fields = (debug_field *) xmalloc (alloc * sizeof *fields);
1579 c = 0;
1580 while (1)
1582 const char *name;
1583 unsigned long namlen;
1584 boolean present;
1585 debug_type ftype;
1586 bfd_vma bitpos, bitsize;
1588 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1589 return false;
1590 if (! present)
1591 break;
1592 if (! ieee_read_type_index (info, pp, &ftype)
1593 || ! ieee_read_number (info, pp, &bitpos)
1594 || ! ieee_read_number (info, pp, &bitsize))
1595 return false;
1597 if (c + 1 >= alloc)
1599 alloc += 10;
1600 fields = ((debug_field *)
1601 xrealloc (fields, alloc * sizeof *fields));
1604 fields[c] = debug_make_field (dhandle, savestring (name, namlen),
1605 ftype, bitpos, bitsize,
1606 DEBUG_VISIBILITY_PUBLIC);
1607 if (fields[c] == NULL)
1608 return false;
1609 ++c;
1612 fields[c] = NULL;
1614 type = debug_make_struct_type (dhandle, true, size, fields);
1615 tag = true;
1617 break;
1619 case 'N':
1620 /* Enumeration. */
1622 unsigned int alloc;
1623 const char **names;
1624 bfd_signed_vma *vals;
1625 unsigned int c;
1627 alloc = 10;
1628 names = (const char **) xmalloc (alloc * sizeof *names);
1629 vals = (bfd_signed_vma *) xmalloc (alloc * sizeof *names);
1630 c = 0;
1631 while (1)
1633 const char *name;
1634 unsigned long namlen;
1635 boolean present;
1636 bfd_vma val;
1638 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1639 return false;
1640 if (! present)
1641 break;
1642 if (! ieee_read_number (info, pp, &val))
1643 return false;
1645 /* If the length of the name is zero, then the value is
1646 actually the size of the enum. We ignore this
1647 information. FIXME. */
1648 if (namlen == 0)
1649 continue;
1651 if (c + 1 >= alloc)
1653 alloc += 10;
1654 names = ((const char **)
1655 xrealloc (names, alloc * sizeof *names));
1656 vals = ((bfd_signed_vma *)
1657 xrealloc (vals, alloc * sizeof *vals));
1660 names[c] = savestring (name, namlen);
1661 if (names[c] == NULL)
1662 return false;
1663 vals[c] = (bfd_signed_vma) val;
1664 ++c;
1667 names[c] = NULL;
1669 type = debug_make_enum_type (dhandle, names, vals);
1670 tag = true;
1672 break;
1674 case 'O': /* Small pointer. We don't distinguish small and large
1675 pointers. FIXME. */
1676 case 'P': /* Large pointer. */
1678 debug_type t;
1680 if (! ieee_read_type_index (info, pp, &t))
1681 return false;
1682 type = debug_make_pointer_type (dhandle, t);
1684 break;
1686 case 'R':
1687 /* Range. */
1689 bfd_vma low, high, signedp, size;
1691 if (! ieee_read_number (info, pp, &low)
1692 || ! ieee_read_number (info, pp, &high)
1693 || ! ieee_read_number (info, pp, &signedp)
1694 || ! ieee_read_number (info, pp, &size))
1695 return false;
1697 type = debug_make_range_type (dhandle,
1698 debug_make_int_type (dhandle, size,
1699 ! signedp),
1700 (bfd_signed_vma) low,
1701 (bfd_signed_vma) high);
1703 break;
1705 case 'S': /* Struct. */
1706 case 'U': /* Union. */
1708 bfd_vma size;
1709 unsigned int alloc;
1710 debug_field *fields;
1711 unsigned int c;
1713 if (! ieee_read_number (info, pp, &size))
1714 return false;
1716 alloc = 10;
1717 fields = (debug_field *) xmalloc (alloc * sizeof *fields);
1718 c = 0;
1719 while (1)
1721 const char *name;
1722 unsigned long namlen;
1723 boolean present;
1724 bfd_vma tindx;
1725 bfd_vma offset;
1726 debug_type ftype;
1727 bfd_vma bitsize;
1729 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1730 return false;
1731 if (! present)
1732 break;
1733 if (! ieee_read_number (info, pp, &tindx)
1734 || ! ieee_read_number (info, pp, &offset))
1735 return false;
1737 if (tindx < 256)
1739 ftype = ieee_builtin_type (info, ty_code_start, tindx);
1740 bitsize = 0;
1741 offset *= 8;
1743 else
1745 struct ieee_type *t;
1747 tindx -= 256;
1748 if (! ieee_alloc_type (info, tindx, true))
1749 return false;
1750 t = info->types.types + tindx;
1751 ftype = t->type;
1752 bitsize = t->bitsize;
1753 if (bitsize == 0)
1754 offset *= 8;
1757 if (c + 1 >= alloc)
1759 alloc += 10;
1760 fields = ((debug_field *)
1761 xrealloc (fields, alloc * sizeof *fields));
1764 fields[c] = debug_make_field (dhandle, savestring (name, namlen),
1765 ftype, offset, bitsize,
1766 DEBUG_VISIBILITY_PUBLIC);
1767 if (fields[c] == NULL)
1768 return false;
1769 ++c;
1772 fields[c] = NULL;
1774 type = debug_make_struct_type (dhandle, tc == 'S', size, fields);
1775 tag = true;
1777 break;
1779 case 'T':
1780 /* Typedef. */
1781 if (! ieee_read_type_index (info, pp, &type))
1782 return false;
1783 typdef = true;
1784 break;
1786 case 'X':
1787 /* Procedure. FIXME: This is an extern declaration, which we
1788 have no way of representing. */
1790 bfd_vma attr;
1791 debug_type rtype;
1792 bfd_vma nargs;
1793 boolean present;
1794 struct ieee_var *pv;
1796 /* FIXME: We ignore the attribute and the argument names. */
1798 if (! ieee_read_number (info, pp, &attr)
1799 || ! ieee_read_type_index (info, pp, &rtype)
1800 || ! ieee_read_number (info, pp, &nargs))
1801 return false;
1804 const char *name;
1805 unsigned long namlen;
1807 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1808 return false;
1810 while (present);
1812 pv = info->vars.vars + varindx;
1813 pv->kind = IEEE_EXTERNAL;
1814 if (pv->namlen > 0
1815 && debug_get_type_kind (dhandle, rtype) == DEBUG_KIND_POINTER)
1817 /* Set up the return type as an indirect type pointing to
1818 the variable slot, so that we can change it to a
1819 reference later if appropriate. */
1820 pv->pslot = (debug_type *) xmalloc (sizeof *pv->pslot);
1821 *pv->pslot = rtype;
1822 rtype = debug_make_indirect_type (dhandle, pv->pslot,
1823 (const char *) NULL);
1826 type = debug_make_function_type (dhandle, rtype, (debug_type *) NULL,
1827 false);
1829 break;
1831 case 'V':
1832 /* Void. This is not documented, but the MRI compiler emits it. */
1833 type = debug_make_void_type (dhandle);
1834 break;
1836 case 'Z':
1837 /* Array with 0 lower bound. */
1839 debug_type etype;
1840 bfd_vma high;
1842 if (! ieee_read_type_index (info, pp, &etype)
1843 || ! ieee_read_number (info, pp, &high))
1844 return false;
1846 type = debug_make_array_type (dhandle, etype,
1847 ieee_builtin_type (info, ty_code_start,
1848 ((unsigned int)
1849 builtin_int)),
1850 0, (bfd_signed_vma) high, false);
1852 break;
1854 case 'c': /* Complex. */
1855 case 'd': /* Double complex. */
1857 const char *name;
1858 unsigned long namlen;
1860 /* FIXME: I don't know what the name means. */
1862 if (! ieee_read_id (info, pp, &name, &namlen))
1863 return false;
1865 type = debug_make_complex_type (dhandle, tc == 'c' ? 4 : 8);
1867 break;
1869 case 'f':
1870 /* Pascal file name. FIXME. */
1871 ieee_error (info, ty_code_start, _("Pascal file name not supported"));
1872 return false;
1874 case 'g':
1875 /* Bitfield type. */
1877 bfd_vma signedp, bitsize, dummy;
1878 const bfd_byte *hold;
1879 boolean present;
1881 if (! ieee_read_number (info, pp, &signedp)
1882 || ! ieee_read_number (info, pp, &bitsize))
1883 return false;
1885 /* I think the documentation says that there is a type index,
1886 but some actual files do not have one. */
1887 hold = *pp;
1888 if (! ieee_read_optional_number (info, pp, &dummy, &present))
1889 return false;
1890 if (! present)
1892 /* FIXME: This is just a guess. */
1893 type = debug_make_int_type (dhandle, 4,
1894 signedp ? false : true);
1896 else
1898 *pp = hold;
1899 if (! ieee_read_type_index (info, pp, &type))
1900 return false;
1902 type_bitsize = bitsize;
1904 break;
1906 case 'n':
1907 /* Qualifier. */
1909 bfd_vma kind;
1910 debug_type t;
1912 if (! ieee_read_number (info, pp, &kind)
1913 || ! ieee_read_type_index (info, pp, &t))
1914 return false;
1916 switch (kind)
1918 default:
1919 ieee_error (info, ty_start, _("unsupported qualifier"));
1920 return false;
1922 case 1:
1923 type = debug_make_const_type (dhandle, t);
1924 break;
1926 case 2:
1927 type = debug_make_volatile_type (dhandle, t);
1928 break;
1931 break;
1933 case 's':
1934 /* Set. */
1936 bfd_vma size;
1937 debug_type etype;
1939 if (! ieee_read_number (info, pp, &size)
1940 || ! ieee_read_type_index (info, pp, &etype))
1941 return false;
1943 /* FIXME: We ignore the size. */
1945 type = debug_make_set_type (dhandle, etype, false);
1947 break;
1949 case 'x':
1950 /* Procedure with compiler dependencies. */
1952 struct ieee_var *pv;
1953 bfd_vma attr, frame_type, push_mask, nargs, level, father;
1954 debug_type rtype;
1955 debug_type *arg_types;
1956 boolean varargs;
1957 boolean present;
1959 /* FIXME: We ignore some of this information. */
1961 pv = info->vars.vars + varindx;
1963 if (! ieee_read_number (info, pp, &attr)
1964 || ! ieee_read_number (info, pp, &frame_type)
1965 || ! ieee_read_number (info, pp, &push_mask)
1966 || ! ieee_read_type_index (info, pp, &rtype)
1967 || ! ieee_read_number (info, pp, &nargs))
1968 return false;
1969 if (nargs == (bfd_vma) -1)
1971 arg_types = NULL;
1972 varargs = false;
1974 else
1976 unsigned int i;
1978 arg_types = ((debug_type *)
1979 xmalloc ((nargs + 1) * sizeof *arg_types));
1980 for (i = 0; i < nargs; i++)
1981 if (! ieee_read_type_index (info, pp, arg_types + i))
1982 return false;
1984 /* If the last type is pointer to void, this is really a
1985 varargs function. */
1986 varargs = false;
1987 if (nargs > 0)
1989 debug_type last;
1991 last = arg_types[nargs - 1];
1992 if (debug_get_type_kind (dhandle, last) == DEBUG_KIND_POINTER
1993 && (debug_get_type_kind (dhandle,
1994 debug_get_target_type (dhandle,
1995 last))
1996 == DEBUG_KIND_VOID))
1998 --nargs;
1999 varargs = true;
2003 /* If there are any pointer arguments, turn them into
2004 indirect types in case we later need to convert them to
2005 reference types. */
2006 for (i = 0; i < nargs; i++)
2008 if (debug_get_type_kind (dhandle, arg_types[i])
2009 == DEBUG_KIND_POINTER)
2011 if (arg_slots == NULL)
2013 arg_slots = ((debug_type *)
2014 xmalloc (nargs * sizeof *arg_slots));
2015 memset (arg_slots, 0, nargs * sizeof *arg_slots);
2017 arg_slots[i] = arg_types[i];
2018 arg_types[i] =
2019 debug_make_indirect_type (dhandle,
2020 arg_slots + i,
2021 (const char *) NULL);
2025 arg_types[nargs] = DEBUG_TYPE_NULL;
2027 if (! ieee_read_number (info, pp, &level)
2028 || ! ieee_read_optional_number (info, pp, &father, &present))
2029 return false;
2031 /* We can't distinguish between a global function and a static
2032 function. */
2033 pv->kind = IEEE_FUNCTION;
2035 if (pv->namlen > 0
2036 && debug_get_type_kind (dhandle, rtype) == DEBUG_KIND_POINTER)
2038 /* Set up the return type as an indirect type pointing to
2039 the variable slot, so that we can change it to a
2040 reference later if appropriate. */
2041 pv->pslot = (debug_type *) xmalloc (sizeof *pv->pslot);
2042 *pv->pslot = rtype;
2043 rtype = debug_make_indirect_type (dhandle, pv->pslot,
2044 (const char *) NULL);
2047 type = debug_make_function_type (dhandle, rtype, arg_types, varargs);
2049 break;
2052 /* Record the type in the table. */
2054 if (type == DEBUG_TYPE_NULL)
2055 return false;
2057 info->vars.vars[varindx].type = type;
2059 if ((tag || typdef)
2060 && info->vars.vars[varindx].namlen > 0)
2062 const char *name;
2064 name = savestring (info->vars.vars[varindx].name,
2065 info->vars.vars[varindx].namlen);
2066 if (typdef)
2067 type = debug_name_type (dhandle, name, type);
2068 else if (tc == 'E' || tc == 'N')
2069 type = debug_tag_type (dhandle, name, type);
2070 else
2072 struct ieee_tag *it;
2074 /* We must allocate all struct tags as indirect types, so
2075 that if we later see a definition of the tag as a C++
2076 record we can update the indirect slot and automatically
2077 change all the existing references. */
2078 it = (struct ieee_tag *) xmalloc (sizeof *it);
2079 memset (it, 0, sizeof *it);
2080 it->next = info->tags;
2081 info->tags = it;
2082 it->name = name;
2083 it->slot = type;
2085 type = debug_make_indirect_type (dhandle, &it->slot, name);
2086 type = debug_tag_type (dhandle, name, type);
2088 it->type = type;
2090 if (type == NULL)
2091 return false;
2094 info->types.types[typeindx].type = type;
2095 info->types.types[typeindx].arg_slots = arg_slots;
2096 info->types.types[typeindx].bitsize = type_bitsize;
2098 /* We may have already allocated type as an indirect type pointing
2099 to slot. It does no harm to replace the indirect type with the
2100 real type. Filling in slot as well handles the indirect types
2101 which are already hanging around. */
2102 if (info->types.types[typeindx].pslot != NULL)
2103 *info->types.types[typeindx].pslot = type;
2105 return true;
2108 /* Parse an ATN record. */
2110 static boolean
2111 parse_ieee_atn (info, pp)
2112 struct ieee_info *info;
2113 const bfd_byte **pp;
2115 const bfd_byte *atn_start, *atn_code_start;
2116 bfd_vma varindx;
2117 struct ieee_var *pvar;
2118 debug_type type;
2119 bfd_vma atn_code;
2120 PTR dhandle;
2121 bfd_vma v, v2, v3, v4, v5;
2122 const char *name;
2123 unsigned long namlen;
2124 char *namcopy;
2125 boolean present;
2126 int blocktype;
2128 atn_start = *pp;
2130 if (! ieee_read_number (info, pp, &varindx)
2131 || ! ieee_read_type_index (info, pp, &type))
2132 return false;
2134 atn_code_start = *pp;
2136 if (! ieee_read_number (info, pp, &atn_code))
2137 return false;
2139 if (varindx == 0)
2141 pvar = NULL;
2142 name = "";
2143 namlen = 0;
2145 else if (varindx < 32)
2147 /* The MRI compiler reportedly sometimes emits variable lifetime
2148 information for a register. We just ignore it. */
2149 if (atn_code == 9)
2150 return ieee_read_number (info, pp, &v);
2152 ieee_error (info, atn_start, _("illegal variable index"));
2153 return false;
2155 else
2157 varindx -= 32;
2158 if (varindx >= info->vars.alloc
2159 || info->vars.vars[varindx].name == NULL)
2161 /* The MRI compiler or linker sometimes omits the NN record
2162 for a pmisc record. */
2163 if (atn_code == 62)
2165 if (varindx >= info->vars.alloc)
2167 unsigned int alloc;
2169 alloc = info->vars.alloc;
2170 if (alloc == 0)
2171 alloc = 4;
2172 while (varindx >= alloc)
2173 alloc *= 2;
2174 info->vars.vars = ((struct ieee_var *)
2175 xrealloc (info->vars.vars,
2176 (alloc
2177 * sizeof *info->vars.vars)));
2178 memset (info->vars.vars + info->vars.alloc, 0,
2179 ((alloc - info->vars.alloc)
2180 * sizeof *info->vars.vars));
2181 info->vars.alloc = alloc;
2184 pvar = info->vars.vars + varindx;
2185 pvar->name = "";
2186 pvar->namlen = 0;
2188 else
2190 ieee_error (info, atn_start, _("undefined variable in ATN"));
2191 return false;
2195 pvar = info->vars.vars + varindx;
2197 pvar->type = type;
2199 name = pvar->name;
2200 namlen = pvar->namlen;
2203 dhandle = info->dhandle;
2205 /* If we are going to call debug_record_variable with a pointer
2206 type, change the type to an indirect type so that we can later
2207 change it to a reference type if we encounter a C++ pmisc 'R'
2208 record. */
2209 if (pvar != NULL
2210 && type != DEBUG_TYPE_NULL
2211 && debug_get_type_kind (dhandle, type) == DEBUG_KIND_POINTER)
2213 switch (atn_code)
2215 case 1:
2216 case 2:
2217 case 3:
2218 case 5:
2219 case 8:
2220 case 10:
2221 pvar->pslot = (debug_type *) xmalloc (sizeof *pvar->pslot);
2222 *pvar->pslot = type;
2223 type = debug_make_indirect_type (dhandle, pvar->pslot,
2224 (const char *) NULL);
2225 pvar->type = type;
2226 break;
2230 switch (atn_code)
2232 default:
2233 ieee_error (info, atn_code_start, _("unknown ATN type"));
2234 return false;
2236 case 1:
2237 /* Automatic variable. */
2238 if (! ieee_read_number (info, pp, &v))
2239 return false;
2240 namcopy = savestring (name, namlen);
2241 if (type == NULL)
2242 type = debug_make_void_type (dhandle);
2243 if (pvar != NULL)
2244 pvar->kind = IEEE_LOCAL;
2245 return debug_record_variable (dhandle, namcopy, type, DEBUG_LOCAL, v);
2247 case 2:
2248 /* Register variable. */
2249 if (! ieee_read_number (info, pp, &v))
2250 return false;
2251 namcopy = savestring (name, namlen);
2252 if (type == NULL)
2253 type = debug_make_void_type (dhandle);
2254 if (pvar != NULL)
2255 pvar->kind = IEEE_LOCAL;
2256 return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER,
2257 ieee_regno_to_genreg (info->abfd, v));
2259 case 3:
2260 /* Static variable. */
2261 if (! ieee_require_asn (info, pp, &v))
2262 return false;
2263 namcopy = savestring (name, namlen);
2264 if (type == NULL)
2265 type = debug_make_void_type (dhandle);
2266 if (info->blockstack.bsp <= info->blockstack.stack)
2267 blocktype = 0;
2268 else
2269 blocktype = info->blockstack.bsp[-1].kind;
2270 if (pvar != NULL)
2272 if (blocktype == 4 || blocktype == 6)
2273 pvar->kind = IEEE_LOCAL;
2274 else
2275 pvar->kind = IEEE_STATIC;
2277 return debug_record_variable (dhandle, namcopy, type,
2278 (blocktype == 4 || blocktype == 6
2279 ? DEBUG_LOCAL_STATIC
2280 : DEBUG_STATIC),
2283 case 4:
2284 /* External function. We don't currently record these. FIXME. */
2285 if (pvar != NULL)
2286 pvar->kind = IEEE_EXTERNAL;
2287 return true;
2289 case 5:
2290 /* External variable. We don't currently record these. FIXME. */
2291 if (pvar != NULL)
2292 pvar->kind = IEEE_EXTERNAL;
2293 return true;
2295 case 7:
2296 if (! ieee_read_number (info, pp, &v)
2297 || ! ieee_read_number (info, pp, &v2)
2298 || ! ieee_read_optional_number (info, pp, &v3, &present))
2299 return false;
2300 if (present)
2302 if (! ieee_read_optional_number (info, pp, &v4, &present))
2303 return false;
2306 /* We just ignore the two optional fields in v3 and v4, since
2307 they are not defined. */
2309 if (! ieee_require_asn (info, pp, &v3))
2310 return false;
2312 /* We have no way to record the column number. FIXME. */
2314 return debug_record_line (dhandle, v, v3);
2316 case 8:
2317 /* Global variable. */
2318 if (! ieee_require_asn (info, pp, &v))
2319 return false;
2320 namcopy = savestring (name, namlen);
2321 if (type == NULL)
2322 type = debug_make_void_type (dhandle);
2323 if (pvar != NULL)
2324 pvar->kind = IEEE_GLOBAL;
2325 return debug_record_variable (dhandle, namcopy, type, DEBUG_GLOBAL, v);
2327 case 9:
2328 /* Variable lifetime information. */
2329 if (! ieee_read_number (info, pp, &v))
2330 return false;
2332 /* We have no way to record this information. FIXME. */
2333 return true;
2335 case 10:
2336 /* Locked register. The spec says that there are two required
2337 fields, but at least on occasion the MRI compiler only emits
2338 one. */
2339 if (! ieee_read_number (info, pp, &v)
2340 || ! ieee_read_optional_number (info, pp, &v2, &present))
2341 return false;
2343 /* I think this means a variable that is both in a register and
2344 a frame slot. We ignore the frame slot. FIXME. */
2346 namcopy = savestring (name, namlen);
2347 if (type == NULL)
2348 type = debug_make_void_type (dhandle);
2349 if (pvar != NULL)
2350 pvar->kind = IEEE_LOCAL;
2351 return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER, v);
2353 case 11:
2354 /* Reserved for FORTRAN common. */
2355 ieee_error (info, atn_code_start, _("unsupported ATN11"));
2357 /* Return true to keep going. */
2358 return true;
2360 case 12:
2361 /* Based variable. */
2362 v3 = 0;
2363 v4 = 0x80;
2364 v5 = 0;
2365 if (! ieee_read_number (info, pp, &v)
2366 || ! ieee_read_number (info, pp, &v2)
2367 || ! ieee_read_optional_number (info, pp, &v3, &present))
2368 return false;
2369 if (present)
2371 if (! ieee_read_optional_number (info, pp, &v4, &present))
2372 return false;
2373 if (present)
2375 if (! ieee_read_optional_number (info, pp, &v5, &present))
2376 return false;
2380 /* We have no way to record this information. FIXME. */
2382 ieee_error (info, atn_code_start, _("unsupported ATN12"));
2384 /* Return true to keep going. */
2385 return true;
2387 case 16:
2388 /* Constant. The description of this that I have is ambiguous,
2389 so I'm not going to try to implement it. */
2390 if (! ieee_read_number (info, pp, &v)
2391 || ! ieee_read_optional_number (info, pp, &v2, &present))
2392 return false;
2393 if (present)
2395 if (! ieee_read_optional_number (info, pp, &v2, &present))
2396 return false;
2397 if (present)
2399 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
2400 return false;
2404 if ((ieee_record_enum_type) **pp == ieee_e2_first_byte_enum)
2406 if (! ieee_require_asn (info, pp, &v3))
2407 return false;
2410 return true;
2412 case 19:
2413 /* Static variable from assembler. */
2414 v2 = 0;
2415 if (! ieee_read_number (info, pp, &v)
2416 || ! ieee_read_optional_number (info, pp, &v2, &present)
2417 || ! ieee_require_asn (info, pp, &v3))
2418 return false;
2419 namcopy = savestring (name, namlen);
2420 /* We don't really handle this correctly. FIXME. */
2421 return debug_record_variable (dhandle, namcopy,
2422 debug_make_void_type (dhandle),
2423 v2 != 0 ? DEBUG_GLOBAL : DEBUG_STATIC,
2424 v3);
2426 case 62:
2427 /* Procedure miscellaneous information. */
2428 case 63:
2429 /* Variable miscellaneous information. */
2430 case 64:
2431 /* Module miscellaneous information. */
2432 if (! ieee_read_number (info, pp, &v)
2433 || ! ieee_read_number (info, pp, &v2)
2434 || ! ieee_read_optional_id (info, pp, &name, &namlen, &present))
2435 return false;
2437 if (atn_code == 62 && v == 80)
2439 if (present)
2441 ieee_error (info, atn_code_start,
2442 _("unexpected string in C++ misc"));
2443 return false;
2445 return ieee_read_cxx_misc (info, pp, v2);
2448 /* We just ignore all of this stuff. FIXME. */
2450 for (; v2 > 0; --v2)
2452 switch ((ieee_record_enum_type) **pp)
2454 default:
2455 ieee_error (info, *pp, _("bad misc record"));
2456 return false;
2458 case ieee_at_record_enum:
2459 if (! ieee_require_atn65 (info, pp, &name, &namlen))
2460 return false;
2461 break;
2463 case ieee_e2_first_byte_enum:
2464 if (! ieee_require_asn (info, pp, &v3))
2465 return false;
2466 break;
2470 return true;
2473 /*NOTREACHED*/
2476 /* Handle C++ debugging miscellaneous records. This is called for
2477 procedure miscellaneous records of type 80. */
2479 static boolean
2480 ieee_read_cxx_misc (info, pp, count)
2481 struct ieee_info *info;
2482 const bfd_byte **pp;
2483 unsigned long count;
2485 const bfd_byte *start;
2486 bfd_vma category;
2488 start = *pp;
2490 /* Get the category of C++ misc record. */
2491 if (! ieee_require_asn (info, pp, &category))
2492 return false;
2493 --count;
2495 switch (category)
2497 default:
2498 ieee_error (info, start, _("unrecognized C++ misc record"));
2499 return false;
2501 case 'T':
2502 if (! ieee_read_cxx_class (info, pp, count))
2503 return false;
2504 break;
2506 case 'M':
2508 bfd_vma flags;
2509 const char *name;
2510 unsigned long namlen;
2512 /* The IEEE spec indicates that the 'M' record only has a
2513 flags field. The MRI compiler also emits the name of the
2514 function. */
2516 if (! ieee_require_asn (info, pp, &flags))
2517 return false;
2518 if (*pp < info->pend
2519 && (ieee_record_enum_type) **pp == ieee_at_record_enum)
2521 if (! ieee_require_atn65 (info, pp, &name, &namlen))
2522 return false;
2525 /* This is emitted for method functions, but I don't think we
2526 care very much. It might help if it told us useful
2527 information like the class with which this function is
2528 associated, but it doesn't, so it isn't helpful. */
2530 break;
2532 case 'B':
2533 if (! ieee_read_cxx_defaults (info, pp, count))
2534 return false;
2535 break;
2537 case 'z':
2539 const char *name, *mangled, *class;
2540 unsigned long namlen, mangledlen, classlen;
2541 bfd_vma control;
2543 /* Pointer to member. */
2545 if (! ieee_require_atn65 (info, pp, &name, &namlen)
2546 || ! ieee_require_atn65 (info, pp, &mangled, &mangledlen)
2547 || ! ieee_require_atn65 (info, pp, &class, &classlen)
2548 || ! ieee_require_asn (info, pp, &control))
2549 return false;
2551 /* FIXME: We should now track down name and change its type. */
2553 break;
2555 case 'R':
2556 if (! ieee_read_reference (info, pp))
2557 return false;
2558 break;
2561 return true;
2564 /* Read a C++ class definition. This is a pmisc type 80 record of
2565 category 'T'. */
2567 static boolean
2568 ieee_read_cxx_class (info, pp, count)
2569 struct ieee_info *info;
2570 const bfd_byte **pp;
2571 unsigned long count;
2573 const bfd_byte *start;
2574 bfd_vma class;
2575 const char *tag;
2576 unsigned long taglen;
2577 struct ieee_tag *it;
2578 PTR dhandle;
2579 debug_field *fields;
2580 unsigned int field_count, field_alloc;
2581 debug_baseclass *baseclasses;
2582 unsigned int baseclasses_count, baseclasses_alloc;
2583 const debug_field *structfields;
2584 struct ieee_method
2586 const char *name;
2587 unsigned long namlen;
2588 debug_method_variant *variants;
2589 unsigned count;
2590 unsigned int alloc;
2591 } *methods;
2592 unsigned int methods_count, methods_alloc;
2593 debug_type vptrbase;
2594 boolean ownvptr;
2595 debug_method *dmethods;
2597 start = *pp;
2599 if (! ieee_require_asn (info, pp, &class))
2600 return false;
2601 --count;
2603 if (! ieee_require_atn65 (info, pp, &tag, &taglen))
2604 return false;
2605 --count;
2607 /* Find the C struct with this name. */
2608 for (it = info->tags; it != NULL; it = it->next)
2609 if (it->name[0] == tag[0]
2610 && strncmp (it->name, tag, taglen) == 0
2611 && strlen (it->name) == taglen)
2612 break;
2613 if (it == NULL)
2615 ieee_error (info, start, _("undefined C++ object"));
2616 return false;
2619 dhandle = info->dhandle;
2621 fields = NULL;
2622 field_count = 0;
2623 field_alloc = 0;
2624 baseclasses = NULL;
2625 baseclasses_count = 0;
2626 baseclasses_alloc = 0;
2627 methods = NULL;
2628 methods_count = 0;
2629 methods_alloc = 0;
2630 vptrbase = DEBUG_TYPE_NULL;
2631 ownvptr = false;
2633 structfields = debug_get_fields (dhandle, it->type);
2635 while (count > 0)
2637 bfd_vma id;
2638 const bfd_byte *spec_start;
2640 spec_start = *pp;
2642 if (! ieee_require_asn (info, pp, &id))
2643 return false;
2644 --count;
2646 switch (id)
2648 default:
2649 ieee_error (info, spec_start, _("unrecognized C++ object spec"));
2650 return false;
2652 case 'b':
2654 bfd_vma flags, cinline;
2655 const char *basename, *fieldname;
2656 unsigned long baselen, fieldlen;
2657 char *basecopy;
2658 debug_type basetype;
2659 bfd_vma bitpos;
2660 boolean virtualp;
2661 enum debug_visibility visibility;
2662 debug_baseclass baseclass;
2664 /* This represents a base or friend class. */
2666 if (! ieee_require_asn (info, pp, &flags)
2667 || ! ieee_require_atn65 (info, pp, &basename, &baselen)
2668 || ! ieee_require_asn (info, pp, &cinline)
2669 || ! ieee_require_atn65 (info, pp, &fieldname, &fieldlen))
2670 return false;
2671 count -= 4;
2673 /* We have no way of recording friend information, so we
2674 just ignore it. */
2675 if ((flags & BASEFLAGS_FRIEND) != 0)
2676 break;
2678 /* I assume that either all of the members of the
2679 baseclass are included in the object, starting at the
2680 beginning of the object, or that none of them are
2681 included. */
2683 if ((fieldlen == 0) == (cinline == 0))
2685 ieee_error (info, start, _("unsupported C++ object type"));
2686 return false;
2689 basecopy = savestring (basename, baselen);
2690 basetype = debug_find_tagged_type (dhandle, basecopy,
2691 DEBUG_KIND_ILLEGAL);
2692 free (basecopy);
2693 if (basetype == DEBUG_TYPE_NULL)
2695 ieee_error (info, start, _("C++ base class not defined"));
2696 return false;
2699 if (fieldlen == 0)
2700 bitpos = 0;
2701 else
2703 const debug_field *pf;
2705 if (structfields == NULL)
2707 ieee_error (info, start, _("C++ object has no fields"));
2708 return false;
2711 for (pf = structfields; *pf != DEBUG_FIELD_NULL; pf++)
2713 const char *fname;
2715 fname = debug_get_field_name (dhandle, *pf);
2716 if (fname == NULL)
2717 return false;
2718 if (fname[0] == fieldname[0]
2719 && strncmp (fname, fieldname, fieldlen) == 0
2720 && strlen (fname) == fieldlen)
2721 break;
2723 if (*pf == DEBUG_FIELD_NULL)
2725 ieee_error (info, start,
2726 _("C++ base class not found in container"));
2727 return false;
2730 bitpos = debug_get_field_bitpos (dhandle, *pf);
2733 if ((flags & BASEFLAGS_VIRTUAL) != 0)
2734 virtualp = true;
2735 else
2736 virtualp = false;
2737 if ((flags & BASEFLAGS_PRIVATE) != 0)
2738 visibility = DEBUG_VISIBILITY_PRIVATE;
2739 else
2740 visibility = DEBUG_VISIBILITY_PUBLIC;
2742 baseclass = debug_make_baseclass (dhandle, basetype, bitpos,
2743 virtualp, visibility);
2744 if (baseclass == DEBUG_BASECLASS_NULL)
2745 return false;
2747 if (baseclasses_count + 1 >= baseclasses_alloc)
2749 baseclasses_alloc += 10;
2750 baseclasses = ((debug_baseclass *)
2751 xrealloc (baseclasses,
2752 (baseclasses_alloc
2753 * sizeof *baseclasses)));
2756 baseclasses[baseclasses_count] = baseclass;
2757 ++baseclasses_count;
2758 baseclasses[baseclasses_count] = DEBUG_BASECLASS_NULL;
2760 break;
2762 case 'd':
2764 bfd_vma flags;
2765 const char *fieldname, *mangledname;
2766 unsigned long fieldlen, mangledlen;
2767 char *fieldcopy;
2768 boolean staticp;
2769 debug_type ftype;
2770 const debug_field *pf = NULL;
2771 enum debug_visibility visibility;
2772 debug_field field;
2774 /* This represents a data member. */
2776 if (! ieee_require_asn (info, pp, &flags)
2777 || ! ieee_require_atn65 (info, pp, &fieldname, &fieldlen)
2778 || ! ieee_require_atn65 (info, pp, &mangledname, &mangledlen))
2779 return false;
2780 count -= 3;
2782 fieldcopy = savestring (fieldname, fieldlen);
2784 staticp = (flags & CXXFLAGS_STATIC) != 0 ? true : false;
2786 if (staticp)
2788 struct ieee_var *pv, *pvend;
2790 /* See if we can find a definition for this variable. */
2791 pv = info->vars.vars;
2792 pvend = pv + info->vars.alloc;
2793 for (; pv < pvend; pv++)
2794 if (pv->namlen == mangledlen
2795 && strncmp (pv->name, mangledname, mangledlen) == 0)
2796 break;
2797 if (pv < pvend)
2798 ftype = pv->type;
2799 else
2801 /* This can happen if the variable is never used. */
2802 ftype = ieee_builtin_type (info, start,
2803 (unsigned int) builtin_void);
2806 else
2808 unsigned int findx;
2810 if (structfields == NULL)
2812 ieee_error (info, start, _("C++ object has no fields"));
2813 return false;
2816 for (pf = structfields, findx = 0;
2817 *pf != DEBUG_FIELD_NULL;
2818 pf++, findx++)
2820 const char *fname;
2822 fname = debug_get_field_name (dhandle, *pf);
2823 if (fname == NULL)
2824 return false;
2825 if (fname[0] == mangledname[0]
2826 && strncmp (fname, mangledname, mangledlen) == 0
2827 && strlen (fname) == mangledlen)
2828 break;
2830 if (*pf == DEBUG_FIELD_NULL)
2832 ieee_error (info, start,
2833 _("C++ data member not found in container"));
2834 return false;
2837 ftype = debug_get_field_type (dhandle, *pf);
2839 if (debug_get_type_kind (dhandle, ftype) == DEBUG_KIND_POINTER)
2841 /* We might need to convert this field into a
2842 reference type later on, so make it an indirect
2843 type. */
2844 if (it->fslots == NULL)
2846 unsigned int fcnt;
2847 const debug_field *pfcnt;
2849 fcnt = 0;
2850 for (pfcnt = structfields;
2851 *pfcnt != DEBUG_FIELD_NULL;
2852 pfcnt++)
2853 ++fcnt;
2854 it->fslots = ((debug_type *)
2855 xmalloc (fcnt * sizeof *it->fslots));
2856 memset (it->fslots, 0,
2857 fcnt * sizeof *it->fslots);
2860 if (ftype == DEBUG_TYPE_NULL)
2861 return false;
2862 it->fslots[findx] = ftype;
2863 ftype = debug_make_indirect_type (dhandle,
2864 it->fslots + findx,
2865 (const char *) NULL);
2868 if (ftype == DEBUG_TYPE_NULL)
2869 return false;
2871 switch (flags & CXXFLAGS_VISIBILITY)
2873 default:
2874 ieee_error (info, start, _("unknown C++ visibility"));
2875 return false;
2877 case CXXFLAGS_VISIBILITY_PUBLIC:
2878 visibility = DEBUG_VISIBILITY_PUBLIC;
2879 break;
2881 case CXXFLAGS_VISIBILITY_PRIVATE:
2882 visibility = DEBUG_VISIBILITY_PRIVATE;
2883 break;
2885 case CXXFLAGS_VISIBILITY_PROTECTED:
2886 visibility = DEBUG_VISIBILITY_PROTECTED;
2887 break;
2890 if (staticp)
2892 char *mangledcopy;
2894 mangledcopy = savestring (mangledname, mangledlen);
2896 field = debug_make_static_member (dhandle, fieldcopy,
2897 ftype, mangledcopy,
2898 visibility);
2900 else
2902 bfd_vma bitpos, bitsize;
2904 bitpos = debug_get_field_bitpos (dhandle, *pf);
2905 bitsize = debug_get_field_bitsize (dhandle, *pf);
2906 if (bitpos == (bfd_vma) -1 || bitsize == (bfd_vma) -1)
2908 ieee_error (info, start, _("bad C++ field bit pos or size"));
2909 return false;
2911 field = debug_make_field (dhandle, fieldcopy, ftype, bitpos,
2912 bitsize, visibility);
2915 if (field == DEBUG_FIELD_NULL)
2916 return false;
2918 if (field_count + 1 >= field_alloc)
2920 field_alloc += 10;
2921 fields = ((debug_field *)
2922 xrealloc (fields, field_alloc * sizeof *fields));
2925 fields[field_count] = field;
2926 ++field_count;
2927 fields[field_count] = DEBUG_FIELD_NULL;
2929 break;
2931 case 'm':
2932 case 'v':
2934 bfd_vma flags, voffset, control;
2935 const char *name, *mangled;
2936 unsigned long namlen, mangledlen;
2937 struct ieee_var *pv, *pvend;
2938 debug_type type;
2939 enum debug_visibility visibility;
2940 boolean constp, volatilep;
2941 char *mangledcopy;
2942 debug_method_variant mv;
2943 struct ieee_method *meth;
2944 unsigned int im;
2946 if (! ieee_require_asn (info, pp, &flags)
2947 || ! ieee_require_atn65 (info, pp, &name, &namlen)
2948 || ! ieee_require_atn65 (info, pp, &mangled, &mangledlen))
2949 return false;
2950 count -= 3;
2951 if (id != 'v')
2952 voffset = 0;
2953 else
2955 if (! ieee_require_asn (info, pp, &voffset))
2956 return false;
2957 --count;
2959 if (! ieee_require_asn (info, pp, &control))
2960 return false;
2961 --count;
2963 /* We just ignore the control information. */
2965 /* We have no way to represent friend information, so we
2966 just ignore it. */
2967 if ((flags & CXXFLAGS_FRIEND) != 0)
2968 break;
2970 /* We should already have seen a type for the function. */
2971 pv = info->vars.vars;
2972 pvend = pv + info->vars.alloc;
2973 for (; pv < pvend; pv++)
2974 if (pv->namlen == mangledlen
2975 && strncmp (pv->name, mangled, mangledlen) == 0)
2976 break;
2978 if (pv >= pvend)
2980 /* We won't have type information for this function if
2981 it is not included in this file. We don't try to
2982 handle this case. FIXME. */
2983 type = (debug_make_function_type
2984 (dhandle,
2985 ieee_builtin_type (info, start,
2986 (unsigned int) builtin_void),
2987 (debug_type *) NULL,
2988 false));
2990 else
2992 debug_type return_type;
2993 const debug_type *arg_types;
2994 boolean varargs;
2996 if (debug_get_type_kind (dhandle, pv->type)
2997 != DEBUG_KIND_FUNCTION)
2999 ieee_error (info, start,
3000 _("bad type for C++ method function"));
3001 return false;
3004 return_type = debug_get_return_type (dhandle, pv->type);
3005 arg_types = debug_get_parameter_types (dhandle, pv->type,
3006 &varargs);
3007 if (return_type == DEBUG_TYPE_NULL || arg_types == NULL)
3009 ieee_error (info, start,
3010 _("no type information for C++ method function"));
3011 return false;
3014 type = debug_make_method_type (dhandle, return_type, it->type,
3015 (debug_type *) arg_types,
3016 varargs);
3018 if (type == DEBUG_TYPE_NULL)
3019 return false;
3021 switch (flags & CXXFLAGS_VISIBILITY)
3023 default:
3024 ieee_error (info, start, _("unknown C++ visibility"));
3025 return false;
3027 case CXXFLAGS_VISIBILITY_PUBLIC:
3028 visibility = DEBUG_VISIBILITY_PUBLIC;
3029 break;
3031 case CXXFLAGS_VISIBILITY_PRIVATE:
3032 visibility = DEBUG_VISIBILITY_PRIVATE;
3033 break;
3035 case CXXFLAGS_VISIBILITY_PROTECTED:
3036 visibility = DEBUG_VISIBILITY_PROTECTED;
3037 break;
3040 constp = (flags & CXXFLAGS_CONST) != 0 ? true : false;
3041 volatilep = (flags & CXXFLAGS_VOLATILE) != 0 ? true : false;
3043 mangledcopy = savestring (mangled, mangledlen);
3045 if ((flags & CXXFLAGS_STATIC) != 0)
3047 if (id == 'v')
3049 ieee_error (info, start, _("C++ static virtual method"));
3050 return false;
3052 mv = debug_make_static_method_variant (dhandle, mangledcopy,
3053 type, visibility,
3054 constp, volatilep);
3056 else
3058 debug_type vcontext;
3060 if (id != 'v')
3061 vcontext = DEBUG_TYPE_NULL;
3062 else
3064 /* FIXME: How can we calculate this correctly? */
3065 vcontext = it->type;
3067 mv = debug_make_method_variant (dhandle, mangledcopy, type,
3068 visibility, constp,
3069 volatilep, voffset,
3070 vcontext);
3072 if (mv == DEBUG_METHOD_VARIANT_NULL)
3073 return false;
3075 for (meth = methods, im = 0; im < methods_count; meth++, im++)
3076 if (meth->namlen == namlen
3077 && strncmp (meth->name, name, namlen) == 0)
3078 break;
3079 if (im >= methods_count)
3081 if (methods_count >= methods_alloc)
3083 methods_alloc += 10;
3084 methods = ((struct ieee_method *)
3085 xrealloc (methods,
3086 methods_alloc * sizeof *methods));
3088 methods[methods_count].name = name;
3089 methods[methods_count].namlen = namlen;
3090 methods[methods_count].variants = NULL;
3091 methods[methods_count].count = 0;
3092 methods[methods_count].alloc = 0;
3093 meth = methods + methods_count;
3094 ++methods_count;
3097 if (meth->count + 1 >= meth->alloc)
3099 meth->alloc += 10;
3100 meth->variants = ((debug_method_variant *)
3101 xrealloc (meth->variants,
3102 (meth->alloc
3103 * sizeof *meth->variants)));
3106 meth->variants[meth->count] = mv;
3107 ++meth->count;
3108 meth->variants[meth->count] = DEBUG_METHOD_VARIANT_NULL;
3110 break;
3112 case 'o':
3114 bfd_vma spec;
3116 /* We have no way to store this information, so we just
3117 ignore it. */
3118 if (! ieee_require_asn (info, pp, &spec))
3119 return false;
3120 --count;
3121 if ((spec & 4) != 0)
3123 const char *filename;
3124 unsigned long filenamlen;
3125 bfd_vma lineno;
3127 if (! ieee_require_atn65 (info, pp, &filename, &filenamlen)
3128 || ! ieee_require_asn (info, pp, &lineno))
3129 return false;
3130 count -= 2;
3132 else if ((spec & 8) != 0)
3134 const char *mangled;
3135 unsigned long mangledlen;
3137 if (! ieee_require_atn65 (info, pp, &mangled, &mangledlen))
3138 return false;
3139 --count;
3141 else
3143 ieee_error (info, start,
3144 _("unrecognized C++ object overhead spec"));
3145 return false;
3148 break;
3150 case 'z':
3152 const char *vname, *basename;
3153 unsigned long vnamelen, baselen;
3154 bfd_vma vsize, control;
3156 /* A virtual table pointer. */
3158 if (! ieee_require_atn65 (info, pp, &vname, &vnamelen)
3159 || ! ieee_require_asn (info, pp, &vsize)
3160 || ! ieee_require_atn65 (info, pp, &basename, &baselen)
3161 || ! ieee_require_asn (info, pp, &control))
3162 return false;
3163 count -= 4;
3165 /* We just ignore the control number. We don't care what
3166 the virtual table name is. We have no way to store the
3167 virtual table size, and I don't think we care anyhow. */
3169 /* FIXME: We can't handle multiple virtual table pointers. */
3171 if (baselen == 0)
3172 ownvptr = true;
3173 else
3175 char *basecopy;
3177 basecopy = savestring (basename, baselen);
3178 vptrbase = debug_find_tagged_type (dhandle, basecopy,
3179 DEBUG_KIND_ILLEGAL);
3180 free (basecopy);
3181 if (vptrbase == DEBUG_TYPE_NULL)
3183 ieee_error (info, start, _("undefined C++ vtable"));
3184 return false;
3188 break;
3192 /* Now that we have seen all the method variants, we can call
3193 debug_make_method for each one. */
3195 if (methods_count == 0)
3196 dmethods = NULL;
3197 else
3199 unsigned int i;
3201 dmethods = ((debug_method *)
3202 xmalloc ((methods_count + 1) * sizeof *dmethods));
3203 for (i = 0; i < methods_count; i++)
3205 char *namcopy;
3207 namcopy = savestring (methods[i].name, methods[i].namlen);
3208 dmethods[i] = debug_make_method (dhandle, namcopy,
3209 methods[i].variants);
3210 if (dmethods[i] == DEBUG_METHOD_NULL)
3211 return false;
3213 dmethods[i] = DEBUG_METHOD_NULL;
3214 free (methods);
3217 /* The struct type was created as an indirect type pointing at
3218 it->slot. We update it->slot to automatically update all
3219 references to this struct. */
3220 it->slot = debug_make_object_type (dhandle,
3221 class != 'u',
3222 debug_get_type_size (dhandle,
3223 it->slot),
3224 fields, baseclasses, dmethods,
3225 vptrbase, ownvptr);
3226 if (it->slot == DEBUG_TYPE_NULL)
3227 return false;
3229 return true;
3232 /* Read C++ default argument value and reference type information. */
3234 static boolean
3235 ieee_read_cxx_defaults (info, pp, count)
3236 struct ieee_info *info;
3237 const bfd_byte **pp;
3238 unsigned long count;
3240 const bfd_byte *start;
3241 const char *fnname;
3242 unsigned long fnlen;
3243 bfd_vma defcount;
3245 start = *pp;
3247 /* Giving the function name before the argument count is an addendum
3248 to the spec. The function name is demangled, though, so this
3249 record must always refer to the current function. */
3251 if (info->blockstack.bsp <= info->blockstack.stack
3252 || info->blockstack.bsp[-1].fnindx == (unsigned int) -1)
3254 ieee_error (info, start, _("C++ default values not in a function"));
3255 return false;
3258 if (! ieee_require_atn65 (info, pp, &fnname, &fnlen)
3259 || ! ieee_require_asn (info, pp, &defcount))
3260 return false;
3261 count -= 2;
3263 while (defcount-- > 0)
3265 bfd_vma type, val;
3266 const char *strval;
3267 unsigned long strvallen;
3269 if (! ieee_require_asn (info, pp, &type))
3270 return false;
3271 --count;
3273 switch (type)
3275 case 0:
3276 case 4:
3277 break;
3279 case 1:
3280 case 2:
3281 if (! ieee_require_asn (info, pp, &val))
3282 return false;
3283 --count;
3284 break;
3286 case 3:
3287 case 7:
3288 if (! ieee_require_atn65 (info, pp, &strval, &strvallen))
3289 return false;
3290 --count;
3291 break;
3293 default:
3294 ieee_error (info, start, _("unrecognized C++ default type"));
3295 return false;
3298 /* We have no way to record the default argument values, so we
3299 just ignore them. FIXME. */
3302 /* Any remaining arguments are indices of parameters that are really
3303 reference type. */
3304 if (count > 0)
3306 PTR dhandle;
3307 debug_type *arg_slots;
3309 dhandle = info->dhandle;
3310 arg_slots = info->types.types[info->blockstack.bsp[-1].fnindx].arg_slots;
3311 while (count-- > 0)
3313 bfd_vma indx;
3314 debug_type target;
3316 if (! ieee_require_asn (info, pp, &indx))
3317 return false;
3318 /* The index is 1 based. */
3319 --indx;
3320 if (arg_slots == NULL
3321 || arg_slots[indx] == DEBUG_TYPE_NULL
3322 || (debug_get_type_kind (dhandle, arg_slots[indx])
3323 != DEBUG_KIND_POINTER))
3325 ieee_error (info, start, _("reference parameter is not a pointer"));
3326 return false;
3329 target = debug_get_target_type (dhandle, arg_slots[indx]);
3330 arg_slots[indx] = debug_make_reference_type (dhandle, target);
3331 if (arg_slots[indx] == DEBUG_TYPE_NULL)
3332 return false;
3336 return true;
3339 /* Read a C++ reference definition. */
3341 static boolean
3342 ieee_read_reference (info, pp)
3343 struct ieee_info *info;
3344 const bfd_byte **pp;
3346 const bfd_byte *start;
3347 bfd_vma flags;
3348 const char *class, *name;
3349 unsigned long classlen, namlen;
3350 debug_type *pslot;
3351 debug_type target;
3353 start = *pp;
3355 if (! ieee_require_asn (info, pp, &flags))
3356 return false;
3358 /* Giving the class name before the member name is in an addendum to
3359 the spec. */
3360 if (flags == 3)
3362 if (! ieee_require_atn65 (info, pp, &class, &classlen))
3363 return false;
3366 if (! ieee_require_atn65 (info, pp, &name, &namlen))
3367 return false;
3369 pslot = NULL;
3370 if (flags != 3)
3372 int pass;
3374 /* We search from the last variable indices to the first in
3375 hopes of finding local variables correctly. We search the
3376 local variables on the first pass, and the global variables
3377 on the second. FIXME: This probably won't work in all cases.
3378 On the other hand, I don't know what will. */
3379 for (pass = 0; pass < 2; pass++)
3381 struct ieee_vars *vars;
3382 int i;
3383 struct ieee_var *pv = NULL;
3385 if (pass == 0)
3386 vars = &info->vars;
3387 else
3389 vars = info->global_vars;
3390 if (vars == NULL)
3391 break;
3394 for (i = (int) vars->alloc - 1; i >= 0; i--)
3396 boolean found;
3398 pv = vars->vars + i;
3400 if (pv->pslot == NULL
3401 || pv->namlen != namlen
3402 || strncmp (pv->name, name, namlen) != 0)
3403 continue;
3405 found = false;
3406 switch (flags)
3408 default:
3409 ieee_error (info, start,
3410 _("unrecognized C++ reference type"));
3411 return false;
3413 case 0:
3414 /* Global variable or function. */
3415 if (pv->kind == IEEE_GLOBAL
3416 || pv->kind == IEEE_EXTERNAL
3417 || pv->kind == IEEE_FUNCTION)
3418 found = true;
3419 break;
3421 case 1:
3422 /* Global static variable or function. */
3423 if (pv->kind == IEEE_STATIC
3424 || pv->kind == IEEE_FUNCTION)
3425 found = true;
3426 break;
3428 case 2:
3429 /* Local variable. */
3430 if (pv->kind == IEEE_LOCAL)
3431 found = true;
3432 break;
3435 if (found)
3436 break;
3439 if (i >= 0)
3441 pslot = pv->pslot;
3442 break;
3446 else
3448 struct ieee_tag *it;
3450 for (it = info->tags; it != NULL; it = it->next)
3452 if (it->name[0] == class[0]
3453 && strncmp (it->name, class, classlen) == 0
3454 && strlen (it->name) == classlen)
3456 if (it->fslots != NULL)
3458 const debug_field *pf;
3459 unsigned int findx;
3461 pf = debug_get_fields (info->dhandle, it->type);
3462 if (pf == NULL)
3464 ieee_error (info, start,
3465 "C++ reference in class with no fields");
3466 return false;
3469 for (findx = 0; *pf != DEBUG_FIELD_NULL; pf++, findx++)
3471 const char *fname;
3473 fname = debug_get_field_name (info->dhandle, *pf);
3474 if (fname == NULL)
3475 return false;
3476 if (strncmp (fname, name, namlen) == 0
3477 && strlen (fname) == namlen)
3479 pslot = it->fslots + findx;
3480 break;
3485 break;
3490 if (pslot == NULL)
3492 ieee_error (info, start, _("C++ reference not found"));
3493 return false;
3496 /* We allocated the type of the object as an indirect type pointing
3497 to *pslot, which we can now update to be a reference type. */
3498 if (debug_get_type_kind (info->dhandle, *pslot) != DEBUG_KIND_POINTER)
3500 ieee_error (info, start, _("C++ reference is not pointer"));
3501 return false;
3504 target = debug_get_target_type (info->dhandle, *pslot);
3505 *pslot = debug_make_reference_type (info->dhandle, target);
3506 if (*pslot == DEBUG_TYPE_NULL)
3507 return false;
3509 return true;
3512 /* Require an ASN record. */
3514 static boolean
3515 ieee_require_asn (info, pp, pv)
3516 struct ieee_info *info;
3517 const bfd_byte **pp;
3518 bfd_vma *pv;
3520 const bfd_byte *start;
3521 ieee_record_enum_type c;
3522 bfd_vma varindx;
3524 start = *pp;
3526 c = (ieee_record_enum_type) **pp;
3527 if (c != ieee_e2_first_byte_enum)
3529 ieee_error (info, start, _("missing required ASN"));
3530 return false;
3532 ++*pp;
3534 c = (ieee_record_enum_type) (((unsigned int) c << 8) | **pp);
3535 if (c != ieee_asn_record_enum)
3537 ieee_error (info, start, _("missing required ASN"));
3538 return false;
3540 ++*pp;
3542 /* Just ignore the variable index. */
3543 if (! ieee_read_number (info, pp, &varindx))
3544 return false;
3546 return ieee_read_expression (info, pp, pv);
3549 /* Require an ATN65 record. */
3551 static boolean
3552 ieee_require_atn65 (info, pp, pname, pnamlen)
3553 struct ieee_info *info;
3554 const bfd_byte **pp;
3555 const char **pname;
3556 unsigned long *pnamlen;
3558 const bfd_byte *start;
3559 ieee_record_enum_type c;
3560 bfd_vma name_indx, type_indx, atn_code;
3562 start = *pp;
3564 c = (ieee_record_enum_type) **pp;
3565 if (c != ieee_at_record_enum)
3567 ieee_error (info, start, _("missing required ATN65"));
3568 return false;
3570 ++*pp;
3572 c = (ieee_record_enum_type) (((unsigned int) c << 8) | **pp);
3573 if (c != ieee_atn_record_enum)
3575 ieee_error (info, start, _("missing required ATN65"));
3576 return false;
3578 ++*pp;
3580 if (! ieee_read_number (info, pp, &name_indx)
3581 || ! ieee_read_number (info, pp, &type_indx)
3582 || ! ieee_read_number (info, pp, &atn_code))
3583 return false;
3585 /* Just ignore name_indx. */
3587 if (type_indx != 0 || atn_code != 65)
3589 ieee_error (info, start, _("bad ATN65 record"));
3590 return false;
3593 return ieee_read_id (info, pp, pname, pnamlen);
3596 /* Convert a register number in IEEE debugging information into a
3597 generic register number. */
3599 static int
3600 ieee_regno_to_genreg (abfd, r)
3601 bfd *abfd;
3602 int r;
3604 switch (bfd_get_arch (abfd))
3606 case bfd_arch_m68k:
3607 /* For some reasons stabs adds 2 to the floating point register
3608 numbers. */
3609 if (r >= 16)
3610 r += 2;
3611 break;
3613 case bfd_arch_i960:
3614 /* Stabs uses 0 to 15 for r0 to r15, 16 to 31 for g0 to g15, and
3615 32 to 35 for fp0 to fp3. */
3616 --r;
3617 break;
3619 default:
3620 break;
3623 return r;
3626 /* Convert a generic register number to an IEEE specific one. */
3628 static int
3629 ieee_genreg_to_regno (abfd, r)
3630 bfd *abfd;
3631 int r;
3633 switch (bfd_get_arch (abfd))
3635 case bfd_arch_m68k:
3636 /* For some reason stabs add 2 to the floating point register
3637 numbers. */
3638 if (r >= 18)
3639 r -= 2;
3640 break;
3642 case bfd_arch_i960:
3643 /* Stabs uses 0 to 15 for r0 to r15, 16 to 31 for g0 to g15, and
3644 32 to 35 for fp0 to fp3. */
3645 ++r;
3646 break;
3648 default:
3649 break;
3652 return r;
3655 /* These routines build IEEE debugging information out of the generic
3656 debugging information. */
3658 /* We build the IEEE debugging information byte by byte. Rather than
3659 waste time copying data around, we use a linked list of buffers to
3660 hold the data. */
3662 #define IEEE_BUFSIZE (490)
3664 struct ieee_buf
3666 /* Next buffer. */
3667 struct ieee_buf *next;
3668 /* Number of data bytes in this buffer. */
3669 unsigned int c;
3670 /* Bytes. */
3671 bfd_byte buf[IEEE_BUFSIZE];
3674 /* A list of buffers. */
3676 struct ieee_buflist
3678 /* Head of list. */
3679 struct ieee_buf *head;
3680 /* Tail--last buffer on list. */
3681 struct ieee_buf *tail;
3684 /* In order to generate the BB11 blocks required by the HP emulator,
3685 we keep track of ranges of addresses which correspond to a given
3686 compilation unit. */
3688 struct ieee_range
3690 /* Next range. */
3691 struct ieee_range *next;
3692 /* Low address. */
3693 bfd_vma low;
3694 /* High address. */
3695 bfd_vma high;
3698 /* This structure holds information for a class on the type stack. */
3700 struct ieee_type_class
3702 /* The name index in the debugging information. */
3703 unsigned int indx;
3704 /* The pmisc records for the class. */
3705 struct ieee_buflist pmiscbuf;
3706 /* The number of pmisc records. */
3707 unsigned int pmisccount;
3708 /* The name of the class holding the virtual table, if not this
3709 class. */
3710 const char *vclass;
3711 /* Whether this class holds its own virtual table. */
3712 boolean ownvptr;
3713 /* The largest virtual table offset seen so far. */
3714 bfd_vma voffset;
3715 /* The current method. */
3716 const char *method;
3717 /* Additional pmisc records used to record fields of reference type. */
3718 struct ieee_buflist refs;
3721 /* This is how we store types for the writing routines. Most types
3722 are simply represented by a type index. */
3724 struct ieee_write_type
3726 /* Type index. */
3727 unsigned int indx;
3728 /* The size of the type, if known. */
3729 unsigned int size;
3730 /* The name of the type, if any. */
3731 const char *name;
3732 /* If this is a function or method type, we build the type here, and
3733 only add it to the output buffers if we need it. */
3734 struct ieee_buflist fndef;
3735 /* If this is a struct, this is where the struct definition is
3736 built. */
3737 struct ieee_buflist strdef;
3738 /* If this is a class, this is where the class information is built. */
3739 struct ieee_type_class *classdef;
3740 /* Whether the type is unsigned. */
3741 unsigned int unsignedp : 1;
3742 /* Whether this is a reference type. */
3743 unsigned int referencep : 1;
3744 /* Whether this is in the local type block. */
3745 unsigned int localp : 1;
3746 /* Whether this is a duplicate struct definition which we are
3747 ignoring. */
3748 unsigned int ignorep : 1;
3751 /* This is the type stack used by the debug writing routines. FIXME:
3752 We could generate more efficient output if we remembered when we
3753 have output a particular type before. */
3755 struct ieee_type_stack
3757 /* Next entry on stack. */
3758 struct ieee_type_stack *next;
3759 /* Type information. */
3760 struct ieee_write_type type;
3763 /* This is a list of associations between a name and some types.
3764 These are used for typedefs and tags. */
3766 struct ieee_name_type
3768 /* Next type for this name. */
3769 struct ieee_name_type *next;
3770 /* ID number. For a typedef, this is the index of the type to which
3771 this name is typedefed. */
3772 unsigned int id;
3773 /* Type. */
3774 struct ieee_write_type type;
3775 /* If this is a tag which has not yet been defined, this is the
3776 kind. If the tag has been defined, this is DEBUG_KIND_ILLEGAL. */
3777 enum debug_type_kind kind;
3780 /* We use a hash table to associate names and types. */
3782 struct ieee_name_type_hash_table
3784 struct bfd_hash_table root;
3787 struct ieee_name_type_hash_entry
3789 struct bfd_hash_entry root;
3790 /* Information for this name. */
3791 struct ieee_name_type *types;
3794 /* This is a list of enums. */
3796 struct ieee_defined_enum
3798 /* Next enum. */
3799 struct ieee_defined_enum *next;
3800 /* Type index. */
3801 unsigned int indx;
3802 /* Whether this enum has been defined. */
3803 boolean defined;
3804 /* Tag. */
3805 const char *tag;
3806 /* Names. */
3807 const char **names;
3808 /* Values. */
3809 bfd_signed_vma *vals;
3812 /* We keep a list of modified versions of types, so that we don't
3813 output them more than once. */
3815 struct ieee_modified_type
3817 /* Pointer to this type. */
3818 unsigned int pointer;
3819 /* Function with unknown arguments returning this type. */
3820 unsigned int function;
3821 /* Const version of this type. */
3822 unsigned int const_qualified;
3823 /* Volatile version of this type. */
3824 unsigned int volatile_qualified;
3825 /* List of arrays of this type of various bounds. */
3826 struct ieee_modified_array_type *arrays;
3829 /* A list of arrays bounds. */
3831 struct ieee_modified_array_type
3833 /* Next array bounds. */
3834 struct ieee_modified_array_type *next;
3835 /* Type index with these bounds. */
3836 unsigned int indx;
3837 /* Low bound. */
3838 bfd_signed_vma low;
3839 /* High bound. */
3840 bfd_signed_vma high;
3843 /* This is a list of pending function parameter information. We don't
3844 output them until we see the first block. */
3846 struct ieee_pending_parm
3848 /* Next pending parameter. */
3849 struct ieee_pending_parm *next;
3850 /* Name. */
3851 const char *name;
3852 /* Type index. */
3853 unsigned int type;
3854 /* Whether the type is a reference. */
3855 boolean referencep;
3856 /* Kind. */
3857 enum debug_parm_kind kind;
3858 /* Value. */
3859 bfd_vma val;
3862 /* This is the handle passed down by debug_write. */
3864 struct ieee_handle
3866 /* BFD we are writing to. */
3867 bfd *abfd;
3868 /* Whether we got an error in a subroutine called via traverse or
3869 map_over_sections. */
3870 boolean error;
3871 /* Current data buffer list. */
3872 struct ieee_buflist *current;
3873 /* Current data buffer. */
3874 struct ieee_buf *curbuf;
3875 /* Filename of current compilation unit. */
3876 const char *filename;
3877 /* Module name of current compilation unit. */
3878 const char *modname;
3879 /* List of buffer for global types. */
3880 struct ieee_buflist global_types;
3881 /* List of finished data buffers. */
3882 struct ieee_buflist data;
3883 /* List of buffers for typedefs in the current compilation unit. */
3884 struct ieee_buflist types;
3885 /* List of buffers for variables and functions in the current
3886 compilation unit. */
3887 struct ieee_buflist vars;
3888 /* List of buffers for C++ class definitions in the current
3889 compilation unit. */
3890 struct ieee_buflist cxx;
3891 /* List of buffers for line numbers in the current compilation unit. */
3892 struct ieee_buflist linenos;
3893 /* Ranges for the current compilation unit. */
3894 struct ieee_range *ranges;
3895 /* Ranges for all debugging information. */
3896 struct ieee_range *global_ranges;
3897 /* Nested pending ranges. */
3898 struct ieee_range *pending_ranges;
3899 /* Type stack. */
3900 struct ieee_type_stack *type_stack;
3901 /* Next unallocated type index. */
3902 unsigned int type_indx;
3903 /* Next unallocated name index. */
3904 unsigned int name_indx;
3905 /* Typedefs. */
3906 struct ieee_name_type_hash_table typedefs;
3907 /* Tags. */
3908 struct ieee_name_type_hash_table tags;
3909 /* Enums. */
3910 struct ieee_defined_enum *enums;
3911 /* Modified versions of types. */
3912 struct ieee_modified_type *modified;
3913 /* Number of entries allocated in modified. */
3914 unsigned int modified_alloc;
3915 /* 4 byte complex type. */
3916 unsigned int complex_float_index;
3917 /* 8 byte complex type. */
3918 unsigned int complex_double_index;
3919 /* The depth of block nesting. This is 0 outside a function, and 1
3920 just after start_function is called. */
3921 unsigned int block_depth;
3922 /* The name of the current function. */
3923 const char *fnname;
3924 /* List of buffers for the type of the function we are currently
3925 writing out. */
3926 struct ieee_buflist fntype;
3927 /* List of buffers for the parameters of the function we are
3928 currently writing out. */
3929 struct ieee_buflist fnargs;
3930 /* Number of arguments written to fnargs. */
3931 unsigned int fnargcount;
3932 /* Pending function parameters. */
3933 struct ieee_pending_parm *pending_parms;
3934 /* Current line number filename. */
3935 const char *lineno_filename;
3936 /* Line number name index. */
3937 unsigned int lineno_name_indx;
3938 /* Filename of pending line number. */
3939 const char *pending_lineno_filename;
3940 /* Pending line number. */
3941 unsigned long pending_lineno;
3942 /* Address of pending line number. */
3943 bfd_vma pending_lineno_addr;
3944 /* Highest address seen at end of procedure. */
3945 bfd_vma highaddr;
3948 static boolean ieee_init_buffer
3949 PARAMS ((struct ieee_handle *, struct ieee_buflist *));
3950 static boolean ieee_change_buffer
3951 PARAMS ((struct ieee_handle *, struct ieee_buflist *));
3952 static boolean ieee_append_buffer
3953 PARAMS ((struct ieee_handle *, struct ieee_buflist *,
3954 struct ieee_buflist *));
3955 static boolean ieee_real_write_byte PARAMS ((struct ieee_handle *, int));
3956 static boolean ieee_write_2bytes PARAMS ((struct ieee_handle *, int));
3957 static boolean ieee_write_number PARAMS ((struct ieee_handle *, bfd_vma));
3958 static boolean ieee_write_id PARAMS ((struct ieee_handle *, const char *));
3959 static boolean ieee_write_asn
3960 PARAMS ((struct ieee_handle *, unsigned int, bfd_vma));
3961 static boolean ieee_write_atn65
3962 PARAMS ((struct ieee_handle *, unsigned int, const char *));
3963 static boolean ieee_push_type
3964 PARAMS ((struct ieee_handle *, unsigned int, unsigned int, boolean,
3965 boolean));
3966 static unsigned int ieee_pop_type PARAMS ((struct ieee_handle *));
3967 static void ieee_pop_unused_type PARAMS ((struct ieee_handle *));
3968 static unsigned int ieee_pop_type_used
3969 PARAMS ((struct ieee_handle *, boolean));
3970 static boolean ieee_add_range
3971 PARAMS ((struct ieee_handle *, boolean, bfd_vma, bfd_vma));
3972 static boolean ieee_start_range PARAMS ((struct ieee_handle *, bfd_vma));
3973 static boolean ieee_end_range PARAMS ((struct ieee_handle *, bfd_vma));
3974 static boolean ieee_define_type
3975 PARAMS ((struct ieee_handle *, unsigned int, boolean, boolean));
3976 static boolean ieee_define_named_type
3977 PARAMS ((struct ieee_handle *, const char *, unsigned int, unsigned int,
3978 boolean, boolean, struct ieee_buflist *));
3979 static struct ieee_modified_type *ieee_get_modified_info
3980 PARAMS ((struct ieee_handle *, unsigned int));
3981 static struct bfd_hash_entry *ieee_name_type_newfunc
3982 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
3983 static boolean ieee_write_undefined_tag
3984 PARAMS ((struct ieee_name_type_hash_entry *, PTR));
3985 static boolean ieee_finish_compilation_unit PARAMS ((struct ieee_handle *));
3986 static void ieee_add_bb11_blocks PARAMS ((bfd *, asection *, PTR));
3987 static boolean ieee_add_bb11
3988 PARAMS ((struct ieee_handle *, asection *, bfd_vma, bfd_vma));
3989 static boolean ieee_output_pending_parms PARAMS ((struct ieee_handle *));
3990 static unsigned int ieee_vis_to_flags PARAMS ((enum debug_visibility));
3991 static boolean ieee_class_method_var
3992 PARAMS ((struct ieee_handle *, const char *, enum debug_visibility, boolean,
3993 boolean, boolean, bfd_vma, boolean));
3995 static boolean ieee_start_compilation_unit PARAMS ((PTR, const char *));
3996 static boolean ieee_start_source PARAMS ((PTR, const char *));
3997 static boolean ieee_empty_type PARAMS ((PTR));
3998 static boolean ieee_void_type PARAMS ((PTR));
3999 static boolean ieee_int_type PARAMS ((PTR, unsigned int, boolean));
4000 static boolean ieee_float_type PARAMS ((PTR, unsigned int));
4001 static boolean ieee_complex_type PARAMS ((PTR, unsigned int));
4002 static boolean ieee_bool_type PARAMS ((PTR, unsigned int));
4003 static boolean ieee_enum_type
4004 PARAMS ((PTR, const char *, const char **, bfd_signed_vma *));
4005 static boolean ieee_pointer_type PARAMS ((PTR));
4006 static boolean ieee_function_type PARAMS ((PTR, int, boolean));
4007 static boolean ieee_reference_type PARAMS ((PTR));
4008 static boolean ieee_range_type PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma));
4009 static boolean ieee_array_type
4010 PARAMS ((PTR, bfd_signed_vma, bfd_signed_vma, boolean));
4011 static boolean ieee_set_type PARAMS ((PTR, boolean));
4012 static boolean ieee_offset_type PARAMS ((PTR));
4013 static boolean ieee_method_type PARAMS ((PTR, boolean, int, boolean));
4014 static boolean ieee_const_type PARAMS ((PTR));
4015 static boolean ieee_volatile_type PARAMS ((PTR));
4016 static boolean ieee_start_struct_type
4017 PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int));
4018 static boolean ieee_struct_field
4019 PARAMS ((PTR, const char *, bfd_vma, bfd_vma, enum debug_visibility));
4020 static boolean ieee_end_struct_type PARAMS ((PTR));
4021 static boolean ieee_start_class_type
4022 PARAMS ((PTR, const char *, unsigned int, boolean, unsigned int, boolean,
4023 boolean));
4024 static boolean ieee_class_static_member
4025 PARAMS ((PTR, const char *, const char *, enum debug_visibility));
4026 static boolean ieee_class_baseclass
4027 PARAMS ((PTR, bfd_vma, boolean, enum debug_visibility));
4028 static boolean ieee_class_start_method PARAMS ((PTR, const char *));
4029 static boolean ieee_class_method_variant
4030 PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean,
4031 bfd_vma, boolean));
4032 static boolean ieee_class_static_method_variant
4033 PARAMS ((PTR, const char *, enum debug_visibility, boolean, boolean));
4034 static boolean ieee_class_end_method PARAMS ((PTR));
4035 static boolean ieee_end_class_type PARAMS ((PTR));
4036 static boolean ieee_typedef_type PARAMS ((PTR, const char *));
4037 static boolean ieee_tag_type
4038 PARAMS ((PTR, const char *, unsigned int, enum debug_type_kind));
4039 static boolean ieee_typdef PARAMS ((PTR, const char *));
4040 static boolean ieee_tag PARAMS ((PTR, const char *));
4041 static boolean ieee_int_constant PARAMS ((PTR, const char *, bfd_vma));
4042 static boolean ieee_float_constant PARAMS ((PTR, const char *, double));
4043 static boolean ieee_typed_constant PARAMS ((PTR, const char *, bfd_vma));
4044 static boolean ieee_variable
4045 PARAMS ((PTR, const char *, enum debug_var_kind, bfd_vma));
4046 static boolean ieee_start_function PARAMS ((PTR, const char *, boolean));
4047 static boolean ieee_function_parameter
4048 PARAMS ((PTR, const char *, enum debug_parm_kind, bfd_vma));
4049 static boolean ieee_start_block PARAMS ((PTR, bfd_vma));
4050 static boolean ieee_end_block PARAMS ((PTR, bfd_vma));
4051 static boolean ieee_end_function PARAMS ((PTR));
4052 static boolean ieee_lineno
4053 PARAMS ((PTR, const char *, unsigned long, bfd_vma));
4055 static const struct debug_write_fns ieee_fns =
4057 ieee_start_compilation_unit,
4058 ieee_start_source,
4059 ieee_empty_type,
4060 ieee_void_type,
4061 ieee_int_type,
4062 ieee_float_type,
4063 ieee_complex_type,
4064 ieee_bool_type,
4065 ieee_enum_type,
4066 ieee_pointer_type,
4067 ieee_function_type,
4068 ieee_reference_type,
4069 ieee_range_type,
4070 ieee_array_type,
4071 ieee_set_type,
4072 ieee_offset_type,
4073 ieee_method_type,
4074 ieee_const_type,
4075 ieee_volatile_type,
4076 ieee_start_struct_type,
4077 ieee_struct_field,
4078 ieee_end_struct_type,
4079 ieee_start_class_type,
4080 ieee_class_static_member,
4081 ieee_class_baseclass,
4082 ieee_class_start_method,
4083 ieee_class_method_variant,
4084 ieee_class_static_method_variant,
4085 ieee_class_end_method,
4086 ieee_end_class_type,
4087 ieee_typedef_type,
4088 ieee_tag_type,
4089 ieee_typdef,
4090 ieee_tag,
4091 ieee_int_constant,
4092 ieee_float_constant,
4093 ieee_typed_constant,
4094 ieee_variable,
4095 ieee_start_function,
4096 ieee_function_parameter,
4097 ieee_start_block,
4098 ieee_end_block,
4099 ieee_end_function,
4100 ieee_lineno
4103 /* Initialize a buffer to be empty. */
4105 static boolean
4106 ieee_init_buffer (info, buflist)
4107 struct ieee_handle *info ATTRIBUTE_UNUSED;
4108 struct ieee_buflist *buflist;
4110 buflist->head = NULL;
4111 buflist->tail = NULL;
4112 return true;
4115 /* See whether a buffer list has any data. */
4117 #define ieee_buffer_emptyp(buflist) ((buflist)->head == NULL)
4119 /* Change the current buffer to a specified buffer chain. */
4121 static boolean
4122 ieee_change_buffer (info, buflist)
4123 struct ieee_handle *info;
4124 struct ieee_buflist *buflist;
4126 if (buflist->head == NULL)
4128 struct ieee_buf *buf;
4130 buf = (struct ieee_buf *) xmalloc (sizeof *buf);
4131 buf->next = NULL;
4132 buf->c = 0;
4133 buflist->head = buf;
4134 buflist->tail = buf;
4137 info->current = buflist;
4138 info->curbuf = buflist->tail;
4140 return true;
4143 /* Append a buffer chain. */
4145 static boolean
4146 ieee_append_buffer (info, mainbuf, newbuf)
4147 struct ieee_handle *info ATTRIBUTE_UNUSED;
4148 struct ieee_buflist *mainbuf;
4149 struct ieee_buflist *newbuf;
4151 if (newbuf->head != NULL)
4153 if (mainbuf->head == NULL)
4154 mainbuf->head = newbuf->head;
4155 else
4156 mainbuf->tail->next = newbuf->head;
4157 mainbuf->tail = newbuf->tail;
4159 return true;
4162 /* Write a byte into the buffer. We use a macro for speed and a
4163 function for the complex cases. */
4165 #define ieee_write_byte(info, b) \
4166 ((info)->curbuf->c < IEEE_BUFSIZE \
4167 ? ((info)->curbuf->buf[(info)->curbuf->c++] = (b), true) \
4168 : ieee_real_write_byte ((info), (b)))
4170 static boolean
4171 ieee_real_write_byte (info, b)
4172 struct ieee_handle *info;
4173 int b;
4175 if (info->curbuf->c >= IEEE_BUFSIZE)
4177 struct ieee_buf *n;
4179 n = (struct ieee_buf *) xmalloc (sizeof *n);
4180 n->next = NULL;
4181 n->c = 0;
4182 if (info->current->head == NULL)
4183 info->current->head = n;
4184 else
4185 info->current->tail->next = n;
4186 info->current->tail = n;
4187 info->curbuf = n;
4190 info->curbuf->buf[info->curbuf->c] = b;
4191 ++info->curbuf->c;
4193 return true;
4196 /* Write out two bytes. */
4198 static boolean
4199 ieee_write_2bytes (info, i)
4200 struct ieee_handle *info;
4201 int i;
4203 return (ieee_write_byte (info, i >> 8)
4204 && ieee_write_byte (info, i & 0xff));
4207 /* Write out an integer. */
4209 static boolean
4210 ieee_write_number (info, v)
4211 struct ieee_handle *info;
4212 bfd_vma v;
4214 bfd_vma t;
4215 bfd_byte ab[20];
4216 bfd_byte *p;
4217 unsigned int c;
4219 if (v <= (bfd_vma) ieee_number_end_enum)
4220 return ieee_write_byte (info, (int) v);
4222 t = v;
4223 p = ab + sizeof ab;
4224 while (t != 0)
4226 *--p = t & 0xff;
4227 t >>= 8;
4229 c = (ab + 20) - p;
4231 if (c > (unsigned int) (ieee_number_repeat_end_enum
4232 - ieee_number_repeat_start_enum))
4234 fprintf (stderr, _("IEEE numeric overflow: 0x"));
4235 fprintf_vma (stderr, v);
4236 fprintf (stderr, "\n");
4237 return false;
4240 if (! ieee_write_byte (info, (int) ieee_number_repeat_start_enum + c))
4241 return false;
4242 for (; c > 0; --c, ++p)
4244 if (! ieee_write_byte (info, *p))
4245 return false;
4248 return true;
4251 /* Write out a string. */
4253 static boolean
4254 ieee_write_id (info, s)
4255 struct ieee_handle *info;
4256 const char *s;
4258 unsigned int len;
4260 len = strlen (s);
4261 if (len <= 0x7f)
4263 if (! ieee_write_byte (info, len))
4264 return false;
4266 else if (len <= 0xff)
4268 if (! ieee_write_byte (info, (int) ieee_extension_length_1_enum)
4269 || ! ieee_write_byte (info, len))
4270 return false;
4272 else if (len <= 0xffff)
4274 if (! ieee_write_byte (info, (int) ieee_extension_length_2_enum)
4275 || ! ieee_write_2bytes (info, len))
4276 return false;
4278 else
4280 fprintf (stderr, _("IEEE string length overflow: %u\n"), len);
4281 return false;
4284 for (; *s != '\0'; s++)
4285 if (! ieee_write_byte (info, *s))
4286 return false;
4288 return true;
4291 /* Write out an ASN record. */
4293 static boolean
4294 ieee_write_asn (info, indx, val)
4295 struct ieee_handle *info;
4296 unsigned int indx;
4297 bfd_vma val;
4299 return (ieee_write_2bytes (info, (int) ieee_asn_record_enum)
4300 && ieee_write_number (info, indx)
4301 && ieee_write_number (info, val));
4304 /* Write out an ATN65 record. */
4306 static boolean
4307 ieee_write_atn65 (info, indx, s)
4308 struct ieee_handle *info;
4309 unsigned int indx;
4310 const char *s;
4312 return (ieee_write_2bytes (info, (int) ieee_atn_record_enum)
4313 && ieee_write_number (info, indx)
4314 && ieee_write_number (info, 0)
4315 && ieee_write_number (info, 65)
4316 && ieee_write_id (info, s));
4319 /* Push a type index onto the type stack. */
4321 static boolean
4322 ieee_push_type (info, indx, size, unsignedp, localp)
4323 struct ieee_handle *info;
4324 unsigned int indx;
4325 unsigned int size;
4326 boolean unsignedp;
4327 boolean localp;
4329 struct ieee_type_stack *ts;
4331 ts = (struct ieee_type_stack *) xmalloc (sizeof *ts);
4332 memset (ts, 0, sizeof *ts);
4334 ts->type.indx = indx;
4335 ts->type.size = size;
4336 ts->type.unsignedp = unsignedp;
4337 ts->type.localp = localp;
4339 ts->next = info->type_stack;
4340 info->type_stack = ts;
4342 return true;
4345 /* Pop a type index off the type stack. */
4347 static unsigned int
4348 ieee_pop_type (info)
4349 struct ieee_handle *info;
4351 return ieee_pop_type_used (info, true);
4354 /* Pop an unused type index off the type stack. */
4356 static void
4357 ieee_pop_unused_type (info)
4358 struct ieee_handle *info;
4360 (void) ieee_pop_type_used (info, false);
4363 /* Pop a used or unused type index off the type stack. */
4365 static unsigned int
4366 ieee_pop_type_used (info, used)
4367 struct ieee_handle *info;
4368 boolean used;
4370 struct ieee_type_stack *ts;
4371 unsigned int ret;
4373 ts = info->type_stack;
4374 assert (ts != NULL);
4376 /* If this is a function type, and we need it, we need to append the
4377 actual definition to the typedef block now. */
4378 if (used && ! ieee_buffer_emptyp (&ts->type.fndef))
4380 struct ieee_buflist *buflist;
4382 if (ts->type.localp)
4384 /* Make sure we have started the types block. */
4385 if (ieee_buffer_emptyp (&info->types))
4387 if (! ieee_change_buffer (info, &info->types)
4388 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4389 || ! ieee_write_byte (info, 1)
4390 || ! ieee_write_number (info, 0)
4391 || ! ieee_write_id (info, info->modname))
4392 return false;
4394 buflist = &info->types;
4396 else
4398 /* Make sure we started the global type block. */
4399 if (ieee_buffer_emptyp (&info->global_types))
4401 if (! ieee_change_buffer (info, &info->global_types)
4402 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4403 || ! ieee_write_byte (info, 2)
4404 || ! ieee_write_number (info, 0)
4405 || ! ieee_write_id (info, ""))
4406 return false;
4408 buflist = &info->global_types;
4411 if (! ieee_append_buffer (info, buflist, &ts->type.fndef))
4412 return false;
4415 ret = ts->type.indx;
4416 info->type_stack = ts->next;
4417 free (ts);
4418 return ret;
4421 /* Add a range of bytes included in the current compilation unit. */
4423 static boolean
4424 ieee_add_range (info, global, low, high)
4425 struct ieee_handle *info;
4426 boolean global;
4427 bfd_vma low;
4428 bfd_vma high;
4430 struct ieee_range **plist, *r, **pr;
4432 if (low == (bfd_vma) -1 || high == (bfd_vma) -1 || low == high)
4433 return true;
4435 if (global)
4436 plist = &info->global_ranges;
4437 else
4438 plist = &info->ranges;
4440 for (r = *plist; r != NULL; r = r->next)
4442 if (high >= r->low && low <= r->high)
4444 /* The new range overlaps r. */
4445 if (low < r->low)
4446 r->low = low;
4447 if (high > r->high)
4448 r->high = high;
4449 pr = &r->next;
4450 while (*pr != NULL && (*pr)->low <= r->high)
4452 struct ieee_range *n;
4454 if ((*pr)->high > r->high)
4455 r->high = (*pr)->high;
4456 n = (*pr)->next;
4457 free (*pr);
4458 *pr = n;
4460 return true;
4464 r = (struct ieee_range *) xmalloc (sizeof *r);
4465 memset (r, 0, sizeof *r);
4467 r->low = low;
4468 r->high = high;
4470 /* Store the ranges sorted by address. */
4471 for (pr = plist; *pr != NULL; pr = &(*pr)->next)
4472 if ((*pr)->low > high)
4473 break;
4474 r->next = *pr;
4475 *pr = r;
4477 return true;
4480 /* Start a new range for which we only have the low address. */
4482 static boolean
4483 ieee_start_range (info, low)
4484 struct ieee_handle *info;
4485 bfd_vma low;
4487 struct ieee_range *r;
4489 r = (struct ieee_range *) xmalloc (sizeof *r);
4490 memset (r, 0, sizeof *r);
4491 r->low = low;
4492 r->next = info->pending_ranges;
4493 info->pending_ranges = r;
4494 return true;
4497 /* Finish a range started by ieee_start_range. */
4499 static boolean
4500 ieee_end_range (info, high)
4501 struct ieee_handle *info;
4502 bfd_vma high;
4504 struct ieee_range *r;
4505 bfd_vma low;
4507 assert (info->pending_ranges != NULL);
4508 r = info->pending_ranges;
4509 low = r->low;
4510 info->pending_ranges = r->next;
4511 free (r);
4512 return ieee_add_range (info, false, low, high);
4515 /* Start defining a type. */
4517 static boolean
4518 ieee_define_type (info, size, unsignedp, localp)
4519 struct ieee_handle *info;
4520 unsigned int size;
4521 boolean unsignedp;
4522 boolean localp;
4524 return ieee_define_named_type (info, (const char *) NULL,
4525 (unsigned int) -1, size, unsignedp,
4526 localp, (struct ieee_buflist *) NULL);
4529 /* Start defining a named type. */
4531 static boolean
4532 ieee_define_named_type (info, name, indx, size, unsignedp, localp, buflist)
4533 struct ieee_handle *info;
4534 const char *name;
4535 unsigned int indx;
4536 unsigned int size;
4537 boolean unsignedp;
4538 boolean localp;
4539 struct ieee_buflist *buflist;
4541 unsigned int type_indx;
4542 unsigned int name_indx;
4544 if (indx != (unsigned int) -1)
4545 type_indx = indx;
4546 else
4548 type_indx = info->type_indx;
4549 ++info->type_indx;
4552 name_indx = info->name_indx;
4553 ++info->name_indx;
4555 if (name == NULL)
4556 name = "";
4558 /* If we were given a buffer, use it; otherwise, use either the
4559 local or the global type information, and make sure that the type
4560 block is started. */
4561 if (buflist != NULL)
4563 if (! ieee_change_buffer (info, buflist))
4564 return false;
4566 else if (localp)
4568 if (! ieee_buffer_emptyp (&info->types))
4570 if (! ieee_change_buffer (info, &info->types))
4571 return false;
4573 else
4575 if (! ieee_change_buffer (info, &info->types)
4576 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4577 || ! ieee_write_byte (info, 1)
4578 || ! ieee_write_number (info, 0)
4579 || ! ieee_write_id (info, info->modname))
4580 return false;
4583 else
4585 if (! ieee_buffer_emptyp (&info->global_types))
4587 if (! ieee_change_buffer (info, &info->global_types))
4588 return false;
4590 else
4592 if (! ieee_change_buffer (info, &info->global_types)
4593 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4594 || ! ieee_write_byte (info, 2)
4595 || ! ieee_write_number (info, 0)
4596 || ! ieee_write_id (info, ""))
4597 return false;
4601 /* Push the new type on the type stack, write out an NN record, and
4602 write out the start of a TY record. The caller will then finish
4603 the TY record. */
4604 if (! ieee_push_type (info, type_indx, size, unsignedp, localp))
4605 return false;
4607 return (ieee_write_byte (info, (int) ieee_nn_record)
4608 && ieee_write_number (info, name_indx)
4609 && ieee_write_id (info, name)
4610 && ieee_write_byte (info, (int) ieee_ty_record_enum)
4611 && ieee_write_number (info, type_indx)
4612 && ieee_write_byte (info, 0xce)
4613 && ieee_write_number (info, name_indx));
4616 /* Get an entry to the list of modified versions of a type. */
4618 static struct ieee_modified_type *
4619 ieee_get_modified_info (info, indx)
4620 struct ieee_handle *info;
4621 unsigned int indx;
4623 if (indx >= info->modified_alloc)
4625 unsigned int nalloc;
4627 nalloc = info->modified_alloc;
4628 if (nalloc == 0)
4629 nalloc = 16;
4630 while (indx >= nalloc)
4631 nalloc *= 2;
4632 info->modified = ((struct ieee_modified_type *)
4633 xrealloc (info->modified,
4634 nalloc * sizeof *info->modified));
4635 memset (info->modified + info->modified_alloc, 0,
4636 (nalloc - info->modified_alloc) * sizeof *info->modified);
4637 info->modified_alloc = nalloc;
4640 return info->modified + indx;
4643 /* Routines for the hash table mapping names to types. */
4645 /* Initialize an entry in the hash table. */
4647 static struct bfd_hash_entry *
4648 ieee_name_type_newfunc (entry, table, string)
4649 struct bfd_hash_entry *entry;
4650 struct bfd_hash_table *table;
4651 const char *string;
4653 struct ieee_name_type_hash_entry *ret =
4654 (struct ieee_name_type_hash_entry *) entry;
4656 /* Allocate the structure if it has not already been allocated by a
4657 subclass. */
4658 if (ret == NULL)
4659 ret = ((struct ieee_name_type_hash_entry *)
4660 bfd_hash_allocate (table, sizeof *ret));
4661 if (ret == NULL)
4662 return NULL;
4664 /* Call the allocation method of the superclass. */
4665 ret = ((struct ieee_name_type_hash_entry *)
4666 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
4667 if (ret)
4669 /* Set local fields. */
4670 ret->types = NULL;
4673 return (struct bfd_hash_entry *) ret;
4676 /* Look up an entry in the hash table. */
4678 #define ieee_name_type_hash_lookup(table, string, create, copy) \
4679 ((struct ieee_name_type_hash_entry *) \
4680 bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
4682 /* Traverse the hash table. */
4684 #define ieee_name_type_hash_traverse(table, func, info) \
4685 (bfd_hash_traverse \
4686 (&(table)->root, \
4687 (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) (func), \
4688 (info)))
4690 /* The general routine to write out IEEE debugging information. */
4692 boolean
4693 write_ieee_debugging_info (abfd, dhandle)
4694 bfd *abfd;
4695 PTR dhandle;
4697 struct ieee_handle info;
4698 asection *s;
4699 const char *err;
4700 struct ieee_buf *b;
4702 memset (&info, 0, sizeof info);
4703 info.abfd = abfd;
4704 info.type_indx = 256;
4705 info.name_indx = 32;
4707 if (! bfd_hash_table_init (&info.typedefs.root, ieee_name_type_newfunc)
4708 || ! bfd_hash_table_init (&info.tags.root, ieee_name_type_newfunc))
4709 return false;
4711 if (! ieee_init_buffer (&info, &info.global_types)
4712 || ! ieee_init_buffer (&info, &info.data)
4713 || ! ieee_init_buffer (&info, &info.types)
4714 || ! ieee_init_buffer (&info, &info.vars)
4715 || ! ieee_init_buffer (&info, &info.cxx)
4716 || ! ieee_init_buffer (&info, &info.linenos)
4717 || ! ieee_init_buffer (&info, &info.fntype)
4718 || ! ieee_init_buffer (&info, &info.fnargs))
4719 return false;
4721 if (! debug_write (dhandle, &ieee_fns, (PTR) &info))
4722 return false;
4724 if (info.filename != NULL)
4726 if (! ieee_finish_compilation_unit (&info))
4727 return false;
4730 /* Put any undefined tags in the global typedef information. */
4731 info.error = false;
4732 ieee_name_type_hash_traverse (&info.tags,
4733 ieee_write_undefined_tag,
4734 (PTR) &info);
4735 if (info.error)
4736 return false;
4738 /* Prepend the global typedef information to the other data. */
4739 if (! ieee_buffer_emptyp (&info.global_types))
4741 /* The HP debugger seems to have a bug in which it ignores the
4742 last entry in the global types, so we add a dummy entry. */
4743 if (! ieee_change_buffer (&info, &info.global_types)
4744 || ! ieee_write_byte (&info, (int) ieee_nn_record)
4745 || ! ieee_write_number (&info, info.name_indx)
4746 || ! ieee_write_id (&info, "")
4747 || ! ieee_write_byte (&info, (int) ieee_ty_record_enum)
4748 || ! ieee_write_number (&info, info.type_indx)
4749 || ! ieee_write_byte (&info, 0xce)
4750 || ! ieee_write_number (&info, info.name_indx)
4751 || ! ieee_write_number (&info, 'P')
4752 || ! ieee_write_number (&info, (int) builtin_void + 32)
4753 || ! ieee_write_byte (&info, (int) ieee_be_record_enum))
4754 return false;
4756 if (! ieee_append_buffer (&info, &info.global_types, &info.data))
4757 return false;
4758 info.data = info.global_types;
4761 /* Make sure that we have declare BB11 blocks for each range in the
4762 file. They are added to info->vars. */
4763 info.error = false;
4764 if (! ieee_init_buffer (&info, &info.vars))
4765 return false;
4766 bfd_map_over_sections (abfd, ieee_add_bb11_blocks, (PTR) &info);
4767 if (info.error)
4768 return false;
4769 if (! ieee_buffer_emptyp (&info.vars))
4771 if (! ieee_change_buffer (&info, &info.vars)
4772 || ! ieee_write_byte (&info, (int) ieee_be_record_enum))
4773 return false;
4775 if (! ieee_append_buffer (&info, &info.data, &info.vars))
4776 return false;
4779 /* Now all the data is in info.data. Write it out to the BFD. We
4780 normally would need to worry about whether all the other sections
4781 are set up yet, but the IEEE backend will handle this particular
4782 case correctly regardless. */
4783 if (ieee_buffer_emptyp (&info.data))
4785 /* There is no debugging information. */
4786 return true;
4788 err = NULL;
4789 s = bfd_make_section (abfd, ".debug");
4790 if (s == NULL)
4791 err = "bfd_make_section";
4792 if (err == NULL)
4794 if (! bfd_set_section_flags (abfd, s, SEC_DEBUGGING | SEC_HAS_CONTENTS))
4795 err = "bfd_set_section_flags";
4797 if (err == NULL)
4799 bfd_size_type size;
4801 size = 0;
4802 for (b = info.data.head; b != NULL; b = b->next)
4803 size += b->c;
4804 if (! bfd_set_section_size (abfd, s, size))
4805 err = "bfd_set_section_size";
4807 if (err == NULL)
4809 file_ptr offset;
4811 offset = 0;
4812 for (b = info.data.head; b != NULL; b = b->next)
4814 if (! bfd_set_section_contents (abfd, s, b->buf, offset, b->c))
4816 err = "bfd_set_section_contents";
4817 break;
4819 offset += b->c;
4823 if (err != NULL)
4825 fprintf (stderr, "%s: %s: %s\n", bfd_get_filename (abfd), err,
4826 bfd_errmsg (bfd_get_error ()));
4827 return false;
4830 bfd_hash_table_free (&info.typedefs.root);
4831 bfd_hash_table_free (&info.tags.root);
4833 return true;
4836 /* Write out information for an undefined tag. This is called via
4837 ieee_name_type_hash_traverse. */
4839 static boolean
4840 ieee_write_undefined_tag (h, p)
4841 struct ieee_name_type_hash_entry *h;
4842 PTR p;
4844 struct ieee_handle *info = (struct ieee_handle *) p;
4845 struct ieee_name_type *nt;
4847 for (nt = h->types; nt != NULL; nt = nt->next)
4849 unsigned int name_indx;
4850 char code;
4852 if (nt->kind == DEBUG_KIND_ILLEGAL)
4853 continue;
4855 if (ieee_buffer_emptyp (&info->global_types))
4857 if (! ieee_change_buffer (info, &info->global_types)
4858 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4859 || ! ieee_write_byte (info, 2)
4860 || ! ieee_write_number (info, 0)
4861 || ! ieee_write_id (info, ""))
4863 info->error = true;
4864 return false;
4867 else
4869 if (! ieee_change_buffer (info, &info->global_types))
4871 info->error = true;
4872 return false;
4876 name_indx = info->name_indx;
4877 ++info->name_indx;
4878 if (! ieee_write_byte (info, (int) ieee_nn_record)
4879 || ! ieee_write_number (info, name_indx)
4880 || ! ieee_write_id (info, nt->type.name)
4881 || ! ieee_write_byte (info, (int) ieee_ty_record_enum)
4882 || ! ieee_write_number (info, nt->type.indx)
4883 || ! ieee_write_byte (info, 0xce)
4884 || ! ieee_write_number (info, name_indx))
4886 info->error = true;
4887 return false;
4890 switch (nt->kind)
4892 default:
4893 abort ();
4894 info->error = true;
4895 return false;
4896 case DEBUG_KIND_STRUCT:
4897 case DEBUG_KIND_CLASS:
4898 code = 'S';
4899 break;
4900 case DEBUG_KIND_UNION:
4901 case DEBUG_KIND_UNION_CLASS:
4902 code = 'U';
4903 break;
4904 case DEBUG_KIND_ENUM:
4905 code = 'E';
4906 break;
4908 if (! ieee_write_number (info, code)
4909 || ! ieee_write_number (info, 0))
4911 info->error = true;
4912 return false;
4916 return true;
4919 /* Start writing out information for a compilation unit. */
4921 static boolean
4922 ieee_start_compilation_unit (p, filename)
4923 PTR p;
4924 const char *filename;
4926 struct ieee_handle *info = (struct ieee_handle *) p;
4927 const char *modname;
4928 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
4929 const char *backslash;
4930 #endif
4931 char *c, *s;
4932 unsigned int nindx;
4934 if (info->filename != NULL)
4936 if (! ieee_finish_compilation_unit (info))
4937 return false;
4940 info->filename = filename;
4941 modname = strrchr (filename, '/');
4942 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
4943 /* We could have a mixed forward/back slash case. */
4944 backslash = strrchr (filename, '\\');
4945 if (modname == NULL || (backslash != NULL && backslash > modname))
4946 modname = backslash;
4947 #endif
4949 if (modname != NULL)
4950 ++modname;
4951 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
4952 else if (filename[0] && filename[1] == ':')
4953 modname = filename + 2;
4954 #endif
4955 else
4956 modname = filename;
4958 c = xstrdup (modname);
4959 s = strrchr (c, '.');
4960 if (s != NULL)
4961 *s = '\0';
4962 info->modname = c;
4964 if (! ieee_init_buffer (info, &info->types)
4965 || ! ieee_init_buffer (info, &info->vars)
4966 || ! ieee_init_buffer (info, &info->cxx)
4967 || ! ieee_init_buffer (info, &info->linenos))
4968 return false;
4969 info->ranges = NULL;
4971 /* Always include a BB1 and a BB3 block. That is what the output of
4972 the MRI linker seems to look like. */
4973 if (! ieee_change_buffer (info, &info->types)
4974 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4975 || ! ieee_write_byte (info, 1)
4976 || ! ieee_write_number (info, 0)
4977 || ! ieee_write_id (info, info->modname))
4978 return false;
4980 nindx = info->name_indx;
4981 ++info->name_indx;
4982 if (! ieee_change_buffer (info, &info->vars)
4983 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4984 || ! ieee_write_byte (info, 3)
4985 || ! ieee_write_number (info, 0)
4986 || ! ieee_write_id (info, info->modname))
4987 return false;
4989 return true;
4992 /* Finish up a compilation unit. */
4994 static boolean
4995 ieee_finish_compilation_unit (info)
4996 struct ieee_handle *info;
4998 struct ieee_range *r;
5000 if (! ieee_buffer_emptyp (&info->types))
5002 if (! ieee_change_buffer (info, &info->types)
5003 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
5004 return false;
5007 if (! ieee_buffer_emptyp (&info->cxx))
5009 /* Append any C++ information to the global function and
5010 variable information. */
5011 assert (! ieee_buffer_emptyp (&info->vars));
5012 if (! ieee_change_buffer (info, &info->vars))
5013 return false;
5015 /* We put the pmisc records in a dummy procedure, just as the
5016 MRI compiler does. */
5017 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
5018 || ! ieee_write_byte (info, 6)
5019 || ! ieee_write_number (info, 0)
5020 || ! ieee_write_id (info, "__XRYCPP")
5021 || ! ieee_write_number (info, 0)
5022 || ! ieee_write_number (info, 0)
5023 || ! ieee_write_number (info, info->highaddr - 1)
5024 || ! ieee_append_buffer (info, &info->vars, &info->cxx)
5025 || ! ieee_change_buffer (info, &info->vars)
5026 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
5027 || ! ieee_write_number (info, info->highaddr - 1))
5028 return false;
5031 if (! ieee_buffer_emptyp (&info->vars))
5033 if (! ieee_change_buffer (info, &info->vars)
5034 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
5035 return false;
5038 if (info->pending_lineno_filename != NULL)
5040 /* Force out the pending line number. */
5041 if (! ieee_lineno ((PTR) info, (const char *) NULL, 0, (bfd_vma) -1))
5042 return false;
5044 if (! ieee_buffer_emptyp (&info->linenos))
5046 if (! ieee_change_buffer (info, &info->linenos)
5047 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
5048 return false;
5049 if (strcmp (info->filename, info->lineno_filename) != 0)
5051 /* We were not in the main file. We just closed the
5052 included line number block, and now we must close the
5053 main line number block. */
5054 if (! ieee_write_byte (info, (int) ieee_be_record_enum))
5055 return false;
5059 if (! ieee_append_buffer (info, &info->data, &info->types)
5060 || ! ieee_append_buffer (info, &info->data, &info->vars)
5061 || ! ieee_append_buffer (info, &info->data, &info->linenos))
5062 return false;
5064 /* Build BB10/BB11 blocks based on the ranges we recorded. */
5065 if (! ieee_change_buffer (info, &info->data))
5066 return false;
5068 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
5069 || ! ieee_write_byte (info, 10)
5070 || ! ieee_write_number (info, 0)
5071 || ! ieee_write_id (info, info->modname)
5072 || ! ieee_write_id (info, "")
5073 || ! ieee_write_number (info, 0)
5074 || ! ieee_write_id (info, "GNU objcopy"))
5075 return false;
5077 for (r = info->ranges; r != NULL; r = r->next)
5079 bfd_vma low, high;
5080 asection *s;
5081 int kind;
5083 low = r->low;
5084 high = r->high;
5086 /* Find the section corresponding to this range. */
5087 for (s = info->abfd->sections; s != NULL; s = s->next)
5089 if (bfd_get_section_vma (info->abfd, s) <= low
5090 && high <= (bfd_get_section_vma (info->abfd, s)
5091 + bfd_section_size (info->abfd, s)))
5092 break;
5095 if (s == NULL)
5097 /* Just ignore this range. */
5098 continue;
5101 /* Coalesce ranges if it seems reasonable. */
5102 while (r->next != NULL
5103 && high + 0x1000 >= r->next->low
5104 && (r->next->high
5105 <= (bfd_get_section_vma (info->abfd, s)
5106 + bfd_section_size (info->abfd, s))))
5108 r = r->next;
5109 high = r->high;
5112 if ((s->flags & SEC_CODE) != 0)
5113 kind = 1;
5114 else if ((s->flags & SEC_READONLY) != 0)
5115 kind = 3;
5116 else
5117 kind = 2;
5119 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
5120 || ! ieee_write_byte (info, 11)
5121 || ! ieee_write_number (info, 0)
5122 || ! ieee_write_id (info, "")
5123 || ! ieee_write_number (info, kind)
5124 || ! ieee_write_number (info, s->index + IEEE_SECTION_NUMBER_BASE)
5125 || ! ieee_write_number (info, low)
5126 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
5127 || ! ieee_write_number (info, high - low))
5128 return false;
5130 /* Add this range to the list of global ranges. */
5131 if (! ieee_add_range (info, true, low, high))
5132 return false;
5135 if (! ieee_write_byte (info, (int) ieee_be_record_enum))
5136 return false;
5138 return true;
5141 /* Add BB11 blocks describing each range that we have not already
5142 described. */
5144 static void
5145 ieee_add_bb11_blocks (abfd, sec, data)
5146 bfd *abfd ATTRIBUTE_UNUSED;
5147 asection *sec;
5148 PTR data;
5150 struct ieee_handle *info = (struct ieee_handle *) data;
5151 bfd_vma low, high;
5152 struct ieee_range *r;
5154 low = bfd_get_section_vma (abfd, sec);
5155 high = low + bfd_section_size (abfd, sec);
5157 /* Find the first range at or after this section. The ranges are
5158 sorted by address. */
5159 for (r = info->global_ranges; r != NULL; r = r->next)
5160 if (r->high > low)
5161 break;
5163 while (low < high)
5165 if (r == NULL || r->low >= high)
5167 if (! ieee_add_bb11 (info, sec, low, high))
5168 info->error = true;
5169 return;
5172 if (low < r->low
5173 && r->low - low > 0x100)
5175 if (! ieee_add_bb11 (info, sec, low, r->low))
5177 info->error = true;
5178 return;
5181 low = r->high;
5183 r = r->next;
5187 /* Add a single BB11 block for a range. We add it to info->vars. */
5189 static boolean
5190 ieee_add_bb11 (info, sec, low, high)
5191 struct ieee_handle *info;
5192 asection *sec;
5193 bfd_vma low;
5194 bfd_vma high;
5196 int kind;
5198 if (! ieee_buffer_emptyp (&info->vars))
5200 if (! ieee_change_buffer (info, &info->vars))
5201 return false;
5203 else
5205 const char *filename, *modname;
5206 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5207 const char *backslash;
5208 #endif
5209 char *c, *s;
5211 /* Start the enclosing BB10 block. */
5212 filename = bfd_get_filename (info->abfd);
5213 modname = strrchr (filename, '/');
5214 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5215 backslash = strrchr (filename, '\\');
5216 if (modname == NULL || (backslash != NULL && backslash > modname))
5217 modname = backslash;
5218 #endif
5220 if (modname != NULL)
5221 ++modname;
5222 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5223 else if (filename[0] && filename[1] == ':')
5224 modname = filename + 2;
5225 #endif
5226 else
5227 modname = filename;
5229 c = xstrdup (modname);
5230 s = strrchr (c, '.');
5231 if (s != NULL)
5232 *s = '\0';
5234 if (! ieee_change_buffer (info, &info->vars)
5235 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
5236 || ! ieee_write_byte (info, 10)
5237 || ! ieee_write_number (info, 0)
5238 || ! ieee_write_id (info, c)
5239 || ! ieee_write_id (info, "")
5240 || ! ieee_write_number (info, 0)
5241 || ! ieee_write_id (info, "GNU objcopy"))
5242 return false;
5244 free (c);
5247 if ((sec->flags & SEC_CODE) != 0)
5248 kind = 1;
5249 else if ((sec->flags & SEC_READONLY) != 0)
5250 kind = 3;
5251 else
5252 kind = 2;
5254 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
5255 || ! ieee_write_byte (info, 11)
5256 || ! ieee_write_number (info, 0)
5257 || ! ieee_write_id (info, "")
5258 || ! ieee_write_number (info, kind)
5259 || ! ieee_write_number (info, sec->index + IEEE_SECTION_NUMBER_BASE)
5260 || ! ieee_write_number (info, low)
5261 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
5262 || ! ieee_write_number (info, high - low))
5263 return false;
5265 return true;
5268 /* Start recording information from a particular source file. This is
5269 used to record which file defined which types, variables, etc. It
5270 is not used for line numbers, since the lineno entry point passes
5271 down the file name anyhow. IEEE debugging information doesn't seem
5272 to store this information anywhere. */
5274 static boolean
5275 ieee_start_source (p, filename)
5276 PTR p ATTRIBUTE_UNUSED;
5277 const char *filename ATTRIBUTE_UNUSED;
5279 return true;
5282 /* Make an empty type. */
5284 static boolean
5285 ieee_empty_type (p)
5286 PTR p;
5288 struct ieee_handle *info = (struct ieee_handle *) p;
5290 return ieee_push_type (info, (int) builtin_unknown, 0, false, false);
5293 /* Make a void type. */
5295 static boolean
5296 ieee_void_type (p)
5297 PTR p;
5299 struct ieee_handle *info = (struct ieee_handle *) p;
5301 return ieee_push_type (info, (int) builtin_void, 0, false, false);
5304 /* Make an integer type. */
5306 static boolean
5307 ieee_int_type (p, size, unsignedp)
5308 PTR p;
5309 unsigned int size;
5310 boolean unsignedp;
5312 struct ieee_handle *info = (struct ieee_handle *) p;
5313 unsigned int indx;
5315 switch (size)
5317 case 1:
5318 indx = (int) builtin_signed_char;
5319 break;
5320 case 2:
5321 indx = (int) builtin_signed_short_int;
5322 break;
5323 case 4:
5324 indx = (int) builtin_signed_long;
5325 break;
5326 case 8:
5327 indx = (int) builtin_signed_long_long;
5328 break;
5329 default:
5330 fprintf (stderr, _("IEEE unsupported integer type size %u\n"), size);
5331 return false;
5334 if (unsignedp)
5335 ++indx;
5337 return ieee_push_type (info, indx, size, unsignedp, false);
5340 /* Make a floating point type. */
5342 static boolean
5343 ieee_float_type (p, size)
5344 PTR p;
5345 unsigned int size;
5347 struct ieee_handle *info = (struct ieee_handle *) p;
5348 unsigned int indx;
5350 switch (size)
5352 case 4:
5353 indx = (int) builtin_float;
5354 break;
5355 case 8:
5356 indx = (int) builtin_double;
5357 break;
5358 case 12:
5359 /* FIXME: This size really depends upon the processor. */
5360 indx = (int) builtin_long_double;
5361 break;
5362 case 16:
5363 indx = (int) builtin_long_long_double;
5364 break;
5365 default:
5366 fprintf (stderr, _("IEEE unsupported float type size %u\n"), size);
5367 return false;
5370 return ieee_push_type (info, indx, size, false, false);
5373 /* Make a complex type. */
5375 static boolean
5376 ieee_complex_type (p, size)
5377 PTR p;
5378 unsigned int size;
5380 struct ieee_handle *info = (struct ieee_handle *) p;
5381 char code;
5383 switch (size)
5385 case 4:
5386 if (info->complex_float_index != 0)
5387 return ieee_push_type (info, info->complex_float_index, size * 2,
5388 false, false);
5389 code = 'c';
5390 break;
5391 case 12:
5392 case 16:
5393 /* These cases can be output by gcc -gstabs. Outputting the
5394 wrong type is better than crashing. */
5395 case 8:
5396 if (info->complex_double_index != 0)
5397 return ieee_push_type (info, info->complex_double_index, size * 2,
5398 false, false);
5399 code = 'd';
5400 break;
5401 default:
5402 fprintf (stderr, _("IEEE unsupported complex type size %u\n"), size);
5403 return false;
5406 /* FIXME: I don't know what the string is for. */
5407 if (! ieee_define_type (info, size * 2, false, false)
5408 || ! ieee_write_number (info, code)
5409 || ! ieee_write_id (info, ""))
5410 return false;
5412 if (size == 4)
5413 info->complex_float_index = info->type_stack->type.indx;
5414 else
5415 info->complex_double_index = info->type_stack->type.indx;
5417 return true;
5420 /* Make a boolean type. IEEE doesn't support these, so we just make
5421 an integer type instead. */
5423 static boolean
5424 ieee_bool_type (p, size)
5425 PTR p;
5426 unsigned int size;
5428 return ieee_int_type (p, size, true);
5431 /* Make an enumeration. */
5433 static boolean
5434 ieee_enum_type (p, tag, names, vals)
5435 PTR p;
5436 const char *tag;
5437 const char **names;
5438 bfd_signed_vma *vals;
5440 struct ieee_handle *info = (struct ieee_handle *) p;
5441 struct ieee_defined_enum *e;
5442 boolean localp, simple;
5443 unsigned int indx;
5444 int i = 0;
5446 localp = false;
5447 indx = (unsigned int) -1;
5448 for (e = info->enums; e != NULL; e = e->next)
5450 if (tag == NULL)
5452 if (e->tag != NULL)
5453 continue;
5455 else
5457 if (e->tag == NULL
5458 || tag[0] != e->tag[0]
5459 || strcmp (tag, e->tag) != 0)
5460 continue;
5463 if (! e->defined)
5465 /* This enum tag has been seen but not defined. */
5466 indx = e->indx;
5467 break;
5470 if (names != NULL && e->names != NULL)
5472 for (i = 0; names[i] != NULL && e->names[i] != NULL; i++)
5474 if (names[i][0] != e->names[i][0]
5475 || vals[i] != e->vals[i]
5476 || strcmp (names[i], e->names[i]) != 0)
5477 break;
5481 if ((names == NULL && e->names == NULL)
5482 || (names != NULL
5483 && e->names != NULL
5484 && names[i] == NULL
5485 && e->names[i] == NULL))
5487 /* We've seen this enum before. */
5488 return ieee_push_type (info, e->indx, 0, true, false);
5491 if (tag != NULL)
5493 /* We've already seen an enum of the same name, so we must make
5494 sure to output this one locally. */
5495 localp = true;
5496 break;
5500 /* If this is a simple enumeration, in which the values start at 0
5501 and always increment by 1, we can use type E. Otherwise we must
5502 use type N. */
5504 simple = true;
5505 if (names != NULL)
5507 for (i = 0; names[i] != NULL; i++)
5509 if (vals[i] != i)
5511 simple = false;
5512 break;
5517 if (! ieee_define_named_type (info, tag, indx, 0, true, localp,
5518 (struct ieee_buflist *) NULL)
5519 || ! ieee_write_number (info, simple ? 'E' : 'N'))
5520 return false;
5521 if (simple)
5523 /* FIXME: This is supposed to be the enumeration size, but we
5524 don't store that. */
5525 if (! ieee_write_number (info, 4))
5526 return false;
5528 if (names != NULL)
5530 for (i = 0; names[i] != NULL; i++)
5532 if (! ieee_write_id (info, names[i]))
5533 return false;
5534 if (! simple)
5536 if (! ieee_write_number (info, vals[i]))
5537 return false;
5542 if (! localp)
5544 if (indx == (unsigned int) -1)
5546 e = (struct ieee_defined_enum *) xmalloc (sizeof *e);
5547 memset (e, 0, sizeof *e);
5548 e->indx = info->type_stack->type.indx;
5549 e->tag = tag;
5551 e->next = info->enums;
5552 info->enums = e;
5555 e->names = names;
5556 e->vals = vals;
5557 e->defined = true;
5560 return true;
5563 /* Make a pointer type. */
5565 static boolean
5566 ieee_pointer_type (p)
5567 PTR p;
5569 struct ieee_handle *info = (struct ieee_handle *) p;
5570 boolean localp;
5571 unsigned int indx;
5572 struct ieee_modified_type *m = NULL;
5574 localp = info->type_stack->type.localp;
5575 indx = ieee_pop_type (info);
5577 /* A pointer to a simple builtin type can be obtained by adding 32.
5578 FIXME: Will this be a short pointer, and will that matter? */
5579 if (indx < 32)
5580 return ieee_push_type (info, indx + 32, 0, true, false);
5582 if (! localp)
5584 m = ieee_get_modified_info (p, indx);
5585 if (m == NULL)
5586 return false;
5588 /* FIXME: The size should depend upon the architecture. */
5589 if (m->pointer > 0)
5590 return ieee_push_type (info, m->pointer, 4, true, false);
5593 if (! ieee_define_type (info, 4, true, localp)
5594 || ! ieee_write_number (info, 'P')
5595 || ! ieee_write_number (info, indx))
5596 return false;
5598 if (! localp)
5599 m->pointer = info->type_stack->type.indx;
5601 return true;
5604 /* Make a function type. This will be called for a method, but we
5605 don't want to actually add it to the type table in that case. We
5606 handle this by defining the type in a private buffer, and only
5607 adding that buffer to the typedef block if we are going to use it. */
5609 static boolean
5610 ieee_function_type (p, argcount, varargs)
5611 PTR p;
5612 int argcount;
5613 boolean varargs;
5615 struct ieee_handle *info = (struct ieee_handle *) p;
5616 boolean localp;
5617 unsigned int *args = NULL;
5618 int i;
5619 unsigned int retindx;
5620 struct ieee_buflist fndef;
5621 struct ieee_modified_type *m;
5623 localp = false;
5625 if (argcount > 0)
5627 args = (unsigned int *) xmalloc (argcount * sizeof *args);
5628 for (i = argcount - 1; i >= 0; i--)
5630 if (info->type_stack->type.localp)
5631 localp = true;
5632 args[i] = ieee_pop_type (info);
5635 else if (argcount < 0)
5636 varargs = false;
5638 if (info->type_stack->type.localp)
5639 localp = true;
5640 retindx = ieee_pop_type (info);
5642 m = NULL;
5643 if (argcount < 0 && ! localp)
5645 m = ieee_get_modified_info (p, retindx);
5646 if (m == NULL)
5647 return false;
5649 if (m->function > 0)
5650 return ieee_push_type (info, m->function, 0, true, false);
5653 /* An attribute of 0x41 means that the frame and push mask are
5654 unknown. */
5655 if (! ieee_init_buffer (info, &fndef)
5656 || ! ieee_define_named_type (info, (const char *) NULL,
5657 (unsigned int) -1, 0, true, localp,
5658 &fndef)
5659 || ! ieee_write_number (info, 'x')
5660 || ! ieee_write_number (info, 0x41)
5661 || ! ieee_write_number (info, 0)
5662 || ! ieee_write_number (info, 0)
5663 || ! ieee_write_number (info, retindx)
5664 || ! ieee_write_number (info, (bfd_vma) argcount + (varargs ? 1 : 0)))
5665 return false;
5666 if (argcount > 0)
5668 for (i = 0; i < argcount; i++)
5669 if (! ieee_write_number (info, args[i]))
5670 return false;
5671 free (args);
5673 if (varargs)
5675 /* A varargs function is represented by writing out the last
5676 argument as type void *, although this makes little sense. */
5677 if (! ieee_write_number (info, (bfd_vma) builtin_void + 32))
5678 return false;
5681 if (! ieee_write_number (info, 0))
5682 return false;
5684 /* We wrote the information into fndef, in case we don't need it.
5685 It will be appended to info->types by ieee_pop_type. */
5686 info->type_stack->type.fndef = fndef;
5688 if (m != NULL)
5689 m->function = info->type_stack->type.indx;
5691 return true;
5694 /* Make a reference type. */
5696 static boolean
5697 ieee_reference_type (p)
5698 PTR p;
5700 struct ieee_handle *info = (struct ieee_handle *) p;
5702 /* IEEE appears to record a normal pointer type, and then use a
5703 pmisc record to indicate that it is really a reference. */
5705 if (! ieee_pointer_type (p))
5706 return false;
5707 info->type_stack->type.referencep = true;
5708 return true;
5711 /* Make a range type. */
5713 static boolean
5714 ieee_range_type (p, low, high)
5715 PTR p;
5716 bfd_signed_vma low;
5717 bfd_signed_vma high;
5719 struct ieee_handle *info = (struct ieee_handle *) p;
5720 unsigned int size;
5721 boolean unsignedp, localp;
5723 size = info->type_stack->type.size;
5724 unsignedp = info->type_stack->type.unsignedp;
5725 localp = info->type_stack->type.localp;
5726 ieee_pop_unused_type (info);
5727 return (ieee_define_type (info, size, unsignedp, localp)
5728 && ieee_write_number (info, 'R')
5729 && ieee_write_number (info, (bfd_vma) low)
5730 && ieee_write_number (info, (bfd_vma) high)
5731 && ieee_write_number (info, unsignedp ? 0 : 1)
5732 && ieee_write_number (info, size));
5735 /* Make an array type. */
5737 static boolean
5738 ieee_array_type (p, low, high, stringp)
5739 PTR p;
5740 bfd_signed_vma low;
5741 bfd_signed_vma high;
5742 boolean stringp ATTRIBUTE_UNUSED;
5744 struct ieee_handle *info = (struct ieee_handle *) p;
5745 unsigned int eleindx;
5746 boolean localp;
5747 unsigned int size;
5748 struct ieee_modified_type *m = NULL;
5749 struct ieee_modified_array_type *a;
5751 /* IEEE does not store the range, so we just ignore it. */
5752 ieee_pop_unused_type (info);
5753 localp = info->type_stack->type.localp;
5754 size = info->type_stack->type.size;
5755 eleindx = ieee_pop_type (info);
5757 /* If we don't know the range, treat the size as exactly one
5758 element. */
5759 if (low < high)
5760 size *= (high - low) + 1;
5762 if (! localp)
5764 m = ieee_get_modified_info (info, eleindx);
5765 if (m == NULL)
5766 return false;
5768 for (a = m->arrays; a != NULL; a = a->next)
5770 if (a->low == low && a->high == high)
5771 return ieee_push_type (info, a->indx, size, false, false);
5775 if (! ieee_define_type (info, size, false, localp)
5776 || ! ieee_write_number (info, low == 0 ? 'Z' : 'C')
5777 || ! ieee_write_number (info, eleindx))
5778 return false;
5779 if (low != 0)
5781 if (! ieee_write_number (info, low))
5782 return false;
5785 if (! ieee_write_number (info, high + 1))
5786 return false;
5788 if (! localp)
5790 a = (struct ieee_modified_array_type *) xmalloc (sizeof *a);
5791 memset (a, 0, sizeof *a);
5793 a->indx = info->type_stack->type.indx;
5794 a->low = low;
5795 a->high = high;
5797 a->next = m->arrays;
5798 m->arrays = a;
5801 return true;
5804 /* Make a set type. */
5806 static boolean
5807 ieee_set_type (p, bitstringp)
5808 PTR p;
5809 boolean bitstringp ATTRIBUTE_UNUSED;
5811 struct ieee_handle *info = (struct ieee_handle *) p;
5812 boolean localp;
5813 unsigned int eleindx;
5815 localp = info->type_stack->type.localp;
5816 eleindx = ieee_pop_type (info);
5818 /* FIXME: We don't know the size, so we just use 4. */
5820 return (ieee_define_type (info, 0, true, localp)
5821 && ieee_write_number (info, 's')
5822 && ieee_write_number (info, 4)
5823 && ieee_write_number (info, eleindx));
5826 /* Make an offset type. */
5828 static boolean
5829 ieee_offset_type (p)
5830 PTR p;
5832 struct ieee_handle *info = (struct ieee_handle *) p;
5833 unsigned int targetindx, baseindx;
5835 targetindx = ieee_pop_type (info);
5836 baseindx = ieee_pop_type (info);
5838 /* FIXME: The MRI C++ compiler does not appear to generate any
5839 useful type information about an offset type. It just records a
5840 pointer to member as an integer. The MRI/HP IEEE spec does
5841 describe a pmisc record which can be used for a pointer to
5842 member. Unfortunately, it does not describe the target type,
5843 which seems pretty important. I'm going to punt this for now. */
5845 return ieee_int_type (p, 4, true);
5848 /* Make a method type. */
5850 static boolean
5851 ieee_method_type (p, domain, argcount, varargs)
5852 PTR p;
5853 boolean domain;
5854 int argcount;
5855 boolean varargs;
5857 struct ieee_handle *info = (struct ieee_handle *) p;
5859 /* FIXME: The MRI/HP IEEE spec defines a pmisc record to use for a
5860 method, but the definition is incomplete. We just output an 'x'
5861 type. */
5863 if (domain)
5864 ieee_pop_unused_type (info);
5866 return ieee_function_type (p, argcount, varargs);
5869 /* Make a const qualified type. */
5871 static boolean
5872 ieee_const_type (p)
5873 PTR p;
5875 struct ieee_handle *info = (struct ieee_handle *) p;
5876 unsigned int size;
5877 boolean unsignedp, localp;
5878 unsigned int indx;
5879 struct ieee_modified_type *m = NULL;
5881 size = info->type_stack->type.size;
5882 unsignedp = info->type_stack->type.unsignedp;
5883 localp = info->type_stack->type.localp;
5884 indx = ieee_pop_type (info);
5886 if (! localp)
5888 m = ieee_get_modified_info (info, indx);
5889 if (m == NULL)
5890 return false;
5892 if (m->const_qualified > 0)
5893 return ieee_push_type (info, m->const_qualified, size, unsignedp,
5894 false);
5897 if (! ieee_define_type (info, size, unsignedp, localp)
5898 || ! ieee_write_number (info, 'n')
5899 || ! ieee_write_number (info, 1)
5900 || ! ieee_write_number (info, indx))
5901 return false;
5903 if (! localp)
5904 m->const_qualified = info->type_stack->type.indx;
5906 return true;
5909 /* Make a volatile qualified type. */
5911 static boolean
5912 ieee_volatile_type (p)
5913 PTR p;
5915 struct ieee_handle *info = (struct ieee_handle *) p;
5916 unsigned int size;
5917 boolean unsignedp, localp;
5918 unsigned int indx;
5919 struct ieee_modified_type *m = NULL;
5921 size = info->type_stack->type.size;
5922 unsignedp = info->type_stack->type.unsignedp;
5923 localp = info->type_stack->type.localp;
5924 indx = ieee_pop_type (info);
5926 if (! localp)
5928 m = ieee_get_modified_info (info, indx);
5929 if (m == NULL)
5930 return false;
5932 if (m->volatile_qualified > 0)
5933 return ieee_push_type (info, m->volatile_qualified, size, unsignedp,
5934 false);
5937 if (! ieee_define_type (info, size, unsignedp, localp)
5938 || ! ieee_write_number (info, 'n')
5939 || ! ieee_write_number (info, 2)
5940 || ! ieee_write_number (info, indx))
5941 return false;
5943 if (! localp)
5944 m->volatile_qualified = info->type_stack->type.indx;
5946 return true;
5949 /* Convert an enum debug_visibility into a CXXFLAGS value. */
5951 static unsigned int
5952 ieee_vis_to_flags (visibility)
5953 enum debug_visibility visibility;
5955 switch (visibility)
5957 default:
5958 abort ();
5959 case DEBUG_VISIBILITY_PUBLIC:
5960 return CXXFLAGS_VISIBILITY_PUBLIC;
5961 case DEBUG_VISIBILITY_PRIVATE:
5962 return CXXFLAGS_VISIBILITY_PRIVATE;
5963 case DEBUG_VISIBILITY_PROTECTED:
5964 return CXXFLAGS_VISIBILITY_PROTECTED;
5966 /*NOTREACHED*/
5969 /* Start defining a struct type. We build it in the strdef field on
5970 the stack, to avoid confusing type definitions required by the
5971 fields with the struct type itself. */
5973 static boolean
5974 ieee_start_struct_type (p, tag, id, structp, size)
5975 PTR p;
5976 const char *tag;
5977 unsigned int id;
5978 boolean structp;
5979 unsigned int size;
5981 struct ieee_handle *info = (struct ieee_handle *) p;
5982 boolean localp, ignorep;
5983 boolean copy;
5984 char ab[20];
5985 const char *look;
5986 struct ieee_name_type_hash_entry *h;
5987 struct ieee_name_type *nt, *ntlook;
5988 struct ieee_buflist strdef;
5990 localp = false;
5991 ignorep = false;
5993 /* We need to create a tag for internal use even if we don't want
5994 one for external use. This will let us refer to an anonymous
5995 struct. */
5996 if (tag != NULL)
5998 look = tag;
5999 copy = false;
6001 else
6003 sprintf (ab, "__anon%u", id);
6004 look = ab;
6005 copy = true;
6008 /* If we already have references to the tag, we must use the
6009 existing type index. */
6010 h = ieee_name_type_hash_lookup (&info->tags, look, true, copy);
6011 if (h == NULL)
6012 return false;
6014 nt = NULL;
6015 for (ntlook = h->types; ntlook != NULL; ntlook = ntlook->next)
6017 if (ntlook->id == id)
6018 nt = ntlook;
6019 else if (! ntlook->type.localp)
6021 /* We are creating a duplicate definition of a globally
6022 defined tag. Force it to be local to avoid
6023 confusion. */
6024 localp = true;
6028 if (nt != NULL)
6030 assert (localp == nt->type.localp);
6031 if (nt->kind == DEBUG_KIND_ILLEGAL && ! localp)
6033 /* We've already seen a global definition of the type.
6034 Ignore this new definition. */
6035 ignorep = true;
6038 else
6040 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
6041 memset (nt, 0, sizeof *nt);
6042 nt->id = id;
6043 nt->type.name = h->root.string;
6044 nt->next = h->types;
6045 h->types = nt;
6046 nt->type.indx = info->type_indx;
6047 ++info->type_indx;
6050 nt->kind = DEBUG_KIND_ILLEGAL;
6052 if (! ieee_init_buffer (info, &strdef)
6053 || ! ieee_define_named_type (info, tag, nt->type.indx, size, true,
6054 localp, &strdef)
6055 || ! ieee_write_number (info, structp ? 'S' : 'U')
6056 || ! ieee_write_number (info, size))
6057 return false;
6059 if (! ignorep)
6061 const char *hold;
6063 /* We never want nt->type.name to be NULL. We want the rest of
6064 the type to be the object set up on the type stack; it will
6065 have a NULL name if tag is NULL. */
6066 hold = nt->type.name;
6067 nt->type = info->type_stack->type;
6068 nt->type.name = hold;
6071 info->type_stack->type.name = tag;
6072 info->type_stack->type.strdef = strdef;
6073 info->type_stack->type.ignorep = ignorep;
6075 return true;
6078 /* Add a field to a struct. */
6080 static boolean
6081 ieee_struct_field (p, name, bitpos, bitsize, visibility)
6082 PTR p;
6083 const char *name;
6084 bfd_vma bitpos;
6085 bfd_vma bitsize;
6086 enum debug_visibility visibility;
6088 struct ieee_handle *info = (struct ieee_handle *) p;
6089 unsigned int size;
6090 boolean unsignedp;
6091 boolean referencep;
6092 boolean localp;
6093 unsigned int indx;
6094 bfd_vma offset;
6096 assert (info->type_stack != NULL
6097 && info->type_stack->next != NULL
6098 && ! ieee_buffer_emptyp (&info->type_stack->next->type.strdef));
6100 /* If we are ignoring this struct definition, just pop and ignore
6101 the type. */
6102 if (info->type_stack->next->type.ignorep)
6104 ieee_pop_unused_type (info);
6105 return true;
6108 size = info->type_stack->type.size;
6109 unsignedp = info->type_stack->type.unsignedp;
6110 referencep = info->type_stack->type.referencep;
6111 localp = info->type_stack->type.localp;
6112 indx = ieee_pop_type (info);
6114 if (localp)
6115 info->type_stack->type.localp = true;
6117 if (info->type_stack->type.classdef != NULL)
6119 unsigned int flags;
6120 unsigned int nindx;
6122 /* This is a class. We must add a description of this field to
6123 the class records we are building. */
6125 flags = ieee_vis_to_flags (visibility);
6126 nindx = info->type_stack->type.classdef->indx;
6127 if (! ieee_change_buffer (info,
6128 &info->type_stack->type.classdef->pmiscbuf)
6129 || ! ieee_write_asn (info, nindx, 'd')
6130 || ! ieee_write_asn (info, nindx, flags)
6131 || ! ieee_write_atn65 (info, nindx, name)
6132 || ! ieee_write_atn65 (info, nindx, name))
6133 return false;
6134 info->type_stack->type.classdef->pmisccount += 4;
6136 if (referencep)
6138 unsigned int nindx;
6140 /* We need to output a record recording that this field is
6141 really of reference type. We put this on the refs field
6142 of classdef, so that it can be appended to the C++
6143 records after the class is defined. */
6145 nindx = info->name_indx;
6146 ++info->name_indx;
6148 if (! ieee_change_buffer (info,
6149 &info->type_stack->type.classdef->refs)
6150 || ! ieee_write_byte (info, (int) ieee_nn_record)
6151 || ! ieee_write_number (info, nindx)
6152 || ! ieee_write_id (info, "")
6153 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
6154 || ! ieee_write_number (info, nindx)
6155 || ! ieee_write_number (info, 0)
6156 || ! ieee_write_number (info, 62)
6157 || ! ieee_write_number (info, 80)
6158 || ! ieee_write_number (info, 4)
6159 || ! ieee_write_asn (info, nindx, 'R')
6160 || ! ieee_write_asn (info, nindx, 3)
6161 || ! ieee_write_atn65 (info, nindx, info->type_stack->type.name)
6162 || ! ieee_write_atn65 (info, nindx, name))
6163 return false;
6167 /* If the bitsize doesn't match the expected size, we need to output
6168 a bitfield type. */
6169 if (size == 0 || bitsize == 0 || bitsize == size * 8)
6170 offset = bitpos / 8;
6171 else
6173 if (! ieee_define_type (info, 0, unsignedp,
6174 info->type_stack->type.localp)
6175 || ! ieee_write_number (info, 'g')
6176 || ! ieee_write_number (info, unsignedp ? 0 : 1)
6177 || ! ieee_write_number (info, bitsize)
6178 || ! ieee_write_number (info, indx))
6179 return false;
6180 indx = ieee_pop_type (info);
6181 offset = bitpos;
6184 /* Switch to the struct we are building in order to output this
6185 field definition. */
6186 return (ieee_change_buffer (info, &info->type_stack->type.strdef)
6187 && ieee_write_id (info, name)
6188 && ieee_write_number (info, indx)
6189 && ieee_write_number (info, offset));
6192 /* Finish up a struct type. */
6194 static boolean
6195 ieee_end_struct_type (p)
6196 PTR p;
6198 struct ieee_handle *info = (struct ieee_handle *) p;
6199 struct ieee_buflist *pb;
6201 assert (info->type_stack != NULL
6202 && ! ieee_buffer_emptyp (&info->type_stack->type.strdef));
6204 /* If we were ignoring this struct definition because it was a
6205 duplicate defintion, just through away whatever bytes we have
6206 accumulated. Leave the type on the stack. */
6207 if (info->type_stack->type.ignorep)
6208 return true;
6210 /* If this is not a duplicate definition of this tag, then localp
6211 will be false, and we can put it in the global type block.
6212 FIXME: We should avoid outputting duplicate definitions which are
6213 the same. */
6214 if (! info->type_stack->type.localp)
6216 /* Make sure we have started the global type block. */
6217 if (ieee_buffer_emptyp (&info->global_types))
6219 if (! ieee_change_buffer (info, &info->global_types)
6220 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
6221 || ! ieee_write_byte (info, 2)
6222 || ! ieee_write_number (info, 0)
6223 || ! ieee_write_id (info, ""))
6224 return false;
6226 pb = &info->global_types;
6228 else
6230 /* Make sure we have started the types block. */
6231 if (ieee_buffer_emptyp (&info->types))
6233 if (! ieee_change_buffer (info, &info->types)
6234 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
6235 || ! ieee_write_byte (info, 1)
6236 || ! ieee_write_number (info, 0)
6237 || ! ieee_write_id (info, info->modname))
6238 return false;
6240 pb = &info->types;
6243 /* Append the struct definition to the types. */
6244 if (! ieee_append_buffer (info, pb, &info->type_stack->type.strdef)
6245 || ! ieee_init_buffer (info, &info->type_stack->type.strdef))
6246 return false;
6248 /* Leave the struct on the type stack. */
6250 return true;
6253 /* Start a class type. */
6255 static boolean
6256 ieee_start_class_type (p, tag, id, structp, size, vptr, ownvptr)
6257 PTR p;
6258 const char *tag;
6259 unsigned int id;
6260 boolean structp;
6261 unsigned int size;
6262 boolean vptr;
6263 boolean ownvptr;
6265 struct ieee_handle *info = (struct ieee_handle *) p;
6266 const char *vclass;
6267 struct ieee_buflist pmiscbuf;
6268 unsigned int indx;
6269 struct ieee_type_class *classdef;
6271 /* A C++ class is output as a C++ struct along with a set of pmisc
6272 records describing the class. */
6274 /* We need to have a name so that we can associate the struct and
6275 the class. */
6276 if (tag == NULL)
6278 char *t;
6280 t = (char *) xmalloc (20);
6281 sprintf (t, "__anon%u", id);
6282 tag = t;
6285 /* We can't write out the virtual table information until we have
6286 finished the class, because we don't know the virtual table size.
6287 We get the size from the largest voffset we see. */
6288 vclass = NULL;
6289 if (vptr && ! ownvptr)
6291 vclass = info->type_stack->type.name;
6292 assert (vclass != NULL);
6293 /* We don't call ieee_pop_unused_type, since the class should
6294 get defined. */
6295 (void) ieee_pop_type (info);
6298 if (! ieee_start_struct_type (p, tag, id, structp, size))
6299 return false;
6301 indx = info->name_indx;
6302 ++info->name_indx;
6304 /* We write out pmisc records into the classdef field. We will
6305 write out the pmisc start after we know the number of records we
6306 need. */
6307 if (! ieee_init_buffer (info, &pmiscbuf)
6308 || ! ieee_change_buffer (info, &pmiscbuf)
6309 || ! ieee_write_asn (info, indx, 'T')
6310 || ! ieee_write_asn (info, indx, structp ? 'o' : 'u')
6311 || ! ieee_write_atn65 (info, indx, tag))
6312 return false;
6314 classdef = (struct ieee_type_class *) xmalloc (sizeof *classdef);
6315 memset (classdef, 0, sizeof *classdef);
6317 classdef->indx = indx;
6318 classdef->pmiscbuf = pmiscbuf;
6319 classdef->pmisccount = 3;
6320 classdef->vclass = vclass;
6321 classdef->ownvptr = ownvptr;
6323 info->type_stack->type.classdef = classdef;
6325 return true;
6328 /* Add a static member to a class. */
6330 static boolean
6331 ieee_class_static_member (p, name, physname, visibility)
6332 PTR p;
6333 const char *name;
6334 const char *physname;
6335 enum debug_visibility visibility;
6337 struct ieee_handle *info = (struct ieee_handle *) p;
6338 unsigned int flags;
6339 unsigned int nindx;
6341 /* We don't care about the type. Hopefully there will be a call to
6342 ieee_variable declaring the physical name and the type, since
6343 that is where an IEEE consumer must get the type. */
6344 ieee_pop_unused_type (info);
6346 assert (info->type_stack != NULL
6347 && info->type_stack->type.classdef != NULL);
6349 flags = ieee_vis_to_flags (visibility);
6350 flags |= CXXFLAGS_STATIC;
6352 nindx = info->type_stack->type.classdef->indx;
6354 if (! ieee_change_buffer (info, &info->type_stack->type.classdef->pmiscbuf)
6355 || ! ieee_write_asn (info, nindx, 'd')
6356 || ! ieee_write_asn (info, nindx, flags)
6357 || ! ieee_write_atn65 (info, nindx, name)
6358 || ! ieee_write_atn65 (info, nindx, physname))
6359 return false;
6360 info->type_stack->type.classdef->pmisccount += 4;
6362 return true;
6365 /* Add a base class to a class. */
6367 static boolean
6368 ieee_class_baseclass (p, bitpos, virtual, visibility)
6369 PTR p;
6370 bfd_vma bitpos;
6371 boolean virtual;
6372 enum debug_visibility visibility;
6374 struct ieee_handle *info = (struct ieee_handle *) p;
6375 const char *bname;
6376 boolean localp;
6377 unsigned int bindx;
6378 char *fname;
6379 unsigned int flags;
6380 unsigned int nindx;
6382 assert (info->type_stack != NULL
6383 && info->type_stack->type.name != NULL
6384 && info->type_stack->next != NULL
6385 && info->type_stack->next->type.classdef != NULL
6386 && ! ieee_buffer_emptyp (&info->type_stack->next->type.strdef));
6388 bname = info->type_stack->type.name;
6389 localp = info->type_stack->type.localp;
6390 bindx = ieee_pop_type (info);
6392 /* We are currently defining both a struct and a class. We must
6393 write out a field definition in the struct which holds the base
6394 class. The stabs debugging reader will create a field named
6395 _vb$CLASS for a virtual base class, so we just use that. FIXME:
6396 we should not depend upon a detail of stabs debugging. */
6397 if (virtual)
6399 fname = (char *) xmalloc (strlen (bname) + sizeof "_vb$");
6400 sprintf (fname, "_vb$%s", bname);
6401 flags = BASEFLAGS_VIRTUAL;
6403 else
6405 if (localp)
6406 info->type_stack->type.localp = true;
6408 fname = (char *) xmalloc (strlen (bname) + sizeof "_b$");
6409 sprintf (fname, "_b$%s", bname);
6411 if (! ieee_change_buffer (info, &info->type_stack->type.strdef)
6412 || ! ieee_write_id (info, fname)
6413 || ! ieee_write_number (info, bindx)
6414 || ! ieee_write_number (info, bitpos / 8))
6415 return false;
6416 flags = 0;
6419 if (visibility == DEBUG_VISIBILITY_PRIVATE)
6420 flags |= BASEFLAGS_PRIVATE;
6422 nindx = info->type_stack->type.classdef->indx;
6424 if (! ieee_change_buffer (info, &info->type_stack->type.classdef->pmiscbuf)
6425 || ! ieee_write_asn (info, nindx, 'b')
6426 || ! ieee_write_asn (info, nindx, flags)
6427 || ! ieee_write_atn65 (info, nindx, bname)
6428 || ! ieee_write_asn (info, nindx, 0)
6429 || ! ieee_write_atn65 (info, nindx, fname))
6430 return false;
6431 info->type_stack->type.classdef->pmisccount += 5;
6433 free (fname);
6435 return true;
6438 /* Start building a method for a class. */
6440 static boolean
6441 ieee_class_start_method (p, name)
6442 PTR p;
6443 const char *name;
6445 struct ieee_handle *info = (struct ieee_handle *) p;
6447 assert (info->type_stack != NULL
6448 && info->type_stack->type.classdef != NULL
6449 && info->type_stack->type.classdef->method == NULL);
6451 info->type_stack->type.classdef->method = name;
6453 return true;
6456 /* Define a new method variant, either static or not. */
6458 static boolean
6459 ieee_class_method_var (info, physname, visibility, staticp, constp,
6460 volatilep, voffset, context)
6461 struct ieee_handle *info;
6462 const char *physname;
6463 enum debug_visibility visibility;
6464 boolean staticp;
6465 boolean constp;
6466 boolean volatilep;
6467 bfd_vma voffset;
6468 boolean context;
6470 unsigned int flags;
6471 unsigned int nindx;
6472 boolean virtual;
6474 /* We don't need the type of the method. An IEEE consumer which
6475 wants the type must track down the function by the physical name
6476 and get the type from that. */
6477 ieee_pop_unused_type (info);
6479 /* We don't use the context. FIXME: We probably ought to use it to
6480 adjust the voffset somehow, but I don't really know how. */
6481 if (context)
6482 ieee_pop_unused_type (info);
6484 assert (info->type_stack != NULL
6485 && info->type_stack->type.classdef != NULL
6486 && info->type_stack->type.classdef->method != NULL);
6488 flags = ieee_vis_to_flags (visibility);
6490 /* FIXME: We never set CXXFLAGS_OVERRIDE, CXXFLAGS_OPERATOR,
6491 CXXFLAGS_CTORDTOR, CXXFLAGS_CTOR, or CXXFLAGS_INLINE. */
6493 if (staticp)
6494 flags |= CXXFLAGS_STATIC;
6495 if (constp)
6496 flags |= CXXFLAGS_CONST;
6497 if (volatilep)
6498 flags |= CXXFLAGS_VOLATILE;
6500 nindx = info->type_stack->type.classdef->indx;
6502 virtual = context || voffset > 0;
6504 if (! ieee_change_buffer (info,
6505 &info->type_stack->type.classdef->pmiscbuf)
6506 || ! ieee_write_asn (info, nindx, virtual ? 'v' : 'm')
6507 || ! ieee_write_asn (info, nindx, flags)
6508 || ! ieee_write_atn65 (info, nindx,
6509 info->type_stack->type.classdef->method)
6510 || ! ieee_write_atn65 (info, nindx, physname))
6511 return false;
6513 if (virtual)
6515 if (voffset > info->type_stack->type.classdef->voffset)
6516 info->type_stack->type.classdef->voffset = voffset;
6517 if (! ieee_write_asn (info, nindx, voffset))
6518 return false;
6519 ++info->type_stack->type.classdef->pmisccount;
6522 if (! ieee_write_asn (info, nindx, 0))
6523 return false;
6525 info->type_stack->type.classdef->pmisccount += 5;
6527 return true;
6530 /* Define a new method variant. */
6532 static boolean
6533 ieee_class_method_variant (p, physname, visibility, constp, volatilep,
6534 voffset, context)
6535 PTR p;
6536 const char *physname;
6537 enum debug_visibility visibility;
6538 boolean constp;
6539 boolean volatilep;
6540 bfd_vma voffset;
6541 boolean context;
6543 struct ieee_handle *info = (struct ieee_handle *) p;
6545 return ieee_class_method_var (info, physname, visibility, false, constp,
6546 volatilep, voffset, context);
6549 /* Define a new static method variant. */
6551 static boolean
6552 ieee_class_static_method_variant (p, physname, visibility, constp, volatilep)
6553 PTR p;
6554 const char *physname;
6555 enum debug_visibility visibility;
6556 boolean constp;
6557 boolean volatilep;
6559 struct ieee_handle *info = (struct ieee_handle *) p;
6561 return ieee_class_method_var (info, physname, visibility, true, constp,
6562 volatilep, 0, false);
6565 /* Finish up a method. */
6567 static boolean
6568 ieee_class_end_method (p)
6569 PTR p;
6571 struct ieee_handle *info = (struct ieee_handle *) p;
6573 assert (info->type_stack != NULL
6574 && info->type_stack->type.classdef != NULL
6575 && info->type_stack->type.classdef->method != NULL);
6577 info->type_stack->type.classdef->method = NULL;
6579 return true;
6582 /* Finish up a class. */
6584 static boolean
6585 ieee_end_class_type (p)
6586 PTR p;
6588 struct ieee_handle *info = (struct ieee_handle *) p;
6589 unsigned int nindx;
6591 assert (info->type_stack != NULL
6592 && info->type_stack->type.classdef != NULL);
6594 /* If we were ignoring this class definition because it was a
6595 duplicate definition, just through away whatever bytes we have
6596 accumulated. Leave the type on the stack. */
6597 if (info->type_stack->type.ignorep)
6598 return true;
6600 nindx = info->type_stack->type.classdef->indx;
6602 /* If we have a virtual table, we can write out the information now. */
6603 if (info->type_stack->type.classdef->vclass != NULL
6604 || info->type_stack->type.classdef->ownvptr)
6606 if (! ieee_change_buffer (info,
6607 &info->type_stack->type.classdef->pmiscbuf)
6608 || ! ieee_write_asn (info, nindx, 'z')
6609 || ! ieee_write_atn65 (info, nindx, "")
6610 || ! ieee_write_asn (info, nindx,
6611 info->type_stack->type.classdef->voffset))
6612 return false;
6613 if (info->type_stack->type.classdef->ownvptr)
6615 if (! ieee_write_atn65 (info, nindx, ""))
6616 return false;
6618 else
6620 if (! ieee_write_atn65 (info, nindx,
6621 info->type_stack->type.classdef->vclass))
6622 return false;
6624 if (! ieee_write_asn (info, nindx, 0))
6625 return false;
6626 info->type_stack->type.classdef->pmisccount += 5;
6629 /* Now that we know the number of pmisc records, we can write out
6630 the atn62 which starts the pmisc records, and append them to the
6631 C++ buffers. */
6633 if (! ieee_change_buffer (info, &info->cxx)
6634 || ! ieee_write_byte (info, (int) ieee_nn_record)
6635 || ! ieee_write_number (info, nindx)
6636 || ! ieee_write_id (info, "")
6637 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
6638 || ! ieee_write_number (info, nindx)
6639 || ! ieee_write_number (info, 0)
6640 || ! ieee_write_number (info, 62)
6641 || ! ieee_write_number (info, 80)
6642 || ! ieee_write_number (info,
6643 info->type_stack->type.classdef->pmisccount))
6644 return false;
6646 if (! ieee_append_buffer (info, &info->cxx,
6647 &info->type_stack->type.classdef->pmiscbuf))
6648 return false;
6649 if (! ieee_buffer_emptyp (&info->type_stack->type.classdef->refs))
6651 if (! ieee_append_buffer (info, &info->cxx,
6652 &info->type_stack->type.classdef->refs))
6653 return false;
6656 return ieee_end_struct_type (p);
6659 /* Push a previously seen typedef onto the type stack. */
6661 static boolean
6662 ieee_typedef_type (p, name)
6663 PTR p;
6664 const char *name;
6666 struct ieee_handle *info = (struct ieee_handle *) p;
6667 struct ieee_name_type_hash_entry *h;
6668 struct ieee_name_type *nt;
6670 h = ieee_name_type_hash_lookup (&info->typedefs, name, false, false);
6672 /* h should never be NULL, since that would imply that the generic
6673 debugging code has asked for a typedef which it has not yet
6674 defined. */
6675 assert (h != NULL);
6677 /* We always use the most recently defined type for this name, which
6678 will be the first one on the list. */
6680 nt = h->types;
6681 if (! ieee_push_type (info, nt->type.indx, nt->type.size,
6682 nt->type.unsignedp, nt->type.localp))
6683 return false;
6685 /* Copy over any other type information we may have. */
6686 info->type_stack->type = nt->type;
6688 return true;
6691 /* Push a tagged type onto the type stack. */
6693 static boolean
6694 ieee_tag_type (p, name, id, kind)
6695 PTR p;
6696 const char *name;
6697 unsigned int id;
6698 enum debug_type_kind kind;
6700 struct ieee_handle *info = (struct ieee_handle *) p;
6701 boolean localp;
6702 boolean copy;
6703 char ab[20];
6704 struct ieee_name_type_hash_entry *h;
6705 struct ieee_name_type *nt;
6707 if (kind == DEBUG_KIND_ENUM)
6709 struct ieee_defined_enum *e;
6711 if (name == NULL)
6712 abort ();
6713 for (e = info->enums; e != NULL; e = e->next)
6714 if (e->tag != NULL && strcmp (e->tag, name) == 0)
6715 return ieee_push_type (info, e->indx, 0, true, false);
6717 e = (struct ieee_defined_enum *) xmalloc (sizeof *e);
6718 memset (e, 0, sizeof *e);
6720 e->indx = info->type_indx;
6721 ++info->type_indx;
6722 e->tag = name;
6723 e->defined = false;
6725 e->next = info->enums;
6726 info->enums = e;
6728 return ieee_push_type (info, e->indx, 0, true, false);
6731 localp = false;
6733 copy = false;
6734 if (name == NULL)
6736 sprintf (ab, "__anon%u", id);
6737 name = ab;
6738 copy = true;
6741 h = ieee_name_type_hash_lookup (&info->tags, name, true, copy);
6742 if (h == NULL)
6743 return false;
6745 for (nt = h->types; nt != NULL; nt = nt->next)
6747 if (nt->id == id)
6749 if (! ieee_push_type (info, nt->type.indx, nt->type.size,
6750 nt->type.unsignedp, nt->type.localp))
6751 return false;
6752 /* Copy over any other type information we may have. */
6753 info->type_stack->type = nt->type;
6754 return true;
6757 if (! nt->type.localp)
6759 /* This is a duplicate of a global type, so it must be
6760 local. */
6761 localp = true;
6765 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
6766 memset (nt, 0, sizeof *nt);
6768 nt->id = id;
6769 nt->type.name = h->root.string;
6770 nt->type.indx = info->type_indx;
6771 nt->type.localp = localp;
6772 ++info->type_indx;
6773 nt->kind = kind;
6775 nt->next = h->types;
6776 h->types = nt;
6778 if (! ieee_push_type (info, nt->type.indx, 0, false, localp))
6779 return false;
6781 info->type_stack->type.name = h->root.string;
6783 return true;
6786 /* Output a typedef. */
6788 static boolean
6789 ieee_typdef (p, name)
6790 PTR p;
6791 const char *name;
6793 struct ieee_handle *info = (struct ieee_handle *) p;
6794 struct ieee_write_type type;
6795 unsigned int indx;
6796 boolean found;
6797 boolean localp;
6798 struct ieee_name_type_hash_entry *h;
6799 struct ieee_name_type *nt;
6801 type = info->type_stack->type;
6802 indx = type.indx;
6804 /* If this is a simple builtin type using a builtin name, we don't
6805 want to output the typedef itself. We also want to change the
6806 type index to correspond to the name being used. We recognize
6807 names used in stabs debugging output even if they don't exactly
6808 correspond to the names used for the IEEE builtin types. */
6809 found = false;
6810 if (indx <= (unsigned int) builtin_bcd_float)
6812 switch ((enum builtin_types) indx)
6814 default:
6815 break;
6817 case builtin_void:
6818 if (strcmp (name, "void") == 0)
6819 found = true;
6820 break;
6822 case builtin_signed_char:
6823 case builtin_char:
6824 if (strcmp (name, "signed char") == 0)
6826 indx = (unsigned int) builtin_signed_char;
6827 found = true;
6829 else if (strcmp (name, "char") == 0)
6831 indx = (unsigned int) builtin_char;
6832 found = true;
6834 break;
6836 case builtin_unsigned_char:
6837 if (strcmp (name, "unsigned char") == 0)
6838 found = true;
6839 break;
6841 case builtin_signed_short_int:
6842 case builtin_short:
6843 case builtin_short_int:
6844 case builtin_signed_short:
6845 if (strcmp (name, "signed short int") == 0)
6847 indx = (unsigned int) builtin_signed_short_int;
6848 found = true;
6850 else if (strcmp (name, "short") == 0)
6852 indx = (unsigned int) builtin_short;
6853 found = true;
6855 else if (strcmp (name, "short int") == 0)
6857 indx = (unsigned int) builtin_short_int;
6858 found = true;
6860 else if (strcmp (name, "signed short") == 0)
6862 indx = (unsigned int) builtin_signed_short;
6863 found = true;
6865 break;
6867 case builtin_unsigned_short_int:
6868 case builtin_unsigned_short:
6869 if (strcmp (name, "unsigned short int") == 0
6870 || strcmp (name, "short unsigned int") == 0)
6872 indx = builtin_unsigned_short_int;
6873 found = true;
6875 else if (strcmp (name, "unsigned short") == 0)
6877 indx = builtin_unsigned_short;
6878 found = true;
6880 break;
6882 case builtin_signed_long:
6883 case builtin_int: /* FIXME: Size depends upon architecture. */
6884 case builtin_long:
6885 if (strcmp (name, "signed long") == 0)
6887 indx = builtin_signed_long;
6888 found = true;
6890 else if (strcmp (name, "int") == 0)
6892 indx = builtin_int;
6893 found = true;
6895 else if (strcmp (name, "long") == 0
6896 || strcmp (name, "long int") == 0)
6898 indx = builtin_long;
6899 found = true;
6901 break;
6903 case builtin_unsigned_long:
6904 case builtin_unsigned: /* FIXME: Size depends upon architecture. */
6905 case builtin_unsigned_int: /* FIXME: Like builtin_unsigned. */
6906 if (strcmp (name, "unsigned long") == 0
6907 || strcmp (name, "long unsigned int") == 0)
6909 indx = builtin_unsigned_long;
6910 found = true;
6912 else if (strcmp (name, "unsigned") == 0)
6914 indx = builtin_unsigned;
6915 found = true;
6917 else if (strcmp (name, "unsigned int") == 0)
6919 indx = builtin_unsigned_int;
6920 found = true;
6922 break;
6924 case builtin_signed_long_long:
6925 if (strcmp (name, "signed long long") == 0
6926 || strcmp (name, "long long int") == 0)
6927 found = true;
6928 break;
6930 case builtin_unsigned_long_long:
6931 if (strcmp (name, "unsigned long long") == 0
6932 || strcmp (name, "long long unsigned int") == 0)
6933 found = true;
6934 break;
6936 case builtin_float:
6937 if (strcmp (name, "float") == 0)
6938 found = true;
6939 break;
6941 case builtin_double:
6942 if (strcmp (name, "double") == 0)
6943 found = true;
6944 break;
6946 case builtin_long_double:
6947 if (strcmp (name, "long double") == 0)
6948 found = true;
6949 break;
6951 case builtin_long_long_double:
6952 if (strcmp (name, "long long double") == 0)
6953 found = true;
6954 break;
6957 if (found)
6958 type.indx = indx;
6961 h = ieee_name_type_hash_lookup (&info->typedefs, name, true, false);
6962 if (h == NULL)
6963 return false;
6965 /* See if we have already defined this type with this name. */
6966 localp = type.localp;
6967 for (nt = h->types; nt != NULL; nt = nt->next)
6969 if (nt->id == indx)
6971 /* If this is a global definition, then we don't need to
6972 do anything here. */
6973 if (! nt->type.localp)
6975 ieee_pop_unused_type (info);
6976 return true;
6979 else
6981 /* This is a duplicate definition, so make this one local. */
6982 localp = true;
6986 /* We need to add a new typedef for this type. */
6988 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
6989 memset (nt, 0, sizeof *nt);
6990 nt->id = indx;
6991 nt->type = type;
6992 nt->type.name = name;
6993 nt->type.localp = localp;
6994 nt->kind = DEBUG_KIND_ILLEGAL;
6996 nt->next = h->types;
6997 h->types = nt;
6999 if (found)
7001 /* This is one of the builtin typedefs, so we don't need to
7002 actually define it. */
7003 ieee_pop_unused_type (info);
7004 return true;
7007 indx = ieee_pop_type (info);
7009 if (! ieee_define_named_type (info, name, (unsigned int) -1, type.size,
7010 type.unsignedp, localp,
7011 (struct ieee_buflist *) NULL)
7012 || ! ieee_write_number (info, 'T')
7013 || ! ieee_write_number (info, indx))
7014 return false;
7016 /* Remove the type we just added to the type stack. This should not
7017 be ieee_pop_unused_type, since the type is used, we just don't
7018 need it now. */
7019 (void) ieee_pop_type (info);
7021 return true;
7024 /* Output a tag for a type. We don't have to do anything here. */
7026 static boolean
7027 ieee_tag (p, name)
7028 PTR p;
7029 const char *name ATTRIBUTE_UNUSED;
7031 struct ieee_handle *info = (struct ieee_handle *) p;
7033 /* This should not be ieee_pop_unused_type, since we want the type
7034 to be defined. */
7035 (void) ieee_pop_type (info);
7036 return true;
7039 /* Output an integer constant. */
7041 static boolean
7042 ieee_int_constant (p, name, val)
7043 PTR p ATTRIBUTE_UNUSED;
7044 const char *name ATTRIBUTE_UNUSED;
7045 bfd_vma val ATTRIBUTE_UNUSED;
7047 /* FIXME. */
7048 return true;
7051 /* Output a floating point constant. */
7053 static boolean
7054 ieee_float_constant (p, name, val)
7055 PTR p ATTRIBUTE_UNUSED;
7056 const char *name ATTRIBUTE_UNUSED;
7057 double val ATTRIBUTE_UNUSED;
7059 /* FIXME. */
7060 return true;
7063 /* Output a typed constant. */
7065 static boolean
7066 ieee_typed_constant (p, name, val)
7067 PTR p;
7068 const char *name ATTRIBUTE_UNUSED;
7069 bfd_vma val ATTRIBUTE_UNUSED;
7071 struct ieee_handle *info = (struct ieee_handle *) p;
7073 /* FIXME. */
7074 ieee_pop_unused_type (info);
7075 return true;
7078 /* Output a variable. */
7080 static boolean
7081 ieee_variable (p, name, kind, val)
7082 PTR p;
7083 const char *name;
7084 enum debug_var_kind kind;
7085 bfd_vma val;
7087 struct ieee_handle *info = (struct ieee_handle *) p;
7088 unsigned int name_indx;
7089 unsigned int size;
7090 boolean referencep;
7091 unsigned int type_indx;
7092 boolean asn;
7093 int refflag;
7095 size = info->type_stack->type.size;
7096 referencep = info->type_stack->type.referencep;
7097 type_indx = ieee_pop_type (info);
7099 assert (! ieee_buffer_emptyp (&info->vars));
7100 if (! ieee_change_buffer (info, &info->vars))
7101 return false;
7103 name_indx = info->name_indx;
7104 ++info->name_indx;
7106 /* Write out an NN and an ATN record for this variable. */
7107 if (! ieee_write_byte (info, (int) ieee_nn_record)
7108 || ! ieee_write_number (info, name_indx)
7109 || ! ieee_write_id (info, name)
7110 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7111 || ! ieee_write_number (info, name_indx)
7112 || ! ieee_write_number (info, type_indx))
7113 return false;
7114 switch (kind)
7116 default:
7117 abort ();
7118 return false;
7119 case DEBUG_GLOBAL:
7120 if (! ieee_write_number (info, 8)
7121 || ! ieee_add_range (info, false, val, val + size))
7122 return false;
7123 refflag = 0;
7124 asn = true;
7125 break;
7126 case DEBUG_STATIC:
7127 if (! ieee_write_number (info, 3)
7128 || ! ieee_add_range (info, false, val, val + size))
7129 return false;
7130 refflag = 1;
7131 asn = true;
7132 break;
7133 case DEBUG_LOCAL_STATIC:
7134 if (! ieee_write_number (info, 3)
7135 || ! ieee_add_range (info, false, val, val + size))
7136 return false;
7137 refflag = 2;
7138 asn = true;
7139 break;
7140 case DEBUG_LOCAL:
7141 if (! ieee_write_number (info, 1)
7142 || ! ieee_write_number (info, val))
7143 return false;
7144 refflag = 2;
7145 asn = false;
7146 break;
7147 case DEBUG_REGISTER:
7148 if (! ieee_write_number (info, 2)
7149 || ! ieee_write_number (info,
7150 ieee_genreg_to_regno (info->abfd, val)))
7151 return false;
7152 refflag = 2;
7153 asn = false;
7154 break;
7157 if (asn)
7159 if (! ieee_write_asn (info, name_indx, val))
7160 return false;
7163 /* If this is really a reference type, then we just output it with
7164 pointer type, and must now output a C++ record indicating that it
7165 is really reference type. */
7166 if (referencep)
7168 unsigned int nindx;
7170 nindx = info->name_indx;
7171 ++info->name_indx;
7173 /* If this is a global variable, we want to output the misc
7174 record in the C++ misc record block. Otherwise, we want to
7175 output it just after the variable definition, which is where
7176 the current buffer is. */
7177 if (refflag != 2)
7179 if (! ieee_change_buffer (info, &info->cxx))
7180 return false;
7183 if (! ieee_write_byte (info, (int) ieee_nn_record)
7184 || ! ieee_write_number (info, nindx)
7185 || ! ieee_write_id (info, "")
7186 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7187 || ! ieee_write_number (info, nindx)
7188 || ! ieee_write_number (info, 0)
7189 || ! ieee_write_number (info, 62)
7190 || ! ieee_write_number (info, 80)
7191 || ! ieee_write_number (info, 3)
7192 || ! ieee_write_asn (info, nindx, 'R')
7193 || ! ieee_write_asn (info, nindx, refflag)
7194 || ! ieee_write_atn65 (info, nindx, name))
7195 return false;
7198 return true;
7201 /* Start outputting information for a function. */
7203 static boolean
7204 ieee_start_function (p, name, global)
7205 PTR p;
7206 const char *name;
7207 boolean global;
7209 struct ieee_handle *info = (struct ieee_handle *) p;
7210 boolean referencep;
7211 unsigned int retindx, typeindx;
7213 referencep = info->type_stack->type.referencep;
7214 retindx = ieee_pop_type (info);
7216 /* Besides recording a BB4 or BB6 block, we record the type of the
7217 function in the BB1 typedef block. We can't write out the full
7218 type until we have seen all the parameters, so we accumulate it
7219 in info->fntype and info->fnargs. */
7220 if (! ieee_buffer_emptyp (&info->fntype))
7222 /* FIXME: This might happen someday if we support nested
7223 functions. */
7224 abort ();
7227 info->fnname = name;
7229 /* An attribute of 0x40 means that the push mask is unknown. */
7230 if (! ieee_define_named_type (info, name, (unsigned int) -1, 0, false, true,
7231 &info->fntype)
7232 || ! ieee_write_number (info, 'x')
7233 || ! ieee_write_number (info, 0x40)
7234 || ! ieee_write_number (info, 0)
7235 || ! ieee_write_number (info, 0)
7236 || ! ieee_write_number (info, retindx))
7237 return false;
7239 typeindx = ieee_pop_type (info);
7241 if (! ieee_init_buffer (info, &info->fnargs))
7242 return false;
7243 info->fnargcount = 0;
7245 /* If the function return value is actually a reference type, we
7246 must add a record indicating that. */
7247 if (referencep)
7249 unsigned int nindx;
7251 nindx = info->name_indx;
7252 ++info->name_indx;
7253 if (! ieee_change_buffer (info, &info->cxx)
7254 || ! ieee_write_byte (info, (int) ieee_nn_record)
7255 || ! ieee_write_number (info, nindx)
7256 || ! ieee_write_id (info, "")
7257 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7258 || ! ieee_write_number (info, nindx)
7259 || ! ieee_write_number (info, 0)
7260 || ! ieee_write_number (info, 62)
7261 || ! ieee_write_number (info, 80)
7262 || ! ieee_write_number (info, 3)
7263 || ! ieee_write_asn (info, nindx, 'R')
7264 || ! ieee_write_asn (info, nindx, global ? 0 : 1)
7265 || ! ieee_write_atn65 (info, nindx, name))
7266 return false;
7269 assert (! ieee_buffer_emptyp (&info->vars));
7270 if (! ieee_change_buffer (info, &info->vars))
7271 return false;
7273 /* The address is written out as the first block. */
7275 ++info->block_depth;
7277 return (ieee_write_byte (info, (int) ieee_bb_record_enum)
7278 && ieee_write_byte (info, global ? 4 : 6)
7279 && ieee_write_number (info, 0)
7280 && ieee_write_id (info, name)
7281 && ieee_write_number (info, 0)
7282 && ieee_write_number (info, typeindx));
7285 /* Add a function parameter. This will normally be called before the
7286 first block, so we postpone them until we see the block. */
7288 static boolean
7289 ieee_function_parameter (p, name, kind, val)
7290 PTR p;
7291 const char *name;
7292 enum debug_parm_kind kind;
7293 bfd_vma val;
7295 struct ieee_handle *info = (struct ieee_handle *) p;
7296 struct ieee_pending_parm *m, **pm;
7298 assert (info->block_depth == 1);
7300 m = (struct ieee_pending_parm *) xmalloc (sizeof *m);
7301 memset (m, 0, sizeof *m);
7303 m->next = NULL;
7304 m->name = name;
7305 m->referencep = info->type_stack->type.referencep;
7306 m->type = ieee_pop_type (info);
7307 m->kind = kind;
7308 m->val = val;
7310 for (pm = &info->pending_parms; *pm != NULL; pm = &(*pm)->next)
7312 *pm = m;
7314 /* Add the type to the fnargs list. */
7315 if (! ieee_change_buffer (info, &info->fnargs)
7316 || ! ieee_write_number (info, m->type))
7317 return false;
7318 ++info->fnargcount;
7320 return true;
7323 /* Output pending function parameters. */
7325 static boolean
7326 ieee_output_pending_parms (info)
7327 struct ieee_handle *info;
7329 struct ieee_pending_parm *m;
7330 unsigned int refcount;
7332 refcount = 0;
7333 for (m = info->pending_parms; m != NULL; m = m->next)
7335 enum debug_var_kind vkind;
7337 switch (m->kind)
7339 default:
7340 abort ();
7341 return false;
7342 case DEBUG_PARM_STACK:
7343 case DEBUG_PARM_REFERENCE:
7344 vkind = DEBUG_LOCAL;
7345 break;
7346 case DEBUG_PARM_REG:
7347 case DEBUG_PARM_REF_REG:
7348 vkind = DEBUG_REGISTER;
7349 break;
7352 if (! ieee_push_type (info, m->type, 0, false, false))
7353 return false;
7354 info->type_stack->type.referencep = m->referencep;
7355 if (m->referencep)
7356 ++refcount;
7357 if (! ieee_variable ((PTR) info, m->name, vkind, m->val))
7358 return false;
7361 /* If there are any reference parameters, we need to output a
7362 miscellaneous record indicating them. */
7363 if (refcount > 0)
7365 unsigned int nindx, varindx;
7367 /* FIXME: The MRI compiler outputs the demangled function name
7368 here, but we are outputting the mangled name. */
7369 nindx = info->name_indx;
7370 ++info->name_indx;
7371 if (! ieee_change_buffer (info, &info->vars)
7372 || ! ieee_write_byte (info, (int) ieee_nn_record)
7373 || ! ieee_write_number (info, nindx)
7374 || ! ieee_write_id (info, "")
7375 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7376 || ! ieee_write_number (info, nindx)
7377 || ! ieee_write_number (info, 0)
7378 || ! ieee_write_number (info, 62)
7379 || ! ieee_write_number (info, 80)
7380 || ! ieee_write_number (info, refcount + 3)
7381 || ! ieee_write_asn (info, nindx, 'B')
7382 || ! ieee_write_atn65 (info, nindx, info->fnname)
7383 || ! ieee_write_asn (info, nindx, 0))
7384 return false;
7385 for (m = info->pending_parms, varindx = 1;
7386 m != NULL;
7387 m = m->next, varindx++)
7389 if (m->referencep)
7391 if (! ieee_write_asn (info, nindx, varindx))
7392 return false;
7397 m = info->pending_parms;
7398 while (m != NULL)
7400 struct ieee_pending_parm *next;
7402 next = m->next;
7403 free (m);
7404 m = next;
7407 info->pending_parms = NULL;
7409 return true;
7412 /* Start a block. If this is the first block, we output the address
7413 to finish the BB4 or BB6, and then output the function parameters. */
7415 static boolean
7416 ieee_start_block (p, addr)
7417 PTR p;
7418 bfd_vma addr;
7420 struct ieee_handle *info = (struct ieee_handle *) p;
7422 if (! ieee_change_buffer (info, &info->vars))
7423 return false;
7425 if (info->block_depth == 1)
7427 if (! ieee_write_number (info, addr)
7428 || ! ieee_output_pending_parms (info))
7429 return false;
7431 else
7433 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
7434 || ! ieee_write_byte (info, 6)
7435 || ! ieee_write_number (info, 0)
7436 || ! ieee_write_id (info, "")
7437 || ! ieee_write_number (info, 0)
7438 || ! ieee_write_number (info, 0)
7439 || ! ieee_write_number (info, addr))
7440 return false;
7443 if (! ieee_start_range (info, addr))
7444 return false;
7446 ++info->block_depth;
7448 return true;
7451 /* End a block. */
7453 static boolean
7454 ieee_end_block (p, addr)
7455 PTR p;
7456 bfd_vma addr;
7458 struct ieee_handle *info = (struct ieee_handle *) p;
7460 /* The address we are given is the end of the block, but IEEE seems
7461 to want to the address of the last byte in the block, so we
7462 subtract one. */
7463 if (! ieee_change_buffer (info, &info->vars)
7464 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
7465 || ! ieee_write_number (info, addr - 1))
7466 return false;
7468 if (! ieee_end_range (info, addr))
7469 return false;
7471 --info->block_depth;
7473 if (addr > info->highaddr)
7474 info->highaddr = addr;
7476 return true;
7479 /* End a function. */
7481 static boolean
7482 ieee_end_function (p)
7483 PTR p;
7485 struct ieee_handle *info = (struct ieee_handle *) p;
7487 assert (info->block_depth == 1);
7489 --info->block_depth;
7491 /* Now we can finish up fntype, and add it to the typdef section.
7492 At this point, fntype is the 'x' type up to the argument count,
7493 and fnargs is the argument types. We must add the argument
7494 count, and we must add the level. FIXME: We don't record varargs
7495 functions correctly. In fact, stabs debugging does not give us
7496 enough information to do so. */
7497 if (! ieee_change_buffer (info, &info->fntype)
7498 || ! ieee_write_number (info, info->fnargcount)
7499 || ! ieee_change_buffer (info, &info->fnargs)
7500 || ! ieee_write_number (info, 0))
7501 return false;
7503 /* Make sure the typdef block has been started. */
7504 if (ieee_buffer_emptyp (&info->types))
7506 if (! ieee_change_buffer (info, &info->types)
7507 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
7508 || ! ieee_write_byte (info, 1)
7509 || ! ieee_write_number (info, 0)
7510 || ! ieee_write_id (info, info->modname))
7511 return false;
7514 if (! ieee_append_buffer (info, &info->types, &info->fntype)
7515 || ! ieee_append_buffer (info, &info->types, &info->fnargs))
7516 return false;
7518 info->fnname = NULL;
7519 if (! ieee_init_buffer (info, &info->fntype)
7520 || ! ieee_init_buffer (info, &info->fnargs))
7521 return false;
7522 info->fnargcount = 0;
7524 return true;
7527 /* Record line number information. */
7529 static boolean
7530 ieee_lineno (p, filename, lineno, addr)
7531 PTR p;
7532 const char *filename;
7533 unsigned long lineno;
7534 bfd_vma addr;
7536 struct ieee_handle *info = (struct ieee_handle *) p;
7538 assert (info->filename != NULL);
7540 /* The HP simulator seems to get confused when more than one line is
7541 listed for the same address, at least if they are in different
7542 files. We handle this by always listing the last line for a
7543 given address, since that seems to be the one that gdb uses. */
7544 if (info->pending_lineno_filename != NULL
7545 && addr != info->pending_lineno_addr)
7547 /* Make sure we have a line number block. */
7548 if (! ieee_buffer_emptyp (&info->linenos))
7550 if (! ieee_change_buffer (info, &info->linenos))
7551 return false;
7553 else
7555 info->lineno_name_indx = info->name_indx;
7556 ++info->name_indx;
7557 if (! ieee_change_buffer (info, &info->linenos)
7558 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
7559 || ! ieee_write_byte (info, 5)
7560 || ! ieee_write_number (info, 0)
7561 || ! ieee_write_id (info, info->filename)
7562 || ! 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;
7566 info->lineno_filename = info->filename;
7569 if (strcmp (info->pending_lineno_filename, info->lineno_filename) != 0)
7571 if (strcmp (info->filename, info->lineno_filename) != 0)
7573 /* We were not in the main file. Close the block for the
7574 included file. */
7575 if (! ieee_write_byte (info, (int) ieee_be_record_enum))
7576 return false;
7577 if (strcmp (info->filename, info->pending_lineno_filename) == 0)
7579 /* We need a new NN record, and we aren't about to
7580 output one. */
7581 info->lineno_name_indx = info->name_indx;
7582 ++info->name_indx;
7583 if (! ieee_write_byte (info, (int) ieee_nn_record)
7584 || ! ieee_write_number (info, info->lineno_name_indx)
7585 || ! ieee_write_id (info, ""))
7586 return false;
7589 if (strcmp (info->filename, info->pending_lineno_filename) != 0)
7591 /* We are not changing to the main file. Open a block for
7592 the new included file. */
7593 info->lineno_name_indx = info->name_indx;
7594 ++info->name_indx;
7595 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
7596 || ! ieee_write_byte (info, 5)
7597 || ! ieee_write_number (info, 0)
7598 || ! ieee_write_id (info, info->pending_lineno_filename)
7599 || ! ieee_write_byte (info, (int) ieee_nn_record)
7600 || ! ieee_write_number (info, info->lineno_name_indx)
7601 || ! ieee_write_id (info, ""))
7602 return false;
7604 info->lineno_filename = info->pending_lineno_filename;
7607 if (! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7608 || ! ieee_write_number (info, info->lineno_name_indx)
7609 || ! ieee_write_number (info, 0)
7610 || ! ieee_write_number (info, 7)
7611 || ! ieee_write_number (info, info->pending_lineno)
7612 || ! ieee_write_number (info, 0)
7613 || ! ieee_write_asn (info, info->lineno_name_indx,
7614 info->pending_lineno_addr))
7615 return false;
7618 info->pending_lineno_filename = filename;
7619 info->pending_lineno = lineno;
7620 info->pending_lineno_addr = addr;
7622 return true;