PR 293
[binutils.git] / binutils / ieee.c
blob1ced603680d9611f94f272f46285dbe07eb9f2a9
1 /* ieee.c -- Read and write IEEE-695 debugging information.
2 Copyright 1996, 1998, 2000, 2001, 2002, 2003 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 bfd_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 void *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 bfd_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 (struct ieee_info *, const bfd_byte *, const char *);
253 static void ieee_eof (struct ieee_info *);
254 static char *savestring (const char *, unsigned long);
255 static bfd_boolean ieee_read_number
256 (struct ieee_info *, const bfd_byte **, bfd_vma *);
257 static bfd_boolean ieee_read_optional_number
258 (struct ieee_info *, const bfd_byte **, bfd_vma *, bfd_boolean *);
259 static bfd_boolean ieee_read_id
260 (struct ieee_info *, const bfd_byte **, const char **, unsigned long *);
261 static bfd_boolean ieee_read_optional_id
262 (struct ieee_info *, const bfd_byte **, const char **, unsigned long *,
263 bfd_boolean *);
264 static bfd_boolean ieee_read_expression
265 (struct ieee_info *, const bfd_byte **, bfd_vma *);
266 static debug_type ieee_builtin_type
267 (struct ieee_info *, const bfd_byte *, unsigned int);
268 static bfd_boolean ieee_alloc_type
269 (struct ieee_info *, unsigned int, bfd_boolean);
270 static bfd_boolean ieee_read_type_index
271 (struct ieee_info *, const bfd_byte **, debug_type *);
272 static int ieee_regno_to_genreg (bfd *, int);
273 static int ieee_genreg_to_regno (bfd *, int);
274 static bfd_boolean parse_ieee_bb (struct ieee_info *, const bfd_byte **);
275 static bfd_boolean parse_ieee_be (struct ieee_info *, const bfd_byte **);
276 static bfd_boolean parse_ieee_nn (struct ieee_info *, const bfd_byte **);
277 static bfd_boolean parse_ieee_ty (struct ieee_info *, const bfd_byte **);
278 static bfd_boolean parse_ieee_atn (struct ieee_info *, const bfd_byte **);
279 static bfd_boolean ieee_read_cxx_misc
280 (struct ieee_info *, const bfd_byte **, unsigned long);
281 static bfd_boolean ieee_read_cxx_class
282 (struct ieee_info *, const bfd_byte **, unsigned long);
283 static bfd_boolean ieee_read_cxx_defaults
284 (struct ieee_info *, const bfd_byte **, unsigned long);
285 static bfd_boolean ieee_read_reference
286 (struct ieee_info *, const bfd_byte **);
287 static bfd_boolean ieee_require_asn
288 (struct ieee_info *, const bfd_byte **, bfd_vma *);
289 static bfd_boolean ieee_require_atn65
290 (struct ieee_info *, const bfd_byte **, const char **, unsigned long *);
292 /* Report an error in the IEEE debugging information. */
294 static void
295 ieee_error (struct ieee_info *info, const bfd_byte *p, const char *s)
297 if (p != NULL)
298 fprintf (stderr, "%s: 0x%lx: %s (0x%x)\n", bfd_get_filename (info->abfd),
299 (unsigned long) (p - info->bytes), s, *p);
300 else
301 fprintf (stderr, "%s: %s\n", bfd_get_filename (info->abfd), s);
304 /* Report an unexpected EOF in the IEEE debugging information. */
306 static void
307 ieee_eof (struct ieee_info *info)
309 ieee_error (info, (const bfd_byte *) NULL,
310 _("unexpected end of debugging information"));
313 /* Save a string in memory. */
315 static char *
316 savestring (const char *start, unsigned long len)
318 char *ret;
320 ret = (char *) xmalloc (len + 1);
321 memcpy (ret, start, len);
322 ret[len] = '\0';
323 return ret;
326 /* Read a number which must be present in an IEEE file. */
328 static bfd_boolean
329 ieee_read_number (struct ieee_info *info, const bfd_byte **pp, bfd_vma *pv)
331 return ieee_read_optional_number (info, pp, pv, (bfd_boolean *) NULL);
334 /* Read a number in an IEEE file. If ppresent is not NULL, the number
335 need not be there. */
337 static bfd_boolean
338 ieee_read_optional_number (struct ieee_info *info, const bfd_byte **pp,
339 bfd_vma *pv, bfd_boolean *ppresent)
341 ieee_record_enum_type b;
343 if (*pp >= info->pend)
345 if (ppresent != NULL)
347 *ppresent = FALSE;
348 return TRUE;
350 ieee_eof (info);
351 return FALSE;
354 b = (ieee_record_enum_type) **pp;
355 ++*pp;
357 if (b <= ieee_number_end_enum)
359 *pv = (bfd_vma) b;
360 if (ppresent != NULL)
361 *ppresent = TRUE;
362 return TRUE;
365 if (b >= ieee_number_repeat_start_enum && b <= ieee_number_repeat_end_enum)
367 unsigned int i;
369 i = (int) b - (int) ieee_number_repeat_start_enum;
370 if (*pp + i - 1 >= info->pend)
372 ieee_eof (info);
373 return FALSE;
376 *pv = 0;
377 for (; i > 0; i--)
379 *pv <<= 8;
380 *pv += **pp;
381 ++*pp;
384 if (ppresent != NULL)
385 *ppresent = TRUE;
387 return TRUE;
390 if (ppresent != NULL)
392 --*pp;
393 *ppresent = FALSE;
394 return TRUE;
397 ieee_error (info, *pp - 1, _("invalid number"));
398 return FALSE;
401 /* Read a required string from an IEEE file. */
403 static bfd_boolean
404 ieee_read_id (struct ieee_info *info, const bfd_byte **pp,
405 const char **pname, unsigned long *pnamlen)
407 return ieee_read_optional_id (info, pp, pname, pnamlen, (bfd_boolean *) NULL);
410 /* Read a string from an IEEE file. If ppresent is not NULL, the
411 string is optional. */
413 static bfd_boolean
414 ieee_read_optional_id (struct ieee_info *info, const bfd_byte **pp,
415 const char **pname, unsigned long *pnamlen,
416 bfd_boolean *ppresent)
418 bfd_byte b;
419 unsigned long len;
421 if (*pp >= info->pend)
423 ieee_eof (info);
424 return FALSE;
427 b = **pp;
428 ++*pp;
430 if (b <= 0x7f)
431 len = b;
432 else if ((ieee_record_enum_type) b == ieee_extension_length_1_enum)
434 len = **pp;
435 ++*pp;
437 else if ((ieee_record_enum_type) b == ieee_extension_length_2_enum)
439 len = (**pp << 8) + (*pp)[1];
440 *pp += 2;
442 else
444 if (ppresent != NULL)
446 --*pp;
447 *ppresent = FALSE;
448 return TRUE;
450 ieee_error (info, *pp - 1, _("invalid string length"));
451 return FALSE;
454 if ((unsigned long) (info->pend - *pp) < len)
456 ieee_eof (info);
457 return FALSE;
460 *pname = (const char *) *pp;
461 *pnamlen = len;
462 *pp += len;
464 if (ppresent != NULL)
465 *ppresent = TRUE;
467 return TRUE;
470 /* Read an expression from an IEEE file. Since this code is only used
471 to parse debugging information, I haven't bothered to write a full
472 blown IEEE expression parser. I've only thrown in the things I've
473 seen in debugging information. This can be easily extended if
474 necessary. */
476 static bfd_boolean
477 ieee_read_expression (struct ieee_info *info, const bfd_byte **pp,
478 bfd_vma *pv)
480 const bfd_byte *expr_start;
481 #define EXPR_STACK_SIZE (10)
482 bfd_vma expr_stack[EXPR_STACK_SIZE];
483 bfd_vma *esp;
485 expr_start = *pp;
487 esp = expr_stack;
489 while (1)
491 const bfd_byte *start;
492 bfd_vma val;
493 bfd_boolean present;
494 ieee_record_enum_type c;
496 start = *pp;
498 if (! ieee_read_optional_number (info, pp, &val, &present))
499 return FALSE;
501 if (present)
503 if (esp - expr_stack >= EXPR_STACK_SIZE)
505 ieee_error (info, start, _("expression stack overflow"));
506 return FALSE;
508 *esp++ = val;
509 continue;
512 c = (ieee_record_enum_type) **pp;
514 if (c >= ieee_module_beginning_enum)
515 break;
517 ++*pp;
519 if (c == ieee_comma)
520 break;
522 switch (c)
524 default:
525 ieee_error (info, start, _("unsupported IEEE expression operator"));
526 break;
528 case ieee_variable_R_enum:
530 bfd_vma indx;
531 asection *s;
533 if (! ieee_read_number (info, pp, &indx))
534 return FALSE;
535 for (s = info->abfd->sections; s != NULL; s = s->next)
536 if ((bfd_vma) s->target_index == indx)
537 break;
538 if (s == NULL)
540 ieee_error (info, start, _("unknown section"));
541 return FALSE;
544 if (esp - expr_stack >= EXPR_STACK_SIZE)
546 ieee_error (info, start, _("expression stack overflow"));
547 return FALSE;
550 *esp++ = bfd_get_section_vma (info->abfd, s);
552 break;
554 case ieee_function_plus_enum:
555 case ieee_function_minus_enum:
557 bfd_vma v1, v2;
559 if (esp - expr_stack < 2)
561 ieee_error (info, start, _("expression stack underflow"));
562 return FALSE;
565 v1 = *--esp;
566 v2 = *--esp;
567 *esp++ = v1 + v2;
569 break;
573 if (esp - 1 != expr_stack)
575 ieee_error (info, expr_start, _("expression stack mismatch"));
576 return FALSE;
579 *pv = *--esp;
581 return TRUE;
584 /* Return an IEEE builtin type. */
586 static debug_type
587 ieee_builtin_type (struct ieee_info *info, const bfd_byte *p,
588 unsigned int indx)
590 void *dhandle;
591 debug_type type;
592 const char *name;
594 if (indx < BUILTIN_TYPE_COUNT
595 && info->types.builtins[indx] != DEBUG_TYPE_NULL)
596 return info->types.builtins[indx];
598 dhandle = info->dhandle;
600 if (indx >= 32 && indx < 64)
602 type = debug_make_pointer_type (dhandle,
603 ieee_builtin_type (info, p, indx - 32));
604 assert (indx < BUILTIN_TYPE_COUNT);
605 info->types.builtins[indx] = type;
606 return type;
609 switch ((enum builtin_types) indx)
611 default:
612 ieee_error (info, p, _("unknown builtin type"));
613 return NULL;
615 case builtin_unknown:
616 type = debug_make_void_type (dhandle);
617 name = NULL;
618 break;
620 case builtin_void:
621 type = debug_make_void_type (dhandle);
622 name = "void";
623 break;
625 case builtin_signed_char:
626 type = debug_make_int_type (dhandle, 1, FALSE);
627 name = "signed char";
628 break;
630 case builtin_unsigned_char:
631 type = debug_make_int_type (dhandle, 1, TRUE);
632 name = "unsigned char";
633 break;
635 case builtin_signed_short_int:
636 type = debug_make_int_type (dhandle, 2, FALSE);
637 name = "signed short int";
638 break;
640 case builtin_unsigned_short_int:
641 type = debug_make_int_type (dhandle, 2, TRUE);
642 name = "unsigned short int";
643 break;
645 case builtin_signed_long:
646 type = debug_make_int_type (dhandle, 4, FALSE);
647 name = "signed long";
648 break;
650 case builtin_unsigned_long:
651 type = debug_make_int_type (dhandle, 4, TRUE);
652 name = "unsigned long";
653 break;
655 case builtin_signed_long_long:
656 type = debug_make_int_type (dhandle, 8, FALSE);
657 name = "signed long long";
658 break;
660 case builtin_unsigned_long_long:
661 type = debug_make_int_type (dhandle, 8, TRUE);
662 name = "unsigned long long";
663 break;
665 case builtin_float:
666 type = debug_make_float_type (dhandle, 4);
667 name = "float";
668 break;
670 case builtin_double:
671 type = debug_make_float_type (dhandle, 8);
672 name = "double";
673 break;
675 case builtin_long_double:
676 /* FIXME: The size for this type should depend upon the
677 processor. */
678 type = debug_make_float_type (dhandle, 12);
679 name = "long double";
680 break;
682 case builtin_long_long_double:
683 type = debug_make_float_type (dhandle, 16);
684 name = "long long double";
685 break;
687 case builtin_quoted_string:
688 type = debug_make_array_type (dhandle,
689 ieee_builtin_type (info, p,
690 ((unsigned int)
691 builtin_char)),
692 ieee_builtin_type (info, p,
693 ((unsigned int)
694 builtin_int)),
695 0, -1, TRUE);
696 name = "QUOTED STRING";
697 break;
699 case builtin_instruction_address:
700 /* FIXME: This should be a code address. */
701 type = debug_make_int_type (dhandle, 4, TRUE);
702 name = "instruction address";
703 break;
705 case builtin_int:
706 /* FIXME: The size for this type should depend upon the
707 processor. */
708 type = debug_make_int_type (dhandle, 4, FALSE);
709 name = "int";
710 break;
712 case builtin_unsigned:
713 /* FIXME: The size for this type should depend upon the
714 processor. */
715 type = debug_make_int_type (dhandle, 4, TRUE);
716 name = "unsigned";
717 break;
719 case builtin_unsigned_int:
720 /* FIXME: The size for this type should depend upon the
721 processor. */
722 type = debug_make_int_type (dhandle, 4, TRUE);
723 name = "unsigned int";
724 break;
726 case builtin_char:
727 type = debug_make_int_type (dhandle, 1, FALSE);
728 name = "char";
729 break;
731 case builtin_long:
732 type = debug_make_int_type (dhandle, 4, FALSE);
733 name = "long";
734 break;
736 case builtin_short:
737 type = debug_make_int_type (dhandle, 2, FALSE);
738 name = "short";
739 break;
741 case builtin_unsigned_short:
742 type = debug_make_int_type (dhandle, 2, TRUE);
743 name = "unsigned short";
744 break;
746 case builtin_short_int:
747 type = debug_make_int_type (dhandle, 2, FALSE);
748 name = "short int";
749 break;
751 case builtin_signed_short:
752 type = debug_make_int_type (dhandle, 2, FALSE);
753 name = "signed short";
754 break;
756 case builtin_bcd_float:
757 ieee_error (info, p, _("BCD float type not supported"));
758 return DEBUG_TYPE_NULL;
761 if (name != NULL)
762 type = debug_name_type (dhandle, name, type);
764 assert (indx < BUILTIN_TYPE_COUNT);
766 info->types.builtins[indx] = type;
768 return type;
771 /* Allocate more space in the type table. If ref is TRUE, this is a
772 reference to the type; if it is not already defined, we should set
773 up an indirect type. */
775 static bfd_boolean
776 ieee_alloc_type (struct ieee_info *info, unsigned int indx, bfd_boolean ref)
778 unsigned int nalloc;
779 register struct ieee_type *t;
780 struct ieee_type *tend;
782 if (indx >= info->types.alloc)
784 nalloc = info->types.alloc;
785 if (nalloc == 0)
786 nalloc = 4;
787 while (indx >= nalloc)
788 nalloc *= 2;
790 info->types.types = ((struct ieee_type *)
791 xrealloc (info->types.types,
792 nalloc * sizeof *info->types.types));
794 memset (info->types.types + info->types.alloc, 0,
795 (nalloc - info->types.alloc) * sizeof *info->types.types);
797 tend = info->types.types + nalloc;
798 for (t = info->types.types + info->types.alloc; t < tend; t++)
799 t->type = DEBUG_TYPE_NULL;
801 info->types.alloc = nalloc;
804 if (ref)
806 t = info->types.types + indx;
807 if (t->type == NULL)
809 t->pslot = (debug_type *) xmalloc (sizeof *t->pslot);
810 *t->pslot = DEBUG_TYPE_NULL;
811 t->type = debug_make_indirect_type (info->dhandle, t->pslot,
812 (const char *) NULL);
813 if (t->type == NULL)
814 return FALSE;
818 return TRUE;
821 /* Read a type index and return the corresponding type. */
823 static bfd_boolean
824 ieee_read_type_index (struct ieee_info *info, const bfd_byte **pp,
825 debug_type *ptype)
827 const bfd_byte *start;
828 bfd_vma indx;
830 start = *pp;
832 if (! ieee_read_number (info, pp, &indx))
833 return FALSE;
835 if (indx < 256)
837 *ptype = ieee_builtin_type (info, start, indx);
838 if (*ptype == NULL)
839 return FALSE;
840 return TRUE;
843 indx -= 256;
844 if (! ieee_alloc_type (info, indx, TRUE))
845 return FALSE;
847 *ptype = info->types.types[indx].type;
849 return TRUE;
852 /* Parse IEEE debugging information for a file. This is passed the
853 bytes which compose the Debug Information Part of an IEEE file. */
855 bfd_boolean
856 parse_ieee (void *dhandle, bfd *abfd, const bfd_byte *bytes, bfd_size_type len)
858 struct ieee_info info;
859 unsigned int i;
860 const bfd_byte *p, *pend;
862 info.dhandle = dhandle;
863 info.abfd = abfd;
864 info.bytes = bytes;
865 info.pend = bytes + len;
866 info.blockstack.bsp = info.blockstack.stack;
867 info.saw_filename = FALSE;
868 info.vars.alloc = 0;
869 info.vars.vars = NULL;
870 info.global_vars = NULL;
871 info.types.alloc = 0;
872 info.types.types = NULL;
873 info.global_types = NULL;
874 info.tags = NULL;
875 for (i = 0; i < BUILTIN_TYPE_COUNT; i++)
876 info.types.builtins[i] = DEBUG_TYPE_NULL;
878 p = bytes;
879 pend = info.pend;
880 while (p < pend)
882 const bfd_byte *record_start;
883 ieee_record_enum_type c;
885 record_start = p;
887 c = (ieee_record_enum_type) *p++;
889 if (c == ieee_at_record_enum)
890 c = (ieee_record_enum_type) (((unsigned int) c << 8) | *p++);
892 if (c <= ieee_number_repeat_end_enum)
894 ieee_error (&info, record_start, _("unexpected number"));
895 return FALSE;
898 switch (c)
900 default:
901 ieee_error (&info, record_start, _("unexpected record type"));
902 return FALSE;
904 case ieee_bb_record_enum:
905 if (! parse_ieee_bb (&info, &p))
906 return FALSE;
907 break;
909 case ieee_be_record_enum:
910 if (! parse_ieee_be (&info, &p))
911 return FALSE;
912 break;
914 case ieee_nn_record:
915 if (! parse_ieee_nn (&info, &p))
916 return FALSE;
917 break;
919 case ieee_ty_record_enum:
920 if (! parse_ieee_ty (&info, &p))
921 return FALSE;
922 break;
924 case ieee_atn_record_enum:
925 if (! parse_ieee_atn (&info, &p))
926 return FALSE;
927 break;
931 if (info.blockstack.bsp != info.blockstack.stack)
933 ieee_error (&info, (const bfd_byte *) NULL,
934 _("blocks left on stack at end"));
935 return FALSE;
938 return TRUE;
941 /* Handle an IEEE BB record. */
943 static bfd_boolean
944 parse_ieee_bb (struct ieee_info *info, const bfd_byte **pp)
946 const bfd_byte *block_start;
947 bfd_byte b;
948 bfd_vma size;
949 const char *name;
950 unsigned long namlen;
951 char *namcopy = NULL;
952 unsigned int fnindx;
953 bfd_boolean skip;
955 block_start = *pp;
957 b = **pp;
958 ++*pp;
960 if (! ieee_read_number (info, pp, &size)
961 || ! ieee_read_id (info, pp, &name, &namlen))
962 return FALSE;
964 fnindx = (unsigned int) -1;
965 skip = FALSE;
967 switch (b)
969 case 1:
970 /* BB1: Type definitions local to a module. */
971 namcopy = savestring (name, namlen);
972 if (namcopy == NULL)
973 return FALSE;
974 if (! debug_set_filename (info->dhandle, namcopy))
975 return FALSE;
976 info->saw_filename = TRUE;
978 /* Discard any variables or types we may have seen before. */
979 if (info->vars.vars != NULL)
980 free (info->vars.vars);
981 info->vars.vars = NULL;
982 info->vars.alloc = 0;
983 if (info->types.types != NULL)
984 free (info->types.types);
985 info->types.types = NULL;
986 info->types.alloc = 0;
988 /* Initialize the types to the global types. */
989 if (info->global_types != NULL)
991 info->types.alloc = info->global_types->alloc;
992 info->types.types = ((struct ieee_type *)
993 xmalloc (info->types.alloc
994 * sizeof (*info->types.types)));
995 memcpy (info->types.types, info->global_types->types,
996 info->types.alloc * sizeof (*info->types.types));
999 break;
1001 case 2:
1002 /* BB2: Global type definitions. The name is supposed to be
1003 empty, but we don't check. */
1004 if (! debug_set_filename (info->dhandle, "*global*"))
1005 return FALSE;
1006 info->saw_filename = TRUE;
1007 break;
1009 case 3:
1010 /* BB3: High level module block begin. We don't have to do
1011 anything here. The name is supposed to be the same as for
1012 the BB1, but we don't check. */
1013 break;
1015 case 4:
1016 /* BB4: Global function. */
1018 bfd_vma stackspace, typindx, offset;
1019 debug_type return_type;
1021 if (! ieee_read_number (info, pp, &stackspace)
1022 || ! ieee_read_number (info, pp, &typindx)
1023 || ! ieee_read_expression (info, pp, &offset))
1024 return FALSE;
1026 /* We have no way to record the stack space. FIXME. */
1028 if (typindx < 256)
1030 return_type = ieee_builtin_type (info, block_start, typindx);
1031 if (return_type == DEBUG_TYPE_NULL)
1032 return FALSE;
1034 else
1036 typindx -= 256;
1037 if (! ieee_alloc_type (info, typindx, TRUE))
1038 return FALSE;
1039 fnindx = typindx;
1040 return_type = info->types.types[typindx].type;
1041 if (debug_get_type_kind (info->dhandle, return_type)
1042 == DEBUG_KIND_FUNCTION)
1043 return_type = debug_get_return_type (info->dhandle,
1044 return_type);
1047 namcopy = savestring (name, namlen);
1048 if (namcopy == NULL)
1049 return FALSE;
1050 if (! debug_record_function (info->dhandle, namcopy, return_type,
1051 TRUE, offset))
1052 return FALSE;
1054 break;
1056 case 5:
1057 /* BB5: File name for source line numbers. */
1059 unsigned int i;
1061 /* We ignore the date and time. FIXME. */
1062 for (i = 0; i < 6; i++)
1064 bfd_vma ignore;
1065 bfd_boolean present;
1067 if (! ieee_read_optional_number (info, pp, &ignore, &present))
1068 return FALSE;
1069 if (! present)
1070 break;
1073 namcopy = savestring (name, namlen);
1074 if (namcopy == NULL)
1075 return FALSE;
1076 if (! debug_start_source (info->dhandle, namcopy))
1077 return FALSE;
1079 break;
1081 case 6:
1082 /* BB6: Local function or block. */
1084 bfd_vma stackspace, typindx, offset;
1086 if (! ieee_read_number (info, pp, &stackspace)
1087 || ! ieee_read_number (info, pp, &typindx)
1088 || ! ieee_read_expression (info, pp, &offset))
1089 return FALSE;
1091 /* We have no way to record the stack space. FIXME. */
1093 if (namlen == 0)
1095 if (! debug_start_block (info->dhandle, offset))
1096 return FALSE;
1097 /* Change b to indicate that this is a block
1098 rather than a function. */
1099 b = 0x86;
1101 else
1103 /* The MRI C++ compiler will output a fake function named
1104 __XRYCPP to hold C++ debugging information. We skip
1105 that function. This is not crucial, but it makes
1106 converting from IEEE to other debug formats work
1107 better. */
1108 if (strncmp (name, "__XRYCPP", namlen) == 0)
1109 skip = TRUE;
1110 else
1112 debug_type return_type;
1114 if (typindx < 256)
1116 return_type = ieee_builtin_type (info, block_start,
1117 typindx);
1118 if (return_type == NULL)
1119 return FALSE;
1121 else
1123 typindx -= 256;
1124 if (! ieee_alloc_type (info, typindx, TRUE))
1125 return FALSE;
1126 fnindx = typindx;
1127 return_type = info->types.types[typindx].type;
1128 if (debug_get_type_kind (info->dhandle, return_type)
1129 == DEBUG_KIND_FUNCTION)
1130 return_type = debug_get_return_type (info->dhandle,
1131 return_type);
1134 namcopy = savestring (name, namlen);
1135 if (namcopy == NULL)
1136 return FALSE;
1137 if (! debug_record_function (info->dhandle, namcopy,
1138 return_type, FALSE, offset))
1139 return FALSE;
1143 break;
1145 case 10:
1146 /* BB10: Assembler module scope. In the normal case, we
1147 completely ignore all this information. FIXME. */
1149 const char *inam, *vstr;
1150 unsigned long inamlen, vstrlen;
1151 bfd_vma tool_type;
1152 bfd_boolean present;
1153 unsigned int i;
1155 if (! info->saw_filename)
1157 namcopy = savestring (name, namlen);
1158 if (namcopy == NULL)
1159 return FALSE;
1160 if (! debug_set_filename (info->dhandle, namcopy))
1161 return FALSE;
1162 info->saw_filename = TRUE;
1165 if (! ieee_read_id (info, pp, &inam, &inamlen)
1166 || ! ieee_read_number (info, pp, &tool_type)
1167 || ! ieee_read_optional_id (info, pp, &vstr, &vstrlen, &present))
1168 return FALSE;
1169 for (i = 0; i < 6; i++)
1171 bfd_vma ignore;
1173 if (! ieee_read_optional_number (info, pp, &ignore, &present))
1174 return FALSE;
1175 if (! present)
1176 break;
1179 break;
1181 case 11:
1182 /* BB11: Module section. We completely ignore all this
1183 information. FIXME. */
1185 bfd_vma sectype, secindx, offset, map;
1186 bfd_boolean present;
1188 if (! ieee_read_number (info, pp, &sectype)
1189 || ! ieee_read_number (info, pp, &secindx)
1190 || ! ieee_read_expression (info, pp, &offset)
1191 || ! ieee_read_optional_number (info, pp, &map, &present))
1192 return FALSE;
1194 break;
1196 default:
1197 ieee_error (info, block_start, _("unknown BB type"));
1198 return FALSE;
1202 /* Push this block on the block stack. */
1204 if (info->blockstack.bsp >= info->blockstack.stack + BLOCKSTACK_SIZE)
1206 ieee_error (info, (const bfd_byte *) NULL, _("stack overflow"));
1207 return FALSE;
1210 info->blockstack.bsp->kind = b;
1211 if (b == 5)
1212 info->blockstack.bsp->filename = namcopy;
1213 info->blockstack.bsp->fnindx = fnindx;
1214 info->blockstack.bsp->skip = skip;
1215 ++info->blockstack.bsp;
1217 return TRUE;
1220 /* Handle an IEEE BE record. */
1222 static bfd_boolean
1223 parse_ieee_be (struct ieee_info *info, const bfd_byte **pp)
1225 bfd_vma offset;
1227 if (info->blockstack.bsp <= info->blockstack.stack)
1229 ieee_error (info, *pp, _("stack underflow"));
1230 return FALSE;
1232 --info->blockstack.bsp;
1234 switch (info->blockstack.bsp->kind)
1236 case 2:
1237 /* When we end the global typedefs block, we copy out the
1238 contents of info->vars. This is because the variable indices
1239 may be reused in the local blocks. However, we need to
1240 preserve them so that we can locate a function returning a
1241 reference variable whose type is named in the global typedef
1242 block. */
1243 info->global_vars = ((struct ieee_vars *)
1244 xmalloc (sizeof *info->global_vars));
1245 info->global_vars->alloc = info->vars.alloc;
1246 info->global_vars->vars = ((struct ieee_var *)
1247 xmalloc (info->vars.alloc
1248 * sizeof (*info->vars.vars)));
1249 memcpy (info->global_vars->vars, info->vars.vars,
1250 info->vars.alloc * sizeof (*info->vars.vars));
1252 /* We also copy out the non builtin parts of info->types, since
1253 the types are discarded when we start a new block. */
1254 info->global_types = ((struct ieee_types *)
1255 xmalloc (sizeof *info->global_types));
1256 info->global_types->alloc = info->types.alloc;
1257 info->global_types->types = ((struct ieee_type *)
1258 xmalloc (info->types.alloc
1259 * sizeof (*info->types.types)));
1260 memcpy (info->global_types->types, info->types.types,
1261 info->types.alloc * sizeof (*info->types.types));
1262 memset (info->global_types->builtins, 0,
1263 sizeof (info->global_types->builtins));
1265 break;
1267 case 4:
1268 case 6:
1269 if (! ieee_read_expression (info, pp, &offset))
1270 return FALSE;
1271 if (! info->blockstack.bsp->skip)
1273 if (! debug_end_function (info->dhandle, offset + 1))
1274 return FALSE;
1276 break;
1278 case 0x86:
1279 /* This is BE6 when BB6 started a block rather than a local
1280 function. */
1281 if (! ieee_read_expression (info, pp, &offset))
1282 return FALSE;
1283 if (! debug_end_block (info->dhandle, offset + 1))
1284 return FALSE;
1285 break;
1287 case 5:
1288 /* When we end a BB5, we look up the stack for the last BB5, if
1289 there is one, so that we can call debug_start_source. */
1290 if (info->blockstack.bsp > info->blockstack.stack)
1292 struct ieee_block *bl;
1294 bl = info->blockstack.bsp;
1297 --bl;
1298 if (bl->kind == 5)
1300 if (! debug_start_source (info->dhandle, bl->filename))
1301 return FALSE;
1302 break;
1305 while (bl != info->blockstack.stack);
1307 break;
1309 case 11:
1310 if (! ieee_read_expression (info, pp, &offset))
1311 return FALSE;
1312 /* We just ignore the module size. FIXME. */
1313 break;
1315 default:
1316 /* Other block types do not have any trailing information. */
1317 break;
1320 return TRUE;
1323 /* Parse an NN record. */
1325 static bfd_boolean
1326 parse_ieee_nn (struct ieee_info *info, const bfd_byte **pp)
1328 const bfd_byte *nn_start;
1329 bfd_vma varindx;
1330 const char *name;
1331 unsigned long namlen;
1333 nn_start = *pp;
1335 if (! ieee_read_number (info, pp, &varindx)
1336 || ! ieee_read_id (info, pp, &name, &namlen))
1337 return FALSE;
1339 if (varindx < 32)
1341 ieee_error (info, nn_start, _("illegal variable index"));
1342 return FALSE;
1344 varindx -= 32;
1346 if (varindx >= info->vars.alloc)
1348 unsigned int alloc;
1350 alloc = info->vars.alloc;
1351 if (alloc == 0)
1352 alloc = 4;
1353 while (varindx >= alloc)
1354 alloc *= 2;
1355 info->vars.vars = ((struct ieee_var *)
1356 xrealloc (info->vars.vars,
1357 alloc * sizeof *info->vars.vars));
1358 memset (info->vars.vars + info->vars.alloc, 0,
1359 (alloc - info->vars.alloc) * sizeof *info->vars.vars);
1360 info->vars.alloc = alloc;
1363 info->vars.vars[varindx].name = name;
1364 info->vars.vars[varindx].namlen = namlen;
1366 return TRUE;
1369 /* Parse a TY record. */
1371 static bfd_boolean
1372 parse_ieee_ty (struct ieee_info *info, const bfd_byte **pp)
1374 const bfd_byte *ty_start, *ty_var_start, *ty_code_start;
1375 bfd_vma typeindx, varindx, tc;
1376 void *dhandle;
1377 bfd_boolean tag, typdef;
1378 debug_type *arg_slots;
1379 unsigned long type_bitsize;
1380 debug_type type;
1382 ty_start = *pp;
1384 if (! ieee_read_number (info, pp, &typeindx))
1385 return FALSE;
1387 if (typeindx < 256)
1389 ieee_error (info, ty_start, _("illegal type index"));
1390 return FALSE;
1393 typeindx -= 256;
1394 if (! ieee_alloc_type (info, typeindx, FALSE))
1395 return FALSE;
1397 if (**pp != 0xce)
1399 ieee_error (info, *pp, _("unknown TY code"));
1400 return FALSE;
1402 ++*pp;
1404 ty_var_start = *pp;
1406 if (! ieee_read_number (info, pp, &varindx))
1407 return FALSE;
1409 if (varindx < 32)
1411 ieee_error (info, ty_var_start, _("illegal variable index"));
1412 return FALSE;
1414 varindx -= 32;
1416 if (varindx >= info->vars.alloc || info->vars.vars[varindx].name == NULL)
1418 ieee_error (info, ty_var_start, _("undefined variable in TY"));
1419 return FALSE;
1422 ty_code_start = *pp;
1424 if (! ieee_read_number (info, pp, &tc))
1425 return FALSE;
1427 dhandle = info->dhandle;
1429 tag = FALSE;
1430 typdef = FALSE;
1431 arg_slots = NULL;
1432 type_bitsize = 0;
1433 switch (tc)
1435 default:
1436 ieee_error (info, ty_code_start, _("unknown TY code"));
1437 return FALSE;
1439 case '!':
1440 /* Unknown type, with size. We treat it as int. FIXME. */
1442 bfd_vma size;
1444 if (! ieee_read_number (info, pp, &size))
1445 return FALSE;
1446 type = debug_make_int_type (dhandle, size, FALSE);
1448 break;
1450 case 'A': /* Array. */
1451 case 'a': /* FORTRAN array in column/row order. FIXME: Not
1452 distinguished from normal array. */
1454 debug_type ele_type;
1455 bfd_vma lower, upper;
1457 if (! ieee_read_type_index (info, pp, &ele_type)
1458 || ! ieee_read_number (info, pp, &lower)
1459 || ! ieee_read_number (info, pp, &upper))
1460 return FALSE;
1461 type = debug_make_array_type (dhandle, ele_type,
1462 ieee_builtin_type (info, ty_code_start,
1463 ((unsigned int)
1464 builtin_int)),
1465 (bfd_signed_vma) lower,
1466 (bfd_signed_vma) upper,
1467 FALSE);
1469 break;
1471 case 'E':
1472 /* Simple enumeration. */
1474 bfd_vma size;
1475 unsigned int alloc;
1476 const char **names;
1477 unsigned int c;
1478 bfd_signed_vma *vals;
1479 unsigned int i;
1481 if (! ieee_read_number (info, pp, &size))
1482 return FALSE;
1483 /* FIXME: we ignore the enumeration size. */
1485 alloc = 10;
1486 names = (const char **) xmalloc (alloc * sizeof *names);
1487 memset (names, 0, alloc * sizeof *names);
1488 c = 0;
1489 while (1)
1491 const char *name;
1492 unsigned long namlen;
1493 bfd_boolean present;
1495 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1496 return FALSE;
1497 if (! present)
1498 break;
1500 if (c + 1 >= alloc)
1502 alloc += 10;
1503 names = ((const char **)
1504 xrealloc (names, alloc * sizeof *names));
1507 names[c] = savestring (name, namlen);
1508 if (names[c] == NULL)
1509 return FALSE;
1510 ++c;
1513 names[c] = NULL;
1515 vals = (bfd_signed_vma *) xmalloc (c * sizeof *vals);
1516 for (i = 0; i < c; i++)
1517 vals[i] = i;
1519 type = debug_make_enum_type (dhandle, names, vals);
1520 tag = TRUE;
1522 break;
1524 case 'G':
1525 /* Struct with bit fields. */
1527 bfd_vma size;
1528 unsigned int alloc;
1529 debug_field *fields;
1530 unsigned int c;
1532 if (! ieee_read_number (info, pp, &size))
1533 return FALSE;
1535 alloc = 10;
1536 fields = (debug_field *) xmalloc (alloc * sizeof *fields);
1537 c = 0;
1538 while (1)
1540 const char *name;
1541 unsigned long namlen;
1542 bfd_boolean present;
1543 debug_type ftype;
1544 bfd_vma bitpos, bitsize;
1546 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1547 return FALSE;
1548 if (! present)
1549 break;
1550 if (! ieee_read_type_index (info, pp, &ftype)
1551 || ! ieee_read_number (info, pp, &bitpos)
1552 || ! ieee_read_number (info, pp, &bitsize))
1553 return FALSE;
1555 if (c + 1 >= alloc)
1557 alloc += 10;
1558 fields = ((debug_field *)
1559 xrealloc (fields, alloc * sizeof *fields));
1562 fields[c] = debug_make_field (dhandle, savestring (name, namlen),
1563 ftype, bitpos, bitsize,
1564 DEBUG_VISIBILITY_PUBLIC);
1565 if (fields[c] == NULL)
1566 return FALSE;
1567 ++c;
1570 fields[c] = NULL;
1572 type = debug_make_struct_type (dhandle, TRUE, size, fields);
1573 tag = TRUE;
1575 break;
1577 case 'N':
1578 /* Enumeration. */
1580 unsigned int alloc;
1581 const char **names;
1582 bfd_signed_vma *vals;
1583 unsigned int c;
1585 alloc = 10;
1586 names = (const char **) xmalloc (alloc * sizeof *names);
1587 vals = (bfd_signed_vma *) xmalloc (alloc * sizeof *names);
1588 c = 0;
1589 while (1)
1591 const char *name;
1592 unsigned long namlen;
1593 bfd_boolean present;
1594 bfd_vma val;
1596 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1597 return FALSE;
1598 if (! present)
1599 break;
1600 if (! ieee_read_number (info, pp, &val))
1601 return FALSE;
1603 /* If the length of the name is zero, then the value is
1604 actually the size of the enum. We ignore this
1605 information. FIXME. */
1606 if (namlen == 0)
1607 continue;
1609 if (c + 1 >= alloc)
1611 alloc += 10;
1612 names = ((const char **)
1613 xrealloc (names, alloc * sizeof *names));
1614 vals = ((bfd_signed_vma *)
1615 xrealloc (vals, alloc * sizeof *vals));
1618 names[c] = savestring (name, namlen);
1619 if (names[c] == NULL)
1620 return FALSE;
1621 vals[c] = (bfd_signed_vma) val;
1622 ++c;
1625 names[c] = NULL;
1627 type = debug_make_enum_type (dhandle, names, vals);
1628 tag = TRUE;
1630 break;
1632 case 'O': /* Small pointer. We don't distinguish small and large
1633 pointers. FIXME. */
1634 case 'P': /* Large pointer. */
1636 debug_type t;
1638 if (! ieee_read_type_index (info, pp, &t))
1639 return FALSE;
1640 type = debug_make_pointer_type (dhandle, t);
1642 break;
1644 case 'R':
1645 /* Range. */
1647 bfd_vma low, high, signedp, size;
1649 if (! ieee_read_number (info, pp, &low)
1650 || ! ieee_read_number (info, pp, &high)
1651 || ! ieee_read_number (info, pp, &signedp)
1652 || ! ieee_read_number (info, pp, &size))
1653 return FALSE;
1655 type = debug_make_range_type (dhandle,
1656 debug_make_int_type (dhandle, size,
1657 ! signedp),
1658 (bfd_signed_vma) low,
1659 (bfd_signed_vma) high);
1661 break;
1663 case 'S': /* Struct. */
1664 case 'U': /* Union. */
1666 bfd_vma size;
1667 unsigned int alloc;
1668 debug_field *fields;
1669 unsigned int c;
1671 if (! ieee_read_number (info, pp, &size))
1672 return FALSE;
1674 alloc = 10;
1675 fields = (debug_field *) xmalloc (alloc * sizeof *fields);
1676 c = 0;
1677 while (1)
1679 const char *name;
1680 unsigned long namlen;
1681 bfd_boolean present;
1682 bfd_vma tindx;
1683 bfd_vma offset;
1684 debug_type ftype;
1685 bfd_vma bitsize;
1687 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1688 return FALSE;
1689 if (! present)
1690 break;
1691 if (! ieee_read_number (info, pp, &tindx)
1692 || ! ieee_read_number (info, pp, &offset))
1693 return FALSE;
1695 if (tindx < 256)
1697 ftype = ieee_builtin_type (info, ty_code_start, tindx);
1698 bitsize = 0;
1699 offset *= 8;
1701 else
1703 struct ieee_type *t;
1705 tindx -= 256;
1706 if (! ieee_alloc_type (info, tindx, TRUE))
1707 return FALSE;
1708 t = info->types.types + tindx;
1709 ftype = t->type;
1710 bitsize = t->bitsize;
1711 if (bitsize == 0)
1712 offset *= 8;
1715 if (c + 1 >= alloc)
1717 alloc += 10;
1718 fields = ((debug_field *)
1719 xrealloc (fields, alloc * sizeof *fields));
1722 fields[c] = debug_make_field (dhandle, savestring (name, namlen),
1723 ftype, offset, bitsize,
1724 DEBUG_VISIBILITY_PUBLIC);
1725 if (fields[c] == NULL)
1726 return FALSE;
1727 ++c;
1730 fields[c] = NULL;
1732 type = debug_make_struct_type (dhandle, tc == 'S', size, fields);
1733 tag = TRUE;
1735 break;
1737 case 'T':
1738 /* Typedef. */
1739 if (! ieee_read_type_index (info, pp, &type))
1740 return FALSE;
1741 typdef = TRUE;
1742 break;
1744 case 'X':
1745 /* Procedure. FIXME: This is an extern declaration, which we
1746 have no way of representing. */
1748 bfd_vma attr;
1749 debug_type rtype;
1750 bfd_vma nargs;
1751 bfd_boolean present;
1752 struct ieee_var *pv;
1754 /* FIXME: We ignore the attribute and the argument names. */
1756 if (! ieee_read_number (info, pp, &attr)
1757 || ! ieee_read_type_index (info, pp, &rtype)
1758 || ! ieee_read_number (info, pp, &nargs))
1759 return FALSE;
1762 const char *name;
1763 unsigned long namlen;
1765 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
1766 return FALSE;
1768 while (present);
1770 pv = info->vars.vars + varindx;
1771 pv->kind = IEEE_EXTERNAL;
1772 if (pv->namlen > 0
1773 && debug_get_type_kind (dhandle, rtype) == DEBUG_KIND_POINTER)
1775 /* Set up the return type as an indirect type pointing to
1776 the variable slot, so that we can change it to a
1777 reference later if appropriate. */
1778 pv->pslot = (debug_type *) xmalloc (sizeof *pv->pslot);
1779 *pv->pslot = rtype;
1780 rtype = debug_make_indirect_type (dhandle, pv->pslot,
1781 (const char *) NULL);
1784 type = debug_make_function_type (dhandle, rtype, (debug_type *) NULL,
1785 FALSE);
1787 break;
1789 case 'V':
1790 /* Void. This is not documented, but the MRI compiler emits it. */
1791 type = debug_make_void_type (dhandle);
1792 break;
1794 case 'Z':
1795 /* Array with 0 lower bound. */
1797 debug_type etype;
1798 bfd_vma high;
1800 if (! ieee_read_type_index (info, pp, &etype)
1801 || ! ieee_read_number (info, pp, &high))
1802 return FALSE;
1804 type = debug_make_array_type (dhandle, etype,
1805 ieee_builtin_type (info, ty_code_start,
1806 ((unsigned int)
1807 builtin_int)),
1808 0, (bfd_signed_vma) high, FALSE);
1810 break;
1812 case 'c': /* Complex. */
1813 case 'd': /* Double complex. */
1815 const char *name;
1816 unsigned long namlen;
1818 /* FIXME: I don't know what the name means. */
1820 if (! ieee_read_id (info, pp, &name, &namlen))
1821 return FALSE;
1823 type = debug_make_complex_type (dhandle, tc == 'c' ? 4 : 8);
1825 break;
1827 case 'f':
1828 /* Pascal file name. FIXME. */
1829 ieee_error (info, ty_code_start, _("Pascal file name not supported"));
1830 return FALSE;
1832 case 'g':
1833 /* Bitfield type. */
1835 bfd_vma signedp, bitsize, dummy;
1836 const bfd_byte *hold;
1837 bfd_boolean present;
1839 if (! ieee_read_number (info, pp, &signedp)
1840 || ! ieee_read_number (info, pp, &bitsize))
1841 return FALSE;
1843 /* I think the documentation says that there is a type index,
1844 but some actual files do not have one. */
1845 hold = *pp;
1846 if (! ieee_read_optional_number (info, pp, &dummy, &present))
1847 return FALSE;
1848 if (! present)
1850 /* FIXME: This is just a guess. */
1851 type = debug_make_int_type (dhandle, 4,
1852 signedp ? FALSE : TRUE);
1854 else
1856 *pp = hold;
1857 if (! ieee_read_type_index (info, pp, &type))
1858 return FALSE;
1860 type_bitsize = bitsize;
1862 break;
1864 case 'n':
1865 /* Qualifier. */
1867 bfd_vma kind;
1868 debug_type t;
1870 if (! ieee_read_number (info, pp, &kind)
1871 || ! ieee_read_type_index (info, pp, &t))
1872 return FALSE;
1874 switch (kind)
1876 default:
1877 ieee_error (info, ty_start, _("unsupported qualifier"));
1878 return FALSE;
1880 case 1:
1881 type = debug_make_const_type (dhandle, t);
1882 break;
1884 case 2:
1885 type = debug_make_volatile_type (dhandle, t);
1886 break;
1889 break;
1891 case 's':
1892 /* Set. */
1894 bfd_vma size;
1895 debug_type etype;
1897 if (! ieee_read_number (info, pp, &size)
1898 || ! ieee_read_type_index (info, pp, &etype))
1899 return FALSE;
1901 /* FIXME: We ignore the size. */
1903 type = debug_make_set_type (dhandle, etype, FALSE);
1905 break;
1907 case 'x':
1908 /* Procedure with compiler dependencies. */
1910 struct ieee_var *pv;
1911 bfd_vma attr, frame_type, push_mask, nargs, level, father;
1912 debug_type rtype;
1913 debug_type *arg_types;
1914 bfd_boolean varargs;
1915 bfd_boolean present;
1917 /* FIXME: We ignore some of this information. */
1919 pv = info->vars.vars + varindx;
1921 if (! ieee_read_number (info, pp, &attr)
1922 || ! ieee_read_number (info, pp, &frame_type)
1923 || ! ieee_read_number (info, pp, &push_mask)
1924 || ! ieee_read_type_index (info, pp, &rtype)
1925 || ! ieee_read_number (info, pp, &nargs))
1926 return FALSE;
1927 if (nargs == (bfd_vma) -1)
1929 arg_types = NULL;
1930 varargs = FALSE;
1932 else
1934 unsigned int i;
1936 arg_types = ((debug_type *)
1937 xmalloc ((nargs + 1) * sizeof *arg_types));
1938 for (i = 0; i < nargs; i++)
1939 if (! ieee_read_type_index (info, pp, arg_types + i))
1940 return FALSE;
1942 /* If the last type is pointer to void, this is really a
1943 varargs function. */
1944 varargs = FALSE;
1945 if (nargs > 0)
1947 debug_type last;
1949 last = arg_types[nargs - 1];
1950 if (debug_get_type_kind (dhandle, last) == DEBUG_KIND_POINTER
1951 && (debug_get_type_kind (dhandle,
1952 debug_get_target_type (dhandle,
1953 last))
1954 == DEBUG_KIND_VOID))
1956 --nargs;
1957 varargs = TRUE;
1961 /* If there are any pointer arguments, turn them into
1962 indirect types in case we later need to convert them to
1963 reference types. */
1964 for (i = 0; i < nargs; i++)
1966 if (debug_get_type_kind (dhandle, arg_types[i])
1967 == DEBUG_KIND_POINTER)
1969 if (arg_slots == NULL)
1971 arg_slots = ((debug_type *)
1972 xmalloc (nargs * sizeof *arg_slots));
1973 memset (arg_slots, 0, nargs * sizeof *arg_slots);
1975 arg_slots[i] = arg_types[i];
1976 arg_types[i] =
1977 debug_make_indirect_type (dhandle,
1978 arg_slots + i,
1979 (const char *) NULL);
1983 arg_types[nargs] = DEBUG_TYPE_NULL;
1985 if (! ieee_read_number (info, pp, &level)
1986 || ! ieee_read_optional_number (info, pp, &father, &present))
1987 return FALSE;
1989 /* We can't distinguish between a global function and a static
1990 function. */
1991 pv->kind = IEEE_FUNCTION;
1993 if (pv->namlen > 0
1994 && debug_get_type_kind (dhandle, rtype) == DEBUG_KIND_POINTER)
1996 /* Set up the return type as an indirect type pointing to
1997 the variable slot, so that we can change it to a
1998 reference later if appropriate. */
1999 pv->pslot = (debug_type *) xmalloc (sizeof *pv->pslot);
2000 *pv->pslot = rtype;
2001 rtype = debug_make_indirect_type (dhandle, pv->pslot,
2002 (const char *) NULL);
2005 type = debug_make_function_type (dhandle, rtype, arg_types, varargs);
2007 break;
2010 /* Record the type in the table. */
2012 if (type == DEBUG_TYPE_NULL)
2013 return FALSE;
2015 info->vars.vars[varindx].type = type;
2017 if ((tag || typdef)
2018 && info->vars.vars[varindx].namlen > 0)
2020 const char *name;
2022 name = savestring (info->vars.vars[varindx].name,
2023 info->vars.vars[varindx].namlen);
2024 if (typdef)
2025 type = debug_name_type (dhandle, name, type);
2026 else if (tc == 'E' || tc == 'N')
2027 type = debug_tag_type (dhandle, name, type);
2028 else
2030 struct ieee_tag *it;
2032 /* We must allocate all struct tags as indirect types, so
2033 that if we later see a definition of the tag as a C++
2034 record we can update the indirect slot and automatically
2035 change all the existing references. */
2036 it = (struct ieee_tag *) xmalloc (sizeof *it);
2037 memset (it, 0, sizeof *it);
2038 it->next = info->tags;
2039 info->tags = it;
2040 it->name = name;
2041 it->slot = type;
2043 type = debug_make_indirect_type (dhandle, &it->slot, name);
2044 type = debug_tag_type (dhandle, name, type);
2046 it->type = type;
2048 if (type == NULL)
2049 return FALSE;
2052 info->types.types[typeindx].type = type;
2053 info->types.types[typeindx].arg_slots = arg_slots;
2054 info->types.types[typeindx].bitsize = type_bitsize;
2056 /* We may have already allocated type as an indirect type pointing
2057 to slot. It does no harm to replace the indirect type with the
2058 real type. Filling in slot as well handles the indirect types
2059 which are already hanging around. */
2060 if (info->types.types[typeindx].pslot != NULL)
2061 *info->types.types[typeindx].pslot = type;
2063 return TRUE;
2066 /* Parse an ATN record. */
2068 static bfd_boolean
2069 parse_ieee_atn (struct ieee_info *info, const bfd_byte **pp)
2071 const bfd_byte *atn_start, *atn_code_start;
2072 bfd_vma varindx;
2073 struct ieee_var *pvar;
2074 debug_type type;
2075 bfd_vma atn_code;
2076 void *dhandle;
2077 bfd_vma v, v2, v3, v4, v5;
2078 const char *name;
2079 unsigned long namlen;
2080 char *namcopy;
2081 bfd_boolean present;
2082 int blocktype;
2084 atn_start = *pp;
2086 if (! ieee_read_number (info, pp, &varindx)
2087 || ! ieee_read_type_index (info, pp, &type))
2088 return FALSE;
2090 atn_code_start = *pp;
2092 if (! ieee_read_number (info, pp, &atn_code))
2093 return FALSE;
2095 if (varindx == 0)
2097 pvar = NULL;
2098 name = "";
2099 namlen = 0;
2101 else if (varindx < 32)
2103 /* The MRI compiler reportedly sometimes emits variable lifetime
2104 information for a register. We just ignore it. */
2105 if (atn_code == 9)
2106 return ieee_read_number (info, pp, &v);
2108 ieee_error (info, atn_start, _("illegal variable index"));
2109 return FALSE;
2111 else
2113 varindx -= 32;
2114 if (varindx >= info->vars.alloc
2115 || info->vars.vars[varindx].name == NULL)
2117 /* The MRI compiler or linker sometimes omits the NN record
2118 for a pmisc record. */
2119 if (atn_code == 62)
2121 if (varindx >= info->vars.alloc)
2123 unsigned int alloc;
2125 alloc = info->vars.alloc;
2126 if (alloc == 0)
2127 alloc = 4;
2128 while (varindx >= alloc)
2129 alloc *= 2;
2130 info->vars.vars = ((struct ieee_var *)
2131 xrealloc (info->vars.vars,
2132 (alloc
2133 * sizeof *info->vars.vars)));
2134 memset (info->vars.vars + info->vars.alloc, 0,
2135 ((alloc - info->vars.alloc)
2136 * sizeof *info->vars.vars));
2137 info->vars.alloc = alloc;
2140 pvar = info->vars.vars + varindx;
2141 pvar->name = "";
2142 pvar->namlen = 0;
2144 else
2146 ieee_error (info, atn_start, _("undefined variable in ATN"));
2147 return FALSE;
2151 pvar = info->vars.vars + varindx;
2153 pvar->type = type;
2155 name = pvar->name;
2156 namlen = pvar->namlen;
2159 dhandle = info->dhandle;
2161 /* If we are going to call debug_record_variable with a pointer
2162 type, change the type to an indirect type so that we can later
2163 change it to a reference type if we encounter a C++ pmisc 'R'
2164 record. */
2165 if (pvar != NULL
2166 && type != DEBUG_TYPE_NULL
2167 && debug_get_type_kind (dhandle, type) == DEBUG_KIND_POINTER)
2169 switch (atn_code)
2171 case 1:
2172 case 2:
2173 case 3:
2174 case 5:
2175 case 8:
2176 case 10:
2177 pvar->pslot = (debug_type *) xmalloc (sizeof *pvar->pslot);
2178 *pvar->pslot = type;
2179 type = debug_make_indirect_type (dhandle, pvar->pslot,
2180 (const char *) NULL);
2181 pvar->type = type;
2182 break;
2186 switch (atn_code)
2188 default:
2189 ieee_error (info, atn_code_start, _("unknown ATN type"));
2190 return FALSE;
2192 case 1:
2193 /* Automatic variable. */
2194 if (! ieee_read_number (info, pp, &v))
2195 return FALSE;
2196 namcopy = savestring (name, namlen);
2197 if (type == NULL)
2198 type = debug_make_void_type (dhandle);
2199 if (pvar != NULL)
2200 pvar->kind = IEEE_LOCAL;
2201 return debug_record_variable (dhandle, namcopy, type, DEBUG_LOCAL, v);
2203 case 2:
2204 /* Register variable. */
2205 if (! ieee_read_number (info, pp, &v))
2206 return FALSE;
2207 namcopy = savestring (name, namlen);
2208 if (type == NULL)
2209 type = debug_make_void_type (dhandle);
2210 if (pvar != NULL)
2211 pvar->kind = IEEE_LOCAL;
2212 return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER,
2213 ieee_regno_to_genreg (info->abfd, v));
2215 case 3:
2216 /* Static variable. */
2217 if (! ieee_require_asn (info, pp, &v))
2218 return FALSE;
2219 namcopy = savestring (name, namlen);
2220 if (type == NULL)
2221 type = debug_make_void_type (dhandle);
2222 if (info->blockstack.bsp <= info->blockstack.stack)
2223 blocktype = 0;
2224 else
2225 blocktype = info->blockstack.bsp[-1].kind;
2226 if (pvar != NULL)
2228 if (blocktype == 4 || blocktype == 6)
2229 pvar->kind = IEEE_LOCAL;
2230 else
2231 pvar->kind = IEEE_STATIC;
2233 return debug_record_variable (dhandle, namcopy, type,
2234 (blocktype == 4 || blocktype == 6
2235 ? DEBUG_LOCAL_STATIC
2236 : DEBUG_STATIC),
2239 case 4:
2240 /* External function. We don't currently record these. FIXME. */
2241 if (pvar != NULL)
2242 pvar->kind = IEEE_EXTERNAL;
2243 return TRUE;
2245 case 5:
2246 /* External variable. We don't currently record these. FIXME. */
2247 if (pvar != NULL)
2248 pvar->kind = IEEE_EXTERNAL;
2249 return TRUE;
2251 case 7:
2252 if (! ieee_read_number (info, pp, &v)
2253 || ! ieee_read_number (info, pp, &v2)
2254 || ! ieee_read_optional_number (info, pp, &v3, &present))
2255 return FALSE;
2256 if (present)
2258 if (! ieee_read_optional_number (info, pp, &v4, &present))
2259 return FALSE;
2262 /* We just ignore the two optional fields in v3 and v4, since
2263 they are not defined. */
2265 if (! ieee_require_asn (info, pp, &v3))
2266 return FALSE;
2268 /* We have no way to record the column number. FIXME. */
2270 return debug_record_line (dhandle, v, v3);
2272 case 8:
2273 /* Global variable. */
2274 if (! ieee_require_asn (info, pp, &v))
2275 return FALSE;
2276 namcopy = savestring (name, namlen);
2277 if (type == NULL)
2278 type = debug_make_void_type (dhandle);
2279 if (pvar != NULL)
2280 pvar->kind = IEEE_GLOBAL;
2281 return debug_record_variable (dhandle, namcopy, type, DEBUG_GLOBAL, v);
2283 case 9:
2284 /* Variable lifetime information. */
2285 if (! ieee_read_number (info, pp, &v))
2286 return FALSE;
2288 /* We have no way to record this information. FIXME. */
2289 return TRUE;
2291 case 10:
2292 /* Locked register. The spec says that there are two required
2293 fields, but at least on occasion the MRI compiler only emits
2294 one. */
2295 if (! ieee_read_number (info, pp, &v)
2296 || ! ieee_read_optional_number (info, pp, &v2, &present))
2297 return FALSE;
2299 /* I think this means a variable that is both in a register and
2300 a frame slot. We ignore the frame slot. FIXME. */
2302 namcopy = savestring (name, namlen);
2303 if (type == NULL)
2304 type = debug_make_void_type (dhandle);
2305 if (pvar != NULL)
2306 pvar->kind = IEEE_LOCAL;
2307 return debug_record_variable (dhandle, namcopy, type, DEBUG_REGISTER, v);
2309 case 11:
2310 /* Reserved for FORTRAN common. */
2311 ieee_error (info, atn_code_start, _("unsupported ATN11"));
2313 /* Return TRUE to keep going. */
2314 return TRUE;
2316 case 12:
2317 /* Based variable. */
2318 v3 = 0;
2319 v4 = 0x80;
2320 v5 = 0;
2321 if (! ieee_read_number (info, pp, &v)
2322 || ! ieee_read_number (info, pp, &v2)
2323 || ! ieee_read_optional_number (info, pp, &v3, &present))
2324 return FALSE;
2325 if (present)
2327 if (! ieee_read_optional_number (info, pp, &v4, &present))
2328 return FALSE;
2329 if (present)
2331 if (! ieee_read_optional_number (info, pp, &v5, &present))
2332 return FALSE;
2336 /* We have no way to record this information. FIXME. */
2338 ieee_error (info, atn_code_start, _("unsupported ATN12"));
2340 /* Return TRUE to keep going. */
2341 return TRUE;
2343 case 16:
2344 /* Constant. The description of this that I have is ambiguous,
2345 so I'm not going to try to implement it. */
2346 if (! ieee_read_number (info, pp, &v)
2347 || ! ieee_read_optional_number (info, pp, &v2, &present))
2348 return FALSE;
2349 if (present)
2351 if (! ieee_read_optional_number (info, pp, &v2, &present))
2352 return FALSE;
2353 if (present)
2355 if (! ieee_read_optional_id (info, pp, &name, &namlen, &present))
2356 return FALSE;
2360 if ((ieee_record_enum_type) **pp == ieee_e2_first_byte_enum)
2362 if (! ieee_require_asn (info, pp, &v3))
2363 return FALSE;
2366 return TRUE;
2368 case 19:
2369 /* Static variable from assembler. */
2370 v2 = 0;
2371 if (! ieee_read_number (info, pp, &v)
2372 || ! ieee_read_optional_number (info, pp, &v2, &present)
2373 || ! ieee_require_asn (info, pp, &v3))
2374 return FALSE;
2375 namcopy = savestring (name, namlen);
2376 /* We don't really handle this correctly. FIXME. */
2377 return debug_record_variable (dhandle, namcopy,
2378 debug_make_void_type (dhandle),
2379 v2 != 0 ? DEBUG_GLOBAL : DEBUG_STATIC,
2380 v3);
2382 case 62:
2383 /* Procedure miscellaneous information. */
2384 case 63:
2385 /* Variable miscellaneous information. */
2386 case 64:
2387 /* Module miscellaneous information. */
2388 if (! ieee_read_number (info, pp, &v)
2389 || ! ieee_read_number (info, pp, &v2)
2390 || ! ieee_read_optional_id (info, pp, &name, &namlen, &present))
2391 return FALSE;
2393 if (atn_code == 62 && v == 80)
2395 if (present)
2397 ieee_error (info, atn_code_start,
2398 _("unexpected string in C++ misc"));
2399 return FALSE;
2401 return ieee_read_cxx_misc (info, pp, v2);
2404 /* We just ignore all of this stuff. FIXME. */
2406 for (; v2 > 0; --v2)
2408 switch ((ieee_record_enum_type) **pp)
2410 default:
2411 ieee_error (info, *pp, _("bad misc record"));
2412 return FALSE;
2414 case ieee_at_record_enum:
2415 if (! ieee_require_atn65 (info, pp, &name, &namlen))
2416 return FALSE;
2417 break;
2419 case ieee_e2_first_byte_enum:
2420 if (! ieee_require_asn (info, pp, &v3))
2421 return FALSE;
2422 break;
2426 return TRUE;
2429 /*NOTREACHED*/
2432 /* Handle C++ debugging miscellaneous records. This is called for
2433 procedure miscellaneous records of type 80. */
2435 static bfd_boolean
2436 ieee_read_cxx_misc (struct ieee_info *info, const bfd_byte **pp,
2437 unsigned long count)
2439 const bfd_byte *start;
2440 bfd_vma category;
2442 start = *pp;
2444 /* Get the category of C++ misc record. */
2445 if (! ieee_require_asn (info, pp, &category))
2446 return FALSE;
2447 --count;
2449 switch (category)
2451 default:
2452 ieee_error (info, start, _("unrecognized C++ misc record"));
2453 return FALSE;
2455 case 'T':
2456 if (! ieee_read_cxx_class (info, pp, count))
2457 return FALSE;
2458 break;
2460 case 'M':
2462 bfd_vma flags;
2463 const char *name;
2464 unsigned long namlen;
2466 /* The IEEE spec indicates that the 'M' record only has a
2467 flags field. The MRI compiler also emits the name of the
2468 function. */
2470 if (! ieee_require_asn (info, pp, &flags))
2471 return FALSE;
2472 if (*pp < info->pend
2473 && (ieee_record_enum_type) **pp == ieee_at_record_enum)
2475 if (! ieee_require_atn65 (info, pp, &name, &namlen))
2476 return FALSE;
2479 /* This is emitted for method functions, but I don't think we
2480 care very much. It might help if it told us useful
2481 information like the class with which this function is
2482 associated, but it doesn't, so it isn't helpful. */
2484 break;
2486 case 'B':
2487 if (! ieee_read_cxx_defaults (info, pp, count))
2488 return FALSE;
2489 break;
2491 case 'z':
2493 const char *name, *mangled, *class;
2494 unsigned long namlen, mangledlen, classlen;
2495 bfd_vma control;
2497 /* Pointer to member. */
2499 if (! ieee_require_atn65 (info, pp, &name, &namlen)
2500 || ! ieee_require_atn65 (info, pp, &mangled, &mangledlen)
2501 || ! ieee_require_atn65 (info, pp, &class, &classlen)
2502 || ! ieee_require_asn (info, pp, &control))
2503 return FALSE;
2505 /* FIXME: We should now track down name and change its type. */
2507 break;
2509 case 'R':
2510 if (! ieee_read_reference (info, pp))
2511 return FALSE;
2512 break;
2515 return TRUE;
2518 /* Read a C++ class definition. This is a pmisc type 80 record of
2519 category 'T'. */
2521 static bfd_boolean
2522 ieee_read_cxx_class (struct ieee_info *info, const bfd_byte **pp,
2523 unsigned long count)
2525 const bfd_byte *start;
2526 bfd_vma class;
2527 const char *tag;
2528 unsigned long taglen;
2529 struct ieee_tag *it;
2530 void *dhandle;
2531 debug_field *fields;
2532 unsigned int field_count, field_alloc;
2533 debug_baseclass *baseclasses;
2534 unsigned int baseclasses_count, baseclasses_alloc;
2535 const debug_field *structfields;
2536 struct ieee_method
2538 const char *name;
2539 unsigned long namlen;
2540 debug_method_variant *variants;
2541 unsigned count;
2542 unsigned int alloc;
2543 } *methods;
2544 unsigned int methods_count, methods_alloc;
2545 debug_type vptrbase;
2546 bfd_boolean ownvptr;
2547 debug_method *dmethods;
2549 start = *pp;
2551 if (! ieee_require_asn (info, pp, &class))
2552 return FALSE;
2553 --count;
2555 if (! ieee_require_atn65 (info, pp, &tag, &taglen))
2556 return FALSE;
2557 --count;
2559 /* Find the C struct with this name. */
2560 for (it = info->tags; it != NULL; it = it->next)
2561 if (it->name[0] == tag[0]
2562 && strncmp (it->name, tag, taglen) == 0
2563 && strlen (it->name) == taglen)
2564 break;
2565 if (it == NULL)
2567 ieee_error (info, start, _("undefined C++ object"));
2568 return FALSE;
2571 dhandle = info->dhandle;
2573 fields = NULL;
2574 field_count = 0;
2575 field_alloc = 0;
2576 baseclasses = NULL;
2577 baseclasses_count = 0;
2578 baseclasses_alloc = 0;
2579 methods = NULL;
2580 methods_count = 0;
2581 methods_alloc = 0;
2582 vptrbase = DEBUG_TYPE_NULL;
2583 ownvptr = FALSE;
2585 structfields = debug_get_fields (dhandle, it->type);
2587 while (count > 0)
2589 bfd_vma id;
2590 const bfd_byte *spec_start;
2592 spec_start = *pp;
2594 if (! ieee_require_asn (info, pp, &id))
2595 return FALSE;
2596 --count;
2598 switch (id)
2600 default:
2601 ieee_error (info, spec_start, _("unrecognized C++ object spec"));
2602 return FALSE;
2604 case 'b':
2606 bfd_vma flags, cinline;
2607 const char *basename, *fieldname;
2608 unsigned long baselen, fieldlen;
2609 char *basecopy;
2610 debug_type basetype;
2611 bfd_vma bitpos;
2612 bfd_boolean virtualp;
2613 enum debug_visibility visibility;
2614 debug_baseclass baseclass;
2616 /* This represents a base or friend class. */
2618 if (! ieee_require_asn (info, pp, &flags)
2619 || ! ieee_require_atn65 (info, pp, &basename, &baselen)
2620 || ! ieee_require_asn (info, pp, &cinline)
2621 || ! ieee_require_atn65 (info, pp, &fieldname, &fieldlen))
2622 return FALSE;
2623 count -= 4;
2625 /* We have no way of recording friend information, so we
2626 just ignore it. */
2627 if ((flags & BASEFLAGS_FRIEND) != 0)
2628 break;
2630 /* I assume that either all of the members of the
2631 baseclass are included in the object, starting at the
2632 beginning of the object, or that none of them are
2633 included. */
2635 if ((fieldlen == 0) == (cinline == 0))
2637 ieee_error (info, start, _("unsupported C++ object type"));
2638 return FALSE;
2641 basecopy = savestring (basename, baselen);
2642 basetype = debug_find_tagged_type (dhandle, basecopy,
2643 DEBUG_KIND_ILLEGAL);
2644 free (basecopy);
2645 if (basetype == DEBUG_TYPE_NULL)
2647 ieee_error (info, start, _("C++ base class not defined"));
2648 return FALSE;
2651 if (fieldlen == 0)
2652 bitpos = 0;
2653 else
2655 const debug_field *pf;
2657 if (structfields == NULL)
2659 ieee_error (info, start, _("C++ object has no fields"));
2660 return FALSE;
2663 for (pf = structfields; *pf != DEBUG_FIELD_NULL; pf++)
2665 const char *fname;
2667 fname = debug_get_field_name (dhandle, *pf);
2668 if (fname == NULL)
2669 return FALSE;
2670 if (fname[0] == fieldname[0]
2671 && strncmp (fname, fieldname, fieldlen) == 0
2672 && strlen (fname) == fieldlen)
2673 break;
2675 if (*pf == DEBUG_FIELD_NULL)
2677 ieee_error (info, start,
2678 _("C++ base class not found in container"));
2679 return FALSE;
2682 bitpos = debug_get_field_bitpos (dhandle, *pf);
2685 if ((flags & BASEFLAGS_VIRTUAL) != 0)
2686 virtualp = TRUE;
2687 else
2688 virtualp = FALSE;
2689 if ((flags & BASEFLAGS_PRIVATE) != 0)
2690 visibility = DEBUG_VISIBILITY_PRIVATE;
2691 else
2692 visibility = DEBUG_VISIBILITY_PUBLIC;
2694 baseclass = debug_make_baseclass (dhandle, basetype, bitpos,
2695 virtualp, visibility);
2696 if (baseclass == DEBUG_BASECLASS_NULL)
2697 return FALSE;
2699 if (baseclasses_count + 1 >= baseclasses_alloc)
2701 baseclasses_alloc += 10;
2702 baseclasses = ((debug_baseclass *)
2703 xrealloc (baseclasses,
2704 (baseclasses_alloc
2705 * sizeof *baseclasses)));
2708 baseclasses[baseclasses_count] = baseclass;
2709 ++baseclasses_count;
2710 baseclasses[baseclasses_count] = DEBUG_BASECLASS_NULL;
2712 break;
2714 case 'd':
2716 bfd_vma flags;
2717 const char *fieldname, *mangledname;
2718 unsigned long fieldlen, mangledlen;
2719 char *fieldcopy;
2720 bfd_boolean staticp;
2721 debug_type ftype;
2722 const debug_field *pf = NULL;
2723 enum debug_visibility visibility;
2724 debug_field field;
2726 /* This represents a data member. */
2728 if (! ieee_require_asn (info, pp, &flags)
2729 || ! ieee_require_atn65 (info, pp, &fieldname, &fieldlen)
2730 || ! ieee_require_atn65 (info, pp, &mangledname, &mangledlen))
2731 return FALSE;
2732 count -= 3;
2734 fieldcopy = savestring (fieldname, fieldlen);
2736 staticp = (flags & CXXFLAGS_STATIC) != 0 ? TRUE : FALSE;
2738 if (staticp)
2740 struct ieee_var *pv, *pvend;
2742 /* See if we can find a definition for this variable. */
2743 pv = info->vars.vars;
2744 pvend = pv + info->vars.alloc;
2745 for (; pv < pvend; pv++)
2746 if (pv->namlen == mangledlen
2747 && strncmp (pv->name, mangledname, mangledlen) == 0)
2748 break;
2749 if (pv < pvend)
2750 ftype = pv->type;
2751 else
2753 /* This can happen if the variable is never used. */
2754 ftype = ieee_builtin_type (info, start,
2755 (unsigned int) builtin_void);
2758 else
2760 unsigned int findx;
2762 if (structfields == NULL)
2764 ieee_error (info, start, _("C++ object has no fields"));
2765 return FALSE;
2768 for (pf = structfields, findx = 0;
2769 *pf != DEBUG_FIELD_NULL;
2770 pf++, findx++)
2772 const char *fname;
2774 fname = debug_get_field_name (dhandle, *pf);
2775 if (fname == NULL)
2776 return FALSE;
2777 if (fname[0] == mangledname[0]
2778 && strncmp (fname, mangledname, mangledlen) == 0
2779 && strlen (fname) == mangledlen)
2780 break;
2782 if (*pf == DEBUG_FIELD_NULL)
2784 ieee_error (info, start,
2785 _("C++ data member not found in container"));
2786 return FALSE;
2789 ftype = debug_get_field_type (dhandle, *pf);
2791 if (debug_get_type_kind (dhandle, ftype) == DEBUG_KIND_POINTER)
2793 /* We might need to convert this field into a
2794 reference type later on, so make it an indirect
2795 type. */
2796 if (it->fslots == NULL)
2798 unsigned int fcnt;
2799 const debug_field *pfcnt;
2801 fcnt = 0;
2802 for (pfcnt = structfields;
2803 *pfcnt != DEBUG_FIELD_NULL;
2804 pfcnt++)
2805 ++fcnt;
2806 it->fslots = ((debug_type *)
2807 xmalloc (fcnt * sizeof *it->fslots));
2808 memset (it->fslots, 0,
2809 fcnt * sizeof *it->fslots);
2812 if (ftype == DEBUG_TYPE_NULL)
2813 return FALSE;
2814 it->fslots[findx] = ftype;
2815 ftype = debug_make_indirect_type (dhandle,
2816 it->fslots + findx,
2817 (const char *) NULL);
2820 if (ftype == DEBUG_TYPE_NULL)
2821 return FALSE;
2823 switch (flags & CXXFLAGS_VISIBILITY)
2825 default:
2826 ieee_error (info, start, _("unknown C++ visibility"));
2827 return FALSE;
2829 case CXXFLAGS_VISIBILITY_PUBLIC:
2830 visibility = DEBUG_VISIBILITY_PUBLIC;
2831 break;
2833 case CXXFLAGS_VISIBILITY_PRIVATE:
2834 visibility = DEBUG_VISIBILITY_PRIVATE;
2835 break;
2837 case CXXFLAGS_VISIBILITY_PROTECTED:
2838 visibility = DEBUG_VISIBILITY_PROTECTED;
2839 break;
2842 if (staticp)
2844 char *mangledcopy;
2846 mangledcopy = savestring (mangledname, mangledlen);
2848 field = debug_make_static_member (dhandle, fieldcopy,
2849 ftype, mangledcopy,
2850 visibility);
2852 else
2854 bfd_vma bitpos, bitsize;
2856 bitpos = debug_get_field_bitpos (dhandle, *pf);
2857 bitsize = debug_get_field_bitsize (dhandle, *pf);
2858 if (bitpos == (bfd_vma) -1 || bitsize == (bfd_vma) -1)
2860 ieee_error (info, start, _("bad C++ field bit pos or size"));
2861 return FALSE;
2863 field = debug_make_field (dhandle, fieldcopy, ftype, bitpos,
2864 bitsize, visibility);
2867 if (field == DEBUG_FIELD_NULL)
2868 return FALSE;
2870 if (field_count + 1 >= field_alloc)
2872 field_alloc += 10;
2873 fields = ((debug_field *)
2874 xrealloc (fields, field_alloc * sizeof *fields));
2877 fields[field_count] = field;
2878 ++field_count;
2879 fields[field_count] = DEBUG_FIELD_NULL;
2881 break;
2883 case 'm':
2884 case 'v':
2886 bfd_vma flags, voffset, control;
2887 const char *name, *mangled;
2888 unsigned long namlen, mangledlen;
2889 struct ieee_var *pv, *pvend;
2890 debug_type type;
2891 enum debug_visibility visibility;
2892 bfd_boolean constp, volatilep;
2893 char *mangledcopy;
2894 debug_method_variant mv;
2895 struct ieee_method *meth;
2896 unsigned int im;
2898 if (! ieee_require_asn (info, pp, &flags)
2899 || ! ieee_require_atn65 (info, pp, &name, &namlen)
2900 || ! ieee_require_atn65 (info, pp, &mangled, &mangledlen))
2901 return FALSE;
2902 count -= 3;
2903 if (id != 'v')
2904 voffset = 0;
2905 else
2907 if (! ieee_require_asn (info, pp, &voffset))
2908 return FALSE;
2909 --count;
2911 if (! ieee_require_asn (info, pp, &control))
2912 return FALSE;
2913 --count;
2915 /* We just ignore the control information. */
2917 /* We have no way to represent friend information, so we
2918 just ignore it. */
2919 if ((flags & CXXFLAGS_FRIEND) != 0)
2920 break;
2922 /* We should already have seen a type for the function. */
2923 pv = info->vars.vars;
2924 pvend = pv + info->vars.alloc;
2925 for (; pv < pvend; pv++)
2926 if (pv->namlen == mangledlen
2927 && strncmp (pv->name, mangled, mangledlen) == 0)
2928 break;
2930 if (pv >= pvend)
2932 /* We won't have type information for this function if
2933 it is not included in this file. We don't try to
2934 handle this case. FIXME. */
2935 type = (debug_make_function_type
2936 (dhandle,
2937 ieee_builtin_type (info, start,
2938 (unsigned int) builtin_void),
2939 (debug_type *) NULL,
2940 FALSE));
2942 else
2944 debug_type return_type;
2945 const debug_type *arg_types;
2946 bfd_boolean varargs;
2948 if (debug_get_type_kind (dhandle, pv->type)
2949 != DEBUG_KIND_FUNCTION)
2951 ieee_error (info, start,
2952 _("bad type for C++ method function"));
2953 return FALSE;
2956 return_type = debug_get_return_type (dhandle, pv->type);
2957 arg_types = debug_get_parameter_types (dhandle, pv->type,
2958 &varargs);
2959 if (return_type == DEBUG_TYPE_NULL || arg_types == NULL)
2961 ieee_error (info, start,
2962 _("no type information for C++ method function"));
2963 return FALSE;
2966 type = debug_make_method_type (dhandle, return_type, it->type,
2967 (debug_type *) arg_types,
2968 varargs);
2970 if (type == DEBUG_TYPE_NULL)
2971 return FALSE;
2973 switch (flags & CXXFLAGS_VISIBILITY)
2975 default:
2976 ieee_error (info, start, _("unknown C++ visibility"));
2977 return FALSE;
2979 case CXXFLAGS_VISIBILITY_PUBLIC:
2980 visibility = DEBUG_VISIBILITY_PUBLIC;
2981 break;
2983 case CXXFLAGS_VISIBILITY_PRIVATE:
2984 visibility = DEBUG_VISIBILITY_PRIVATE;
2985 break;
2987 case CXXFLAGS_VISIBILITY_PROTECTED:
2988 visibility = DEBUG_VISIBILITY_PROTECTED;
2989 break;
2992 constp = (flags & CXXFLAGS_CONST) != 0 ? TRUE : FALSE;
2993 volatilep = (flags & CXXFLAGS_VOLATILE) != 0 ? TRUE : FALSE;
2995 mangledcopy = savestring (mangled, mangledlen);
2997 if ((flags & CXXFLAGS_STATIC) != 0)
2999 if (id == 'v')
3001 ieee_error (info, start, _("C++ static virtual method"));
3002 return FALSE;
3004 mv = debug_make_static_method_variant (dhandle, mangledcopy,
3005 type, visibility,
3006 constp, volatilep);
3008 else
3010 debug_type vcontext;
3012 if (id != 'v')
3013 vcontext = DEBUG_TYPE_NULL;
3014 else
3016 /* FIXME: How can we calculate this correctly? */
3017 vcontext = it->type;
3019 mv = debug_make_method_variant (dhandle, mangledcopy, type,
3020 visibility, constp,
3021 volatilep, voffset,
3022 vcontext);
3024 if (mv == DEBUG_METHOD_VARIANT_NULL)
3025 return FALSE;
3027 for (meth = methods, im = 0; im < methods_count; meth++, im++)
3028 if (meth->namlen == namlen
3029 && strncmp (meth->name, name, namlen) == 0)
3030 break;
3031 if (im >= methods_count)
3033 if (methods_count >= methods_alloc)
3035 methods_alloc += 10;
3036 methods = ((struct ieee_method *)
3037 xrealloc (methods,
3038 methods_alloc * sizeof *methods));
3040 methods[methods_count].name = name;
3041 methods[methods_count].namlen = namlen;
3042 methods[methods_count].variants = NULL;
3043 methods[methods_count].count = 0;
3044 methods[methods_count].alloc = 0;
3045 meth = methods + methods_count;
3046 ++methods_count;
3049 if (meth->count + 1 >= meth->alloc)
3051 meth->alloc += 10;
3052 meth->variants = ((debug_method_variant *)
3053 xrealloc (meth->variants,
3054 (meth->alloc
3055 * sizeof *meth->variants)));
3058 meth->variants[meth->count] = mv;
3059 ++meth->count;
3060 meth->variants[meth->count] = DEBUG_METHOD_VARIANT_NULL;
3062 break;
3064 case 'o':
3066 bfd_vma spec;
3068 /* We have no way to store this information, so we just
3069 ignore it. */
3070 if (! ieee_require_asn (info, pp, &spec))
3071 return FALSE;
3072 --count;
3073 if ((spec & 4) != 0)
3075 const char *filename;
3076 unsigned long filenamlen;
3077 bfd_vma lineno;
3079 if (! ieee_require_atn65 (info, pp, &filename, &filenamlen)
3080 || ! ieee_require_asn (info, pp, &lineno))
3081 return FALSE;
3082 count -= 2;
3084 else if ((spec & 8) != 0)
3086 const char *mangled;
3087 unsigned long mangledlen;
3089 if (! ieee_require_atn65 (info, pp, &mangled, &mangledlen))
3090 return FALSE;
3091 --count;
3093 else
3095 ieee_error (info, start,
3096 _("unrecognized C++ object overhead spec"));
3097 return FALSE;
3100 break;
3102 case 'z':
3104 const char *vname, *basename;
3105 unsigned long vnamelen, baselen;
3106 bfd_vma vsize, control;
3108 /* A virtual table pointer. */
3110 if (! ieee_require_atn65 (info, pp, &vname, &vnamelen)
3111 || ! ieee_require_asn (info, pp, &vsize)
3112 || ! ieee_require_atn65 (info, pp, &basename, &baselen)
3113 || ! ieee_require_asn (info, pp, &control))
3114 return FALSE;
3115 count -= 4;
3117 /* We just ignore the control number. We don't care what
3118 the virtual table name is. We have no way to store the
3119 virtual table size, and I don't think we care anyhow. */
3121 /* FIXME: We can't handle multiple virtual table pointers. */
3123 if (baselen == 0)
3124 ownvptr = TRUE;
3125 else
3127 char *basecopy;
3129 basecopy = savestring (basename, baselen);
3130 vptrbase = debug_find_tagged_type (dhandle, basecopy,
3131 DEBUG_KIND_ILLEGAL);
3132 free (basecopy);
3133 if (vptrbase == DEBUG_TYPE_NULL)
3135 ieee_error (info, start, _("undefined C++ vtable"));
3136 return FALSE;
3140 break;
3144 /* Now that we have seen all the method variants, we can call
3145 debug_make_method for each one. */
3147 if (methods_count == 0)
3148 dmethods = NULL;
3149 else
3151 unsigned int i;
3153 dmethods = ((debug_method *)
3154 xmalloc ((methods_count + 1) * sizeof *dmethods));
3155 for (i = 0; i < methods_count; i++)
3157 char *namcopy;
3159 namcopy = savestring (methods[i].name, methods[i].namlen);
3160 dmethods[i] = debug_make_method (dhandle, namcopy,
3161 methods[i].variants);
3162 if (dmethods[i] == DEBUG_METHOD_NULL)
3163 return FALSE;
3165 dmethods[i] = DEBUG_METHOD_NULL;
3166 free (methods);
3169 /* The struct type was created as an indirect type pointing at
3170 it->slot. We update it->slot to automatically update all
3171 references to this struct. */
3172 it->slot = debug_make_object_type (dhandle,
3173 class != 'u',
3174 debug_get_type_size (dhandle,
3175 it->slot),
3176 fields, baseclasses, dmethods,
3177 vptrbase, ownvptr);
3178 if (it->slot == DEBUG_TYPE_NULL)
3179 return FALSE;
3181 return TRUE;
3184 /* Read C++ default argument value and reference type information. */
3186 static bfd_boolean
3187 ieee_read_cxx_defaults (struct ieee_info *info, const bfd_byte **pp,
3188 unsigned long count)
3190 const bfd_byte *start;
3191 const char *fnname;
3192 unsigned long fnlen;
3193 bfd_vma defcount;
3195 start = *pp;
3197 /* Giving the function name before the argument count is an addendum
3198 to the spec. The function name is demangled, though, so this
3199 record must always refer to the current function. */
3201 if (info->blockstack.bsp <= info->blockstack.stack
3202 || info->blockstack.bsp[-1].fnindx == (unsigned int) -1)
3204 ieee_error (info, start, _("C++ default values not in a function"));
3205 return FALSE;
3208 if (! ieee_require_atn65 (info, pp, &fnname, &fnlen)
3209 || ! ieee_require_asn (info, pp, &defcount))
3210 return FALSE;
3211 count -= 2;
3213 while (defcount-- > 0)
3215 bfd_vma type, val;
3216 const char *strval;
3217 unsigned long strvallen;
3219 if (! ieee_require_asn (info, pp, &type))
3220 return FALSE;
3221 --count;
3223 switch (type)
3225 case 0:
3226 case 4:
3227 break;
3229 case 1:
3230 case 2:
3231 if (! ieee_require_asn (info, pp, &val))
3232 return FALSE;
3233 --count;
3234 break;
3236 case 3:
3237 case 7:
3238 if (! ieee_require_atn65 (info, pp, &strval, &strvallen))
3239 return FALSE;
3240 --count;
3241 break;
3243 default:
3244 ieee_error (info, start, _("unrecognized C++ default type"));
3245 return FALSE;
3248 /* We have no way to record the default argument values, so we
3249 just ignore them. FIXME. */
3252 /* Any remaining arguments are indices of parameters that are really
3253 reference type. */
3254 if (count > 0)
3256 void *dhandle;
3257 debug_type *arg_slots;
3259 dhandle = info->dhandle;
3260 arg_slots = info->types.types[info->blockstack.bsp[-1].fnindx].arg_slots;
3261 while (count-- > 0)
3263 bfd_vma indx;
3264 debug_type target;
3266 if (! ieee_require_asn (info, pp, &indx))
3267 return FALSE;
3268 /* The index is 1 based. */
3269 --indx;
3270 if (arg_slots == NULL
3271 || arg_slots[indx] == DEBUG_TYPE_NULL
3272 || (debug_get_type_kind (dhandle, arg_slots[indx])
3273 != DEBUG_KIND_POINTER))
3275 ieee_error (info, start, _("reference parameter is not a pointer"));
3276 return FALSE;
3279 target = debug_get_target_type (dhandle, arg_slots[indx]);
3280 arg_slots[indx] = debug_make_reference_type (dhandle, target);
3281 if (arg_slots[indx] == DEBUG_TYPE_NULL)
3282 return FALSE;
3286 return TRUE;
3289 /* Read a C++ reference definition. */
3291 static bfd_boolean
3292 ieee_read_reference (struct ieee_info *info, const bfd_byte **pp)
3294 const bfd_byte *start;
3295 bfd_vma flags;
3296 const char *class, *name;
3297 unsigned long classlen, namlen;
3298 debug_type *pslot;
3299 debug_type target;
3301 start = *pp;
3303 if (! ieee_require_asn (info, pp, &flags))
3304 return FALSE;
3306 /* Giving the class name before the member name is in an addendum to
3307 the spec. */
3308 if (flags == 3)
3310 if (! ieee_require_atn65 (info, pp, &class, &classlen))
3311 return FALSE;
3314 if (! ieee_require_atn65 (info, pp, &name, &namlen))
3315 return FALSE;
3317 pslot = NULL;
3318 if (flags != 3)
3320 int pass;
3322 /* We search from the last variable indices to the first in
3323 hopes of finding local variables correctly. We search the
3324 local variables on the first pass, and the global variables
3325 on the second. FIXME: This probably won't work in all cases.
3326 On the other hand, I don't know what will. */
3327 for (pass = 0; pass < 2; pass++)
3329 struct ieee_vars *vars;
3330 int i;
3331 struct ieee_var *pv = NULL;
3333 if (pass == 0)
3334 vars = &info->vars;
3335 else
3337 vars = info->global_vars;
3338 if (vars == NULL)
3339 break;
3342 for (i = (int) vars->alloc - 1; i >= 0; i--)
3344 bfd_boolean found;
3346 pv = vars->vars + i;
3348 if (pv->pslot == NULL
3349 || pv->namlen != namlen
3350 || strncmp (pv->name, name, namlen) != 0)
3351 continue;
3353 found = FALSE;
3354 switch (flags)
3356 default:
3357 ieee_error (info, start,
3358 _("unrecognized C++ reference type"));
3359 return FALSE;
3361 case 0:
3362 /* Global variable or function. */
3363 if (pv->kind == IEEE_GLOBAL
3364 || pv->kind == IEEE_EXTERNAL
3365 || pv->kind == IEEE_FUNCTION)
3366 found = TRUE;
3367 break;
3369 case 1:
3370 /* Global static variable or function. */
3371 if (pv->kind == IEEE_STATIC
3372 || pv->kind == IEEE_FUNCTION)
3373 found = TRUE;
3374 break;
3376 case 2:
3377 /* Local variable. */
3378 if (pv->kind == IEEE_LOCAL)
3379 found = TRUE;
3380 break;
3383 if (found)
3384 break;
3387 if (i >= 0)
3389 pslot = pv->pslot;
3390 break;
3394 else
3396 struct ieee_tag *it;
3398 for (it = info->tags; it != NULL; it = it->next)
3400 if (it->name[0] == class[0]
3401 && strncmp (it->name, class, classlen) == 0
3402 && strlen (it->name) == classlen)
3404 if (it->fslots != NULL)
3406 const debug_field *pf;
3407 unsigned int findx;
3409 pf = debug_get_fields (info->dhandle, it->type);
3410 if (pf == NULL)
3412 ieee_error (info, start,
3413 "C++ reference in class with no fields");
3414 return FALSE;
3417 for (findx = 0; *pf != DEBUG_FIELD_NULL; pf++, findx++)
3419 const char *fname;
3421 fname = debug_get_field_name (info->dhandle, *pf);
3422 if (fname == NULL)
3423 return FALSE;
3424 if (strncmp (fname, name, namlen) == 0
3425 && strlen (fname) == namlen)
3427 pslot = it->fslots + findx;
3428 break;
3433 break;
3438 if (pslot == NULL)
3440 ieee_error (info, start, _("C++ reference not found"));
3441 return FALSE;
3444 /* We allocated the type of the object as an indirect type pointing
3445 to *pslot, which we can now update to be a reference type. */
3446 if (debug_get_type_kind (info->dhandle, *pslot) != DEBUG_KIND_POINTER)
3448 ieee_error (info, start, _("C++ reference is not pointer"));
3449 return FALSE;
3452 target = debug_get_target_type (info->dhandle, *pslot);
3453 *pslot = debug_make_reference_type (info->dhandle, target);
3454 if (*pslot == DEBUG_TYPE_NULL)
3455 return FALSE;
3457 return TRUE;
3460 /* Require an ASN record. */
3462 static bfd_boolean
3463 ieee_require_asn (struct ieee_info *info, const bfd_byte **pp, bfd_vma *pv)
3465 const bfd_byte *start;
3466 ieee_record_enum_type c;
3467 bfd_vma varindx;
3469 start = *pp;
3471 c = (ieee_record_enum_type) **pp;
3472 if (c != ieee_e2_first_byte_enum)
3474 ieee_error (info, start, _("missing required ASN"));
3475 return FALSE;
3477 ++*pp;
3479 c = (ieee_record_enum_type) (((unsigned int) c << 8) | **pp);
3480 if (c != ieee_asn_record_enum)
3482 ieee_error (info, start, _("missing required ASN"));
3483 return FALSE;
3485 ++*pp;
3487 /* Just ignore the variable index. */
3488 if (! ieee_read_number (info, pp, &varindx))
3489 return FALSE;
3491 return ieee_read_expression (info, pp, pv);
3494 /* Require an ATN65 record. */
3496 static bfd_boolean
3497 ieee_require_atn65 (struct ieee_info *info, const bfd_byte **pp,
3498 const char **pname, unsigned long *pnamlen)
3500 const bfd_byte *start;
3501 ieee_record_enum_type c;
3502 bfd_vma name_indx, type_indx, atn_code;
3504 start = *pp;
3506 c = (ieee_record_enum_type) **pp;
3507 if (c != ieee_at_record_enum)
3509 ieee_error (info, start, _("missing required ATN65"));
3510 return FALSE;
3512 ++*pp;
3514 c = (ieee_record_enum_type) (((unsigned int) c << 8) | **pp);
3515 if (c != ieee_atn_record_enum)
3517 ieee_error (info, start, _("missing required ATN65"));
3518 return FALSE;
3520 ++*pp;
3522 if (! ieee_read_number (info, pp, &name_indx)
3523 || ! ieee_read_number (info, pp, &type_indx)
3524 || ! ieee_read_number (info, pp, &atn_code))
3525 return FALSE;
3527 /* Just ignore name_indx. */
3529 if (type_indx != 0 || atn_code != 65)
3531 ieee_error (info, start, _("bad ATN65 record"));
3532 return FALSE;
3535 return ieee_read_id (info, pp, pname, pnamlen);
3538 /* Convert a register number in IEEE debugging information into a
3539 generic register number. */
3541 static int
3542 ieee_regno_to_genreg (bfd *abfd, int r)
3544 switch (bfd_get_arch (abfd))
3546 case bfd_arch_m68k:
3547 /* For some reasons stabs adds 2 to the floating point register
3548 numbers. */
3549 if (r >= 16)
3550 r += 2;
3551 break;
3553 case bfd_arch_i960:
3554 /* Stabs uses 0 to 15 for r0 to r15, 16 to 31 for g0 to g15, and
3555 32 to 35 for fp0 to fp3. */
3556 --r;
3557 break;
3559 default:
3560 break;
3563 return r;
3566 /* Convert a generic register number to an IEEE specific one. */
3568 static int
3569 ieee_genreg_to_regno (bfd *abfd, int r)
3571 switch (bfd_get_arch (abfd))
3573 case bfd_arch_m68k:
3574 /* For some reason stabs add 2 to the floating point register
3575 numbers. */
3576 if (r >= 18)
3577 r -= 2;
3578 break;
3580 case bfd_arch_i960:
3581 /* Stabs uses 0 to 15 for r0 to r15, 16 to 31 for g0 to g15, and
3582 32 to 35 for fp0 to fp3. */
3583 ++r;
3584 break;
3586 default:
3587 break;
3590 return r;
3593 /* These routines build IEEE debugging information out of the generic
3594 debugging information. */
3596 /* We build the IEEE debugging information byte by byte. Rather than
3597 waste time copying data around, we use a linked list of buffers to
3598 hold the data. */
3600 #define IEEE_BUFSIZE (490)
3602 struct ieee_buf
3604 /* Next buffer. */
3605 struct ieee_buf *next;
3606 /* Number of data bytes in this buffer. */
3607 unsigned int c;
3608 /* Bytes. */
3609 bfd_byte buf[IEEE_BUFSIZE];
3612 /* A list of buffers. */
3614 struct ieee_buflist
3616 /* Head of list. */
3617 struct ieee_buf *head;
3618 /* Tail--last buffer on list. */
3619 struct ieee_buf *tail;
3622 /* In order to generate the BB11 blocks required by the HP emulator,
3623 we keep track of ranges of addresses which correspond to a given
3624 compilation unit. */
3626 struct ieee_range
3628 /* Next range. */
3629 struct ieee_range *next;
3630 /* Low address. */
3631 bfd_vma low;
3632 /* High address. */
3633 bfd_vma high;
3636 /* This structure holds information for a class on the type stack. */
3638 struct ieee_type_class
3640 /* The name index in the debugging information. */
3641 unsigned int indx;
3642 /* The pmisc records for the class. */
3643 struct ieee_buflist pmiscbuf;
3644 /* The number of pmisc records. */
3645 unsigned int pmisccount;
3646 /* The name of the class holding the virtual table, if not this
3647 class. */
3648 const char *vclass;
3649 /* Whether this class holds its own virtual table. */
3650 bfd_boolean ownvptr;
3651 /* The largest virtual table offset seen so far. */
3652 bfd_vma voffset;
3653 /* The current method. */
3654 const char *method;
3655 /* Additional pmisc records used to record fields of reference type. */
3656 struct ieee_buflist refs;
3659 /* This is how we store types for the writing routines. Most types
3660 are simply represented by a type index. */
3662 struct ieee_write_type
3664 /* Type index. */
3665 unsigned int indx;
3666 /* The size of the type, if known. */
3667 unsigned int size;
3668 /* The name of the type, if any. */
3669 const char *name;
3670 /* If this is a function or method type, we build the type here, and
3671 only add it to the output buffers if we need it. */
3672 struct ieee_buflist fndef;
3673 /* If this is a struct, this is where the struct definition is
3674 built. */
3675 struct ieee_buflist strdef;
3676 /* If this is a class, this is where the class information is built. */
3677 struct ieee_type_class *classdef;
3678 /* Whether the type is unsigned. */
3679 unsigned int unsignedp : 1;
3680 /* Whether this is a reference type. */
3681 unsigned int referencep : 1;
3682 /* Whether this is in the local type block. */
3683 unsigned int localp : 1;
3684 /* Whether this is a duplicate struct definition which we are
3685 ignoring. */
3686 unsigned int ignorep : 1;
3689 /* This is the type stack used by the debug writing routines. FIXME:
3690 We could generate more efficient output if we remembered when we
3691 have output a particular type before. */
3693 struct ieee_type_stack
3695 /* Next entry on stack. */
3696 struct ieee_type_stack *next;
3697 /* Type information. */
3698 struct ieee_write_type type;
3701 /* This is a list of associations between a name and some types.
3702 These are used for typedefs and tags. */
3704 struct ieee_name_type
3706 /* Next type for this name. */
3707 struct ieee_name_type *next;
3708 /* ID number. For a typedef, this is the index of the type to which
3709 this name is typedefed. */
3710 unsigned int id;
3711 /* Type. */
3712 struct ieee_write_type type;
3713 /* If this is a tag which has not yet been defined, this is the
3714 kind. If the tag has been defined, this is DEBUG_KIND_ILLEGAL. */
3715 enum debug_type_kind kind;
3718 /* We use a hash table to associate names and types. */
3720 struct ieee_name_type_hash_table
3722 struct bfd_hash_table root;
3725 struct ieee_name_type_hash_entry
3727 struct bfd_hash_entry root;
3728 /* Information for this name. */
3729 struct ieee_name_type *types;
3732 /* This is a list of enums. */
3734 struct ieee_defined_enum
3736 /* Next enum. */
3737 struct ieee_defined_enum *next;
3738 /* Type index. */
3739 unsigned int indx;
3740 /* Whether this enum has been defined. */
3741 bfd_boolean defined;
3742 /* Tag. */
3743 const char *tag;
3744 /* Names. */
3745 const char **names;
3746 /* Values. */
3747 bfd_signed_vma *vals;
3750 /* We keep a list of modified versions of types, so that we don't
3751 output them more than once. */
3753 struct ieee_modified_type
3755 /* Pointer to this type. */
3756 unsigned int pointer;
3757 /* Function with unknown arguments returning this type. */
3758 unsigned int function;
3759 /* Const version of this type. */
3760 unsigned int const_qualified;
3761 /* Volatile version of this type. */
3762 unsigned int volatile_qualified;
3763 /* List of arrays of this type of various bounds. */
3764 struct ieee_modified_array_type *arrays;
3767 /* A list of arrays bounds. */
3769 struct ieee_modified_array_type
3771 /* Next array bounds. */
3772 struct ieee_modified_array_type *next;
3773 /* Type index with these bounds. */
3774 unsigned int indx;
3775 /* Low bound. */
3776 bfd_signed_vma low;
3777 /* High bound. */
3778 bfd_signed_vma high;
3781 /* This is a list of pending function parameter information. We don't
3782 output them until we see the first block. */
3784 struct ieee_pending_parm
3786 /* Next pending parameter. */
3787 struct ieee_pending_parm *next;
3788 /* Name. */
3789 const char *name;
3790 /* Type index. */
3791 unsigned int type;
3792 /* Whether the type is a reference. */
3793 bfd_boolean referencep;
3794 /* Kind. */
3795 enum debug_parm_kind kind;
3796 /* Value. */
3797 bfd_vma val;
3800 /* This is the handle passed down by debug_write. */
3802 struct ieee_handle
3804 /* BFD we are writing to. */
3805 bfd *abfd;
3806 /* Whether we got an error in a subroutine called via traverse or
3807 map_over_sections. */
3808 bfd_boolean error;
3809 /* Current data buffer list. */
3810 struct ieee_buflist *current;
3811 /* Current data buffer. */
3812 struct ieee_buf *curbuf;
3813 /* Filename of current compilation unit. */
3814 const char *filename;
3815 /* Module name of current compilation unit. */
3816 const char *modname;
3817 /* List of buffer for global types. */
3818 struct ieee_buflist global_types;
3819 /* List of finished data buffers. */
3820 struct ieee_buflist data;
3821 /* List of buffers for typedefs in the current compilation unit. */
3822 struct ieee_buflist types;
3823 /* List of buffers for variables and functions in the current
3824 compilation unit. */
3825 struct ieee_buflist vars;
3826 /* List of buffers for C++ class definitions in the current
3827 compilation unit. */
3828 struct ieee_buflist cxx;
3829 /* List of buffers for line numbers in the current compilation unit. */
3830 struct ieee_buflist linenos;
3831 /* Ranges for the current compilation unit. */
3832 struct ieee_range *ranges;
3833 /* Ranges for all debugging information. */
3834 struct ieee_range *global_ranges;
3835 /* Nested pending ranges. */
3836 struct ieee_range *pending_ranges;
3837 /* Type stack. */
3838 struct ieee_type_stack *type_stack;
3839 /* Next unallocated type index. */
3840 unsigned int type_indx;
3841 /* Next unallocated name index. */
3842 unsigned int name_indx;
3843 /* Typedefs. */
3844 struct ieee_name_type_hash_table typedefs;
3845 /* Tags. */
3846 struct ieee_name_type_hash_table tags;
3847 /* Enums. */
3848 struct ieee_defined_enum *enums;
3849 /* Modified versions of types. */
3850 struct ieee_modified_type *modified;
3851 /* Number of entries allocated in modified. */
3852 unsigned int modified_alloc;
3853 /* 4 byte complex type. */
3854 unsigned int complex_float_index;
3855 /* 8 byte complex type. */
3856 unsigned int complex_double_index;
3857 /* The depth of block nesting. This is 0 outside a function, and 1
3858 just after start_function is called. */
3859 unsigned int block_depth;
3860 /* The name of the current function. */
3861 const char *fnname;
3862 /* List of buffers for the type of the function we are currently
3863 writing out. */
3864 struct ieee_buflist fntype;
3865 /* List of buffers for the parameters of the function we are
3866 currently writing out. */
3867 struct ieee_buflist fnargs;
3868 /* Number of arguments written to fnargs. */
3869 unsigned int fnargcount;
3870 /* Pending function parameters. */
3871 struct ieee_pending_parm *pending_parms;
3872 /* Current line number filename. */
3873 const char *lineno_filename;
3874 /* Line number name index. */
3875 unsigned int lineno_name_indx;
3876 /* Filename of pending line number. */
3877 const char *pending_lineno_filename;
3878 /* Pending line number. */
3879 unsigned long pending_lineno;
3880 /* Address of pending line number. */
3881 bfd_vma pending_lineno_addr;
3882 /* Highest address seen at end of procedure. */
3883 bfd_vma highaddr;
3886 static bfd_boolean ieee_init_buffer
3887 (struct ieee_handle *, struct ieee_buflist *);
3888 static bfd_boolean ieee_change_buffer
3889 (struct ieee_handle *, struct ieee_buflist *);
3890 static bfd_boolean ieee_append_buffer
3891 (struct ieee_handle *, struct ieee_buflist *, struct ieee_buflist *);
3892 static bfd_boolean ieee_real_write_byte (struct ieee_handle *, int);
3893 static bfd_boolean ieee_write_2bytes (struct ieee_handle *, int);
3894 static bfd_boolean ieee_write_number (struct ieee_handle *, bfd_vma);
3895 static bfd_boolean ieee_write_id (struct ieee_handle *, const char *);
3896 static bfd_boolean ieee_write_asn
3897 (struct ieee_handle *, unsigned int, bfd_vma);
3898 static bfd_boolean ieee_write_atn65
3899 (struct ieee_handle *, unsigned int, const char *);
3900 static bfd_boolean ieee_push_type
3901 (struct ieee_handle *, unsigned int, unsigned int, bfd_boolean,
3902 bfd_boolean);
3903 static unsigned int ieee_pop_type (struct ieee_handle *);
3904 static void ieee_pop_unused_type (struct ieee_handle *);
3905 static unsigned int ieee_pop_type_used (struct ieee_handle *, bfd_boolean);
3906 static bfd_boolean ieee_add_range
3907 (struct ieee_handle *, bfd_boolean, bfd_vma, bfd_vma);
3908 static bfd_boolean ieee_start_range (struct ieee_handle *, bfd_vma);
3909 static bfd_boolean ieee_end_range (struct ieee_handle *, bfd_vma);
3910 static bfd_boolean ieee_define_type
3911 (struct ieee_handle *, unsigned int, bfd_boolean, bfd_boolean);
3912 static bfd_boolean ieee_define_named_type
3913 (struct ieee_handle *, const char *, unsigned int, unsigned int,
3914 bfd_boolean, bfd_boolean, struct ieee_buflist *);
3915 static struct ieee_modified_type *ieee_get_modified_info
3916 (struct ieee_handle *, unsigned int);
3917 static struct bfd_hash_entry *ieee_name_type_newfunc
3918 (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
3919 static bfd_boolean ieee_write_undefined_tag
3920 (struct ieee_name_type_hash_entry *, void *);
3921 static bfd_boolean ieee_finish_compilation_unit (struct ieee_handle *);
3922 static void ieee_add_bb11_blocks (bfd *, asection *, void *);
3923 static bfd_boolean ieee_add_bb11
3924 (struct ieee_handle *, asection *, bfd_vma, bfd_vma);
3925 static bfd_boolean ieee_output_pending_parms (struct ieee_handle *);
3926 static unsigned int ieee_vis_to_flags (enum debug_visibility);
3927 static bfd_boolean ieee_class_method_var
3928 (struct ieee_handle *, const char *, enum debug_visibility, bfd_boolean,
3929 bfd_boolean, bfd_boolean, bfd_vma, bfd_boolean);
3931 static bfd_boolean ieee_start_compilation_unit (void *, const char *);
3932 static bfd_boolean ieee_start_source (void *, const char *);
3933 static bfd_boolean ieee_empty_type (void *);
3934 static bfd_boolean ieee_void_type (void *);
3935 static bfd_boolean ieee_int_type (void *, unsigned int, bfd_boolean);
3936 static bfd_boolean ieee_float_type (void *, unsigned int);
3937 static bfd_boolean ieee_complex_type (void *, unsigned int);
3938 static bfd_boolean ieee_bool_type (void *, unsigned int);
3939 static bfd_boolean ieee_enum_type
3940 (void *, const char *, const char **, bfd_signed_vma *);
3941 static bfd_boolean ieee_pointer_type (void *);
3942 static bfd_boolean ieee_function_type (void *, int, bfd_boolean);
3943 static bfd_boolean ieee_reference_type (void *);
3944 static bfd_boolean ieee_range_type (void *, bfd_signed_vma, bfd_signed_vma);
3945 static bfd_boolean ieee_array_type
3946 (void *, bfd_signed_vma, bfd_signed_vma, bfd_boolean);
3947 static bfd_boolean ieee_set_type (void *, bfd_boolean);
3948 static bfd_boolean ieee_offset_type (void *);
3949 static bfd_boolean ieee_method_type (void *, bfd_boolean, int, bfd_boolean);
3950 static bfd_boolean ieee_const_type (void *);
3951 static bfd_boolean ieee_volatile_type (void *);
3952 static bfd_boolean ieee_start_struct_type
3953 (void *, const char *, unsigned int, bfd_boolean, unsigned int);
3954 static bfd_boolean ieee_struct_field
3955 (void *, const char *, bfd_vma, bfd_vma, enum debug_visibility);
3956 static bfd_boolean ieee_end_struct_type (void *);
3957 static bfd_boolean ieee_start_class_type
3958 (void *, const char *, unsigned int, bfd_boolean, unsigned int, bfd_boolean,
3959 bfd_boolean);
3960 static bfd_boolean ieee_class_static_member
3961 (void *, const char *, const char *, enum debug_visibility);
3962 static bfd_boolean ieee_class_baseclass
3963 (void *, bfd_vma, bfd_boolean, enum debug_visibility);
3964 static bfd_boolean ieee_class_start_method (void *, const char *);
3965 static bfd_boolean ieee_class_method_variant
3966 (void *, const char *, enum debug_visibility, bfd_boolean, bfd_boolean,
3967 bfd_vma, bfd_boolean);
3968 static bfd_boolean ieee_class_static_method_variant
3969 (void *, const char *, enum debug_visibility, bfd_boolean, bfd_boolean);
3970 static bfd_boolean ieee_class_end_method (void *);
3971 static bfd_boolean ieee_end_class_type (void *);
3972 static bfd_boolean ieee_typedef_type (void *, const char *);
3973 static bfd_boolean ieee_tag_type
3974 (void *, const char *, unsigned int, enum debug_type_kind);
3975 static bfd_boolean ieee_typdef (void *, const char *);
3976 static bfd_boolean ieee_tag (void *, const char *);
3977 static bfd_boolean ieee_int_constant (void *, const char *, bfd_vma);
3978 static bfd_boolean ieee_float_constant (void *, const char *, double);
3979 static bfd_boolean ieee_typed_constant (void *, const char *, bfd_vma);
3980 static bfd_boolean ieee_variable
3981 (void *, const char *, enum debug_var_kind, bfd_vma);
3982 static bfd_boolean ieee_start_function (void *, const char *, bfd_boolean);
3983 static bfd_boolean ieee_function_parameter
3984 (void *, const char *, enum debug_parm_kind, bfd_vma);
3985 static bfd_boolean ieee_start_block (void *, bfd_vma);
3986 static bfd_boolean ieee_end_block (void *, bfd_vma);
3987 static bfd_boolean ieee_end_function (void *);
3988 static bfd_boolean ieee_lineno (void *, const char *, unsigned long, bfd_vma);
3990 static const struct debug_write_fns ieee_fns =
3992 ieee_start_compilation_unit,
3993 ieee_start_source,
3994 ieee_empty_type,
3995 ieee_void_type,
3996 ieee_int_type,
3997 ieee_float_type,
3998 ieee_complex_type,
3999 ieee_bool_type,
4000 ieee_enum_type,
4001 ieee_pointer_type,
4002 ieee_function_type,
4003 ieee_reference_type,
4004 ieee_range_type,
4005 ieee_array_type,
4006 ieee_set_type,
4007 ieee_offset_type,
4008 ieee_method_type,
4009 ieee_const_type,
4010 ieee_volatile_type,
4011 ieee_start_struct_type,
4012 ieee_struct_field,
4013 ieee_end_struct_type,
4014 ieee_start_class_type,
4015 ieee_class_static_member,
4016 ieee_class_baseclass,
4017 ieee_class_start_method,
4018 ieee_class_method_variant,
4019 ieee_class_static_method_variant,
4020 ieee_class_end_method,
4021 ieee_end_class_type,
4022 ieee_typedef_type,
4023 ieee_tag_type,
4024 ieee_typdef,
4025 ieee_tag,
4026 ieee_int_constant,
4027 ieee_float_constant,
4028 ieee_typed_constant,
4029 ieee_variable,
4030 ieee_start_function,
4031 ieee_function_parameter,
4032 ieee_start_block,
4033 ieee_end_block,
4034 ieee_end_function,
4035 ieee_lineno
4038 /* Initialize a buffer to be empty. */
4040 static bfd_boolean
4041 ieee_init_buffer (struct ieee_handle *info ATTRIBUTE_UNUSED,
4042 struct ieee_buflist *buflist)
4044 buflist->head = NULL;
4045 buflist->tail = NULL;
4046 return TRUE;
4049 /* See whether a buffer list has any data. */
4051 #define ieee_buffer_emptyp(buflist) ((buflist)->head == NULL)
4053 /* Change the current buffer to a specified buffer chain. */
4055 static bfd_boolean
4056 ieee_change_buffer (struct ieee_handle *info, struct ieee_buflist *buflist)
4058 if (buflist->head == NULL)
4060 struct ieee_buf *buf;
4062 buf = (struct ieee_buf *) xmalloc (sizeof *buf);
4063 buf->next = NULL;
4064 buf->c = 0;
4065 buflist->head = buf;
4066 buflist->tail = buf;
4069 info->current = buflist;
4070 info->curbuf = buflist->tail;
4072 return TRUE;
4075 /* Append a buffer chain. */
4077 static bfd_boolean
4078 ieee_append_buffer (struct ieee_handle *info ATTRIBUTE_UNUSED,
4079 struct ieee_buflist *mainbuf,
4080 struct ieee_buflist *newbuf)
4082 if (newbuf->head != NULL)
4084 if (mainbuf->head == NULL)
4085 mainbuf->head = newbuf->head;
4086 else
4087 mainbuf->tail->next = newbuf->head;
4088 mainbuf->tail = newbuf->tail;
4090 return TRUE;
4093 /* Write a byte into the buffer. We use a macro for speed and a
4094 function for the complex cases. */
4096 #define ieee_write_byte(info, b) \
4097 ((info)->curbuf->c < IEEE_BUFSIZE \
4098 ? ((info)->curbuf->buf[(info)->curbuf->c++] = (b), TRUE) \
4099 : ieee_real_write_byte ((info), (b)))
4101 static bfd_boolean
4102 ieee_real_write_byte (struct ieee_handle *info, int b)
4104 if (info->curbuf->c >= IEEE_BUFSIZE)
4106 struct ieee_buf *n;
4108 n = (struct ieee_buf *) xmalloc (sizeof *n);
4109 n->next = NULL;
4110 n->c = 0;
4111 if (info->current->head == NULL)
4112 info->current->head = n;
4113 else
4114 info->current->tail->next = n;
4115 info->current->tail = n;
4116 info->curbuf = n;
4119 info->curbuf->buf[info->curbuf->c] = b;
4120 ++info->curbuf->c;
4122 return TRUE;
4125 /* Write out two bytes. */
4127 static bfd_boolean
4128 ieee_write_2bytes (struct ieee_handle *info, int i)
4130 return (ieee_write_byte (info, i >> 8)
4131 && ieee_write_byte (info, i & 0xff));
4134 /* Write out an integer. */
4136 static bfd_boolean
4137 ieee_write_number (struct ieee_handle *info, bfd_vma v)
4139 bfd_vma t;
4140 bfd_byte ab[20];
4141 bfd_byte *p;
4142 unsigned int c;
4144 if (v <= (bfd_vma) ieee_number_end_enum)
4145 return ieee_write_byte (info, (int) v);
4147 t = v;
4148 p = ab + sizeof ab;
4149 while (t != 0)
4151 *--p = t & 0xff;
4152 t >>= 8;
4154 c = (ab + 20) - p;
4156 if (c > (unsigned int) (ieee_number_repeat_end_enum
4157 - ieee_number_repeat_start_enum))
4159 fprintf (stderr, _("IEEE numeric overflow: 0x"));
4160 fprintf_vma (stderr, v);
4161 fprintf (stderr, "\n");
4162 return FALSE;
4165 if (! ieee_write_byte (info, (int) ieee_number_repeat_start_enum + c))
4166 return FALSE;
4167 for (; c > 0; --c, ++p)
4169 if (! ieee_write_byte (info, *p))
4170 return FALSE;
4173 return TRUE;
4176 /* Write out a string. */
4178 static bfd_boolean
4179 ieee_write_id (struct ieee_handle *info, const char *s)
4181 unsigned int len;
4183 len = strlen (s);
4184 if (len <= 0x7f)
4186 if (! ieee_write_byte (info, len))
4187 return FALSE;
4189 else if (len <= 0xff)
4191 if (! ieee_write_byte (info, (int) ieee_extension_length_1_enum)
4192 || ! ieee_write_byte (info, len))
4193 return FALSE;
4195 else if (len <= 0xffff)
4197 if (! ieee_write_byte (info, (int) ieee_extension_length_2_enum)
4198 || ! ieee_write_2bytes (info, len))
4199 return FALSE;
4201 else
4203 fprintf (stderr, _("IEEE string length overflow: %u\n"), len);
4204 return FALSE;
4207 for (; *s != '\0'; s++)
4208 if (! ieee_write_byte (info, *s))
4209 return FALSE;
4211 return TRUE;
4214 /* Write out an ASN record. */
4216 static bfd_boolean
4217 ieee_write_asn (struct ieee_handle *info, unsigned int indx, bfd_vma val)
4219 return (ieee_write_2bytes (info, (int) ieee_asn_record_enum)
4220 && ieee_write_number (info, indx)
4221 && ieee_write_number (info, val));
4224 /* Write out an ATN65 record. */
4226 static bfd_boolean
4227 ieee_write_atn65 (struct ieee_handle *info, unsigned int indx, const char *s)
4229 return (ieee_write_2bytes (info, (int) ieee_atn_record_enum)
4230 && ieee_write_number (info, indx)
4231 && ieee_write_number (info, 0)
4232 && ieee_write_number (info, 65)
4233 && ieee_write_id (info, s));
4236 /* Push a type index onto the type stack. */
4238 static bfd_boolean
4239 ieee_push_type (struct ieee_handle *info, unsigned int indx,
4240 unsigned int size, bfd_boolean unsignedp, bfd_boolean localp)
4242 struct ieee_type_stack *ts;
4244 ts = (struct ieee_type_stack *) xmalloc (sizeof *ts);
4245 memset (ts, 0, sizeof *ts);
4247 ts->type.indx = indx;
4248 ts->type.size = size;
4249 ts->type.unsignedp = unsignedp;
4250 ts->type.localp = localp;
4252 ts->next = info->type_stack;
4253 info->type_stack = ts;
4255 return TRUE;
4258 /* Pop a type index off the type stack. */
4260 static unsigned int
4261 ieee_pop_type (struct ieee_handle *info)
4263 return ieee_pop_type_used (info, TRUE);
4266 /* Pop an unused type index off the type stack. */
4268 static void
4269 ieee_pop_unused_type (struct ieee_handle *info)
4271 (void) ieee_pop_type_used (info, FALSE);
4274 /* Pop a used or unused type index off the type stack. */
4276 static unsigned int
4277 ieee_pop_type_used (struct ieee_handle *info, bfd_boolean used)
4279 struct ieee_type_stack *ts;
4280 unsigned int ret;
4282 ts = info->type_stack;
4283 assert (ts != NULL);
4285 /* If this is a function type, and we need it, we need to append the
4286 actual definition to the typedef block now. */
4287 if (used && ! ieee_buffer_emptyp (&ts->type.fndef))
4289 struct ieee_buflist *buflist;
4291 if (ts->type.localp)
4293 /* Make sure we have started the types block. */
4294 if (ieee_buffer_emptyp (&info->types))
4296 if (! ieee_change_buffer (info, &info->types)
4297 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4298 || ! ieee_write_byte (info, 1)
4299 || ! ieee_write_number (info, 0)
4300 || ! ieee_write_id (info, info->modname))
4301 return FALSE;
4303 buflist = &info->types;
4305 else
4307 /* Make sure we started the global type block. */
4308 if (ieee_buffer_emptyp (&info->global_types))
4310 if (! ieee_change_buffer (info, &info->global_types)
4311 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4312 || ! ieee_write_byte (info, 2)
4313 || ! ieee_write_number (info, 0)
4314 || ! ieee_write_id (info, ""))
4315 return FALSE;
4317 buflist = &info->global_types;
4320 if (! ieee_append_buffer (info, buflist, &ts->type.fndef))
4321 return FALSE;
4324 ret = ts->type.indx;
4325 info->type_stack = ts->next;
4326 free (ts);
4327 return ret;
4330 /* Add a range of bytes included in the current compilation unit. */
4332 static bfd_boolean
4333 ieee_add_range (struct ieee_handle *info, bfd_boolean global, bfd_vma low,
4334 bfd_vma high)
4336 struct ieee_range **plist, *r, **pr;
4338 if (low == (bfd_vma) -1 || high == (bfd_vma) -1 || low == high)
4339 return TRUE;
4341 if (global)
4342 plist = &info->global_ranges;
4343 else
4344 plist = &info->ranges;
4346 for (r = *plist; r != NULL; r = r->next)
4348 if (high >= r->low && low <= r->high)
4350 /* The new range overlaps r. */
4351 if (low < r->low)
4352 r->low = low;
4353 if (high > r->high)
4354 r->high = high;
4355 pr = &r->next;
4356 while (*pr != NULL && (*pr)->low <= r->high)
4358 struct ieee_range *n;
4360 if ((*pr)->high > r->high)
4361 r->high = (*pr)->high;
4362 n = (*pr)->next;
4363 free (*pr);
4364 *pr = n;
4366 return TRUE;
4370 r = (struct ieee_range *) xmalloc (sizeof *r);
4371 memset (r, 0, sizeof *r);
4373 r->low = low;
4374 r->high = high;
4376 /* Store the ranges sorted by address. */
4377 for (pr = plist; *pr != NULL; pr = &(*pr)->next)
4378 if ((*pr)->low > high)
4379 break;
4380 r->next = *pr;
4381 *pr = r;
4383 return TRUE;
4386 /* Start a new range for which we only have the low address. */
4388 static bfd_boolean
4389 ieee_start_range (struct ieee_handle *info, bfd_vma low)
4391 struct ieee_range *r;
4393 r = (struct ieee_range *) xmalloc (sizeof *r);
4394 memset (r, 0, sizeof *r);
4395 r->low = low;
4396 r->next = info->pending_ranges;
4397 info->pending_ranges = r;
4398 return TRUE;
4401 /* Finish a range started by ieee_start_range. */
4403 static bfd_boolean
4404 ieee_end_range (struct ieee_handle *info, bfd_vma high)
4406 struct ieee_range *r;
4407 bfd_vma low;
4409 assert (info->pending_ranges != NULL);
4410 r = info->pending_ranges;
4411 low = r->low;
4412 info->pending_ranges = r->next;
4413 free (r);
4414 return ieee_add_range (info, FALSE, low, high);
4417 /* Start defining a type. */
4419 static bfd_boolean
4420 ieee_define_type (struct ieee_handle *info, unsigned int size,
4421 bfd_boolean unsignedp, bfd_boolean localp)
4423 return ieee_define_named_type (info, (const char *) NULL,
4424 (unsigned int) -1, size, unsignedp,
4425 localp, (struct ieee_buflist *) NULL);
4428 /* Start defining a named type. */
4430 static bfd_boolean
4431 ieee_define_named_type (struct ieee_handle *info, const char *name,
4432 unsigned int indx, unsigned int size,
4433 bfd_boolean unsignedp, bfd_boolean localp,
4434 struct ieee_buflist *buflist)
4436 unsigned int type_indx;
4437 unsigned int name_indx;
4439 if (indx != (unsigned int) -1)
4440 type_indx = indx;
4441 else
4443 type_indx = info->type_indx;
4444 ++info->type_indx;
4447 name_indx = info->name_indx;
4448 ++info->name_indx;
4450 if (name == NULL)
4451 name = "";
4453 /* If we were given a buffer, use it; otherwise, use either the
4454 local or the global type information, and make sure that the type
4455 block is started. */
4456 if (buflist != NULL)
4458 if (! ieee_change_buffer (info, buflist))
4459 return FALSE;
4461 else if (localp)
4463 if (! ieee_buffer_emptyp (&info->types))
4465 if (! ieee_change_buffer (info, &info->types))
4466 return FALSE;
4468 else
4470 if (! ieee_change_buffer (info, &info->types)
4471 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4472 || ! ieee_write_byte (info, 1)
4473 || ! ieee_write_number (info, 0)
4474 || ! ieee_write_id (info, info->modname))
4475 return FALSE;
4478 else
4480 if (! ieee_buffer_emptyp (&info->global_types))
4482 if (! ieee_change_buffer (info, &info->global_types))
4483 return FALSE;
4485 else
4487 if (! ieee_change_buffer (info, &info->global_types)
4488 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4489 || ! ieee_write_byte (info, 2)
4490 || ! ieee_write_number (info, 0)
4491 || ! ieee_write_id (info, ""))
4492 return FALSE;
4496 /* Push the new type on the type stack, write out an NN record, and
4497 write out the start of a TY record. The caller will then finish
4498 the TY record. */
4499 if (! ieee_push_type (info, type_indx, size, unsignedp, localp))
4500 return FALSE;
4502 return (ieee_write_byte (info, (int) ieee_nn_record)
4503 && ieee_write_number (info, name_indx)
4504 && ieee_write_id (info, name)
4505 && ieee_write_byte (info, (int) ieee_ty_record_enum)
4506 && ieee_write_number (info, type_indx)
4507 && ieee_write_byte (info, 0xce)
4508 && ieee_write_number (info, name_indx));
4511 /* Get an entry to the list of modified versions of a type. */
4513 static struct ieee_modified_type *
4514 ieee_get_modified_info (struct ieee_handle *info, unsigned int indx)
4516 if (indx >= info->modified_alloc)
4518 unsigned int nalloc;
4520 nalloc = info->modified_alloc;
4521 if (nalloc == 0)
4522 nalloc = 16;
4523 while (indx >= nalloc)
4524 nalloc *= 2;
4525 info->modified = ((struct ieee_modified_type *)
4526 xrealloc (info->modified,
4527 nalloc * sizeof *info->modified));
4528 memset (info->modified + info->modified_alloc, 0,
4529 (nalloc - info->modified_alloc) * sizeof *info->modified);
4530 info->modified_alloc = nalloc;
4533 return info->modified + indx;
4536 /* Routines for the hash table mapping names to types. */
4538 /* Initialize an entry in the hash table. */
4540 static struct bfd_hash_entry *
4541 ieee_name_type_newfunc (struct bfd_hash_entry *entry,
4542 struct bfd_hash_table *table, const char *string)
4544 struct ieee_name_type_hash_entry *ret =
4545 (struct ieee_name_type_hash_entry *) entry;
4547 /* Allocate the structure if it has not already been allocated by a
4548 subclass. */
4549 if (ret == NULL)
4550 ret = ((struct ieee_name_type_hash_entry *)
4551 bfd_hash_allocate (table, sizeof *ret));
4552 if (ret == NULL)
4553 return NULL;
4555 /* Call the allocation method of the superclass. */
4556 ret = ((struct ieee_name_type_hash_entry *)
4557 bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
4558 if (ret)
4560 /* Set local fields. */
4561 ret->types = NULL;
4564 return (struct bfd_hash_entry *) ret;
4567 /* Look up an entry in the hash table. */
4569 #define ieee_name_type_hash_lookup(table, string, create, copy) \
4570 ((struct ieee_name_type_hash_entry *) \
4571 bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
4573 /* Traverse the hash table. */
4575 #define ieee_name_type_hash_traverse(table, func, info) \
4576 (bfd_hash_traverse \
4577 (&(table)->root, \
4578 (bfd_boolean (*) (struct bfd_hash_entry *, void *)) (func), \
4579 (info)))
4581 /* The general routine to write out IEEE debugging information. */
4583 bfd_boolean
4584 write_ieee_debugging_info (bfd *abfd, void *dhandle)
4586 struct ieee_handle info;
4587 asection *s;
4588 const char *err;
4589 struct ieee_buf *b;
4591 memset (&info, 0, sizeof info);
4592 info.abfd = abfd;
4593 info.type_indx = 256;
4594 info.name_indx = 32;
4596 if (! bfd_hash_table_init (&info.typedefs.root, ieee_name_type_newfunc)
4597 || ! bfd_hash_table_init (&info.tags.root, ieee_name_type_newfunc))
4598 return FALSE;
4600 if (! ieee_init_buffer (&info, &info.global_types)
4601 || ! ieee_init_buffer (&info, &info.data)
4602 || ! ieee_init_buffer (&info, &info.types)
4603 || ! ieee_init_buffer (&info, &info.vars)
4604 || ! ieee_init_buffer (&info, &info.cxx)
4605 || ! ieee_init_buffer (&info, &info.linenos)
4606 || ! ieee_init_buffer (&info, &info.fntype)
4607 || ! ieee_init_buffer (&info, &info.fnargs))
4608 return FALSE;
4610 if (! debug_write (dhandle, &ieee_fns, (void *) &info))
4611 return FALSE;
4613 if (info.filename != NULL)
4615 if (! ieee_finish_compilation_unit (&info))
4616 return FALSE;
4619 /* Put any undefined tags in the global typedef information. */
4620 info.error = FALSE;
4621 ieee_name_type_hash_traverse (&info.tags,
4622 ieee_write_undefined_tag,
4623 (void *) &info);
4624 if (info.error)
4625 return FALSE;
4627 /* Prepend the global typedef information to the other data. */
4628 if (! ieee_buffer_emptyp (&info.global_types))
4630 /* The HP debugger seems to have a bug in which it ignores the
4631 last entry in the global types, so we add a dummy entry. */
4632 if (! ieee_change_buffer (&info, &info.global_types)
4633 || ! ieee_write_byte (&info, (int) ieee_nn_record)
4634 || ! ieee_write_number (&info, info.name_indx)
4635 || ! ieee_write_id (&info, "")
4636 || ! ieee_write_byte (&info, (int) ieee_ty_record_enum)
4637 || ! ieee_write_number (&info, info.type_indx)
4638 || ! ieee_write_byte (&info, 0xce)
4639 || ! ieee_write_number (&info, info.name_indx)
4640 || ! ieee_write_number (&info, 'P')
4641 || ! ieee_write_number (&info, (int) builtin_void + 32)
4642 || ! ieee_write_byte (&info, (int) ieee_be_record_enum))
4643 return FALSE;
4645 if (! ieee_append_buffer (&info, &info.global_types, &info.data))
4646 return FALSE;
4647 info.data = info.global_types;
4650 /* Make sure that we have declare BB11 blocks for each range in the
4651 file. They are added to info->vars. */
4652 info.error = FALSE;
4653 if (! ieee_init_buffer (&info, &info.vars))
4654 return FALSE;
4655 bfd_map_over_sections (abfd, ieee_add_bb11_blocks, (void *) &info);
4656 if (info.error)
4657 return FALSE;
4658 if (! ieee_buffer_emptyp (&info.vars))
4660 if (! ieee_change_buffer (&info, &info.vars)
4661 || ! ieee_write_byte (&info, (int) ieee_be_record_enum))
4662 return FALSE;
4664 if (! ieee_append_buffer (&info, &info.data, &info.vars))
4665 return FALSE;
4668 /* Now all the data is in info.data. Write it out to the BFD. We
4669 normally would need to worry about whether all the other sections
4670 are set up yet, but the IEEE backend will handle this particular
4671 case correctly regardless. */
4672 if (ieee_buffer_emptyp (&info.data))
4674 /* There is no debugging information. */
4675 return TRUE;
4677 err = NULL;
4678 s = bfd_make_section (abfd, ".debug");
4679 if (s == NULL)
4680 err = "bfd_make_section";
4681 if (err == NULL)
4683 if (! bfd_set_section_flags (abfd, s, SEC_DEBUGGING | SEC_HAS_CONTENTS))
4684 err = "bfd_set_section_flags";
4686 if (err == NULL)
4688 bfd_size_type size;
4690 size = 0;
4691 for (b = info.data.head; b != NULL; b = b->next)
4692 size += b->c;
4693 if (! bfd_set_section_size (abfd, s, size))
4694 err = "bfd_set_section_size";
4696 if (err == NULL)
4698 file_ptr offset;
4700 offset = 0;
4701 for (b = info.data.head; b != NULL; b = b->next)
4703 if (! bfd_set_section_contents (abfd, s, b->buf, offset, b->c))
4705 err = "bfd_set_section_contents";
4706 break;
4708 offset += b->c;
4712 if (err != NULL)
4714 fprintf (stderr, "%s: %s: %s\n", bfd_get_filename (abfd), err,
4715 bfd_errmsg (bfd_get_error ()));
4716 return FALSE;
4719 bfd_hash_table_free (&info.typedefs.root);
4720 bfd_hash_table_free (&info.tags.root);
4722 return TRUE;
4725 /* Write out information for an undefined tag. This is called via
4726 ieee_name_type_hash_traverse. */
4728 static bfd_boolean
4729 ieee_write_undefined_tag (struct ieee_name_type_hash_entry *h, void *p)
4731 struct ieee_handle *info = (struct ieee_handle *) p;
4732 struct ieee_name_type *nt;
4734 for (nt = h->types; nt != NULL; nt = nt->next)
4736 unsigned int name_indx;
4737 char code;
4739 if (nt->kind == DEBUG_KIND_ILLEGAL)
4740 continue;
4742 if (ieee_buffer_emptyp (&info->global_types))
4744 if (! ieee_change_buffer (info, &info->global_types)
4745 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4746 || ! ieee_write_byte (info, 2)
4747 || ! ieee_write_number (info, 0)
4748 || ! ieee_write_id (info, ""))
4750 info->error = TRUE;
4751 return FALSE;
4754 else
4756 if (! ieee_change_buffer (info, &info->global_types))
4758 info->error = TRUE;
4759 return FALSE;
4763 name_indx = info->name_indx;
4764 ++info->name_indx;
4765 if (! ieee_write_byte (info, (int) ieee_nn_record)
4766 || ! ieee_write_number (info, name_indx)
4767 || ! ieee_write_id (info, nt->type.name)
4768 || ! ieee_write_byte (info, (int) ieee_ty_record_enum)
4769 || ! ieee_write_number (info, nt->type.indx)
4770 || ! ieee_write_byte (info, 0xce)
4771 || ! ieee_write_number (info, name_indx))
4773 info->error = TRUE;
4774 return FALSE;
4777 switch (nt->kind)
4779 default:
4780 abort ();
4781 info->error = TRUE;
4782 return FALSE;
4783 case DEBUG_KIND_STRUCT:
4784 case DEBUG_KIND_CLASS:
4785 code = 'S';
4786 break;
4787 case DEBUG_KIND_UNION:
4788 case DEBUG_KIND_UNION_CLASS:
4789 code = 'U';
4790 break;
4791 case DEBUG_KIND_ENUM:
4792 code = 'E';
4793 break;
4795 if (! ieee_write_number (info, code)
4796 || ! ieee_write_number (info, 0))
4798 info->error = TRUE;
4799 return FALSE;
4803 return TRUE;
4806 /* Start writing out information for a compilation unit. */
4808 static bfd_boolean
4809 ieee_start_compilation_unit (void *p, const char *filename)
4811 struct ieee_handle *info = (struct ieee_handle *) p;
4812 const char *modname;
4813 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
4814 const char *backslash;
4815 #endif
4816 char *c, *s;
4817 unsigned int nindx;
4819 if (info->filename != NULL)
4821 if (! ieee_finish_compilation_unit (info))
4822 return FALSE;
4825 info->filename = filename;
4826 modname = strrchr (filename, '/');
4827 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
4828 /* We could have a mixed forward/back slash case. */
4829 backslash = strrchr (filename, '\\');
4830 if (modname == NULL || (backslash != NULL && backslash > modname))
4831 modname = backslash;
4832 #endif
4834 if (modname != NULL)
4835 ++modname;
4836 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
4837 else if (filename[0] && filename[1] == ':')
4838 modname = filename + 2;
4839 #endif
4840 else
4841 modname = filename;
4843 c = xstrdup (modname);
4844 s = strrchr (c, '.');
4845 if (s != NULL)
4846 *s = '\0';
4847 info->modname = c;
4849 if (! ieee_init_buffer (info, &info->types)
4850 || ! ieee_init_buffer (info, &info->vars)
4851 || ! ieee_init_buffer (info, &info->cxx)
4852 || ! ieee_init_buffer (info, &info->linenos))
4853 return FALSE;
4854 info->ranges = NULL;
4856 /* Always include a BB1 and a BB3 block. That is what the output of
4857 the MRI linker seems to look like. */
4858 if (! ieee_change_buffer (info, &info->types)
4859 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4860 || ! ieee_write_byte (info, 1)
4861 || ! ieee_write_number (info, 0)
4862 || ! ieee_write_id (info, info->modname))
4863 return FALSE;
4865 nindx = info->name_indx;
4866 ++info->name_indx;
4867 if (! ieee_change_buffer (info, &info->vars)
4868 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
4869 || ! ieee_write_byte (info, 3)
4870 || ! ieee_write_number (info, 0)
4871 || ! ieee_write_id (info, info->modname))
4872 return FALSE;
4874 return TRUE;
4877 /* Finish up a compilation unit. */
4879 static bfd_boolean
4880 ieee_finish_compilation_unit (struct ieee_handle *info)
4882 struct ieee_range *r;
4884 if (! ieee_buffer_emptyp (&info->types))
4886 if (! ieee_change_buffer (info, &info->types)
4887 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
4888 return FALSE;
4891 if (! ieee_buffer_emptyp (&info->cxx))
4893 /* Append any C++ information to the global function and
4894 variable information. */
4895 assert (! ieee_buffer_emptyp (&info->vars));
4896 if (! ieee_change_buffer (info, &info->vars))
4897 return FALSE;
4899 /* We put the pmisc records in a dummy procedure, just as the
4900 MRI compiler does. */
4901 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
4902 || ! ieee_write_byte (info, 6)
4903 || ! ieee_write_number (info, 0)
4904 || ! ieee_write_id (info, "__XRYCPP")
4905 || ! ieee_write_number (info, 0)
4906 || ! ieee_write_number (info, 0)
4907 || ! ieee_write_number (info, info->highaddr - 1)
4908 || ! ieee_append_buffer (info, &info->vars, &info->cxx)
4909 || ! ieee_change_buffer (info, &info->vars)
4910 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
4911 || ! ieee_write_number (info, info->highaddr - 1))
4912 return FALSE;
4915 if (! ieee_buffer_emptyp (&info->vars))
4917 if (! ieee_change_buffer (info, &info->vars)
4918 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
4919 return FALSE;
4922 if (info->pending_lineno_filename != NULL)
4924 /* Force out the pending line number. */
4925 if (! ieee_lineno ((void *) info, (const char *) NULL, 0, (bfd_vma) -1))
4926 return FALSE;
4928 if (! ieee_buffer_emptyp (&info->linenos))
4930 if (! ieee_change_buffer (info, &info->linenos)
4931 || ! ieee_write_byte (info, (int) ieee_be_record_enum))
4932 return FALSE;
4933 if (strcmp (info->filename, info->lineno_filename) != 0)
4935 /* We were not in the main file. We just closed the
4936 included line number block, and now we must close the
4937 main line number block. */
4938 if (! ieee_write_byte (info, (int) ieee_be_record_enum))
4939 return FALSE;
4943 if (! ieee_append_buffer (info, &info->data, &info->types)
4944 || ! ieee_append_buffer (info, &info->data, &info->vars)
4945 || ! ieee_append_buffer (info, &info->data, &info->linenos))
4946 return FALSE;
4948 /* Build BB10/BB11 blocks based on the ranges we recorded. */
4949 if (! ieee_change_buffer (info, &info->data))
4950 return FALSE;
4952 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
4953 || ! ieee_write_byte (info, 10)
4954 || ! ieee_write_number (info, 0)
4955 || ! ieee_write_id (info, info->modname)
4956 || ! ieee_write_id (info, "")
4957 || ! ieee_write_number (info, 0)
4958 || ! ieee_write_id (info, "GNU objcopy"))
4959 return FALSE;
4961 for (r = info->ranges; r != NULL; r = r->next)
4963 bfd_vma low, high;
4964 asection *s;
4965 int kind;
4967 low = r->low;
4968 high = r->high;
4970 /* Find the section corresponding to this range. */
4971 for (s = info->abfd->sections; s != NULL; s = s->next)
4973 if (bfd_get_section_vma (info->abfd, s) <= low
4974 && high <= (bfd_get_section_vma (info->abfd, s)
4975 + bfd_section_size (info->abfd, s)))
4976 break;
4979 if (s == NULL)
4981 /* Just ignore this range. */
4982 continue;
4985 /* Coalesce ranges if it seems reasonable. */
4986 while (r->next != NULL
4987 && high + 0x1000 >= r->next->low
4988 && (r->next->high
4989 <= (bfd_get_section_vma (info->abfd, s)
4990 + bfd_section_size (info->abfd, s))))
4992 r = r->next;
4993 high = r->high;
4996 if ((s->flags & SEC_CODE) != 0)
4997 kind = 1;
4998 else if ((s->flags & SEC_READONLY) != 0)
4999 kind = 3;
5000 else
5001 kind = 2;
5003 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
5004 || ! ieee_write_byte (info, 11)
5005 || ! ieee_write_number (info, 0)
5006 || ! ieee_write_id (info, "")
5007 || ! ieee_write_number (info, kind)
5008 || ! ieee_write_number (info, s->index + IEEE_SECTION_NUMBER_BASE)
5009 || ! ieee_write_number (info, low)
5010 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
5011 || ! ieee_write_number (info, high - low))
5012 return FALSE;
5014 /* Add this range to the list of global ranges. */
5015 if (! ieee_add_range (info, TRUE, low, high))
5016 return FALSE;
5019 if (! ieee_write_byte (info, (int) ieee_be_record_enum))
5020 return FALSE;
5022 return TRUE;
5025 /* Add BB11 blocks describing each range that we have not already
5026 described. */
5028 static void
5029 ieee_add_bb11_blocks (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *data)
5031 struct ieee_handle *info = (struct ieee_handle *) data;
5032 bfd_vma low, high;
5033 struct ieee_range *r;
5035 low = bfd_get_section_vma (abfd, sec);
5036 high = low + bfd_section_size (abfd, sec);
5038 /* Find the first range at or after this section. The ranges are
5039 sorted by address. */
5040 for (r = info->global_ranges; r != NULL; r = r->next)
5041 if (r->high > low)
5042 break;
5044 while (low < high)
5046 if (r == NULL || r->low >= high)
5048 if (! ieee_add_bb11 (info, sec, low, high))
5049 info->error = TRUE;
5050 return;
5053 if (low < r->low
5054 && r->low - low > 0x100)
5056 if (! ieee_add_bb11 (info, sec, low, r->low))
5058 info->error = TRUE;
5059 return;
5062 low = r->high;
5064 r = r->next;
5068 /* Add a single BB11 block for a range. We add it to info->vars. */
5070 static bfd_boolean
5071 ieee_add_bb11 (struct ieee_handle *info, asection *sec, bfd_vma low,
5072 bfd_vma high)
5074 int kind;
5076 if (! ieee_buffer_emptyp (&info->vars))
5078 if (! ieee_change_buffer (info, &info->vars))
5079 return FALSE;
5081 else
5083 const char *filename, *modname;
5084 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5085 const char *backslash;
5086 #endif
5087 char *c, *s;
5089 /* Start the enclosing BB10 block. */
5090 filename = bfd_get_filename (info->abfd);
5091 modname = strrchr (filename, '/');
5092 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5093 backslash = strrchr (filename, '\\');
5094 if (modname == NULL || (backslash != NULL && backslash > modname))
5095 modname = backslash;
5096 #endif
5098 if (modname != NULL)
5099 ++modname;
5100 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5101 else if (filename[0] && filename[1] == ':')
5102 modname = filename + 2;
5103 #endif
5104 else
5105 modname = filename;
5107 c = xstrdup (modname);
5108 s = strrchr (c, '.');
5109 if (s != NULL)
5110 *s = '\0';
5112 if (! ieee_change_buffer (info, &info->vars)
5113 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
5114 || ! ieee_write_byte (info, 10)
5115 || ! ieee_write_number (info, 0)
5116 || ! ieee_write_id (info, c)
5117 || ! ieee_write_id (info, "")
5118 || ! ieee_write_number (info, 0)
5119 || ! ieee_write_id (info, "GNU objcopy"))
5120 return FALSE;
5122 free (c);
5125 if ((sec->flags & SEC_CODE) != 0)
5126 kind = 1;
5127 else if ((sec->flags & SEC_READONLY) != 0)
5128 kind = 3;
5129 else
5130 kind = 2;
5132 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
5133 || ! ieee_write_byte (info, 11)
5134 || ! ieee_write_number (info, 0)
5135 || ! ieee_write_id (info, "")
5136 || ! ieee_write_number (info, kind)
5137 || ! ieee_write_number (info, sec->index + IEEE_SECTION_NUMBER_BASE)
5138 || ! ieee_write_number (info, low)
5139 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
5140 || ! ieee_write_number (info, high - low))
5141 return FALSE;
5143 return TRUE;
5146 /* Start recording information from a particular source file. This is
5147 used to record which file defined which types, variables, etc. It
5148 is not used for line numbers, since the lineno entry point passes
5149 down the file name anyhow. IEEE debugging information doesn't seem
5150 to store this information anywhere. */
5152 static bfd_boolean
5153 ieee_start_source (void *p ATTRIBUTE_UNUSED,
5154 const char *filename ATTRIBUTE_UNUSED)
5156 return TRUE;
5159 /* Make an empty type. */
5161 static bfd_boolean
5162 ieee_empty_type (void *p)
5164 struct ieee_handle *info = (struct ieee_handle *) p;
5166 return ieee_push_type (info, (int) builtin_unknown, 0, FALSE, FALSE);
5169 /* Make a void type. */
5171 static bfd_boolean
5172 ieee_void_type (void *p)
5174 struct ieee_handle *info = (struct ieee_handle *) p;
5176 return ieee_push_type (info, (int) builtin_void, 0, FALSE, FALSE);
5179 /* Make an integer type. */
5181 static bfd_boolean
5182 ieee_int_type (void *p, unsigned int size, bfd_boolean unsignedp)
5184 struct ieee_handle *info = (struct ieee_handle *) p;
5185 unsigned int indx;
5187 switch (size)
5189 case 1:
5190 indx = (int) builtin_signed_char;
5191 break;
5192 case 2:
5193 indx = (int) builtin_signed_short_int;
5194 break;
5195 case 4:
5196 indx = (int) builtin_signed_long;
5197 break;
5198 case 8:
5199 indx = (int) builtin_signed_long_long;
5200 break;
5201 default:
5202 fprintf (stderr, _("IEEE unsupported integer type size %u\n"), size);
5203 return FALSE;
5206 if (unsignedp)
5207 ++indx;
5209 return ieee_push_type (info, indx, size, unsignedp, FALSE);
5212 /* Make a floating point type. */
5214 static bfd_boolean
5215 ieee_float_type (void *p, unsigned int size)
5217 struct ieee_handle *info = (struct ieee_handle *) p;
5218 unsigned int indx;
5220 switch (size)
5222 case 4:
5223 indx = (int) builtin_float;
5224 break;
5225 case 8:
5226 indx = (int) builtin_double;
5227 break;
5228 case 12:
5229 /* FIXME: This size really depends upon the processor. */
5230 indx = (int) builtin_long_double;
5231 break;
5232 case 16:
5233 indx = (int) builtin_long_long_double;
5234 break;
5235 default:
5236 fprintf (stderr, _("IEEE unsupported float type size %u\n"), size);
5237 return FALSE;
5240 return ieee_push_type (info, indx, size, FALSE, FALSE);
5243 /* Make a complex type. */
5245 static bfd_boolean
5246 ieee_complex_type (void *p, unsigned int size)
5248 struct ieee_handle *info = (struct ieee_handle *) p;
5249 char code;
5251 switch (size)
5253 case 4:
5254 if (info->complex_float_index != 0)
5255 return ieee_push_type (info, info->complex_float_index, size * 2,
5256 FALSE, FALSE);
5257 code = 'c';
5258 break;
5259 case 12:
5260 case 16:
5261 /* These cases can be output by gcc -gstabs. Outputting the
5262 wrong type is better than crashing. */
5263 case 8:
5264 if (info->complex_double_index != 0)
5265 return ieee_push_type (info, info->complex_double_index, size * 2,
5266 FALSE, FALSE);
5267 code = 'd';
5268 break;
5269 default:
5270 fprintf (stderr, _("IEEE unsupported complex type size %u\n"), size);
5271 return FALSE;
5274 /* FIXME: I don't know what the string is for. */
5275 if (! ieee_define_type (info, size * 2, FALSE, FALSE)
5276 || ! ieee_write_number (info, code)
5277 || ! ieee_write_id (info, ""))
5278 return FALSE;
5280 if (size == 4)
5281 info->complex_float_index = info->type_stack->type.indx;
5282 else
5283 info->complex_double_index = info->type_stack->type.indx;
5285 return TRUE;
5288 /* Make a boolean type. IEEE doesn't support these, so we just make
5289 an integer type instead. */
5291 static bfd_boolean
5292 ieee_bool_type (void *p, unsigned int size)
5294 return ieee_int_type (p, size, TRUE);
5297 /* Make an enumeration. */
5299 static bfd_boolean
5300 ieee_enum_type (void *p, const char *tag, const char **names,
5301 bfd_signed_vma *vals)
5303 struct ieee_handle *info = (struct ieee_handle *) p;
5304 struct ieee_defined_enum *e;
5305 bfd_boolean localp, simple;
5306 unsigned int indx;
5307 int i = 0;
5309 localp = FALSE;
5310 indx = (unsigned int) -1;
5311 for (e = info->enums; e != NULL; e = e->next)
5313 if (tag == NULL)
5315 if (e->tag != NULL)
5316 continue;
5318 else
5320 if (e->tag == NULL
5321 || tag[0] != e->tag[0]
5322 || strcmp (tag, e->tag) != 0)
5323 continue;
5326 if (! e->defined)
5328 /* This enum tag has been seen but not defined. */
5329 indx = e->indx;
5330 break;
5333 if (names != NULL && e->names != NULL)
5335 for (i = 0; names[i] != NULL && e->names[i] != NULL; i++)
5337 if (names[i][0] != e->names[i][0]
5338 || vals[i] != e->vals[i]
5339 || strcmp (names[i], e->names[i]) != 0)
5340 break;
5344 if ((names == NULL && e->names == NULL)
5345 || (names != NULL
5346 && e->names != NULL
5347 && names[i] == NULL
5348 && e->names[i] == NULL))
5350 /* We've seen this enum before. */
5351 return ieee_push_type (info, e->indx, 0, TRUE, FALSE);
5354 if (tag != NULL)
5356 /* We've already seen an enum of the same name, so we must make
5357 sure to output this one locally. */
5358 localp = TRUE;
5359 break;
5363 /* If this is a simple enumeration, in which the values start at 0
5364 and always increment by 1, we can use type E. Otherwise we must
5365 use type N. */
5367 simple = TRUE;
5368 if (names != NULL)
5370 for (i = 0; names[i] != NULL; i++)
5372 if (vals[i] != i)
5374 simple = FALSE;
5375 break;
5380 if (! ieee_define_named_type (info, tag, indx, 0, TRUE, localp,
5381 (struct ieee_buflist *) NULL)
5382 || ! ieee_write_number (info, simple ? 'E' : 'N'))
5383 return FALSE;
5384 if (simple)
5386 /* FIXME: This is supposed to be the enumeration size, but we
5387 don't store that. */
5388 if (! ieee_write_number (info, 4))
5389 return FALSE;
5391 if (names != NULL)
5393 for (i = 0; names[i] != NULL; i++)
5395 if (! ieee_write_id (info, names[i]))
5396 return FALSE;
5397 if (! simple)
5399 if (! ieee_write_number (info, vals[i]))
5400 return FALSE;
5405 if (! localp)
5407 if (indx == (unsigned int) -1)
5409 e = (struct ieee_defined_enum *) xmalloc (sizeof *e);
5410 memset (e, 0, sizeof *e);
5411 e->indx = info->type_stack->type.indx;
5412 e->tag = tag;
5414 e->next = info->enums;
5415 info->enums = e;
5418 e->names = names;
5419 e->vals = vals;
5420 e->defined = TRUE;
5423 return TRUE;
5426 /* Make a pointer type. */
5428 static bfd_boolean
5429 ieee_pointer_type (void *p)
5431 struct ieee_handle *info = (struct ieee_handle *) p;
5432 bfd_boolean localp;
5433 unsigned int indx;
5434 struct ieee_modified_type *m = NULL;
5436 localp = info->type_stack->type.localp;
5437 indx = ieee_pop_type (info);
5439 /* A pointer to a simple builtin type can be obtained by adding 32.
5440 FIXME: Will this be a short pointer, and will that matter? */
5441 if (indx < 32)
5442 return ieee_push_type (info, indx + 32, 0, TRUE, FALSE);
5444 if (! localp)
5446 m = ieee_get_modified_info (p, indx);
5447 if (m == NULL)
5448 return FALSE;
5450 /* FIXME: The size should depend upon the architecture. */
5451 if (m->pointer > 0)
5452 return ieee_push_type (info, m->pointer, 4, TRUE, FALSE);
5455 if (! ieee_define_type (info, 4, TRUE, localp)
5456 || ! ieee_write_number (info, 'P')
5457 || ! ieee_write_number (info, indx))
5458 return FALSE;
5460 if (! localp)
5461 m->pointer = info->type_stack->type.indx;
5463 return TRUE;
5466 /* Make a function type. This will be called for a method, but we
5467 don't want to actually add it to the type table in that case. We
5468 handle this by defining the type in a private buffer, and only
5469 adding that buffer to the typedef block if we are going to use it. */
5471 static bfd_boolean
5472 ieee_function_type (void *p, int argcount, bfd_boolean varargs)
5474 struct ieee_handle *info = (struct ieee_handle *) p;
5475 bfd_boolean localp;
5476 unsigned int *args = NULL;
5477 int i;
5478 unsigned int retindx;
5479 struct ieee_buflist fndef;
5480 struct ieee_modified_type *m;
5482 localp = FALSE;
5484 if (argcount > 0)
5486 args = (unsigned int *) xmalloc (argcount * sizeof *args);
5487 for (i = argcount - 1; i >= 0; i--)
5489 if (info->type_stack->type.localp)
5490 localp = TRUE;
5491 args[i] = ieee_pop_type (info);
5494 else if (argcount < 0)
5495 varargs = FALSE;
5497 if (info->type_stack->type.localp)
5498 localp = TRUE;
5499 retindx = ieee_pop_type (info);
5501 m = NULL;
5502 if (argcount < 0 && ! localp)
5504 m = ieee_get_modified_info (p, retindx);
5505 if (m == NULL)
5506 return FALSE;
5508 if (m->function > 0)
5509 return ieee_push_type (info, m->function, 0, TRUE, FALSE);
5512 /* An attribute of 0x41 means that the frame and push mask are
5513 unknown. */
5514 if (! ieee_init_buffer (info, &fndef)
5515 || ! ieee_define_named_type (info, (const char *) NULL,
5516 (unsigned int) -1, 0, TRUE, localp,
5517 &fndef)
5518 || ! ieee_write_number (info, 'x')
5519 || ! ieee_write_number (info, 0x41)
5520 || ! ieee_write_number (info, 0)
5521 || ! ieee_write_number (info, 0)
5522 || ! ieee_write_number (info, retindx)
5523 || ! ieee_write_number (info, (bfd_vma) argcount + (varargs ? 1 : 0)))
5524 return FALSE;
5525 if (argcount > 0)
5527 for (i = 0; i < argcount; i++)
5528 if (! ieee_write_number (info, args[i]))
5529 return FALSE;
5530 free (args);
5532 if (varargs)
5534 /* A varargs function is represented by writing out the last
5535 argument as type void *, although this makes little sense. */
5536 if (! ieee_write_number (info, (bfd_vma) builtin_void + 32))
5537 return FALSE;
5540 if (! ieee_write_number (info, 0))
5541 return FALSE;
5543 /* We wrote the information into fndef, in case we don't need it.
5544 It will be appended to info->types by ieee_pop_type. */
5545 info->type_stack->type.fndef = fndef;
5547 if (m != NULL)
5548 m->function = info->type_stack->type.indx;
5550 return TRUE;
5553 /* Make a reference type. */
5555 static bfd_boolean
5556 ieee_reference_type (void *p)
5558 struct ieee_handle *info = (struct ieee_handle *) p;
5560 /* IEEE appears to record a normal pointer type, and then use a
5561 pmisc record to indicate that it is really a reference. */
5563 if (! ieee_pointer_type (p))
5564 return FALSE;
5565 info->type_stack->type.referencep = TRUE;
5566 return TRUE;
5569 /* Make a range type. */
5571 static bfd_boolean
5572 ieee_range_type (void *p, bfd_signed_vma low, bfd_signed_vma high)
5574 struct ieee_handle *info = (struct ieee_handle *) p;
5575 unsigned int size;
5576 bfd_boolean unsignedp, localp;
5578 size = info->type_stack->type.size;
5579 unsignedp = info->type_stack->type.unsignedp;
5580 localp = info->type_stack->type.localp;
5581 ieee_pop_unused_type (info);
5582 return (ieee_define_type (info, size, unsignedp, localp)
5583 && ieee_write_number (info, 'R')
5584 && ieee_write_number (info, (bfd_vma) low)
5585 && ieee_write_number (info, (bfd_vma) high)
5586 && ieee_write_number (info, unsignedp ? 0 : 1)
5587 && ieee_write_number (info, size));
5590 /* Make an array type. */
5592 static bfd_boolean
5593 ieee_array_type (void *p, bfd_signed_vma low, bfd_signed_vma high,
5594 bfd_boolean stringp ATTRIBUTE_UNUSED)
5596 struct ieee_handle *info = (struct ieee_handle *) p;
5597 unsigned int eleindx;
5598 bfd_boolean localp;
5599 unsigned int size;
5600 struct ieee_modified_type *m = NULL;
5601 struct ieee_modified_array_type *a;
5603 /* IEEE does not store the range, so we just ignore it. */
5604 ieee_pop_unused_type (info);
5605 localp = info->type_stack->type.localp;
5606 size = info->type_stack->type.size;
5607 eleindx = ieee_pop_type (info);
5609 /* If we don't know the range, treat the size as exactly one
5610 element. */
5611 if (low < high)
5612 size *= (high - low) + 1;
5614 if (! localp)
5616 m = ieee_get_modified_info (info, eleindx);
5617 if (m == NULL)
5618 return FALSE;
5620 for (a = m->arrays; a != NULL; a = a->next)
5622 if (a->low == low && a->high == high)
5623 return ieee_push_type (info, a->indx, size, FALSE, FALSE);
5627 if (! ieee_define_type (info, size, FALSE, localp)
5628 || ! ieee_write_number (info, low == 0 ? 'Z' : 'C')
5629 || ! ieee_write_number (info, eleindx))
5630 return FALSE;
5631 if (low != 0)
5633 if (! ieee_write_number (info, low))
5634 return FALSE;
5637 if (! ieee_write_number (info, high + 1))
5638 return FALSE;
5640 if (! localp)
5642 a = (struct ieee_modified_array_type *) xmalloc (sizeof *a);
5643 memset (a, 0, sizeof *a);
5645 a->indx = info->type_stack->type.indx;
5646 a->low = low;
5647 a->high = high;
5649 a->next = m->arrays;
5650 m->arrays = a;
5653 return TRUE;
5656 /* Make a set type. */
5658 static bfd_boolean
5659 ieee_set_type (void *p, bfd_boolean bitstringp ATTRIBUTE_UNUSED)
5661 struct ieee_handle *info = (struct ieee_handle *) p;
5662 bfd_boolean localp;
5663 unsigned int eleindx;
5665 localp = info->type_stack->type.localp;
5666 eleindx = ieee_pop_type (info);
5668 /* FIXME: We don't know the size, so we just use 4. */
5670 return (ieee_define_type (info, 0, TRUE, localp)
5671 && ieee_write_number (info, 's')
5672 && ieee_write_number (info, 4)
5673 && ieee_write_number (info, eleindx));
5676 /* Make an offset type. */
5678 static bfd_boolean
5679 ieee_offset_type (void *p)
5681 struct ieee_handle *info = (struct ieee_handle *) p;
5682 unsigned int targetindx, baseindx;
5684 targetindx = ieee_pop_type (info);
5685 baseindx = ieee_pop_type (info);
5687 /* FIXME: The MRI C++ compiler does not appear to generate any
5688 useful type information about an offset type. It just records a
5689 pointer to member as an integer. The MRI/HP IEEE spec does
5690 describe a pmisc record which can be used for a pointer to
5691 member. Unfortunately, it does not describe the target type,
5692 which seems pretty important. I'm going to punt this for now. */
5694 return ieee_int_type (p, 4, TRUE);
5697 /* Make a method type. */
5699 static bfd_boolean
5700 ieee_method_type (void *p, bfd_boolean domain, int argcount,
5701 bfd_boolean varargs)
5703 struct ieee_handle *info = (struct ieee_handle *) p;
5705 /* FIXME: The MRI/HP IEEE spec defines a pmisc record to use for a
5706 method, but the definition is incomplete. We just output an 'x'
5707 type. */
5709 if (domain)
5710 ieee_pop_unused_type (info);
5712 return ieee_function_type (p, argcount, varargs);
5715 /* Make a const qualified type. */
5717 static bfd_boolean
5718 ieee_const_type (void *p)
5720 struct ieee_handle *info = (struct ieee_handle *) p;
5721 unsigned int size;
5722 bfd_boolean unsignedp, localp;
5723 unsigned int indx;
5724 struct ieee_modified_type *m = NULL;
5726 size = info->type_stack->type.size;
5727 unsignedp = info->type_stack->type.unsignedp;
5728 localp = info->type_stack->type.localp;
5729 indx = ieee_pop_type (info);
5731 if (! localp)
5733 m = ieee_get_modified_info (info, indx);
5734 if (m == NULL)
5735 return FALSE;
5737 if (m->const_qualified > 0)
5738 return ieee_push_type (info, m->const_qualified, size, unsignedp,
5739 FALSE);
5742 if (! ieee_define_type (info, size, unsignedp, localp)
5743 || ! ieee_write_number (info, 'n')
5744 || ! ieee_write_number (info, 1)
5745 || ! ieee_write_number (info, indx))
5746 return FALSE;
5748 if (! localp)
5749 m->const_qualified = info->type_stack->type.indx;
5751 return TRUE;
5754 /* Make a volatile qualified type. */
5756 static bfd_boolean
5757 ieee_volatile_type (void *p)
5759 struct ieee_handle *info = (struct ieee_handle *) p;
5760 unsigned int size;
5761 bfd_boolean unsignedp, localp;
5762 unsigned int indx;
5763 struct ieee_modified_type *m = NULL;
5765 size = info->type_stack->type.size;
5766 unsignedp = info->type_stack->type.unsignedp;
5767 localp = info->type_stack->type.localp;
5768 indx = ieee_pop_type (info);
5770 if (! localp)
5772 m = ieee_get_modified_info (info, indx);
5773 if (m == NULL)
5774 return FALSE;
5776 if (m->volatile_qualified > 0)
5777 return ieee_push_type (info, m->volatile_qualified, size, unsignedp,
5778 FALSE);
5781 if (! ieee_define_type (info, size, unsignedp, localp)
5782 || ! ieee_write_number (info, 'n')
5783 || ! ieee_write_number (info, 2)
5784 || ! ieee_write_number (info, indx))
5785 return FALSE;
5787 if (! localp)
5788 m->volatile_qualified = info->type_stack->type.indx;
5790 return TRUE;
5793 /* Convert an enum debug_visibility into a CXXFLAGS value. */
5795 static unsigned int
5796 ieee_vis_to_flags (enum debug_visibility visibility)
5798 switch (visibility)
5800 default:
5801 abort ();
5802 case DEBUG_VISIBILITY_PUBLIC:
5803 return CXXFLAGS_VISIBILITY_PUBLIC;
5804 case DEBUG_VISIBILITY_PRIVATE:
5805 return CXXFLAGS_VISIBILITY_PRIVATE;
5806 case DEBUG_VISIBILITY_PROTECTED:
5807 return CXXFLAGS_VISIBILITY_PROTECTED;
5809 /*NOTREACHED*/
5812 /* Start defining a struct type. We build it in the strdef field on
5813 the stack, to avoid confusing type definitions required by the
5814 fields with the struct type itself. */
5816 static bfd_boolean
5817 ieee_start_struct_type (void *p, const char *tag, unsigned int id,
5818 bfd_boolean structp, unsigned int size)
5820 struct ieee_handle *info = (struct ieee_handle *) p;
5821 bfd_boolean localp, ignorep;
5822 bfd_boolean copy;
5823 char ab[20];
5824 const char *look;
5825 struct ieee_name_type_hash_entry *h;
5826 struct ieee_name_type *nt, *ntlook;
5827 struct ieee_buflist strdef;
5829 localp = FALSE;
5830 ignorep = FALSE;
5832 /* We need to create a tag for internal use even if we don't want
5833 one for external use. This will let us refer to an anonymous
5834 struct. */
5835 if (tag != NULL)
5837 look = tag;
5838 copy = FALSE;
5840 else
5842 sprintf (ab, "__anon%u", id);
5843 look = ab;
5844 copy = TRUE;
5847 /* If we already have references to the tag, we must use the
5848 existing type index. */
5849 h = ieee_name_type_hash_lookup (&info->tags, look, TRUE, copy);
5850 if (h == NULL)
5851 return FALSE;
5853 nt = NULL;
5854 for (ntlook = h->types; ntlook != NULL; ntlook = ntlook->next)
5856 if (ntlook->id == id)
5857 nt = ntlook;
5858 else if (! ntlook->type.localp)
5860 /* We are creating a duplicate definition of a globally
5861 defined tag. Force it to be local to avoid
5862 confusion. */
5863 localp = TRUE;
5867 if (nt != NULL)
5869 assert (localp == nt->type.localp);
5870 if (nt->kind == DEBUG_KIND_ILLEGAL && ! localp)
5872 /* We've already seen a global definition of the type.
5873 Ignore this new definition. */
5874 ignorep = TRUE;
5877 else
5879 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
5880 memset (nt, 0, sizeof *nt);
5881 nt->id = id;
5882 nt->type.name = h->root.string;
5883 nt->next = h->types;
5884 h->types = nt;
5885 nt->type.indx = info->type_indx;
5886 ++info->type_indx;
5889 nt->kind = DEBUG_KIND_ILLEGAL;
5891 if (! ieee_init_buffer (info, &strdef)
5892 || ! ieee_define_named_type (info, tag, nt->type.indx, size, TRUE,
5893 localp, &strdef)
5894 || ! ieee_write_number (info, structp ? 'S' : 'U')
5895 || ! ieee_write_number (info, size))
5896 return FALSE;
5898 if (! ignorep)
5900 const char *hold;
5902 /* We never want nt->type.name to be NULL. We want the rest of
5903 the type to be the object set up on the type stack; it will
5904 have a NULL name if tag is NULL. */
5905 hold = nt->type.name;
5906 nt->type = info->type_stack->type;
5907 nt->type.name = hold;
5910 info->type_stack->type.name = tag;
5911 info->type_stack->type.strdef = strdef;
5912 info->type_stack->type.ignorep = ignorep;
5914 return TRUE;
5917 /* Add a field to a struct. */
5919 static bfd_boolean
5920 ieee_struct_field (void *p, const char *name, bfd_vma bitpos, bfd_vma bitsize,
5921 enum debug_visibility visibility)
5923 struct ieee_handle *info = (struct ieee_handle *) p;
5924 unsigned int size;
5925 bfd_boolean unsignedp;
5926 bfd_boolean referencep;
5927 bfd_boolean localp;
5928 unsigned int indx;
5929 bfd_vma offset;
5931 assert (info->type_stack != NULL
5932 && info->type_stack->next != NULL
5933 && ! ieee_buffer_emptyp (&info->type_stack->next->type.strdef));
5935 /* If we are ignoring this struct definition, just pop and ignore
5936 the type. */
5937 if (info->type_stack->next->type.ignorep)
5939 ieee_pop_unused_type (info);
5940 return TRUE;
5943 size = info->type_stack->type.size;
5944 unsignedp = info->type_stack->type.unsignedp;
5945 referencep = info->type_stack->type.referencep;
5946 localp = info->type_stack->type.localp;
5947 indx = ieee_pop_type (info);
5949 if (localp)
5950 info->type_stack->type.localp = TRUE;
5952 if (info->type_stack->type.classdef != NULL)
5954 unsigned int flags;
5955 unsigned int nindx;
5957 /* This is a class. We must add a description of this field to
5958 the class records we are building. */
5960 flags = ieee_vis_to_flags (visibility);
5961 nindx = info->type_stack->type.classdef->indx;
5962 if (! ieee_change_buffer (info,
5963 &info->type_stack->type.classdef->pmiscbuf)
5964 || ! ieee_write_asn (info, nindx, 'd')
5965 || ! ieee_write_asn (info, nindx, flags)
5966 || ! ieee_write_atn65 (info, nindx, name)
5967 || ! ieee_write_atn65 (info, nindx, name))
5968 return FALSE;
5969 info->type_stack->type.classdef->pmisccount += 4;
5971 if (referencep)
5973 unsigned int nindx;
5975 /* We need to output a record recording that this field is
5976 really of reference type. We put this on the refs field
5977 of classdef, so that it can be appended to the C++
5978 records after the class is defined. */
5980 nindx = info->name_indx;
5981 ++info->name_indx;
5983 if (! ieee_change_buffer (info,
5984 &info->type_stack->type.classdef->refs)
5985 || ! ieee_write_byte (info, (int) ieee_nn_record)
5986 || ! ieee_write_number (info, nindx)
5987 || ! ieee_write_id (info, "")
5988 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
5989 || ! ieee_write_number (info, nindx)
5990 || ! ieee_write_number (info, 0)
5991 || ! ieee_write_number (info, 62)
5992 || ! ieee_write_number (info, 80)
5993 || ! ieee_write_number (info, 4)
5994 || ! ieee_write_asn (info, nindx, 'R')
5995 || ! ieee_write_asn (info, nindx, 3)
5996 || ! ieee_write_atn65 (info, nindx, info->type_stack->type.name)
5997 || ! ieee_write_atn65 (info, nindx, name))
5998 return FALSE;
6002 /* If the bitsize doesn't match the expected size, we need to output
6003 a bitfield type. */
6004 if (size == 0 || bitsize == 0 || bitsize == size * 8)
6005 offset = bitpos / 8;
6006 else
6008 if (! ieee_define_type (info, 0, unsignedp,
6009 info->type_stack->type.localp)
6010 || ! ieee_write_number (info, 'g')
6011 || ! ieee_write_number (info, unsignedp ? 0 : 1)
6012 || ! ieee_write_number (info, bitsize)
6013 || ! ieee_write_number (info, indx))
6014 return FALSE;
6015 indx = ieee_pop_type (info);
6016 offset = bitpos;
6019 /* Switch to the struct we are building in order to output this
6020 field definition. */
6021 return (ieee_change_buffer (info, &info->type_stack->type.strdef)
6022 && ieee_write_id (info, name)
6023 && ieee_write_number (info, indx)
6024 && ieee_write_number (info, offset));
6027 /* Finish up a struct type. */
6029 static bfd_boolean
6030 ieee_end_struct_type (void *p)
6032 struct ieee_handle *info = (struct ieee_handle *) p;
6033 struct ieee_buflist *pb;
6035 assert (info->type_stack != NULL
6036 && ! ieee_buffer_emptyp (&info->type_stack->type.strdef));
6038 /* If we were ignoring this struct definition because it was a
6039 duplicate definition, just through away whatever bytes we have
6040 accumulated. Leave the type on the stack. */
6041 if (info->type_stack->type.ignorep)
6042 return TRUE;
6044 /* If this is not a duplicate definition of this tag, then localp
6045 will be FALSE, and we can put it in the global type block.
6046 FIXME: We should avoid outputting duplicate definitions which are
6047 the same. */
6048 if (! info->type_stack->type.localp)
6050 /* Make sure we have started the global type block. */
6051 if (ieee_buffer_emptyp (&info->global_types))
6053 if (! ieee_change_buffer (info, &info->global_types)
6054 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
6055 || ! ieee_write_byte (info, 2)
6056 || ! ieee_write_number (info, 0)
6057 || ! ieee_write_id (info, ""))
6058 return FALSE;
6060 pb = &info->global_types;
6062 else
6064 /* Make sure we have started the types block. */
6065 if (ieee_buffer_emptyp (&info->types))
6067 if (! ieee_change_buffer (info, &info->types)
6068 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
6069 || ! ieee_write_byte (info, 1)
6070 || ! ieee_write_number (info, 0)
6071 || ! ieee_write_id (info, info->modname))
6072 return FALSE;
6074 pb = &info->types;
6077 /* Append the struct definition to the types. */
6078 if (! ieee_append_buffer (info, pb, &info->type_stack->type.strdef)
6079 || ! ieee_init_buffer (info, &info->type_stack->type.strdef))
6080 return FALSE;
6082 /* Leave the struct on the type stack. */
6084 return TRUE;
6087 /* Start a class type. */
6089 static bfd_boolean
6090 ieee_start_class_type (void *p, const char *tag, unsigned int id,
6091 bfd_boolean structp, unsigned int size,
6092 bfd_boolean vptr, bfd_boolean ownvptr)
6094 struct ieee_handle *info = (struct ieee_handle *) p;
6095 const char *vclass;
6096 struct ieee_buflist pmiscbuf;
6097 unsigned int indx;
6098 struct ieee_type_class *classdef;
6100 /* A C++ class is output as a C++ struct along with a set of pmisc
6101 records describing the class. */
6103 /* We need to have a name so that we can associate the struct and
6104 the class. */
6105 if (tag == NULL)
6107 char *t;
6109 t = (char *) xmalloc (20);
6110 sprintf (t, "__anon%u", id);
6111 tag = t;
6114 /* We can't write out the virtual table information until we have
6115 finished the class, because we don't know the virtual table size.
6116 We get the size from the largest voffset we see. */
6117 vclass = NULL;
6118 if (vptr && ! ownvptr)
6120 vclass = info->type_stack->type.name;
6121 assert (vclass != NULL);
6122 /* We don't call ieee_pop_unused_type, since the class should
6123 get defined. */
6124 (void) ieee_pop_type (info);
6127 if (! ieee_start_struct_type (p, tag, id, structp, size))
6128 return FALSE;
6130 indx = info->name_indx;
6131 ++info->name_indx;
6133 /* We write out pmisc records into the classdef field. We will
6134 write out the pmisc start after we know the number of records we
6135 need. */
6136 if (! ieee_init_buffer (info, &pmiscbuf)
6137 || ! ieee_change_buffer (info, &pmiscbuf)
6138 || ! ieee_write_asn (info, indx, 'T')
6139 || ! ieee_write_asn (info, indx, structp ? 'o' : 'u')
6140 || ! ieee_write_atn65 (info, indx, tag))
6141 return FALSE;
6143 classdef = (struct ieee_type_class *) xmalloc (sizeof *classdef);
6144 memset (classdef, 0, sizeof *classdef);
6146 classdef->indx = indx;
6147 classdef->pmiscbuf = pmiscbuf;
6148 classdef->pmisccount = 3;
6149 classdef->vclass = vclass;
6150 classdef->ownvptr = ownvptr;
6152 info->type_stack->type.classdef = classdef;
6154 return TRUE;
6157 /* Add a static member to a class. */
6159 static bfd_boolean
6160 ieee_class_static_member (void *p, const char *name, const char *physname,
6161 enum debug_visibility visibility)
6163 struct ieee_handle *info = (struct ieee_handle *) p;
6164 unsigned int flags;
6165 unsigned int nindx;
6167 /* We don't care about the type. Hopefully there will be a call to
6168 ieee_variable declaring the physical name and the type, since
6169 that is where an IEEE consumer must get the type. */
6170 ieee_pop_unused_type (info);
6172 assert (info->type_stack != NULL
6173 && info->type_stack->type.classdef != NULL);
6175 flags = ieee_vis_to_flags (visibility);
6176 flags |= CXXFLAGS_STATIC;
6178 nindx = info->type_stack->type.classdef->indx;
6180 if (! ieee_change_buffer (info, &info->type_stack->type.classdef->pmiscbuf)
6181 || ! ieee_write_asn (info, nindx, 'd')
6182 || ! ieee_write_asn (info, nindx, flags)
6183 || ! ieee_write_atn65 (info, nindx, name)
6184 || ! ieee_write_atn65 (info, nindx, physname))
6185 return FALSE;
6186 info->type_stack->type.classdef->pmisccount += 4;
6188 return TRUE;
6191 /* Add a base class to a class. */
6193 static bfd_boolean
6194 ieee_class_baseclass (void *p, bfd_vma bitpos, bfd_boolean virtual,
6195 enum debug_visibility visibility)
6197 struct ieee_handle *info = (struct ieee_handle *) p;
6198 const char *bname;
6199 bfd_boolean localp;
6200 unsigned int bindx;
6201 char *fname;
6202 unsigned int flags;
6203 unsigned int nindx;
6205 assert (info->type_stack != NULL
6206 && info->type_stack->type.name != NULL
6207 && info->type_stack->next != NULL
6208 && info->type_stack->next->type.classdef != NULL
6209 && ! ieee_buffer_emptyp (&info->type_stack->next->type.strdef));
6211 bname = info->type_stack->type.name;
6212 localp = info->type_stack->type.localp;
6213 bindx = ieee_pop_type (info);
6215 /* We are currently defining both a struct and a class. We must
6216 write out a field definition in the struct which holds the base
6217 class. The stabs debugging reader will create a field named
6218 _vb$CLASS for a virtual base class, so we just use that. FIXME:
6219 we should not depend upon a detail of stabs debugging. */
6220 if (virtual)
6222 fname = (char *) xmalloc (strlen (bname) + sizeof "_vb$");
6223 sprintf (fname, "_vb$%s", bname);
6224 flags = BASEFLAGS_VIRTUAL;
6226 else
6228 if (localp)
6229 info->type_stack->type.localp = TRUE;
6231 fname = (char *) xmalloc (strlen (bname) + sizeof "_b$");
6232 sprintf (fname, "_b$%s", bname);
6234 if (! ieee_change_buffer (info, &info->type_stack->type.strdef)
6235 || ! ieee_write_id (info, fname)
6236 || ! ieee_write_number (info, bindx)
6237 || ! ieee_write_number (info, bitpos / 8))
6238 return FALSE;
6239 flags = 0;
6242 if (visibility == DEBUG_VISIBILITY_PRIVATE)
6243 flags |= BASEFLAGS_PRIVATE;
6245 nindx = info->type_stack->type.classdef->indx;
6247 if (! ieee_change_buffer (info, &info->type_stack->type.classdef->pmiscbuf)
6248 || ! ieee_write_asn (info, nindx, 'b')
6249 || ! ieee_write_asn (info, nindx, flags)
6250 || ! ieee_write_atn65 (info, nindx, bname)
6251 || ! ieee_write_asn (info, nindx, 0)
6252 || ! ieee_write_atn65 (info, nindx, fname))
6253 return FALSE;
6254 info->type_stack->type.classdef->pmisccount += 5;
6256 free (fname);
6258 return TRUE;
6261 /* Start building a method for a class. */
6263 static bfd_boolean
6264 ieee_class_start_method (void *p, const char *name)
6266 struct ieee_handle *info = (struct ieee_handle *) p;
6268 assert (info->type_stack != NULL
6269 && info->type_stack->type.classdef != NULL
6270 && info->type_stack->type.classdef->method == NULL);
6272 info->type_stack->type.classdef->method = name;
6274 return TRUE;
6277 /* Define a new method variant, either static or not. */
6279 static bfd_boolean
6280 ieee_class_method_var (struct ieee_handle *info, const char *physname,
6281 enum debug_visibility visibility,
6282 bfd_boolean staticp, bfd_boolean constp,
6283 bfd_boolean volatilep, bfd_vma voffset,
6284 bfd_boolean context)
6286 unsigned int flags;
6287 unsigned int nindx;
6288 bfd_boolean virtual;
6290 /* We don't need the type of the method. An IEEE consumer which
6291 wants the type must track down the function by the physical name
6292 and get the type from that. */
6293 ieee_pop_unused_type (info);
6295 /* We don't use the context. FIXME: We probably ought to use it to
6296 adjust the voffset somehow, but I don't really know how. */
6297 if (context)
6298 ieee_pop_unused_type (info);
6300 assert (info->type_stack != NULL
6301 && info->type_stack->type.classdef != NULL
6302 && info->type_stack->type.classdef->method != NULL);
6304 flags = ieee_vis_to_flags (visibility);
6306 /* FIXME: We never set CXXFLAGS_OVERRIDE, CXXFLAGS_OPERATOR,
6307 CXXFLAGS_CTORDTOR, CXXFLAGS_CTOR, or CXXFLAGS_INLINE. */
6309 if (staticp)
6310 flags |= CXXFLAGS_STATIC;
6311 if (constp)
6312 flags |= CXXFLAGS_CONST;
6313 if (volatilep)
6314 flags |= CXXFLAGS_VOLATILE;
6316 nindx = info->type_stack->type.classdef->indx;
6318 virtual = context || voffset > 0;
6320 if (! ieee_change_buffer (info,
6321 &info->type_stack->type.classdef->pmiscbuf)
6322 || ! ieee_write_asn (info, nindx, virtual ? 'v' : 'm')
6323 || ! ieee_write_asn (info, nindx, flags)
6324 || ! ieee_write_atn65 (info, nindx,
6325 info->type_stack->type.classdef->method)
6326 || ! ieee_write_atn65 (info, nindx, physname))
6327 return FALSE;
6329 if (virtual)
6331 if (voffset > info->type_stack->type.classdef->voffset)
6332 info->type_stack->type.classdef->voffset = voffset;
6333 if (! ieee_write_asn (info, nindx, voffset))
6334 return FALSE;
6335 ++info->type_stack->type.classdef->pmisccount;
6338 if (! ieee_write_asn (info, nindx, 0))
6339 return FALSE;
6341 info->type_stack->type.classdef->pmisccount += 5;
6343 return TRUE;
6346 /* Define a new method variant. */
6348 static bfd_boolean
6349 ieee_class_method_variant (void *p, const char *physname,
6350 enum debug_visibility visibility,
6351 bfd_boolean constp, bfd_boolean volatilep,
6352 bfd_vma voffset, bfd_boolean context)
6354 struct ieee_handle *info = (struct ieee_handle *) p;
6356 return ieee_class_method_var (info, physname, visibility, FALSE, constp,
6357 volatilep, voffset, context);
6360 /* Define a new static method variant. */
6362 static bfd_boolean
6363 ieee_class_static_method_variant (void *p, const char *physname,
6364 enum debug_visibility visibility,
6365 bfd_boolean constp, bfd_boolean volatilep)
6367 struct ieee_handle *info = (struct ieee_handle *) p;
6369 return ieee_class_method_var (info, physname, visibility, TRUE, constp,
6370 volatilep, 0, FALSE);
6373 /* Finish up a method. */
6375 static bfd_boolean
6376 ieee_class_end_method (void *p)
6378 struct ieee_handle *info = (struct ieee_handle *) p;
6380 assert (info->type_stack != NULL
6381 && info->type_stack->type.classdef != NULL
6382 && info->type_stack->type.classdef->method != NULL);
6384 info->type_stack->type.classdef->method = NULL;
6386 return TRUE;
6389 /* Finish up a class. */
6391 static bfd_boolean
6392 ieee_end_class_type (void *p)
6394 struct ieee_handle *info = (struct ieee_handle *) p;
6395 unsigned int nindx;
6397 assert (info->type_stack != NULL
6398 && info->type_stack->type.classdef != NULL);
6400 /* If we were ignoring this class definition because it was a
6401 duplicate definition, just through away whatever bytes we have
6402 accumulated. Leave the type on the stack. */
6403 if (info->type_stack->type.ignorep)
6404 return TRUE;
6406 nindx = info->type_stack->type.classdef->indx;
6408 /* If we have a virtual table, we can write out the information now. */
6409 if (info->type_stack->type.classdef->vclass != NULL
6410 || info->type_stack->type.classdef->ownvptr)
6412 if (! ieee_change_buffer (info,
6413 &info->type_stack->type.classdef->pmiscbuf)
6414 || ! ieee_write_asn (info, nindx, 'z')
6415 || ! ieee_write_atn65 (info, nindx, "")
6416 || ! ieee_write_asn (info, nindx,
6417 info->type_stack->type.classdef->voffset))
6418 return FALSE;
6419 if (info->type_stack->type.classdef->ownvptr)
6421 if (! ieee_write_atn65 (info, nindx, ""))
6422 return FALSE;
6424 else
6426 if (! ieee_write_atn65 (info, nindx,
6427 info->type_stack->type.classdef->vclass))
6428 return FALSE;
6430 if (! ieee_write_asn (info, nindx, 0))
6431 return FALSE;
6432 info->type_stack->type.classdef->pmisccount += 5;
6435 /* Now that we know the number of pmisc records, we can write out
6436 the atn62 which starts the pmisc records, and append them to the
6437 C++ buffers. */
6439 if (! ieee_change_buffer (info, &info->cxx)
6440 || ! ieee_write_byte (info, (int) ieee_nn_record)
6441 || ! ieee_write_number (info, nindx)
6442 || ! ieee_write_id (info, "")
6443 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
6444 || ! ieee_write_number (info, nindx)
6445 || ! ieee_write_number (info, 0)
6446 || ! ieee_write_number (info, 62)
6447 || ! ieee_write_number (info, 80)
6448 || ! ieee_write_number (info,
6449 info->type_stack->type.classdef->pmisccount))
6450 return FALSE;
6452 if (! ieee_append_buffer (info, &info->cxx,
6453 &info->type_stack->type.classdef->pmiscbuf))
6454 return FALSE;
6455 if (! ieee_buffer_emptyp (&info->type_stack->type.classdef->refs))
6457 if (! ieee_append_buffer (info, &info->cxx,
6458 &info->type_stack->type.classdef->refs))
6459 return FALSE;
6462 return ieee_end_struct_type (p);
6465 /* Push a previously seen typedef onto the type stack. */
6467 static bfd_boolean
6468 ieee_typedef_type (void *p, const char *name)
6470 struct ieee_handle *info = (struct ieee_handle *) p;
6471 struct ieee_name_type_hash_entry *h;
6472 struct ieee_name_type *nt;
6474 h = ieee_name_type_hash_lookup (&info->typedefs, name, FALSE, FALSE);
6476 /* h should never be NULL, since that would imply that the generic
6477 debugging code has asked for a typedef which it has not yet
6478 defined. */
6479 assert (h != NULL);
6481 /* We always use the most recently defined type for this name, which
6482 will be the first one on the list. */
6484 nt = h->types;
6485 if (! ieee_push_type (info, nt->type.indx, nt->type.size,
6486 nt->type.unsignedp, nt->type.localp))
6487 return FALSE;
6489 /* Copy over any other type information we may have. */
6490 info->type_stack->type = nt->type;
6492 return TRUE;
6495 /* Push a tagged type onto the type stack. */
6497 static bfd_boolean
6498 ieee_tag_type (void *p, const char *name, unsigned int id,
6499 enum debug_type_kind kind)
6501 struct ieee_handle *info = (struct ieee_handle *) p;
6502 bfd_boolean localp;
6503 bfd_boolean copy;
6504 char ab[20];
6505 struct ieee_name_type_hash_entry *h;
6506 struct ieee_name_type *nt;
6508 if (kind == DEBUG_KIND_ENUM)
6510 struct ieee_defined_enum *e;
6512 if (name == NULL)
6513 abort ();
6514 for (e = info->enums; e != NULL; e = e->next)
6515 if (e->tag != NULL && strcmp (e->tag, name) == 0)
6516 return ieee_push_type (info, e->indx, 0, TRUE, FALSE);
6518 e = (struct ieee_defined_enum *) xmalloc (sizeof *e);
6519 memset (e, 0, sizeof *e);
6521 e->indx = info->type_indx;
6522 ++info->type_indx;
6523 e->tag = name;
6524 e->defined = FALSE;
6526 e->next = info->enums;
6527 info->enums = e;
6529 return ieee_push_type (info, e->indx, 0, TRUE, FALSE);
6532 localp = FALSE;
6534 copy = FALSE;
6535 if (name == NULL)
6537 sprintf (ab, "__anon%u", id);
6538 name = ab;
6539 copy = TRUE;
6542 h = ieee_name_type_hash_lookup (&info->tags, name, TRUE, copy);
6543 if (h == NULL)
6544 return FALSE;
6546 for (nt = h->types; nt != NULL; nt = nt->next)
6548 if (nt->id == id)
6550 if (! ieee_push_type (info, nt->type.indx, nt->type.size,
6551 nt->type.unsignedp, nt->type.localp))
6552 return FALSE;
6553 /* Copy over any other type information we may have. */
6554 info->type_stack->type = nt->type;
6555 return TRUE;
6558 if (! nt->type.localp)
6560 /* This is a duplicate of a global type, so it must be
6561 local. */
6562 localp = TRUE;
6566 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
6567 memset (nt, 0, sizeof *nt);
6569 nt->id = id;
6570 nt->type.name = h->root.string;
6571 nt->type.indx = info->type_indx;
6572 nt->type.localp = localp;
6573 ++info->type_indx;
6574 nt->kind = kind;
6576 nt->next = h->types;
6577 h->types = nt;
6579 if (! ieee_push_type (info, nt->type.indx, 0, FALSE, localp))
6580 return FALSE;
6582 info->type_stack->type.name = h->root.string;
6584 return TRUE;
6587 /* Output a typedef. */
6589 static bfd_boolean
6590 ieee_typdef (void *p, const char *name)
6592 struct ieee_handle *info = (struct ieee_handle *) p;
6593 struct ieee_write_type type;
6594 unsigned int indx;
6595 bfd_boolean found;
6596 bfd_boolean localp;
6597 struct ieee_name_type_hash_entry *h;
6598 struct ieee_name_type *nt;
6600 type = info->type_stack->type;
6601 indx = type.indx;
6603 /* If this is a simple builtin type using a builtin name, we don't
6604 want to output the typedef itself. We also want to change the
6605 type index to correspond to the name being used. We recognize
6606 names used in stabs debugging output even if they don't exactly
6607 correspond to the names used for the IEEE builtin types. */
6608 found = FALSE;
6609 if (indx <= (unsigned int) builtin_bcd_float)
6611 switch ((enum builtin_types) indx)
6613 default:
6614 break;
6616 case builtin_void:
6617 if (strcmp (name, "void") == 0)
6618 found = TRUE;
6619 break;
6621 case builtin_signed_char:
6622 case builtin_char:
6623 if (strcmp (name, "signed char") == 0)
6625 indx = (unsigned int) builtin_signed_char;
6626 found = TRUE;
6628 else if (strcmp (name, "char") == 0)
6630 indx = (unsigned int) builtin_char;
6631 found = TRUE;
6633 break;
6635 case builtin_unsigned_char:
6636 if (strcmp (name, "unsigned char") == 0)
6637 found = TRUE;
6638 break;
6640 case builtin_signed_short_int:
6641 case builtin_short:
6642 case builtin_short_int:
6643 case builtin_signed_short:
6644 if (strcmp (name, "signed short int") == 0)
6646 indx = (unsigned int) builtin_signed_short_int;
6647 found = TRUE;
6649 else if (strcmp (name, "short") == 0)
6651 indx = (unsigned int) builtin_short;
6652 found = TRUE;
6654 else if (strcmp (name, "short int") == 0)
6656 indx = (unsigned int) builtin_short_int;
6657 found = TRUE;
6659 else if (strcmp (name, "signed short") == 0)
6661 indx = (unsigned int) builtin_signed_short;
6662 found = TRUE;
6664 break;
6666 case builtin_unsigned_short_int:
6667 case builtin_unsigned_short:
6668 if (strcmp (name, "unsigned short int") == 0
6669 || strcmp (name, "short unsigned int") == 0)
6671 indx = builtin_unsigned_short_int;
6672 found = TRUE;
6674 else if (strcmp (name, "unsigned short") == 0)
6676 indx = builtin_unsigned_short;
6677 found = TRUE;
6679 break;
6681 case builtin_signed_long:
6682 case builtin_int: /* FIXME: Size depends upon architecture. */
6683 case builtin_long:
6684 if (strcmp (name, "signed long") == 0)
6686 indx = builtin_signed_long;
6687 found = TRUE;
6689 else if (strcmp (name, "int") == 0)
6691 indx = builtin_int;
6692 found = TRUE;
6694 else if (strcmp (name, "long") == 0
6695 || strcmp (name, "long int") == 0)
6697 indx = builtin_long;
6698 found = TRUE;
6700 break;
6702 case builtin_unsigned_long:
6703 case builtin_unsigned: /* FIXME: Size depends upon architecture. */
6704 case builtin_unsigned_int: /* FIXME: Like builtin_unsigned. */
6705 if (strcmp (name, "unsigned long") == 0
6706 || strcmp (name, "long unsigned int") == 0)
6708 indx = builtin_unsigned_long;
6709 found = TRUE;
6711 else if (strcmp (name, "unsigned") == 0)
6713 indx = builtin_unsigned;
6714 found = TRUE;
6716 else if (strcmp (name, "unsigned int") == 0)
6718 indx = builtin_unsigned_int;
6719 found = TRUE;
6721 break;
6723 case builtin_signed_long_long:
6724 if (strcmp (name, "signed long long") == 0
6725 || strcmp (name, "long long int") == 0)
6726 found = TRUE;
6727 break;
6729 case builtin_unsigned_long_long:
6730 if (strcmp (name, "unsigned long long") == 0
6731 || strcmp (name, "long long unsigned int") == 0)
6732 found = TRUE;
6733 break;
6735 case builtin_float:
6736 if (strcmp (name, "float") == 0)
6737 found = TRUE;
6738 break;
6740 case builtin_double:
6741 if (strcmp (name, "double") == 0)
6742 found = TRUE;
6743 break;
6745 case builtin_long_double:
6746 if (strcmp (name, "long double") == 0)
6747 found = TRUE;
6748 break;
6750 case builtin_long_long_double:
6751 if (strcmp (name, "long long double") == 0)
6752 found = TRUE;
6753 break;
6756 if (found)
6757 type.indx = indx;
6760 h = ieee_name_type_hash_lookup (&info->typedefs, name, TRUE, FALSE);
6761 if (h == NULL)
6762 return FALSE;
6764 /* See if we have already defined this type with this name. */
6765 localp = type.localp;
6766 for (nt = h->types; nt != NULL; nt = nt->next)
6768 if (nt->id == indx)
6770 /* If this is a global definition, then we don't need to
6771 do anything here. */
6772 if (! nt->type.localp)
6774 ieee_pop_unused_type (info);
6775 return TRUE;
6778 else
6780 /* This is a duplicate definition, so make this one local. */
6781 localp = TRUE;
6785 /* We need to add a new typedef for this type. */
6787 nt = (struct ieee_name_type *) xmalloc (sizeof *nt);
6788 memset (nt, 0, sizeof *nt);
6789 nt->id = indx;
6790 nt->type = type;
6791 nt->type.name = name;
6792 nt->type.localp = localp;
6793 nt->kind = DEBUG_KIND_ILLEGAL;
6795 nt->next = h->types;
6796 h->types = nt;
6798 if (found)
6800 /* This is one of the builtin typedefs, so we don't need to
6801 actually define it. */
6802 ieee_pop_unused_type (info);
6803 return TRUE;
6806 indx = ieee_pop_type (info);
6808 if (! ieee_define_named_type (info, name, (unsigned int) -1, type.size,
6809 type.unsignedp, localp,
6810 (struct ieee_buflist *) NULL)
6811 || ! ieee_write_number (info, 'T')
6812 || ! ieee_write_number (info, indx))
6813 return FALSE;
6815 /* Remove the type we just added to the type stack. This should not
6816 be ieee_pop_unused_type, since the type is used, we just don't
6817 need it now. */
6818 (void) ieee_pop_type (info);
6820 return TRUE;
6823 /* Output a tag for a type. We don't have to do anything here. */
6825 static bfd_boolean
6826 ieee_tag (void *p, const char *name ATTRIBUTE_UNUSED)
6828 struct ieee_handle *info = (struct ieee_handle *) p;
6830 /* This should not be ieee_pop_unused_type, since we want the type
6831 to be defined. */
6832 (void) ieee_pop_type (info);
6833 return TRUE;
6836 /* Output an integer constant. */
6838 static bfd_boolean
6839 ieee_int_constant (void *p ATTRIBUTE_UNUSED, const char *name ATTRIBUTE_UNUSED,
6840 bfd_vma val ATTRIBUTE_UNUSED)
6842 /* FIXME. */
6843 return TRUE;
6846 /* Output a floating point constant. */
6848 static bfd_boolean
6849 ieee_float_constant (void *p ATTRIBUTE_UNUSED,
6850 const char *name ATTRIBUTE_UNUSED,
6851 double val ATTRIBUTE_UNUSED)
6853 /* FIXME. */
6854 return TRUE;
6857 /* Output a typed constant. */
6859 static bfd_boolean
6860 ieee_typed_constant (void *p, const char *name ATTRIBUTE_UNUSED,
6861 bfd_vma val ATTRIBUTE_UNUSED)
6863 struct ieee_handle *info = (struct ieee_handle *) p;
6865 /* FIXME. */
6866 ieee_pop_unused_type (info);
6867 return TRUE;
6870 /* Output a variable. */
6872 static bfd_boolean
6873 ieee_variable (void *p, const char *name, enum debug_var_kind kind,
6874 bfd_vma val)
6876 struct ieee_handle *info = (struct ieee_handle *) p;
6877 unsigned int name_indx;
6878 unsigned int size;
6879 bfd_boolean referencep;
6880 unsigned int type_indx;
6881 bfd_boolean asn;
6882 int refflag;
6884 size = info->type_stack->type.size;
6885 referencep = info->type_stack->type.referencep;
6886 type_indx = ieee_pop_type (info);
6888 assert (! ieee_buffer_emptyp (&info->vars));
6889 if (! ieee_change_buffer (info, &info->vars))
6890 return FALSE;
6892 name_indx = info->name_indx;
6893 ++info->name_indx;
6895 /* Write out an NN and an ATN record for this variable. */
6896 if (! ieee_write_byte (info, (int) ieee_nn_record)
6897 || ! ieee_write_number (info, name_indx)
6898 || ! ieee_write_id (info, name)
6899 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
6900 || ! ieee_write_number (info, name_indx)
6901 || ! ieee_write_number (info, type_indx))
6902 return FALSE;
6903 switch (kind)
6905 default:
6906 abort ();
6907 return FALSE;
6908 case DEBUG_GLOBAL:
6909 if (! ieee_write_number (info, 8)
6910 || ! ieee_add_range (info, FALSE, val, val + size))
6911 return FALSE;
6912 refflag = 0;
6913 asn = TRUE;
6914 break;
6915 case DEBUG_STATIC:
6916 if (! ieee_write_number (info, 3)
6917 || ! ieee_add_range (info, FALSE, val, val + size))
6918 return FALSE;
6919 refflag = 1;
6920 asn = TRUE;
6921 break;
6922 case DEBUG_LOCAL_STATIC:
6923 if (! ieee_write_number (info, 3)
6924 || ! ieee_add_range (info, FALSE, val, val + size))
6925 return FALSE;
6926 refflag = 2;
6927 asn = TRUE;
6928 break;
6929 case DEBUG_LOCAL:
6930 if (! ieee_write_number (info, 1)
6931 || ! ieee_write_number (info, val))
6932 return FALSE;
6933 refflag = 2;
6934 asn = FALSE;
6935 break;
6936 case DEBUG_REGISTER:
6937 if (! ieee_write_number (info, 2)
6938 || ! ieee_write_number (info,
6939 ieee_genreg_to_regno (info->abfd, val)))
6940 return FALSE;
6941 refflag = 2;
6942 asn = FALSE;
6943 break;
6946 if (asn)
6948 if (! ieee_write_asn (info, name_indx, val))
6949 return FALSE;
6952 /* If this is really a reference type, then we just output it with
6953 pointer type, and must now output a C++ record indicating that it
6954 is really reference type. */
6955 if (referencep)
6957 unsigned int nindx;
6959 nindx = info->name_indx;
6960 ++info->name_indx;
6962 /* If this is a global variable, we want to output the misc
6963 record in the C++ misc record block. Otherwise, we want to
6964 output it just after the variable definition, which is where
6965 the current buffer is. */
6966 if (refflag != 2)
6968 if (! ieee_change_buffer (info, &info->cxx))
6969 return FALSE;
6972 if (! ieee_write_byte (info, (int) ieee_nn_record)
6973 || ! ieee_write_number (info, nindx)
6974 || ! ieee_write_id (info, "")
6975 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
6976 || ! ieee_write_number (info, nindx)
6977 || ! ieee_write_number (info, 0)
6978 || ! ieee_write_number (info, 62)
6979 || ! ieee_write_number (info, 80)
6980 || ! ieee_write_number (info, 3)
6981 || ! ieee_write_asn (info, nindx, 'R')
6982 || ! ieee_write_asn (info, nindx, refflag)
6983 || ! ieee_write_atn65 (info, nindx, name))
6984 return FALSE;
6987 return TRUE;
6990 /* Start outputting information for a function. */
6992 static bfd_boolean
6993 ieee_start_function (void *p, const char *name, bfd_boolean global)
6995 struct ieee_handle *info = (struct ieee_handle *) p;
6996 bfd_boolean referencep;
6997 unsigned int retindx, typeindx;
6999 referencep = info->type_stack->type.referencep;
7000 retindx = ieee_pop_type (info);
7002 /* Besides recording a BB4 or BB6 block, we record the type of the
7003 function in the BB1 typedef block. We can't write out the full
7004 type until we have seen all the parameters, so we accumulate it
7005 in info->fntype and info->fnargs. */
7006 if (! ieee_buffer_emptyp (&info->fntype))
7008 /* FIXME: This might happen someday if we support nested
7009 functions. */
7010 abort ();
7013 info->fnname = name;
7015 /* An attribute of 0x40 means that the push mask is unknown. */
7016 if (! ieee_define_named_type (info, name, (unsigned int) -1, 0, FALSE, TRUE,
7017 &info->fntype)
7018 || ! ieee_write_number (info, 'x')
7019 || ! ieee_write_number (info, 0x40)
7020 || ! ieee_write_number (info, 0)
7021 || ! ieee_write_number (info, 0)
7022 || ! ieee_write_number (info, retindx))
7023 return FALSE;
7025 typeindx = ieee_pop_type (info);
7027 if (! ieee_init_buffer (info, &info->fnargs))
7028 return FALSE;
7029 info->fnargcount = 0;
7031 /* If the function return value is actually a reference type, we
7032 must add a record indicating that. */
7033 if (referencep)
7035 unsigned int nindx;
7037 nindx = info->name_indx;
7038 ++info->name_indx;
7039 if (! ieee_change_buffer (info, &info->cxx)
7040 || ! ieee_write_byte (info, (int) ieee_nn_record)
7041 || ! ieee_write_number (info, nindx)
7042 || ! ieee_write_id (info, "")
7043 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7044 || ! ieee_write_number (info, nindx)
7045 || ! ieee_write_number (info, 0)
7046 || ! ieee_write_number (info, 62)
7047 || ! ieee_write_number (info, 80)
7048 || ! ieee_write_number (info, 3)
7049 || ! ieee_write_asn (info, nindx, 'R')
7050 || ! ieee_write_asn (info, nindx, global ? 0 : 1)
7051 || ! ieee_write_atn65 (info, nindx, name))
7052 return FALSE;
7055 assert (! ieee_buffer_emptyp (&info->vars));
7056 if (! ieee_change_buffer (info, &info->vars))
7057 return FALSE;
7059 /* The address is written out as the first block. */
7061 ++info->block_depth;
7063 return (ieee_write_byte (info, (int) ieee_bb_record_enum)
7064 && ieee_write_byte (info, global ? 4 : 6)
7065 && ieee_write_number (info, 0)
7066 && ieee_write_id (info, name)
7067 && ieee_write_number (info, 0)
7068 && ieee_write_number (info, typeindx));
7071 /* Add a function parameter. This will normally be called before the
7072 first block, so we postpone them until we see the block. */
7074 static bfd_boolean
7075 ieee_function_parameter (void *p, const char *name, enum debug_parm_kind kind,
7076 bfd_vma val)
7078 struct ieee_handle *info = (struct ieee_handle *) p;
7079 struct ieee_pending_parm *m, **pm;
7081 assert (info->block_depth == 1);
7083 m = (struct ieee_pending_parm *) xmalloc (sizeof *m);
7084 memset (m, 0, sizeof *m);
7086 m->next = NULL;
7087 m->name = name;
7088 m->referencep = info->type_stack->type.referencep;
7089 m->type = ieee_pop_type (info);
7090 m->kind = kind;
7091 m->val = val;
7093 for (pm = &info->pending_parms; *pm != NULL; pm = &(*pm)->next)
7095 *pm = m;
7097 /* Add the type to the fnargs list. */
7098 if (! ieee_change_buffer (info, &info->fnargs)
7099 || ! ieee_write_number (info, m->type))
7100 return FALSE;
7101 ++info->fnargcount;
7103 return TRUE;
7106 /* Output pending function parameters. */
7108 static bfd_boolean
7109 ieee_output_pending_parms (struct ieee_handle *info)
7111 struct ieee_pending_parm *m;
7112 unsigned int refcount;
7114 refcount = 0;
7115 for (m = info->pending_parms; m != NULL; m = m->next)
7117 enum debug_var_kind vkind;
7119 switch (m->kind)
7121 default:
7122 abort ();
7123 return FALSE;
7124 case DEBUG_PARM_STACK:
7125 case DEBUG_PARM_REFERENCE:
7126 vkind = DEBUG_LOCAL;
7127 break;
7128 case DEBUG_PARM_REG:
7129 case DEBUG_PARM_REF_REG:
7130 vkind = DEBUG_REGISTER;
7131 break;
7134 if (! ieee_push_type (info, m->type, 0, FALSE, FALSE))
7135 return FALSE;
7136 info->type_stack->type.referencep = m->referencep;
7137 if (m->referencep)
7138 ++refcount;
7139 if (! ieee_variable ((void *) info, m->name, vkind, m->val))
7140 return FALSE;
7143 /* If there are any reference parameters, we need to output a
7144 miscellaneous record indicating them. */
7145 if (refcount > 0)
7147 unsigned int nindx, varindx;
7149 /* FIXME: The MRI compiler outputs the demangled function name
7150 here, but we are outputting the mangled name. */
7151 nindx = info->name_indx;
7152 ++info->name_indx;
7153 if (! ieee_change_buffer (info, &info->vars)
7154 || ! ieee_write_byte (info, (int) ieee_nn_record)
7155 || ! ieee_write_number (info, nindx)
7156 || ! ieee_write_id (info, "")
7157 || ! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7158 || ! ieee_write_number (info, nindx)
7159 || ! ieee_write_number (info, 0)
7160 || ! ieee_write_number (info, 62)
7161 || ! ieee_write_number (info, 80)
7162 || ! ieee_write_number (info, refcount + 3)
7163 || ! ieee_write_asn (info, nindx, 'B')
7164 || ! ieee_write_atn65 (info, nindx, info->fnname)
7165 || ! ieee_write_asn (info, nindx, 0))
7166 return FALSE;
7167 for (m = info->pending_parms, varindx = 1;
7168 m != NULL;
7169 m = m->next, varindx++)
7171 if (m->referencep)
7173 if (! ieee_write_asn (info, nindx, varindx))
7174 return FALSE;
7179 m = info->pending_parms;
7180 while (m != NULL)
7182 struct ieee_pending_parm *next;
7184 next = m->next;
7185 free (m);
7186 m = next;
7189 info->pending_parms = NULL;
7191 return TRUE;
7194 /* Start a block. If this is the first block, we output the address
7195 to finish the BB4 or BB6, and then output the function parameters. */
7197 static bfd_boolean
7198 ieee_start_block (void *p, bfd_vma addr)
7200 struct ieee_handle *info = (struct ieee_handle *) p;
7202 if (! ieee_change_buffer (info, &info->vars))
7203 return FALSE;
7205 if (info->block_depth == 1)
7207 if (! ieee_write_number (info, addr)
7208 || ! ieee_output_pending_parms (info))
7209 return FALSE;
7211 else
7213 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
7214 || ! ieee_write_byte (info, 6)
7215 || ! ieee_write_number (info, 0)
7216 || ! ieee_write_id (info, "")
7217 || ! ieee_write_number (info, 0)
7218 || ! ieee_write_number (info, 0)
7219 || ! ieee_write_number (info, addr))
7220 return FALSE;
7223 if (! ieee_start_range (info, addr))
7224 return FALSE;
7226 ++info->block_depth;
7228 return TRUE;
7231 /* End a block. */
7233 static bfd_boolean
7234 ieee_end_block (void *p, bfd_vma addr)
7236 struct ieee_handle *info = (struct ieee_handle *) p;
7238 /* The address we are given is the end of the block, but IEEE seems
7239 to want to the address of the last byte in the block, so we
7240 subtract one. */
7241 if (! ieee_change_buffer (info, &info->vars)
7242 || ! ieee_write_byte (info, (int) ieee_be_record_enum)
7243 || ! ieee_write_number (info, addr - 1))
7244 return FALSE;
7246 if (! ieee_end_range (info, addr))
7247 return FALSE;
7249 --info->block_depth;
7251 if (addr > info->highaddr)
7252 info->highaddr = addr;
7254 return TRUE;
7257 /* End a function. */
7259 static bfd_boolean
7260 ieee_end_function (void *p)
7262 struct ieee_handle *info = (struct ieee_handle *) p;
7264 assert (info->block_depth == 1);
7266 --info->block_depth;
7268 /* Now we can finish up fntype, and add it to the typdef section.
7269 At this point, fntype is the 'x' type up to the argument count,
7270 and fnargs is the argument types. We must add the argument
7271 count, and we must add the level. FIXME: We don't record varargs
7272 functions correctly. In fact, stabs debugging does not give us
7273 enough information to do so. */
7274 if (! ieee_change_buffer (info, &info->fntype)
7275 || ! ieee_write_number (info, info->fnargcount)
7276 || ! ieee_change_buffer (info, &info->fnargs)
7277 || ! ieee_write_number (info, 0))
7278 return FALSE;
7280 /* Make sure the typdef block has been started. */
7281 if (ieee_buffer_emptyp (&info->types))
7283 if (! ieee_change_buffer (info, &info->types)
7284 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
7285 || ! ieee_write_byte (info, 1)
7286 || ! ieee_write_number (info, 0)
7287 || ! ieee_write_id (info, info->modname))
7288 return FALSE;
7291 if (! ieee_append_buffer (info, &info->types, &info->fntype)
7292 || ! ieee_append_buffer (info, &info->types, &info->fnargs))
7293 return FALSE;
7295 info->fnname = NULL;
7296 if (! ieee_init_buffer (info, &info->fntype)
7297 || ! ieee_init_buffer (info, &info->fnargs))
7298 return FALSE;
7299 info->fnargcount = 0;
7301 return TRUE;
7304 /* Record line number information. */
7306 static bfd_boolean
7307 ieee_lineno (void *p, const char *filename, unsigned long lineno, bfd_vma addr)
7309 struct ieee_handle *info = (struct ieee_handle *) p;
7311 assert (info->filename != NULL);
7313 /* The HP simulator seems to get confused when more than one line is
7314 listed for the same address, at least if they are in different
7315 files. We handle this by always listing the last line for a
7316 given address, since that seems to be the one that gdb uses. */
7317 if (info->pending_lineno_filename != NULL
7318 && addr != info->pending_lineno_addr)
7320 /* Make sure we have a line number block. */
7321 if (! ieee_buffer_emptyp (&info->linenos))
7323 if (! ieee_change_buffer (info, &info->linenos))
7324 return FALSE;
7326 else
7328 info->lineno_name_indx = info->name_indx;
7329 ++info->name_indx;
7330 if (! ieee_change_buffer (info, &info->linenos)
7331 || ! ieee_write_byte (info, (int) ieee_bb_record_enum)
7332 || ! ieee_write_byte (info, 5)
7333 || ! ieee_write_number (info, 0)
7334 || ! ieee_write_id (info, info->filename)
7335 || ! ieee_write_byte (info, (int) ieee_nn_record)
7336 || ! ieee_write_number (info, info->lineno_name_indx)
7337 || ! ieee_write_id (info, ""))
7338 return FALSE;
7339 info->lineno_filename = info->filename;
7342 if (strcmp (info->pending_lineno_filename, info->lineno_filename) != 0)
7344 if (strcmp (info->filename, info->lineno_filename) != 0)
7346 /* We were not in the main file. Close the block for the
7347 included file. */
7348 if (! ieee_write_byte (info, (int) ieee_be_record_enum))
7349 return FALSE;
7350 if (strcmp (info->filename, info->pending_lineno_filename) == 0)
7352 /* We need a new NN record, and we aren't about to
7353 output one. */
7354 info->lineno_name_indx = info->name_indx;
7355 ++info->name_indx;
7356 if (! ieee_write_byte (info, (int) ieee_nn_record)
7357 || ! ieee_write_number (info, info->lineno_name_indx)
7358 || ! ieee_write_id (info, ""))
7359 return FALSE;
7362 if (strcmp (info->filename, info->pending_lineno_filename) != 0)
7364 /* We are not changing to the main file. Open a block for
7365 the new included file. */
7366 info->lineno_name_indx = info->name_indx;
7367 ++info->name_indx;
7368 if (! ieee_write_byte (info, (int) ieee_bb_record_enum)
7369 || ! ieee_write_byte (info, 5)
7370 || ! ieee_write_number (info, 0)
7371 || ! ieee_write_id (info, info->pending_lineno_filename)
7372 || ! ieee_write_byte (info, (int) ieee_nn_record)
7373 || ! ieee_write_number (info, info->lineno_name_indx)
7374 || ! ieee_write_id (info, ""))
7375 return FALSE;
7377 info->lineno_filename = info->pending_lineno_filename;
7380 if (! ieee_write_2bytes (info, (int) ieee_atn_record_enum)
7381 || ! ieee_write_number (info, info->lineno_name_indx)
7382 || ! ieee_write_number (info, 0)
7383 || ! ieee_write_number (info, 7)
7384 || ! ieee_write_number (info, info->pending_lineno)
7385 || ! ieee_write_number (info, 0)
7386 || ! ieee_write_asn (info, info->lineno_name_indx,
7387 info->pending_lineno_addr))
7388 return FALSE;
7391 info->pending_lineno_filename = filename;
7392 info->pending_lineno = lineno;
7393 info->pending_lineno_addr = addr;
7395 return TRUE;