1 /* ieee.c -- Read and write IEEE-695 debugging information.
2 Copyright (C) 1996, 1998 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
22 /* This file reads and writes IEEE-695 debugging information. */
30 #include "libiberty.h"
34 /* This structure holds an entry on the block stack. */
38 /* The kind of block. */
40 /* The source file name, for a BB5 block. */
42 /* The index of the function type, for a BB4 or BB6 block. */
44 /* True if this function is being skipped. */
48 /* This structure is the block stack. */
50 #define BLOCKSTACK_SIZE (16)
52 struct ieee_blockstack
54 /* The stack pointer. */
55 struct ieee_block
*bsp
;
57 struct ieee_block stack
[BLOCKSTACK_SIZE
];
60 /* This structure holds information for a variable. */
70 /* Slot if we make an indirect type. */
72 /* Kind of variable or function. */
84 /* This structure holds all the variables. */
88 /* Number of slots allocated. */
91 struct ieee_var
*vars
;
94 /* This structure holds information for a type. We need this because
95 we don't want to represent bitfields as real types. */
101 /* Slot if this is type is referenced before it is defined. */
103 /* Slots for arguments if we make indirect types for them. */
104 debug_type
*arg_slots
;
105 /* If this is a bitfield, this is the size in bits. If this is not
106 a bitfield, this is zero. */
107 unsigned long bitsize
;
110 /* This structure holds all the type information. */
114 /* Number of slots allocated. */
117 struct ieee_type
*types
;
119 #define BUILTIN_TYPE_COUNT (60)
120 debug_type builtins
[BUILTIN_TYPE_COUNT
];
123 /* This structure holds a linked last of structs with their tag names,
124 so that we can convert them to C++ classes if necessary. */
129 struct ieee_tag
*next
;
132 /* The type of the tag. */
134 /* The tagged type is an indirect type pointing at this slot. */
136 /* This is an array of slots used when a field type is converted
137 into a indirect type, in case it needs to be later converted into
142 /* This structure holds the information we pass around to the parsing
147 /* The debugging handle. */
151 /* The start of the bytes to be parsed. */
152 const bfd_byte
*bytes
;
153 /* The end of the bytes to be parsed. */
154 const bfd_byte
*pend
;
155 /* The block stack. */
156 struct ieee_blockstack blockstack
;
157 /* Whether we have seen a BB1 or BB2. */
158 boolean saw_filename
;
160 struct ieee_vars vars
;
161 /* The global variables, after a global typedef block. */
162 struct ieee_vars
*global_vars
;
164 struct ieee_types types
;
165 /* The global types, after a global typedef block. */
166 struct ieee_types
*global_types
;
167 /* The list of tagged structs. */
168 struct ieee_tag
*tags
;
171 /* Basic builtin types, not including the pointers. */
177 builtin_signed_char
= 2,
178 builtin_unsigned_char
= 3,
179 builtin_signed_short_int
= 4,
180 builtin_unsigned_short_int
= 5,
181 builtin_signed_long
= 6,
182 builtin_unsigned_long
= 7,
183 builtin_signed_long_long
= 8,
184 builtin_unsigned_long_long
= 9,
187 builtin_long_double
= 12,
188 builtin_long_long_double
= 13,
189 builtin_quoted_string
= 14,
190 builtin_instruction_address
= 15,
192 builtin_unsigned
= 17,
193 builtin_unsigned_int
= 18,
197 builtin_unsigned_short
= 22,
198 builtin_short_int
= 23,
199 builtin_signed_short
= 24,
200 builtin_bcd_float
= 25
203 /* These are the values found in the derivation flags of a 'b'
204 component record of a 'T' type extension record in a C++ pmisc
205 record. These are bitmasks. */
207 /* Set for a private base class, clear for a public base class.
208 Protected base classes are not supported. */
209 #define BASEFLAGS_PRIVATE (0x1)
210 /* Set for a virtual base class. */
211 #define BASEFLAGS_VIRTUAL (0x2)
212 /* Set for a friend class, clear for a base class. */
213 #define BASEFLAGS_FRIEND (0x10)
215 /* These are the values found in the specs flags of a 'd', 'm', or 'v'
216 component record of a 'T' type extension record in a C++ pmisc
217 record. The same flags are used for a 'M' record in a C++ pmisc
220 /* The lower two bits hold visibility information. */
221 #define CXXFLAGS_VISIBILITY (0x3)
222 /* This value in the lower two bits indicates a public member. */
223 #define CXXFLAGS_VISIBILITY_PUBLIC (0x0)
224 /* This value in the lower two bits indicates a private member. */
225 #define CXXFLAGS_VISIBILITY_PRIVATE (0x1)
226 /* This value in the lower two bits indicates a protected member. */
227 #define CXXFLAGS_VISIBILITY_PROTECTED (0x2)
228 /* Set for a static member. */
229 #define CXXFLAGS_STATIC (0x4)
230 /* Set for a virtual override. */
231 #define CXXFLAGS_OVERRIDE (0x8)
232 /* Set for a friend function. */
233 #define CXXFLAGS_FRIEND (0x10)
234 /* Set for a const function. */
235 #define CXXFLAGS_CONST (0x20)
236 /* Set for a volatile function. */
237 #define CXXFLAGS_VOLATILE (0x40)
238 /* Set for an overloaded function. */
239 #define CXXFLAGS_OVERLOADED (0x80)
240 /* Set for an operator function. */
241 #define CXXFLAGS_OPERATOR (0x100)
242 /* Set for a constructor or destructor. */
243 #define CXXFLAGS_CTORDTOR (0x400)
244 /* Set for a constructor. */
245 #define CXXFLAGS_CTOR (0x200)
246 /* Set for an inline function. */
247 #define CXXFLAGS_INLINE (0x800)
249 /* Local functions. */
251 static void ieee_error
252 PARAMS ((struct ieee_info
*, const bfd_byte
*, const char *));
253 static void ieee_eof
PARAMS ((struct ieee_info
*));
254 static char *savestring
PARAMS ((const char *, unsigned long));
255 static boolean ieee_read_number
256 PARAMS ((struct ieee_info
*, const bfd_byte
**, bfd_vma
*));
257 static boolean ieee_read_optional_number
258 PARAMS ((struct ieee_info
*, const bfd_byte
**, bfd_vma
*, boolean
*));
259 static boolean ieee_read_id
260 PARAMS ((struct ieee_info
*, const bfd_byte
**, const char **,
262 static boolean ieee_read_optional_id
263 PARAMS ((struct ieee_info
*, const bfd_byte
**, const char **,
264 unsigned long *, boolean
*));
265 static boolean ieee_read_expression
266 PARAMS ((struct ieee_info
*, const bfd_byte
**, bfd_vma
*));
267 static debug_type ieee_builtin_type
268 PARAMS ((struct ieee_info
*, const bfd_byte
*, unsigned int));
269 static boolean ieee_alloc_type
270 PARAMS ((struct ieee_info
*, unsigned int, boolean
));
271 static boolean ieee_read_type_index
272 PARAMS ((struct ieee_info
*, const bfd_byte
**, debug_type
*));
273 static int ieee_regno_to_genreg
PARAMS ((bfd
*, int));
274 static int ieee_genreg_to_regno
PARAMS ((bfd
*, int));
275 static boolean parse_ieee_bb
PARAMS ((struct ieee_info
*, const bfd_byte
**));
276 static boolean parse_ieee_be
PARAMS ((struct ieee_info
*, const bfd_byte
**));
277 static boolean parse_ieee_nn
PARAMS ((struct ieee_info
*, const bfd_byte
**));
278 static boolean parse_ieee_ty
PARAMS ((struct ieee_info
*, const bfd_byte
**));
279 static boolean parse_ieee_atn
PARAMS ((struct ieee_info
*, const bfd_byte
**));
280 static boolean ieee_read_cxx_misc
281 PARAMS ((struct ieee_info
*, const bfd_byte
**, unsigned long));
282 static boolean ieee_read_cxx_class
283 PARAMS ((struct ieee_info
*, const bfd_byte
**, unsigned long));
284 static boolean ieee_read_cxx_defaults
285 PARAMS ((struct ieee_info
*, const bfd_byte
**, unsigned long));
286 static boolean ieee_read_reference
287 PARAMS ((struct ieee_info
*, const bfd_byte
**));
288 static boolean ieee_require_asn
289 PARAMS ((struct ieee_info
*, const bfd_byte
**, bfd_vma
*));
290 static boolean ieee_require_atn65
291 PARAMS ((struct ieee_info
*, const bfd_byte
**, const char **,
294 /* Report an error in the IEEE debugging information. */
297 ieee_error (info
, p
, s
)
298 struct ieee_info
*info
;
303 fprintf (stderr
, "%s: 0x%lx: %s (0x%x)\n", bfd_get_filename (info
->abfd
),
304 (unsigned long) (p
- info
->bytes
), s
, *p
);
306 fprintf (stderr
, "%s: %s\n", bfd_get_filename (info
->abfd
), s
);
309 /* Report an unexpected EOF in the IEEE debugging information. */
313 struct ieee_info
*info
;
315 ieee_error (info
, (const bfd_byte
*) NULL
,
316 _("unexpected end of debugging information"));
319 /* Save a string in memory. */
322 savestring (start
, len
)
328 ret
= (char *) xmalloc (len
+ 1);
329 memcpy (ret
, start
, len
);
334 /* Read a number which must be present in an IEEE file. */
337 ieee_read_number (info
, pp
, pv
)
338 struct ieee_info
*info
;
342 return ieee_read_optional_number (info
, pp
, pv
, (boolean
*) NULL
);
345 /* Read a number in an IEEE file. If ppresent is not NULL, the number
346 need not be there. */
349 ieee_read_optional_number (info
, pp
, pv
, ppresent
)
350 struct ieee_info
*info
;
355 ieee_record_enum_type b
;
357 if (*pp
>= info
->pend
)
359 if (ppresent
!= NULL
)
368 b
= (ieee_record_enum_type
) **pp
;
371 if (b
<= ieee_number_end_enum
)
374 if (ppresent
!= NULL
)
379 if (b
>= ieee_number_repeat_start_enum
&& b
<= ieee_number_repeat_end_enum
)
383 i
= (int) b
- (int) ieee_number_repeat_start_enum
;
384 if (*pp
+ i
- 1 >= info
->pend
)
398 if (ppresent
!= NULL
)
404 if (ppresent
!= NULL
)
411 ieee_error (info
, *pp
- 1, _("invalid number"));
415 /* Read a required string from an IEEE file. */
418 ieee_read_id (info
, pp
, pname
, pnamlen
)
419 struct ieee_info
*info
;
422 unsigned long *pnamlen
;
424 return ieee_read_optional_id (info
, pp
, pname
, pnamlen
, (boolean
*) NULL
);
427 /* Read a string from an IEEE file. If ppresent is not NULL, the
428 string is optional. */
431 ieee_read_optional_id (info
, pp
, pname
, pnamlen
, ppresent
)
432 struct ieee_info
*info
;
435 unsigned long *pnamlen
;
441 if (*pp
>= info
->pend
)
452 else if ((ieee_record_enum_type
) b
== ieee_extension_length_1_enum
)
457 else if ((ieee_record_enum_type
) b
== ieee_extension_length_2_enum
)
459 len
= (**pp
<< 8) + (*pp
)[1];
464 if (ppresent
!= NULL
)
470 ieee_error (info
, *pp
- 1, _("invalid string length"));
474 if ((unsigned long) (info
->pend
- *pp
) < len
)
480 *pname
= (const char *) *pp
;
484 if (ppresent
!= NULL
)
490 /* Read an expression from an IEEE file. Since this code is only used
491 to parse debugging information, I haven't bothered to write a full
492 blown IEEE expression parser. I've only thrown in the things I've
493 seen in debugging information. This can be easily extended if
497 ieee_read_expression (info
, pp
, pv
)
498 struct ieee_info
*info
;
502 const bfd_byte
*expr_start
;
503 #define EXPR_STACK_SIZE (10)
504 bfd_vma expr_stack
[EXPR_STACK_SIZE
];
513 const bfd_byte
*start
;
516 ieee_record_enum_type c
;
520 if (! ieee_read_optional_number (info
, pp
, &val
, &present
))
525 if (esp
- expr_stack
>= EXPR_STACK_SIZE
)
527 ieee_error (info
, start
, _("expression stack overflow"));
534 c
= (ieee_record_enum_type
) **pp
;
536 if (c
>= ieee_module_beginning_enum
)
547 ieee_error (info
, start
, _("unsupported IEEE expression operator"));
550 case ieee_variable_R_enum
:
555 if (! ieee_read_number (info
, pp
, &indx
))
557 for (s
= info
->abfd
->sections
; s
!= NULL
; s
= s
->next
)
558 if ((bfd_vma
) s
->target_index
== indx
)
562 ieee_error (info
, start
, _("unknown section"));
566 if (esp
- expr_stack
>= EXPR_STACK_SIZE
)
568 ieee_error (info
, start
, _("expression stack overflow"));
572 *esp
++ = bfd_get_section_vma (info
->abfd
, s
);
576 case ieee_function_plus_enum
:
577 case ieee_function_minus_enum
:
581 if (esp
- expr_stack
< 2)
583 ieee_error (info
, start
, _("expression stack underflow"));
595 if (esp
- 1 != expr_stack
)
597 ieee_error (info
, expr_start
, _("expression stack mismatch"));
606 /* Return an IEEE builtin type. */
609 ieee_builtin_type (info
, p
, indx
)
610 struct ieee_info
*info
;
618 if (indx
< BUILTIN_TYPE_COUNT
619 && info
->types
.builtins
[indx
] != DEBUG_TYPE_NULL
)
620 return info
->types
.builtins
[indx
];
622 dhandle
= info
->dhandle
;
624 if (indx
>= 32 && indx
< 64)
626 type
= debug_make_pointer_type (dhandle
,
627 ieee_builtin_type (info
, p
, indx
- 32));
628 assert (indx
< BUILTIN_TYPE_COUNT
);
629 info
->types
.builtins
[indx
] = type
;
633 switch ((enum builtin_types
) indx
)
636 ieee_error (info
, p
, _("unknown builtin type"));
639 case builtin_unknown
:
640 type
= debug_make_void_type (dhandle
);
645 type
= debug_make_void_type (dhandle
);
649 case builtin_signed_char
:
650 type
= debug_make_int_type (dhandle
, 1, false);
651 name
= "signed char";
654 case builtin_unsigned_char
:
655 type
= debug_make_int_type (dhandle
, 1, true);
656 name
= "unsigned char";
659 case builtin_signed_short_int
:
660 type
= debug_make_int_type (dhandle
, 2, false);
661 name
= "signed short int";
664 case builtin_unsigned_short_int
:
665 type
= debug_make_int_type (dhandle
, 2, true);
666 name
= "unsigned short int";
669 case builtin_signed_long
:
670 type
= debug_make_int_type (dhandle
, 4, false);
671 name
= "signed long";
674 case builtin_unsigned_long
:
675 type
= debug_make_int_type (dhandle
, 4, true);
676 name
= "unsigned long";
679 case builtin_signed_long_long
:
680 type
= debug_make_int_type (dhandle
, 8, false);
681 name
= "signed long long";
684 case builtin_unsigned_long_long
:
685 type
= debug_make_int_type (dhandle
, 8, true);
686 name
= "unsigned long long";
690 type
= debug_make_float_type (dhandle
, 4);
695 type
= debug_make_float_type (dhandle
, 8);
699 case builtin_long_double
:
700 /* FIXME: The size for this type should depend upon the
702 type
= debug_make_float_type (dhandle
, 12);
703 name
= "long double";
706 case builtin_long_long_double
:
707 type
= debug_make_float_type (dhandle
, 16);
708 name
= "long long double";
711 case builtin_quoted_string
:
712 type
= debug_make_array_type (dhandle
,
713 ieee_builtin_type (info
, p
,
716 ieee_builtin_type (info
, p
,
720 name
= "QUOTED STRING";
723 case builtin_instruction_address
:
724 /* FIXME: This should be a code address. */
725 type
= debug_make_int_type (dhandle
, 4, true);
726 name
= "instruction address";
730 /* FIXME: The size for this type should depend upon the
732 type
= debug_make_int_type (dhandle
, 4, false);
736 case builtin_unsigned
:
737 /* FIXME: The size for this type should depend upon the
739 type
= debug_make_int_type (dhandle
, 4, true);
743 case builtin_unsigned_int
:
744 /* FIXME: The size for this type should depend upon the
746 type
= debug_make_int_type (dhandle
, 4, true);
747 name
= "unsigned int";
751 type
= debug_make_int_type (dhandle
, 1, false);
756 type
= debug_make_int_type (dhandle
, 4, false);
761 type
= debug_make_int_type (dhandle
, 2, false);
765 case builtin_unsigned_short
:
766 type
= debug_make_int_type (dhandle
, 2, true);
767 name
= "unsigned short";
770 case builtin_short_int
:
771 type
= debug_make_int_type (dhandle
, 2, false);
775 case builtin_signed_short
:
776 type
= debug_make_int_type (dhandle
, 2, false);
777 name
= "signed short";
780 case builtin_bcd_float
:
781 ieee_error (info
, p
, _("BCD float type not supported"));
786 type
= debug_name_type (dhandle
, name
, type
);
788 assert (indx
< BUILTIN_TYPE_COUNT
);
790 info
->types
.builtins
[indx
] = type
;
795 /* Allocate more space in the type table. If ref is true, this is a
796 reference to the type; if it is not already defined, we should set
797 up an indirect type. */
800 ieee_alloc_type (info
, indx
, ref
)
801 struct ieee_info
*info
;
806 register struct ieee_type
*t
;
807 struct ieee_type
*tend
;
809 if (indx
>= info
->types
.alloc
)
811 nalloc
= info
->types
.alloc
;
814 while (indx
>= nalloc
)
817 info
->types
.types
= ((struct ieee_type
*)
818 xrealloc (info
->types
.types
,
819 nalloc
* sizeof *info
->types
.types
));
821 memset (info
->types
.types
+ info
->types
.alloc
, 0,
822 (nalloc
- info
->types
.alloc
) * sizeof *info
->types
.types
);
824 tend
= info
->types
.types
+ nalloc
;
825 for (t
= info
->types
.types
+ info
->types
.alloc
; t
< tend
; t
++)
826 t
->type
= DEBUG_TYPE_NULL
;
828 info
->types
.alloc
= nalloc
;
833 t
= info
->types
.types
+ indx
;
836 t
->pslot
= (debug_type
*) xmalloc (sizeof *t
->pslot
);
837 *t
->pslot
= DEBUG_TYPE_NULL
;
838 t
->type
= debug_make_indirect_type (info
->dhandle
, t
->pslot
,
839 (const char *) NULL
);
848 /* Read a type index and return the corresponding type. */
851 ieee_read_type_index (info
, pp
, ptype
)
852 struct ieee_info
*info
;
856 const bfd_byte
*start
;
861 if (! ieee_read_number (info
, pp
, &indx
))
866 *ptype
= ieee_builtin_type (info
, start
, indx
);
873 if (! ieee_alloc_type (info
, indx
, true))
876 *ptype
= info
->types
.types
[indx
].type
;
881 /* Parse IEEE debugging information for a file. This is passed the
882 bytes which compose the Debug Information Part of an IEEE file. */
885 parse_ieee (dhandle
, abfd
, bytes
, len
)
888 const bfd_byte
*bytes
;
891 struct ieee_info info
;
893 const bfd_byte
*p
, *pend
;
895 info
.dhandle
= dhandle
;
898 info
.pend
= bytes
+ len
;
899 info
.blockstack
.bsp
= info
.blockstack
.stack
;
900 info
.saw_filename
= false;
902 info
.vars
.vars
= NULL
;
903 info
.global_vars
= NULL
;
904 info
.types
.alloc
= 0;
905 info
.types
.types
= NULL
;
906 info
.global_types
= NULL
;
908 for (i
= 0; i
< BUILTIN_TYPE_COUNT
; i
++)
909 info
.types
.builtins
[i
] = DEBUG_TYPE_NULL
;
915 const bfd_byte
*record_start
;
916 ieee_record_enum_type c
;
920 c
= (ieee_record_enum_type
) *p
++;
922 if (c
== ieee_at_record_enum
)
923 c
= (ieee_record_enum_type
) (((unsigned int) c
<< 8) | *p
++);
925 if (c
<= ieee_number_repeat_end_enum
)
927 ieee_error (&info
, record_start
, _("unexpected number"));
934 ieee_error (&info
, record_start
, _("unexpected record type"));
937 case ieee_bb_record_enum
:
938 if (! parse_ieee_bb (&info
, &p
))
942 case ieee_be_record_enum
:
943 if (! parse_ieee_be (&info
, &p
))
948 if (! parse_ieee_nn (&info
, &p
))
952 case ieee_ty_record_enum
:
953 if (! parse_ieee_ty (&info
, &p
))
957 case ieee_atn_record_enum
:
958 if (! parse_ieee_atn (&info
, &p
))
964 if (info
.blockstack
.bsp
!= info
.blockstack
.stack
)
966 ieee_error (&info
, (const bfd_byte
*) NULL
,
967 _("blocks left on stack at end"));
974 /* Handle an IEEE BB record. */
977 parse_ieee_bb (info
, pp
)
978 struct ieee_info
*info
;
981 const bfd_byte
*block_start
;
985 unsigned long namlen
;
986 char *namcopy
= NULL
;
995 if (! ieee_read_number (info
, pp
, &size
)
996 || ! ieee_read_id (info
, pp
, &name
, &namlen
))
999 fnindx
= (unsigned int) -1;
1005 /* BB1: Type definitions local to a module. */
1006 namcopy
= savestring (name
, namlen
);
1007 if (namcopy
== NULL
)
1009 if (! debug_set_filename (info
->dhandle
, namcopy
))
1011 info
->saw_filename
= true;
1013 /* Discard any variables or types we may have seen before. */
1014 if (info
->vars
.vars
!= NULL
)
1015 free (info
->vars
.vars
);
1016 info
->vars
.vars
= NULL
;
1017 info
->vars
.alloc
= 0;
1018 if (info
->types
.types
!= NULL
)
1019 free (info
->types
.types
);
1020 info
->types
.types
= NULL
;
1021 info
->types
.alloc
= 0;
1023 /* Initialize the types to the global types. */
1024 if (info
->global_types
!= NULL
)
1026 info
->types
.alloc
= info
->global_types
->alloc
;
1027 info
->types
.types
= ((struct ieee_type
*)
1028 xmalloc (info
->types
.alloc
1029 * sizeof (*info
->types
.types
)));
1030 memcpy (info
->types
.types
, info
->global_types
->types
,
1031 info
->types
.alloc
* sizeof (*info
->types
.types
));
1037 /* BB2: Global type definitions. The name is supposed to be
1038 empty, but we don't check. */
1039 if (! debug_set_filename (info
->dhandle
, "*global*"))
1041 info
->saw_filename
= true;
1045 /* BB3: High level module block begin. We don't have to do
1046 anything here. The name is supposed to be the same as for
1047 the BB1, but we don't check. */
1051 /* BB4: Global function. */
1053 bfd_vma stackspace
, typindx
, offset
;
1054 debug_type return_type
;
1056 if (! ieee_read_number (info
, pp
, &stackspace
)
1057 || ! ieee_read_number (info
, pp
, &typindx
)
1058 || ! ieee_read_expression (info
, pp
, &offset
))
1061 /* We have no way to record the stack space. FIXME. */
1065 return_type
= ieee_builtin_type (info
, block_start
, typindx
);
1066 if (return_type
== DEBUG_TYPE_NULL
)
1072 if (! ieee_alloc_type (info
, typindx
, true))
1075 return_type
= info
->types
.types
[typindx
].type
;
1076 if (debug_get_type_kind (info
->dhandle
, return_type
)
1077 == DEBUG_KIND_FUNCTION
)
1078 return_type
= debug_get_return_type (info
->dhandle
,
1082 namcopy
= savestring (name
, namlen
);
1083 if (namcopy
== NULL
)
1085 if (! debug_record_function (info
->dhandle
, namcopy
, return_type
,
1092 /* BB5: File name for source line numbers. */
1096 /* We ignore the date and time. FIXME. */
1097 for (i
= 0; i
< 6; i
++)
1102 if (! ieee_read_optional_number (info
, pp
, &ignore
, &present
))
1108 namcopy
= savestring (name
, namlen
);
1109 if (namcopy
== NULL
)
1111 if (! debug_start_source (info
->dhandle
, namcopy
))
1117 /* BB6: Local function or block. */
1119 bfd_vma stackspace
, typindx
, offset
;
1121 if (! ieee_read_number (info
, pp
, &stackspace
)
1122 || ! ieee_read_number (info
, pp
, &typindx
)
1123 || ! ieee_read_expression (info
, pp
, &offset
))
1126 /* We have no way to record the stack space. FIXME. */
1130 if (! debug_start_block (info
->dhandle
, offset
))
1132 /* Change b to indicate that this is a block
1133 rather than a function. */
1138 /* The MRI C++ compiler will output a fake function named
1139 __XRYCPP to hold C++ debugging information. We skip
1140 that function. This is not crucial, but it makes
1141 converting from IEEE to other debug formats work
1143 if (strncmp (name
, "__XRYCPP", namlen
) == 0)
1147 debug_type return_type
;
1151 return_type
= ieee_builtin_type (info
, block_start
,
1153 if (return_type
== NULL
)
1159 if (! ieee_alloc_type (info
, typindx
, true))
1162 return_type
= info
->types
.types
[typindx
].type
;
1163 if (debug_get_type_kind (info
->dhandle
, return_type
)
1164 == DEBUG_KIND_FUNCTION
)
1165 return_type
= debug_get_return_type (info
->dhandle
,
1169 namcopy
= savestring (name
, namlen
);
1170 if (namcopy
== NULL
)
1172 if (! debug_record_function (info
->dhandle
, namcopy
,
1173 return_type
, false, offset
))
1181 /* BB10: Assembler module scope. In the normal case, we
1182 completely ignore all this information. FIXME. */
1184 const char *inam
, *vstr
;
1185 unsigned long inamlen
, vstrlen
;
1190 if (! info
->saw_filename
)
1192 namcopy
= savestring (name
, namlen
);
1193 if (namcopy
== NULL
)
1195 if (! debug_set_filename (info
->dhandle
, namcopy
))
1197 info
->saw_filename
= true;
1200 if (! ieee_read_id (info
, pp
, &inam
, &inamlen
)
1201 || ! ieee_read_number (info
, pp
, &tool_type
)
1202 || ! ieee_read_optional_id (info
, pp
, &vstr
, &vstrlen
, &present
))
1204 for (i
= 0; i
< 6; i
++)
1208 if (! ieee_read_optional_number (info
, pp
, &ignore
, &present
))
1217 /* BB11: Module section. We completely ignore all this
1218 information. FIXME. */
1220 bfd_vma sectype
, secindx
, offset
, map
;
1223 if (! ieee_read_number (info
, pp
, §ype
)
1224 || ! ieee_read_number (info
, pp
, &secindx
)
1225 || ! ieee_read_expression (info
, pp
, &offset
)
1226 || ! ieee_read_optional_number (info
, pp
, &map
, &present
))
1232 ieee_error (info
, block_start
, _("unknown BB type"));
1237 /* Push this block on the block stack. */
1239 if (info
->blockstack
.bsp
>= info
->blockstack
.stack
+ BLOCKSTACK_SIZE
)
1241 ieee_error (info
, (const bfd_byte
*) NULL
, _("stack overflow"));
1245 info
->blockstack
.bsp
->kind
= b
;
1247 info
->blockstack
.bsp
->filename
= namcopy
;
1248 info
->blockstack
.bsp
->fnindx
= fnindx
;
1249 info
->blockstack
.bsp
->skip
= skip
;
1250 ++info
->blockstack
.bsp
;
1255 /* Handle an IEEE BE record. */
1258 parse_ieee_be (info
, pp
)
1259 struct ieee_info
*info
;
1260 const bfd_byte
**pp
;
1264 if (info
->blockstack
.bsp
<= info
->blockstack
.stack
)
1266 ieee_error (info
, *pp
, _("stack underflow"));
1269 --info
->blockstack
.bsp
;
1271 switch (info
->blockstack
.bsp
->kind
)
1274 /* When we end the global typedefs block, we copy out the the
1275 contents of info->vars. This is because the variable indices
1276 may be reused in the local blocks. However, we need to
1277 preserve them so that we can locate a function returning a
1278 reference variable whose type is named in the global typedef
1280 info
->global_vars
= ((struct ieee_vars
*)
1281 xmalloc (sizeof *info
->global_vars
));
1282 info
->global_vars
->alloc
= info
->vars
.alloc
;
1283 info
->global_vars
->vars
= ((struct ieee_var
*)
1284 xmalloc (info
->vars
.alloc
1285 * sizeof (*info
->vars
.vars
)));
1286 memcpy (info
->global_vars
->vars
, info
->vars
.vars
,
1287 info
->vars
.alloc
* sizeof (*info
->vars
.vars
));
1289 /* We also copy out the non builtin parts of info->types, since
1290 the types are discarded when we start a new block. */
1291 info
->global_types
= ((struct ieee_types
*)
1292 xmalloc (sizeof *info
->global_types
));
1293 info
->global_types
->alloc
= info
->types
.alloc
;
1294 info
->global_types
->types
= ((struct ieee_type
*)
1295 xmalloc (info
->types
.alloc
1296 * sizeof (*info
->types
.types
)));
1297 memcpy (info
->global_types
->types
, info
->types
.types
,
1298 info
->types
.alloc
* sizeof (*info
->types
.types
));
1299 memset (info
->global_types
->builtins
, 0,
1300 sizeof (info
->global_types
->builtins
));
1306 if (! ieee_read_expression (info
, pp
, &offset
))
1308 if (! info
->blockstack
.bsp
->skip
)
1310 if (! debug_end_function (info
->dhandle
, offset
+ 1))
1316 /* This is BE6 when BB6 started a block rather than a local
1318 if (! ieee_read_expression (info
, pp
, &offset
))
1320 if (! debug_end_block (info
->dhandle
, offset
+ 1))
1325 /* When we end a BB5, we look up the stack for the last BB5, if
1326 there is one, so that we can call debug_start_source. */
1327 if (info
->blockstack
.bsp
> info
->blockstack
.stack
)
1329 struct ieee_block
*bl
;
1331 bl
= info
->blockstack
.bsp
;
1337 if (! debug_start_source (info
->dhandle
, bl
->filename
))
1342 while (bl
!= info
->blockstack
.stack
);
1347 if (! ieee_read_expression (info
, pp
, &offset
))
1349 /* We just ignore the module size. FIXME. */
1353 /* Other block types do not have any trailing information. */
1360 /* Parse an NN record. */
1363 parse_ieee_nn (info
, pp
)
1364 struct ieee_info
*info
;
1365 const bfd_byte
**pp
;
1367 const bfd_byte
*nn_start
;
1370 unsigned long namlen
;
1374 if (! ieee_read_number (info
, pp
, &varindx
)
1375 || ! ieee_read_id (info
, pp
, &name
, &namlen
))
1380 ieee_error (info
, nn_start
, _("illegal variable index"));
1385 if (varindx
>= info
->vars
.alloc
)
1389 alloc
= info
->vars
.alloc
;
1392 while (varindx
>= alloc
)
1394 info
->vars
.vars
= ((struct ieee_var
*)
1395 xrealloc (info
->vars
.vars
,
1396 alloc
* sizeof *info
->vars
.vars
));
1397 memset (info
->vars
.vars
+ info
->vars
.alloc
, 0,
1398 (alloc
- info
->vars
.alloc
) * sizeof *info
->vars
.vars
);
1399 info
->vars
.alloc
= alloc
;
1402 info
->vars
.vars
[varindx
].name
= name
;
1403 info
->vars
.vars
[varindx
].namlen
= namlen
;
1408 /* Parse a TY record. */
1411 parse_ieee_ty (info
, pp
)
1412 struct ieee_info
*info
;
1413 const bfd_byte
**pp
;
1415 const bfd_byte
*ty_start
, *ty_var_start
, *ty_code_start
;
1416 bfd_vma typeindx
, varindx
, tc
;
1418 boolean tag
, typdef
;
1419 debug_type
*arg_slots
;
1420 unsigned long type_bitsize
;
1425 if (! ieee_read_number (info
, pp
, &typeindx
))
1430 ieee_error (info
, ty_start
, _("illegal type index"));
1435 if (! ieee_alloc_type (info
, typeindx
, false))
1440 ieee_error (info
, *pp
, _("unknown TY code"));
1447 if (! ieee_read_number (info
, pp
, &varindx
))
1452 ieee_error (info
, ty_var_start
, _("illegal variable index"));
1457 if (varindx
>= info
->vars
.alloc
|| info
->vars
.vars
[varindx
].name
== NULL
)
1459 ieee_error (info
, ty_var_start
, _("undefined variable in TY"));
1463 ty_code_start
= *pp
;
1465 if (! ieee_read_number (info
, pp
, &tc
))
1468 dhandle
= info
->dhandle
;
1477 ieee_error (info
, ty_code_start
, _("unknown TY code"));
1481 /* Unknown type, with size. We treat it as int. FIXME. */
1485 if (! ieee_read_number (info
, pp
, &size
))
1487 type
= debug_make_int_type (dhandle
, size
, false);
1491 case 'A': /* Array. */
1492 case 'a': /* FORTRAN array in column/row order. FIXME: Not
1493 distinguished from normal array. */
1495 debug_type ele_type
;
1496 bfd_vma lower
, upper
;
1498 if (! ieee_read_type_index (info
, pp
, &ele_type
)
1499 || ! ieee_read_number (info
, pp
, &lower
)
1500 || ! ieee_read_number (info
, pp
, &upper
))
1502 type
= debug_make_array_type (dhandle
, ele_type
,
1503 ieee_builtin_type (info
, ty_code_start
,
1506 (bfd_signed_vma
) lower
,
1507 (bfd_signed_vma
) upper
,
1513 /* Simple enumeration. */
1519 bfd_signed_vma
*vals
;
1522 if (! ieee_read_number (info
, pp
, &size
))
1524 /* FIXME: we ignore the enumeration size. */
1527 names
= (const char **) xmalloc (alloc
* sizeof *names
);
1528 memset (names
, 0, alloc
* sizeof *names
);
1533 unsigned long namlen
;
1536 if (! ieee_read_optional_id (info
, pp
, &name
, &namlen
, &present
))
1544 names
= ((const char **)
1545 xrealloc (names
, alloc
* sizeof *names
));
1548 names
[c
] = savestring (name
, namlen
);
1549 if (names
[c
] == NULL
)
1556 vals
= (bfd_signed_vma
*) xmalloc (c
* sizeof *vals
);
1557 for (i
= 0; i
< c
; i
++)
1560 type
= debug_make_enum_type (dhandle
, names
, vals
);
1566 /* Struct with bit fields. */
1570 debug_field
*fields
;
1573 if (! ieee_read_number (info
, pp
, &size
))
1577 fields
= (debug_field
*) xmalloc (alloc
* sizeof *fields
);
1582 unsigned long namlen
;
1585 bfd_vma bitpos
, bitsize
;
1587 if (! ieee_read_optional_id (info
, pp
, &name
, &namlen
, &present
))
1591 if (! ieee_read_type_index (info
, pp
, &ftype
)
1592 || ! ieee_read_number (info
, pp
, &bitpos
)
1593 || ! ieee_read_number (info
, pp
, &bitsize
))
1599 fields
= ((debug_field
*)
1600 xrealloc (fields
, alloc
* sizeof *fields
));
1603 fields
[c
] = debug_make_field (dhandle
, savestring (name
, namlen
),
1604 ftype
, bitpos
, bitsize
,
1605 DEBUG_VISIBILITY_PUBLIC
);
1606 if (fields
[c
] == NULL
)
1613 type
= debug_make_struct_type (dhandle
, true, size
, fields
);
1623 bfd_signed_vma
*vals
;
1627 names
= (const char **) xmalloc (alloc
* sizeof *names
);
1628 vals
= (bfd_signed_vma
*) xmalloc (alloc
* sizeof *names
);
1633 unsigned long namlen
;
1637 if (! ieee_read_optional_id (info
, pp
, &name
, &namlen
, &present
))
1641 if (! ieee_read_number (info
, pp
, &val
))
1644 /* If the length of the name is zero, then the value is
1645 actually the size of the enum. We ignore this
1646 information. FIXME. */
1653 names
= ((const char **)
1654 xrealloc (names
, alloc
* sizeof *names
));
1655 vals
= ((bfd_signed_vma
*)
1656 xrealloc (vals
, alloc
* sizeof *vals
));
1659 names
[c
] = savestring (name
, namlen
);
1660 if (names
[c
] == NULL
)
1662 vals
[c
] = (bfd_signed_vma
) val
;
1668 type
= debug_make_enum_type (dhandle
, names
, vals
);
1673 case 'O': /* Small pointer. We don't distinguish small and large
1675 case 'P': /* Large pointer. */
1679 if (! ieee_read_type_index (info
, pp
, &t
))
1681 type
= debug_make_pointer_type (dhandle
, t
);
1688 bfd_vma low
, high
, signedp
, size
;
1690 if (! ieee_read_number (info
, pp
, &low
)
1691 || ! ieee_read_number (info
, pp
, &high
)
1692 || ! ieee_read_number (info
, pp
, &signedp
)
1693 || ! ieee_read_number (info
, pp
, &size
))
1696 type
= debug_make_range_type (dhandle
,
1697 debug_make_int_type (dhandle
, size
,
1699 (bfd_signed_vma
) low
,
1700 (bfd_signed_vma
) high
);
1704 case 'S': /* Struct. */
1705 case 'U': /* Union. */
1709 debug_field
*fields
;
1712 if (! ieee_read_number (info
, pp
, &size
))
1716 fields
= (debug_field
*) xmalloc (alloc
* sizeof *fields
);
1721 unsigned long namlen
;
1728 if (! ieee_read_optional_id (info
, pp
, &name
, &namlen
, &present
))
1732 if (! ieee_read_number (info
, pp
, &tindx
)
1733 || ! ieee_read_number (info
, pp
, &offset
))
1738 ftype
= ieee_builtin_type (info
, ty_code_start
, tindx
);
1744 struct ieee_type
*t
;
1747 if (! ieee_alloc_type (info
, tindx
, true))
1749 t
= info
->types
.types
+ tindx
;
1751 bitsize
= t
->bitsize
;
1759 fields
= ((debug_field
*)
1760 xrealloc (fields
, alloc
* sizeof *fields
));
1763 fields
[c
] = debug_make_field (dhandle
, savestring (name
, namlen
),
1764 ftype
, offset
, bitsize
,
1765 DEBUG_VISIBILITY_PUBLIC
);
1766 if (fields
[c
] == NULL
)
1773 type
= debug_make_struct_type (dhandle
, tc
== 'S', size
, fields
);
1780 if (! ieee_read_type_index (info
, pp
, &type
))
1786 /* Procedure. FIXME: This is an extern declaration, which we
1787 have no way of representing. */
1793 struct ieee_var
*pv
;
1795 /* FIXME: We ignore the attribute and the argument names. */
1797 if (! ieee_read_number (info
, pp
, &attr
)
1798 || ! ieee_read_type_index (info
, pp
, &rtype
)
1799 || ! ieee_read_number (info
, pp
, &nargs
))
1804 unsigned long namlen
;
1806 if (! ieee_read_optional_id (info
, pp
, &name
, &namlen
, &present
))
1811 pv
= info
->vars
.vars
+ varindx
;
1812 pv
->kind
= IEEE_EXTERNAL
;
1814 && debug_get_type_kind (dhandle
, rtype
) == DEBUG_KIND_POINTER
)
1816 /* Set up the return type as an indirect type pointing to
1817 the variable slot, so that we can change it to a
1818 reference later if appropriate. */
1819 pv
->pslot
= (debug_type
*) xmalloc (sizeof *pv
->pslot
);
1821 rtype
= debug_make_indirect_type (dhandle
, pv
->pslot
,
1822 (const char *) NULL
);
1825 type
= debug_make_function_type (dhandle
, rtype
, (debug_type
*) NULL
,
1831 /* Void. This is not documented, but the MRI compiler emits it. */
1832 type
= debug_make_void_type (dhandle
);
1836 /* Array with 0 lower bound. */
1841 if (! ieee_read_type_index (info
, pp
, &etype
)
1842 || ! ieee_read_number (info
, pp
, &high
))
1845 type
= debug_make_array_type (dhandle
, etype
,
1846 ieee_builtin_type (info
, ty_code_start
,
1849 0, (bfd_signed_vma
) high
, false);
1853 case 'c': /* Complex. */
1854 case 'd': /* Double complex. */
1857 unsigned long namlen
;
1859 /* FIXME: I don't know what the name means. */
1861 if (! ieee_read_id (info
, pp
, &name
, &namlen
))
1864 type
= debug_make_complex_type (dhandle
, tc
== 'c' ? 4 : 8);
1869 /* Pascal file name. FIXME. */
1870 ieee_error (info
, ty_code_start
, _("Pascal file name not supported"));
1874 /* Bitfield type. */
1876 bfd_vma signedp
, bitsize
, dummy
;
1877 const bfd_byte
*hold
;
1880 if (! ieee_read_number (info
, pp
, &signedp
)
1881 || ! ieee_read_number (info
, pp
, &bitsize
))
1884 /* I think the documentation says that there is a type index,
1885 but some actual files do not have one. */
1887 if (! ieee_read_optional_number (info
, pp
, &dummy
, &present
))
1891 /* FIXME: This is just a guess. */
1892 type
= debug_make_int_type (dhandle
, 4,
1893 signedp
? false : true);
1898 if (! ieee_read_type_index (info
, pp
, &type
))
1901 type_bitsize
= bitsize
;
1911 if (! ieee_read_number (info
, pp
, &kind
)
1912 || ! ieee_read_type_index (info
, pp
, &t
))
1918 ieee_error (info
, ty_start
, _("unsupported qualifer"));
1922 type
= debug_make_const_type (dhandle
, t
);
1926 type
= debug_make_volatile_type (dhandle
, t
);
1938 if (! ieee_read_number (info
, pp
, &size
)
1939 || ! ieee_read_type_index (info
, pp
, &etype
))
1942 /* FIXME: We ignore the size. */
1944 type
= debug_make_set_type (dhandle
, etype
, false);
1949 /* Procedure with compiler dependencies. */
1951 struct ieee_var
*pv
;
1952 bfd_vma attr
, frame_type
, push_mask
, nargs
, level
, father
;
1954 debug_type
*arg_types
;
1958 /* FIXME: We ignore some of this information. */
1960 pv
= info
->vars
.vars
+ varindx
;
1962 if (! ieee_read_number (info
, pp
, &attr
)
1963 || ! ieee_read_number (info
, pp
, &frame_type
)
1964 || ! ieee_read_number (info
, pp
, &push_mask
)
1965 || ! ieee_read_type_index (info
, pp
, &rtype
)
1966 || ! ieee_read_number (info
, pp
, &nargs
))
1968 if (nargs
== (bfd_vma
) -1)
1977 arg_types
= ((debug_type
*)
1978 xmalloc ((nargs
+ 1) * sizeof *arg_types
));
1979 for (i
= 0; i
< nargs
; i
++)
1980 if (! ieee_read_type_index (info
, pp
, arg_types
+ i
))
1983 /* If the last type is pointer to void, this is really a
1984 varargs function. */
1990 last
= arg_types
[nargs
- 1];
1991 if (debug_get_type_kind (dhandle
, last
) == DEBUG_KIND_POINTER
1992 && (debug_get_type_kind (dhandle
,
1993 debug_get_target_type (dhandle
,
1995 == DEBUG_KIND_VOID
))
2002 /* If there are any pointer arguments, turn them into
2003 indirect types in case we later need to convert them to
2005 for (i
= 0; i
< nargs
; i
++)
2007 if (debug_get_type_kind (dhandle
, arg_types
[i
])
2008 == DEBUG_KIND_POINTER
)
2010 if (arg_slots
== NULL
)
2012 arg_slots
= ((debug_type
*)
2013 xmalloc (nargs
* sizeof *arg_slots
));
2014 memset (arg_slots
, 0, nargs
* sizeof *arg_slots
);
2016 arg_slots
[i
] = arg_types
[i
];
2018 debug_make_indirect_type (dhandle
,
2020 (const char *) NULL
);
2024 arg_types
[nargs
] = DEBUG_TYPE_NULL
;
2026 if (! ieee_read_number (info
, pp
, &level
)
2027 || ! ieee_read_optional_number (info
, pp
, &father
, &present
))
2030 /* We can't distinguish between a global function and a static
2032 pv
->kind
= IEEE_FUNCTION
;
2035 && debug_get_type_kind (dhandle
, rtype
) == DEBUG_KIND_POINTER
)
2037 /* Set up the return type as an indirect type pointing to
2038 the variable slot, so that we can change it to a
2039 reference later if appropriate. */
2040 pv
->pslot
= (debug_type
*) xmalloc (sizeof *pv
->pslot
);
2042 rtype
= debug_make_indirect_type (dhandle
, pv
->pslot
,
2043 (const char *) NULL
);
2046 type
= debug_make_function_type (dhandle
, rtype
, arg_types
, varargs
);
2051 /* Record the type in the table. */
2053 if (type
== DEBUG_TYPE_NULL
)
2056 info
->vars
.vars
[varindx
].type
= type
;
2059 && info
->vars
.vars
[varindx
].namlen
> 0)
2063 name
= savestring (info
->vars
.vars
[varindx
].name
,
2064 info
->vars
.vars
[varindx
].namlen
);
2066 type
= debug_name_type (dhandle
, name
, type
);
2067 else if (tc
== 'E' || tc
== 'N')
2068 type
= debug_tag_type (dhandle
, name
, type
);
2071 struct ieee_tag
*it
;
2073 /* We must allocate all struct tags as indirect types, so
2074 that if we later see a definition of the tag as a C++
2075 record we can update the indirect slot and automatically
2076 change all the existing references. */
2077 it
= (struct ieee_tag
*) xmalloc (sizeof *it
);
2078 memset (it
, 0, sizeof *it
);
2079 it
->next
= info
->tags
;
2084 type
= debug_make_indirect_type (dhandle
, &it
->slot
, name
);
2085 type
= debug_tag_type (dhandle
, name
, type
);
2093 info
->types
.types
[typeindx
].type
= type
;
2094 info
->types
.types
[typeindx
].arg_slots
= arg_slots
;
2095 info
->types
.types
[typeindx
].bitsize
= type_bitsize
;
2097 /* We may have already allocated type as an indirect type pointing
2098 to slot. It does no harm to replace the indirect type with the
2099 real type. Filling in slot as well handles the indirect types
2100 which are already hanging around. */
2101 if (info
->types
.types
[typeindx
].pslot
!= NULL
)
2102 *info
->types
.types
[typeindx
].pslot
= type
;
2107 /* Parse an ATN record. */
2110 parse_ieee_atn (info
, pp
)
2111 struct ieee_info
*info
;
2112 const bfd_byte
**pp
;
2114 const bfd_byte
*atn_start
, *atn_code_start
;
2116 struct ieee_var
*pvar
;
2120 bfd_vma v
, v2
, v3
, v4
, v5
;
2122 unsigned long namlen
;
2129 if (! ieee_read_number (info
, pp
, &varindx
)
2130 || ! ieee_read_type_index (info
, pp
, &type
))
2133 atn_code_start
= *pp
;
2135 if (! ieee_read_number (info
, pp
, &atn_code
))
2144 else if (varindx
< 32)
2146 /* The MRI compiler reportedly sometimes emits variable lifetime
2147 information for a register. We just ignore it. */
2149 return ieee_read_number (info
, pp
, &v
);
2151 ieee_error (info
, atn_start
, _("illegal variable index"));
2157 if (varindx
>= info
->vars
.alloc
2158 || info
->vars
.vars
[varindx
].name
== NULL
)
2160 /* The MRI compiler or linker sometimes omits the NN record
2161 for a pmisc record. */
2164 if (varindx
>= info
->vars
.alloc
)
2168 alloc
= info
->vars
.alloc
;
2171 while (varindx
>= alloc
)
2173 info
->vars
.vars
= ((struct ieee_var
*)
2174 xrealloc (info
->vars
.vars
,
2176 * sizeof *info
->vars
.vars
)));
2177 memset (info
->vars
.vars
+ info
->vars
.alloc
, 0,
2178 ((alloc
- info
->vars
.alloc
)
2179 * sizeof *info
->vars
.vars
));
2180 info
->vars
.alloc
= alloc
;
2183 pvar
= info
->vars
.vars
+ varindx
;
2189 ieee_error (info
, atn_start
, _("undefined variable in ATN"));
2194 pvar
= info
->vars
.vars
+ varindx
;
2199 namlen
= pvar
->namlen
;
2202 dhandle
= info
->dhandle
;
2204 /* If we are going to call debug_record_variable with a pointer
2205 type, change the type to an indirect type so that we can later
2206 change it to a reference type if we encounter a C++ pmisc 'R'
2209 && type
!= DEBUG_TYPE_NULL
2210 && debug_get_type_kind (dhandle
, type
) == DEBUG_KIND_POINTER
)
2220 pvar
->pslot
= (debug_type
*) xmalloc (sizeof *pvar
->pslot
);
2221 *pvar
->pslot
= type
;
2222 type
= debug_make_indirect_type (dhandle
, pvar
->pslot
,
2223 (const char *) NULL
);
2232 ieee_error (info
, atn_code_start
, _("unknown ATN type"));
2236 /* Automatic variable. */
2237 if (! ieee_read_number (info
, pp
, &v
))
2239 namcopy
= savestring (name
, namlen
);
2241 type
= debug_make_void_type (dhandle
);
2243 pvar
->kind
= IEEE_LOCAL
;
2244 return debug_record_variable (dhandle
, namcopy
, type
, DEBUG_LOCAL
, v
);
2247 /* Register variable. */
2248 if (! ieee_read_number (info
, pp
, &v
))
2250 namcopy
= savestring (name
, namlen
);
2252 type
= debug_make_void_type (dhandle
);
2254 pvar
->kind
= IEEE_LOCAL
;
2255 return debug_record_variable (dhandle
, namcopy
, type
, DEBUG_REGISTER
,
2256 ieee_regno_to_genreg (info
->abfd
, v
));
2259 /* Static variable. */
2260 if (! ieee_require_asn (info
, pp
, &v
))
2262 namcopy
= savestring (name
, namlen
);
2264 type
= debug_make_void_type (dhandle
);
2265 if (info
->blockstack
.bsp
<= info
->blockstack
.stack
)
2268 blocktype
= info
->blockstack
.bsp
[-1].kind
;
2271 if (blocktype
== 4 || blocktype
== 6)
2272 pvar
->kind
= IEEE_LOCAL
;
2274 pvar
->kind
= IEEE_STATIC
;
2276 return debug_record_variable (dhandle
, namcopy
, type
,
2277 (blocktype
== 4 || blocktype
== 6
2278 ? DEBUG_LOCAL_STATIC
2283 /* External function. We don't currently record these. FIXME. */
2285 pvar
->kind
= IEEE_EXTERNAL
;
2289 /* External variable. We don't currently record these. FIXME. */
2291 pvar
->kind
= IEEE_EXTERNAL
;
2295 if (! ieee_read_number (info
, pp
, &v
)
2296 || ! ieee_read_number (info
, pp
, &v2
)
2297 || ! ieee_read_optional_number (info
, pp
, &v3
, &present
))
2301 if (! ieee_read_optional_number (info
, pp
, &v4
, &present
))
2305 /* We just ignore the two optional fields in v3 and v4, since
2306 they are not defined. */
2308 if (! ieee_require_asn (info
, pp
, &v3
))
2311 /* We have no way to record the column number. FIXME. */
2313 return debug_record_line (dhandle
, v
, v3
);
2316 /* Global variable. */
2317 if (! ieee_require_asn (info
, pp
, &v
))
2319 namcopy
= savestring (name
, namlen
);
2321 type
= debug_make_void_type (dhandle
);
2323 pvar
->kind
= IEEE_GLOBAL
;
2324 return debug_record_variable (dhandle
, namcopy
, type
, DEBUG_GLOBAL
, v
);
2327 /* Variable lifetime information. */
2328 if (! ieee_read_number (info
, pp
, &v
))
2331 /* We have no way to record this information. FIXME. */
2335 /* Locked register. The spec says that there are two required
2336 fields, but at least on occasion the MRI compiler only emits
2338 if (! ieee_read_number (info
, pp
, &v
)
2339 || ! ieee_read_optional_number (info
, pp
, &v2
, &present
))
2342 /* I think this means a variable that is both in a register and
2343 a frame slot. We ignore the frame slot. FIXME. */
2345 namcopy
= savestring (name
, namlen
);
2347 type
= debug_make_void_type (dhandle
);
2349 pvar
->kind
= IEEE_LOCAL
;
2350 return debug_record_variable (dhandle
, namcopy
, type
, DEBUG_REGISTER
, v
);
2353 /* Reserved for FORTRAN common. */
2354 ieee_error (info
, atn_code_start
, _("unsupported ATN11"));
2356 /* Return true to keep going. */
2360 /* Based variable. */
2364 if (! ieee_read_number (info
, pp
, &v
)
2365 || ! ieee_read_number (info
, pp
, &v2
)
2366 || ! ieee_read_optional_number (info
, pp
, &v3
, &present
))
2370 if (! ieee_read_optional_number (info
, pp
, &v4
, &present
))
2374 if (! ieee_read_optional_number (info
, pp
, &v5
, &present
))
2379 /* We have no way to record this information. FIXME. */
2381 ieee_error (info
, atn_code_start
, _("unsupported ATN12"));
2383 /* Return true to keep going. */
2387 /* Constant. The description of this that I have is ambiguous,
2388 so I'm not going to try to implement it. */
2389 if (! ieee_read_number (info
, pp
, &v
)
2390 || ! ieee_read_optional_number (info
, pp
, &v2
, &present
))
2394 if (! ieee_read_optional_number (info
, pp
, &v2
, &present
))
2398 if (! ieee_read_optional_id (info
, pp
, &name
, &namlen
, &present
))
2403 if ((ieee_record_enum_type
) **pp
== ieee_e2_first_byte_enum
)
2405 if (! ieee_require_asn (info
, pp
, &v3
))
2412 /* Static variable from assembler. */
2414 if (! ieee_read_number (info
, pp
, &v
)
2415 || ! ieee_read_optional_number (info
, pp
, &v2
, &present
)
2416 || ! ieee_require_asn (info
, pp
, &v3
))
2418 namcopy
= savestring (name
, namlen
);
2419 /* We don't really handle this correctly. FIXME. */
2420 return debug_record_variable (dhandle
, namcopy
,
2421 debug_make_void_type (dhandle
),
2422 v2
!= 0 ? DEBUG_GLOBAL
: DEBUG_STATIC
,
2426 /* Procedure miscellaneous information. */
2428 /* Variable miscellaneous information. */
2430 /* Module miscellaneous information. */
2431 if (! ieee_read_number (info
, pp
, &v
)
2432 || ! ieee_read_number (info
, pp
, &v2
)
2433 || ! ieee_read_optional_id (info
, pp
, &name
, &namlen
, &present
))
2436 if (atn_code
== 62 && v
== 80)
2440 ieee_error (info
, atn_code_start
,
2441 _("unexpected string in C++ misc"));
2444 return ieee_read_cxx_misc (info
, pp
, v2
);
2447 /* We just ignore all of this stuff. FIXME. */
2449 for (; v2
> 0; --v2
)
2451 switch ((ieee_record_enum_type
) **pp
)
2454 ieee_error (info
, *pp
, _("bad misc record"));
2457 case ieee_at_record_enum
:
2458 if (! ieee_require_atn65 (info
, pp
, &name
, &namlen
))
2462 case ieee_e2_first_byte_enum
:
2463 if (! ieee_require_asn (info
, pp
, &v3
))
2475 /* Handle C++ debugging miscellaneous records. This is called for
2476 procedure miscellaneous records of type 80. */
2479 ieee_read_cxx_misc (info
, pp
, count
)
2480 struct ieee_info
*info
;
2481 const bfd_byte
**pp
;
2482 unsigned long count
;
2484 const bfd_byte
*start
;
2489 /* Get the category of C++ misc record. */
2490 if (! ieee_require_asn (info
, pp
, &category
))
2497 ieee_error (info
, start
, _("unrecognized C++ misc record"));
2501 if (! ieee_read_cxx_class (info
, pp
, count
))
2509 unsigned long namlen
;
2511 /* The IEEE spec indicates that the 'M' record only has a
2512 flags field. The MRI compiler also emits the name of the
2515 if (! ieee_require_asn (info
, pp
, &flags
))
2517 if (*pp
< info
->pend
2518 && (ieee_record_enum_type
) **pp
== ieee_at_record_enum
)
2520 if (! ieee_require_atn65 (info
, pp
, &name
, &namlen
))
2524 /* This is emitted for method functions, but I don't think we
2525 care very much. It might help if it told us useful
2526 information like the class with which this function is
2527 associated, but it doesn't, so it isn't helpful. */
2532 if (! ieee_read_cxx_defaults (info
, pp
, count
))
2538 const char *name
, *mangled
, *class;
2539 unsigned long namlen
, mangledlen
, classlen
;
2542 /* Pointer to member. */
2544 if (! ieee_require_atn65 (info
, pp
, &name
, &namlen
)
2545 || ! ieee_require_atn65 (info
, pp
, &mangled
, &mangledlen
)
2546 || ! ieee_require_atn65 (info
, pp
, &class, &classlen
)
2547 || ! ieee_require_asn (info
, pp
, &control
))
2550 /* FIXME: We should now track down name and change its type. */
2555 if (! ieee_read_reference (info
, pp
))
2563 /* Read a C++ class definition. This is a pmisc type 80 record of
2567 ieee_read_cxx_class (info
, pp
, count
)
2568 struct ieee_info
*info
;
2569 const bfd_byte
**pp
;
2570 unsigned long count
;
2572 const bfd_byte
*start
;
2575 unsigned long taglen
;
2576 struct ieee_tag
*it
;
2578 debug_field
*fields
;
2579 unsigned int field_count
, field_alloc
;
2580 debug_baseclass
*baseclasses
;
2581 unsigned int baseclasses_count
, baseclasses_alloc
;
2582 const debug_field
*structfields
;
2586 unsigned long namlen
;
2587 debug_method_variant
*variants
;
2591 unsigned int methods_count
, methods_alloc
;
2592 debug_type vptrbase
;
2594 debug_method
*dmethods
;
2598 if (! ieee_require_asn (info
, pp
, &class))
2602 if (! ieee_require_atn65 (info
, pp
, &tag
, &taglen
))
2606 /* Find the C struct with this name. */
2607 for (it
= info
->tags
; it
!= NULL
; it
= it
->next
)
2608 if (it
->name
[0] == tag
[0]
2609 && strncmp (it
->name
, tag
, taglen
) == 0
2610 && strlen (it
->name
) == taglen
)
2614 ieee_error (info
, start
, _("undefined C++ object"));
2618 dhandle
= info
->dhandle
;
2624 baseclasses_count
= 0;
2625 baseclasses_alloc
= 0;
2629 vptrbase
= DEBUG_TYPE_NULL
;
2632 structfields
= debug_get_fields (dhandle
, it
->type
);
2637 const bfd_byte
*spec_start
;
2641 if (! ieee_require_asn (info
, pp
, &id
))
2648 ieee_error (info
, spec_start
, _("unrecognized C++ object spec"));
2653 bfd_vma flags
, cinline
;
2654 const char *basename
, *fieldname
;
2655 unsigned long baselen
, fieldlen
;
2657 debug_type basetype
;
2660 enum debug_visibility visibility
;
2661 debug_baseclass baseclass
;
2663 /* This represents a base or friend class. */
2665 if (! ieee_require_asn (info
, pp
, &flags
)
2666 || ! ieee_require_atn65 (info
, pp
, &basename
, &baselen
)
2667 || ! ieee_require_asn (info
, pp
, &cinline
)
2668 || ! ieee_require_atn65 (info
, pp
, &fieldname
, &fieldlen
))
2672 /* We have no way of recording friend information, so we
2674 if ((flags
& BASEFLAGS_FRIEND
) != 0)
2677 /* I assume that either all of the members of the
2678 baseclass are included in the object, starting at the
2679 beginning of the object, or that none of them are
2682 if ((fieldlen
== 0) == (cinline
== 0))
2684 ieee_error (info
, start
, _("unsupported C++ object type"));
2688 basecopy
= savestring (basename
, baselen
);
2689 basetype
= debug_find_tagged_type (dhandle
, basecopy
,
2690 DEBUG_KIND_ILLEGAL
);
2692 if (basetype
== DEBUG_TYPE_NULL
)
2694 ieee_error (info
, start
, _("C++ base class not defined"));
2702 const debug_field
*pf
;
2704 if (structfields
== NULL
)
2706 ieee_error (info
, start
, _("C++ object has no fields"));
2710 for (pf
= structfields
; *pf
!= DEBUG_FIELD_NULL
; pf
++)
2714 fname
= debug_get_field_name (dhandle
, *pf
);
2717 if (fname
[0] == fieldname
[0]
2718 && strncmp (fname
, fieldname
, fieldlen
) == 0
2719 && strlen (fname
) == fieldlen
)
2722 if (*pf
== DEBUG_FIELD_NULL
)
2724 ieee_error (info
, start
,
2725 _("C++ base class not found in container"));
2729 bitpos
= debug_get_field_bitpos (dhandle
, *pf
);
2732 if ((flags
& BASEFLAGS_VIRTUAL
) != 0)
2736 if ((flags
& BASEFLAGS_PRIVATE
) != 0)
2737 visibility
= DEBUG_VISIBILITY_PRIVATE
;
2739 visibility
= DEBUG_VISIBILITY_PUBLIC
;
2741 baseclass
= debug_make_baseclass (dhandle
, basetype
, bitpos
,
2742 virtualp
, visibility
);
2743 if (baseclass
== DEBUG_BASECLASS_NULL
)
2746 if (baseclasses_count
+ 1 >= baseclasses_alloc
)
2748 baseclasses_alloc
+= 10;
2749 baseclasses
= ((debug_baseclass
*)
2750 xrealloc (baseclasses
,
2752 * sizeof *baseclasses
)));
2755 baseclasses
[baseclasses_count
] = baseclass
;
2756 ++baseclasses_count
;
2757 baseclasses
[baseclasses_count
] = DEBUG_BASECLASS_NULL
;
2764 const char *fieldname
, *mangledname
;
2765 unsigned long fieldlen
, mangledlen
;
2769 const debug_field
*pf
= NULL
;
2770 enum debug_visibility visibility
;
2773 /* This represents a data member. */
2775 if (! ieee_require_asn (info
, pp
, &flags
)
2776 || ! ieee_require_atn65 (info
, pp
, &fieldname
, &fieldlen
)
2777 || ! ieee_require_atn65 (info
, pp
, &mangledname
, &mangledlen
))
2781 fieldcopy
= savestring (fieldname
, fieldlen
);
2783 staticp
= (flags
& CXXFLAGS_STATIC
) != 0 ? true : false;
2787 struct ieee_var
*pv
, *pvend
;
2789 /* See if we can find a definition for this variable. */
2790 pv
= info
->vars
.vars
;
2791 pvend
= pv
+ info
->vars
.alloc
;
2792 for (; pv
< pvend
; pv
++)
2793 if (pv
->namlen
== mangledlen
2794 && strncmp (pv
->name
, mangledname
, mangledlen
) == 0)
2800 /* This can happen if the variable is never used. */
2801 ftype
= ieee_builtin_type (info
, start
,
2802 (unsigned int) builtin_void
);
2809 if (structfields
== NULL
)
2811 ieee_error (info
, start
, _("C++ object has no fields"));
2815 for (pf
= structfields
, findx
= 0;
2816 *pf
!= DEBUG_FIELD_NULL
;
2821 fname
= debug_get_field_name (dhandle
, *pf
);
2824 if (fname
[0] == mangledname
[0]
2825 && strncmp (fname
, mangledname
, mangledlen
) == 0
2826 && strlen (fname
) == mangledlen
)
2829 if (*pf
== DEBUG_FIELD_NULL
)
2831 ieee_error (info
, start
,
2832 _("C++ data member not found in container"));
2836 ftype
= debug_get_field_type (dhandle
, *pf
);
2838 if (debug_get_type_kind (dhandle
, ftype
) == DEBUG_KIND_POINTER
)
2840 /* We might need to convert this field into a
2841 reference type later on, so make it an indirect
2843 if (it
->fslots
== NULL
)
2846 const debug_field
*pfcnt
;
2849 for (pfcnt
= structfields
;
2850 *pfcnt
!= DEBUG_FIELD_NULL
;
2853 it
->fslots
= ((debug_type
*)
2854 xmalloc (fcnt
* sizeof *it
->fslots
));
2855 memset (it
->fslots
, 0,
2856 fcnt
* sizeof *it
->fslots
);
2859 if (ftype
== DEBUG_TYPE_NULL
)
2861 it
->fslots
[findx
] = ftype
;
2862 ftype
= debug_make_indirect_type (dhandle
,
2864 (const char *) NULL
);
2867 if (ftype
== DEBUG_TYPE_NULL
)
2870 switch (flags
& CXXFLAGS_VISIBILITY
)
2873 ieee_error (info
, start
, _("unknown C++ visibility"));
2876 case CXXFLAGS_VISIBILITY_PUBLIC
:
2877 visibility
= DEBUG_VISIBILITY_PUBLIC
;
2880 case CXXFLAGS_VISIBILITY_PRIVATE
:
2881 visibility
= DEBUG_VISIBILITY_PRIVATE
;
2884 case CXXFLAGS_VISIBILITY_PROTECTED
:
2885 visibility
= DEBUG_VISIBILITY_PROTECTED
;
2893 mangledcopy
= savestring (mangledname
, mangledlen
);
2895 field
= debug_make_static_member (dhandle
, fieldcopy
,
2901 bfd_vma bitpos
, bitsize
;
2903 bitpos
= debug_get_field_bitpos (dhandle
, *pf
);
2904 bitsize
= debug_get_field_bitsize (dhandle
, *pf
);
2905 if (bitpos
== (bfd_vma
) -1 || bitsize
== (bfd_vma
) -1)
2907 ieee_error (info
, start
, _("bad C++ field bit pos or size"));
2910 field
= debug_make_field (dhandle
, fieldcopy
, ftype
, bitpos
,
2911 bitsize
, visibility
);
2914 if (field
== DEBUG_FIELD_NULL
)
2917 if (field_count
+ 1 >= field_alloc
)
2920 fields
= ((debug_field
*)
2921 xrealloc (fields
, field_alloc
* sizeof *fields
));
2924 fields
[field_count
] = field
;
2926 fields
[field_count
] = DEBUG_FIELD_NULL
;
2933 bfd_vma flags
, voffset
, control
;
2934 const char *name
, *mangled
;
2935 unsigned long namlen
, mangledlen
;
2936 struct ieee_var
*pv
, *pvend
;
2938 enum debug_visibility visibility
;
2939 boolean constp
, volatilep
;
2941 debug_method_variant mv
;
2942 struct ieee_method
*meth
;
2945 if (! ieee_require_asn (info
, pp
, &flags
)
2946 || ! ieee_require_atn65 (info
, pp
, &name
, &namlen
)
2947 || ! ieee_require_atn65 (info
, pp
, &mangled
, &mangledlen
))
2954 if (! ieee_require_asn (info
, pp
, &voffset
))
2958 if (! ieee_require_asn (info
, pp
, &control
))
2962 /* We just ignore the control information. */
2964 /* We have no way to represent friend information, so we
2966 if ((flags
& CXXFLAGS_FRIEND
) != 0)
2969 /* We should already have seen a type for the function. */
2970 pv
= info
->vars
.vars
;
2971 pvend
= pv
+ info
->vars
.alloc
;
2972 for (; pv
< pvend
; pv
++)
2973 if (pv
->namlen
== mangledlen
2974 && strncmp (pv
->name
, mangled
, mangledlen
) == 0)
2979 /* We won't have type information for this function if
2980 it is not included in this file. We don't try to
2981 handle this case. FIXME. */
2982 type
= (debug_make_function_type
2984 ieee_builtin_type (info
, start
,
2985 (unsigned int) builtin_void
),
2986 (debug_type
*) NULL
,
2991 debug_type return_type
;
2992 const debug_type
*arg_types
;
2995 if (debug_get_type_kind (dhandle
, pv
->type
)
2996 != DEBUG_KIND_FUNCTION
)
2998 ieee_error (info
, start
,
2999 _("bad type for C++ method function"));
3003 return_type
= debug_get_return_type (dhandle
, pv
->type
);
3004 arg_types
= debug_get_parameter_types (dhandle
, pv
->type
,
3006 if (return_type
== DEBUG_TYPE_NULL
|| arg_types
== NULL
)
3008 ieee_error (info
, start
,
3009 _("no type information for C++ method function"));
3013 type
= debug_make_method_type (dhandle
, return_type
, it
->type
,
3014 (debug_type
*) arg_types
,
3017 if (type
== DEBUG_TYPE_NULL
)
3020 switch (flags
& CXXFLAGS_VISIBILITY
)
3023 ieee_error (info
, start
, _("unknown C++ visibility"));
3026 case CXXFLAGS_VISIBILITY_PUBLIC
:
3027 visibility
= DEBUG_VISIBILITY_PUBLIC
;
3030 case CXXFLAGS_VISIBILITY_PRIVATE
:
3031 visibility
= DEBUG_VISIBILITY_PRIVATE
;
3034 case CXXFLAGS_VISIBILITY_PROTECTED
:
3035 visibility
= DEBUG_VISIBILITY_PROTECTED
;
3039 constp
= (flags
& CXXFLAGS_CONST
) != 0 ? true : false;
3040 volatilep
= (flags
& CXXFLAGS_VOLATILE
) != 0 ? true : false;
3042 mangledcopy
= savestring (mangled
, mangledlen
);
3044 if ((flags
& CXXFLAGS_STATIC
) != 0)
3048 ieee_error (info
, start
, _("C++ static virtual method"));
3051 mv
= debug_make_static_method_variant (dhandle
, mangledcopy
,
3057 debug_type vcontext
;
3060 vcontext
= DEBUG_TYPE_NULL
;
3063 /* FIXME: How can we calculate this correctly? */
3064 vcontext
= it
->type
;
3066 mv
= debug_make_method_variant (dhandle
, mangledcopy
, type
,
3071 if (mv
== DEBUG_METHOD_VARIANT_NULL
)
3074 for (meth
= methods
, im
= 0; im
< methods_count
; meth
++, im
++)
3075 if (meth
->namlen
== namlen
3076 && strncmp (meth
->name
, name
, namlen
) == 0)
3078 if (im
>= methods_count
)
3080 if (methods_count
>= methods_alloc
)
3082 methods_alloc
+= 10;
3083 methods
= ((struct ieee_method
*)
3085 methods_alloc
* sizeof *methods
));
3087 methods
[methods_count
].name
= name
;
3088 methods
[methods_count
].namlen
= namlen
;
3089 methods
[methods_count
].variants
= NULL
;
3090 methods
[methods_count
].count
= 0;
3091 methods
[methods_count
].alloc
= 0;
3092 meth
= methods
+ methods_count
;
3096 if (meth
->count
+ 1 >= meth
->alloc
)
3099 meth
->variants
= ((debug_method_variant
*)
3100 xrealloc (meth
->variants
,
3102 * sizeof *meth
->variants
)));
3105 meth
->variants
[meth
->count
] = mv
;
3107 meth
->variants
[meth
->count
] = DEBUG_METHOD_VARIANT_NULL
;
3115 /* We have no way to store this information, so we just
3117 if (! ieee_require_asn (info
, pp
, &spec
))
3120 if ((spec
& 4) != 0)
3122 const char *filename
;
3123 unsigned long filenamlen
;
3126 if (! ieee_require_atn65 (info
, pp
, &filename
, &filenamlen
)
3127 || ! ieee_require_asn (info
, pp
, &lineno
))
3131 else if ((spec
& 8) != 0)
3133 const char *mangled
;
3134 unsigned long mangledlen
;
3136 if (! ieee_require_atn65 (info
, pp
, &mangled
, &mangledlen
))
3142 ieee_error (info
, start
,
3143 _("unrecognized C++ object overhead spec"));
3151 const char *vname
, *basename
;
3152 unsigned long vnamelen
, baselen
;
3153 bfd_vma vsize
, control
;
3155 /* A virtual table pointer. */
3157 if (! ieee_require_atn65 (info
, pp
, &vname
, &vnamelen
)
3158 || ! ieee_require_asn (info
, pp
, &vsize
)
3159 || ! ieee_require_atn65 (info
, pp
, &basename
, &baselen
)
3160 || ! ieee_require_asn (info
, pp
, &control
))
3164 /* We just ignore the control number. We don't care what
3165 the virtual table name is. We have no way to store the
3166 virtual table size, and I don't think we care anyhow. */
3168 /* FIXME: We can't handle multiple virtual table pointers. */
3176 basecopy
= savestring (basename
, baselen
);
3177 vptrbase
= debug_find_tagged_type (dhandle
, basecopy
,
3178 DEBUG_KIND_ILLEGAL
);
3180 if (vptrbase
== DEBUG_TYPE_NULL
)
3182 ieee_error (info
, start
, _("undefined C++ vtable"));
3191 /* Now that we have seen all the method variants, we can call
3192 debug_make_method for each one. */
3194 if (methods_count
== 0)
3200 dmethods
= ((debug_method
*)
3201 xmalloc ((methods_count
+ 1) * sizeof *dmethods
));
3202 for (i
= 0; i
< methods_count
; i
++)
3206 namcopy
= savestring (methods
[i
].name
, methods
[i
].namlen
);
3207 dmethods
[i
] = debug_make_method (dhandle
, namcopy
,
3208 methods
[i
].variants
);
3209 if (dmethods
[i
] == DEBUG_METHOD_NULL
)
3212 dmethods
[i
] = DEBUG_METHOD_NULL
;
3216 /* The struct type was created as an indirect type pointing at
3217 it->slot. We update it->slot to automatically update all
3218 references to this struct. */
3219 it
->slot
= debug_make_object_type (dhandle
,
3221 debug_get_type_size (dhandle
,
3223 fields
, baseclasses
, dmethods
,
3225 if (it
->slot
== DEBUG_TYPE_NULL
)
3231 /* Read C++ default argument value and reference type information. */
3234 ieee_read_cxx_defaults (info
, pp
, count
)
3235 struct ieee_info
*info
;
3236 const bfd_byte
**pp
;
3237 unsigned long count
;
3239 const bfd_byte
*start
;
3241 unsigned long fnlen
;
3246 /* Giving the function name before the argument count is an addendum
3247 to the spec. The function name is demangled, though, so this
3248 record must always refer to the current function. */
3250 if (info
->blockstack
.bsp
<= info
->blockstack
.stack
3251 || info
->blockstack
.bsp
[-1].fnindx
== (unsigned int) -1)
3253 ieee_error (info
, start
, _("C++ default values not in a function"));
3257 if (! ieee_require_atn65 (info
, pp
, &fnname
, &fnlen
)
3258 || ! ieee_require_asn (info
, pp
, &defcount
))
3262 while (defcount
-- > 0)
3266 unsigned long strvallen
;
3268 if (! ieee_require_asn (info
, pp
, &type
))
3280 if (! ieee_require_asn (info
, pp
, &val
))
3287 if (! ieee_require_atn65 (info
, pp
, &strval
, &strvallen
))
3293 ieee_error (info
, start
, _("unrecognized C++ default type"));
3297 /* We have no way to record the default argument values, so we
3298 just ignore them. FIXME. */
3301 /* Any remaining arguments are indices of parameters that are really
3306 debug_type
*arg_slots
;
3308 dhandle
= info
->dhandle
;
3309 arg_slots
= info
->types
.types
[info
->blockstack
.bsp
[-1].fnindx
].arg_slots
;
3315 if (! ieee_require_asn (info
, pp
, &indx
))
3317 /* The index is 1 based. */
3319 if (arg_slots
== NULL
3320 || arg_slots
[indx
] == DEBUG_TYPE_NULL
3321 || (debug_get_type_kind (dhandle
, arg_slots
[indx
])
3322 != DEBUG_KIND_POINTER
))
3324 ieee_error (info
, start
, _("reference parameter is not a pointer"));
3328 target
= debug_get_target_type (dhandle
, arg_slots
[indx
]);
3329 arg_slots
[indx
] = debug_make_reference_type (dhandle
, target
);
3330 if (arg_slots
[indx
] == DEBUG_TYPE_NULL
)
3338 /* Read a C++ reference definition. */
3341 ieee_read_reference (info
, pp
)
3342 struct ieee_info
*info
;
3343 const bfd_byte
**pp
;
3345 const bfd_byte
*start
;
3347 const char *class, *name
;
3348 unsigned long classlen
, namlen
;
3354 if (! ieee_require_asn (info
, pp
, &flags
))
3357 /* Giving the class name before the member name is in an addendum to
3361 if (! ieee_require_atn65 (info
, pp
, &class, &classlen
))
3365 if (! ieee_require_atn65 (info
, pp
, &name
, &namlen
))
3373 /* We search from the last variable indices to the first in
3374 hopes of finding local variables correctly. We search the
3375 local variables on the first pass, and the global variables
3376 on the second. FIXME: This probably won't work in all cases.
3377 On the other hand, I don't know what will. */
3378 for (pass
= 0; pass
< 2; pass
++)
3380 struct ieee_vars
*vars
;
3382 struct ieee_var
*pv
= NULL
;
3388 vars
= info
->global_vars
;
3393 for (i
= (int) vars
->alloc
- 1; i
>= 0; i
--)
3397 pv
= vars
->vars
+ i
;
3399 if (pv
->pslot
== NULL
3400 || pv
->namlen
!= namlen
3401 || strncmp (pv
->name
, name
, namlen
) != 0)
3408 ieee_error (info
, start
,
3409 _("unrecognized C++ reference type"));
3413 /* Global variable or function. */
3414 if (pv
->kind
== IEEE_GLOBAL
3415 || pv
->kind
== IEEE_EXTERNAL
3416 || pv
->kind
== IEEE_FUNCTION
)
3421 /* Global static variable or function. */
3422 if (pv
->kind
== IEEE_STATIC
3423 || pv
->kind
== IEEE_FUNCTION
)
3428 /* Local variable. */
3429 if (pv
->kind
== IEEE_LOCAL
)
3447 struct ieee_tag
*it
;
3449 for (it
= info
->tags
; it
!= NULL
; it
= it
->next
)
3451 if (it
->name
[0] == class[0]
3452 && strncmp (it
->name
, class, classlen
) == 0
3453 && strlen (it
->name
) == classlen
)
3455 if (it
->fslots
!= NULL
)
3457 const debug_field
*pf
;
3460 pf
= debug_get_fields (info
->dhandle
, it
->type
);
3463 ieee_error (info
, start
,
3464 "C++ reference in class with no fields");
3468 for (findx
= 0; *pf
!= DEBUG_FIELD_NULL
; pf
++, findx
++)
3472 fname
= debug_get_field_name (info
->dhandle
, *pf
);
3475 if (strncmp (fname
, name
, namlen
) == 0
3476 && strlen (fname
) == namlen
)
3478 pslot
= it
->fslots
+ findx
;
3491 ieee_error (info
, start
, _("C++ reference not found"));
3495 /* We allocated the type of the object as an indirect type pointing
3496 to *pslot, which we can now update to be a reference type. */
3497 if (debug_get_type_kind (info
->dhandle
, *pslot
) != DEBUG_KIND_POINTER
)
3499 ieee_error (info
, start
, _("C++ reference is not pointer"));
3503 target
= debug_get_target_type (info
->dhandle
, *pslot
);
3504 *pslot
= debug_make_reference_type (info
->dhandle
, target
);
3505 if (*pslot
== DEBUG_TYPE_NULL
)
3511 /* Require an ASN record. */
3514 ieee_require_asn (info
, pp
, pv
)
3515 struct ieee_info
*info
;
3516 const bfd_byte
**pp
;
3519 const bfd_byte
*start
;
3520 ieee_record_enum_type c
;
3525 c
= (ieee_record_enum_type
) **pp
;
3526 if (c
!= ieee_e2_first_byte_enum
)
3528 ieee_error (info
, start
, _("missing required ASN"));
3533 c
= (ieee_record_enum_type
) (((unsigned int) c
<< 8) | **pp
);
3534 if (c
!= ieee_asn_record_enum
)
3536 ieee_error (info
, start
, _("missing required ASN"));
3541 /* Just ignore the variable index. */
3542 if (! ieee_read_number (info
, pp
, &varindx
))
3545 return ieee_read_expression (info
, pp
, pv
);
3548 /* Require an ATN65 record. */
3551 ieee_require_atn65 (info
, pp
, pname
, pnamlen
)
3552 struct ieee_info
*info
;
3553 const bfd_byte
**pp
;
3555 unsigned long *pnamlen
;
3557 const bfd_byte
*start
;
3558 ieee_record_enum_type c
;
3559 bfd_vma name_indx
, type_indx
, atn_code
;
3563 c
= (ieee_record_enum_type
) **pp
;
3564 if (c
!= ieee_at_record_enum
)
3566 ieee_error (info
, start
, _("missing required ATN65"));
3571 c
= (ieee_record_enum_type
) (((unsigned int) c
<< 8) | **pp
);
3572 if (c
!= ieee_atn_record_enum
)
3574 ieee_error (info
, start
, _("missing required ATN65"));
3579 if (! ieee_read_number (info
, pp
, &name_indx
)
3580 || ! ieee_read_number (info
, pp
, &type_indx
)
3581 || ! ieee_read_number (info
, pp
, &atn_code
))
3584 /* Just ignore name_indx. */
3586 if (type_indx
!= 0 || atn_code
!= 65)
3588 ieee_error (info
, start
, _("bad ATN65 record"));
3592 return ieee_read_id (info
, pp
, pname
, pnamlen
);
3595 /* Convert a register number in IEEE debugging information into a
3596 generic register number. */
3599 ieee_regno_to_genreg (abfd
, r
)
3603 switch (bfd_get_arch (abfd
))
3606 /* For some reasons stabs adds 2 to the floating point register
3613 /* Stabs uses 0 to 15 for r0 to r15, 16 to 31 for g0 to g15, and
3614 32 to 35 for fp0 to fp3. */
3625 /* Convert a generic register number to an IEEE specific one. */
3628 ieee_genreg_to_regno (abfd
, r
)
3632 switch (bfd_get_arch (abfd
))
3635 /* For some reason stabs add 2 to the floating point register
3642 /* Stabs uses 0 to 15 for r0 to r15, 16 to 31 for g0 to g15, and
3643 32 to 35 for fp0 to fp3. */
3654 /* These routines build IEEE debugging information out of the generic
3655 debugging information. */
3657 /* We build the IEEE debugging information byte by byte. Rather than
3658 waste time copying data around, we use a linked list of buffers to
3661 #define IEEE_BUFSIZE (490)
3666 struct ieee_buf
*next
;
3667 /* Number of data bytes in this buffer. */
3670 bfd_byte buf
[IEEE_BUFSIZE
];
3673 /* A list of buffers. */
3678 struct ieee_buf
*head
;
3679 /* Tail--last buffer on list. */
3680 struct ieee_buf
*tail
;
3683 /* In order to generate the BB11 blocks required by the HP emulator,
3684 we keep track of ranges of addresses which correspond to a given
3685 compilation unit. */
3690 struct ieee_range
*next
;
3697 /* This structure holds information for a class on the type stack. */
3699 struct ieee_type_class
3701 /* The name index in the debugging information. */
3703 /* The pmisc records for the class. */
3704 struct ieee_buflist pmiscbuf
;
3705 /* The number of pmisc records. */
3706 unsigned int pmisccount
;
3707 /* The name of the class holding the virtual table, if not this
3710 /* Whether this class holds its own virtual table. */
3712 /* The largest virtual table offset seen so far. */
3714 /* The current method. */
3716 /* Additional pmisc records used to record fields of reference type. */
3717 struct ieee_buflist refs
;
3720 /* This is how we store types for the writing routines. Most types
3721 are simply represented by a type index. */
3723 struct ieee_write_type
3727 /* The size of the type, if known. */
3729 /* The name of the type, if any. */
3731 /* If this is a function or method type, we build the type here, and
3732 only add it to the output buffers if we need it. */
3733 struct ieee_buflist fndef
;
3734 /* If this is a struct, this is where the struct definition is
3736 struct ieee_buflist strdef
;
3737 /* If this is a class, this is where the class information is built. */
3738 struct ieee_type_class
*classdef
;
3739 /* Whether the type is unsigned. */
3740 unsigned int unsignedp
: 1;
3741 /* Whether this is a reference type. */
3742 unsigned int referencep
: 1;
3743 /* Whether this is in the local type block. */
3744 unsigned int localp
: 1;
3745 /* Whether this is a duplicate struct definition which we are
3747 unsigned int ignorep
: 1;
3750 /* This is the type stack used by the debug writing routines. FIXME:
3751 We could generate more efficient output if we remembered when we
3752 have output a particular type before. */
3754 struct ieee_type_stack
3756 /* Next entry on stack. */
3757 struct ieee_type_stack
*next
;
3758 /* Type information. */
3759 struct ieee_write_type type
;
3762 /* This is a list of associations between a name and some types.
3763 These are used for typedefs and tags. */
3765 struct ieee_name_type
3767 /* Next type for this name. */
3768 struct ieee_name_type
*next
;
3769 /* ID number. For a typedef, this is the index of the type to which
3770 this name is typedefed. */
3773 struct ieee_write_type type
;
3774 /* If this is a tag which has not yet been defined, this is the
3775 kind. If the tag has been defined, this is DEBUG_KIND_ILLEGAL. */
3776 enum debug_type_kind kind
;
3779 /* We use a hash table to associate names and types. */
3781 struct ieee_name_type_hash_table
3783 struct bfd_hash_table root
;
3786 struct ieee_name_type_hash_entry
3788 struct bfd_hash_entry root
;
3789 /* Information for this name. */
3790 struct ieee_name_type
*types
;
3793 /* This is a list of enums. */
3795 struct ieee_defined_enum
3798 struct ieee_defined_enum
*next
;
3801 /* Whether this enum has been defined. */
3808 bfd_signed_vma
*vals
;
3811 /* We keep a list of modified versions of types, so that we don't
3812 output them more than once. */
3814 struct ieee_modified_type
3816 /* Pointer to this type. */
3817 unsigned int pointer
;
3818 /* Function with unknown arguments returning this type. */
3819 unsigned int function
;
3820 /* Const version of this type. */
3821 unsigned int const_qualified
;
3822 /* Volatile version of this type. */
3823 unsigned int volatile_qualified
;
3824 /* List of arrays of this type of various bounds. */
3825 struct ieee_modified_array_type
*arrays
;
3828 /* A list of arrays bounds. */
3830 struct ieee_modified_array_type
3832 /* Next array bounds. */
3833 struct ieee_modified_array_type
*next
;
3834 /* Type index with these bounds. */
3839 bfd_signed_vma high
;
3842 /* This is a list of pending function parameter information. We don't
3843 output them until we see the first block. */
3845 struct ieee_pending_parm
3847 /* Next pending parameter. */
3848 struct ieee_pending_parm
*next
;
3853 /* Whether the type is a reference. */
3856 enum debug_parm_kind kind
;
3861 /* This is the handle passed down by debug_write. */
3865 /* BFD we are writing to. */
3867 /* Whether we got an error in a subroutine called via traverse or
3868 map_over_sections. */
3870 /* Current data buffer list. */
3871 struct ieee_buflist
*current
;
3872 /* Current data buffer. */
3873 struct ieee_buf
*curbuf
;
3874 /* Filename of current compilation unit. */
3875 const char *filename
;
3876 /* Module name of current compilation unit. */
3877 const char *modname
;
3878 /* List of buffer for global types. */
3879 struct ieee_buflist global_types
;
3880 /* List of finished data buffers. */
3881 struct ieee_buflist data
;
3882 /* List of buffers for typedefs in the current compilation unit. */
3883 struct ieee_buflist types
;
3884 /* List of buffers for variables and functions in the current
3885 compilation unit. */
3886 struct ieee_buflist vars
;
3887 /* List of buffers for C++ class definitions in the current
3888 compilation unit. */
3889 struct ieee_buflist cxx
;
3890 /* List of buffers for line numbers in the current compilation unit. */
3891 struct ieee_buflist linenos
;
3892 /* Ranges for the current compilation unit. */
3893 struct ieee_range
*ranges
;
3894 /* Ranges for all debugging information. */
3895 struct ieee_range
*global_ranges
;
3896 /* Nested pending ranges. */
3897 struct ieee_range
*pending_ranges
;
3899 struct ieee_type_stack
*type_stack
;
3900 /* Next unallocated type index. */
3901 unsigned int type_indx
;
3902 /* Next unallocated name index. */
3903 unsigned int name_indx
;
3905 struct ieee_name_type_hash_table typedefs
;
3907 struct ieee_name_type_hash_table tags
;
3909 struct ieee_defined_enum
*enums
;
3910 /* Modified versions of types. */
3911 struct ieee_modified_type
*modified
;
3912 /* Number of entries allocated in modified. */
3913 unsigned int modified_alloc
;
3914 /* 4 byte complex type. */
3915 unsigned int complex_float_index
;
3916 /* 8 byte complex type. */
3917 unsigned int complex_double_index
;
3918 /* The depth of block nesting. This is 0 outside a function, and 1
3919 just after start_function is called. */
3920 unsigned int block_depth
;
3921 /* The name of the current function. */
3923 /* List of buffers for the type of the function we are currently
3925 struct ieee_buflist fntype
;
3926 /* List of buffers for the parameters of the function we are
3927 currently writing out. */
3928 struct ieee_buflist fnargs
;
3929 /* Number of arguments written to fnargs. */
3930 unsigned int fnargcount
;
3931 /* Pending function parameters. */
3932 struct ieee_pending_parm
*pending_parms
;
3933 /* Current line number filename. */
3934 const char *lineno_filename
;
3935 /* Line number name index. */
3936 unsigned int lineno_name_indx
;
3937 /* Filename of pending line number. */
3938 const char *pending_lineno_filename
;
3939 /* Pending line number. */
3940 unsigned long pending_lineno
;
3941 /* Address of pending line number. */
3942 bfd_vma pending_lineno_addr
;
3943 /* Highest address seen at end of procedure. */
3947 static boolean ieee_init_buffer
3948 PARAMS ((struct ieee_handle
*, struct ieee_buflist
*));
3949 static boolean ieee_change_buffer
3950 PARAMS ((struct ieee_handle
*, struct ieee_buflist
*));
3951 static boolean ieee_append_buffer
3952 PARAMS ((struct ieee_handle
*, struct ieee_buflist
*,
3953 struct ieee_buflist
*));
3954 static boolean ieee_real_write_byte
PARAMS ((struct ieee_handle
*, int));
3955 static boolean ieee_write_2bytes
PARAMS ((struct ieee_handle
*, int));
3956 static boolean ieee_write_number
PARAMS ((struct ieee_handle
*, bfd_vma
));
3957 static boolean ieee_write_id
PARAMS ((struct ieee_handle
*, const char *));
3958 static boolean ieee_write_asn
3959 PARAMS ((struct ieee_handle
*, unsigned int, bfd_vma
));
3960 static boolean ieee_write_atn65
3961 PARAMS ((struct ieee_handle
*, unsigned int, const char *));
3962 static boolean ieee_push_type
3963 PARAMS ((struct ieee_handle
*, unsigned int, unsigned int, boolean
,
3965 static unsigned int ieee_pop_type
PARAMS ((struct ieee_handle
*));
3966 static void ieee_pop_unused_type
PARAMS ((struct ieee_handle
*));
3967 static unsigned int ieee_pop_type_used
3968 PARAMS ((struct ieee_handle
*, boolean
));
3969 static boolean ieee_add_range
3970 PARAMS ((struct ieee_handle
*, boolean
, bfd_vma
, bfd_vma
));
3971 static boolean ieee_start_range
PARAMS ((struct ieee_handle
*, bfd_vma
));
3972 static boolean ieee_end_range
PARAMS ((struct ieee_handle
*, bfd_vma
));
3973 static boolean ieee_define_type
3974 PARAMS ((struct ieee_handle
*, unsigned int, boolean
, boolean
));
3975 static boolean ieee_define_named_type
3976 PARAMS ((struct ieee_handle
*, const char *, unsigned int, unsigned int,
3977 boolean
, boolean
, struct ieee_buflist
*));
3978 static struct ieee_modified_type
*ieee_get_modified_info
3979 PARAMS ((struct ieee_handle
*, unsigned int));
3980 static struct bfd_hash_entry
*ieee_name_type_newfunc
3981 PARAMS ((struct bfd_hash_entry
*, struct bfd_hash_table
*, const char *));
3982 static boolean ieee_write_undefined_tag
3983 PARAMS ((struct ieee_name_type_hash_entry
*, PTR
));
3984 static boolean ieee_finish_compilation_unit
PARAMS ((struct ieee_handle
*));
3985 static void ieee_add_bb11_blocks
PARAMS ((bfd
*, asection
*, PTR
));
3986 static boolean ieee_add_bb11
3987 PARAMS ((struct ieee_handle
*, asection
*, bfd_vma
, bfd_vma
));
3988 static boolean ieee_output_pending_parms
PARAMS ((struct ieee_handle
*));
3989 static unsigned int ieee_vis_to_flags
PARAMS ((enum debug_visibility
));
3990 static boolean ieee_class_method_var
3991 PARAMS ((struct ieee_handle
*, const char *, enum debug_visibility
, boolean
,
3992 boolean
, boolean
, bfd_vma
, boolean
));
3994 static boolean ieee_start_compilation_unit
PARAMS ((PTR
, const char *));
3995 static boolean ieee_start_source
PARAMS ((PTR
, const char *));
3996 static boolean ieee_empty_type
PARAMS ((PTR
));
3997 static boolean ieee_void_type
PARAMS ((PTR
));
3998 static boolean ieee_int_type
PARAMS ((PTR
, unsigned int, boolean
));
3999 static boolean ieee_float_type
PARAMS ((PTR
, unsigned int));
4000 static boolean ieee_complex_type
PARAMS ((PTR
, unsigned int));
4001 static boolean ieee_bool_type
PARAMS ((PTR
, unsigned int));
4002 static boolean ieee_enum_type
4003 PARAMS ((PTR
, const char *, const char **, bfd_signed_vma
*));
4004 static boolean ieee_pointer_type
PARAMS ((PTR
));
4005 static boolean ieee_function_type
PARAMS ((PTR
, int, boolean
));
4006 static boolean ieee_reference_type
PARAMS ((PTR
));
4007 static boolean ieee_range_type
PARAMS ((PTR
, bfd_signed_vma
, bfd_signed_vma
));
4008 static boolean ieee_array_type
4009 PARAMS ((PTR
, bfd_signed_vma
, bfd_signed_vma
, boolean
));
4010 static boolean ieee_set_type
PARAMS ((PTR
, boolean
));
4011 static boolean ieee_offset_type
PARAMS ((PTR
));
4012 static boolean ieee_method_type
PARAMS ((PTR
, boolean
, int, boolean
));
4013 static boolean ieee_const_type
PARAMS ((PTR
));
4014 static boolean ieee_volatile_type
PARAMS ((PTR
));
4015 static boolean ieee_start_struct_type
4016 PARAMS ((PTR
, const char *, unsigned int, boolean
, unsigned int));
4017 static boolean ieee_struct_field
4018 PARAMS ((PTR
, const char *, bfd_vma
, bfd_vma
, enum debug_visibility
));
4019 static boolean ieee_end_struct_type
PARAMS ((PTR
));
4020 static boolean ieee_start_class_type
4021 PARAMS ((PTR
, const char *, unsigned int, boolean
, unsigned int, boolean
,
4023 static boolean ieee_class_static_member
4024 PARAMS ((PTR
, const char *, const char *, enum debug_visibility
));
4025 static boolean ieee_class_baseclass
4026 PARAMS ((PTR
, bfd_vma
, boolean
, enum debug_visibility
));
4027 static boolean ieee_class_start_method
PARAMS ((PTR
, const char *));
4028 static boolean ieee_class_method_variant
4029 PARAMS ((PTR
, const char *, enum debug_visibility
, boolean
, boolean
,
4031 static boolean ieee_class_static_method_variant
4032 PARAMS ((PTR
, const char *, enum debug_visibility
, boolean
, boolean
));
4033 static boolean ieee_class_end_method
PARAMS ((PTR
));
4034 static boolean ieee_end_class_type
PARAMS ((PTR
));
4035 static boolean ieee_typedef_type
PARAMS ((PTR
, const char *));
4036 static boolean ieee_tag_type
4037 PARAMS ((PTR
, const char *, unsigned int, enum debug_type_kind
));
4038 static boolean ieee_typdef
PARAMS ((PTR
, const char *));
4039 static boolean ieee_tag
PARAMS ((PTR
, const char *));
4040 static boolean ieee_int_constant
PARAMS ((PTR
, const char *, bfd_vma
));
4041 static boolean ieee_float_constant
PARAMS ((PTR
, const char *, double));
4042 static boolean ieee_typed_constant
PARAMS ((PTR
, const char *, bfd_vma
));
4043 static boolean ieee_variable
4044 PARAMS ((PTR
, const char *, enum debug_var_kind
, bfd_vma
));
4045 static boolean ieee_start_function
PARAMS ((PTR
, const char *, boolean
));
4046 static boolean ieee_function_parameter
4047 PARAMS ((PTR
, const char *, enum debug_parm_kind
, bfd_vma
));
4048 static boolean ieee_start_block
PARAMS ((PTR
, bfd_vma
));
4049 static boolean ieee_end_block
PARAMS ((PTR
, bfd_vma
));
4050 static boolean ieee_end_function
PARAMS ((PTR
));
4051 static boolean ieee_lineno
4052 PARAMS ((PTR
, const char *, unsigned long, bfd_vma
));
4054 static const struct debug_write_fns ieee_fns
=
4056 ieee_start_compilation_unit
,
4067 ieee_reference_type
,
4075 ieee_start_struct_type
,
4077 ieee_end_struct_type
,
4078 ieee_start_class_type
,
4079 ieee_class_static_member
,
4080 ieee_class_baseclass
,
4081 ieee_class_start_method
,
4082 ieee_class_method_variant
,
4083 ieee_class_static_method_variant
,
4084 ieee_class_end_method
,
4085 ieee_end_class_type
,
4091 ieee_float_constant
,
4092 ieee_typed_constant
,
4094 ieee_start_function
,
4095 ieee_function_parameter
,
4102 /* Initialize a buffer to be empty. */
4106 ieee_init_buffer (info
, buflist
)
4107 struct ieee_handle
*info
;
4108 struct ieee_buflist
*buflist
;
4110 buflist
->head
= NULL
;
4111 buflist
->tail
= NULL
;
4115 /* See whether a buffer list has any data. */
4117 #define ieee_buffer_emptyp(buflist) ((buflist)->head == NULL)
4119 /* Change the current buffer to a specified buffer chain. */
4122 ieee_change_buffer (info
, buflist
)
4123 struct ieee_handle
*info
;
4124 struct ieee_buflist
*buflist
;
4126 if (buflist
->head
== NULL
)
4128 struct ieee_buf
*buf
;
4130 buf
= (struct ieee_buf
*) xmalloc (sizeof *buf
);
4133 buflist
->head
= buf
;
4134 buflist
->tail
= buf
;
4137 info
->current
= buflist
;
4138 info
->curbuf
= buflist
->tail
;
4143 /* Append a buffer chain. */
4147 ieee_append_buffer (info
, mainbuf
, newbuf
)
4148 struct ieee_handle
*info
;
4149 struct ieee_buflist
*mainbuf
;
4150 struct ieee_buflist
*newbuf
;
4152 if (newbuf
->head
!= NULL
)
4154 if (mainbuf
->head
== NULL
)
4155 mainbuf
->head
= newbuf
->head
;
4157 mainbuf
->tail
->next
= newbuf
->head
;
4158 mainbuf
->tail
= newbuf
->tail
;
4163 /* Write a byte into the buffer. We use a macro for speed and a
4164 function for the complex cases. */
4166 #define ieee_write_byte(info, b) \
4167 ((info)->curbuf->c < IEEE_BUFSIZE \
4168 ? ((info)->curbuf->buf[(info)->curbuf->c++] = (b), true) \
4169 : ieee_real_write_byte ((info), (b)))
4172 ieee_real_write_byte (info
, b
)
4173 struct ieee_handle
*info
;
4176 if (info
->curbuf
->c
>= IEEE_BUFSIZE
)
4180 n
= (struct ieee_buf
*) xmalloc (sizeof *n
);
4183 if (info
->current
->head
== NULL
)
4184 info
->current
->head
= n
;
4186 info
->current
->tail
->next
= n
;
4187 info
->current
->tail
= n
;
4191 info
->curbuf
->buf
[info
->curbuf
->c
] = b
;
4197 /* Write out two bytes. */
4200 ieee_write_2bytes (info
, i
)
4201 struct ieee_handle
*info
;
4204 return (ieee_write_byte (info
, i
>> 8)
4205 && ieee_write_byte (info
, i
& 0xff));
4208 /* Write out an integer. */
4211 ieee_write_number (info
, v
)
4212 struct ieee_handle
*info
;
4220 if (v
<= (bfd_vma
) ieee_number_end_enum
)
4221 return ieee_write_byte (info
, (int) v
);
4232 if (c
> (unsigned int) (ieee_number_repeat_end_enum
4233 - ieee_number_repeat_start_enum
))
4235 fprintf (stderr
, _("IEEE numeric overflow: 0x"));
4236 fprintf_vma (stderr
, v
);
4237 fprintf (stderr
, "\n");
4241 if (! ieee_write_byte (info
, (int) ieee_number_repeat_start_enum
+ c
))
4243 for (; c
> 0; --c
, ++p
)
4245 if (! ieee_write_byte (info
, *p
))
4252 /* Write out a string. */
4255 ieee_write_id (info
, s
)
4256 struct ieee_handle
*info
;
4264 if (! ieee_write_byte (info
, len
))
4267 else if (len
<= 0xff)
4269 if (! ieee_write_byte (info
, (int) ieee_extension_length_1_enum
)
4270 || ! ieee_write_byte (info
, len
))
4273 else if (len
<= 0xffff)
4275 if (! ieee_write_byte (info
, (int) ieee_extension_length_2_enum
)
4276 || ! ieee_write_2bytes (info
, len
))
4281 fprintf (stderr
, _("IEEE string length overflow: %u\n"), len
);
4285 for (; *s
!= '\0'; s
++)
4286 if (! ieee_write_byte (info
, *s
))
4292 /* Write out an ASN record. */
4295 ieee_write_asn (info
, indx
, val
)
4296 struct ieee_handle
*info
;
4300 return (ieee_write_2bytes (info
, (int) ieee_asn_record_enum
)
4301 && ieee_write_number (info
, indx
)
4302 && ieee_write_number (info
, val
));
4305 /* Write out an ATN65 record. */
4308 ieee_write_atn65 (info
, indx
, s
)
4309 struct ieee_handle
*info
;
4313 return (ieee_write_2bytes (info
, (int) ieee_atn_record_enum
)
4314 && ieee_write_number (info
, indx
)
4315 && ieee_write_number (info
, 0)
4316 && ieee_write_number (info
, 65)
4317 && ieee_write_id (info
, s
));
4320 /* Push a type index onto the type stack. */
4323 ieee_push_type (info
, indx
, size
, unsignedp
, localp
)
4324 struct ieee_handle
*info
;
4330 struct ieee_type_stack
*ts
;
4332 ts
= (struct ieee_type_stack
*) xmalloc (sizeof *ts
);
4333 memset (ts
, 0, sizeof *ts
);
4335 ts
->type
.indx
= indx
;
4336 ts
->type
.size
= size
;
4337 ts
->type
.unsignedp
= unsignedp
;
4338 ts
->type
.localp
= localp
;
4340 ts
->next
= info
->type_stack
;
4341 info
->type_stack
= ts
;
4346 /* Pop a type index off the type stack. */
4349 ieee_pop_type (info
)
4350 struct ieee_handle
*info
;
4352 return ieee_pop_type_used (info
, true);
4355 /* Pop an unused type index off the type stack. */
4358 ieee_pop_unused_type (info
)
4359 struct ieee_handle
*info
;
4361 (void) ieee_pop_type_used (info
, false);
4364 /* Pop a used or unused type index off the type stack. */
4367 ieee_pop_type_used (info
, used
)
4368 struct ieee_handle
*info
;
4371 struct ieee_type_stack
*ts
;
4374 ts
= info
->type_stack
;
4375 assert (ts
!= NULL
);
4377 /* If this is a function type, and we need it, we need to append the
4378 actual definition to the typedef block now. */
4379 if (used
&& ! ieee_buffer_emptyp (&ts
->type
.fndef
))
4381 struct ieee_buflist
*buflist
;
4383 if (ts
->type
.localp
)
4385 /* Make sure we have started the types block. */
4386 if (ieee_buffer_emptyp (&info
->types
))
4388 if (! ieee_change_buffer (info
, &info
->types
)
4389 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
4390 || ! ieee_write_byte (info
, 1)
4391 || ! ieee_write_number (info
, 0)
4392 || ! ieee_write_id (info
, info
->modname
))
4395 buflist
= &info
->types
;
4399 /* Make sure we started the global type block. */
4400 if (ieee_buffer_emptyp (&info
->global_types
))
4402 if (! ieee_change_buffer (info
, &info
->global_types
)
4403 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
4404 || ! ieee_write_byte (info
, 2)
4405 || ! ieee_write_number (info
, 0)
4406 || ! ieee_write_id (info
, ""))
4409 buflist
= &info
->global_types
;
4412 if (! ieee_append_buffer (info
, buflist
, &ts
->type
.fndef
))
4416 ret
= ts
->type
.indx
;
4417 info
->type_stack
= ts
->next
;
4422 /* Add a range of bytes included in the current compilation unit. */
4425 ieee_add_range (info
, global
, low
, high
)
4426 struct ieee_handle
*info
;
4431 struct ieee_range
**plist
, *r
, **pr
;
4433 if (low
== (bfd_vma
) -1 || high
== (bfd_vma
) -1 || low
== high
)
4437 plist
= &info
->global_ranges
;
4439 plist
= &info
->ranges
;
4441 for (r
= *plist
; r
!= NULL
; r
= r
->next
)
4443 if (high
>= r
->low
&& low
<= r
->high
)
4445 /* The new range overlaps r. */
4451 while (*pr
!= NULL
&& (*pr
)->low
<= r
->high
)
4453 struct ieee_range
*n
;
4455 if ((*pr
)->high
> r
->high
)
4456 r
->high
= (*pr
)->high
;
4465 r
= (struct ieee_range
*) xmalloc (sizeof *r
);
4466 memset (r
, 0, sizeof *r
);
4471 /* Store the ranges sorted by address. */
4472 for (pr
= plist
; *pr
!= NULL
; pr
= &(*pr
)->next
)
4473 if ((*pr
)->low
> high
)
4481 /* Start a new range for which we only have the low address. */
4484 ieee_start_range (info
, low
)
4485 struct ieee_handle
*info
;
4488 struct ieee_range
*r
;
4490 r
= (struct ieee_range
*) xmalloc (sizeof *r
);
4491 memset (r
, 0, sizeof *r
);
4493 r
->next
= info
->pending_ranges
;
4494 info
->pending_ranges
= r
;
4498 /* Finish a range started by ieee_start_range. */
4501 ieee_end_range (info
, high
)
4502 struct ieee_handle
*info
;
4505 struct ieee_range
*r
;
4508 assert (info
->pending_ranges
!= NULL
);
4509 r
= info
->pending_ranges
;
4511 info
->pending_ranges
= r
->next
;
4513 return ieee_add_range (info
, false, low
, high
);
4516 /* Start defining a type. */
4519 ieee_define_type (info
, size
, unsignedp
, localp
)
4520 struct ieee_handle
*info
;
4525 return ieee_define_named_type (info
, (const char *) NULL
,
4526 (unsigned int) -1, size
, unsignedp
,
4527 localp
, (struct ieee_buflist
*) NULL
);
4530 /* Start defining a named type. */
4533 ieee_define_named_type (info
, name
, indx
, size
, unsignedp
, localp
, buflist
)
4534 struct ieee_handle
*info
;
4540 struct ieee_buflist
*buflist
;
4542 unsigned int type_indx
;
4543 unsigned int name_indx
;
4545 if (indx
!= (unsigned int) -1)
4549 type_indx
= info
->type_indx
;
4553 name_indx
= info
->name_indx
;
4559 /* If we were given a buffer, use it; otherwise, use either the
4560 local or the global type information, and make sure that the type
4561 block is started. */
4562 if (buflist
!= NULL
)
4564 if (! ieee_change_buffer (info
, buflist
))
4569 if (! ieee_buffer_emptyp (&info
->types
))
4571 if (! ieee_change_buffer (info
, &info
->types
))
4576 if (! ieee_change_buffer (info
, &info
->types
)
4577 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
4578 || ! ieee_write_byte (info
, 1)
4579 || ! ieee_write_number (info
, 0)
4580 || ! ieee_write_id (info
, info
->modname
))
4586 if (! ieee_buffer_emptyp (&info
->global_types
))
4588 if (! ieee_change_buffer (info
, &info
->global_types
))
4593 if (! ieee_change_buffer (info
, &info
->global_types
)
4594 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
4595 || ! ieee_write_byte (info
, 2)
4596 || ! ieee_write_number (info
, 0)
4597 || ! ieee_write_id (info
, ""))
4602 /* Push the new type on the type stack, write out an NN record, and
4603 write out the start of a TY record. The caller will then finish
4605 if (! ieee_push_type (info
, type_indx
, size
, unsignedp
, localp
))
4608 return (ieee_write_byte (info
, (int) ieee_nn_record
)
4609 && ieee_write_number (info
, name_indx
)
4610 && ieee_write_id (info
, name
)
4611 && ieee_write_byte (info
, (int) ieee_ty_record_enum
)
4612 && ieee_write_number (info
, type_indx
)
4613 && ieee_write_byte (info
, 0xce)
4614 && ieee_write_number (info
, name_indx
));
4617 /* Get an entry to the list of modified versions of a type. */
4619 static struct ieee_modified_type
*
4620 ieee_get_modified_info (info
, indx
)
4621 struct ieee_handle
*info
;
4624 if (indx
>= info
->modified_alloc
)
4626 unsigned int nalloc
;
4628 nalloc
= info
->modified_alloc
;
4631 while (indx
>= nalloc
)
4633 info
->modified
= ((struct ieee_modified_type
*)
4634 xrealloc (info
->modified
,
4635 nalloc
* sizeof *info
->modified
));
4636 memset (info
->modified
+ info
->modified_alloc
, 0,
4637 (nalloc
- info
->modified_alloc
) * sizeof *info
->modified
);
4638 info
->modified_alloc
= nalloc
;
4641 return info
->modified
+ indx
;
4644 /* Routines for the hash table mapping names to types. */
4646 /* Initialize an entry in the hash table. */
4648 static struct bfd_hash_entry
*
4649 ieee_name_type_newfunc (entry
, table
, string
)
4650 struct bfd_hash_entry
*entry
;
4651 struct bfd_hash_table
*table
;
4654 struct ieee_name_type_hash_entry
*ret
=
4655 (struct ieee_name_type_hash_entry
*) entry
;
4657 /* Allocate the structure if it has not already been allocated by a
4660 ret
= ((struct ieee_name_type_hash_entry
*)
4661 bfd_hash_allocate (table
, sizeof *ret
));
4665 /* Call the allocation method of the superclass. */
4666 ret
= ((struct ieee_name_type_hash_entry
*)
4667 bfd_hash_newfunc ((struct bfd_hash_entry
*) ret
, table
, string
));
4670 /* Set local fields. */
4674 return (struct bfd_hash_entry
*) ret
;
4677 /* Look up an entry in the hash table. */
4679 #define ieee_name_type_hash_lookup(table, string, create, copy) \
4680 ((struct ieee_name_type_hash_entry *) \
4681 bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
4683 /* Traverse the hash table. */
4685 #define ieee_name_type_hash_traverse(table, func, info) \
4686 (bfd_hash_traverse \
4688 (boolean (*) PARAMS ((struct bfd_hash_entry *, PTR))) (func), \
4691 /* The general routine to write out IEEE debugging information. */
4694 write_ieee_debugging_info (abfd
, dhandle
)
4698 struct ieee_handle info
;
4703 memset (&info
, 0, sizeof info
);
4705 info
.type_indx
= 256;
4706 info
.name_indx
= 32;
4708 if (! bfd_hash_table_init (&info
.typedefs
.root
, ieee_name_type_newfunc
)
4709 || ! bfd_hash_table_init (&info
.tags
.root
, ieee_name_type_newfunc
))
4712 if (! ieee_init_buffer (&info
, &info
.global_types
)
4713 || ! ieee_init_buffer (&info
, &info
.data
)
4714 || ! ieee_init_buffer (&info
, &info
.types
)
4715 || ! ieee_init_buffer (&info
, &info
.vars
)
4716 || ! ieee_init_buffer (&info
, &info
.cxx
)
4717 || ! ieee_init_buffer (&info
, &info
.linenos
)
4718 || ! ieee_init_buffer (&info
, &info
.fntype
)
4719 || ! ieee_init_buffer (&info
, &info
.fnargs
))
4722 if (! debug_write (dhandle
, &ieee_fns
, (PTR
) &info
))
4725 if (info
.filename
!= NULL
)
4727 if (! ieee_finish_compilation_unit (&info
))
4731 /* Put any undefined tags in the global typedef information. */
4733 ieee_name_type_hash_traverse (&info
.tags
,
4734 ieee_write_undefined_tag
,
4739 /* Prepend the global typedef information to the other data. */
4740 if (! ieee_buffer_emptyp (&info
.global_types
))
4742 /* The HP debugger seems to have a bug in which it ignores the
4743 last entry in the global types, so we add a dummy entry. */
4744 if (! ieee_change_buffer (&info
, &info
.global_types
)
4745 || ! ieee_write_byte (&info
, (int) ieee_nn_record
)
4746 || ! ieee_write_number (&info
, info
.name_indx
)
4747 || ! ieee_write_id (&info
, "")
4748 || ! ieee_write_byte (&info
, (int) ieee_ty_record_enum
)
4749 || ! ieee_write_number (&info
, info
.type_indx
)
4750 || ! ieee_write_byte (&info
, 0xce)
4751 || ! ieee_write_number (&info
, info
.name_indx
)
4752 || ! ieee_write_number (&info
, 'P')
4753 || ! ieee_write_number (&info
, (int) builtin_void
+ 32)
4754 || ! ieee_write_byte (&info
, (int) ieee_be_record_enum
))
4757 if (! ieee_append_buffer (&info
, &info
.global_types
, &info
.data
))
4759 info
.data
= info
.global_types
;
4762 /* Make sure that we have declare BB11 blocks for each range in the
4763 file. They are added to info->vars. */
4765 if (! ieee_init_buffer (&info
, &info
.vars
))
4767 bfd_map_over_sections (abfd
, ieee_add_bb11_blocks
, (PTR
) &info
);
4770 if (! ieee_buffer_emptyp (&info
.vars
))
4772 if (! ieee_change_buffer (&info
, &info
.vars
)
4773 || ! ieee_write_byte (&info
, (int) ieee_be_record_enum
))
4776 if (! ieee_append_buffer (&info
, &info
.data
, &info
.vars
))
4780 /* Now all the data is in info.data. Write it out to the BFD. We
4781 normally would need to worry about whether all the other sections
4782 are set up yet, but the IEEE backend will handle this particular
4783 case correctly regardless. */
4784 if (ieee_buffer_emptyp (&info
.data
))
4786 /* There is no debugging information. */
4790 s
= bfd_make_section (abfd
, ".debug");
4792 err
= "bfd_make_section";
4795 if (! bfd_set_section_flags (abfd
, s
, SEC_DEBUGGING
| SEC_HAS_CONTENTS
))
4796 err
= "bfd_set_section_flags";
4803 for (b
= info
.data
.head
; b
!= NULL
; b
= b
->next
)
4805 if (! bfd_set_section_size (abfd
, s
, size
))
4806 err
= "bfd_set_section_size";
4813 for (b
= info
.data
.head
; b
!= NULL
; b
= b
->next
)
4815 if (! bfd_set_section_contents (abfd
, s
, b
->buf
, offset
, b
->c
))
4817 err
= "bfd_set_section_contents";
4826 fprintf (stderr
, "%s: %s: %s\n", bfd_get_filename (abfd
), err
,
4827 bfd_errmsg (bfd_get_error ()));
4831 bfd_hash_table_free (&info
.typedefs
.root
);
4832 bfd_hash_table_free (&info
.tags
.root
);
4837 /* Write out information for an undefined tag. This is called via
4838 ieee_name_type_hash_traverse. */
4841 ieee_write_undefined_tag (h
, p
)
4842 struct ieee_name_type_hash_entry
*h
;
4845 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
4846 struct ieee_name_type
*nt
;
4848 for (nt
= h
->types
; nt
!= NULL
; nt
= nt
->next
)
4850 unsigned int name_indx
;
4853 if (nt
->kind
== DEBUG_KIND_ILLEGAL
)
4856 if (ieee_buffer_emptyp (&info
->global_types
))
4858 if (! ieee_change_buffer (info
, &info
->global_types
)
4859 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
4860 || ! ieee_write_byte (info
, 2)
4861 || ! ieee_write_number (info
, 0)
4862 || ! ieee_write_id (info
, ""))
4870 if (! ieee_change_buffer (info
, &info
->global_types
))
4877 name_indx
= info
->name_indx
;
4879 if (! ieee_write_byte (info
, (int) ieee_nn_record
)
4880 || ! ieee_write_number (info
, name_indx
)
4881 || ! ieee_write_id (info
, nt
->type
.name
)
4882 || ! ieee_write_byte (info
, (int) ieee_ty_record_enum
)
4883 || ! ieee_write_number (info
, nt
->type
.indx
)
4884 || ! ieee_write_byte (info
, 0xce)
4885 || ! ieee_write_number (info
, name_indx
))
4897 case DEBUG_KIND_STRUCT
:
4898 case DEBUG_KIND_CLASS
:
4901 case DEBUG_KIND_UNION
:
4902 case DEBUG_KIND_UNION_CLASS
:
4905 case DEBUG_KIND_ENUM
:
4909 if (! ieee_write_number (info
, code
)
4910 || ! ieee_write_number (info
, 0))
4920 /* Start writing out information for a compilation unit. */
4923 ieee_start_compilation_unit (p
, filename
)
4925 const char *filename
;
4927 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
4928 const char *modname
;
4932 if (info
->filename
!= NULL
)
4934 if (! ieee_finish_compilation_unit (info
))
4938 info
->filename
= filename
;
4939 modname
= strrchr (filename
, '/');
4940 if (modname
!= NULL
)
4944 modname
= strrchr (filename
, '\\');
4945 if (modname
!= NULL
)
4950 c
= xstrdup (modname
);
4951 s
= strrchr (c
, '.');
4956 if (! ieee_init_buffer (info
, &info
->types
)
4957 || ! ieee_init_buffer (info
, &info
->vars
)
4958 || ! ieee_init_buffer (info
, &info
->cxx
)
4959 || ! ieee_init_buffer (info
, &info
->linenos
))
4961 info
->ranges
= NULL
;
4963 /* Always include a BB1 and a BB3 block. That is what the output of
4964 the MRI linker seems to look like. */
4965 if (! ieee_change_buffer (info
, &info
->types
)
4966 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
4967 || ! ieee_write_byte (info
, 1)
4968 || ! ieee_write_number (info
, 0)
4969 || ! ieee_write_id (info
, info
->modname
))
4972 nindx
= info
->name_indx
;
4974 if (! ieee_change_buffer (info
, &info
->vars
)
4975 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
4976 || ! ieee_write_byte (info
, 3)
4977 || ! ieee_write_number (info
, 0)
4978 || ! ieee_write_id (info
, info
->modname
))
4984 /* Finish up a compilation unit. */
4987 ieee_finish_compilation_unit (info
)
4988 struct ieee_handle
*info
;
4990 struct ieee_range
*r
;
4992 if (! ieee_buffer_emptyp (&info
->types
))
4994 if (! ieee_change_buffer (info
, &info
->types
)
4995 || ! ieee_write_byte (info
, (int) ieee_be_record_enum
))
4999 if (! ieee_buffer_emptyp (&info
->cxx
))
5001 /* Append any C++ information to the global function and
5002 variable information. */
5003 assert (! ieee_buffer_emptyp (&info
->vars
));
5004 if (! ieee_change_buffer (info
, &info
->vars
))
5007 /* We put the pmisc records in a dummy procedure, just as the
5008 MRI compiler does. */
5009 if (! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
5010 || ! ieee_write_byte (info
, 6)
5011 || ! ieee_write_number (info
, 0)
5012 || ! ieee_write_id (info
, "__XRYCPP")
5013 || ! ieee_write_number (info
, 0)
5014 || ! ieee_write_number (info
, 0)
5015 || ! ieee_write_number (info
, info
->highaddr
- 1)
5016 || ! ieee_append_buffer (info
, &info
->vars
, &info
->cxx
)
5017 || ! ieee_change_buffer (info
, &info
->vars
)
5018 || ! ieee_write_byte (info
, (int) ieee_be_record_enum
)
5019 || ! ieee_write_number (info
, info
->highaddr
- 1))
5023 if (! ieee_buffer_emptyp (&info
->vars
))
5025 if (! ieee_change_buffer (info
, &info
->vars
)
5026 || ! ieee_write_byte (info
, (int) ieee_be_record_enum
))
5030 if (info
->pending_lineno_filename
!= NULL
)
5032 /* Force out the pending line number. */
5033 if (! ieee_lineno ((PTR
) info
, (const char *) NULL
, 0, (bfd_vma
) -1))
5036 if (! ieee_buffer_emptyp (&info
->linenos
))
5038 if (! ieee_change_buffer (info
, &info
->linenos
)
5039 || ! ieee_write_byte (info
, (int) ieee_be_record_enum
))
5041 if (strcmp (info
->filename
, info
->lineno_filename
) != 0)
5043 /* We were not in the main file. We just closed the
5044 included line number block, and now we must close the
5045 main line number block. */
5046 if (! ieee_write_byte (info
, (int) ieee_be_record_enum
))
5051 if (! ieee_append_buffer (info
, &info
->data
, &info
->types
)
5052 || ! ieee_append_buffer (info
, &info
->data
, &info
->vars
)
5053 || ! ieee_append_buffer (info
, &info
->data
, &info
->linenos
))
5056 /* Build BB10/BB11 blocks based on the ranges we recorded. */
5057 if (! ieee_change_buffer (info
, &info
->data
))
5060 if (! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
5061 || ! ieee_write_byte (info
, 10)
5062 || ! ieee_write_number (info
, 0)
5063 || ! ieee_write_id (info
, info
->modname
)
5064 || ! ieee_write_id (info
, "")
5065 || ! ieee_write_number (info
, 0)
5066 || ! ieee_write_id (info
, "GNU objcopy"))
5069 for (r
= info
->ranges
; r
!= NULL
; r
= r
->next
)
5078 /* Find the section corresponding to this range. */
5079 for (s
= info
->abfd
->sections
; s
!= NULL
; s
= s
->next
)
5081 if (bfd_get_section_vma (info
->abfd
, s
) <= low
5082 && high
<= (bfd_get_section_vma (info
->abfd
, s
)
5083 + bfd_section_size (info
->abfd
, s
)))
5089 /* Just ignore this range. */
5093 /* Coalesce ranges if it seems reasonable. */
5094 while (r
->next
!= NULL
5095 && high
+ 0x1000 >= r
->next
->low
5097 <= (bfd_get_section_vma (info
->abfd
, s
)
5098 + bfd_section_size (info
->abfd
, s
))))
5104 if ((s
->flags
& SEC_CODE
) != 0)
5106 else if ((s
->flags
& SEC_READONLY
) != 0)
5111 if (! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
5112 || ! ieee_write_byte (info
, 11)
5113 || ! ieee_write_number (info
, 0)
5114 || ! ieee_write_id (info
, "")
5115 || ! ieee_write_number (info
, kind
)
5116 || ! ieee_write_number (info
, s
->index
+ IEEE_SECTION_NUMBER_BASE
)
5117 || ! ieee_write_number (info
, low
)
5118 || ! ieee_write_byte (info
, (int) ieee_be_record_enum
)
5119 || ! ieee_write_number (info
, high
- low
))
5122 /* Add this range to the list of global ranges. */
5123 if (! ieee_add_range (info
, true, low
, high
))
5127 if (! ieee_write_byte (info
, (int) ieee_be_record_enum
))
5133 /* Add BB11 blocks describing each range that we have not already
5137 ieee_add_bb11_blocks (abfd
, sec
, data
)
5142 struct ieee_handle
*info
= (struct ieee_handle
*) data
;
5144 struct ieee_range
*r
;
5146 low
= bfd_get_section_vma (abfd
, sec
);
5147 high
= low
+ bfd_section_size (abfd
, sec
);
5149 /* Find the first range at or after this section. The ranges are
5150 sorted by address. */
5151 for (r
= info
->global_ranges
; r
!= NULL
; r
= r
->next
)
5157 if (r
== NULL
|| r
->low
>= high
)
5159 if (! ieee_add_bb11 (info
, sec
, low
, high
))
5165 && r
->low
- low
> 0x100)
5167 if (! ieee_add_bb11 (info
, sec
, low
, r
->low
))
5179 /* Add a single BB11 block for a range. We add it to info->vars. */
5182 ieee_add_bb11 (info
, sec
, low
, high
)
5183 struct ieee_handle
*info
;
5190 if (! ieee_buffer_emptyp (&info
->vars
))
5192 if (! ieee_change_buffer (info
, &info
->vars
))
5197 const char *filename
, *modname
;
5200 /* Start the enclosing BB10 block. */
5201 filename
= bfd_get_filename (info
->abfd
);
5202 modname
= strrchr (filename
, '/');
5203 if (modname
!= NULL
)
5207 modname
= strrchr (filename
, '\\');
5208 if (modname
!= NULL
)
5213 c
= xstrdup (modname
);
5214 s
= strrchr (c
, '.');
5218 if (! ieee_change_buffer (info
, &info
->vars
)
5219 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
5220 || ! ieee_write_byte (info
, 10)
5221 || ! ieee_write_number (info
, 0)
5222 || ! ieee_write_id (info
, c
)
5223 || ! ieee_write_id (info
, "")
5224 || ! ieee_write_number (info
, 0)
5225 || ! ieee_write_id (info
, "GNU objcopy"))
5231 if ((sec
->flags
& SEC_CODE
) != 0)
5233 else if ((sec
->flags
& SEC_READONLY
) != 0)
5238 if (! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
5239 || ! ieee_write_byte (info
, 11)
5240 || ! ieee_write_number (info
, 0)
5241 || ! ieee_write_id (info
, "")
5242 || ! ieee_write_number (info
, kind
)
5243 || ! ieee_write_number (info
, sec
->index
+ IEEE_SECTION_NUMBER_BASE
)
5244 || ! ieee_write_number (info
, low
)
5245 || ! ieee_write_byte (info
, (int) ieee_be_record_enum
)
5246 || ! ieee_write_number (info
, high
- low
))
5252 /* Start recording information from a particular source file. This is
5253 used to record which file defined which types, variables, etc. It
5254 is not used for line numbers, since the lineno entry point passes
5255 down the file name anyhow. IEEE debugging information doesn't seem
5256 to store this information anywhere. */
5260 ieee_start_source (p
, filename
)
5262 const char *filename
;
5267 /* Make an empty type. */
5273 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5275 return ieee_push_type (info
, (int) builtin_unknown
, 0, false, false);
5278 /* Make a void type. */
5284 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5286 return ieee_push_type (info
, (int) builtin_void
, 0, false, false);
5289 /* Make an integer type. */
5292 ieee_int_type (p
, size
, unsignedp
)
5297 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5303 indx
= (int) builtin_signed_char
;
5306 indx
= (int) builtin_signed_short_int
;
5309 indx
= (int) builtin_signed_long
;
5312 indx
= (int) builtin_signed_long_long
;
5315 fprintf (stderr
, _("IEEE unsupported integer type size %u\n"), size
);
5322 return ieee_push_type (info
, indx
, size
, unsignedp
, false);
5325 /* Make a floating point type. */
5328 ieee_float_type (p
, size
)
5332 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5338 indx
= (int) builtin_float
;
5341 indx
= (int) builtin_double
;
5344 /* FIXME: This size really depends upon the processor. */
5345 indx
= (int) builtin_long_double
;
5348 indx
= (int) builtin_long_long_double
;
5351 fprintf (stderr
, _("IEEE unsupported float type size %u\n"), size
);
5355 return ieee_push_type (info
, indx
, size
, false, false);
5358 /* Make a complex type. */
5361 ieee_complex_type (p
, size
)
5365 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5371 if (info
->complex_float_index
!= 0)
5372 return ieee_push_type (info
, info
->complex_float_index
, size
* 2,
5378 /* These cases can be output by gcc -gstabs. Outputting the
5379 wrong type is better than crashing. */
5381 if (info
->complex_double_index
!= 0)
5382 return ieee_push_type (info
, info
->complex_double_index
, size
* 2,
5387 fprintf (stderr
, _("IEEE unsupported complex type size %u\n"), size
);
5391 /* FIXME: I don't know what the string is for. */
5392 if (! ieee_define_type (info
, size
* 2, false, false)
5393 || ! ieee_write_number (info
, code
)
5394 || ! ieee_write_id (info
, ""))
5398 info
->complex_float_index
= info
->type_stack
->type
.indx
;
5400 info
->complex_double_index
= info
->type_stack
->type
.indx
;
5405 /* Make a boolean type. IEEE doesn't support these, so we just make
5406 an integer type instead. */
5409 ieee_bool_type (p
, size
)
5413 return ieee_int_type (p
, size
, true);
5416 /* Make an enumeration. */
5419 ieee_enum_type (p
, tag
, names
, vals
)
5423 bfd_signed_vma
*vals
;
5425 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5426 struct ieee_defined_enum
*e
;
5427 boolean localp
, simple
;
5432 indx
= (unsigned int) -1;
5433 for (e
= info
->enums
; e
!= NULL
; e
= e
->next
)
5443 || tag
[0] != e
->tag
[0]
5444 || strcmp (tag
, e
->tag
) != 0)
5450 /* This enum tag has been seen but not defined. */
5455 if (names
!= NULL
&& e
->names
!= NULL
)
5457 for (i
= 0; names
[i
] != NULL
&& e
->names
[i
] != NULL
; i
++)
5459 if (names
[i
][0] != e
->names
[i
][0]
5460 || vals
[i
] != e
->vals
[i
]
5461 || strcmp (names
[i
], e
->names
[i
]) != 0)
5466 if ((names
== NULL
&& e
->names
== NULL
)
5470 && e
->names
[i
] == NULL
))
5472 /* We've seen this enum before. */
5473 return ieee_push_type (info
, e
->indx
, 0, true, false);
5478 /* We've already seen an enum of the same name, so we must make
5479 sure to output this one locally. */
5485 /* If this is a simple enumeration, in which the values start at 0
5486 and always increment by 1, we can use type E. Otherwise we must
5492 for (i
= 0; names
[i
] != NULL
; i
++)
5502 if (! ieee_define_named_type (info
, tag
, indx
, 0, true, localp
,
5503 (struct ieee_buflist
*) NULL
)
5504 || ! ieee_write_number (info
, simple
? 'E' : 'N'))
5508 /* FIXME: This is supposed to be the enumeration size, but we
5509 don't store that. */
5510 if (! ieee_write_number (info
, 4))
5515 for (i
= 0; names
[i
] != NULL
; i
++)
5517 if (! ieee_write_id (info
, names
[i
]))
5521 if (! ieee_write_number (info
, vals
[i
]))
5529 if (indx
== (unsigned int) -1)
5531 e
= (struct ieee_defined_enum
*) xmalloc (sizeof *e
);
5532 memset (e
, 0, sizeof *e
);
5533 e
->indx
= info
->type_stack
->type
.indx
;
5536 e
->next
= info
->enums
;
5548 /* Make a pointer type. */
5551 ieee_pointer_type (p
)
5554 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5557 struct ieee_modified_type
*m
= NULL
;
5559 localp
= info
->type_stack
->type
.localp
;
5560 indx
= ieee_pop_type (info
);
5562 /* A pointer to a simple builtin type can be obtained by adding 32.
5563 FIXME: Will this be a short pointer, and will that matter? */
5565 return ieee_push_type (info
, indx
+ 32, 0, true, false);
5569 m
= ieee_get_modified_info (p
, indx
);
5573 /* FIXME: The size should depend upon the architecture. */
5575 return ieee_push_type (info
, m
->pointer
, 4, true, false);
5578 if (! ieee_define_type (info
, 4, true, localp
)
5579 || ! ieee_write_number (info
, 'P')
5580 || ! ieee_write_number (info
, indx
))
5584 m
->pointer
= info
->type_stack
->type
.indx
;
5589 /* Make a function type. This will be called for a method, but we
5590 don't want to actually add it to the type table in that case. We
5591 handle this by defining the type in a private buffer, and only
5592 adding that buffer to the typedef block if we are going to use it. */
5595 ieee_function_type (p
, argcount
, varargs
)
5600 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5602 unsigned int *args
= NULL
;
5604 unsigned int retindx
;
5605 struct ieee_buflist fndef
;
5606 struct ieee_modified_type
*m
;
5612 args
= (unsigned int *) xmalloc (argcount
* sizeof *args
);
5613 for (i
= argcount
- 1; i
>= 0; i
--)
5615 if (info
->type_stack
->type
.localp
)
5617 args
[i
] = ieee_pop_type (info
);
5620 else if (argcount
< 0)
5623 if (info
->type_stack
->type
.localp
)
5625 retindx
= ieee_pop_type (info
);
5628 if (argcount
< 0 && ! localp
)
5630 m
= ieee_get_modified_info (p
, retindx
);
5634 if (m
->function
> 0)
5635 return ieee_push_type (info
, m
->function
, 0, true, false);
5638 /* An attribute of 0x41 means that the frame and push mask are
5640 if (! ieee_init_buffer (info
, &fndef
)
5641 || ! ieee_define_named_type (info
, (const char *) NULL
,
5642 (unsigned int) -1, 0, true, localp
,
5644 || ! ieee_write_number (info
, 'x')
5645 || ! ieee_write_number (info
, 0x41)
5646 || ! ieee_write_number (info
, 0)
5647 || ! ieee_write_number (info
, 0)
5648 || ! ieee_write_number (info
, retindx
)
5649 || ! ieee_write_number (info
, (bfd_vma
) argcount
+ (varargs
? 1 : 0)))
5653 for (i
= 0; i
< argcount
; i
++)
5654 if (! ieee_write_number (info
, args
[i
]))
5660 /* A varargs function is represented by writing out the last
5661 argument as type void *, although this makes little sense. */
5662 if (! ieee_write_number (info
, (bfd_vma
) builtin_void
+ 32))
5666 if (! ieee_write_number (info
, 0))
5669 /* We wrote the information into fndef, in case we don't need it.
5670 It will be appended to info->types by ieee_pop_type. */
5671 info
->type_stack
->type
.fndef
= fndef
;
5674 m
->function
= info
->type_stack
->type
.indx
;
5679 /* Make a reference type. */
5682 ieee_reference_type (p
)
5685 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5687 /* IEEE appears to record a normal pointer type, and then use a
5688 pmisc record to indicate that it is really a reference. */
5690 if (! ieee_pointer_type (p
))
5692 info
->type_stack
->type
.referencep
= true;
5696 /* Make a range type. */
5699 ieee_range_type (p
, low
, high
)
5702 bfd_signed_vma high
;
5704 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5706 boolean unsignedp
, localp
;
5708 size
= info
->type_stack
->type
.size
;
5709 unsignedp
= info
->type_stack
->type
.unsignedp
;
5710 localp
= info
->type_stack
->type
.localp
;
5711 ieee_pop_unused_type (info
);
5712 return (ieee_define_type (info
, size
, unsignedp
, localp
)
5713 && ieee_write_number (info
, 'R')
5714 && ieee_write_number (info
, (bfd_vma
) low
)
5715 && ieee_write_number (info
, (bfd_vma
) high
)
5716 && ieee_write_number (info
, unsignedp
? 0 : 1)
5717 && ieee_write_number (info
, size
));
5720 /* Make an array type. */
5724 ieee_array_type (p
, low
, high
, stringp
)
5727 bfd_signed_vma high
;
5730 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5731 unsigned int eleindx
;
5734 struct ieee_modified_type
*m
= NULL
;
5735 struct ieee_modified_array_type
*a
;
5737 /* IEEE does not store the range, so we just ignore it. */
5738 ieee_pop_unused_type (info
);
5739 localp
= info
->type_stack
->type
.localp
;
5740 size
= info
->type_stack
->type
.size
;
5741 eleindx
= ieee_pop_type (info
);
5743 /* If we don't know the range, treat the size as exactly one
5746 size
*= (high
- low
) + 1;
5750 m
= ieee_get_modified_info (info
, eleindx
);
5754 for (a
= m
->arrays
; a
!= NULL
; a
= a
->next
)
5756 if (a
->low
== low
&& a
->high
== high
)
5757 return ieee_push_type (info
, a
->indx
, size
, false, false);
5761 if (! ieee_define_type (info
, size
, false, localp
)
5762 || ! ieee_write_number (info
, low
== 0 ? 'Z' : 'C')
5763 || ! ieee_write_number (info
, eleindx
))
5767 if (! ieee_write_number (info
, low
))
5771 if (! ieee_write_number (info
, high
+ 1))
5776 a
= (struct ieee_modified_array_type
*) xmalloc (sizeof *a
);
5777 memset (a
, 0, sizeof *a
);
5779 a
->indx
= info
->type_stack
->type
.indx
;
5783 a
->next
= m
->arrays
;
5790 /* Make a set type. */
5793 ieee_set_type (p
, bitstringp
)
5797 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5799 unsigned int eleindx
;
5801 localp
= info
->type_stack
->type
.localp
;
5802 eleindx
= ieee_pop_type (info
);
5804 /* FIXME: We don't know the size, so we just use 4. */
5806 return (ieee_define_type (info
, 0, true, localp
)
5807 && ieee_write_number (info
, 's')
5808 && ieee_write_number (info
, 4)
5809 && ieee_write_number (info
, eleindx
));
5812 /* Make an offset type. */
5815 ieee_offset_type (p
)
5818 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5819 unsigned int targetindx
, baseindx
;
5821 targetindx
= ieee_pop_type (info
);
5822 baseindx
= ieee_pop_type (info
);
5824 /* FIXME: The MRI C++ compiler does not appear to generate any
5825 useful type information about an offset type. It just records a
5826 pointer to member as an integer. The MRI/HP IEEE spec does
5827 describe a pmisc record which can be used for a pointer to
5828 member. Unfortunately, it does not describe the target type,
5829 which seems pretty important. I'm going to punt this for now. */
5831 return ieee_int_type (p
, 4, true);
5834 /* Make a method type. */
5837 ieee_method_type (p
, domain
, argcount
, varargs
)
5843 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5845 /* FIXME: The MRI/HP IEEE spec defines a pmisc record to use for a
5846 method, but the definition is incomplete. We just output an 'x'
5850 ieee_pop_unused_type (info
);
5852 return ieee_function_type (p
, argcount
, varargs
);
5855 /* Make a const qualified type. */
5861 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5863 boolean unsignedp
, localp
;
5865 struct ieee_modified_type
*m
= NULL
;
5867 size
= info
->type_stack
->type
.size
;
5868 unsignedp
= info
->type_stack
->type
.unsignedp
;
5869 localp
= info
->type_stack
->type
.localp
;
5870 indx
= ieee_pop_type (info
);
5874 m
= ieee_get_modified_info (info
, indx
);
5878 if (m
->const_qualified
> 0)
5879 return ieee_push_type (info
, m
->const_qualified
, size
, unsignedp
,
5883 if (! ieee_define_type (info
, size
, unsignedp
, localp
)
5884 || ! ieee_write_number (info
, 'n')
5885 || ! ieee_write_number (info
, 1)
5886 || ! ieee_write_number (info
, indx
))
5890 m
->const_qualified
= info
->type_stack
->type
.indx
;
5895 /* Make a volatile qualified type. */
5898 ieee_volatile_type (p
)
5901 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5903 boolean unsignedp
, localp
;
5905 struct ieee_modified_type
*m
= NULL
;
5907 size
= info
->type_stack
->type
.size
;
5908 unsignedp
= info
->type_stack
->type
.unsignedp
;
5909 localp
= info
->type_stack
->type
.localp
;
5910 indx
= ieee_pop_type (info
);
5914 m
= ieee_get_modified_info (info
, indx
);
5918 if (m
->volatile_qualified
> 0)
5919 return ieee_push_type (info
, m
->volatile_qualified
, size
, unsignedp
,
5923 if (! ieee_define_type (info
, size
, unsignedp
, localp
)
5924 || ! ieee_write_number (info
, 'n')
5925 || ! ieee_write_number (info
, 2)
5926 || ! ieee_write_number (info
, indx
))
5930 m
->volatile_qualified
= info
->type_stack
->type
.indx
;
5935 /* Convert an enum debug_visibility into a CXXFLAGS value. */
5938 ieee_vis_to_flags (visibility
)
5939 enum debug_visibility visibility
;
5945 case DEBUG_VISIBILITY_PUBLIC
:
5946 return CXXFLAGS_VISIBILITY_PUBLIC
;
5947 case DEBUG_VISIBILITY_PRIVATE
:
5948 return CXXFLAGS_VISIBILITY_PRIVATE
;
5949 case DEBUG_VISIBILITY_PROTECTED
:
5950 return CXXFLAGS_VISIBILITY_PROTECTED
;
5955 /* Start defining a struct type. We build it in the strdef field on
5956 the stack, to avoid confusing type definitions required by the
5957 fields with the struct type itself. */
5960 ieee_start_struct_type (p
, tag
, id
, structp
, size
)
5967 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5968 boolean localp
, ignorep
;
5972 struct ieee_name_type_hash_entry
*h
;
5973 struct ieee_name_type
*nt
, *ntlook
;
5974 struct ieee_buflist strdef
;
5979 /* We need to create a tag for internal use even if we don't want
5980 one for external use. This will let us refer to an anonymous
5989 sprintf (ab
, "__anon%u", id
);
5994 /* If we already have references to the tag, we must use the
5995 existing type index. */
5996 h
= ieee_name_type_hash_lookup (&info
->tags
, look
, true, copy
);
6001 for (ntlook
= h
->types
; ntlook
!= NULL
; ntlook
= ntlook
->next
)
6003 if (ntlook
->id
== id
)
6005 else if (! ntlook
->type
.localp
)
6007 /* We are creating a duplicate definition of a globally
6008 defined tag. Force it to be local to avoid
6016 assert (localp
== nt
->type
.localp
);
6017 if (nt
->kind
== DEBUG_KIND_ILLEGAL
&& ! localp
)
6019 /* We've already seen a global definition of the type.
6020 Ignore this new definition. */
6026 nt
= (struct ieee_name_type
*) xmalloc (sizeof *nt
);
6027 memset (nt
, 0, sizeof *nt
);
6029 nt
->type
.name
= h
->root
.string
;
6030 nt
->next
= h
->types
;
6032 nt
->type
.indx
= info
->type_indx
;
6036 nt
->kind
= DEBUG_KIND_ILLEGAL
;
6038 if (! ieee_init_buffer (info
, &strdef
)
6039 || ! ieee_define_named_type (info
, tag
, nt
->type
.indx
, size
, true,
6041 || ! ieee_write_number (info
, structp
? 'S' : 'U')
6042 || ! ieee_write_number (info
, size
))
6049 /* We never want nt->type.name to be NULL. We want the rest of
6050 the type to be the object set up on the type stack; it will
6051 have a NULL name if tag is NULL. */
6052 hold
= nt
->type
.name
;
6053 nt
->type
= info
->type_stack
->type
;
6054 nt
->type
.name
= hold
;
6057 info
->type_stack
->type
.name
= tag
;
6058 info
->type_stack
->type
.strdef
= strdef
;
6059 info
->type_stack
->type
.ignorep
= ignorep
;
6064 /* Add a field to a struct. */
6067 ieee_struct_field (p
, name
, bitpos
, bitsize
, visibility
)
6072 enum debug_visibility visibility
;
6074 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6082 assert (info
->type_stack
!= NULL
6083 && info
->type_stack
->next
!= NULL
6084 && ! ieee_buffer_emptyp (&info
->type_stack
->next
->type
.strdef
));
6086 /* If we are ignoring this struct definition, just pop and ignore
6088 if (info
->type_stack
->next
->type
.ignorep
)
6090 ieee_pop_unused_type (info
);
6094 size
= info
->type_stack
->type
.size
;
6095 unsignedp
= info
->type_stack
->type
.unsignedp
;
6096 referencep
= info
->type_stack
->type
.referencep
;
6097 localp
= info
->type_stack
->type
.localp
;
6098 indx
= ieee_pop_type (info
);
6101 info
->type_stack
->type
.localp
= true;
6103 if (info
->type_stack
->type
.classdef
!= NULL
)
6108 /* This is a class. We must add a description of this field to
6109 the class records we are building. */
6111 flags
= ieee_vis_to_flags (visibility
);
6112 nindx
= info
->type_stack
->type
.classdef
->indx
;
6113 if (! ieee_change_buffer (info
,
6114 &info
->type_stack
->type
.classdef
->pmiscbuf
)
6115 || ! ieee_write_asn (info
, nindx
, 'd')
6116 || ! ieee_write_asn (info
, nindx
, flags
)
6117 || ! ieee_write_atn65 (info
, nindx
, name
)
6118 || ! ieee_write_atn65 (info
, nindx
, name
))
6120 info
->type_stack
->type
.classdef
->pmisccount
+= 4;
6126 /* We need to output a record recording that this field is
6127 really of reference type. We put this on the refs field
6128 of classdef, so that it can be appended to the C++
6129 records after the class is defined. */
6131 nindx
= info
->name_indx
;
6134 if (! ieee_change_buffer (info
,
6135 &info
->type_stack
->type
.classdef
->refs
)
6136 || ! ieee_write_byte (info
, (int) ieee_nn_record
)
6137 || ! ieee_write_number (info
, nindx
)
6138 || ! ieee_write_id (info
, "")
6139 || ! ieee_write_2bytes (info
, (int) ieee_atn_record_enum
)
6140 || ! ieee_write_number (info
, nindx
)
6141 || ! ieee_write_number (info
, 0)
6142 || ! ieee_write_number (info
, 62)
6143 || ! ieee_write_number (info
, 80)
6144 || ! ieee_write_number (info
, 4)
6145 || ! ieee_write_asn (info
, nindx
, 'R')
6146 || ! ieee_write_asn (info
, nindx
, 3)
6147 || ! ieee_write_atn65 (info
, nindx
, info
->type_stack
->type
.name
)
6148 || ! ieee_write_atn65 (info
, nindx
, name
))
6153 /* If the bitsize doesn't match the expected size, we need to output
6155 if (size
== 0 || bitsize
== 0 || bitsize
== size
* 8)
6156 offset
= bitpos
/ 8;
6159 if (! ieee_define_type (info
, 0, unsignedp
,
6160 info
->type_stack
->type
.localp
)
6161 || ! ieee_write_number (info
, 'g')
6162 || ! ieee_write_number (info
, unsignedp
? 0 : 1)
6163 || ! ieee_write_number (info
, bitsize
)
6164 || ! ieee_write_number (info
, indx
))
6166 indx
= ieee_pop_type (info
);
6170 /* Switch to the struct we are building in order to output this
6171 field definition. */
6172 return (ieee_change_buffer (info
, &info
->type_stack
->type
.strdef
)
6173 && ieee_write_id (info
, name
)
6174 && ieee_write_number (info
, indx
)
6175 && ieee_write_number (info
, offset
));
6178 /* Finish up a struct type. */
6181 ieee_end_struct_type (p
)
6184 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6185 struct ieee_buflist
*pb
;
6187 assert (info
->type_stack
!= NULL
6188 && ! ieee_buffer_emptyp (&info
->type_stack
->type
.strdef
));
6190 /* If we were ignoring this struct definition because it was a
6191 duplicate defintion, just through away whatever bytes we have
6192 accumulated. Leave the type on the stack. */
6193 if (info
->type_stack
->type
.ignorep
)
6196 /* If this is not a duplicate definition of this tag, then localp
6197 will be false, and we can put it in the global type block.
6198 FIXME: We should avoid outputting duplicate definitions which are
6200 if (! info
->type_stack
->type
.localp
)
6202 /* Make sure we have started the global type block. */
6203 if (ieee_buffer_emptyp (&info
->global_types
))
6205 if (! ieee_change_buffer (info
, &info
->global_types
)
6206 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
6207 || ! ieee_write_byte (info
, 2)
6208 || ! ieee_write_number (info
, 0)
6209 || ! ieee_write_id (info
, ""))
6212 pb
= &info
->global_types
;
6216 /* Make sure we have started the types block. */
6217 if (ieee_buffer_emptyp (&info
->types
))
6219 if (! ieee_change_buffer (info
, &info
->types
)
6220 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
6221 || ! ieee_write_byte (info
, 1)
6222 || ! ieee_write_number (info
, 0)
6223 || ! ieee_write_id (info
, info
->modname
))
6229 /* Append the struct definition to the types. */
6230 if (! ieee_append_buffer (info
, pb
, &info
->type_stack
->type
.strdef
)
6231 || ! ieee_init_buffer (info
, &info
->type_stack
->type
.strdef
))
6234 /* Leave the struct on the type stack. */
6239 /* Start a class type. */
6242 ieee_start_class_type (p
, tag
, id
, structp
, size
, vptr
, ownvptr
)
6251 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6253 struct ieee_buflist pmiscbuf
;
6255 struct ieee_type_class
*classdef
;
6257 /* A C++ class is output as a C++ struct along with a set of pmisc
6258 records describing the class. */
6260 /* We need to have a name so that we can associate the struct and
6266 t
= (char *) xmalloc (20);
6267 sprintf (t
, "__anon%u", id
);
6271 /* We can't write out the virtual table information until we have
6272 finished the class, because we don't know the virtual table size.
6273 We get the size from the largest voffset we see. */
6275 if (vptr
&& ! ownvptr
)
6277 vclass
= info
->type_stack
->type
.name
;
6278 assert (vclass
!= NULL
);
6279 /* We don't call ieee_pop_unused_type, since the class should
6281 (void) ieee_pop_type (info
);
6284 if (! ieee_start_struct_type (p
, tag
, id
, structp
, size
))
6287 indx
= info
->name_indx
;
6290 /* We write out pmisc records into the classdef field. We will
6291 write out the pmisc start after we know the number of records we
6293 if (! ieee_init_buffer (info
, &pmiscbuf
)
6294 || ! ieee_change_buffer (info
, &pmiscbuf
)
6295 || ! ieee_write_asn (info
, indx
, 'T')
6296 || ! ieee_write_asn (info
, indx
, structp
? 'o' : 'u')
6297 || ! ieee_write_atn65 (info
, indx
, tag
))
6300 classdef
= (struct ieee_type_class
*) xmalloc (sizeof *classdef
);
6301 memset (classdef
, 0, sizeof *classdef
);
6303 classdef
->indx
= indx
;
6304 classdef
->pmiscbuf
= pmiscbuf
;
6305 classdef
->pmisccount
= 3;
6306 classdef
->vclass
= vclass
;
6307 classdef
->ownvptr
= ownvptr
;
6309 info
->type_stack
->type
.classdef
= classdef
;
6314 /* Add a static member to a class. */
6317 ieee_class_static_member (p
, name
, physname
, visibility
)
6320 const char *physname
;
6321 enum debug_visibility visibility
;
6323 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6327 /* We don't care about the type. Hopefully there will be a call to
6328 ieee_variable declaring the physical name and the type, since
6329 that is where an IEEE consumer must get the type. */
6330 ieee_pop_unused_type (info
);
6332 assert (info
->type_stack
!= NULL
6333 && info
->type_stack
->type
.classdef
!= NULL
);
6335 flags
= ieee_vis_to_flags (visibility
);
6336 flags
|= CXXFLAGS_STATIC
;
6338 nindx
= info
->type_stack
->type
.classdef
->indx
;
6340 if (! ieee_change_buffer (info
, &info
->type_stack
->type
.classdef
->pmiscbuf
)
6341 || ! ieee_write_asn (info
, nindx
, 'd')
6342 || ! ieee_write_asn (info
, nindx
, flags
)
6343 || ! ieee_write_atn65 (info
, nindx
, name
)
6344 || ! ieee_write_atn65 (info
, nindx
, physname
))
6346 info
->type_stack
->type
.classdef
->pmisccount
+= 4;
6351 /* Add a base class to a class. */
6354 ieee_class_baseclass (p
, bitpos
, virtual, visibility
)
6358 enum debug_visibility visibility
;
6360 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6368 assert (info
->type_stack
!= NULL
6369 && info
->type_stack
->type
.name
!= NULL
6370 && info
->type_stack
->next
!= NULL
6371 && info
->type_stack
->next
->type
.classdef
!= NULL
6372 && ! ieee_buffer_emptyp (&info
->type_stack
->next
->type
.strdef
));
6374 bname
= info
->type_stack
->type
.name
;
6375 localp
= info
->type_stack
->type
.localp
;
6376 bindx
= ieee_pop_type (info
);
6378 /* We are currently defining both a struct and a class. We must
6379 write out a field definition in the struct which holds the base
6380 class. The stabs debugging reader will create a field named
6381 _vb$CLASS for a virtual base class, so we just use that. FIXME:
6382 we should not depend upon a detail of stabs debugging. */
6385 fname
= (char *) xmalloc (strlen (bname
) + sizeof "_vb$");
6386 sprintf (fname
, "_vb$%s", bname
);
6387 flags
= BASEFLAGS_VIRTUAL
;
6392 info
->type_stack
->type
.localp
= true;
6394 fname
= (char *) xmalloc (strlen (bname
) + sizeof "_b$");
6395 sprintf (fname
, "_b$%s", bname
);
6397 if (! ieee_change_buffer (info
, &info
->type_stack
->type
.strdef
)
6398 || ! ieee_write_id (info
, fname
)
6399 || ! ieee_write_number (info
, bindx
)
6400 || ! ieee_write_number (info
, bitpos
/ 8))
6405 if (visibility
== DEBUG_VISIBILITY_PRIVATE
)
6406 flags
|= BASEFLAGS_PRIVATE
;
6408 nindx
= info
->type_stack
->type
.classdef
->indx
;
6410 if (! ieee_change_buffer (info
, &info
->type_stack
->type
.classdef
->pmiscbuf
)
6411 || ! ieee_write_asn (info
, nindx
, 'b')
6412 || ! ieee_write_asn (info
, nindx
, flags
)
6413 || ! ieee_write_atn65 (info
, nindx
, bname
)
6414 || ! ieee_write_asn (info
, nindx
, 0)
6415 || ! ieee_write_atn65 (info
, nindx
, fname
))
6417 info
->type_stack
->type
.classdef
->pmisccount
+= 5;
6424 /* Start building a method for a class. */
6427 ieee_class_start_method (p
, name
)
6431 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6433 assert (info
->type_stack
!= NULL
6434 && info
->type_stack
->type
.classdef
!= NULL
6435 && info
->type_stack
->type
.classdef
->method
== NULL
);
6437 info
->type_stack
->type
.classdef
->method
= name
;
6442 /* Define a new method variant, either static or not. */
6445 ieee_class_method_var (info
, physname
, visibility
, staticp
, constp
,
6446 volatilep
, voffset
, context
)
6447 struct ieee_handle
*info
;
6448 const char *physname
;
6449 enum debug_visibility visibility
;
6460 /* We don't need the type of the method. An IEEE consumer which
6461 wants the type must track down the function by the physical name
6462 and get the type from that. */
6463 ieee_pop_unused_type (info
);
6465 /* We don't use the context. FIXME: We probably ought to use it to
6466 adjust the voffset somehow, but I don't really know how. */
6468 ieee_pop_unused_type (info
);
6470 assert (info
->type_stack
!= NULL
6471 && info
->type_stack
->type
.classdef
!= NULL
6472 && info
->type_stack
->type
.classdef
->method
!= NULL
);
6474 flags
= ieee_vis_to_flags (visibility
);
6476 /* FIXME: We never set CXXFLAGS_OVERRIDE, CXXFLAGS_OPERATOR,
6477 CXXFLAGS_CTORDTOR, CXXFLAGS_CTOR, or CXXFLAGS_INLINE. */
6480 flags
|= CXXFLAGS_STATIC
;
6482 flags
|= CXXFLAGS_CONST
;
6484 flags
|= CXXFLAGS_VOLATILE
;
6486 nindx
= info
->type_stack
->type
.classdef
->indx
;
6488 virtual = context
|| voffset
> 0;
6490 if (! ieee_change_buffer (info
,
6491 &info
->type_stack
->type
.classdef
->pmiscbuf
)
6492 || ! ieee_write_asn (info
, nindx
, virtual ? 'v' : 'm')
6493 || ! ieee_write_asn (info
, nindx
, flags
)
6494 || ! ieee_write_atn65 (info
, nindx
,
6495 info
->type_stack
->type
.classdef
->method
)
6496 || ! ieee_write_atn65 (info
, nindx
, physname
))
6501 if (voffset
> info
->type_stack
->type
.classdef
->voffset
)
6502 info
->type_stack
->type
.classdef
->voffset
= voffset
;
6503 if (! ieee_write_asn (info
, nindx
, voffset
))
6505 ++info
->type_stack
->type
.classdef
->pmisccount
;
6508 if (! ieee_write_asn (info
, nindx
, 0))
6511 info
->type_stack
->type
.classdef
->pmisccount
+= 5;
6516 /* Define a new method variant. */
6519 ieee_class_method_variant (p
, physname
, visibility
, constp
, volatilep
,
6522 const char *physname
;
6523 enum debug_visibility visibility
;
6529 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6531 return ieee_class_method_var (info
, physname
, visibility
, false, constp
,
6532 volatilep
, voffset
, context
);
6535 /* Define a new static method variant. */
6538 ieee_class_static_method_variant (p
, physname
, visibility
, constp
, volatilep
)
6540 const char *physname
;
6541 enum debug_visibility visibility
;
6545 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6547 return ieee_class_method_var (info
, physname
, visibility
, true, constp
,
6548 volatilep
, 0, false);
6551 /* Finish up a method. */
6554 ieee_class_end_method (p
)
6557 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6559 assert (info
->type_stack
!= NULL
6560 && info
->type_stack
->type
.classdef
!= NULL
6561 && info
->type_stack
->type
.classdef
->method
!= NULL
);
6563 info
->type_stack
->type
.classdef
->method
= NULL
;
6568 /* Finish up a class. */
6571 ieee_end_class_type (p
)
6574 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6577 assert (info
->type_stack
!= NULL
6578 && info
->type_stack
->type
.classdef
!= NULL
);
6580 /* If we were ignoring this class definition because it was a
6581 duplicate definition, just through away whatever bytes we have
6582 accumulated. Leave the type on the stack. */
6583 if (info
->type_stack
->type
.ignorep
)
6586 nindx
= info
->type_stack
->type
.classdef
->indx
;
6588 /* If we have a virtual table, we can write out the information now. */
6589 if (info
->type_stack
->type
.classdef
->vclass
!= NULL
6590 || info
->type_stack
->type
.classdef
->ownvptr
)
6592 if (! ieee_change_buffer (info
,
6593 &info
->type_stack
->type
.classdef
->pmiscbuf
)
6594 || ! ieee_write_asn (info
, nindx
, 'z')
6595 || ! ieee_write_atn65 (info
, nindx
, "")
6596 || ! ieee_write_asn (info
, nindx
,
6597 info
->type_stack
->type
.classdef
->voffset
))
6599 if (info
->type_stack
->type
.classdef
->ownvptr
)
6601 if (! ieee_write_atn65 (info
, nindx
, ""))
6606 if (! ieee_write_atn65 (info
, nindx
,
6607 info
->type_stack
->type
.classdef
->vclass
))
6610 if (! ieee_write_asn (info
, nindx
, 0))
6612 info
->type_stack
->type
.classdef
->pmisccount
+= 5;
6615 /* Now that we know the number of pmisc records, we can write out
6616 the atn62 which starts the pmisc records, and append them to the
6619 if (! ieee_change_buffer (info
, &info
->cxx
)
6620 || ! ieee_write_byte (info
, (int) ieee_nn_record
)
6621 || ! ieee_write_number (info
, nindx
)
6622 || ! ieee_write_id (info
, "")
6623 || ! ieee_write_2bytes (info
, (int) ieee_atn_record_enum
)
6624 || ! ieee_write_number (info
, nindx
)
6625 || ! ieee_write_number (info
, 0)
6626 || ! ieee_write_number (info
, 62)
6627 || ! ieee_write_number (info
, 80)
6628 || ! ieee_write_number (info
,
6629 info
->type_stack
->type
.classdef
->pmisccount
))
6632 if (! ieee_append_buffer (info
, &info
->cxx
,
6633 &info
->type_stack
->type
.classdef
->pmiscbuf
))
6635 if (! ieee_buffer_emptyp (&info
->type_stack
->type
.classdef
->refs
))
6637 if (! ieee_append_buffer (info
, &info
->cxx
,
6638 &info
->type_stack
->type
.classdef
->refs
))
6642 return ieee_end_struct_type (p
);
6645 /* Push a previously seen typedef onto the type stack. */
6648 ieee_typedef_type (p
, name
)
6652 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6653 struct ieee_name_type_hash_entry
*h
;
6654 struct ieee_name_type
*nt
;
6656 h
= ieee_name_type_hash_lookup (&info
->typedefs
, name
, false, false);
6658 /* h should never be NULL, since that would imply that the generic
6659 debugging code has asked for a typedef which it has not yet
6663 /* We always use the most recently defined type for this name, which
6664 will be the first one on the list. */
6667 if (! ieee_push_type (info
, nt
->type
.indx
, nt
->type
.size
,
6668 nt
->type
.unsignedp
, nt
->type
.localp
))
6671 /* Copy over any other type information we may have. */
6672 info
->type_stack
->type
= nt
->type
;
6677 /* Push a tagged type onto the type stack. */
6680 ieee_tag_type (p
, name
, id
, kind
)
6684 enum debug_type_kind kind
;
6686 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6690 struct ieee_name_type_hash_entry
*h
;
6691 struct ieee_name_type
*nt
;
6693 if (kind
== DEBUG_KIND_ENUM
)
6695 struct ieee_defined_enum
*e
;
6699 for (e
= info
->enums
; e
!= NULL
; e
= e
->next
)
6700 if (e
->tag
!= NULL
&& strcmp (e
->tag
, name
) == 0)
6701 return ieee_push_type (info
, e
->indx
, 0, true, false);
6703 e
= (struct ieee_defined_enum
*) xmalloc (sizeof *e
);
6704 memset (e
, 0, sizeof *e
);
6706 e
->indx
= info
->type_indx
;
6711 e
->next
= info
->enums
;
6714 return ieee_push_type (info
, e
->indx
, 0, true, false);
6722 sprintf (ab
, "__anon%u", id
);
6727 h
= ieee_name_type_hash_lookup (&info
->tags
, name
, true, copy
);
6731 for (nt
= h
->types
; nt
!= NULL
; nt
= nt
->next
)
6735 if (! ieee_push_type (info
, nt
->type
.indx
, nt
->type
.size
,
6736 nt
->type
.unsignedp
, nt
->type
.localp
))
6738 /* Copy over any other type information we may have. */
6739 info
->type_stack
->type
= nt
->type
;
6743 if (! nt
->type
.localp
)
6745 /* This is a duplicate of a global type, so it must be
6751 nt
= (struct ieee_name_type
*) xmalloc (sizeof *nt
);
6752 memset (nt
, 0, sizeof *nt
);
6755 nt
->type
.name
= h
->root
.string
;
6756 nt
->type
.indx
= info
->type_indx
;
6757 nt
->type
.localp
= localp
;
6761 nt
->next
= h
->types
;
6764 if (! ieee_push_type (info
, nt
->type
.indx
, 0, false, localp
))
6767 info
->type_stack
->type
.name
= h
->root
.string
;
6772 /* Output a typedef. */
6775 ieee_typdef (p
, name
)
6779 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6780 struct ieee_write_type type
;
6784 struct ieee_name_type_hash_entry
*h
;
6785 struct ieee_name_type
*nt
;
6787 type
= info
->type_stack
->type
;
6790 /* If this is a simple builtin type using a builtin name, we don't
6791 want to output the typedef itself. We also want to change the
6792 type index to correspond to the name being used. We recognize
6793 names used in stabs debugging output even if they don't exactly
6794 correspond to the names used for the IEEE builtin types. */
6796 if (indx
<= (unsigned int) builtin_bcd_float
)
6798 switch ((enum builtin_types
) indx
)
6804 if (strcmp (name
, "void") == 0)
6808 case builtin_signed_char
:
6810 if (strcmp (name
, "signed char") == 0)
6812 indx
= (unsigned int) builtin_signed_char
;
6815 else if (strcmp (name
, "char") == 0)
6817 indx
= (unsigned int) builtin_char
;
6822 case builtin_unsigned_char
:
6823 if (strcmp (name
, "unsigned char") == 0)
6827 case builtin_signed_short_int
:
6829 case builtin_short_int
:
6830 case builtin_signed_short
:
6831 if (strcmp (name
, "signed short int") == 0)
6833 indx
= (unsigned int) builtin_signed_short_int
;
6836 else if (strcmp (name
, "short") == 0)
6838 indx
= (unsigned int) builtin_short
;
6841 else if (strcmp (name
, "short int") == 0)
6843 indx
= (unsigned int) builtin_short_int
;
6846 else if (strcmp (name
, "signed short") == 0)
6848 indx
= (unsigned int) builtin_signed_short
;
6853 case builtin_unsigned_short_int
:
6854 case builtin_unsigned_short
:
6855 if (strcmp (name
, "unsigned short int") == 0
6856 || strcmp (name
, "short unsigned int") == 0)
6858 indx
= builtin_unsigned_short_int
;
6861 else if (strcmp (name
, "unsigned short") == 0)
6863 indx
= builtin_unsigned_short
;
6868 case builtin_signed_long
:
6869 case builtin_int
: /* FIXME: Size depends upon architecture. */
6871 if (strcmp (name
, "signed long") == 0)
6873 indx
= builtin_signed_long
;
6876 else if (strcmp (name
, "int") == 0)
6881 else if (strcmp (name
, "long") == 0
6882 || strcmp (name
, "long int") == 0)
6884 indx
= builtin_long
;
6889 case builtin_unsigned_long
:
6890 case builtin_unsigned
: /* FIXME: Size depends upon architecture. */
6891 case builtin_unsigned_int
: /* FIXME: Like builtin_unsigned. */
6892 if (strcmp (name
, "unsigned long") == 0
6893 || strcmp (name
, "long unsigned int") == 0)
6895 indx
= builtin_unsigned_long
;
6898 else if (strcmp (name
, "unsigned") == 0)
6900 indx
= builtin_unsigned
;
6903 else if (strcmp (name
, "unsigned int") == 0)
6905 indx
= builtin_unsigned_int
;
6910 case builtin_signed_long_long
:
6911 if (strcmp (name
, "signed long long") == 0
6912 || strcmp (name
, "long long int") == 0)
6916 case builtin_unsigned_long_long
:
6917 if (strcmp (name
, "unsigned long long") == 0
6918 || strcmp (name
, "long long unsigned int") == 0)
6923 if (strcmp (name
, "float") == 0)
6927 case builtin_double
:
6928 if (strcmp (name
, "double") == 0)
6932 case builtin_long_double
:
6933 if (strcmp (name
, "long double") == 0)
6937 case builtin_long_long_double
:
6938 if (strcmp (name
, "long long double") == 0)
6947 h
= ieee_name_type_hash_lookup (&info
->typedefs
, name
, true, false);
6951 /* See if we have already defined this type with this name. */
6952 localp
= type
.localp
;
6953 for (nt
= h
->types
; nt
!= NULL
; nt
= nt
->next
)
6957 /* If this is a global definition, then we don't need to
6958 do anything here. */
6959 if (! nt
->type
.localp
)
6961 ieee_pop_unused_type (info
);
6967 /* This is a duplicate definition, so make this one local. */
6972 /* We need to add a new typedef for this type. */
6974 nt
= (struct ieee_name_type
*) xmalloc (sizeof *nt
);
6975 memset (nt
, 0, sizeof *nt
);
6978 nt
->type
.name
= name
;
6979 nt
->type
.localp
= localp
;
6980 nt
->kind
= DEBUG_KIND_ILLEGAL
;
6982 nt
->next
= h
->types
;
6987 /* This is one of the builtin typedefs, so we don't need to
6988 actually define it. */
6989 ieee_pop_unused_type (info
);
6993 indx
= ieee_pop_type (info
);
6995 if (! ieee_define_named_type (info
, name
, (unsigned int) -1, type
.size
,
6996 type
.unsignedp
, localp
,
6997 (struct ieee_buflist
*) NULL
)
6998 || ! ieee_write_number (info
, 'T')
6999 || ! ieee_write_number (info
, indx
))
7002 /* Remove the type we just added to the type stack. This should not
7003 be ieee_pop_unused_type, since the type is used, we just don't
7005 (void) ieee_pop_type (info
);
7010 /* Output a tag for a type. We don't have to do anything here. */
7017 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
7019 /* This should not be ieee_pop_unused_type, since we want the type
7021 (void) ieee_pop_type (info
);
7025 /* Output an integer constant. */
7028 ieee_int_constant (p
, name
, val
)
7037 /* Output a floating point constant. */
7040 ieee_float_constant (p
, name
, val
)
7049 /* Output a typed constant. */
7052 ieee_typed_constant (p
, name
, val
)
7057 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
7060 ieee_pop_unused_type (info
);
7064 /* Output a variable. */
7067 ieee_variable (p
, name
, kind
, val
)
7070 enum debug_var_kind kind
;
7073 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
7074 unsigned int name_indx
;
7077 unsigned int type_indx
;
7081 size
= info
->type_stack
->type
.size
;
7082 referencep
= info
->type_stack
->type
.referencep
;
7083 type_indx
= ieee_pop_type (info
);
7085 assert (! ieee_buffer_emptyp (&info
->vars
));
7086 if (! ieee_change_buffer (info
, &info
->vars
))
7089 name_indx
= info
->name_indx
;
7092 /* Write out an NN and an ATN record for this variable. */
7093 if (! ieee_write_byte (info
, (int) ieee_nn_record
)
7094 || ! ieee_write_number (info
, name_indx
)
7095 || ! ieee_write_id (info
, name
)
7096 || ! ieee_write_2bytes (info
, (int) ieee_atn_record_enum
)
7097 || ! ieee_write_number (info
, name_indx
)
7098 || ! ieee_write_number (info
, type_indx
))
7106 if (! ieee_write_number (info
, 8)
7107 || ! ieee_add_range (info
, false, val
, val
+ size
))
7113 if (! ieee_write_number (info
, 3)
7114 || ! ieee_add_range (info
, false, val
, val
+ size
))
7119 case DEBUG_LOCAL_STATIC
:
7120 if (! ieee_write_number (info
, 3)
7121 || ! ieee_add_range (info
, false, val
, val
+ size
))
7127 if (! ieee_write_number (info
, 1)
7128 || ! ieee_write_number (info
, val
))
7133 case DEBUG_REGISTER
:
7134 if (! ieee_write_number (info
, 2)
7135 || ! ieee_write_number (info
,
7136 ieee_genreg_to_regno (info
->abfd
, val
)))
7145 if (! ieee_write_asn (info
, name_indx
, val
))
7149 /* If this is really a reference type, then we just output it with
7150 pointer type, and must now output a C++ record indicating that it
7151 is really reference type. */
7156 nindx
= info
->name_indx
;
7159 /* If this is a global variable, we want to output the misc
7160 record in the C++ misc record block. Otherwise, we want to
7161 output it just after the variable definition, which is where
7162 the current buffer is. */
7165 if (! ieee_change_buffer (info
, &info
->cxx
))
7169 if (! ieee_write_byte (info
, (int) ieee_nn_record
)
7170 || ! ieee_write_number (info
, nindx
)
7171 || ! ieee_write_id (info
, "")
7172 || ! ieee_write_2bytes (info
, (int) ieee_atn_record_enum
)
7173 || ! ieee_write_number (info
, nindx
)
7174 || ! ieee_write_number (info
, 0)
7175 || ! ieee_write_number (info
, 62)
7176 || ! ieee_write_number (info
, 80)
7177 || ! ieee_write_number (info
, 3)
7178 || ! ieee_write_asn (info
, nindx
, 'R')
7179 || ! ieee_write_asn (info
, nindx
, refflag
)
7180 || ! ieee_write_atn65 (info
, nindx
, name
))
7187 /* Start outputting information for a function. */
7190 ieee_start_function (p
, name
, global
)
7195 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
7197 unsigned int retindx
, typeindx
;
7199 referencep
= info
->type_stack
->type
.referencep
;
7200 retindx
= ieee_pop_type (info
);
7202 /* Besides recording a BB4 or BB6 block, we record the type of the
7203 function in the BB1 typedef block. We can't write out the full
7204 type until we have seen all the parameters, so we accumulate it
7205 in info->fntype and info->fnargs. */
7206 if (! ieee_buffer_emptyp (&info
->fntype
))
7208 /* FIXME: This might happen someday if we support nested
7213 info
->fnname
= name
;
7215 /* An attribute of 0x40 means that the push mask is unknown. */
7216 if (! ieee_define_named_type (info
, name
, (unsigned int) -1, 0, false, true,
7218 || ! ieee_write_number (info
, 'x')
7219 || ! ieee_write_number (info
, 0x40)
7220 || ! ieee_write_number (info
, 0)
7221 || ! ieee_write_number (info
, 0)
7222 || ! ieee_write_number (info
, retindx
))
7225 typeindx
= ieee_pop_type (info
);
7227 if (! ieee_init_buffer (info
, &info
->fnargs
))
7229 info
->fnargcount
= 0;
7231 /* If the function return value is actually a reference type, we
7232 must add a record indicating that. */
7237 nindx
= info
->name_indx
;
7239 if (! ieee_change_buffer (info
, &info
->cxx
)
7240 || ! ieee_write_byte (info
, (int) ieee_nn_record
)
7241 || ! ieee_write_number (info
, nindx
)
7242 || ! ieee_write_id (info
, "")
7243 || ! ieee_write_2bytes (info
, (int) ieee_atn_record_enum
)
7244 || ! ieee_write_number (info
, nindx
)
7245 || ! ieee_write_number (info
, 0)
7246 || ! ieee_write_number (info
, 62)
7247 || ! ieee_write_number (info
, 80)
7248 || ! ieee_write_number (info
, 3)
7249 || ! ieee_write_asn (info
, nindx
, 'R')
7250 || ! ieee_write_asn (info
, nindx
, global
? 0 : 1)
7251 || ! ieee_write_atn65 (info
, nindx
, name
))
7255 assert (! ieee_buffer_emptyp (&info
->vars
));
7256 if (! ieee_change_buffer (info
, &info
->vars
))
7259 /* The address is written out as the first block. */
7261 ++info
->block_depth
;
7263 return (ieee_write_byte (info
, (int) ieee_bb_record_enum
)
7264 && ieee_write_byte (info
, global
? 4 : 6)
7265 && ieee_write_number (info
, 0)
7266 && ieee_write_id (info
, name
)
7267 && ieee_write_number (info
, 0)
7268 && ieee_write_number (info
, typeindx
));
7271 /* Add a function parameter. This will normally be called before the
7272 first block, so we postpone them until we see the block. */
7275 ieee_function_parameter (p
, name
, kind
, val
)
7278 enum debug_parm_kind kind
;
7281 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
7282 struct ieee_pending_parm
*m
, **pm
;
7284 assert (info
->block_depth
== 1);
7286 m
= (struct ieee_pending_parm
*) xmalloc (sizeof *m
);
7287 memset (m
, 0, sizeof *m
);
7291 m
->referencep
= info
->type_stack
->type
.referencep
;
7292 m
->type
= ieee_pop_type (info
);
7296 for (pm
= &info
->pending_parms
; *pm
!= NULL
; pm
= &(*pm
)->next
)
7300 /* Add the type to the fnargs list. */
7301 if (! ieee_change_buffer (info
, &info
->fnargs
)
7302 || ! ieee_write_number (info
, m
->type
))
7309 /* Output pending function parameters. */
7312 ieee_output_pending_parms (info
)
7313 struct ieee_handle
*info
;
7315 struct ieee_pending_parm
*m
;
7316 unsigned int refcount
;
7319 for (m
= info
->pending_parms
; m
!= NULL
; m
= m
->next
)
7321 enum debug_var_kind vkind
;
7328 case DEBUG_PARM_STACK
:
7329 case DEBUG_PARM_REFERENCE
:
7330 vkind
= DEBUG_LOCAL
;
7332 case DEBUG_PARM_REG
:
7333 case DEBUG_PARM_REF_REG
:
7334 vkind
= DEBUG_REGISTER
;
7338 if (! ieee_push_type (info
, m
->type
, 0, false, false))
7340 info
->type_stack
->type
.referencep
= m
->referencep
;
7343 if (! ieee_variable ((PTR
) info
, m
->name
, vkind
, m
->val
))
7347 /* If there are any reference parameters, we need to output a
7348 miscellaneous record indicating them. */
7351 unsigned int nindx
, varindx
;
7353 /* FIXME: The MRI compiler outputs the demangled function name
7354 here, but we are outputting the mangled name. */
7355 nindx
= info
->name_indx
;
7357 if (! ieee_change_buffer (info
, &info
->vars
)
7358 || ! ieee_write_byte (info
, (int) ieee_nn_record
)
7359 || ! ieee_write_number (info
, nindx
)
7360 || ! ieee_write_id (info
, "")
7361 || ! ieee_write_2bytes (info
, (int) ieee_atn_record_enum
)
7362 || ! ieee_write_number (info
, nindx
)
7363 || ! ieee_write_number (info
, 0)
7364 || ! ieee_write_number (info
, 62)
7365 || ! ieee_write_number (info
, 80)
7366 || ! ieee_write_number (info
, refcount
+ 3)
7367 || ! ieee_write_asn (info
, nindx
, 'B')
7368 || ! ieee_write_atn65 (info
, nindx
, info
->fnname
)
7369 || ! ieee_write_asn (info
, nindx
, 0))
7371 for (m
= info
->pending_parms
, varindx
= 1;
7373 m
= m
->next
, varindx
++)
7377 if (! ieee_write_asn (info
, nindx
, varindx
))
7383 m
= info
->pending_parms
;
7386 struct ieee_pending_parm
*next
;
7393 info
->pending_parms
= NULL
;
7398 /* Start a block. If this is the first block, we output the address
7399 to finish the BB4 or BB6, and then output the function parameters. */
7402 ieee_start_block (p
, addr
)
7406 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
7408 if (! ieee_change_buffer (info
, &info
->vars
))
7411 if (info
->block_depth
== 1)
7413 if (! ieee_write_number (info
, addr
)
7414 || ! ieee_output_pending_parms (info
))
7419 if (! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
7420 || ! ieee_write_byte (info
, 6)
7421 || ! ieee_write_number (info
, 0)
7422 || ! ieee_write_id (info
, "")
7423 || ! ieee_write_number (info
, 0)
7424 || ! ieee_write_number (info
, 0)
7425 || ! ieee_write_number (info
, addr
))
7429 if (! ieee_start_range (info
, addr
))
7432 ++info
->block_depth
;
7440 ieee_end_block (p
, addr
)
7444 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
7446 /* The address we are given is the end of the block, but IEEE seems
7447 to want to the address of the last byte in the block, so we
7449 if (! ieee_change_buffer (info
, &info
->vars
)
7450 || ! ieee_write_byte (info
, (int) ieee_be_record_enum
)
7451 || ! ieee_write_number (info
, addr
- 1))
7454 if (! ieee_end_range (info
, addr
))
7457 --info
->block_depth
;
7459 if (addr
> info
->highaddr
)
7460 info
->highaddr
= addr
;
7465 /* End a function. */
7468 ieee_end_function (p
)
7471 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
7473 assert (info
->block_depth
== 1);
7475 --info
->block_depth
;
7477 /* Now we can finish up fntype, and add it to the typdef section.
7478 At this point, fntype is the 'x' type up to the argument count,
7479 and fnargs is the argument types. We must add the argument
7480 count, and we must add the level. FIXME: We don't record varargs
7481 functions correctly. In fact, stabs debugging does not give us
7482 enough information to do so. */
7483 if (! ieee_change_buffer (info
, &info
->fntype
)
7484 || ! ieee_write_number (info
, info
->fnargcount
)
7485 || ! ieee_change_buffer (info
, &info
->fnargs
)
7486 || ! ieee_write_number (info
, 0))
7489 /* Make sure the typdef block has been started. */
7490 if (ieee_buffer_emptyp (&info
->types
))
7492 if (! ieee_change_buffer (info
, &info
->types
)
7493 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
7494 || ! ieee_write_byte (info
, 1)
7495 || ! ieee_write_number (info
, 0)
7496 || ! ieee_write_id (info
, info
->modname
))
7500 if (! ieee_append_buffer (info
, &info
->types
, &info
->fntype
)
7501 || ! ieee_append_buffer (info
, &info
->types
, &info
->fnargs
))
7504 info
->fnname
= NULL
;
7505 if (! ieee_init_buffer (info
, &info
->fntype
)
7506 || ! ieee_init_buffer (info
, &info
->fnargs
))
7508 info
->fnargcount
= 0;
7513 /* Record line number information. */
7516 ieee_lineno (p
, filename
, lineno
, addr
)
7518 const char *filename
;
7519 unsigned long lineno
;
7522 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
7524 assert (info
->filename
!= NULL
);
7526 /* The HP simulator seems to get confused when more than one line is
7527 listed for the same address, at least if they are in different
7528 files. We handle this by always listing the last line for a
7529 given address, since that seems to be the one that gdb uses. */
7530 if (info
->pending_lineno_filename
!= NULL
7531 && addr
!= info
->pending_lineno_addr
)
7533 /* Make sure we have a line number block. */
7534 if (! ieee_buffer_emptyp (&info
->linenos
))
7536 if (! ieee_change_buffer (info
, &info
->linenos
))
7541 info
->lineno_name_indx
= info
->name_indx
;
7543 if (! ieee_change_buffer (info
, &info
->linenos
)
7544 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
7545 || ! ieee_write_byte (info
, 5)
7546 || ! ieee_write_number (info
, 0)
7547 || ! ieee_write_id (info
, info
->filename
)
7548 || ! ieee_write_byte (info
, (int) ieee_nn_record
)
7549 || ! ieee_write_number (info
, info
->lineno_name_indx
)
7550 || ! ieee_write_id (info
, ""))
7552 info
->lineno_filename
= info
->filename
;
7555 if (strcmp (info
->pending_lineno_filename
, info
->lineno_filename
) != 0)
7557 if (strcmp (info
->filename
, info
->lineno_filename
) != 0)
7559 /* We were not in the main file. Close the block for the
7561 if (! ieee_write_byte (info
, (int) ieee_be_record_enum
))
7563 if (strcmp (info
->filename
, info
->pending_lineno_filename
) == 0)
7565 /* We need a new NN record, and we aren't about to
7567 info
->lineno_name_indx
= info
->name_indx
;
7569 if (! ieee_write_byte (info
, (int) ieee_nn_record
)
7570 || ! ieee_write_number (info
, info
->lineno_name_indx
)
7571 || ! ieee_write_id (info
, ""))
7575 if (strcmp (info
->filename
, info
->pending_lineno_filename
) != 0)
7577 /* We are not changing to the main file. Open a block for
7578 the new included file. */
7579 info
->lineno_name_indx
= info
->name_indx
;
7581 if (! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
7582 || ! ieee_write_byte (info
, 5)
7583 || ! ieee_write_number (info
, 0)
7584 || ! ieee_write_id (info
, info
->pending_lineno_filename
)
7585 || ! ieee_write_byte (info
, (int) ieee_nn_record
)
7586 || ! ieee_write_number (info
, info
->lineno_name_indx
)
7587 || ! ieee_write_id (info
, ""))
7590 info
->lineno_filename
= info
->pending_lineno_filename
;
7593 if (! ieee_write_2bytes (info
, (int) ieee_atn_record_enum
)
7594 || ! ieee_write_number (info
, info
->lineno_name_indx
)
7595 || ! ieee_write_number (info
, 0)
7596 || ! ieee_write_number (info
, 7)
7597 || ! ieee_write_number (info
, info
->pending_lineno
)
7598 || ! ieee_write_number (info
, 0)
7599 || ! ieee_write_asn (info
, info
->lineno_name_indx
,
7600 info
->pending_lineno_addr
))
7604 info
->pending_lineno_filename
= filename
;
7605 info
->pending_lineno
= lineno
;
7606 info
->pending_lineno_addr
= addr
;