1 /* stabs.c -- Parse COFF debugging information
2 Copyright (C) 1996, 98, 99, 2000 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 contains code which parses COFF debugging information. */
25 #include "coff/internal.h"
27 #include "libiberty.h"
32 /* FIXME: We should not need this BFD internal file. We need it for
33 the N_BTMASK, etc., values. */
36 /* These macros extract the right mask and shifts for this BFD. They
37 assume that there is a local variable named ABFD. This is so that
38 macros like ISFCN and DECREF, from coff/internal.h, will work
39 without modification. */
40 #define N_BTMASK (coff_data (abfd)->local_n_btmask)
41 #define N_BTSHFT (coff_data (abfd)->local_n_btshft)
42 #define N_TMASK (coff_data (abfd)->local_n_tmask)
43 #define N_TSHIFT (coff_data (abfd)->local_n_tshift)
45 /* This structure is used to hold the symbols, as well as the current
46 location within the symbols. */
52 /* The number of symbols. */
54 /* The index of the current symbol. */
56 /* The index of the current symbol in the COFF symbol table (where
57 each auxent counts as a symbol). */
61 /* The largest basic type we are prepared to handle. */
63 #define T_MAX (T_LNGDBL)
65 /* This structure is used to hold slots. */
69 /* Next set of slots. */
70 struct coff_slots
*next
;
72 #define COFF_SLOTS (16)
73 debug_type slots
[COFF_SLOTS
];
76 /* This structure is used to map symbol indices to types. */
81 struct coff_slots
*slots
;
83 debug_type basic
[T_MAX
+ 1];
86 static debug_type
*coff_get_slot
PARAMS ((struct coff_types
*, int));
87 static debug_type parse_coff_type
88 PARAMS ((bfd
*, struct coff_symbols
*, struct coff_types
*, long, int,
89 union internal_auxent
*, boolean
, PTR
));
90 static debug_type parse_coff_base_type
91 PARAMS ((bfd
*, struct coff_symbols
*, struct coff_types
*, long, int,
92 union internal_auxent
*, PTR
));
93 static debug_type parse_coff_struct_type
94 PARAMS ((bfd
*, struct coff_symbols
*, struct coff_types
*, int,
95 union internal_auxent
*, PTR
));
96 static debug_type parse_coff_enum_type
97 PARAMS ((bfd
*, struct coff_symbols
*, struct coff_types
*,
98 union internal_auxent
*, PTR
));
99 static boolean parse_coff_symbol
100 PARAMS ((bfd
*, struct coff_types
*, asymbol
*, long,
101 struct internal_syment
*, PTR
, debug_type
, boolean
));
103 /* Return the slot for a type. */
106 coff_get_slot (types
, indx
)
107 struct coff_types
*types
;
110 struct coff_slots
**pps
;
114 while (indx
>= COFF_SLOTS
)
118 *pps
= (struct coff_slots
*) xmalloc (sizeof **pps
);
119 memset (*pps
, 0, sizeof **pps
);
127 *pps
= (struct coff_slots
*) xmalloc (sizeof **pps
);
128 memset (*pps
, 0, sizeof **pps
);
131 return (*pps
)->slots
+ indx
;
134 /* Parse a COFF type code in NTYPE. */
137 parse_coff_type (abfd
, symbols
, types
, coff_symno
, ntype
, pauxent
, useaux
,
140 struct coff_symbols
*symbols
;
141 struct coff_types
*types
;
144 union internal_auxent
*pauxent
;
150 if ((ntype
& ~N_BTMASK
) != 0)
154 newtype
= DECREF (ntype
);
158 type
= parse_coff_type (abfd
, symbols
, types
, coff_symno
, newtype
,
159 pauxent
, useaux
, dhandle
);
160 type
= debug_make_pointer_type (dhandle
, type
);
162 else if (ISFCN (ntype
))
164 type
= parse_coff_type (abfd
, symbols
, types
, coff_symno
, newtype
,
165 pauxent
, useaux
, dhandle
);
166 type
= debug_make_function_type (dhandle
, type
, (debug_type
*) NULL
,
169 else if (ISARY (ntype
))
180 /* FIXME: If pauxent->x_sym.x_tagndx.l == 0, gdb sets
181 the c_naux field of the syment to 0. */
183 /* Move the dimensions down, so that the next array
184 picks up the next one. */
185 dim
= pauxent
->x_sym
.x_fcnary
.x_ary
.x_dimen
;
187 for (i
= 0; *dim
!= 0 && i
< DIMNUM
- 1; i
++, dim
++)
192 type
= parse_coff_type (abfd
, symbols
, types
, coff_symno
, newtype
,
193 pauxent
, false, dhandle
);
194 type
= debug_make_array_type (dhandle
, type
,
195 parse_coff_base_type (abfd
, symbols
,
204 non_fatal (_("parse_coff_type: Bad type code 0x%x"), ntype
);
205 return DEBUG_TYPE_NULL
;
211 if (pauxent
!= NULL
&& pauxent
->x_sym
.x_tagndx
.l
> 0)
215 /* This is a reference to an existing type. FIXME: gdb checks
216 that the class is not C_STRTAG, nor C_UNTAG, nor C_ENTAG. */
217 slot
= coff_get_slot (types
, pauxent
->x_sym
.x_tagndx
.l
);
218 if (*slot
!= DEBUG_TYPE_NULL
)
221 return debug_make_indirect_type (dhandle
, slot
, (const char *) NULL
);
224 /* If the aux entry has already been used for something, useaux will
225 have been set to false, indicating that parse_coff_base_type
226 should not use it. We need to do it this way, rather than simply
227 passing pauxent as NULL, because we need to be able handle
228 multiple array dimensions while still discarding pauxent after
229 having handled all of them. */
233 return parse_coff_base_type (abfd
, symbols
, types
, coff_symno
, ntype
,
237 /* Parse a basic COFF type in NTYPE. */
240 parse_coff_base_type (abfd
, symbols
, types
, coff_symno
, ntype
, pauxent
,
243 struct coff_symbols
*symbols
;
244 struct coff_types
*types
;
247 union internal_auxent
*pauxent
;
257 && types
->basic
[ntype
] != DEBUG_TYPE_NULL
)
258 return types
->basic
[ntype
];
266 ret
= debug_make_void_type (dhandle
);
271 ret
= debug_make_void_type (dhandle
);
276 ret
= debug_make_int_type (dhandle
, 1, false);
281 ret
= debug_make_int_type (dhandle
, 2, false);
286 /* FIXME: Perhaps the size should depend upon the architecture. */
287 ret
= debug_make_int_type (dhandle
, 4, false);
292 ret
= debug_make_int_type (dhandle
, 4, false);
297 ret
= debug_make_float_type (dhandle
, 4);
302 ret
= debug_make_float_type (dhandle
, 8);
307 ret
= debug_make_float_type (dhandle
, 12);
308 name
= "long double";
312 ret
= debug_make_int_type (dhandle
, 1, true);
313 name
= "unsigned char";
317 ret
= debug_make_int_type (dhandle
, 2, true);
318 name
= "unsigned short";
322 ret
= debug_make_int_type (dhandle
, 4, true);
323 name
= "unsigned int";
327 ret
= debug_make_int_type (dhandle
, 4, true);
328 name
= "unsigned long";
333 ret
= debug_make_struct_type (dhandle
, true, 0,
334 (debug_field
*) NULL
);
336 ret
= parse_coff_struct_type (abfd
, symbols
, types
, ntype
, pauxent
,
339 slot
= coff_get_slot (types
, coff_symno
);
347 ret
= debug_make_struct_type (dhandle
, false, 0, (debug_field
*) NULL
);
349 ret
= parse_coff_struct_type (abfd
, symbols
, types
, ntype
, pauxent
,
352 slot
= coff_get_slot (types
, coff_symno
);
360 ret
= debug_make_enum_type (dhandle
, (const char **) NULL
,
361 (bfd_signed_vma
*) NULL
);
363 ret
= parse_coff_enum_type (abfd
, symbols
, types
, pauxent
, dhandle
);
365 slot
= coff_get_slot (types
, coff_symno
);
373 ret
= debug_name_type (dhandle
, name
, ret
);
378 types
->basic
[ntype
] = ret
;
383 /* Parse a struct type. */
386 parse_coff_struct_type (abfd
, symbols
, types
, ntype
, pauxent
, dhandle
)
388 struct coff_symbols
*symbols
;
389 struct coff_types
*types
;
391 union internal_auxent
*pauxent
;
400 symend
= pauxent
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
;
403 fields
= (debug_field
*) xmalloc (alloc
* sizeof *fields
);
408 && symbols
->coff_symno
< symend
409 && symbols
->symno
< symbols
->symcount
)
412 long this_coff_symno
;
413 struct internal_syment syment
;
414 union internal_auxent auxent
;
415 union internal_auxent
*psubaux
;
416 bfd_vma bitpos
= 0, bitsize
= 0;
418 sym
= symbols
->syms
[symbols
->symno
];
420 if (! bfd_coff_get_syment (abfd
, sym
, &syment
))
422 non_fatal (_("bfd_coff_get_syment failed: %s"),
423 bfd_errmsg (bfd_get_error ()));
424 return DEBUG_TYPE_NULL
;
427 this_coff_symno
= symbols
->coff_symno
;
430 symbols
->coff_symno
+= 1 + syment
.n_numaux
;
432 if (syment
.n_numaux
== 0)
436 if (! bfd_coff_get_auxent (abfd
, sym
, 0, &auxent
))
438 non_fatal (_("bfd_coff_get_auxent failed: %s"),
439 bfd_errmsg (bfd_get_error ()));
440 return DEBUG_TYPE_NULL
;
445 switch (syment
.n_sclass
)
449 bitpos
= 8 * bfd_asymbol_value (sym
);
454 bitpos
= bfd_asymbol_value (sym
);
455 bitsize
= auxent
.x_sym
.x_misc
.x_lnsz
.x_size
;
468 ftype
= parse_coff_type (abfd
, symbols
, types
, this_coff_symno
,
469 syment
.n_type
, psubaux
, true, dhandle
);
470 f
= debug_make_field (dhandle
, bfd_asymbol_name (sym
), ftype
,
471 bitpos
, bitsize
, DEBUG_VISIBILITY_PUBLIC
);
472 if (f
== DEBUG_FIELD_NULL
)
473 return DEBUG_TYPE_NULL
;
475 if (count
+ 1 >= alloc
)
478 fields
= ((debug_field
*)
479 xrealloc (fields
, alloc
* sizeof *fields
));
487 fields
[count
] = DEBUG_FIELD_NULL
;
489 return debug_make_struct_type (dhandle
, ntype
== T_STRUCT
,
490 pauxent
->x_sym
.x_misc
.x_lnsz
.x_size
,
494 /* Parse an enum type. */
497 parse_coff_enum_type (abfd
, symbols
, types
, pauxent
, dhandle
)
499 struct coff_symbols
*symbols
;
500 struct coff_types
*types ATTRIBUTE_UNUSED
;
501 union internal_auxent
*pauxent
;
507 bfd_signed_vma
*vals
;
511 symend
= pauxent
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
;
514 names
= (const char **) xmalloc (alloc
* sizeof *names
);
515 vals
= (bfd_signed_vma
*) xmalloc (alloc
* sizeof *vals
);
520 && symbols
->coff_symno
< symend
521 && symbols
->symno
< symbols
->symcount
)
524 struct internal_syment syment
;
526 sym
= symbols
->syms
[symbols
->symno
];
528 if (! bfd_coff_get_syment (abfd
, sym
, &syment
))
530 non_fatal (_("bfd_coff_get_syment failed: %s"),
531 bfd_errmsg (bfd_get_error ()));
532 return DEBUG_TYPE_NULL
;
536 symbols
->coff_symno
+= 1 + syment
.n_numaux
;
538 switch (syment
.n_sclass
)
541 if (count
+ 1 >= alloc
)
544 names
= ((const char **)
545 xrealloc (names
, alloc
* sizeof *names
));
546 vals
= ((bfd_signed_vma
*)
547 xrealloc (vals
, alloc
* sizeof *vals
));
550 names
[count
] = bfd_asymbol_name (sym
);
551 vals
[count
] = bfd_asymbol_value (sym
);
563 return debug_make_enum_type (dhandle
, names
, vals
);
566 /* Handle a single COFF symbol. */
569 parse_coff_symbol (abfd
, types
, sym
, coff_symno
, psyment
, dhandle
, type
,
571 bfd
*abfd ATTRIBUTE_UNUSED
;
572 struct coff_types
*types
;
575 struct internal_syment
*psyment
;
578 boolean within_function
;
580 switch (psyment
->n_sclass
)
586 if (! debug_record_variable (dhandle
, bfd_asymbol_name (sym
), type
,
587 DEBUG_LOCAL
, bfd_asymbol_value (sym
)))
592 if (! debug_record_variable (dhandle
, bfd_asymbol_name (sym
), type
,
593 DEBUG_GLOBAL
, bfd_asymbol_value (sym
)))
598 if (! debug_record_variable (dhandle
, bfd_asymbol_name (sym
), type
,
602 bfd_asymbol_value (sym
)))
607 /* FIXME: We may need to convert the register number. */
608 if (! debug_record_variable (dhandle
, bfd_asymbol_name (sym
), type
,
609 DEBUG_REGISTER
, bfd_asymbol_value (sym
)))
617 if (! debug_record_parameter (dhandle
, bfd_asymbol_name (sym
), type
,
618 DEBUG_PARM_STACK
, bfd_asymbol_value (sym
)))
623 /* FIXME: We may need to convert the register number. */
624 if (! debug_record_parameter (dhandle
, bfd_asymbol_name (sym
), type
,
625 DEBUG_PARM_REG
, bfd_asymbol_value (sym
)))
630 type
= debug_name_type (dhandle
, bfd_asymbol_name (sym
), type
);
631 if (type
== DEBUG_TYPE_NULL
)
641 type
= debug_tag_type (dhandle
, bfd_asymbol_name (sym
), type
);
642 if (type
== DEBUG_TYPE_NULL
)
645 /* Store the named type into the slot, so that references get
647 slot
= coff_get_slot (types
, coff_symno
);
659 /* This is the main routine. It looks through all the symbols and
663 parse_coff (abfd
, syms
, symcount
, dhandle
)
669 struct coff_symbols symbols
;
670 struct coff_types types
;
678 boolean within_function
;
679 long this_coff_symno
;
682 symbols
.symcount
= symcount
;
684 symbols
.coff_symno
= 0;
687 for (i
= 0; i
<= T_MAX
; i
++)
688 types
.basic
[i
] = DEBUG_TYPE_NULL
;
696 within_function
= false;
698 while (symbols
.symno
< symcount
)
702 struct internal_syment syment
;
703 union internal_auxent auxent
;
704 union internal_auxent
*paux
;
707 sym
= syms
[symbols
.symno
];
709 if (! bfd_coff_get_syment (abfd
, sym
, &syment
))
711 non_fatal (_("bfd_coff_get_syment failed: %s"),
712 bfd_errmsg (bfd_get_error ()));
716 name
= bfd_asymbol_name (sym
);
718 this_coff_symno
= symbols
.coff_symno
;
721 symbols
.coff_symno
+= 1 + syment
.n_numaux
;
723 /* We only worry about the first auxent, because that is the
724 only one which is relevant for debugging information. */
725 if (syment
.n_numaux
== 0)
729 if (! bfd_coff_get_auxent (abfd
, sym
, 0, &auxent
))
731 non_fatal (_("bfd_coff_get_auxent failed: %s"),
732 bfd_errmsg (bfd_get_error ()));
738 if (this_coff_symno
== next_c_file
&& syment
.n_sclass
!= C_FILE
)
740 /* The last C_FILE symbol points to the first external
742 if (! debug_set_filename (dhandle
, "*globals*"))
746 switch (syment
.n_sclass
)
755 /* Just ignore these classes. */
759 next_c_file
= syment
.n_value
;
760 if (! debug_set_filename (dhandle
, name
))
765 /* Ignore static symbols with a type of T_NULL. These
766 represent section entries. */
767 if (syment
.n_type
== T_NULL
)
771 if (ISFCN (syment
.n_type
))
774 fnclass
= syment
.n_sclass
;
775 fntype
= syment
.n_type
;
776 if (syment
.n_numaux
> 0)
777 fnend
= bfd_asymbol_value (sym
) + auxent
.x_sym
.x_misc
.x_fsize
;
780 linenos
= BFD_SEND (abfd
, _get_lineno
, (abfd
, sym
));
783 type
= parse_coff_type (abfd
, &symbols
, &types
, this_coff_symno
,
784 syment
.n_type
, paux
, true, dhandle
);
785 if (type
== DEBUG_TYPE_NULL
)
787 if (! parse_coff_symbol (abfd
, &types
, sym
, this_coff_symno
, &syment
,
788 dhandle
, type
, within_function
))
793 if (strcmp (name
, ".bf") == 0)
797 non_fatal (_("%ld: .bf without preceding function"),
802 type
= parse_coff_type (abfd
, &symbols
, &types
, this_coff_symno
,
803 DECREF (fntype
), paux
, false, dhandle
);
804 if (type
== DEBUG_TYPE_NULL
)
807 if (! debug_record_function (dhandle
, fnname
, type
,
809 bfd_asymbol_value (sym
)))
817 if (syment
.n_numaux
== 0)
820 base
= auxent
.x_sym
.x_misc
.x_lnsz
.x_lnno
- 1;
822 addr
= bfd_get_section_vma (abfd
, bfd_get_section (sym
));
826 while (linenos
->line_number
!= 0)
828 if (! debug_record_line (dhandle
,
829 linenos
->line_number
+ base
,
830 linenos
->u
.offset
+ addr
))
841 within_function
= true;
843 else if (strcmp (name
, ".ef") == 0)
845 if (! within_function
)
847 non_fatal (_("%ld: unexpected .ef\n"), this_coff_symno
);
851 if (bfd_asymbol_value (sym
) > fnend
)
852 fnend
= bfd_asymbol_value (sym
);
853 if (! debug_end_function (dhandle
, fnend
))
857 within_function
= false;
862 if (strcmp (name
, ".bb") == 0)
864 if (! debug_start_block (dhandle
, bfd_asymbol_value (sym
)))
867 else if (strcmp (name
, ".eb") == 0)
869 if (! debug_end_block (dhandle
, bfd_asymbol_value (sym
)))
875 type
= parse_coff_type (abfd
, &symbols
, &types
, this_coff_symno
,
876 syment
.n_type
, paux
, true, dhandle
);
877 if (type
== DEBUG_TYPE_NULL
)
879 if (! parse_coff_symbol (abfd
, &types
, sym
, this_coff_symno
, &syment
,
880 dhandle
, type
, within_function
))