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
));
102 static boolean external_coff_symbol_p
PARAMS ((int sym_class
));
104 /* Return the slot for a type. */
107 coff_get_slot (types
, indx
)
108 struct coff_types
*types
;
111 struct coff_slots
**pps
;
115 while (indx
>= COFF_SLOTS
)
119 *pps
= (struct coff_slots
*) xmalloc (sizeof **pps
);
120 memset (*pps
, 0, sizeof **pps
);
128 *pps
= (struct coff_slots
*) xmalloc (sizeof **pps
);
129 memset (*pps
, 0, sizeof **pps
);
132 return (*pps
)->slots
+ indx
;
135 /* Parse a COFF type code in NTYPE. */
138 parse_coff_type (abfd
, symbols
, types
, coff_symno
, ntype
, pauxent
, useaux
,
141 struct coff_symbols
*symbols
;
142 struct coff_types
*types
;
145 union internal_auxent
*pauxent
;
151 if ((ntype
& ~N_BTMASK
) != 0)
155 newtype
= DECREF (ntype
);
159 type
= parse_coff_type (abfd
, symbols
, types
, coff_symno
, newtype
,
160 pauxent
, useaux
, dhandle
);
161 type
= debug_make_pointer_type (dhandle
, type
);
163 else if (ISFCN (ntype
))
165 type
= parse_coff_type (abfd
, symbols
, types
, coff_symno
, newtype
,
166 pauxent
, useaux
, dhandle
);
167 type
= debug_make_function_type (dhandle
, type
, (debug_type
*) NULL
,
170 else if (ISARY (ntype
))
181 /* FIXME: If pauxent->x_sym.x_tagndx.l == 0, gdb sets
182 the c_naux field of the syment to 0. */
184 /* Move the dimensions down, so that the next array
185 picks up the next one. */
186 dim
= pauxent
->x_sym
.x_fcnary
.x_ary
.x_dimen
;
188 for (i
= 0; *dim
!= 0 && i
< DIMNUM
- 1; i
++, dim
++)
193 type
= parse_coff_type (abfd
, symbols
, types
, coff_symno
, newtype
,
194 pauxent
, false, dhandle
);
195 type
= debug_make_array_type (dhandle
, type
,
196 parse_coff_base_type (abfd
, symbols
,
205 non_fatal (_("parse_coff_type: Bad type code 0x%x"), ntype
);
206 return DEBUG_TYPE_NULL
;
212 if (pauxent
!= NULL
&& pauxent
->x_sym
.x_tagndx
.l
> 0)
216 /* This is a reference to an existing type. FIXME: gdb checks
217 that the class is not C_STRTAG, nor C_UNTAG, nor C_ENTAG. */
218 slot
= coff_get_slot (types
, pauxent
->x_sym
.x_tagndx
.l
);
219 if (*slot
!= DEBUG_TYPE_NULL
)
222 return debug_make_indirect_type (dhandle
, slot
, (const char *) NULL
);
225 /* If the aux entry has already been used for something, useaux will
226 have been set to false, indicating that parse_coff_base_type
227 should not use it. We need to do it this way, rather than simply
228 passing pauxent as NULL, because we need to be able handle
229 multiple array dimensions while still discarding pauxent after
230 having handled all of them. */
234 return parse_coff_base_type (abfd
, symbols
, types
, coff_symno
, ntype
,
238 /* Parse a basic COFF type in NTYPE. */
241 parse_coff_base_type (abfd
, symbols
, types
, coff_symno
, ntype
, pauxent
,
244 struct coff_symbols
*symbols
;
245 struct coff_types
*types
;
248 union internal_auxent
*pauxent
;
258 && types
->basic
[ntype
] != DEBUG_TYPE_NULL
)
259 return types
->basic
[ntype
];
267 ret
= debug_make_void_type (dhandle
);
272 ret
= debug_make_void_type (dhandle
);
277 ret
= debug_make_int_type (dhandle
, 1, false);
282 ret
= debug_make_int_type (dhandle
, 2, false);
287 /* FIXME: Perhaps the size should depend upon the architecture. */
288 ret
= debug_make_int_type (dhandle
, 4, false);
293 ret
= debug_make_int_type (dhandle
, 4, false);
298 ret
= debug_make_float_type (dhandle
, 4);
303 ret
= debug_make_float_type (dhandle
, 8);
308 ret
= debug_make_float_type (dhandle
, 12);
309 name
= "long double";
313 ret
= debug_make_int_type (dhandle
, 1, true);
314 name
= "unsigned char";
318 ret
= debug_make_int_type (dhandle
, 2, true);
319 name
= "unsigned short";
323 ret
= debug_make_int_type (dhandle
, 4, true);
324 name
= "unsigned int";
328 ret
= debug_make_int_type (dhandle
, 4, true);
329 name
= "unsigned long";
334 ret
= debug_make_struct_type (dhandle
, true, 0,
335 (debug_field
*) NULL
);
337 ret
= parse_coff_struct_type (abfd
, symbols
, types
, ntype
, pauxent
,
340 slot
= coff_get_slot (types
, coff_symno
);
348 ret
= debug_make_struct_type (dhandle
, false, 0, (debug_field
*) NULL
);
350 ret
= parse_coff_struct_type (abfd
, symbols
, types
, ntype
, pauxent
,
353 slot
= coff_get_slot (types
, coff_symno
);
361 ret
= debug_make_enum_type (dhandle
, (const char **) NULL
,
362 (bfd_signed_vma
*) NULL
);
364 ret
= parse_coff_enum_type (abfd
, symbols
, types
, pauxent
, dhandle
);
366 slot
= coff_get_slot (types
, coff_symno
);
374 ret
= debug_name_type (dhandle
, name
, ret
);
379 types
->basic
[ntype
] = ret
;
384 /* Parse a struct type. */
387 parse_coff_struct_type (abfd
, symbols
, types
, ntype
, pauxent
, dhandle
)
389 struct coff_symbols
*symbols
;
390 struct coff_types
*types
;
392 union internal_auxent
*pauxent
;
401 symend
= pauxent
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
;
404 fields
= (debug_field
*) xmalloc (alloc
* sizeof *fields
);
409 && symbols
->coff_symno
< symend
410 && symbols
->symno
< symbols
->symcount
)
413 long this_coff_symno
;
414 struct internal_syment syment
;
415 union internal_auxent auxent
;
416 union internal_auxent
*psubaux
;
417 bfd_vma bitpos
= 0, bitsize
= 0;
419 sym
= symbols
->syms
[symbols
->symno
];
421 if (! bfd_coff_get_syment (abfd
, sym
, &syment
))
423 non_fatal (_("bfd_coff_get_syment failed: %s"),
424 bfd_errmsg (bfd_get_error ()));
425 return DEBUG_TYPE_NULL
;
428 this_coff_symno
= symbols
->coff_symno
;
431 symbols
->coff_symno
+= 1 + syment
.n_numaux
;
433 if (syment
.n_numaux
== 0)
437 if (! bfd_coff_get_auxent (abfd
, sym
, 0, &auxent
))
439 non_fatal (_("bfd_coff_get_auxent failed: %s"),
440 bfd_errmsg (bfd_get_error ()));
441 return DEBUG_TYPE_NULL
;
446 switch (syment
.n_sclass
)
450 bitpos
= 8 * bfd_asymbol_value (sym
);
455 bitpos
= bfd_asymbol_value (sym
);
456 bitsize
= auxent
.x_sym
.x_misc
.x_lnsz
.x_size
;
469 ftype
= parse_coff_type (abfd
, symbols
, types
, this_coff_symno
,
470 syment
.n_type
, psubaux
, true, dhandle
);
471 f
= debug_make_field (dhandle
, bfd_asymbol_name (sym
), ftype
,
472 bitpos
, bitsize
, DEBUG_VISIBILITY_PUBLIC
);
473 if (f
== DEBUG_FIELD_NULL
)
474 return DEBUG_TYPE_NULL
;
476 if (count
+ 1 >= alloc
)
479 fields
= ((debug_field
*)
480 xrealloc (fields
, alloc
* sizeof *fields
));
488 fields
[count
] = DEBUG_FIELD_NULL
;
490 return debug_make_struct_type (dhandle
, ntype
== T_STRUCT
,
491 pauxent
->x_sym
.x_misc
.x_lnsz
.x_size
,
495 /* Parse an enum type. */
498 parse_coff_enum_type (abfd
, symbols
, types
, pauxent
, dhandle
)
500 struct coff_symbols
*symbols
;
501 struct coff_types
*types ATTRIBUTE_UNUSED
;
502 union internal_auxent
*pauxent
;
508 bfd_signed_vma
*vals
;
512 symend
= pauxent
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
;
515 names
= (const char **) xmalloc (alloc
* sizeof *names
);
516 vals
= (bfd_signed_vma
*) xmalloc (alloc
* sizeof *vals
);
521 && symbols
->coff_symno
< symend
522 && symbols
->symno
< symbols
->symcount
)
525 struct internal_syment syment
;
527 sym
= symbols
->syms
[symbols
->symno
];
529 if (! bfd_coff_get_syment (abfd
, sym
, &syment
))
531 non_fatal (_("bfd_coff_get_syment failed: %s"),
532 bfd_errmsg (bfd_get_error ()));
533 return DEBUG_TYPE_NULL
;
537 symbols
->coff_symno
+= 1 + syment
.n_numaux
;
539 switch (syment
.n_sclass
)
542 if (count
+ 1 >= alloc
)
545 names
= ((const char **)
546 xrealloc (names
, alloc
* sizeof *names
));
547 vals
= ((bfd_signed_vma
*)
548 xrealloc (vals
, alloc
* sizeof *vals
));
551 names
[count
] = bfd_asymbol_name (sym
);
552 vals
[count
] = bfd_asymbol_value (sym
);
564 return debug_make_enum_type (dhandle
, names
, vals
);
567 /* Handle a single COFF symbol. */
570 parse_coff_symbol (abfd
, types
, sym
, coff_symno
, psyment
, dhandle
, type
,
572 bfd
*abfd ATTRIBUTE_UNUSED
;
573 struct coff_types
*types
;
576 struct internal_syment
*psyment
;
579 boolean within_function
;
581 switch (psyment
->n_sclass
)
587 if (! debug_record_variable (dhandle
, bfd_asymbol_name (sym
), type
,
588 DEBUG_LOCAL
, bfd_asymbol_value (sym
)))
594 if (! debug_record_variable (dhandle
, bfd_asymbol_name (sym
), type
,
595 DEBUG_GLOBAL
, bfd_asymbol_value (sym
)))
600 if (! debug_record_variable (dhandle
, bfd_asymbol_name (sym
), type
,
604 bfd_asymbol_value (sym
)))
609 /* FIXME: We may need to convert the register number. */
610 if (! debug_record_variable (dhandle
, bfd_asymbol_name (sym
), type
,
611 DEBUG_REGISTER
, bfd_asymbol_value (sym
)))
619 if (! debug_record_parameter (dhandle
, bfd_asymbol_name (sym
), type
,
620 DEBUG_PARM_STACK
, bfd_asymbol_value (sym
)))
625 /* FIXME: We may need to convert the register number. */
626 if (! debug_record_parameter (dhandle
, bfd_asymbol_name (sym
), type
,
627 DEBUG_PARM_REG
, bfd_asymbol_value (sym
)))
632 type
= debug_name_type (dhandle
, bfd_asymbol_name (sym
), type
);
633 if (type
== DEBUG_TYPE_NULL
)
643 type
= debug_tag_type (dhandle
, bfd_asymbol_name (sym
), type
);
644 if (type
== DEBUG_TYPE_NULL
)
647 /* Store the named type into the slot, so that references get
649 slot
= coff_get_slot (types
, coff_symno
);
661 /* Determine if a symbol has external visibility. */
664 external_coff_symbol_p (int sym_class
)
677 /* This is the main routine. It looks through all the symbols and
681 parse_coff (abfd
, syms
, symcount
, dhandle
)
687 struct coff_symbols symbols
;
688 struct coff_types types
;
696 boolean within_function
;
697 long this_coff_symno
;
700 symbols
.symcount
= symcount
;
702 symbols
.coff_symno
= 0;
705 for (i
= 0; i
<= T_MAX
; i
++)
706 types
.basic
[i
] = DEBUG_TYPE_NULL
;
714 within_function
= false;
716 while (symbols
.symno
< symcount
)
720 struct internal_syment syment
;
721 union internal_auxent auxent
;
722 union internal_auxent
*paux
;
725 sym
= syms
[symbols
.symno
];
727 if (! bfd_coff_get_syment (abfd
, sym
, &syment
))
729 non_fatal (_("bfd_coff_get_syment failed: %s"),
730 bfd_errmsg (bfd_get_error ()));
734 name
= bfd_asymbol_name (sym
);
736 this_coff_symno
= symbols
.coff_symno
;
739 symbols
.coff_symno
+= 1 + syment
.n_numaux
;
741 /* We only worry about the first auxent, because that is the
742 only one which is relevant for debugging information. */
743 if (syment
.n_numaux
== 0)
747 if (! bfd_coff_get_auxent (abfd
, sym
, 0, &auxent
))
749 non_fatal (_("bfd_coff_get_auxent failed: %s"),
750 bfd_errmsg (bfd_get_error ()));
756 if (this_coff_symno
== next_c_file
&& syment
.n_sclass
!= C_FILE
)
758 /* The last C_FILE symbol points to the first external
760 if (! debug_set_filename (dhandle
, "*globals*"))
764 switch (syment
.n_sclass
)
773 /* Just ignore these classes. */
777 next_c_file
= syment
.n_value
;
778 if (! debug_set_filename (dhandle
, name
))
783 /* Ignore static symbols with a type of T_NULL. These
784 represent section entries. */
785 if (syment
.n_type
== T_NULL
)
790 if (ISFCN (syment
.n_type
))
793 fnclass
= syment
.n_sclass
;
794 fntype
= syment
.n_type
;
795 if (syment
.n_numaux
> 0)
796 fnend
= bfd_asymbol_value (sym
) + auxent
.x_sym
.x_misc
.x_fsize
;
799 linenos
= BFD_SEND (abfd
, _get_lineno
, (abfd
, sym
));
802 type
= parse_coff_type (abfd
, &symbols
, &types
, this_coff_symno
,
803 syment
.n_type
, paux
, true, dhandle
);
804 if (type
== DEBUG_TYPE_NULL
)
806 if (! parse_coff_symbol (abfd
, &types
, sym
, this_coff_symno
, &syment
,
807 dhandle
, type
, within_function
))
812 if (strcmp (name
, ".bf") == 0)
816 non_fatal (_("%ld: .bf without preceding function"),
821 type
= parse_coff_type (abfd
, &symbols
, &types
, this_coff_symno
,
822 DECREF (fntype
), paux
, false, dhandle
);
823 if (type
== DEBUG_TYPE_NULL
)
826 if (! debug_record_function (dhandle
, fnname
, type
,
827 external_coff_symbol_p (fnclass
),
828 bfd_asymbol_value (sym
)))
836 if (syment
.n_numaux
== 0)
839 base
= auxent
.x_sym
.x_misc
.x_lnsz
.x_lnno
- 1;
841 addr
= bfd_get_section_vma (abfd
, bfd_get_section (sym
));
845 while (linenos
->line_number
!= 0)
847 if (! debug_record_line (dhandle
,
848 linenos
->line_number
+ base
,
849 linenos
->u
.offset
+ addr
))
860 within_function
= true;
862 else if (strcmp (name
, ".ef") == 0)
864 if (! within_function
)
866 non_fatal (_("%ld: unexpected .ef\n"), this_coff_symno
);
870 if (bfd_asymbol_value (sym
) > fnend
)
871 fnend
= bfd_asymbol_value (sym
);
872 if (! debug_end_function (dhandle
, fnend
))
876 within_function
= false;
881 if (strcmp (name
, ".bb") == 0)
883 if (! debug_start_block (dhandle
, bfd_asymbol_value (sym
)))
886 else if (strcmp (name
, ".eb") == 0)
888 if (! debug_end_block (dhandle
, bfd_asymbol_value (sym
)))
894 type
= parse_coff_type (abfd
, &symbols
, &types
, this_coff_symno
,
895 syment
.n_type
, paux
, true, dhandle
);
896 if (type
== DEBUG_TYPE_NULL
)
898 if (! parse_coff_symbol (abfd
, &types
, sym
, this_coff_symno
, &syment
,
899 dhandle
, type
, within_function
))