1 /* ieee.c -- Read and write IEEE-695 debugging information.
2 Copyright 1996, 1998, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor <ian@cygnus.com>.
5 This file is part of GNU Binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
22 /* This file reads and writes IEEE-695 debugging information. */
30 #include "libiberty.h"
33 #include "filenames.h"
35 /* This structure holds an entry on the block stack. */
39 /* The kind of block. */
41 /* The source file name, for a BB5 block. */
43 /* The index of the function type, for a BB4 or BB6 block. */
45 /* TRUE if this function is being skipped. */
49 /* This structure is the block stack. */
51 #define BLOCKSTACK_SIZE (16)
53 struct ieee_blockstack
55 /* The stack pointer. */
56 struct ieee_block
*bsp
;
58 struct ieee_block stack
[BLOCKSTACK_SIZE
];
61 /* This structure holds information for a variable. */
71 /* Slot if we make an indirect type. */
73 /* Kind of variable or function. */
85 /* This structure holds all the variables. */
89 /* Number of slots allocated. */
92 struct ieee_var
*vars
;
95 /* This structure holds information for a type. We need this because
96 we don't want to represent bitfields as real types. */
102 /* Slot if this is type is referenced before it is defined. */
104 /* Slots for arguments if we make indirect types for them. */
105 debug_type
*arg_slots
;
106 /* If this is a bitfield, this is the size in bits. If this is not
107 a bitfield, this is zero. */
108 unsigned long bitsize
;
111 /* This structure holds all the type information. */
115 /* Number of slots allocated. */
118 struct ieee_type
*types
;
120 #define BUILTIN_TYPE_COUNT (60)
121 debug_type builtins
[BUILTIN_TYPE_COUNT
];
124 /* This structure holds a linked last of structs with their tag names,
125 so that we can convert them to C++ classes if necessary. */
130 struct ieee_tag
*next
;
133 /* The type of the tag. */
135 /* The tagged type is an indirect type pointing at this slot. */
137 /* This is an array of slots used when a field type is converted
138 into a indirect type, in case it needs to be later converted into
143 /* This structure holds the information we pass around to the parsing
148 /* The debugging handle. */
152 /* The start of the bytes to be parsed. */
153 const bfd_byte
*bytes
;
154 /* The end of the bytes to be parsed. */
155 const bfd_byte
*pend
;
156 /* The block stack. */
157 struct ieee_blockstack blockstack
;
158 /* Whether we have seen a BB1 or BB2. */
159 bfd_boolean saw_filename
;
161 struct ieee_vars vars
;
162 /* The global variables, after a global typedef block. */
163 struct ieee_vars
*global_vars
;
165 struct ieee_types types
;
166 /* The global types, after a global typedef block. */
167 struct ieee_types
*global_types
;
168 /* The list of tagged structs. */
169 struct ieee_tag
*tags
;
172 /* Basic builtin types, not including the pointers. */
178 builtin_signed_char
= 2,
179 builtin_unsigned_char
= 3,
180 builtin_signed_short_int
= 4,
181 builtin_unsigned_short_int
= 5,
182 builtin_signed_long
= 6,
183 builtin_unsigned_long
= 7,
184 builtin_signed_long_long
= 8,
185 builtin_unsigned_long_long
= 9,
188 builtin_long_double
= 12,
189 builtin_long_long_double
= 13,
190 builtin_quoted_string
= 14,
191 builtin_instruction_address
= 15,
193 builtin_unsigned
= 17,
194 builtin_unsigned_int
= 18,
198 builtin_unsigned_short
= 22,
199 builtin_short_int
= 23,
200 builtin_signed_short
= 24,
201 builtin_bcd_float
= 25
204 /* These are the values found in the derivation flags of a 'b'
205 component record of a 'T' type extension record in a C++ pmisc
206 record. These are bitmasks. */
208 /* Set for a private base class, clear for a public base class.
209 Protected base classes are not supported. */
210 #define BASEFLAGS_PRIVATE (0x1)
211 /* Set for a virtual base class. */
212 #define BASEFLAGS_VIRTUAL (0x2)
213 /* Set for a friend class, clear for a base class. */
214 #define BASEFLAGS_FRIEND (0x10)
216 /* These are the values found in the specs flags of a 'd', 'm', or 'v'
217 component record of a 'T' type extension record in a C++ pmisc
218 record. The same flags are used for a 'M' record in a C++ pmisc
221 /* The lower two bits hold visibility information. */
222 #define CXXFLAGS_VISIBILITY (0x3)
223 /* This value in the lower two bits indicates a public member. */
224 #define CXXFLAGS_VISIBILITY_PUBLIC (0x0)
225 /* This value in the lower two bits indicates a private member. */
226 #define CXXFLAGS_VISIBILITY_PRIVATE (0x1)
227 /* This value in the lower two bits indicates a protected member. */
228 #define CXXFLAGS_VISIBILITY_PROTECTED (0x2)
229 /* Set for a static member. */
230 #define CXXFLAGS_STATIC (0x4)
231 /* Set for a virtual override. */
232 #define CXXFLAGS_OVERRIDE (0x8)
233 /* Set for a friend function. */
234 #define CXXFLAGS_FRIEND (0x10)
235 /* Set for a const function. */
236 #define CXXFLAGS_CONST (0x20)
237 /* Set for a volatile function. */
238 #define CXXFLAGS_VOLATILE (0x40)
239 /* Set for an overloaded function. */
240 #define CXXFLAGS_OVERLOADED (0x80)
241 /* Set for an operator function. */
242 #define CXXFLAGS_OPERATOR (0x100)
243 /* Set for a constructor or destructor. */
244 #define CXXFLAGS_CTORDTOR (0x400)
245 /* Set for a constructor. */
246 #define CXXFLAGS_CTOR (0x200)
247 /* Set for an inline function. */
248 #define CXXFLAGS_INLINE (0x800)
250 /* Local functions. */
252 static void ieee_error (struct ieee_info
*, const bfd_byte
*, const char *);
253 static void ieee_eof (struct ieee_info
*);
254 static char *savestring (const char *, unsigned long);
255 static bfd_boolean ieee_read_number
256 (struct ieee_info
*, const bfd_byte
**, bfd_vma
*);
257 static bfd_boolean ieee_read_optional_number
258 (struct ieee_info
*, const bfd_byte
**, bfd_vma
*, bfd_boolean
*);
259 static bfd_boolean ieee_read_id
260 (struct ieee_info
*, const bfd_byte
**, const char **, unsigned long *);
261 static bfd_boolean ieee_read_optional_id
262 (struct ieee_info
*, const bfd_byte
**, const char **, unsigned long *,
264 static bfd_boolean ieee_read_expression
265 (struct ieee_info
*, const bfd_byte
**, bfd_vma
*);
266 static debug_type ieee_builtin_type
267 (struct ieee_info
*, const bfd_byte
*, unsigned int);
268 static bfd_boolean ieee_alloc_type
269 (struct ieee_info
*, unsigned int, bfd_boolean
);
270 static bfd_boolean ieee_read_type_index
271 (struct ieee_info
*, const bfd_byte
**, debug_type
*);
272 static int ieee_regno_to_genreg (bfd
*, int);
273 static int ieee_genreg_to_regno (bfd
*, int);
274 static bfd_boolean
parse_ieee_bb (struct ieee_info
*, const bfd_byte
**);
275 static bfd_boolean
parse_ieee_be (struct ieee_info
*, const bfd_byte
**);
276 static bfd_boolean
parse_ieee_nn (struct ieee_info
*, const bfd_byte
**);
277 static bfd_boolean
parse_ieee_ty (struct ieee_info
*, const bfd_byte
**);
278 static bfd_boolean
parse_ieee_atn (struct ieee_info
*, const bfd_byte
**);
279 static bfd_boolean ieee_read_cxx_misc
280 (struct ieee_info
*, const bfd_byte
**, unsigned long);
281 static bfd_boolean ieee_read_cxx_class
282 (struct ieee_info
*, const bfd_byte
**, unsigned long);
283 static bfd_boolean ieee_read_cxx_defaults
284 (struct ieee_info
*, const bfd_byte
**, unsigned long);
285 static bfd_boolean ieee_read_reference
286 (struct ieee_info
*, const bfd_byte
**);
287 static bfd_boolean ieee_require_asn
288 (struct ieee_info
*, const bfd_byte
**, bfd_vma
*);
289 static bfd_boolean ieee_require_atn65
290 (struct ieee_info
*, const bfd_byte
**, const char **, unsigned long *);
292 /* Report an error in the IEEE debugging information. */
295 ieee_error (struct ieee_info
*info
, const bfd_byte
*p
, const char *s
)
298 fprintf (stderr
, "%s: 0x%lx: %s (0x%x)\n", bfd_get_filename (info
->abfd
),
299 (unsigned long) (p
- info
->bytes
), s
, *p
);
301 fprintf (stderr
, "%s: %s\n", bfd_get_filename (info
->abfd
), s
);
304 /* Report an unexpected EOF in the IEEE debugging information. */
307 ieee_eof (struct ieee_info
*info
)
309 ieee_error (info
, (const bfd_byte
*) NULL
,
310 _("unexpected end of debugging information"));
313 /* Save a string in memory. */
316 savestring (const char *start
, unsigned long len
)
320 ret
= (char *) xmalloc (len
+ 1);
321 memcpy (ret
, start
, len
);
326 /* Read a number which must be present in an IEEE file. */
329 ieee_read_number (struct ieee_info
*info
, const bfd_byte
**pp
, bfd_vma
*pv
)
331 return ieee_read_optional_number (info
, pp
, pv
, (bfd_boolean
*) NULL
);
334 /* Read a number in an IEEE file. If ppresent is not NULL, the number
335 need not be there. */
338 ieee_read_optional_number (struct ieee_info
*info
, const bfd_byte
**pp
,
339 bfd_vma
*pv
, bfd_boolean
*ppresent
)
341 ieee_record_enum_type b
;
343 if (*pp
>= info
->pend
)
345 if (ppresent
!= NULL
)
354 b
= (ieee_record_enum_type
) **pp
;
357 if (b
<= ieee_number_end_enum
)
360 if (ppresent
!= NULL
)
365 if (b
>= ieee_number_repeat_start_enum
&& b
<= ieee_number_repeat_end_enum
)
369 i
= (int) b
- (int) ieee_number_repeat_start_enum
;
370 if (*pp
+ i
- 1 >= info
->pend
)
384 if (ppresent
!= NULL
)
390 if (ppresent
!= NULL
)
397 ieee_error (info
, *pp
- 1, _("invalid number"));
401 /* Read a required string from an IEEE file. */
404 ieee_read_id (struct ieee_info
*info
, const bfd_byte
**pp
,
405 const char **pname
, unsigned long *pnamlen
)
407 return ieee_read_optional_id (info
, pp
, pname
, pnamlen
, (bfd_boolean
*) NULL
);
410 /* Read a string from an IEEE file. If ppresent is not NULL, the
411 string is optional. */
414 ieee_read_optional_id (struct ieee_info
*info
, const bfd_byte
**pp
,
415 const char **pname
, unsigned long *pnamlen
,
416 bfd_boolean
*ppresent
)
421 if (*pp
>= info
->pend
)
432 else if ((ieee_record_enum_type
) b
== ieee_extension_length_1_enum
)
437 else if ((ieee_record_enum_type
) b
== ieee_extension_length_2_enum
)
439 len
= (**pp
<< 8) + (*pp
)[1];
444 if (ppresent
!= NULL
)
450 ieee_error (info
, *pp
- 1, _("invalid string length"));
454 if ((unsigned long) (info
->pend
- *pp
) < len
)
460 *pname
= (const char *) *pp
;
464 if (ppresent
!= NULL
)
470 /* Read an expression from an IEEE file. Since this code is only used
471 to parse debugging information, I haven't bothered to write a full
472 blown IEEE expression parser. I've only thrown in the things I've
473 seen in debugging information. This can be easily extended if
477 ieee_read_expression (struct ieee_info
*info
, const bfd_byte
**pp
,
480 const bfd_byte
*expr_start
;
481 #define EXPR_STACK_SIZE (10)
482 bfd_vma expr_stack
[EXPR_STACK_SIZE
];
491 const bfd_byte
*start
;
494 ieee_record_enum_type c
;
498 if (! ieee_read_optional_number (info
, pp
, &val
, &present
))
503 if (esp
- expr_stack
>= EXPR_STACK_SIZE
)
505 ieee_error (info
, start
, _("expression stack overflow"));
512 c
= (ieee_record_enum_type
) **pp
;
514 if (c
>= ieee_module_beginning_enum
)
525 ieee_error (info
, start
, _("unsupported IEEE expression operator"));
528 case ieee_variable_R_enum
:
533 if (! ieee_read_number (info
, pp
, &indx
))
535 for (s
= info
->abfd
->sections
; s
!= NULL
; s
= s
->next
)
536 if ((bfd_vma
) s
->target_index
== indx
)
540 ieee_error (info
, start
, _("unknown section"));
544 if (esp
- expr_stack
>= EXPR_STACK_SIZE
)
546 ieee_error (info
, start
, _("expression stack overflow"));
550 *esp
++ = bfd_get_section_vma (info
->abfd
, s
);
554 case ieee_function_plus_enum
:
555 case ieee_function_minus_enum
:
559 if (esp
- expr_stack
< 2)
561 ieee_error (info
, start
, _("expression stack underflow"));
573 if (esp
- 1 != expr_stack
)
575 ieee_error (info
, expr_start
, _("expression stack mismatch"));
584 /* Return an IEEE builtin type. */
587 ieee_builtin_type (struct ieee_info
*info
, const bfd_byte
*p
,
594 if (indx
< BUILTIN_TYPE_COUNT
595 && info
->types
.builtins
[indx
] != DEBUG_TYPE_NULL
)
596 return info
->types
.builtins
[indx
];
598 dhandle
= info
->dhandle
;
600 if (indx
>= 32 && indx
< 64)
602 type
= debug_make_pointer_type (dhandle
,
603 ieee_builtin_type (info
, p
, indx
- 32));
604 assert (indx
< BUILTIN_TYPE_COUNT
);
605 info
->types
.builtins
[indx
] = type
;
609 switch ((enum builtin_types
) indx
)
612 ieee_error (info
, p
, _("unknown builtin type"));
615 case builtin_unknown
:
616 type
= debug_make_void_type (dhandle
);
621 type
= debug_make_void_type (dhandle
);
625 case builtin_signed_char
:
626 type
= debug_make_int_type (dhandle
, 1, FALSE
);
627 name
= "signed char";
630 case builtin_unsigned_char
:
631 type
= debug_make_int_type (dhandle
, 1, TRUE
);
632 name
= "unsigned char";
635 case builtin_signed_short_int
:
636 type
= debug_make_int_type (dhandle
, 2, FALSE
);
637 name
= "signed short int";
640 case builtin_unsigned_short_int
:
641 type
= debug_make_int_type (dhandle
, 2, TRUE
);
642 name
= "unsigned short int";
645 case builtin_signed_long
:
646 type
= debug_make_int_type (dhandle
, 4, FALSE
);
647 name
= "signed long";
650 case builtin_unsigned_long
:
651 type
= debug_make_int_type (dhandle
, 4, TRUE
);
652 name
= "unsigned long";
655 case builtin_signed_long_long
:
656 type
= debug_make_int_type (dhandle
, 8, FALSE
);
657 name
= "signed long long";
660 case builtin_unsigned_long_long
:
661 type
= debug_make_int_type (dhandle
, 8, TRUE
);
662 name
= "unsigned long long";
666 type
= debug_make_float_type (dhandle
, 4);
671 type
= debug_make_float_type (dhandle
, 8);
675 case builtin_long_double
:
676 /* FIXME: The size for this type should depend upon the
678 type
= debug_make_float_type (dhandle
, 12);
679 name
= "long double";
682 case builtin_long_long_double
:
683 type
= debug_make_float_type (dhandle
, 16);
684 name
= "long long double";
687 case builtin_quoted_string
:
688 type
= debug_make_array_type (dhandle
,
689 ieee_builtin_type (info
, p
,
692 ieee_builtin_type (info
, p
,
696 name
= "QUOTED STRING";
699 case builtin_instruction_address
:
700 /* FIXME: This should be a code address. */
701 type
= debug_make_int_type (dhandle
, 4, TRUE
);
702 name
= "instruction address";
706 /* FIXME: The size for this type should depend upon the
708 type
= debug_make_int_type (dhandle
, 4, FALSE
);
712 case builtin_unsigned
:
713 /* FIXME: The size for this type should depend upon the
715 type
= debug_make_int_type (dhandle
, 4, TRUE
);
719 case builtin_unsigned_int
:
720 /* FIXME: The size for this type should depend upon the
722 type
= debug_make_int_type (dhandle
, 4, TRUE
);
723 name
= "unsigned int";
727 type
= debug_make_int_type (dhandle
, 1, FALSE
);
732 type
= debug_make_int_type (dhandle
, 4, FALSE
);
737 type
= debug_make_int_type (dhandle
, 2, FALSE
);
741 case builtin_unsigned_short
:
742 type
= debug_make_int_type (dhandle
, 2, TRUE
);
743 name
= "unsigned short";
746 case builtin_short_int
:
747 type
= debug_make_int_type (dhandle
, 2, FALSE
);
751 case builtin_signed_short
:
752 type
= debug_make_int_type (dhandle
, 2, FALSE
);
753 name
= "signed short";
756 case builtin_bcd_float
:
757 ieee_error (info
, p
, _("BCD float type not supported"));
758 return DEBUG_TYPE_NULL
;
762 type
= debug_name_type (dhandle
, name
, type
);
764 assert (indx
< BUILTIN_TYPE_COUNT
);
766 info
->types
.builtins
[indx
] = type
;
771 /* Allocate more space in the type table. If ref is TRUE, this is a
772 reference to the type; if it is not already defined, we should set
773 up an indirect type. */
776 ieee_alloc_type (struct ieee_info
*info
, unsigned int indx
, bfd_boolean ref
)
779 register struct ieee_type
*t
;
780 struct ieee_type
*tend
;
782 if (indx
>= info
->types
.alloc
)
784 nalloc
= info
->types
.alloc
;
787 while (indx
>= nalloc
)
790 info
->types
.types
= ((struct ieee_type
*)
791 xrealloc (info
->types
.types
,
792 nalloc
* sizeof *info
->types
.types
));
794 memset (info
->types
.types
+ info
->types
.alloc
, 0,
795 (nalloc
- info
->types
.alloc
) * sizeof *info
->types
.types
);
797 tend
= info
->types
.types
+ nalloc
;
798 for (t
= info
->types
.types
+ info
->types
.alloc
; t
< tend
; t
++)
799 t
->type
= DEBUG_TYPE_NULL
;
801 info
->types
.alloc
= nalloc
;
806 t
= info
->types
.types
+ indx
;
809 t
->pslot
= (debug_type
*) xmalloc (sizeof *t
->pslot
);
810 *t
->pslot
= DEBUG_TYPE_NULL
;
811 t
->type
= debug_make_indirect_type (info
->dhandle
, t
->pslot
,
812 (const char *) NULL
);
821 /* Read a type index and return the corresponding type. */
824 ieee_read_type_index (struct ieee_info
*info
, const bfd_byte
**pp
,
827 const bfd_byte
*start
;
832 if (! ieee_read_number (info
, pp
, &indx
))
837 *ptype
= ieee_builtin_type (info
, start
, indx
);
844 if (! ieee_alloc_type (info
, indx
, TRUE
))
847 *ptype
= info
->types
.types
[indx
].type
;
852 /* Parse IEEE debugging information for a file. This is passed the
853 bytes which compose the Debug Information Part of an IEEE file. */
856 parse_ieee (void *dhandle
, bfd
*abfd
, const bfd_byte
*bytes
, bfd_size_type len
)
858 struct ieee_info info
;
860 const bfd_byte
*p
, *pend
;
862 info
.dhandle
= dhandle
;
865 info
.pend
= bytes
+ len
;
866 info
.blockstack
.bsp
= info
.blockstack
.stack
;
867 info
.saw_filename
= FALSE
;
869 info
.vars
.vars
= NULL
;
870 info
.global_vars
= NULL
;
871 info
.types
.alloc
= 0;
872 info
.types
.types
= NULL
;
873 info
.global_types
= NULL
;
875 for (i
= 0; i
< BUILTIN_TYPE_COUNT
; i
++)
876 info
.types
.builtins
[i
] = DEBUG_TYPE_NULL
;
882 const bfd_byte
*record_start
;
883 ieee_record_enum_type c
;
887 c
= (ieee_record_enum_type
) *p
++;
889 if (c
== ieee_at_record_enum
)
890 c
= (ieee_record_enum_type
) (((unsigned int) c
<< 8) | *p
++);
892 if (c
<= ieee_number_repeat_end_enum
)
894 ieee_error (&info
, record_start
, _("unexpected number"));
901 ieee_error (&info
, record_start
, _("unexpected record type"));
904 case ieee_bb_record_enum
:
905 if (! parse_ieee_bb (&info
, &p
))
909 case ieee_be_record_enum
:
910 if (! parse_ieee_be (&info
, &p
))
915 if (! parse_ieee_nn (&info
, &p
))
919 case ieee_ty_record_enum
:
920 if (! parse_ieee_ty (&info
, &p
))
924 case ieee_atn_record_enum
:
925 if (! parse_ieee_atn (&info
, &p
))
931 if (info
.blockstack
.bsp
!= info
.blockstack
.stack
)
933 ieee_error (&info
, (const bfd_byte
*) NULL
,
934 _("blocks left on stack at end"));
941 /* Handle an IEEE BB record. */
944 parse_ieee_bb (struct ieee_info
*info
, const bfd_byte
**pp
)
946 const bfd_byte
*block_start
;
950 unsigned long namlen
;
951 char *namcopy
= NULL
;
960 if (! ieee_read_number (info
, pp
, &size
)
961 || ! ieee_read_id (info
, pp
, &name
, &namlen
))
964 fnindx
= (unsigned int) -1;
970 /* BB1: Type definitions local to a module. */
971 namcopy
= savestring (name
, namlen
);
974 if (! debug_set_filename (info
->dhandle
, namcopy
))
976 info
->saw_filename
= TRUE
;
978 /* Discard any variables or types we may have seen before. */
979 if (info
->vars
.vars
!= NULL
)
980 free (info
->vars
.vars
);
981 info
->vars
.vars
= NULL
;
982 info
->vars
.alloc
= 0;
983 if (info
->types
.types
!= NULL
)
984 free (info
->types
.types
);
985 info
->types
.types
= NULL
;
986 info
->types
.alloc
= 0;
988 /* Initialize the types to the global types. */
989 if (info
->global_types
!= NULL
)
991 info
->types
.alloc
= info
->global_types
->alloc
;
992 info
->types
.types
= ((struct ieee_type
*)
993 xmalloc (info
->types
.alloc
994 * sizeof (*info
->types
.types
)));
995 memcpy (info
->types
.types
, info
->global_types
->types
,
996 info
->types
.alloc
* sizeof (*info
->types
.types
));
1002 /* BB2: Global type definitions. The name is supposed to be
1003 empty, but we don't check. */
1004 if (! debug_set_filename (info
->dhandle
, "*global*"))
1006 info
->saw_filename
= TRUE
;
1010 /* BB3: High level module block begin. We don't have to do
1011 anything here. The name is supposed to be the same as for
1012 the BB1, but we don't check. */
1016 /* BB4: Global function. */
1018 bfd_vma stackspace
, typindx
, offset
;
1019 debug_type return_type
;
1021 if (! ieee_read_number (info
, pp
, &stackspace
)
1022 || ! ieee_read_number (info
, pp
, &typindx
)
1023 || ! ieee_read_expression (info
, pp
, &offset
))
1026 /* We have no way to record the stack space. FIXME. */
1030 return_type
= ieee_builtin_type (info
, block_start
, typindx
);
1031 if (return_type
== DEBUG_TYPE_NULL
)
1037 if (! ieee_alloc_type (info
, typindx
, TRUE
))
1040 return_type
= info
->types
.types
[typindx
].type
;
1041 if (debug_get_type_kind (info
->dhandle
, return_type
)
1042 == DEBUG_KIND_FUNCTION
)
1043 return_type
= debug_get_return_type (info
->dhandle
,
1047 namcopy
= savestring (name
, namlen
);
1048 if (namcopy
== NULL
)
1050 if (! debug_record_function (info
->dhandle
, namcopy
, return_type
,
1057 /* BB5: File name for source line numbers. */
1061 /* We ignore the date and time. FIXME. */
1062 for (i
= 0; i
< 6; i
++)
1065 bfd_boolean present
;
1067 if (! ieee_read_optional_number (info
, pp
, &ignore
, &present
))
1073 namcopy
= savestring (name
, namlen
);
1074 if (namcopy
== NULL
)
1076 if (! debug_start_source (info
->dhandle
, namcopy
))
1082 /* BB6: Local function or block. */
1084 bfd_vma stackspace
, typindx
, offset
;
1086 if (! ieee_read_number (info
, pp
, &stackspace
)
1087 || ! ieee_read_number (info
, pp
, &typindx
)
1088 || ! ieee_read_expression (info
, pp
, &offset
))
1091 /* We have no way to record the stack space. FIXME. */
1095 if (! debug_start_block (info
->dhandle
, offset
))
1097 /* Change b to indicate that this is a block
1098 rather than a function. */
1103 /* The MRI C++ compiler will output a fake function named
1104 __XRYCPP to hold C++ debugging information. We skip
1105 that function. This is not crucial, but it makes
1106 converting from IEEE to other debug formats work
1108 if (strncmp (name
, "__XRYCPP", namlen
) == 0)
1112 debug_type return_type
;
1116 return_type
= ieee_builtin_type (info
, block_start
,
1118 if (return_type
== NULL
)
1124 if (! ieee_alloc_type (info
, typindx
, TRUE
))
1127 return_type
= info
->types
.types
[typindx
].type
;
1128 if (debug_get_type_kind (info
->dhandle
, return_type
)
1129 == DEBUG_KIND_FUNCTION
)
1130 return_type
= debug_get_return_type (info
->dhandle
,
1134 namcopy
= savestring (name
, namlen
);
1135 if (namcopy
== NULL
)
1137 if (! debug_record_function (info
->dhandle
, namcopy
,
1138 return_type
, FALSE
, offset
))
1146 /* BB10: Assembler module scope. In the normal case, we
1147 completely ignore all this information. FIXME. */
1149 const char *inam
, *vstr
;
1150 unsigned long inamlen
, vstrlen
;
1152 bfd_boolean present
;
1155 if (! info
->saw_filename
)
1157 namcopy
= savestring (name
, namlen
);
1158 if (namcopy
== NULL
)
1160 if (! debug_set_filename (info
->dhandle
, namcopy
))
1162 info
->saw_filename
= TRUE
;
1165 if (! ieee_read_id (info
, pp
, &inam
, &inamlen
)
1166 || ! ieee_read_number (info
, pp
, &tool_type
)
1167 || ! ieee_read_optional_id (info
, pp
, &vstr
, &vstrlen
, &present
))
1169 for (i
= 0; i
< 6; i
++)
1173 if (! ieee_read_optional_number (info
, pp
, &ignore
, &present
))
1182 /* BB11: Module section. We completely ignore all this
1183 information. FIXME. */
1185 bfd_vma sectype
, secindx
, offset
, map
;
1186 bfd_boolean present
;
1188 if (! ieee_read_number (info
, pp
, §ype
)
1189 || ! ieee_read_number (info
, pp
, &secindx
)
1190 || ! ieee_read_expression (info
, pp
, &offset
)
1191 || ! ieee_read_optional_number (info
, pp
, &map
, &present
))
1197 ieee_error (info
, block_start
, _("unknown BB type"));
1202 /* Push this block on the block stack. */
1204 if (info
->blockstack
.bsp
>= info
->blockstack
.stack
+ BLOCKSTACK_SIZE
)
1206 ieee_error (info
, (const bfd_byte
*) NULL
, _("stack overflow"));
1210 info
->blockstack
.bsp
->kind
= b
;
1212 info
->blockstack
.bsp
->filename
= namcopy
;
1213 info
->blockstack
.bsp
->fnindx
= fnindx
;
1214 info
->blockstack
.bsp
->skip
= skip
;
1215 ++info
->blockstack
.bsp
;
1220 /* Handle an IEEE BE record. */
1223 parse_ieee_be (struct ieee_info
*info
, const bfd_byte
**pp
)
1227 if (info
->blockstack
.bsp
<= info
->blockstack
.stack
)
1229 ieee_error (info
, *pp
, _("stack underflow"));
1232 --info
->blockstack
.bsp
;
1234 switch (info
->blockstack
.bsp
->kind
)
1237 /* When we end the global typedefs block, we copy out the the
1238 contents of info->vars. This is because the variable indices
1239 may be reused in the local blocks. However, we need to
1240 preserve them so that we can locate a function returning a
1241 reference variable whose type is named in the global typedef
1243 info
->global_vars
= ((struct ieee_vars
*)
1244 xmalloc (sizeof *info
->global_vars
));
1245 info
->global_vars
->alloc
= info
->vars
.alloc
;
1246 info
->global_vars
->vars
= ((struct ieee_var
*)
1247 xmalloc (info
->vars
.alloc
1248 * sizeof (*info
->vars
.vars
)));
1249 memcpy (info
->global_vars
->vars
, info
->vars
.vars
,
1250 info
->vars
.alloc
* sizeof (*info
->vars
.vars
));
1252 /* We also copy out the non builtin parts of info->types, since
1253 the types are discarded when we start a new block. */
1254 info
->global_types
= ((struct ieee_types
*)
1255 xmalloc (sizeof *info
->global_types
));
1256 info
->global_types
->alloc
= info
->types
.alloc
;
1257 info
->global_types
->types
= ((struct ieee_type
*)
1258 xmalloc (info
->types
.alloc
1259 * sizeof (*info
->types
.types
)));
1260 memcpy (info
->global_types
->types
, info
->types
.types
,
1261 info
->types
.alloc
* sizeof (*info
->types
.types
));
1262 memset (info
->global_types
->builtins
, 0,
1263 sizeof (info
->global_types
->builtins
));
1269 if (! ieee_read_expression (info
, pp
, &offset
))
1271 if (! info
->blockstack
.bsp
->skip
)
1273 if (! debug_end_function (info
->dhandle
, offset
+ 1))
1279 /* This is BE6 when BB6 started a block rather than a local
1281 if (! ieee_read_expression (info
, pp
, &offset
))
1283 if (! debug_end_block (info
->dhandle
, offset
+ 1))
1288 /* When we end a BB5, we look up the stack for the last BB5, if
1289 there is one, so that we can call debug_start_source. */
1290 if (info
->blockstack
.bsp
> info
->blockstack
.stack
)
1292 struct ieee_block
*bl
;
1294 bl
= info
->blockstack
.bsp
;
1300 if (! debug_start_source (info
->dhandle
, bl
->filename
))
1305 while (bl
!= info
->blockstack
.stack
);
1310 if (! ieee_read_expression (info
, pp
, &offset
))
1312 /* We just ignore the module size. FIXME. */
1316 /* Other block types do not have any trailing information. */
1323 /* Parse an NN record. */
1326 parse_ieee_nn (struct ieee_info
*info
, const bfd_byte
**pp
)
1328 const bfd_byte
*nn_start
;
1331 unsigned long namlen
;
1335 if (! ieee_read_number (info
, pp
, &varindx
)
1336 || ! ieee_read_id (info
, pp
, &name
, &namlen
))
1341 ieee_error (info
, nn_start
, _("illegal variable index"));
1346 if (varindx
>= info
->vars
.alloc
)
1350 alloc
= info
->vars
.alloc
;
1353 while (varindx
>= alloc
)
1355 info
->vars
.vars
= ((struct ieee_var
*)
1356 xrealloc (info
->vars
.vars
,
1357 alloc
* sizeof *info
->vars
.vars
));
1358 memset (info
->vars
.vars
+ info
->vars
.alloc
, 0,
1359 (alloc
- info
->vars
.alloc
) * sizeof *info
->vars
.vars
);
1360 info
->vars
.alloc
= alloc
;
1363 info
->vars
.vars
[varindx
].name
= name
;
1364 info
->vars
.vars
[varindx
].namlen
= namlen
;
1369 /* Parse a TY record. */
1372 parse_ieee_ty (struct ieee_info
*info
, const bfd_byte
**pp
)
1374 const bfd_byte
*ty_start
, *ty_var_start
, *ty_code_start
;
1375 bfd_vma typeindx
, varindx
, tc
;
1377 bfd_boolean tag
, typdef
;
1378 debug_type
*arg_slots
;
1379 unsigned long type_bitsize
;
1384 if (! ieee_read_number (info
, pp
, &typeindx
))
1389 ieee_error (info
, ty_start
, _("illegal type index"));
1394 if (! ieee_alloc_type (info
, typeindx
, FALSE
))
1399 ieee_error (info
, *pp
, _("unknown TY code"));
1406 if (! ieee_read_number (info
, pp
, &varindx
))
1411 ieee_error (info
, ty_var_start
, _("illegal variable index"));
1416 if (varindx
>= info
->vars
.alloc
|| info
->vars
.vars
[varindx
].name
== NULL
)
1418 ieee_error (info
, ty_var_start
, _("undefined variable in TY"));
1422 ty_code_start
= *pp
;
1424 if (! ieee_read_number (info
, pp
, &tc
))
1427 dhandle
= info
->dhandle
;
1436 ieee_error (info
, ty_code_start
, _("unknown TY code"));
1440 /* Unknown type, with size. We treat it as int. FIXME. */
1444 if (! ieee_read_number (info
, pp
, &size
))
1446 type
= debug_make_int_type (dhandle
, size
, FALSE
);
1450 case 'A': /* Array. */
1451 case 'a': /* FORTRAN array in column/row order. FIXME: Not
1452 distinguished from normal array. */
1454 debug_type ele_type
;
1455 bfd_vma lower
, upper
;
1457 if (! ieee_read_type_index (info
, pp
, &ele_type
)
1458 || ! ieee_read_number (info
, pp
, &lower
)
1459 || ! ieee_read_number (info
, pp
, &upper
))
1461 type
= debug_make_array_type (dhandle
, ele_type
,
1462 ieee_builtin_type (info
, ty_code_start
,
1465 (bfd_signed_vma
) lower
,
1466 (bfd_signed_vma
) upper
,
1472 /* Simple enumeration. */
1478 bfd_signed_vma
*vals
;
1481 if (! ieee_read_number (info
, pp
, &size
))
1483 /* FIXME: we ignore the enumeration size. */
1486 names
= (const char **) xmalloc (alloc
* sizeof *names
);
1487 memset (names
, 0, alloc
* sizeof *names
);
1492 unsigned long namlen
;
1493 bfd_boolean present
;
1495 if (! ieee_read_optional_id (info
, pp
, &name
, &namlen
, &present
))
1503 names
= ((const char **)
1504 xrealloc (names
, alloc
* sizeof *names
));
1507 names
[c
] = savestring (name
, namlen
);
1508 if (names
[c
] == NULL
)
1515 vals
= (bfd_signed_vma
*) xmalloc (c
* sizeof *vals
);
1516 for (i
= 0; i
< c
; i
++)
1519 type
= debug_make_enum_type (dhandle
, names
, vals
);
1525 /* Struct with bit fields. */
1529 debug_field
*fields
;
1532 if (! ieee_read_number (info
, pp
, &size
))
1536 fields
= (debug_field
*) xmalloc (alloc
* sizeof *fields
);
1541 unsigned long namlen
;
1542 bfd_boolean present
;
1544 bfd_vma bitpos
, bitsize
;
1546 if (! ieee_read_optional_id (info
, pp
, &name
, &namlen
, &present
))
1550 if (! ieee_read_type_index (info
, pp
, &ftype
)
1551 || ! ieee_read_number (info
, pp
, &bitpos
)
1552 || ! ieee_read_number (info
, pp
, &bitsize
))
1558 fields
= ((debug_field
*)
1559 xrealloc (fields
, alloc
* sizeof *fields
));
1562 fields
[c
] = debug_make_field (dhandle
, savestring (name
, namlen
),
1563 ftype
, bitpos
, bitsize
,
1564 DEBUG_VISIBILITY_PUBLIC
);
1565 if (fields
[c
] == NULL
)
1572 type
= debug_make_struct_type (dhandle
, TRUE
, size
, fields
);
1582 bfd_signed_vma
*vals
;
1586 names
= (const char **) xmalloc (alloc
* sizeof *names
);
1587 vals
= (bfd_signed_vma
*) xmalloc (alloc
* sizeof *names
);
1592 unsigned long namlen
;
1593 bfd_boolean present
;
1596 if (! ieee_read_optional_id (info
, pp
, &name
, &namlen
, &present
))
1600 if (! ieee_read_number (info
, pp
, &val
))
1603 /* If the length of the name is zero, then the value is
1604 actually the size of the enum. We ignore this
1605 information. FIXME. */
1612 names
= ((const char **)
1613 xrealloc (names
, alloc
* sizeof *names
));
1614 vals
= ((bfd_signed_vma
*)
1615 xrealloc (vals
, alloc
* sizeof *vals
));
1618 names
[c
] = savestring (name
, namlen
);
1619 if (names
[c
] == NULL
)
1621 vals
[c
] = (bfd_signed_vma
) val
;
1627 type
= debug_make_enum_type (dhandle
, names
, vals
);
1632 case 'O': /* Small pointer. We don't distinguish small and large
1634 case 'P': /* Large pointer. */
1638 if (! ieee_read_type_index (info
, pp
, &t
))
1640 type
= debug_make_pointer_type (dhandle
, t
);
1647 bfd_vma low
, high
, signedp
, size
;
1649 if (! ieee_read_number (info
, pp
, &low
)
1650 || ! ieee_read_number (info
, pp
, &high
)
1651 || ! ieee_read_number (info
, pp
, &signedp
)
1652 || ! ieee_read_number (info
, pp
, &size
))
1655 type
= debug_make_range_type (dhandle
,
1656 debug_make_int_type (dhandle
, size
,
1658 (bfd_signed_vma
) low
,
1659 (bfd_signed_vma
) high
);
1663 case 'S': /* Struct. */
1664 case 'U': /* Union. */
1668 debug_field
*fields
;
1671 if (! ieee_read_number (info
, pp
, &size
))
1675 fields
= (debug_field
*) xmalloc (alloc
* sizeof *fields
);
1680 unsigned long namlen
;
1681 bfd_boolean present
;
1687 if (! ieee_read_optional_id (info
, pp
, &name
, &namlen
, &present
))
1691 if (! ieee_read_number (info
, pp
, &tindx
)
1692 || ! ieee_read_number (info
, pp
, &offset
))
1697 ftype
= ieee_builtin_type (info
, ty_code_start
, tindx
);
1703 struct ieee_type
*t
;
1706 if (! ieee_alloc_type (info
, tindx
, TRUE
))
1708 t
= info
->types
.types
+ tindx
;
1710 bitsize
= t
->bitsize
;
1718 fields
= ((debug_field
*)
1719 xrealloc (fields
, alloc
* sizeof *fields
));
1722 fields
[c
] = debug_make_field (dhandle
, savestring (name
, namlen
),
1723 ftype
, offset
, bitsize
,
1724 DEBUG_VISIBILITY_PUBLIC
);
1725 if (fields
[c
] == NULL
)
1732 type
= debug_make_struct_type (dhandle
, tc
== 'S', size
, fields
);
1739 if (! ieee_read_type_index (info
, pp
, &type
))
1745 /* Procedure. FIXME: This is an extern declaration, which we
1746 have no way of representing. */
1751 bfd_boolean present
;
1752 struct ieee_var
*pv
;
1754 /* FIXME: We ignore the attribute and the argument names. */
1756 if (! ieee_read_number (info
, pp
, &attr
)
1757 || ! ieee_read_type_index (info
, pp
, &rtype
)
1758 || ! ieee_read_number (info
, pp
, &nargs
))
1763 unsigned long namlen
;
1765 if (! ieee_read_optional_id (info
, pp
, &name
, &namlen
, &present
))
1770 pv
= info
->vars
.vars
+ varindx
;
1771 pv
->kind
= IEEE_EXTERNAL
;
1773 && debug_get_type_kind (dhandle
, rtype
) == DEBUG_KIND_POINTER
)
1775 /* Set up the return type as an indirect type pointing to
1776 the variable slot, so that we can change it to a
1777 reference later if appropriate. */
1778 pv
->pslot
= (debug_type
*) xmalloc (sizeof *pv
->pslot
);
1780 rtype
= debug_make_indirect_type (dhandle
, pv
->pslot
,
1781 (const char *) NULL
);
1784 type
= debug_make_function_type (dhandle
, rtype
, (debug_type
*) NULL
,
1790 /* Void. This is not documented, but the MRI compiler emits it. */
1791 type
= debug_make_void_type (dhandle
);
1795 /* Array with 0 lower bound. */
1800 if (! ieee_read_type_index (info
, pp
, &etype
)
1801 || ! ieee_read_number (info
, pp
, &high
))
1804 type
= debug_make_array_type (dhandle
, etype
,
1805 ieee_builtin_type (info
, ty_code_start
,
1808 0, (bfd_signed_vma
) high
, FALSE
);
1812 case 'c': /* Complex. */
1813 case 'd': /* Double complex. */
1816 unsigned long namlen
;
1818 /* FIXME: I don't know what the name means. */
1820 if (! ieee_read_id (info
, pp
, &name
, &namlen
))
1823 type
= debug_make_complex_type (dhandle
, tc
== 'c' ? 4 : 8);
1828 /* Pascal file name. FIXME. */
1829 ieee_error (info
, ty_code_start
, _("Pascal file name not supported"));
1833 /* Bitfield type. */
1835 bfd_vma signedp
, bitsize
, dummy
;
1836 const bfd_byte
*hold
;
1837 bfd_boolean present
;
1839 if (! ieee_read_number (info
, pp
, &signedp
)
1840 || ! ieee_read_number (info
, pp
, &bitsize
))
1843 /* I think the documentation says that there is a type index,
1844 but some actual files do not have one. */
1846 if (! ieee_read_optional_number (info
, pp
, &dummy
, &present
))
1850 /* FIXME: This is just a guess. */
1851 type
= debug_make_int_type (dhandle
, 4,
1852 signedp
? FALSE
: TRUE
);
1857 if (! ieee_read_type_index (info
, pp
, &type
))
1860 type_bitsize
= bitsize
;
1870 if (! ieee_read_number (info
, pp
, &kind
)
1871 || ! ieee_read_type_index (info
, pp
, &t
))
1877 ieee_error (info
, ty_start
, _("unsupported qualifier"));
1881 type
= debug_make_const_type (dhandle
, t
);
1885 type
= debug_make_volatile_type (dhandle
, t
);
1897 if (! ieee_read_number (info
, pp
, &size
)
1898 || ! ieee_read_type_index (info
, pp
, &etype
))
1901 /* FIXME: We ignore the size. */
1903 type
= debug_make_set_type (dhandle
, etype
, FALSE
);
1908 /* Procedure with compiler dependencies. */
1910 struct ieee_var
*pv
;
1911 bfd_vma attr
, frame_type
, push_mask
, nargs
, level
, father
;
1913 debug_type
*arg_types
;
1914 bfd_boolean varargs
;
1915 bfd_boolean present
;
1917 /* FIXME: We ignore some of this information. */
1919 pv
= info
->vars
.vars
+ varindx
;
1921 if (! ieee_read_number (info
, pp
, &attr
)
1922 || ! ieee_read_number (info
, pp
, &frame_type
)
1923 || ! ieee_read_number (info
, pp
, &push_mask
)
1924 || ! ieee_read_type_index (info
, pp
, &rtype
)
1925 || ! ieee_read_number (info
, pp
, &nargs
))
1927 if (nargs
== (bfd_vma
) -1)
1936 arg_types
= ((debug_type
*)
1937 xmalloc ((nargs
+ 1) * sizeof *arg_types
));
1938 for (i
= 0; i
< nargs
; i
++)
1939 if (! ieee_read_type_index (info
, pp
, arg_types
+ i
))
1942 /* If the last type is pointer to void, this is really a
1943 varargs function. */
1949 last
= arg_types
[nargs
- 1];
1950 if (debug_get_type_kind (dhandle
, last
) == DEBUG_KIND_POINTER
1951 && (debug_get_type_kind (dhandle
,
1952 debug_get_target_type (dhandle
,
1954 == DEBUG_KIND_VOID
))
1961 /* If there are any pointer arguments, turn them into
1962 indirect types in case we later need to convert them to
1964 for (i
= 0; i
< nargs
; i
++)
1966 if (debug_get_type_kind (dhandle
, arg_types
[i
])
1967 == DEBUG_KIND_POINTER
)
1969 if (arg_slots
== NULL
)
1971 arg_slots
= ((debug_type
*)
1972 xmalloc (nargs
* sizeof *arg_slots
));
1973 memset (arg_slots
, 0, nargs
* sizeof *arg_slots
);
1975 arg_slots
[i
] = arg_types
[i
];
1977 debug_make_indirect_type (dhandle
,
1979 (const char *) NULL
);
1983 arg_types
[nargs
] = DEBUG_TYPE_NULL
;
1985 if (! ieee_read_number (info
, pp
, &level
)
1986 || ! ieee_read_optional_number (info
, pp
, &father
, &present
))
1989 /* We can't distinguish between a global function and a static
1991 pv
->kind
= IEEE_FUNCTION
;
1994 && debug_get_type_kind (dhandle
, rtype
) == DEBUG_KIND_POINTER
)
1996 /* Set up the return type as an indirect type pointing to
1997 the variable slot, so that we can change it to a
1998 reference later if appropriate. */
1999 pv
->pslot
= (debug_type
*) xmalloc (sizeof *pv
->pslot
);
2001 rtype
= debug_make_indirect_type (dhandle
, pv
->pslot
,
2002 (const char *) NULL
);
2005 type
= debug_make_function_type (dhandle
, rtype
, arg_types
, varargs
);
2010 /* Record the type in the table. */
2012 if (type
== DEBUG_TYPE_NULL
)
2015 info
->vars
.vars
[varindx
].type
= type
;
2018 && info
->vars
.vars
[varindx
].namlen
> 0)
2022 name
= savestring (info
->vars
.vars
[varindx
].name
,
2023 info
->vars
.vars
[varindx
].namlen
);
2025 type
= debug_name_type (dhandle
, name
, type
);
2026 else if (tc
== 'E' || tc
== 'N')
2027 type
= debug_tag_type (dhandle
, name
, type
);
2030 struct ieee_tag
*it
;
2032 /* We must allocate all struct tags as indirect types, so
2033 that if we later see a definition of the tag as a C++
2034 record we can update the indirect slot and automatically
2035 change all the existing references. */
2036 it
= (struct ieee_tag
*) xmalloc (sizeof *it
);
2037 memset (it
, 0, sizeof *it
);
2038 it
->next
= info
->tags
;
2043 type
= debug_make_indirect_type (dhandle
, &it
->slot
, name
);
2044 type
= debug_tag_type (dhandle
, name
, type
);
2052 info
->types
.types
[typeindx
].type
= type
;
2053 info
->types
.types
[typeindx
].arg_slots
= arg_slots
;
2054 info
->types
.types
[typeindx
].bitsize
= type_bitsize
;
2056 /* We may have already allocated type as an indirect type pointing
2057 to slot. It does no harm to replace the indirect type with the
2058 real type. Filling in slot as well handles the indirect types
2059 which are already hanging around. */
2060 if (info
->types
.types
[typeindx
].pslot
!= NULL
)
2061 *info
->types
.types
[typeindx
].pslot
= type
;
2066 /* Parse an ATN record. */
2069 parse_ieee_atn (struct ieee_info
*info
, const bfd_byte
**pp
)
2071 const bfd_byte
*atn_start
, *atn_code_start
;
2073 struct ieee_var
*pvar
;
2077 bfd_vma v
, v2
, v3
, v4
, v5
;
2079 unsigned long namlen
;
2081 bfd_boolean present
;
2086 if (! ieee_read_number (info
, pp
, &varindx
)
2087 || ! ieee_read_type_index (info
, pp
, &type
))
2090 atn_code_start
= *pp
;
2092 if (! ieee_read_number (info
, pp
, &atn_code
))
2101 else if (varindx
< 32)
2103 /* The MRI compiler reportedly sometimes emits variable lifetime
2104 information for a register. We just ignore it. */
2106 return ieee_read_number (info
, pp
, &v
);
2108 ieee_error (info
, atn_start
, _("illegal variable index"));
2114 if (varindx
>= info
->vars
.alloc
2115 || info
->vars
.vars
[varindx
].name
== NULL
)
2117 /* The MRI compiler or linker sometimes omits the NN record
2118 for a pmisc record. */
2121 if (varindx
>= info
->vars
.alloc
)
2125 alloc
= info
->vars
.alloc
;
2128 while (varindx
>= alloc
)
2130 info
->vars
.vars
= ((struct ieee_var
*)
2131 xrealloc (info
->vars
.vars
,
2133 * sizeof *info
->vars
.vars
)));
2134 memset (info
->vars
.vars
+ info
->vars
.alloc
, 0,
2135 ((alloc
- info
->vars
.alloc
)
2136 * sizeof *info
->vars
.vars
));
2137 info
->vars
.alloc
= alloc
;
2140 pvar
= info
->vars
.vars
+ varindx
;
2146 ieee_error (info
, atn_start
, _("undefined variable in ATN"));
2151 pvar
= info
->vars
.vars
+ varindx
;
2156 namlen
= pvar
->namlen
;
2159 dhandle
= info
->dhandle
;
2161 /* If we are going to call debug_record_variable with a pointer
2162 type, change the type to an indirect type so that we can later
2163 change it to a reference type if we encounter a C++ pmisc 'R'
2166 && type
!= DEBUG_TYPE_NULL
2167 && debug_get_type_kind (dhandle
, type
) == DEBUG_KIND_POINTER
)
2177 pvar
->pslot
= (debug_type
*) xmalloc (sizeof *pvar
->pslot
);
2178 *pvar
->pslot
= type
;
2179 type
= debug_make_indirect_type (dhandle
, pvar
->pslot
,
2180 (const char *) NULL
);
2189 ieee_error (info
, atn_code_start
, _("unknown ATN type"));
2193 /* Automatic variable. */
2194 if (! ieee_read_number (info
, pp
, &v
))
2196 namcopy
= savestring (name
, namlen
);
2198 type
= debug_make_void_type (dhandle
);
2200 pvar
->kind
= IEEE_LOCAL
;
2201 return debug_record_variable (dhandle
, namcopy
, type
, DEBUG_LOCAL
, v
);
2204 /* Register variable. */
2205 if (! ieee_read_number (info
, pp
, &v
))
2207 namcopy
= savestring (name
, namlen
);
2209 type
= debug_make_void_type (dhandle
);
2211 pvar
->kind
= IEEE_LOCAL
;
2212 return debug_record_variable (dhandle
, namcopy
, type
, DEBUG_REGISTER
,
2213 ieee_regno_to_genreg (info
->abfd
, v
));
2216 /* Static variable. */
2217 if (! ieee_require_asn (info
, pp
, &v
))
2219 namcopy
= savestring (name
, namlen
);
2221 type
= debug_make_void_type (dhandle
);
2222 if (info
->blockstack
.bsp
<= info
->blockstack
.stack
)
2225 blocktype
= info
->blockstack
.bsp
[-1].kind
;
2228 if (blocktype
== 4 || blocktype
== 6)
2229 pvar
->kind
= IEEE_LOCAL
;
2231 pvar
->kind
= IEEE_STATIC
;
2233 return debug_record_variable (dhandle
, namcopy
, type
,
2234 (blocktype
== 4 || blocktype
== 6
2235 ? DEBUG_LOCAL_STATIC
2240 /* External function. We don't currently record these. FIXME. */
2242 pvar
->kind
= IEEE_EXTERNAL
;
2246 /* External variable. We don't currently record these. FIXME. */
2248 pvar
->kind
= IEEE_EXTERNAL
;
2252 if (! ieee_read_number (info
, pp
, &v
)
2253 || ! ieee_read_number (info
, pp
, &v2
)
2254 || ! ieee_read_optional_number (info
, pp
, &v3
, &present
))
2258 if (! ieee_read_optional_number (info
, pp
, &v4
, &present
))
2262 /* We just ignore the two optional fields in v3 and v4, since
2263 they are not defined. */
2265 if (! ieee_require_asn (info
, pp
, &v3
))
2268 /* We have no way to record the column number. FIXME. */
2270 return debug_record_line (dhandle
, v
, v3
);
2273 /* Global variable. */
2274 if (! ieee_require_asn (info
, pp
, &v
))
2276 namcopy
= savestring (name
, namlen
);
2278 type
= debug_make_void_type (dhandle
);
2280 pvar
->kind
= IEEE_GLOBAL
;
2281 return debug_record_variable (dhandle
, namcopy
, type
, DEBUG_GLOBAL
, v
);
2284 /* Variable lifetime information. */
2285 if (! ieee_read_number (info
, pp
, &v
))
2288 /* We have no way to record this information. FIXME. */
2292 /* Locked register. The spec says that there are two required
2293 fields, but at least on occasion the MRI compiler only emits
2295 if (! ieee_read_number (info
, pp
, &v
)
2296 || ! ieee_read_optional_number (info
, pp
, &v2
, &present
))
2299 /* I think this means a variable that is both in a register and
2300 a frame slot. We ignore the frame slot. FIXME. */
2302 namcopy
= savestring (name
, namlen
);
2304 type
= debug_make_void_type (dhandle
);
2306 pvar
->kind
= IEEE_LOCAL
;
2307 return debug_record_variable (dhandle
, namcopy
, type
, DEBUG_REGISTER
, v
);
2310 /* Reserved for FORTRAN common. */
2311 ieee_error (info
, atn_code_start
, _("unsupported ATN11"));
2313 /* Return TRUE to keep going. */
2317 /* Based variable. */
2321 if (! ieee_read_number (info
, pp
, &v
)
2322 || ! ieee_read_number (info
, pp
, &v2
)
2323 || ! ieee_read_optional_number (info
, pp
, &v3
, &present
))
2327 if (! ieee_read_optional_number (info
, pp
, &v4
, &present
))
2331 if (! ieee_read_optional_number (info
, pp
, &v5
, &present
))
2336 /* We have no way to record this information. FIXME. */
2338 ieee_error (info
, atn_code_start
, _("unsupported ATN12"));
2340 /* Return TRUE to keep going. */
2344 /* Constant. The description of this that I have is ambiguous,
2345 so I'm not going to try to implement it. */
2346 if (! ieee_read_number (info
, pp
, &v
)
2347 || ! ieee_read_optional_number (info
, pp
, &v2
, &present
))
2351 if (! ieee_read_optional_number (info
, pp
, &v2
, &present
))
2355 if (! ieee_read_optional_id (info
, pp
, &name
, &namlen
, &present
))
2360 if ((ieee_record_enum_type
) **pp
== ieee_e2_first_byte_enum
)
2362 if (! ieee_require_asn (info
, pp
, &v3
))
2369 /* Static variable from assembler. */
2371 if (! ieee_read_number (info
, pp
, &v
)
2372 || ! ieee_read_optional_number (info
, pp
, &v2
, &present
)
2373 || ! ieee_require_asn (info
, pp
, &v3
))
2375 namcopy
= savestring (name
, namlen
);
2376 /* We don't really handle this correctly. FIXME. */
2377 return debug_record_variable (dhandle
, namcopy
,
2378 debug_make_void_type (dhandle
),
2379 v2
!= 0 ? DEBUG_GLOBAL
: DEBUG_STATIC
,
2383 /* Procedure miscellaneous information. */
2385 /* Variable miscellaneous information. */
2387 /* Module miscellaneous information. */
2388 if (! ieee_read_number (info
, pp
, &v
)
2389 || ! ieee_read_number (info
, pp
, &v2
)
2390 || ! ieee_read_optional_id (info
, pp
, &name
, &namlen
, &present
))
2393 if (atn_code
== 62 && v
== 80)
2397 ieee_error (info
, atn_code_start
,
2398 _("unexpected string in C++ misc"));
2401 return ieee_read_cxx_misc (info
, pp
, v2
);
2404 /* We just ignore all of this stuff. FIXME. */
2406 for (; v2
> 0; --v2
)
2408 switch ((ieee_record_enum_type
) **pp
)
2411 ieee_error (info
, *pp
, _("bad misc record"));
2414 case ieee_at_record_enum
:
2415 if (! ieee_require_atn65 (info
, pp
, &name
, &namlen
))
2419 case ieee_e2_first_byte_enum
:
2420 if (! ieee_require_asn (info
, pp
, &v3
))
2432 /* Handle C++ debugging miscellaneous records. This is called for
2433 procedure miscellaneous records of type 80. */
2436 ieee_read_cxx_misc (struct ieee_info
*info
, const bfd_byte
**pp
,
2437 unsigned long count
)
2439 const bfd_byte
*start
;
2444 /* Get the category of C++ misc record. */
2445 if (! ieee_require_asn (info
, pp
, &category
))
2452 ieee_error (info
, start
, _("unrecognized C++ misc record"));
2456 if (! ieee_read_cxx_class (info
, pp
, count
))
2464 unsigned long namlen
;
2466 /* The IEEE spec indicates that the 'M' record only has a
2467 flags field. The MRI compiler also emits the name of the
2470 if (! ieee_require_asn (info
, pp
, &flags
))
2472 if (*pp
< info
->pend
2473 && (ieee_record_enum_type
) **pp
== ieee_at_record_enum
)
2475 if (! ieee_require_atn65 (info
, pp
, &name
, &namlen
))
2479 /* This is emitted for method functions, but I don't think we
2480 care very much. It might help if it told us useful
2481 information like the class with which this function is
2482 associated, but it doesn't, so it isn't helpful. */
2487 if (! ieee_read_cxx_defaults (info
, pp
, count
))
2493 const char *name
, *mangled
, *class;
2494 unsigned long namlen
, mangledlen
, classlen
;
2497 /* Pointer to member. */
2499 if (! ieee_require_atn65 (info
, pp
, &name
, &namlen
)
2500 || ! ieee_require_atn65 (info
, pp
, &mangled
, &mangledlen
)
2501 || ! ieee_require_atn65 (info
, pp
, &class, &classlen
)
2502 || ! ieee_require_asn (info
, pp
, &control
))
2505 /* FIXME: We should now track down name and change its type. */
2510 if (! ieee_read_reference (info
, pp
))
2518 /* Read a C++ class definition. This is a pmisc type 80 record of
2522 ieee_read_cxx_class (struct ieee_info
*info
, const bfd_byte
**pp
,
2523 unsigned long count
)
2525 const bfd_byte
*start
;
2528 unsigned long taglen
;
2529 struct ieee_tag
*it
;
2531 debug_field
*fields
;
2532 unsigned int field_count
, field_alloc
;
2533 debug_baseclass
*baseclasses
;
2534 unsigned int baseclasses_count
, baseclasses_alloc
;
2535 const debug_field
*structfields
;
2539 unsigned long namlen
;
2540 debug_method_variant
*variants
;
2544 unsigned int methods_count
, methods_alloc
;
2545 debug_type vptrbase
;
2546 bfd_boolean ownvptr
;
2547 debug_method
*dmethods
;
2551 if (! ieee_require_asn (info
, pp
, &class))
2555 if (! ieee_require_atn65 (info
, pp
, &tag
, &taglen
))
2559 /* Find the C struct with this name. */
2560 for (it
= info
->tags
; it
!= NULL
; it
= it
->next
)
2561 if (it
->name
[0] == tag
[0]
2562 && strncmp (it
->name
, tag
, taglen
) == 0
2563 && strlen (it
->name
) == taglen
)
2567 ieee_error (info
, start
, _("undefined C++ object"));
2571 dhandle
= info
->dhandle
;
2577 baseclasses_count
= 0;
2578 baseclasses_alloc
= 0;
2582 vptrbase
= DEBUG_TYPE_NULL
;
2585 structfields
= debug_get_fields (dhandle
, it
->type
);
2590 const bfd_byte
*spec_start
;
2594 if (! ieee_require_asn (info
, pp
, &id
))
2601 ieee_error (info
, spec_start
, _("unrecognized C++ object spec"));
2606 bfd_vma flags
, cinline
;
2607 const char *basename
, *fieldname
;
2608 unsigned long baselen
, fieldlen
;
2610 debug_type basetype
;
2612 bfd_boolean virtualp
;
2613 enum debug_visibility visibility
;
2614 debug_baseclass baseclass
;
2616 /* This represents a base or friend class. */
2618 if (! ieee_require_asn (info
, pp
, &flags
)
2619 || ! ieee_require_atn65 (info
, pp
, &basename
, &baselen
)
2620 || ! ieee_require_asn (info
, pp
, &cinline
)
2621 || ! ieee_require_atn65 (info
, pp
, &fieldname
, &fieldlen
))
2625 /* We have no way of recording friend information, so we
2627 if ((flags
& BASEFLAGS_FRIEND
) != 0)
2630 /* I assume that either all of the members of the
2631 baseclass are included in the object, starting at the
2632 beginning of the object, or that none of them are
2635 if ((fieldlen
== 0) == (cinline
== 0))
2637 ieee_error (info
, start
, _("unsupported C++ object type"));
2641 basecopy
= savestring (basename
, baselen
);
2642 basetype
= debug_find_tagged_type (dhandle
, basecopy
,
2643 DEBUG_KIND_ILLEGAL
);
2645 if (basetype
== DEBUG_TYPE_NULL
)
2647 ieee_error (info
, start
, _("C++ base class not defined"));
2655 const debug_field
*pf
;
2657 if (structfields
== NULL
)
2659 ieee_error (info
, start
, _("C++ object has no fields"));
2663 for (pf
= structfields
; *pf
!= DEBUG_FIELD_NULL
; pf
++)
2667 fname
= debug_get_field_name (dhandle
, *pf
);
2670 if (fname
[0] == fieldname
[0]
2671 && strncmp (fname
, fieldname
, fieldlen
) == 0
2672 && strlen (fname
) == fieldlen
)
2675 if (*pf
== DEBUG_FIELD_NULL
)
2677 ieee_error (info
, start
,
2678 _("C++ base class not found in container"));
2682 bitpos
= debug_get_field_bitpos (dhandle
, *pf
);
2685 if ((flags
& BASEFLAGS_VIRTUAL
) != 0)
2689 if ((flags
& BASEFLAGS_PRIVATE
) != 0)
2690 visibility
= DEBUG_VISIBILITY_PRIVATE
;
2692 visibility
= DEBUG_VISIBILITY_PUBLIC
;
2694 baseclass
= debug_make_baseclass (dhandle
, basetype
, bitpos
,
2695 virtualp
, visibility
);
2696 if (baseclass
== DEBUG_BASECLASS_NULL
)
2699 if (baseclasses_count
+ 1 >= baseclasses_alloc
)
2701 baseclasses_alloc
+= 10;
2702 baseclasses
= ((debug_baseclass
*)
2703 xrealloc (baseclasses
,
2705 * sizeof *baseclasses
)));
2708 baseclasses
[baseclasses_count
] = baseclass
;
2709 ++baseclasses_count
;
2710 baseclasses
[baseclasses_count
] = DEBUG_BASECLASS_NULL
;
2717 const char *fieldname
, *mangledname
;
2718 unsigned long fieldlen
, mangledlen
;
2720 bfd_boolean staticp
;
2722 const debug_field
*pf
= NULL
;
2723 enum debug_visibility visibility
;
2726 /* This represents a data member. */
2728 if (! ieee_require_asn (info
, pp
, &flags
)
2729 || ! ieee_require_atn65 (info
, pp
, &fieldname
, &fieldlen
)
2730 || ! ieee_require_atn65 (info
, pp
, &mangledname
, &mangledlen
))
2734 fieldcopy
= savestring (fieldname
, fieldlen
);
2736 staticp
= (flags
& CXXFLAGS_STATIC
) != 0 ? TRUE
: FALSE
;
2740 struct ieee_var
*pv
, *pvend
;
2742 /* See if we can find a definition for this variable. */
2743 pv
= info
->vars
.vars
;
2744 pvend
= pv
+ info
->vars
.alloc
;
2745 for (; pv
< pvend
; pv
++)
2746 if (pv
->namlen
== mangledlen
2747 && strncmp (pv
->name
, mangledname
, mangledlen
) == 0)
2753 /* This can happen if the variable is never used. */
2754 ftype
= ieee_builtin_type (info
, start
,
2755 (unsigned int) builtin_void
);
2762 if (structfields
== NULL
)
2764 ieee_error (info
, start
, _("C++ object has no fields"));
2768 for (pf
= structfields
, findx
= 0;
2769 *pf
!= DEBUG_FIELD_NULL
;
2774 fname
= debug_get_field_name (dhandle
, *pf
);
2777 if (fname
[0] == mangledname
[0]
2778 && strncmp (fname
, mangledname
, mangledlen
) == 0
2779 && strlen (fname
) == mangledlen
)
2782 if (*pf
== DEBUG_FIELD_NULL
)
2784 ieee_error (info
, start
,
2785 _("C++ data member not found in container"));
2789 ftype
= debug_get_field_type (dhandle
, *pf
);
2791 if (debug_get_type_kind (dhandle
, ftype
) == DEBUG_KIND_POINTER
)
2793 /* We might need to convert this field into a
2794 reference type later on, so make it an indirect
2796 if (it
->fslots
== NULL
)
2799 const debug_field
*pfcnt
;
2802 for (pfcnt
= structfields
;
2803 *pfcnt
!= DEBUG_FIELD_NULL
;
2806 it
->fslots
= ((debug_type
*)
2807 xmalloc (fcnt
* sizeof *it
->fslots
));
2808 memset (it
->fslots
, 0,
2809 fcnt
* sizeof *it
->fslots
);
2812 if (ftype
== DEBUG_TYPE_NULL
)
2814 it
->fslots
[findx
] = ftype
;
2815 ftype
= debug_make_indirect_type (dhandle
,
2817 (const char *) NULL
);
2820 if (ftype
== DEBUG_TYPE_NULL
)
2823 switch (flags
& CXXFLAGS_VISIBILITY
)
2826 ieee_error (info
, start
, _("unknown C++ visibility"));
2829 case CXXFLAGS_VISIBILITY_PUBLIC
:
2830 visibility
= DEBUG_VISIBILITY_PUBLIC
;
2833 case CXXFLAGS_VISIBILITY_PRIVATE
:
2834 visibility
= DEBUG_VISIBILITY_PRIVATE
;
2837 case CXXFLAGS_VISIBILITY_PROTECTED
:
2838 visibility
= DEBUG_VISIBILITY_PROTECTED
;
2846 mangledcopy
= savestring (mangledname
, mangledlen
);
2848 field
= debug_make_static_member (dhandle
, fieldcopy
,
2854 bfd_vma bitpos
, bitsize
;
2856 bitpos
= debug_get_field_bitpos (dhandle
, *pf
);
2857 bitsize
= debug_get_field_bitsize (dhandle
, *pf
);
2858 if (bitpos
== (bfd_vma
) -1 || bitsize
== (bfd_vma
) -1)
2860 ieee_error (info
, start
, _("bad C++ field bit pos or size"));
2863 field
= debug_make_field (dhandle
, fieldcopy
, ftype
, bitpos
,
2864 bitsize
, visibility
);
2867 if (field
== DEBUG_FIELD_NULL
)
2870 if (field_count
+ 1 >= field_alloc
)
2873 fields
= ((debug_field
*)
2874 xrealloc (fields
, field_alloc
* sizeof *fields
));
2877 fields
[field_count
] = field
;
2879 fields
[field_count
] = DEBUG_FIELD_NULL
;
2886 bfd_vma flags
, voffset
, control
;
2887 const char *name
, *mangled
;
2888 unsigned long namlen
, mangledlen
;
2889 struct ieee_var
*pv
, *pvend
;
2891 enum debug_visibility visibility
;
2892 bfd_boolean constp
, volatilep
;
2894 debug_method_variant mv
;
2895 struct ieee_method
*meth
;
2898 if (! ieee_require_asn (info
, pp
, &flags
)
2899 || ! ieee_require_atn65 (info
, pp
, &name
, &namlen
)
2900 || ! ieee_require_atn65 (info
, pp
, &mangled
, &mangledlen
))
2907 if (! ieee_require_asn (info
, pp
, &voffset
))
2911 if (! ieee_require_asn (info
, pp
, &control
))
2915 /* We just ignore the control information. */
2917 /* We have no way to represent friend information, so we
2919 if ((flags
& CXXFLAGS_FRIEND
) != 0)
2922 /* We should already have seen a type for the function. */
2923 pv
= info
->vars
.vars
;
2924 pvend
= pv
+ info
->vars
.alloc
;
2925 for (; pv
< pvend
; pv
++)
2926 if (pv
->namlen
== mangledlen
2927 && strncmp (pv
->name
, mangled
, mangledlen
) == 0)
2932 /* We won't have type information for this function if
2933 it is not included in this file. We don't try to
2934 handle this case. FIXME. */
2935 type
= (debug_make_function_type
2937 ieee_builtin_type (info
, start
,
2938 (unsigned int) builtin_void
),
2939 (debug_type
*) NULL
,
2944 debug_type return_type
;
2945 const debug_type
*arg_types
;
2946 bfd_boolean varargs
;
2948 if (debug_get_type_kind (dhandle
, pv
->type
)
2949 != DEBUG_KIND_FUNCTION
)
2951 ieee_error (info
, start
,
2952 _("bad type for C++ method function"));
2956 return_type
= debug_get_return_type (dhandle
, pv
->type
);
2957 arg_types
= debug_get_parameter_types (dhandle
, pv
->type
,
2959 if (return_type
== DEBUG_TYPE_NULL
|| arg_types
== NULL
)
2961 ieee_error (info
, start
,
2962 _("no type information for C++ method function"));
2966 type
= debug_make_method_type (dhandle
, return_type
, it
->type
,
2967 (debug_type
*) arg_types
,
2970 if (type
== DEBUG_TYPE_NULL
)
2973 switch (flags
& CXXFLAGS_VISIBILITY
)
2976 ieee_error (info
, start
, _("unknown C++ visibility"));
2979 case CXXFLAGS_VISIBILITY_PUBLIC
:
2980 visibility
= DEBUG_VISIBILITY_PUBLIC
;
2983 case CXXFLAGS_VISIBILITY_PRIVATE
:
2984 visibility
= DEBUG_VISIBILITY_PRIVATE
;
2987 case CXXFLAGS_VISIBILITY_PROTECTED
:
2988 visibility
= DEBUG_VISIBILITY_PROTECTED
;
2992 constp
= (flags
& CXXFLAGS_CONST
) != 0 ? TRUE
: FALSE
;
2993 volatilep
= (flags
& CXXFLAGS_VOLATILE
) != 0 ? TRUE
: FALSE
;
2995 mangledcopy
= savestring (mangled
, mangledlen
);
2997 if ((flags
& CXXFLAGS_STATIC
) != 0)
3001 ieee_error (info
, start
, _("C++ static virtual method"));
3004 mv
= debug_make_static_method_variant (dhandle
, mangledcopy
,
3010 debug_type vcontext
;
3013 vcontext
= DEBUG_TYPE_NULL
;
3016 /* FIXME: How can we calculate this correctly? */
3017 vcontext
= it
->type
;
3019 mv
= debug_make_method_variant (dhandle
, mangledcopy
, type
,
3024 if (mv
== DEBUG_METHOD_VARIANT_NULL
)
3027 for (meth
= methods
, im
= 0; im
< methods_count
; meth
++, im
++)
3028 if (meth
->namlen
== namlen
3029 && strncmp (meth
->name
, name
, namlen
) == 0)
3031 if (im
>= methods_count
)
3033 if (methods_count
>= methods_alloc
)
3035 methods_alloc
+= 10;
3036 methods
= ((struct ieee_method
*)
3038 methods_alloc
* sizeof *methods
));
3040 methods
[methods_count
].name
= name
;
3041 methods
[methods_count
].namlen
= namlen
;
3042 methods
[methods_count
].variants
= NULL
;
3043 methods
[methods_count
].count
= 0;
3044 methods
[methods_count
].alloc
= 0;
3045 meth
= methods
+ methods_count
;
3049 if (meth
->count
+ 1 >= meth
->alloc
)
3052 meth
->variants
= ((debug_method_variant
*)
3053 xrealloc (meth
->variants
,
3055 * sizeof *meth
->variants
)));
3058 meth
->variants
[meth
->count
] = mv
;
3060 meth
->variants
[meth
->count
] = DEBUG_METHOD_VARIANT_NULL
;
3068 /* We have no way to store this information, so we just
3070 if (! ieee_require_asn (info
, pp
, &spec
))
3073 if ((spec
& 4) != 0)
3075 const char *filename
;
3076 unsigned long filenamlen
;
3079 if (! ieee_require_atn65 (info
, pp
, &filename
, &filenamlen
)
3080 || ! ieee_require_asn (info
, pp
, &lineno
))
3084 else if ((spec
& 8) != 0)
3086 const char *mangled
;
3087 unsigned long mangledlen
;
3089 if (! ieee_require_atn65 (info
, pp
, &mangled
, &mangledlen
))
3095 ieee_error (info
, start
,
3096 _("unrecognized C++ object overhead spec"));
3104 const char *vname
, *basename
;
3105 unsigned long vnamelen
, baselen
;
3106 bfd_vma vsize
, control
;
3108 /* A virtual table pointer. */
3110 if (! ieee_require_atn65 (info
, pp
, &vname
, &vnamelen
)
3111 || ! ieee_require_asn (info
, pp
, &vsize
)
3112 || ! ieee_require_atn65 (info
, pp
, &basename
, &baselen
)
3113 || ! ieee_require_asn (info
, pp
, &control
))
3117 /* We just ignore the control number. We don't care what
3118 the virtual table name is. We have no way to store the
3119 virtual table size, and I don't think we care anyhow. */
3121 /* FIXME: We can't handle multiple virtual table pointers. */
3129 basecopy
= savestring (basename
, baselen
);
3130 vptrbase
= debug_find_tagged_type (dhandle
, basecopy
,
3131 DEBUG_KIND_ILLEGAL
);
3133 if (vptrbase
== DEBUG_TYPE_NULL
)
3135 ieee_error (info
, start
, _("undefined C++ vtable"));
3144 /* Now that we have seen all the method variants, we can call
3145 debug_make_method for each one. */
3147 if (methods_count
== 0)
3153 dmethods
= ((debug_method
*)
3154 xmalloc ((methods_count
+ 1) * sizeof *dmethods
));
3155 for (i
= 0; i
< methods_count
; i
++)
3159 namcopy
= savestring (methods
[i
].name
, methods
[i
].namlen
);
3160 dmethods
[i
] = debug_make_method (dhandle
, namcopy
,
3161 methods
[i
].variants
);
3162 if (dmethods
[i
] == DEBUG_METHOD_NULL
)
3165 dmethods
[i
] = DEBUG_METHOD_NULL
;
3169 /* The struct type was created as an indirect type pointing at
3170 it->slot. We update it->slot to automatically update all
3171 references to this struct. */
3172 it
->slot
= debug_make_object_type (dhandle
,
3174 debug_get_type_size (dhandle
,
3176 fields
, baseclasses
, dmethods
,
3178 if (it
->slot
== DEBUG_TYPE_NULL
)
3184 /* Read C++ default argument value and reference type information. */
3187 ieee_read_cxx_defaults (struct ieee_info
*info
, const bfd_byte
**pp
,
3188 unsigned long count
)
3190 const bfd_byte
*start
;
3192 unsigned long fnlen
;
3197 /* Giving the function name before the argument count is an addendum
3198 to the spec. The function name is demangled, though, so this
3199 record must always refer to the current function. */
3201 if (info
->blockstack
.bsp
<= info
->blockstack
.stack
3202 || info
->blockstack
.bsp
[-1].fnindx
== (unsigned int) -1)
3204 ieee_error (info
, start
, _("C++ default values not in a function"));
3208 if (! ieee_require_atn65 (info
, pp
, &fnname
, &fnlen
)
3209 || ! ieee_require_asn (info
, pp
, &defcount
))
3213 while (defcount
-- > 0)
3217 unsigned long strvallen
;
3219 if (! ieee_require_asn (info
, pp
, &type
))
3231 if (! ieee_require_asn (info
, pp
, &val
))
3238 if (! ieee_require_atn65 (info
, pp
, &strval
, &strvallen
))
3244 ieee_error (info
, start
, _("unrecognized C++ default type"));
3248 /* We have no way to record the default argument values, so we
3249 just ignore them. FIXME. */
3252 /* Any remaining arguments are indices of parameters that are really
3257 debug_type
*arg_slots
;
3259 dhandle
= info
->dhandle
;
3260 arg_slots
= info
->types
.types
[info
->blockstack
.bsp
[-1].fnindx
].arg_slots
;
3266 if (! ieee_require_asn (info
, pp
, &indx
))
3268 /* The index is 1 based. */
3270 if (arg_slots
== NULL
3271 || arg_slots
[indx
] == DEBUG_TYPE_NULL
3272 || (debug_get_type_kind (dhandle
, arg_slots
[indx
])
3273 != DEBUG_KIND_POINTER
))
3275 ieee_error (info
, start
, _("reference parameter is not a pointer"));
3279 target
= debug_get_target_type (dhandle
, arg_slots
[indx
]);
3280 arg_slots
[indx
] = debug_make_reference_type (dhandle
, target
);
3281 if (arg_slots
[indx
] == DEBUG_TYPE_NULL
)
3289 /* Read a C++ reference definition. */
3292 ieee_read_reference (struct ieee_info
*info
, const bfd_byte
**pp
)
3294 const bfd_byte
*start
;
3296 const char *class, *name
;
3297 unsigned long classlen
, namlen
;
3303 if (! ieee_require_asn (info
, pp
, &flags
))
3306 /* Giving the class name before the member name is in an addendum to
3310 if (! ieee_require_atn65 (info
, pp
, &class, &classlen
))
3314 if (! ieee_require_atn65 (info
, pp
, &name
, &namlen
))
3322 /* We search from the last variable indices to the first in
3323 hopes of finding local variables correctly. We search the
3324 local variables on the first pass, and the global variables
3325 on the second. FIXME: This probably won't work in all cases.
3326 On the other hand, I don't know what will. */
3327 for (pass
= 0; pass
< 2; pass
++)
3329 struct ieee_vars
*vars
;
3331 struct ieee_var
*pv
= NULL
;
3337 vars
= info
->global_vars
;
3342 for (i
= (int) vars
->alloc
- 1; i
>= 0; i
--)
3346 pv
= vars
->vars
+ i
;
3348 if (pv
->pslot
== NULL
3349 || pv
->namlen
!= namlen
3350 || strncmp (pv
->name
, name
, namlen
) != 0)
3357 ieee_error (info
, start
,
3358 _("unrecognized C++ reference type"));
3362 /* Global variable or function. */
3363 if (pv
->kind
== IEEE_GLOBAL
3364 || pv
->kind
== IEEE_EXTERNAL
3365 || pv
->kind
== IEEE_FUNCTION
)
3370 /* Global static variable or function. */
3371 if (pv
->kind
== IEEE_STATIC
3372 || pv
->kind
== IEEE_FUNCTION
)
3377 /* Local variable. */
3378 if (pv
->kind
== IEEE_LOCAL
)
3396 struct ieee_tag
*it
;
3398 for (it
= info
->tags
; it
!= NULL
; it
= it
->next
)
3400 if (it
->name
[0] == class[0]
3401 && strncmp (it
->name
, class, classlen
) == 0
3402 && strlen (it
->name
) == classlen
)
3404 if (it
->fslots
!= NULL
)
3406 const debug_field
*pf
;
3409 pf
= debug_get_fields (info
->dhandle
, it
->type
);
3412 ieee_error (info
, start
,
3413 "C++ reference in class with no fields");
3417 for (findx
= 0; *pf
!= DEBUG_FIELD_NULL
; pf
++, findx
++)
3421 fname
= debug_get_field_name (info
->dhandle
, *pf
);
3424 if (strncmp (fname
, name
, namlen
) == 0
3425 && strlen (fname
) == namlen
)
3427 pslot
= it
->fslots
+ findx
;
3440 ieee_error (info
, start
, _("C++ reference not found"));
3444 /* We allocated the type of the object as an indirect type pointing
3445 to *pslot, which we can now update to be a reference type. */
3446 if (debug_get_type_kind (info
->dhandle
, *pslot
) != DEBUG_KIND_POINTER
)
3448 ieee_error (info
, start
, _("C++ reference is not pointer"));
3452 target
= debug_get_target_type (info
->dhandle
, *pslot
);
3453 *pslot
= debug_make_reference_type (info
->dhandle
, target
);
3454 if (*pslot
== DEBUG_TYPE_NULL
)
3460 /* Require an ASN record. */
3463 ieee_require_asn (struct ieee_info
*info
, const bfd_byte
**pp
, bfd_vma
*pv
)
3465 const bfd_byte
*start
;
3466 ieee_record_enum_type c
;
3471 c
= (ieee_record_enum_type
) **pp
;
3472 if (c
!= ieee_e2_first_byte_enum
)
3474 ieee_error (info
, start
, _("missing required ASN"));
3479 c
= (ieee_record_enum_type
) (((unsigned int) c
<< 8) | **pp
);
3480 if (c
!= ieee_asn_record_enum
)
3482 ieee_error (info
, start
, _("missing required ASN"));
3487 /* Just ignore the variable index. */
3488 if (! ieee_read_number (info
, pp
, &varindx
))
3491 return ieee_read_expression (info
, pp
, pv
);
3494 /* Require an ATN65 record. */
3497 ieee_require_atn65 (struct ieee_info
*info
, const bfd_byte
**pp
,
3498 const char **pname
, unsigned long *pnamlen
)
3500 const bfd_byte
*start
;
3501 ieee_record_enum_type c
;
3502 bfd_vma name_indx
, type_indx
, atn_code
;
3506 c
= (ieee_record_enum_type
) **pp
;
3507 if (c
!= ieee_at_record_enum
)
3509 ieee_error (info
, start
, _("missing required ATN65"));
3514 c
= (ieee_record_enum_type
) (((unsigned int) c
<< 8) | **pp
);
3515 if (c
!= ieee_atn_record_enum
)
3517 ieee_error (info
, start
, _("missing required ATN65"));
3522 if (! ieee_read_number (info
, pp
, &name_indx
)
3523 || ! ieee_read_number (info
, pp
, &type_indx
)
3524 || ! ieee_read_number (info
, pp
, &atn_code
))
3527 /* Just ignore name_indx. */
3529 if (type_indx
!= 0 || atn_code
!= 65)
3531 ieee_error (info
, start
, _("bad ATN65 record"));
3535 return ieee_read_id (info
, pp
, pname
, pnamlen
);
3538 /* Convert a register number in IEEE debugging information into a
3539 generic register number. */
3542 ieee_regno_to_genreg (bfd
*abfd
, int r
)
3544 switch (bfd_get_arch (abfd
))
3547 /* For some reasons stabs adds 2 to the floating point register
3554 /* Stabs uses 0 to 15 for r0 to r15, 16 to 31 for g0 to g15, and
3555 32 to 35 for fp0 to fp3. */
3566 /* Convert a generic register number to an IEEE specific one. */
3569 ieee_genreg_to_regno (bfd
*abfd
, int r
)
3571 switch (bfd_get_arch (abfd
))
3574 /* For some reason stabs add 2 to the floating point register
3581 /* Stabs uses 0 to 15 for r0 to r15, 16 to 31 for g0 to g15, and
3582 32 to 35 for fp0 to fp3. */
3593 /* These routines build IEEE debugging information out of the generic
3594 debugging information. */
3596 /* We build the IEEE debugging information byte by byte. Rather than
3597 waste time copying data around, we use a linked list of buffers to
3600 #define IEEE_BUFSIZE (490)
3605 struct ieee_buf
*next
;
3606 /* Number of data bytes in this buffer. */
3609 bfd_byte buf
[IEEE_BUFSIZE
];
3612 /* A list of buffers. */
3617 struct ieee_buf
*head
;
3618 /* Tail--last buffer on list. */
3619 struct ieee_buf
*tail
;
3622 /* In order to generate the BB11 blocks required by the HP emulator,
3623 we keep track of ranges of addresses which correspond to a given
3624 compilation unit. */
3629 struct ieee_range
*next
;
3636 /* This structure holds information for a class on the type stack. */
3638 struct ieee_type_class
3640 /* The name index in the debugging information. */
3642 /* The pmisc records for the class. */
3643 struct ieee_buflist pmiscbuf
;
3644 /* The number of pmisc records. */
3645 unsigned int pmisccount
;
3646 /* The name of the class holding the virtual table, if not this
3649 /* Whether this class holds its own virtual table. */
3650 bfd_boolean ownvptr
;
3651 /* The largest virtual table offset seen so far. */
3653 /* The current method. */
3655 /* Additional pmisc records used to record fields of reference type. */
3656 struct ieee_buflist refs
;
3659 /* This is how we store types for the writing routines. Most types
3660 are simply represented by a type index. */
3662 struct ieee_write_type
3666 /* The size of the type, if known. */
3668 /* The name of the type, if any. */
3670 /* If this is a function or method type, we build the type here, and
3671 only add it to the output buffers if we need it. */
3672 struct ieee_buflist fndef
;
3673 /* If this is a struct, this is where the struct definition is
3675 struct ieee_buflist strdef
;
3676 /* If this is a class, this is where the class information is built. */
3677 struct ieee_type_class
*classdef
;
3678 /* Whether the type is unsigned. */
3679 unsigned int unsignedp
: 1;
3680 /* Whether this is a reference type. */
3681 unsigned int referencep
: 1;
3682 /* Whether this is in the local type block. */
3683 unsigned int localp
: 1;
3684 /* Whether this is a duplicate struct definition which we are
3686 unsigned int ignorep
: 1;
3689 /* This is the type stack used by the debug writing routines. FIXME:
3690 We could generate more efficient output if we remembered when we
3691 have output a particular type before. */
3693 struct ieee_type_stack
3695 /* Next entry on stack. */
3696 struct ieee_type_stack
*next
;
3697 /* Type information. */
3698 struct ieee_write_type type
;
3701 /* This is a list of associations between a name and some types.
3702 These are used for typedefs and tags. */
3704 struct ieee_name_type
3706 /* Next type for this name. */
3707 struct ieee_name_type
*next
;
3708 /* ID number. For a typedef, this is the index of the type to which
3709 this name is typedefed. */
3712 struct ieee_write_type type
;
3713 /* If this is a tag which has not yet been defined, this is the
3714 kind. If the tag has been defined, this is DEBUG_KIND_ILLEGAL. */
3715 enum debug_type_kind kind
;
3718 /* We use a hash table to associate names and types. */
3720 struct ieee_name_type_hash_table
3722 struct bfd_hash_table root
;
3725 struct ieee_name_type_hash_entry
3727 struct bfd_hash_entry root
;
3728 /* Information for this name. */
3729 struct ieee_name_type
*types
;
3732 /* This is a list of enums. */
3734 struct ieee_defined_enum
3737 struct ieee_defined_enum
*next
;
3740 /* Whether this enum has been defined. */
3741 bfd_boolean defined
;
3747 bfd_signed_vma
*vals
;
3750 /* We keep a list of modified versions of types, so that we don't
3751 output them more than once. */
3753 struct ieee_modified_type
3755 /* Pointer to this type. */
3756 unsigned int pointer
;
3757 /* Function with unknown arguments returning this type. */
3758 unsigned int function
;
3759 /* Const version of this type. */
3760 unsigned int const_qualified
;
3761 /* Volatile version of this type. */
3762 unsigned int volatile_qualified
;
3763 /* List of arrays of this type of various bounds. */
3764 struct ieee_modified_array_type
*arrays
;
3767 /* A list of arrays bounds. */
3769 struct ieee_modified_array_type
3771 /* Next array bounds. */
3772 struct ieee_modified_array_type
*next
;
3773 /* Type index with these bounds. */
3778 bfd_signed_vma high
;
3781 /* This is a list of pending function parameter information. We don't
3782 output them until we see the first block. */
3784 struct ieee_pending_parm
3786 /* Next pending parameter. */
3787 struct ieee_pending_parm
*next
;
3792 /* Whether the type is a reference. */
3793 bfd_boolean referencep
;
3795 enum debug_parm_kind kind
;
3800 /* This is the handle passed down by debug_write. */
3804 /* BFD we are writing to. */
3806 /* Whether we got an error in a subroutine called via traverse or
3807 map_over_sections. */
3809 /* Current data buffer list. */
3810 struct ieee_buflist
*current
;
3811 /* Current data buffer. */
3812 struct ieee_buf
*curbuf
;
3813 /* Filename of current compilation unit. */
3814 const char *filename
;
3815 /* Module name of current compilation unit. */
3816 const char *modname
;
3817 /* List of buffer for global types. */
3818 struct ieee_buflist global_types
;
3819 /* List of finished data buffers. */
3820 struct ieee_buflist data
;
3821 /* List of buffers for typedefs in the current compilation unit. */
3822 struct ieee_buflist types
;
3823 /* List of buffers for variables and functions in the current
3824 compilation unit. */
3825 struct ieee_buflist vars
;
3826 /* List of buffers for C++ class definitions in the current
3827 compilation unit. */
3828 struct ieee_buflist cxx
;
3829 /* List of buffers for line numbers in the current compilation unit. */
3830 struct ieee_buflist linenos
;
3831 /* Ranges for the current compilation unit. */
3832 struct ieee_range
*ranges
;
3833 /* Ranges for all debugging information. */
3834 struct ieee_range
*global_ranges
;
3835 /* Nested pending ranges. */
3836 struct ieee_range
*pending_ranges
;
3838 struct ieee_type_stack
*type_stack
;
3839 /* Next unallocated type index. */
3840 unsigned int type_indx
;
3841 /* Next unallocated name index. */
3842 unsigned int name_indx
;
3844 struct ieee_name_type_hash_table typedefs
;
3846 struct ieee_name_type_hash_table tags
;
3848 struct ieee_defined_enum
*enums
;
3849 /* Modified versions of types. */
3850 struct ieee_modified_type
*modified
;
3851 /* Number of entries allocated in modified. */
3852 unsigned int modified_alloc
;
3853 /* 4 byte complex type. */
3854 unsigned int complex_float_index
;
3855 /* 8 byte complex type. */
3856 unsigned int complex_double_index
;
3857 /* The depth of block nesting. This is 0 outside a function, and 1
3858 just after start_function is called. */
3859 unsigned int block_depth
;
3860 /* The name of the current function. */
3862 /* List of buffers for the type of the function we are currently
3864 struct ieee_buflist fntype
;
3865 /* List of buffers for the parameters of the function we are
3866 currently writing out. */
3867 struct ieee_buflist fnargs
;
3868 /* Number of arguments written to fnargs. */
3869 unsigned int fnargcount
;
3870 /* Pending function parameters. */
3871 struct ieee_pending_parm
*pending_parms
;
3872 /* Current line number filename. */
3873 const char *lineno_filename
;
3874 /* Line number name index. */
3875 unsigned int lineno_name_indx
;
3876 /* Filename of pending line number. */
3877 const char *pending_lineno_filename
;
3878 /* Pending line number. */
3879 unsigned long pending_lineno
;
3880 /* Address of pending line number. */
3881 bfd_vma pending_lineno_addr
;
3882 /* Highest address seen at end of procedure. */
3886 static bfd_boolean ieee_init_buffer
3887 (struct ieee_handle
*, struct ieee_buflist
*);
3888 static bfd_boolean ieee_change_buffer
3889 (struct ieee_handle
*, struct ieee_buflist
*);
3890 static bfd_boolean ieee_append_buffer
3891 (struct ieee_handle
*, struct ieee_buflist
*, struct ieee_buflist
*);
3892 static bfd_boolean
ieee_real_write_byte (struct ieee_handle
*, int);
3893 static bfd_boolean
ieee_write_2bytes (struct ieee_handle
*, int);
3894 static bfd_boolean
ieee_write_number (struct ieee_handle
*, bfd_vma
);
3895 static bfd_boolean
ieee_write_id (struct ieee_handle
*, const char *);
3896 static bfd_boolean ieee_write_asn
3897 (struct ieee_handle
*, unsigned int, bfd_vma
);
3898 static bfd_boolean ieee_write_atn65
3899 (struct ieee_handle
*, unsigned int, const char *);
3900 static bfd_boolean ieee_push_type
3901 (struct ieee_handle
*, unsigned int, unsigned int, bfd_boolean
,
3903 static unsigned int ieee_pop_type (struct ieee_handle
*);
3904 static void ieee_pop_unused_type (struct ieee_handle
*);
3905 static unsigned int ieee_pop_type_used (struct ieee_handle
*, bfd_boolean
);
3906 static bfd_boolean ieee_add_range
3907 (struct ieee_handle
*, bfd_boolean
, bfd_vma
, bfd_vma
);
3908 static bfd_boolean
ieee_start_range (struct ieee_handle
*, bfd_vma
);
3909 static bfd_boolean
ieee_end_range (struct ieee_handle
*, bfd_vma
);
3910 static bfd_boolean ieee_define_type
3911 (struct ieee_handle
*, unsigned int, bfd_boolean
, bfd_boolean
);
3912 static bfd_boolean ieee_define_named_type
3913 (struct ieee_handle
*, const char *, unsigned int, unsigned int,
3914 bfd_boolean
, bfd_boolean
, struct ieee_buflist
*);
3915 static struct ieee_modified_type
*ieee_get_modified_info
3916 (struct ieee_handle
*, unsigned int);
3917 static struct bfd_hash_entry
*ieee_name_type_newfunc
3918 (struct bfd_hash_entry
*, struct bfd_hash_table
*, const char *);
3919 static bfd_boolean ieee_write_undefined_tag
3920 (struct ieee_name_type_hash_entry
*, void *);
3921 static bfd_boolean
ieee_finish_compilation_unit (struct ieee_handle
*);
3922 static void ieee_add_bb11_blocks (bfd
*, asection
*, void *);
3923 static bfd_boolean ieee_add_bb11
3924 (struct ieee_handle
*, asection
*, bfd_vma
, bfd_vma
);
3925 static bfd_boolean
ieee_output_pending_parms (struct ieee_handle
*);
3926 static unsigned int ieee_vis_to_flags (enum debug_visibility
);
3927 static bfd_boolean ieee_class_method_var
3928 (struct ieee_handle
*, const char *, enum debug_visibility
, bfd_boolean
,
3929 bfd_boolean
, bfd_boolean
, bfd_vma
, bfd_boolean
);
3931 static bfd_boolean
ieee_start_compilation_unit (void *, const char *);
3932 static bfd_boolean
ieee_start_source (void *, const char *);
3933 static bfd_boolean
ieee_empty_type (void *);
3934 static bfd_boolean
ieee_void_type (void *);
3935 static bfd_boolean
ieee_int_type (void *, unsigned int, bfd_boolean
);
3936 static bfd_boolean
ieee_float_type (void *, unsigned int);
3937 static bfd_boolean
ieee_complex_type (void *, unsigned int);
3938 static bfd_boolean
ieee_bool_type (void *, unsigned int);
3939 static bfd_boolean ieee_enum_type
3940 (void *, const char *, const char **, bfd_signed_vma
*);
3941 static bfd_boolean
ieee_pointer_type (void *);
3942 static bfd_boolean
ieee_function_type (void *, int, bfd_boolean
);
3943 static bfd_boolean
ieee_reference_type (void *);
3944 static bfd_boolean
ieee_range_type (void *, bfd_signed_vma
, bfd_signed_vma
);
3945 static bfd_boolean ieee_array_type
3946 (void *, bfd_signed_vma
, bfd_signed_vma
, bfd_boolean
);
3947 static bfd_boolean
ieee_set_type (void *, bfd_boolean
);
3948 static bfd_boolean
ieee_offset_type (void *);
3949 static bfd_boolean
ieee_method_type (void *, bfd_boolean
, int, bfd_boolean
);
3950 static bfd_boolean
ieee_const_type (void *);
3951 static bfd_boolean
ieee_volatile_type (void *);
3952 static bfd_boolean ieee_start_struct_type
3953 (void *, const char *, unsigned int, bfd_boolean
, unsigned int);
3954 static bfd_boolean ieee_struct_field
3955 (void *, const char *, bfd_vma
, bfd_vma
, enum debug_visibility
);
3956 static bfd_boolean
ieee_end_struct_type (void *);
3957 static bfd_boolean ieee_start_class_type
3958 (void *, const char *, unsigned int, bfd_boolean
, unsigned int, bfd_boolean
,
3960 static bfd_boolean ieee_class_static_member
3961 (void *, const char *, const char *, enum debug_visibility
);
3962 static bfd_boolean ieee_class_baseclass
3963 (void *, bfd_vma
, bfd_boolean
, enum debug_visibility
);
3964 static bfd_boolean
ieee_class_start_method (void *, const char *);
3965 static bfd_boolean ieee_class_method_variant
3966 (void *, const char *, enum debug_visibility
, bfd_boolean
, bfd_boolean
,
3967 bfd_vma
, bfd_boolean
);
3968 static bfd_boolean ieee_class_static_method_variant
3969 (void *, const char *, enum debug_visibility
, bfd_boolean
, bfd_boolean
);
3970 static bfd_boolean
ieee_class_end_method (void *);
3971 static bfd_boolean
ieee_end_class_type (void *);
3972 static bfd_boolean
ieee_typedef_type (void *, const char *);
3973 static bfd_boolean ieee_tag_type
3974 (void *, const char *, unsigned int, enum debug_type_kind
);
3975 static bfd_boolean
ieee_typdef (void *, const char *);
3976 static bfd_boolean
ieee_tag (void *, const char *);
3977 static bfd_boolean
ieee_int_constant (void *, const char *, bfd_vma
);
3978 static bfd_boolean
ieee_float_constant (void *, const char *, double);
3979 static bfd_boolean
ieee_typed_constant (void *, const char *, bfd_vma
);
3980 static bfd_boolean ieee_variable
3981 (void *, const char *, enum debug_var_kind
, bfd_vma
);
3982 static bfd_boolean
ieee_start_function (void *, const char *, bfd_boolean
);
3983 static bfd_boolean ieee_function_parameter
3984 (void *, const char *, enum debug_parm_kind
, bfd_vma
);
3985 static bfd_boolean
ieee_start_block (void *, bfd_vma
);
3986 static bfd_boolean
ieee_end_block (void *, bfd_vma
);
3987 static bfd_boolean
ieee_end_function (void *);
3988 static bfd_boolean
ieee_lineno (void *, const char *, unsigned long, bfd_vma
);
3990 static const struct debug_write_fns ieee_fns
=
3992 ieee_start_compilation_unit
,
4003 ieee_reference_type
,
4011 ieee_start_struct_type
,
4013 ieee_end_struct_type
,
4014 ieee_start_class_type
,
4015 ieee_class_static_member
,
4016 ieee_class_baseclass
,
4017 ieee_class_start_method
,
4018 ieee_class_method_variant
,
4019 ieee_class_static_method_variant
,
4020 ieee_class_end_method
,
4021 ieee_end_class_type
,
4027 ieee_float_constant
,
4028 ieee_typed_constant
,
4030 ieee_start_function
,
4031 ieee_function_parameter
,
4038 /* Initialize a buffer to be empty. */
4041 ieee_init_buffer (struct ieee_handle
*info ATTRIBUTE_UNUSED
,
4042 struct ieee_buflist
*buflist
)
4044 buflist
->head
= NULL
;
4045 buflist
->tail
= NULL
;
4049 /* See whether a buffer list has any data. */
4051 #define ieee_buffer_emptyp(buflist) ((buflist)->head == NULL)
4053 /* Change the current buffer to a specified buffer chain. */
4056 ieee_change_buffer (struct ieee_handle
*info
, struct ieee_buflist
*buflist
)
4058 if (buflist
->head
== NULL
)
4060 struct ieee_buf
*buf
;
4062 buf
= (struct ieee_buf
*) xmalloc (sizeof *buf
);
4065 buflist
->head
= buf
;
4066 buflist
->tail
= buf
;
4069 info
->current
= buflist
;
4070 info
->curbuf
= buflist
->tail
;
4075 /* Append a buffer chain. */
4078 ieee_append_buffer (struct ieee_handle
*info ATTRIBUTE_UNUSED
,
4079 struct ieee_buflist
*mainbuf
,
4080 struct ieee_buflist
*newbuf
)
4082 if (newbuf
->head
!= NULL
)
4084 if (mainbuf
->head
== NULL
)
4085 mainbuf
->head
= newbuf
->head
;
4087 mainbuf
->tail
->next
= newbuf
->head
;
4088 mainbuf
->tail
= newbuf
->tail
;
4093 /* Write a byte into the buffer. We use a macro for speed and a
4094 function for the complex cases. */
4096 #define ieee_write_byte(info, b) \
4097 ((info)->curbuf->c < IEEE_BUFSIZE \
4098 ? ((info)->curbuf->buf[(info)->curbuf->c++] = (b), TRUE) \
4099 : ieee_real_write_byte ((info), (b)))
4102 ieee_real_write_byte (struct ieee_handle
*info
, int b
)
4104 if (info
->curbuf
->c
>= IEEE_BUFSIZE
)
4108 n
= (struct ieee_buf
*) xmalloc (sizeof *n
);
4111 if (info
->current
->head
== NULL
)
4112 info
->current
->head
= n
;
4114 info
->current
->tail
->next
= n
;
4115 info
->current
->tail
= n
;
4119 info
->curbuf
->buf
[info
->curbuf
->c
] = b
;
4125 /* Write out two bytes. */
4128 ieee_write_2bytes (struct ieee_handle
*info
, int i
)
4130 return (ieee_write_byte (info
, i
>> 8)
4131 && ieee_write_byte (info
, i
& 0xff));
4134 /* Write out an integer. */
4137 ieee_write_number (struct ieee_handle
*info
, bfd_vma v
)
4144 if (v
<= (bfd_vma
) ieee_number_end_enum
)
4145 return ieee_write_byte (info
, (int) v
);
4156 if (c
> (unsigned int) (ieee_number_repeat_end_enum
4157 - ieee_number_repeat_start_enum
))
4159 fprintf (stderr
, _("IEEE numeric overflow: 0x"));
4160 fprintf_vma (stderr
, v
);
4161 fprintf (stderr
, "\n");
4165 if (! ieee_write_byte (info
, (int) ieee_number_repeat_start_enum
+ c
))
4167 for (; c
> 0; --c
, ++p
)
4169 if (! ieee_write_byte (info
, *p
))
4176 /* Write out a string. */
4179 ieee_write_id (struct ieee_handle
*info
, const char *s
)
4186 if (! ieee_write_byte (info
, len
))
4189 else if (len
<= 0xff)
4191 if (! ieee_write_byte (info
, (int) ieee_extension_length_1_enum
)
4192 || ! ieee_write_byte (info
, len
))
4195 else if (len
<= 0xffff)
4197 if (! ieee_write_byte (info
, (int) ieee_extension_length_2_enum
)
4198 || ! ieee_write_2bytes (info
, len
))
4203 fprintf (stderr
, _("IEEE string length overflow: %u\n"), len
);
4207 for (; *s
!= '\0'; s
++)
4208 if (! ieee_write_byte (info
, *s
))
4214 /* Write out an ASN record. */
4217 ieee_write_asn (struct ieee_handle
*info
, unsigned int indx
, bfd_vma val
)
4219 return (ieee_write_2bytes (info
, (int) ieee_asn_record_enum
)
4220 && ieee_write_number (info
, indx
)
4221 && ieee_write_number (info
, val
));
4224 /* Write out an ATN65 record. */
4227 ieee_write_atn65 (struct ieee_handle
*info
, unsigned int indx
, const char *s
)
4229 return (ieee_write_2bytes (info
, (int) ieee_atn_record_enum
)
4230 && ieee_write_number (info
, indx
)
4231 && ieee_write_number (info
, 0)
4232 && ieee_write_number (info
, 65)
4233 && ieee_write_id (info
, s
));
4236 /* Push a type index onto the type stack. */
4239 ieee_push_type (struct ieee_handle
*info
, unsigned int indx
,
4240 unsigned int size
, bfd_boolean unsignedp
, bfd_boolean localp
)
4242 struct ieee_type_stack
*ts
;
4244 ts
= (struct ieee_type_stack
*) xmalloc (sizeof *ts
);
4245 memset (ts
, 0, sizeof *ts
);
4247 ts
->type
.indx
= indx
;
4248 ts
->type
.size
= size
;
4249 ts
->type
.unsignedp
= unsignedp
;
4250 ts
->type
.localp
= localp
;
4252 ts
->next
= info
->type_stack
;
4253 info
->type_stack
= ts
;
4258 /* Pop a type index off the type stack. */
4261 ieee_pop_type (struct ieee_handle
*info
)
4263 return ieee_pop_type_used (info
, TRUE
);
4266 /* Pop an unused type index off the type stack. */
4269 ieee_pop_unused_type (struct ieee_handle
*info
)
4271 (void) ieee_pop_type_used (info
, FALSE
);
4274 /* Pop a used or unused type index off the type stack. */
4277 ieee_pop_type_used (struct ieee_handle
*info
, bfd_boolean used
)
4279 struct ieee_type_stack
*ts
;
4282 ts
= info
->type_stack
;
4283 assert (ts
!= NULL
);
4285 /* If this is a function type, and we need it, we need to append the
4286 actual definition to the typedef block now. */
4287 if (used
&& ! ieee_buffer_emptyp (&ts
->type
.fndef
))
4289 struct ieee_buflist
*buflist
;
4291 if (ts
->type
.localp
)
4293 /* Make sure we have started the types block. */
4294 if (ieee_buffer_emptyp (&info
->types
))
4296 if (! ieee_change_buffer (info
, &info
->types
)
4297 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
4298 || ! ieee_write_byte (info
, 1)
4299 || ! ieee_write_number (info
, 0)
4300 || ! ieee_write_id (info
, info
->modname
))
4303 buflist
= &info
->types
;
4307 /* Make sure we started the global type block. */
4308 if (ieee_buffer_emptyp (&info
->global_types
))
4310 if (! ieee_change_buffer (info
, &info
->global_types
)
4311 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
4312 || ! ieee_write_byte (info
, 2)
4313 || ! ieee_write_number (info
, 0)
4314 || ! ieee_write_id (info
, ""))
4317 buflist
= &info
->global_types
;
4320 if (! ieee_append_buffer (info
, buflist
, &ts
->type
.fndef
))
4324 ret
= ts
->type
.indx
;
4325 info
->type_stack
= ts
->next
;
4330 /* Add a range of bytes included in the current compilation unit. */
4333 ieee_add_range (struct ieee_handle
*info
, bfd_boolean global
, bfd_vma low
,
4336 struct ieee_range
**plist
, *r
, **pr
;
4338 if (low
== (bfd_vma
) -1 || high
== (bfd_vma
) -1 || low
== high
)
4342 plist
= &info
->global_ranges
;
4344 plist
= &info
->ranges
;
4346 for (r
= *plist
; r
!= NULL
; r
= r
->next
)
4348 if (high
>= r
->low
&& low
<= r
->high
)
4350 /* The new range overlaps r. */
4356 while (*pr
!= NULL
&& (*pr
)->low
<= r
->high
)
4358 struct ieee_range
*n
;
4360 if ((*pr
)->high
> r
->high
)
4361 r
->high
= (*pr
)->high
;
4370 r
= (struct ieee_range
*) xmalloc (sizeof *r
);
4371 memset (r
, 0, sizeof *r
);
4376 /* Store the ranges sorted by address. */
4377 for (pr
= plist
; *pr
!= NULL
; pr
= &(*pr
)->next
)
4378 if ((*pr
)->low
> high
)
4386 /* Start a new range for which we only have the low address. */
4389 ieee_start_range (struct ieee_handle
*info
, bfd_vma low
)
4391 struct ieee_range
*r
;
4393 r
= (struct ieee_range
*) xmalloc (sizeof *r
);
4394 memset (r
, 0, sizeof *r
);
4396 r
->next
= info
->pending_ranges
;
4397 info
->pending_ranges
= r
;
4401 /* Finish a range started by ieee_start_range. */
4404 ieee_end_range (struct ieee_handle
*info
, bfd_vma high
)
4406 struct ieee_range
*r
;
4409 assert (info
->pending_ranges
!= NULL
);
4410 r
= info
->pending_ranges
;
4412 info
->pending_ranges
= r
->next
;
4414 return ieee_add_range (info
, FALSE
, low
, high
);
4417 /* Start defining a type. */
4420 ieee_define_type (struct ieee_handle
*info
, unsigned int size
,
4421 bfd_boolean unsignedp
, bfd_boolean localp
)
4423 return ieee_define_named_type (info
, (const char *) NULL
,
4424 (unsigned int) -1, size
, unsignedp
,
4425 localp
, (struct ieee_buflist
*) NULL
);
4428 /* Start defining a named type. */
4431 ieee_define_named_type (struct ieee_handle
*info
, const char *name
,
4432 unsigned int indx
, unsigned int size
,
4433 bfd_boolean unsignedp
, bfd_boolean localp
,
4434 struct ieee_buflist
*buflist
)
4436 unsigned int type_indx
;
4437 unsigned int name_indx
;
4439 if (indx
!= (unsigned int) -1)
4443 type_indx
= info
->type_indx
;
4447 name_indx
= info
->name_indx
;
4453 /* If we were given a buffer, use it; otherwise, use either the
4454 local or the global type information, and make sure that the type
4455 block is started. */
4456 if (buflist
!= NULL
)
4458 if (! ieee_change_buffer (info
, buflist
))
4463 if (! ieee_buffer_emptyp (&info
->types
))
4465 if (! ieee_change_buffer (info
, &info
->types
))
4470 if (! ieee_change_buffer (info
, &info
->types
)
4471 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
4472 || ! ieee_write_byte (info
, 1)
4473 || ! ieee_write_number (info
, 0)
4474 || ! ieee_write_id (info
, info
->modname
))
4480 if (! ieee_buffer_emptyp (&info
->global_types
))
4482 if (! ieee_change_buffer (info
, &info
->global_types
))
4487 if (! ieee_change_buffer (info
, &info
->global_types
)
4488 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
4489 || ! ieee_write_byte (info
, 2)
4490 || ! ieee_write_number (info
, 0)
4491 || ! ieee_write_id (info
, ""))
4496 /* Push the new type on the type stack, write out an NN record, and
4497 write out the start of a TY record. The caller will then finish
4499 if (! ieee_push_type (info
, type_indx
, size
, unsignedp
, localp
))
4502 return (ieee_write_byte (info
, (int) ieee_nn_record
)
4503 && ieee_write_number (info
, name_indx
)
4504 && ieee_write_id (info
, name
)
4505 && ieee_write_byte (info
, (int) ieee_ty_record_enum
)
4506 && ieee_write_number (info
, type_indx
)
4507 && ieee_write_byte (info
, 0xce)
4508 && ieee_write_number (info
, name_indx
));
4511 /* Get an entry to the list of modified versions of a type. */
4513 static struct ieee_modified_type
*
4514 ieee_get_modified_info (struct ieee_handle
*info
, unsigned int indx
)
4516 if (indx
>= info
->modified_alloc
)
4518 unsigned int nalloc
;
4520 nalloc
= info
->modified_alloc
;
4523 while (indx
>= nalloc
)
4525 info
->modified
= ((struct ieee_modified_type
*)
4526 xrealloc (info
->modified
,
4527 nalloc
* sizeof *info
->modified
));
4528 memset (info
->modified
+ info
->modified_alloc
, 0,
4529 (nalloc
- info
->modified_alloc
) * sizeof *info
->modified
);
4530 info
->modified_alloc
= nalloc
;
4533 return info
->modified
+ indx
;
4536 /* Routines for the hash table mapping names to types. */
4538 /* Initialize an entry in the hash table. */
4540 static struct bfd_hash_entry
*
4541 ieee_name_type_newfunc (struct bfd_hash_entry
*entry
,
4542 struct bfd_hash_table
*table
, const char *string
)
4544 struct ieee_name_type_hash_entry
*ret
=
4545 (struct ieee_name_type_hash_entry
*) entry
;
4547 /* Allocate the structure if it has not already been allocated by a
4550 ret
= ((struct ieee_name_type_hash_entry
*)
4551 bfd_hash_allocate (table
, sizeof *ret
));
4555 /* Call the allocation method of the superclass. */
4556 ret
= ((struct ieee_name_type_hash_entry
*)
4557 bfd_hash_newfunc ((struct bfd_hash_entry
*) ret
, table
, string
));
4560 /* Set local fields. */
4564 return (struct bfd_hash_entry
*) ret
;
4567 /* Look up an entry in the hash table. */
4569 #define ieee_name_type_hash_lookup(table, string, create, copy) \
4570 ((struct ieee_name_type_hash_entry *) \
4571 bfd_hash_lookup (&(table)->root, (string), (create), (copy)))
4573 /* Traverse the hash table. */
4575 #define ieee_name_type_hash_traverse(table, func, info) \
4576 (bfd_hash_traverse \
4578 (bfd_boolean (*) (struct bfd_hash_entry *, void *)) (func), \
4581 /* The general routine to write out IEEE debugging information. */
4584 write_ieee_debugging_info (bfd
*abfd
, void *dhandle
)
4586 struct ieee_handle info
;
4591 memset (&info
, 0, sizeof info
);
4593 info
.type_indx
= 256;
4594 info
.name_indx
= 32;
4596 if (! bfd_hash_table_init (&info
.typedefs
.root
, ieee_name_type_newfunc
)
4597 || ! bfd_hash_table_init (&info
.tags
.root
, ieee_name_type_newfunc
))
4600 if (! ieee_init_buffer (&info
, &info
.global_types
)
4601 || ! ieee_init_buffer (&info
, &info
.data
)
4602 || ! ieee_init_buffer (&info
, &info
.types
)
4603 || ! ieee_init_buffer (&info
, &info
.vars
)
4604 || ! ieee_init_buffer (&info
, &info
.cxx
)
4605 || ! ieee_init_buffer (&info
, &info
.linenos
)
4606 || ! ieee_init_buffer (&info
, &info
.fntype
)
4607 || ! ieee_init_buffer (&info
, &info
.fnargs
))
4610 if (! debug_write (dhandle
, &ieee_fns
, (void *) &info
))
4613 if (info
.filename
!= NULL
)
4615 if (! ieee_finish_compilation_unit (&info
))
4619 /* Put any undefined tags in the global typedef information. */
4621 ieee_name_type_hash_traverse (&info
.tags
,
4622 ieee_write_undefined_tag
,
4627 /* Prepend the global typedef information to the other data. */
4628 if (! ieee_buffer_emptyp (&info
.global_types
))
4630 /* The HP debugger seems to have a bug in which it ignores the
4631 last entry in the global types, so we add a dummy entry. */
4632 if (! ieee_change_buffer (&info
, &info
.global_types
)
4633 || ! ieee_write_byte (&info
, (int) ieee_nn_record
)
4634 || ! ieee_write_number (&info
, info
.name_indx
)
4635 || ! ieee_write_id (&info
, "")
4636 || ! ieee_write_byte (&info
, (int) ieee_ty_record_enum
)
4637 || ! ieee_write_number (&info
, info
.type_indx
)
4638 || ! ieee_write_byte (&info
, 0xce)
4639 || ! ieee_write_number (&info
, info
.name_indx
)
4640 || ! ieee_write_number (&info
, 'P')
4641 || ! ieee_write_number (&info
, (int) builtin_void
+ 32)
4642 || ! ieee_write_byte (&info
, (int) ieee_be_record_enum
))
4645 if (! ieee_append_buffer (&info
, &info
.global_types
, &info
.data
))
4647 info
.data
= info
.global_types
;
4650 /* Make sure that we have declare BB11 blocks for each range in the
4651 file. They are added to info->vars. */
4653 if (! ieee_init_buffer (&info
, &info
.vars
))
4655 bfd_map_over_sections (abfd
, ieee_add_bb11_blocks
, (void *) &info
);
4658 if (! ieee_buffer_emptyp (&info
.vars
))
4660 if (! ieee_change_buffer (&info
, &info
.vars
)
4661 || ! ieee_write_byte (&info
, (int) ieee_be_record_enum
))
4664 if (! ieee_append_buffer (&info
, &info
.data
, &info
.vars
))
4668 /* Now all the data is in info.data. Write it out to the BFD. We
4669 normally would need to worry about whether all the other sections
4670 are set up yet, but the IEEE backend will handle this particular
4671 case correctly regardless. */
4672 if (ieee_buffer_emptyp (&info
.data
))
4674 /* There is no debugging information. */
4678 s
= bfd_make_section (abfd
, ".debug");
4680 err
= "bfd_make_section";
4683 if (! bfd_set_section_flags (abfd
, s
, SEC_DEBUGGING
| SEC_HAS_CONTENTS
))
4684 err
= "bfd_set_section_flags";
4691 for (b
= info
.data
.head
; b
!= NULL
; b
= b
->next
)
4693 if (! bfd_set_section_size (abfd
, s
, size
))
4694 err
= "bfd_set_section_size";
4701 for (b
= info
.data
.head
; b
!= NULL
; b
= b
->next
)
4703 if (! bfd_set_section_contents (abfd
, s
, b
->buf
, offset
, b
->c
))
4705 err
= "bfd_set_section_contents";
4714 fprintf (stderr
, "%s: %s: %s\n", bfd_get_filename (abfd
), err
,
4715 bfd_errmsg (bfd_get_error ()));
4719 bfd_hash_table_free (&info
.typedefs
.root
);
4720 bfd_hash_table_free (&info
.tags
.root
);
4725 /* Write out information for an undefined tag. This is called via
4726 ieee_name_type_hash_traverse. */
4729 ieee_write_undefined_tag (struct ieee_name_type_hash_entry
*h
, void *p
)
4731 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
4732 struct ieee_name_type
*nt
;
4734 for (nt
= h
->types
; nt
!= NULL
; nt
= nt
->next
)
4736 unsigned int name_indx
;
4739 if (nt
->kind
== DEBUG_KIND_ILLEGAL
)
4742 if (ieee_buffer_emptyp (&info
->global_types
))
4744 if (! ieee_change_buffer (info
, &info
->global_types
)
4745 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
4746 || ! ieee_write_byte (info
, 2)
4747 || ! ieee_write_number (info
, 0)
4748 || ! ieee_write_id (info
, ""))
4756 if (! ieee_change_buffer (info
, &info
->global_types
))
4763 name_indx
= info
->name_indx
;
4765 if (! ieee_write_byte (info
, (int) ieee_nn_record
)
4766 || ! ieee_write_number (info
, name_indx
)
4767 || ! ieee_write_id (info
, nt
->type
.name
)
4768 || ! ieee_write_byte (info
, (int) ieee_ty_record_enum
)
4769 || ! ieee_write_number (info
, nt
->type
.indx
)
4770 || ! ieee_write_byte (info
, 0xce)
4771 || ! ieee_write_number (info
, name_indx
))
4783 case DEBUG_KIND_STRUCT
:
4784 case DEBUG_KIND_CLASS
:
4787 case DEBUG_KIND_UNION
:
4788 case DEBUG_KIND_UNION_CLASS
:
4791 case DEBUG_KIND_ENUM
:
4795 if (! ieee_write_number (info
, code
)
4796 || ! ieee_write_number (info
, 0))
4806 /* Start writing out information for a compilation unit. */
4809 ieee_start_compilation_unit (void *p
, const char *filename
)
4811 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
4812 const char *modname
;
4813 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
4814 const char *backslash
;
4819 if (info
->filename
!= NULL
)
4821 if (! ieee_finish_compilation_unit (info
))
4825 info
->filename
= filename
;
4826 modname
= strrchr (filename
, '/');
4827 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
4828 /* We could have a mixed forward/back slash case. */
4829 backslash
= strrchr (filename
, '\\');
4830 if (modname
== NULL
|| (backslash
!= NULL
&& backslash
> modname
))
4831 modname
= backslash
;
4834 if (modname
!= NULL
)
4836 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
4837 else if (filename
[0] && filename
[1] == ':')
4838 modname
= filename
+ 2;
4843 c
= xstrdup (modname
);
4844 s
= strrchr (c
, '.');
4849 if (! ieee_init_buffer (info
, &info
->types
)
4850 || ! ieee_init_buffer (info
, &info
->vars
)
4851 || ! ieee_init_buffer (info
, &info
->cxx
)
4852 || ! ieee_init_buffer (info
, &info
->linenos
))
4854 info
->ranges
= NULL
;
4856 /* Always include a BB1 and a BB3 block. That is what the output of
4857 the MRI linker seems to look like. */
4858 if (! ieee_change_buffer (info
, &info
->types
)
4859 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
4860 || ! ieee_write_byte (info
, 1)
4861 || ! ieee_write_number (info
, 0)
4862 || ! ieee_write_id (info
, info
->modname
))
4865 nindx
= info
->name_indx
;
4867 if (! ieee_change_buffer (info
, &info
->vars
)
4868 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
4869 || ! ieee_write_byte (info
, 3)
4870 || ! ieee_write_number (info
, 0)
4871 || ! ieee_write_id (info
, info
->modname
))
4877 /* Finish up a compilation unit. */
4880 ieee_finish_compilation_unit (struct ieee_handle
*info
)
4882 struct ieee_range
*r
;
4884 if (! ieee_buffer_emptyp (&info
->types
))
4886 if (! ieee_change_buffer (info
, &info
->types
)
4887 || ! ieee_write_byte (info
, (int) ieee_be_record_enum
))
4891 if (! ieee_buffer_emptyp (&info
->cxx
))
4893 /* Append any C++ information to the global function and
4894 variable information. */
4895 assert (! ieee_buffer_emptyp (&info
->vars
));
4896 if (! ieee_change_buffer (info
, &info
->vars
))
4899 /* We put the pmisc records in a dummy procedure, just as the
4900 MRI compiler does. */
4901 if (! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
4902 || ! ieee_write_byte (info
, 6)
4903 || ! ieee_write_number (info
, 0)
4904 || ! ieee_write_id (info
, "__XRYCPP")
4905 || ! ieee_write_number (info
, 0)
4906 || ! ieee_write_number (info
, 0)
4907 || ! ieee_write_number (info
, info
->highaddr
- 1)
4908 || ! ieee_append_buffer (info
, &info
->vars
, &info
->cxx
)
4909 || ! ieee_change_buffer (info
, &info
->vars
)
4910 || ! ieee_write_byte (info
, (int) ieee_be_record_enum
)
4911 || ! ieee_write_number (info
, info
->highaddr
- 1))
4915 if (! ieee_buffer_emptyp (&info
->vars
))
4917 if (! ieee_change_buffer (info
, &info
->vars
)
4918 || ! ieee_write_byte (info
, (int) ieee_be_record_enum
))
4922 if (info
->pending_lineno_filename
!= NULL
)
4924 /* Force out the pending line number. */
4925 if (! ieee_lineno ((void *) info
, (const char *) NULL
, 0, (bfd_vma
) -1))
4928 if (! ieee_buffer_emptyp (&info
->linenos
))
4930 if (! ieee_change_buffer (info
, &info
->linenos
)
4931 || ! ieee_write_byte (info
, (int) ieee_be_record_enum
))
4933 if (strcmp (info
->filename
, info
->lineno_filename
) != 0)
4935 /* We were not in the main file. We just closed the
4936 included line number block, and now we must close the
4937 main line number block. */
4938 if (! ieee_write_byte (info
, (int) ieee_be_record_enum
))
4943 if (! ieee_append_buffer (info
, &info
->data
, &info
->types
)
4944 || ! ieee_append_buffer (info
, &info
->data
, &info
->vars
)
4945 || ! ieee_append_buffer (info
, &info
->data
, &info
->linenos
))
4948 /* Build BB10/BB11 blocks based on the ranges we recorded. */
4949 if (! ieee_change_buffer (info
, &info
->data
))
4952 if (! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
4953 || ! ieee_write_byte (info
, 10)
4954 || ! ieee_write_number (info
, 0)
4955 || ! ieee_write_id (info
, info
->modname
)
4956 || ! ieee_write_id (info
, "")
4957 || ! ieee_write_number (info
, 0)
4958 || ! ieee_write_id (info
, "GNU objcopy"))
4961 for (r
= info
->ranges
; r
!= NULL
; r
= r
->next
)
4970 /* Find the section corresponding to this range. */
4971 for (s
= info
->abfd
->sections
; s
!= NULL
; s
= s
->next
)
4973 if (bfd_get_section_vma (info
->abfd
, s
) <= low
4974 && high
<= (bfd_get_section_vma (info
->abfd
, s
)
4975 + bfd_section_size (info
->abfd
, s
)))
4981 /* Just ignore this range. */
4985 /* Coalesce ranges if it seems reasonable. */
4986 while (r
->next
!= NULL
4987 && high
+ 0x1000 >= r
->next
->low
4989 <= (bfd_get_section_vma (info
->abfd
, s
)
4990 + bfd_section_size (info
->abfd
, s
))))
4996 if ((s
->flags
& SEC_CODE
) != 0)
4998 else if ((s
->flags
& SEC_READONLY
) != 0)
5003 if (! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
5004 || ! ieee_write_byte (info
, 11)
5005 || ! ieee_write_number (info
, 0)
5006 || ! ieee_write_id (info
, "")
5007 || ! ieee_write_number (info
, kind
)
5008 || ! ieee_write_number (info
, s
->index
+ IEEE_SECTION_NUMBER_BASE
)
5009 || ! ieee_write_number (info
, low
)
5010 || ! ieee_write_byte (info
, (int) ieee_be_record_enum
)
5011 || ! ieee_write_number (info
, high
- low
))
5014 /* Add this range to the list of global ranges. */
5015 if (! ieee_add_range (info
, TRUE
, low
, high
))
5019 if (! ieee_write_byte (info
, (int) ieee_be_record_enum
))
5025 /* Add BB11 blocks describing each range that we have not already
5029 ieee_add_bb11_blocks (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
, void *data
)
5031 struct ieee_handle
*info
= (struct ieee_handle
*) data
;
5033 struct ieee_range
*r
;
5035 low
= bfd_get_section_vma (abfd
, sec
);
5036 high
= low
+ bfd_section_size (abfd
, sec
);
5038 /* Find the first range at or after this section. The ranges are
5039 sorted by address. */
5040 for (r
= info
->global_ranges
; r
!= NULL
; r
= r
->next
)
5046 if (r
== NULL
|| r
->low
>= high
)
5048 if (! ieee_add_bb11 (info
, sec
, low
, high
))
5054 && r
->low
- low
> 0x100)
5056 if (! ieee_add_bb11 (info
, sec
, low
, r
->low
))
5068 /* Add a single BB11 block for a range. We add it to info->vars. */
5071 ieee_add_bb11 (struct ieee_handle
*info
, asection
*sec
, bfd_vma low
,
5076 if (! ieee_buffer_emptyp (&info
->vars
))
5078 if (! ieee_change_buffer (info
, &info
->vars
))
5083 const char *filename
, *modname
;
5084 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5085 const char *backslash
;
5089 /* Start the enclosing BB10 block. */
5090 filename
= bfd_get_filename (info
->abfd
);
5091 modname
= strrchr (filename
, '/');
5092 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5093 backslash
= strrchr (filename
, '\\');
5094 if (modname
== NULL
|| (backslash
!= NULL
&& backslash
> modname
))
5095 modname
= backslash
;
5098 if (modname
!= NULL
)
5100 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
5101 else if (filename
[0] && filename
[1] == ':')
5102 modname
= filename
+ 2;
5107 c
= xstrdup (modname
);
5108 s
= strrchr (c
, '.');
5112 if (! ieee_change_buffer (info
, &info
->vars
)
5113 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
5114 || ! ieee_write_byte (info
, 10)
5115 || ! ieee_write_number (info
, 0)
5116 || ! ieee_write_id (info
, c
)
5117 || ! ieee_write_id (info
, "")
5118 || ! ieee_write_number (info
, 0)
5119 || ! ieee_write_id (info
, "GNU objcopy"))
5125 if ((sec
->flags
& SEC_CODE
) != 0)
5127 else if ((sec
->flags
& SEC_READONLY
) != 0)
5132 if (! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
5133 || ! ieee_write_byte (info
, 11)
5134 || ! ieee_write_number (info
, 0)
5135 || ! ieee_write_id (info
, "")
5136 || ! ieee_write_number (info
, kind
)
5137 || ! ieee_write_number (info
, sec
->index
+ IEEE_SECTION_NUMBER_BASE
)
5138 || ! ieee_write_number (info
, low
)
5139 || ! ieee_write_byte (info
, (int) ieee_be_record_enum
)
5140 || ! ieee_write_number (info
, high
- low
))
5146 /* Start recording information from a particular source file. This is
5147 used to record which file defined which types, variables, etc. It
5148 is not used for line numbers, since the lineno entry point passes
5149 down the file name anyhow. IEEE debugging information doesn't seem
5150 to store this information anywhere. */
5153 ieee_start_source (void *p ATTRIBUTE_UNUSED
,
5154 const char *filename ATTRIBUTE_UNUSED
)
5159 /* Make an empty type. */
5162 ieee_empty_type (void *p
)
5164 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5166 return ieee_push_type (info
, (int) builtin_unknown
, 0, FALSE
, FALSE
);
5169 /* Make a void type. */
5172 ieee_void_type (void *p
)
5174 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5176 return ieee_push_type (info
, (int) builtin_void
, 0, FALSE
, FALSE
);
5179 /* Make an integer type. */
5182 ieee_int_type (void *p
, unsigned int size
, bfd_boolean unsignedp
)
5184 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5190 indx
= (int) builtin_signed_char
;
5193 indx
= (int) builtin_signed_short_int
;
5196 indx
= (int) builtin_signed_long
;
5199 indx
= (int) builtin_signed_long_long
;
5202 fprintf (stderr
, _("IEEE unsupported integer type size %u\n"), size
);
5209 return ieee_push_type (info
, indx
, size
, unsignedp
, FALSE
);
5212 /* Make a floating point type. */
5215 ieee_float_type (void *p
, unsigned int size
)
5217 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5223 indx
= (int) builtin_float
;
5226 indx
= (int) builtin_double
;
5229 /* FIXME: This size really depends upon the processor. */
5230 indx
= (int) builtin_long_double
;
5233 indx
= (int) builtin_long_long_double
;
5236 fprintf (stderr
, _("IEEE unsupported float type size %u\n"), size
);
5240 return ieee_push_type (info
, indx
, size
, FALSE
, FALSE
);
5243 /* Make a complex type. */
5246 ieee_complex_type (void *p
, unsigned int size
)
5248 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5254 if (info
->complex_float_index
!= 0)
5255 return ieee_push_type (info
, info
->complex_float_index
, size
* 2,
5261 /* These cases can be output by gcc -gstabs. Outputting the
5262 wrong type is better than crashing. */
5264 if (info
->complex_double_index
!= 0)
5265 return ieee_push_type (info
, info
->complex_double_index
, size
* 2,
5270 fprintf (stderr
, _("IEEE unsupported complex type size %u\n"), size
);
5274 /* FIXME: I don't know what the string is for. */
5275 if (! ieee_define_type (info
, size
* 2, FALSE
, FALSE
)
5276 || ! ieee_write_number (info
, code
)
5277 || ! ieee_write_id (info
, ""))
5281 info
->complex_float_index
= info
->type_stack
->type
.indx
;
5283 info
->complex_double_index
= info
->type_stack
->type
.indx
;
5288 /* Make a boolean type. IEEE doesn't support these, so we just make
5289 an integer type instead. */
5292 ieee_bool_type (void *p
, unsigned int size
)
5294 return ieee_int_type (p
, size
, TRUE
);
5297 /* Make an enumeration. */
5300 ieee_enum_type (void *p
, const char *tag
, const char **names
,
5301 bfd_signed_vma
*vals
)
5303 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5304 struct ieee_defined_enum
*e
;
5305 bfd_boolean localp
, simple
;
5310 indx
= (unsigned int) -1;
5311 for (e
= info
->enums
; e
!= NULL
; e
= e
->next
)
5321 || tag
[0] != e
->tag
[0]
5322 || strcmp (tag
, e
->tag
) != 0)
5328 /* This enum tag has been seen but not defined. */
5333 if (names
!= NULL
&& e
->names
!= NULL
)
5335 for (i
= 0; names
[i
] != NULL
&& e
->names
[i
] != NULL
; i
++)
5337 if (names
[i
][0] != e
->names
[i
][0]
5338 || vals
[i
] != e
->vals
[i
]
5339 || strcmp (names
[i
], e
->names
[i
]) != 0)
5344 if ((names
== NULL
&& e
->names
== NULL
)
5348 && e
->names
[i
] == NULL
))
5350 /* We've seen this enum before. */
5351 return ieee_push_type (info
, e
->indx
, 0, TRUE
, FALSE
);
5356 /* We've already seen an enum of the same name, so we must make
5357 sure to output this one locally. */
5363 /* If this is a simple enumeration, in which the values start at 0
5364 and always increment by 1, we can use type E. Otherwise we must
5370 for (i
= 0; names
[i
] != NULL
; i
++)
5380 if (! ieee_define_named_type (info
, tag
, indx
, 0, TRUE
, localp
,
5381 (struct ieee_buflist
*) NULL
)
5382 || ! ieee_write_number (info
, simple
? 'E' : 'N'))
5386 /* FIXME: This is supposed to be the enumeration size, but we
5387 don't store that. */
5388 if (! ieee_write_number (info
, 4))
5393 for (i
= 0; names
[i
] != NULL
; i
++)
5395 if (! ieee_write_id (info
, names
[i
]))
5399 if (! ieee_write_number (info
, vals
[i
]))
5407 if (indx
== (unsigned int) -1)
5409 e
= (struct ieee_defined_enum
*) xmalloc (sizeof *e
);
5410 memset (e
, 0, sizeof *e
);
5411 e
->indx
= info
->type_stack
->type
.indx
;
5414 e
->next
= info
->enums
;
5426 /* Make a pointer type. */
5429 ieee_pointer_type (void *p
)
5431 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5434 struct ieee_modified_type
*m
= NULL
;
5436 localp
= info
->type_stack
->type
.localp
;
5437 indx
= ieee_pop_type (info
);
5439 /* A pointer to a simple builtin type can be obtained by adding 32.
5440 FIXME: Will this be a short pointer, and will that matter? */
5442 return ieee_push_type (info
, indx
+ 32, 0, TRUE
, FALSE
);
5446 m
= ieee_get_modified_info (p
, indx
);
5450 /* FIXME: The size should depend upon the architecture. */
5452 return ieee_push_type (info
, m
->pointer
, 4, TRUE
, FALSE
);
5455 if (! ieee_define_type (info
, 4, TRUE
, localp
)
5456 || ! ieee_write_number (info
, 'P')
5457 || ! ieee_write_number (info
, indx
))
5461 m
->pointer
= info
->type_stack
->type
.indx
;
5466 /* Make a function type. This will be called for a method, but we
5467 don't want to actually add it to the type table in that case. We
5468 handle this by defining the type in a private buffer, and only
5469 adding that buffer to the typedef block if we are going to use it. */
5472 ieee_function_type (void *p
, int argcount
, bfd_boolean varargs
)
5474 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5476 unsigned int *args
= NULL
;
5478 unsigned int retindx
;
5479 struct ieee_buflist fndef
;
5480 struct ieee_modified_type
*m
;
5486 args
= (unsigned int *) xmalloc (argcount
* sizeof *args
);
5487 for (i
= argcount
- 1; i
>= 0; i
--)
5489 if (info
->type_stack
->type
.localp
)
5491 args
[i
] = ieee_pop_type (info
);
5494 else if (argcount
< 0)
5497 if (info
->type_stack
->type
.localp
)
5499 retindx
= ieee_pop_type (info
);
5502 if (argcount
< 0 && ! localp
)
5504 m
= ieee_get_modified_info (p
, retindx
);
5508 if (m
->function
> 0)
5509 return ieee_push_type (info
, m
->function
, 0, TRUE
, FALSE
);
5512 /* An attribute of 0x41 means that the frame and push mask are
5514 if (! ieee_init_buffer (info
, &fndef
)
5515 || ! ieee_define_named_type (info
, (const char *) NULL
,
5516 (unsigned int) -1, 0, TRUE
, localp
,
5518 || ! ieee_write_number (info
, 'x')
5519 || ! ieee_write_number (info
, 0x41)
5520 || ! ieee_write_number (info
, 0)
5521 || ! ieee_write_number (info
, 0)
5522 || ! ieee_write_number (info
, retindx
)
5523 || ! ieee_write_number (info
, (bfd_vma
) argcount
+ (varargs
? 1 : 0)))
5527 for (i
= 0; i
< argcount
; i
++)
5528 if (! ieee_write_number (info
, args
[i
]))
5534 /* A varargs function is represented by writing out the last
5535 argument as type void *, although this makes little sense. */
5536 if (! ieee_write_number (info
, (bfd_vma
) builtin_void
+ 32))
5540 if (! ieee_write_number (info
, 0))
5543 /* We wrote the information into fndef, in case we don't need it.
5544 It will be appended to info->types by ieee_pop_type. */
5545 info
->type_stack
->type
.fndef
= fndef
;
5548 m
->function
= info
->type_stack
->type
.indx
;
5553 /* Make a reference type. */
5556 ieee_reference_type (void *p
)
5558 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5560 /* IEEE appears to record a normal pointer type, and then use a
5561 pmisc record to indicate that it is really a reference. */
5563 if (! ieee_pointer_type (p
))
5565 info
->type_stack
->type
.referencep
= TRUE
;
5569 /* Make a range type. */
5572 ieee_range_type (void *p
, bfd_signed_vma low
, bfd_signed_vma high
)
5574 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5576 bfd_boolean unsignedp
, localp
;
5578 size
= info
->type_stack
->type
.size
;
5579 unsignedp
= info
->type_stack
->type
.unsignedp
;
5580 localp
= info
->type_stack
->type
.localp
;
5581 ieee_pop_unused_type (info
);
5582 return (ieee_define_type (info
, size
, unsignedp
, localp
)
5583 && ieee_write_number (info
, 'R')
5584 && ieee_write_number (info
, (bfd_vma
) low
)
5585 && ieee_write_number (info
, (bfd_vma
) high
)
5586 && ieee_write_number (info
, unsignedp
? 0 : 1)
5587 && ieee_write_number (info
, size
));
5590 /* Make an array type. */
5593 ieee_array_type (void *p
, bfd_signed_vma low
, bfd_signed_vma high
,
5594 bfd_boolean stringp ATTRIBUTE_UNUSED
)
5596 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5597 unsigned int eleindx
;
5600 struct ieee_modified_type
*m
= NULL
;
5601 struct ieee_modified_array_type
*a
;
5603 /* IEEE does not store the range, so we just ignore it. */
5604 ieee_pop_unused_type (info
);
5605 localp
= info
->type_stack
->type
.localp
;
5606 size
= info
->type_stack
->type
.size
;
5607 eleindx
= ieee_pop_type (info
);
5609 /* If we don't know the range, treat the size as exactly one
5612 size
*= (high
- low
) + 1;
5616 m
= ieee_get_modified_info (info
, eleindx
);
5620 for (a
= m
->arrays
; a
!= NULL
; a
= a
->next
)
5622 if (a
->low
== low
&& a
->high
== high
)
5623 return ieee_push_type (info
, a
->indx
, size
, FALSE
, FALSE
);
5627 if (! ieee_define_type (info
, size
, FALSE
, localp
)
5628 || ! ieee_write_number (info
, low
== 0 ? 'Z' : 'C')
5629 || ! ieee_write_number (info
, eleindx
))
5633 if (! ieee_write_number (info
, low
))
5637 if (! ieee_write_number (info
, high
+ 1))
5642 a
= (struct ieee_modified_array_type
*) xmalloc (sizeof *a
);
5643 memset (a
, 0, sizeof *a
);
5645 a
->indx
= info
->type_stack
->type
.indx
;
5649 a
->next
= m
->arrays
;
5656 /* Make a set type. */
5659 ieee_set_type (void *p
, bfd_boolean bitstringp ATTRIBUTE_UNUSED
)
5661 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5663 unsigned int eleindx
;
5665 localp
= info
->type_stack
->type
.localp
;
5666 eleindx
= ieee_pop_type (info
);
5668 /* FIXME: We don't know the size, so we just use 4. */
5670 return (ieee_define_type (info
, 0, TRUE
, localp
)
5671 && ieee_write_number (info
, 's')
5672 && ieee_write_number (info
, 4)
5673 && ieee_write_number (info
, eleindx
));
5676 /* Make an offset type. */
5679 ieee_offset_type (void *p
)
5681 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5682 unsigned int targetindx
, baseindx
;
5684 targetindx
= ieee_pop_type (info
);
5685 baseindx
= ieee_pop_type (info
);
5687 /* FIXME: The MRI C++ compiler does not appear to generate any
5688 useful type information about an offset type. It just records a
5689 pointer to member as an integer. The MRI/HP IEEE spec does
5690 describe a pmisc record which can be used for a pointer to
5691 member. Unfortunately, it does not describe the target type,
5692 which seems pretty important. I'm going to punt this for now. */
5694 return ieee_int_type (p
, 4, TRUE
);
5697 /* Make a method type. */
5700 ieee_method_type (void *p
, bfd_boolean domain
, int argcount
,
5701 bfd_boolean varargs
)
5703 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5705 /* FIXME: The MRI/HP IEEE spec defines a pmisc record to use for a
5706 method, but the definition is incomplete. We just output an 'x'
5710 ieee_pop_unused_type (info
);
5712 return ieee_function_type (p
, argcount
, varargs
);
5715 /* Make a const qualified type. */
5718 ieee_const_type (void *p
)
5720 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5722 bfd_boolean unsignedp
, localp
;
5724 struct ieee_modified_type
*m
= NULL
;
5726 size
= info
->type_stack
->type
.size
;
5727 unsignedp
= info
->type_stack
->type
.unsignedp
;
5728 localp
= info
->type_stack
->type
.localp
;
5729 indx
= ieee_pop_type (info
);
5733 m
= ieee_get_modified_info (info
, indx
);
5737 if (m
->const_qualified
> 0)
5738 return ieee_push_type (info
, m
->const_qualified
, size
, unsignedp
,
5742 if (! ieee_define_type (info
, size
, unsignedp
, localp
)
5743 || ! ieee_write_number (info
, 'n')
5744 || ! ieee_write_number (info
, 1)
5745 || ! ieee_write_number (info
, indx
))
5749 m
->const_qualified
= info
->type_stack
->type
.indx
;
5754 /* Make a volatile qualified type. */
5757 ieee_volatile_type (void *p
)
5759 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5761 bfd_boolean unsignedp
, localp
;
5763 struct ieee_modified_type
*m
= NULL
;
5765 size
= info
->type_stack
->type
.size
;
5766 unsignedp
= info
->type_stack
->type
.unsignedp
;
5767 localp
= info
->type_stack
->type
.localp
;
5768 indx
= ieee_pop_type (info
);
5772 m
= ieee_get_modified_info (info
, indx
);
5776 if (m
->volatile_qualified
> 0)
5777 return ieee_push_type (info
, m
->volatile_qualified
, size
, unsignedp
,
5781 if (! ieee_define_type (info
, size
, unsignedp
, localp
)
5782 || ! ieee_write_number (info
, 'n')
5783 || ! ieee_write_number (info
, 2)
5784 || ! ieee_write_number (info
, indx
))
5788 m
->volatile_qualified
= info
->type_stack
->type
.indx
;
5793 /* Convert an enum debug_visibility into a CXXFLAGS value. */
5796 ieee_vis_to_flags (enum debug_visibility visibility
)
5802 case DEBUG_VISIBILITY_PUBLIC
:
5803 return CXXFLAGS_VISIBILITY_PUBLIC
;
5804 case DEBUG_VISIBILITY_PRIVATE
:
5805 return CXXFLAGS_VISIBILITY_PRIVATE
;
5806 case DEBUG_VISIBILITY_PROTECTED
:
5807 return CXXFLAGS_VISIBILITY_PROTECTED
;
5812 /* Start defining a struct type. We build it in the strdef field on
5813 the stack, to avoid confusing type definitions required by the
5814 fields with the struct type itself. */
5817 ieee_start_struct_type (void *p
, const char *tag
, unsigned int id
,
5818 bfd_boolean structp
, unsigned int size
)
5820 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5821 bfd_boolean localp
, ignorep
;
5825 struct ieee_name_type_hash_entry
*h
;
5826 struct ieee_name_type
*nt
, *ntlook
;
5827 struct ieee_buflist strdef
;
5832 /* We need to create a tag for internal use even if we don't want
5833 one for external use. This will let us refer to an anonymous
5842 sprintf (ab
, "__anon%u", id
);
5847 /* If we already have references to the tag, we must use the
5848 existing type index. */
5849 h
= ieee_name_type_hash_lookup (&info
->tags
, look
, TRUE
, copy
);
5854 for (ntlook
= h
->types
; ntlook
!= NULL
; ntlook
= ntlook
->next
)
5856 if (ntlook
->id
== id
)
5858 else if (! ntlook
->type
.localp
)
5860 /* We are creating a duplicate definition of a globally
5861 defined tag. Force it to be local to avoid
5869 assert (localp
== nt
->type
.localp
);
5870 if (nt
->kind
== DEBUG_KIND_ILLEGAL
&& ! localp
)
5872 /* We've already seen a global definition of the type.
5873 Ignore this new definition. */
5879 nt
= (struct ieee_name_type
*) xmalloc (sizeof *nt
);
5880 memset (nt
, 0, sizeof *nt
);
5882 nt
->type
.name
= h
->root
.string
;
5883 nt
->next
= h
->types
;
5885 nt
->type
.indx
= info
->type_indx
;
5889 nt
->kind
= DEBUG_KIND_ILLEGAL
;
5891 if (! ieee_init_buffer (info
, &strdef
)
5892 || ! ieee_define_named_type (info
, tag
, nt
->type
.indx
, size
, TRUE
,
5894 || ! ieee_write_number (info
, structp
? 'S' : 'U')
5895 || ! ieee_write_number (info
, size
))
5902 /* We never want nt->type.name to be NULL. We want the rest of
5903 the type to be the object set up on the type stack; it will
5904 have a NULL name if tag is NULL. */
5905 hold
= nt
->type
.name
;
5906 nt
->type
= info
->type_stack
->type
;
5907 nt
->type
.name
= hold
;
5910 info
->type_stack
->type
.name
= tag
;
5911 info
->type_stack
->type
.strdef
= strdef
;
5912 info
->type_stack
->type
.ignorep
= ignorep
;
5917 /* Add a field to a struct. */
5920 ieee_struct_field (void *p
, const char *name
, bfd_vma bitpos
, bfd_vma bitsize
,
5921 enum debug_visibility visibility
)
5923 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
5925 bfd_boolean unsignedp
;
5926 bfd_boolean referencep
;
5931 assert (info
->type_stack
!= NULL
5932 && info
->type_stack
->next
!= NULL
5933 && ! ieee_buffer_emptyp (&info
->type_stack
->next
->type
.strdef
));
5935 /* If we are ignoring this struct definition, just pop and ignore
5937 if (info
->type_stack
->next
->type
.ignorep
)
5939 ieee_pop_unused_type (info
);
5943 size
= info
->type_stack
->type
.size
;
5944 unsignedp
= info
->type_stack
->type
.unsignedp
;
5945 referencep
= info
->type_stack
->type
.referencep
;
5946 localp
= info
->type_stack
->type
.localp
;
5947 indx
= ieee_pop_type (info
);
5950 info
->type_stack
->type
.localp
= TRUE
;
5952 if (info
->type_stack
->type
.classdef
!= NULL
)
5957 /* This is a class. We must add a description of this field to
5958 the class records we are building. */
5960 flags
= ieee_vis_to_flags (visibility
);
5961 nindx
= info
->type_stack
->type
.classdef
->indx
;
5962 if (! ieee_change_buffer (info
,
5963 &info
->type_stack
->type
.classdef
->pmiscbuf
)
5964 || ! ieee_write_asn (info
, nindx
, 'd')
5965 || ! ieee_write_asn (info
, nindx
, flags
)
5966 || ! ieee_write_atn65 (info
, nindx
, name
)
5967 || ! ieee_write_atn65 (info
, nindx
, name
))
5969 info
->type_stack
->type
.classdef
->pmisccount
+= 4;
5975 /* We need to output a record recording that this field is
5976 really of reference type. We put this on the refs field
5977 of classdef, so that it can be appended to the C++
5978 records after the class is defined. */
5980 nindx
= info
->name_indx
;
5983 if (! ieee_change_buffer (info
,
5984 &info
->type_stack
->type
.classdef
->refs
)
5985 || ! ieee_write_byte (info
, (int) ieee_nn_record
)
5986 || ! ieee_write_number (info
, nindx
)
5987 || ! ieee_write_id (info
, "")
5988 || ! ieee_write_2bytes (info
, (int) ieee_atn_record_enum
)
5989 || ! ieee_write_number (info
, nindx
)
5990 || ! ieee_write_number (info
, 0)
5991 || ! ieee_write_number (info
, 62)
5992 || ! ieee_write_number (info
, 80)
5993 || ! ieee_write_number (info
, 4)
5994 || ! ieee_write_asn (info
, nindx
, 'R')
5995 || ! ieee_write_asn (info
, nindx
, 3)
5996 || ! ieee_write_atn65 (info
, nindx
, info
->type_stack
->type
.name
)
5997 || ! ieee_write_atn65 (info
, nindx
, name
))
6002 /* If the bitsize doesn't match the expected size, we need to output
6004 if (size
== 0 || bitsize
== 0 || bitsize
== size
* 8)
6005 offset
= bitpos
/ 8;
6008 if (! ieee_define_type (info
, 0, unsignedp
,
6009 info
->type_stack
->type
.localp
)
6010 || ! ieee_write_number (info
, 'g')
6011 || ! ieee_write_number (info
, unsignedp
? 0 : 1)
6012 || ! ieee_write_number (info
, bitsize
)
6013 || ! ieee_write_number (info
, indx
))
6015 indx
= ieee_pop_type (info
);
6019 /* Switch to the struct we are building in order to output this
6020 field definition. */
6021 return (ieee_change_buffer (info
, &info
->type_stack
->type
.strdef
)
6022 && ieee_write_id (info
, name
)
6023 && ieee_write_number (info
, indx
)
6024 && ieee_write_number (info
, offset
));
6027 /* Finish up a struct type. */
6030 ieee_end_struct_type (void *p
)
6032 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6033 struct ieee_buflist
*pb
;
6035 assert (info
->type_stack
!= NULL
6036 && ! ieee_buffer_emptyp (&info
->type_stack
->type
.strdef
));
6038 /* If we were ignoring this struct definition because it was a
6039 duplicate defintion, just through away whatever bytes we have
6040 accumulated. Leave the type on the stack. */
6041 if (info
->type_stack
->type
.ignorep
)
6044 /* If this is not a duplicate definition of this tag, then localp
6045 will be FALSE, and we can put it in the global type block.
6046 FIXME: We should avoid outputting duplicate definitions which are
6048 if (! info
->type_stack
->type
.localp
)
6050 /* Make sure we have started the global type block. */
6051 if (ieee_buffer_emptyp (&info
->global_types
))
6053 if (! ieee_change_buffer (info
, &info
->global_types
)
6054 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
6055 || ! ieee_write_byte (info
, 2)
6056 || ! ieee_write_number (info
, 0)
6057 || ! ieee_write_id (info
, ""))
6060 pb
= &info
->global_types
;
6064 /* Make sure we have started the types block. */
6065 if (ieee_buffer_emptyp (&info
->types
))
6067 if (! ieee_change_buffer (info
, &info
->types
)
6068 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
6069 || ! ieee_write_byte (info
, 1)
6070 || ! ieee_write_number (info
, 0)
6071 || ! ieee_write_id (info
, info
->modname
))
6077 /* Append the struct definition to the types. */
6078 if (! ieee_append_buffer (info
, pb
, &info
->type_stack
->type
.strdef
)
6079 || ! ieee_init_buffer (info
, &info
->type_stack
->type
.strdef
))
6082 /* Leave the struct on the type stack. */
6087 /* Start a class type. */
6090 ieee_start_class_type (void *p
, const char *tag
, unsigned int id
,
6091 bfd_boolean structp
, unsigned int size
,
6092 bfd_boolean vptr
, bfd_boolean ownvptr
)
6094 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6096 struct ieee_buflist pmiscbuf
;
6098 struct ieee_type_class
*classdef
;
6100 /* A C++ class is output as a C++ struct along with a set of pmisc
6101 records describing the class. */
6103 /* We need to have a name so that we can associate the struct and
6109 t
= (char *) xmalloc (20);
6110 sprintf (t
, "__anon%u", id
);
6114 /* We can't write out the virtual table information until we have
6115 finished the class, because we don't know the virtual table size.
6116 We get the size from the largest voffset we see. */
6118 if (vptr
&& ! ownvptr
)
6120 vclass
= info
->type_stack
->type
.name
;
6121 assert (vclass
!= NULL
);
6122 /* We don't call ieee_pop_unused_type, since the class should
6124 (void) ieee_pop_type (info
);
6127 if (! ieee_start_struct_type (p
, tag
, id
, structp
, size
))
6130 indx
= info
->name_indx
;
6133 /* We write out pmisc records into the classdef field. We will
6134 write out the pmisc start after we know the number of records we
6136 if (! ieee_init_buffer (info
, &pmiscbuf
)
6137 || ! ieee_change_buffer (info
, &pmiscbuf
)
6138 || ! ieee_write_asn (info
, indx
, 'T')
6139 || ! ieee_write_asn (info
, indx
, structp
? 'o' : 'u')
6140 || ! ieee_write_atn65 (info
, indx
, tag
))
6143 classdef
= (struct ieee_type_class
*) xmalloc (sizeof *classdef
);
6144 memset (classdef
, 0, sizeof *classdef
);
6146 classdef
->indx
= indx
;
6147 classdef
->pmiscbuf
= pmiscbuf
;
6148 classdef
->pmisccount
= 3;
6149 classdef
->vclass
= vclass
;
6150 classdef
->ownvptr
= ownvptr
;
6152 info
->type_stack
->type
.classdef
= classdef
;
6157 /* Add a static member to a class. */
6160 ieee_class_static_member (void *p
, const char *name
, const char *physname
,
6161 enum debug_visibility visibility
)
6163 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6167 /* We don't care about the type. Hopefully there will be a call to
6168 ieee_variable declaring the physical name and the type, since
6169 that is where an IEEE consumer must get the type. */
6170 ieee_pop_unused_type (info
);
6172 assert (info
->type_stack
!= NULL
6173 && info
->type_stack
->type
.classdef
!= NULL
);
6175 flags
= ieee_vis_to_flags (visibility
);
6176 flags
|= CXXFLAGS_STATIC
;
6178 nindx
= info
->type_stack
->type
.classdef
->indx
;
6180 if (! ieee_change_buffer (info
, &info
->type_stack
->type
.classdef
->pmiscbuf
)
6181 || ! ieee_write_asn (info
, nindx
, 'd')
6182 || ! ieee_write_asn (info
, nindx
, flags
)
6183 || ! ieee_write_atn65 (info
, nindx
, name
)
6184 || ! ieee_write_atn65 (info
, nindx
, physname
))
6186 info
->type_stack
->type
.classdef
->pmisccount
+= 4;
6191 /* Add a base class to a class. */
6194 ieee_class_baseclass (void *p
, bfd_vma bitpos
, bfd_boolean
virtual,
6195 enum debug_visibility visibility
)
6197 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6205 assert (info
->type_stack
!= NULL
6206 && info
->type_stack
->type
.name
!= NULL
6207 && info
->type_stack
->next
!= NULL
6208 && info
->type_stack
->next
->type
.classdef
!= NULL
6209 && ! ieee_buffer_emptyp (&info
->type_stack
->next
->type
.strdef
));
6211 bname
= info
->type_stack
->type
.name
;
6212 localp
= info
->type_stack
->type
.localp
;
6213 bindx
= ieee_pop_type (info
);
6215 /* We are currently defining both a struct and a class. We must
6216 write out a field definition in the struct which holds the base
6217 class. The stabs debugging reader will create a field named
6218 _vb$CLASS for a virtual base class, so we just use that. FIXME:
6219 we should not depend upon a detail of stabs debugging. */
6222 fname
= (char *) xmalloc (strlen (bname
) + sizeof "_vb$");
6223 sprintf (fname
, "_vb$%s", bname
);
6224 flags
= BASEFLAGS_VIRTUAL
;
6229 info
->type_stack
->type
.localp
= TRUE
;
6231 fname
= (char *) xmalloc (strlen (bname
) + sizeof "_b$");
6232 sprintf (fname
, "_b$%s", bname
);
6234 if (! ieee_change_buffer (info
, &info
->type_stack
->type
.strdef
)
6235 || ! ieee_write_id (info
, fname
)
6236 || ! ieee_write_number (info
, bindx
)
6237 || ! ieee_write_number (info
, bitpos
/ 8))
6242 if (visibility
== DEBUG_VISIBILITY_PRIVATE
)
6243 flags
|= BASEFLAGS_PRIVATE
;
6245 nindx
= info
->type_stack
->type
.classdef
->indx
;
6247 if (! ieee_change_buffer (info
, &info
->type_stack
->type
.classdef
->pmiscbuf
)
6248 || ! ieee_write_asn (info
, nindx
, 'b')
6249 || ! ieee_write_asn (info
, nindx
, flags
)
6250 || ! ieee_write_atn65 (info
, nindx
, bname
)
6251 || ! ieee_write_asn (info
, nindx
, 0)
6252 || ! ieee_write_atn65 (info
, nindx
, fname
))
6254 info
->type_stack
->type
.classdef
->pmisccount
+= 5;
6261 /* Start building a method for a class. */
6264 ieee_class_start_method (void *p
, const char *name
)
6266 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6268 assert (info
->type_stack
!= NULL
6269 && info
->type_stack
->type
.classdef
!= NULL
6270 && info
->type_stack
->type
.classdef
->method
== NULL
);
6272 info
->type_stack
->type
.classdef
->method
= name
;
6277 /* Define a new method variant, either static or not. */
6280 ieee_class_method_var (struct ieee_handle
*info
, const char *physname
,
6281 enum debug_visibility visibility
,
6282 bfd_boolean staticp
, bfd_boolean constp
,
6283 bfd_boolean volatilep
, bfd_vma voffset
,
6284 bfd_boolean context
)
6288 bfd_boolean
virtual;
6290 /* We don't need the type of the method. An IEEE consumer which
6291 wants the type must track down the function by the physical name
6292 and get the type from that. */
6293 ieee_pop_unused_type (info
);
6295 /* We don't use the context. FIXME: We probably ought to use it to
6296 adjust the voffset somehow, but I don't really know how. */
6298 ieee_pop_unused_type (info
);
6300 assert (info
->type_stack
!= NULL
6301 && info
->type_stack
->type
.classdef
!= NULL
6302 && info
->type_stack
->type
.classdef
->method
!= NULL
);
6304 flags
= ieee_vis_to_flags (visibility
);
6306 /* FIXME: We never set CXXFLAGS_OVERRIDE, CXXFLAGS_OPERATOR,
6307 CXXFLAGS_CTORDTOR, CXXFLAGS_CTOR, or CXXFLAGS_INLINE. */
6310 flags
|= CXXFLAGS_STATIC
;
6312 flags
|= CXXFLAGS_CONST
;
6314 flags
|= CXXFLAGS_VOLATILE
;
6316 nindx
= info
->type_stack
->type
.classdef
->indx
;
6318 virtual = context
|| voffset
> 0;
6320 if (! ieee_change_buffer (info
,
6321 &info
->type_stack
->type
.classdef
->pmiscbuf
)
6322 || ! ieee_write_asn (info
, nindx
, virtual ? 'v' : 'm')
6323 || ! ieee_write_asn (info
, nindx
, flags
)
6324 || ! ieee_write_atn65 (info
, nindx
,
6325 info
->type_stack
->type
.classdef
->method
)
6326 || ! ieee_write_atn65 (info
, nindx
, physname
))
6331 if (voffset
> info
->type_stack
->type
.classdef
->voffset
)
6332 info
->type_stack
->type
.classdef
->voffset
= voffset
;
6333 if (! ieee_write_asn (info
, nindx
, voffset
))
6335 ++info
->type_stack
->type
.classdef
->pmisccount
;
6338 if (! ieee_write_asn (info
, nindx
, 0))
6341 info
->type_stack
->type
.classdef
->pmisccount
+= 5;
6346 /* Define a new method variant. */
6349 ieee_class_method_variant (void *p
, const char *physname
,
6350 enum debug_visibility visibility
,
6351 bfd_boolean constp
, bfd_boolean volatilep
,
6352 bfd_vma voffset
, bfd_boolean context
)
6354 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6356 return ieee_class_method_var (info
, physname
, visibility
, FALSE
, constp
,
6357 volatilep
, voffset
, context
);
6360 /* Define a new static method variant. */
6363 ieee_class_static_method_variant (void *p
, const char *physname
,
6364 enum debug_visibility visibility
,
6365 bfd_boolean constp
, bfd_boolean volatilep
)
6367 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6369 return ieee_class_method_var (info
, physname
, visibility
, TRUE
, constp
,
6370 volatilep
, 0, FALSE
);
6373 /* Finish up a method. */
6376 ieee_class_end_method (void *p
)
6378 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6380 assert (info
->type_stack
!= NULL
6381 && info
->type_stack
->type
.classdef
!= NULL
6382 && info
->type_stack
->type
.classdef
->method
!= NULL
);
6384 info
->type_stack
->type
.classdef
->method
= NULL
;
6389 /* Finish up a class. */
6392 ieee_end_class_type (void *p
)
6394 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6397 assert (info
->type_stack
!= NULL
6398 && info
->type_stack
->type
.classdef
!= NULL
);
6400 /* If we were ignoring this class definition because it was a
6401 duplicate definition, just through away whatever bytes we have
6402 accumulated. Leave the type on the stack. */
6403 if (info
->type_stack
->type
.ignorep
)
6406 nindx
= info
->type_stack
->type
.classdef
->indx
;
6408 /* If we have a virtual table, we can write out the information now. */
6409 if (info
->type_stack
->type
.classdef
->vclass
!= NULL
6410 || info
->type_stack
->type
.classdef
->ownvptr
)
6412 if (! ieee_change_buffer (info
,
6413 &info
->type_stack
->type
.classdef
->pmiscbuf
)
6414 || ! ieee_write_asn (info
, nindx
, 'z')
6415 || ! ieee_write_atn65 (info
, nindx
, "")
6416 || ! ieee_write_asn (info
, nindx
,
6417 info
->type_stack
->type
.classdef
->voffset
))
6419 if (info
->type_stack
->type
.classdef
->ownvptr
)
6421 if (! ieee_write_atn65 (info
, nindx
, ""))
6426 if (! ieee_write_atn65 (info
, nindx
,
6427 info
->type_stack
->type
.classdef
->vclass
))
6430 if (! ieee_write_asn (info
, nindx
, 0))
6432 info
->type_stack
->type
.classdef
->pmisccount
+= 5;
6435 /* Now that we know the number of pmisc records, we can write out
6436 the atn62 which starts the pmisc records, and append them to the
6439 if (! ieee_change_buffer (info
, &info
->cxx
)
6440 || ! ieee_write_byte (info
, (int) ieee_nn_record
)
6441 || ! ieee_write_number (info
, nindx
)
6442 || ! ieee_write_id (info
, "")
6443 || ! ieee_write_2bytes (info
, (int) ieee_atn_record_enum
)
6444 || ! ieee_write_number (info
, nindx
)
6445 || ! ieee_write_number (info
, 0)
6446 || ! ieee_write_number (info
, 62)
6447 || ! ieee_write_number (info
, 80)
6448 || ! ieee_write_number (info
,
6449 info
->type_stack
->type
.classdef
->pmisccount
))
6452 if (! ieee_append_buffer (info
, &info
->cxx
,
6453 &info
->type_stack
->type
.classdef
->pmiscbuf
))
6455 if (! ieee_buffer_emptyp (&info
->type_stack
->type
.classdef
->refs
))
6457 if (! ieee_append_buffer (info
, &info
->cxx
,
6458 &info
->type_stack
->type
.classdef
->refs
))
6462 return ieee_end_struct_type (p
);
6465 /* Push a previously seen typedef onto the type stack. */
6468 ieee_typedef_type (void *p
, const char *name
)
6470 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6471 struct ieee_name_type_hash_entry
*h
;
6472 struct ieee_name_type
*nt
;
6474 h
= ieee_name_type_hash_lookup (&info
->typedefs
, name
, FALSE
, FALSE
);
6476 /* h should never be NULL, since that would imply that the generic
6477 debugging code has asked for a typedef which it has not yet
6481 /* We always use the most recently defined type for this name, which
6482 will be the first one on the list. */
6485 if (! ieee_push_type (info
, nt
->type
.indx
, nt
->type
.size
,
6486 nt
->type
.unsignedp
, nt
->type
.localp
))
6489 /* Copy over any other type information we may have. */
6490 info
->type_stack
->type
= nt
->type
;
6495 /* Push a tagged type onto the type stack. */
6498 ieee_tag_type (void *p
, const char *name
, unsigned int id
,
6499 enum debug_type_kind kind
)
6501 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6505 struct ieee_name_type_hash_entry
*h
;
6506 struct ieee_name_type
*nt
;
6508 if (kind
== DEBUG_KIND_ENUM
)
6510 struct ieee_defined_enum
*e
;
6514 for (e
= info
->enums
; e
!= NULL
; e
= e
->next
)
6515 if (e
->tag
!= NULL
&& strcmp (e
->tag
, name
) == 0)
6516 return ieee_push_type (info
, e
->indx
, 0, TRUE
, FALSE
);
6518 e
= (struct ieee_defined_enum
*) xmalloc (sizeof *e
);
6519 memset (e
, 0, sizeof *e
);
6521 e
->indx
= info
->type_indx
;
6526 e
->next
= info
->enums
;
6529 return ieee_push_type (info
, e
->indx
, 0, TRUE
, FALSE
);
6537 sprintf (ab
, "__anon%u", id
);
6542 h
= ieee_name_type_hash_lookup (&info
->tags
, name
, TRUE
, copy
);
6546 for (nt
= h
->types
; nt
!= NULL
; nt
= nt
->next
)
6550 if (! ieee_push_type (info
, nt
->type
.indx
, nt
->type
.size
,
6551 nt
->type
.unsignedp
, nt
->type
.localp
))
6553 /* Copy over any other type information we may have. */
6554 info
->type_stack
->type
= nt
->type
;
6558 if (! nt
->type
.localp
)
6560 /* This is a duplicate of a global type, so it must be
6566 nt
= (struct ieee_name_type
*) xmalloc (sizeof *nt
);
6567 memset (nt
, 0, sizeof *nt
);
6570 nt
->type
.name
= h
->root
.string
;
6571 nt
->type
.indx
= info
->type_indx
;
6572 nt
->type
.localp
= localp
;
6576 nt
->next
= h
->types
;
6579 if (! ieee_push_type (info
, nt
->type
.indx
, 0, FALSE
, localp
))
6582 info
->type_stack
->type
.name
= h
->root
.string
;
6587 /* Output a typedef. */
6590 ieee_typdef (void *p
, const char *name
)
6592 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6593 struct ieee_write_type type
;
6597 struct ieee_name_type_hash_entry
*h
;
6598 struct ieee_name_type
*nt
;
6600 type
= info
->type_stack
->type
;
6603 /* If this is a simple builtin type using a builtin name, we don't
6604 want to output the typedef itself. We also want to change the
6605 type index to correspond to the name being used. We recognize
6606 names used in stabs debugging output even if they don't exactly
6607 correspond to the names used for the IEEE builtin types. */
6609 if (indx
<= (unsigned int) builtin_bcd_float
)
6611 switch ((enum builtin_types
) indx
)
6617 if (strcmp (name
, "void") == 0)
6621 case builtin_signed_char
:
6623 if (strcmp (name
, "signed char") == 0)
6625 indx
= (unsigned int) builtin_signed_char
;
6628 else if (strcmp (name
, "char") == 0)
6630 indx
= (unsigned int) builtin_char
;
6635 case builtin_unsigned_char
:
6636 if (strcmp (name
, "unsigned char") == 0)
6640 case builtin_signed_short_int
:
6642 case builtin_short_int
:
6643 case builtin_signed_short
:
6644 if (strcmp (name
, "signed short int") == 0)
6646 indx
= (unsigned int) builtin_signed_short_int
;
6649 else if (strcmp (name
, "short") == 0)
6651 indx
= (unsigned int) builtin_short
;
6654 else if (strcmp (name
, "short int") == 0)
6656 indx
= (unsigned int) builtin_short_int
;
6659 else if (strcmp (name
, "signed short") == 0)
6661 indx
= (unsigned int) builtin_signed_short
;
6666 case builtin_unsigned_short_int
:
6667 case builtin_unsigned_short
:
6668 if (strcmp (name
, "unsigned short int") == 0
6669 || strcmp (name
, "short unsigned int") == 0)
6671 indx
= builtin_unsigned_short_int
;
6674 else if (strcmp (name
, "unsigned short") == 0)
6676 indx
= builtin_unsigned_short
;
6681 case builtin_signed_long
:
6682 case builtin_int
: /* FIXME: Size depends upon architecture. */
6684 if (strcmp (name
, "signed long") == 0)
6686 indx
= builtin_signed_long
;
6689 else if (strcmp (name
, "int") == 0)
6694 else if (strcmp (name
, "long") == 0
6695 || strcmp (name
, "long int") == 0)
6697 indx
= builtin_long
;
6702 case builtin_unsigned_long
:
6703 case builtin_unsigned
: /* FIXME: Size depends upon architecture. */
6704 case builtin_unsigned_int
: /* FIXME: Like builtin_unsigned. */
6705 if (strcmp (name
, "unsigned long") == 0
6706 || strcmp (name
, "long unsigned int") == 0)
6708 indx
= builtin_unsigned_long
;
6711 else if (strcmp (name
, "unsigned") == 0)
6713 indx
= builtin_unsigned
;
6716 else if (strcmp (name
, "unsigned int") == 0)
6718 indx
= builtin_unsigned_int
;
6723 case builtin_signed_long_long
:
6724 if (strcmp (name
, "signed long long") == 0
6725 || strcmp (name
, "long long int") == 0)
6729 case builtin_unsigned_long_long
:
6730 if (strcmp (name
, "unsigned long long") == 0
6731 || strcmp (name
, "long long unsigned int") == 0)
6736 if (strcmp (name
, "float") == 0)
6740 case builtin_double
:
6741 if (strcmp (name
, "double") == 0)
6745 case builtin_long_double
:
6746 if (strcmp (name
, "long double") == 0)
6750 case builtin_long_long_double
:
6751 if (strcmp (name
, "long long double") == 0)
6760 h
= ieee_name_type_hash_lookup (&info
->typedefs
, name
, TRUE
, FALSE
);
6764 /* See if we have already defined this type with this name. */
6765 localp
= type
.localp
;
6766 for (nt
= h
->types
; nt
!= NULL
; nt
= nt
->next
)
6770 /* If this is a global definition, then we don't need to
6771 do anything here. */
6772 if (! nt
->type
.localp
)
6774 ieee_pop_unused_type (info
);
6780 /* This is a duplicate definition, so make this one local. */
6785 /* We need to add a new typedef for this type. */
6787 nt
= (struct ieee_name_type
*) xmalloc (sizeof *nt
);
6788 memset (nt
, 0, sizeof *nt
);
6791 nt
->type
.name
= name
;
6792 nt
->type
.localp
= localp
;
6793 nt
->kind
= DEBUG_KIND_ILLEGAL
;
6795 nt
->next
= h
->types
;
6800 /* This is one of the builtin typedefs, so we don't need to
6801 actually define it. */
6802 ieee_pop_unused_type (info
);
6806 indx
= ieee_pop_type (info
);
6808 if (! ieee_define_named_type (info
, name
, (unsigned int) -1, type
.size
,
6809 type
.unsignedp
, localp
,
6810 (struct ieee_buflist
*) NULL
)
6811 || ! ieee_write_number (info
, 'T')
6812 || ! ieee_write_number (info
, indx
))
6815 /* Remove the type we just added to the type stack. This should not
6816 be ieee_pop_unused_type, since the type is used, we just don't
6818 (void) ieee_pop_type (info
);
6823 /* Output a tag for a type. We don't have to do anything here. */
6826 ieee_tag (void *p
, const char *name ATTRIBUTE_UNUSED
)
6828 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6830 /* This should not be ieee_pop_unused_type, since we want the type
6832 (void) ieee_pop_type (info
);
6836 /* Output an integer constant. */
6839 ieee_int_constant (void *p ATTRIBUTE_UNUSED
, const char *name ATTRIBUTE_UNUSED
,
6840 bfd_vma val ATTRIBUTE_UNUSED
)
6846 /* Output a floating point constant. */
6849 ieee_float_constant (void *p ATTRIBUTE_UNUSED
,
6850 const char *name ATTRIBUTE_UNUSED
,
6851 double val ATTRIBUTE_UNUSED
)
6857 /* Output a typed constant. */
6860 ieee_typed_constant (void *p
, const char *name ATTRIBUTE_UNUSED
,
6861 bfd_vma val ATTRIBUTE_UNUSED
)
6863 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6866 ieee_pop_unused_type (info
);
6870 /* Output a variable. */
6873 ieee_variable (void *p
, const char *name
, enum debug_var_kind kind
,
6876 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6877 unsigned int name_indx
;
6879 bfd_boolean referencep
;
6880 unsigned int type_indx
;
6884 size
= info
->type_stack
->type
.size
;
6885 referencep
= info
->type_stack
->type
.referencep
;
6886 type_indx
= ieee_pop_type (info
);
6888 assert (! ieee_buffer_emptyp (&info
->vars
));
6889 if (! ieee_change_buffer (info
, &info
->vars
))
6892 name_indx
= info
->name_indx
;
6895 /* Write out an NN and an ATN record for this variable. */
6896 if (! ieee_write_byte (info
, (int) ieee_nn_record
)
6897 || ! ieee_write_number (info
, name_indx
)
6898 || ! ieee_write_id (info
, name
)
6899 || ! ieee_write_2bytes (info
, (int) ieee_atn_record_enum
)
6900 || ! ieee_write_number (info
, name_indx
)
6901 || ! ieee_write_number (info
, type_indx
))
6909 if (! ieee_write_number (info
, 8)
6910 || ! ieee_add_range (info
, FALSE
, val
, val
+ size
))
6916 if (! ieee_write_number (info
, 3)
6917 || ! ieee_add_range (info
, FALSE
, val
, val
+ size
))
6922 case DEBUG_LOCAL_STATIC
:
6923 if (! ieee_write_number (info
, 3)
6924 || ! ieee_add_range (info
, FALSE
, val
, val
+ size
))
6930 if (! ieee_write_number (info
, 1)
6931 || ! ieee_write_number (info
, val
))
6936 case DEBUG_REGISTER
:
6937 if (! ieee_write_number (info
, 2)
6938 || ! ieee_write_number (info
,
6939 ieee_genreg_to_regno (info
->abfd
, val
)))
6948 if (! ieee_write_asn (info
, name_indx
, val
))
6952 /* If this is really a reference type, then we just output it with
6953 pointer type, and must now output a C++ record indicating that it
6954 is really reference type. */
6959 nindx
= info
->name_indx
;
6962 /* If this is a global variable, we want to output the misc
6963 record in the C++ misc record block. Otherwise, we want to
6964 output it just after the variable definition, which is where
6965 the current buffer is. */
6968 if (! ieee_change_buffer (info
, &info
->cxx
))
6972 if (! ieee_write_byte (info
, (int) ieee_nn_record
)
6973 || ! ieee_write_number (info
, nindx
)
6974 || ! ieee_write_id (info
, "")
6975 || ! ieee_write_2bytes (info
, (int) ieee_atn_record_enum
)
6976 || ! ieee_write_number (info
, nindx
)
6977 || ! ieee_write_number (info
, 0)
6978 || ! ieee_write_number (info
, 62)
6979 || ! ieee_write_number (info
, 80)
6980 || ! ieee_write_number (info
, 3)
6981 || ! ieee_write_asn (info
, nindx
, 'R')
6982 || ! ieee_write_asn (info
, nindx
, refflag
)
6983 || ! ieee_write_atn65 (info
, nindx
, name
))
6990 /* Start outputting information for a function. */
6993 ieee_start_function (void *p
, const char *name
, bfd_boolean global
)
6995 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
6996 bfd_boolean referencep
;
6997 unsigned int retindx
, typeindx
;
6999 referencep
= info
->type_stack
->type
.referencep
;
7000 retindx
= ieee_pop_type (info
);
7002 /* Besides recording a BB4 or BB6 block, we record the type of the
7003 function in the BB1 typedef block. We can't write out the full
7004 type until we have seen all the parameters, so we accumulate it
7005 in info->fntype and info->fnargs. */
7006 if (! ieee_buffer_emptyp (&info
->fntype
))
7008 /* FIXME: This might happen someday if we support nested
7013 info
->fnname
= name
;
7015 /* An attribute of 0x40 means that the push mask is unknown. */
7016 if (! ieee_define_named_type (info
, name
, (unsigned int) -1, 0, FALSE
, TRUE
,
7018 || ! ieee_write_number (info
, 'x')
7019 || ! ieee_write_number (info
, 0x40)
7020 || ! ieee_write_number (info
, 0)
7021 || ! ieee_write_number (info
, 0)
7022 || ! ieee_write_number (info
, retindx
))
7025 typeindx
= ieee_pop_type (info
);
7027 if (! ieee_init_buffer (info
, &info
->fnargs
))
7029 info
->fnargcount
= 0;
7031 /* If the function return value is actually a reference type, we
7032 must add a record indicating that. */
7037 nindx
= info
->name_indx
;
7039 if (! ieee_change_buffer (info
, &info
->cxx
)
7040 || ! ieee_write_byte (info
, (int) ieee_nn_record
)
7041 || ! ieee_write_number (info
, nindx
)
7042 || ! ieee_write_id (info
, "")
7043 || ! ieee_write_2bytes (info
, (int) ieee_atn_record_enum
)
7044 || ! ieee_write_number (info
, nindx
)
7045 || ! ieee_write_number (info
, 0)
7046 || ! ieee_write_number (info
, 62)
7047 || ! ieee_write_number (info
, 80)
7048 || ! ieee_write_number (info
, 3)
7049 || ! ieee_write_asn (info
, nindx
, 'R')
7050 || ! ieee_write_asn (info
, nindx
, global
? 0 : 1)
7051 || ! ieee_write_atn65 (info
, nindx
, name
))
7055 assert (! ieee_buffer_emptyp (&info
->vars
));
7056 if (! ieee_change_buffer (info
, &info
->vars
))
7059 /* The address is written out as the first block. */
7061 ++info
->block_depth
;
7063 return (ieee_write_byte (info
, (int) ieee_bb_record_enum
)
7064 && ieee_write_byte (info
, global
? 4 : 6)
7065 && ieee_write_number (info
, 0)
7066 && ieee_write_id (info
, name
)
7067 && ieee_write_number (info
, 0)
7068 && ieee_write_number (info
, typeindx
));
7071 /* Add a function parameter. This will normally be called before the
7072 first block, so we postpone them until we see the block. */
7075 ieee_function_parameter (void *p
, const char *name
, enum debug_parm_kind kind
,
7078 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
7079 struct ieee_pending_parm
*m
, **pm
;
7081 assert (info
->block_depth
== 1);
7083 m
= (struct ieee_pending_parm
*) xmalloc (sizeof *m
);
7084 memset (m
, 0, sizeof *m
);
7088 m
->referencep
= info
->type_stack
->type
.referencep
;
7089 m
->type
= ieee_pop_type (info
);
7093 for (pm
= &info
->pending_parms
; *pm
!= NULL
; pm
= &(*pm
)->next
)
7097 /* Add the type to the fnargs list. */
7098 if (! ieee_change_buffer (info
, &info
->fnargs
)
7099 || ! ieee_write_number (info
, m
->type
))
7106 /* Output pending function parameters. */
7109 ieee_output_pending_parms (struct ieee_handle
*info
)
7111 struct ieee_pending_parm
*m
;
7112 unsigned int refcount
;
7115 for (m
= info
->pending_parms
; m
!= NULL
; m
= m
->next
)
7117 enum debug_var_kind vkind
;
7124 case DEBUG_PARM_STACK
:
7125 case DEBUG_PARM_REFERENCE
:
7126 vkind
= DEBUG_LOCAL
;
7128 case DEBUG_PARM_REG
:
7129 case DEBUG_PARM_REF_REG
:
7130 vkind
= DEBUG_REGISTER
;
7134 if (! ieee_push_type (info
, m
->type
, 0, FALSE
, FALSE
))
7136 info
->type_stack
->type
.referencep
= m
->referencep
;
7139 if (! ieee_variable ((void *) info
, m
->name
, vkind
, m
->val
))
7143 /* If there are any reference parameters, we need to output a
7144 miscellaneous record indicating them. */
7147 unsigned int nindx
, varindx
;
7149 /* FIXME: The MRI compiler outputs the demangled function name
7150 here, but we are outputting the mangled name. */
7151 nindx
= info
->name_indx
;
7153 if (! ieee_change_buffer (info
, &info
->vars
)
7154 || ! ieee_write_byte (info
, (int) ieee_nn_record
)
7155 || ! ieee_write_number (info
, nindx
)
7156 || ! ieee_write_id (info
, "")
7157 || ! ieee_write_2bytes (info
, (int) ieee_atn_record_enum
)
7158 || ! ieee_write_number (info
, nindx
)
7159 || ! ieee_write_number (info
, 0)
7160 || ! ieee_write_number (info
, 62)
7161 || ! ieee_write_number (info
, 80)
7162 || ! ieee_write_number (info
, refcount
+ 3)
7163 || ! ieee_write_asn (info
, nindx
, 'B')
7164 || ! ieee_write_atn65 (info
, nindx
, info
->fnname
)
7165 || ! ieee_write_asn (info
, nindx
, 0))
7167 for (m
= info
->pending_parms
, varindx
= 1;
7169 m
= m
->next
, varindx
++)
7173 if (! ieee_write_asn (info
, nindx
, varindx
))
7179 m
= info
->pending_parms
;
7182 struct ieee_pending_parm
*next
;
7189 info
->pending_parms
= NULL
;
7194 /* Start a block. If this is the first block, we output the address
7195 to finish the BB4 or BB6, and then output the function parameters. */
7198 ieee_start_block (void *p
, bfd_vma addr
)
7200 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
7202 if (! ieee_change_buffer (info
, &info
->vars
))
7205 if (info
->block_depth
== 1)
7207 if (! ieee_write_number (info
, addr
)
7208 || ! ieee_output_pending_parms (info
))
7213 if (! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
7214 || ! ieee_write_byte (info
, 6)
7215 || ! ieee_write_number (info
, 0)
7216 || ! ieee_write_id (info
, "")
7217 || ! ieee_write_number (info
, 0)
7218 || ! ieee_write_number (info
, 0)
7219 || ! ieee_write_number (info
, addr
))
7223 if (! ieee_start_range (info
, addr
))
7226 ++info
->block_depth
;
7234 ieee_end_block (void *p
, bfd_vma addr
)
7236 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
7238 /* The address we are given is the end of the block, but IEEE seems
7239 to want to the address of the last byte in the block, so we
7241 if (! ieee_change_buffer (info
, &info
->vars
)
7242 || ! ieee_write_byte (info
, (int) ieee_be_record_enum
)
7243 || ! ieee_write_number (info
, addr
- 1))
7246 if (! ieee_end_range (info
, addr
))
7249 --info
->block_depth
;
7251 if (addr
> info
->highaddr
)
7252 info
->highaddr
= addr
;
7257 /* End a function. */
7260 ieee_end_function (void *p
)
7262 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
7264 assert (info
->block_depth
== 1);
7266 --info
->block_depth
;
7268 /* Now we can finish up fntype, and add it to the typdef section.
7269 At this point, fntype is the 'x' type up to the argument count,
7270 and fnargs is the argument types. We must add the argument
7271 count, and we must add the level. FIXME: We don't record varargs
7272 functions correctly. In fact, stabs debugging does not give us
7273 enough information to do so. */
7274 if (! ieee_change_buffer (info
, &info
->fntype
)
7275 || ! ieee_write_number (info
, info
->fnargcount
)
7276 || ! ieee_change_buffer (info
, &info
->fnargs
)
7277 || ! ieee_write_number (info
, 0))
7280 /* Make sure the typdef block has been started. */
7281 if (ieee_buffer_emptyp (&info
->types
))
7283 if (! ieee_change_buffer (info
, &info
->types
)
7284 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
7285 || ! ieee_write_byte (info
, 1)
7286 || ! ieee_write_number (info
, 0)
7287 || ! ieee_write_id (info
, info
->modname
))
7291 if (! ieee_append_buffer (info
, &info
->types
, &info
->fntype
)
7292 || ! ieee_append_buffer (info
, &info
->types
, &info
->fnargs
))
7295 info
->fnname
= NULL
;
7296 if (! ieee_init_buffer (info
, &info
->fntype
)
7297 || ! ieee_init_buffer (info
, &info
->fnargs
))
7299 info
->fnargcount
= 0;
7304 /* Record line number information. */
7307 ieee_lineno (void *p
, const char *filename
, unsigned long lineno
, bfd_vma addr
)
7309 struct ieee_handle
*info
= (struct ieee_handle
*) p
;
7311 assert (info
->filename
!= NULL
);
7313 /* The HP simulator seems to get confused when more than one line is
7314 listed for the same address, at least if they are in different
7315 files. We handle this by always listing the last line for a
7316 given address, since that seems to be the one that gdb uses. */
7317 if (info
->pending_lineno_filename
!= NULL
7318 && addr
!= info
->pending_lineno_addr
)
7320 /* Make sure we have a line number block. */
7321 if (! ieee_buffer_emptyp (&info
->linenos
))
7323 if (! ieee_change_buffer (info
, &info
->linenos
))
7328 info
->lineno_name_indx
= info
->name_indx
;
7330 if (! ieee_change_buffer (info
, &info
->linenos
)
7331 || ! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
7332 || ! ieee_write_byte (info
, 5)
7333 || ! ieee_write_number (info
, 0)
7334 || ! ieee_write_id (info
, info
->filename
)
7335 || ! ieee_write_byte (info
, (int) ieee_nn_record
)
7336 || ! ieee_write_number (info
, info
->lineno_name_indx
)
7337 || ! ieee_write_id (info
, ""))
7339 info
->lineno_filename
= info
->filename
;
7342 if (strcmp (info
->pending_lineno_filename
, info
->lineno_filename
) != 0)
7344 if (strcmp (info
->filename
, info
->lineno_filename
) != 0)
7346 /* We were not in the main file. Close the block for the
7348 if (! ieee_write_byte (info
, (int) ieee_be_record_enum
))
7350 if (strcmp (info
->filename
, info
->pending_lineno_filename
) == 0)
7352 /* We need a new NN record, and we aren't about to
7354 info
->lineno_name_indx
= info
->name_indx
;
7356 if (! ieee_write_byte (info
, (int) ieee_nn_record
)
7357 || ! ieee_write_number (info
, info
->lineno_name_indx
)
7358 || ! ieee_write_id (info
, ""))
7362 if (strcmp (info
->filename
, info
->pending_lineno_filename
) != 0)
7364 /* We are not changing to the main file. Open a block for
7365 the new included file. */
7366 info
->lineno_name_indx
= info
->name_indx
;
7368 if (! ieee_write_byte (info
, (int) ieee_bb_record_enum
)
7369 || ! ieee_write_byte (info
, 5)
7370 || ! ieee_write_number (info
, 0)
7371 || ! ieee_write_id (info
, info
->pending_lineno_filename
)
7372 || ! ieee_write_byte (info
, (int) ieee_nn_record
)
7373 || ! ieee_write_number (info
, info
->lineno_name_indx
)
7374 || ! ieee_write_id (info
, ""))
7377 info
->lineno_filename
= info
->pending_lineno_filename
;
7380 if (! ieee_write_2bytes (info
, (int) ieee_atn_record_enum
)
7381 || ! ieee_write_number (info
, info
->lineno_name_indx
)
7382 || ! ieee_write_number (info
, 0)
7383 || ! ieee_write_number (info
, 7)
7384 || ! ieee_write_number (info
, info
->pending_lineno
)
7385 || ! ieee_write_number (info
, 0)
7386 || ! ieee_write_asn (info
, info
->lineno_name_indx
,
7387 info
->pending_lineno_addr
))
7391 info
->pending_lineno_filename
= filename
;
7392 info
->pending_lineno
= lineno
;
7393 info
->pending_lineno_addr
= addr
;