* hppa-dis.c (print_insn_hppa): Don't print '%' before register names.
[binutils.git] / binutils / rdcoff.c
blob1eda3af195d1ce22838428537881529ecc144411
1 /* stabs.c -- Parse COFF debugging information
2 Copyright 1996, 1999, 2000, 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., 51 Franklin Street - Fifth Floor, Boston, MA
20 02110-1301, USA. */
22 /* This file contains code which parses COFF debugging information. */
24 #include "bfd.h"
25 #include "coff/internal.h"
26 #include "bucomm.h"
27 #include "libiberty.h"
28 #include "debug.h"
29 #include "budbg.h"
31 /* FIXME: We should not need this BFD internal file. We need it for
32 the N_BTMASK, etc., values. */
33 #include "libcoff.h"
35 /* These macros extract the right mask and shifts for this BFD. They
36 assume that there is a local variable named ABFD. This is so that
37 macros like ISFCN and DECREF, from coff/internal.h, will work
38 without modification. */
39 #define N_BTMASK (coff_data (abfd)->local_n_btmask)
40 #define N_BTSHFT (coff_data (abfd)->local_n_btshft)
41 #define N_TMASK (coff_data (abfd)->local_n_tmask)
42 #define N_TSHIFT (coff_data (abfd)->local_n_tshift)
44 /* This structure is used to hold the symbols, as well as the current
45 location within the symbols. */
47 struct coff_symbols
49 /* The symbols. */
50 asymbol **syms;
51 /* The number of symbols. */
52 long symcount;
53 /* The index of the current symbol. */
54 long symno;
55 /* The index of the current symbol in the COFF symbol table (where
56 each auxent counts as a symbol). */
57 long coff_symno;
60 /* The largest basic type we are prepared to handle. */
62 #define T_MAX (T_LNGDBL)
64 /* This structure is used to hold slots. */
66 struct coff_slots
68 /* Next set of slots. */
69 struct coff_slots *next;
70 /* Slots. */
71 #define COFF_SLOTS (16)
72 debug_type slots[COFF_SLOTS];
75 /* This structure is used to map symbol indices to types. */
77 struct coff_types
79 /* Slots. */
80 struct coff_slots *slots;
81 /* Basic types. */
82 debug_type basic[T_MAX + 1];
85 static debug_type *coff_get_slot (struct coff_types *, int);
86 static debug_type parse_coff_type
87 (bfd *, struct coff_symbols *, struct coff_types *, long, int,
88 union internal_auxent *, bfd_boolean, void *);
89 static debug_type parse_coff_base_type
90 (bfd *, struct coff_symbols *, struct coff_types *, long, int,
91 union internal_auxent *, void *);
92 static debug_type parse_coff_struct_type
93 (bfd *, struct coff_symbols *, struct coff_types *, int,
94 union internal_auxent *, void *);
95 static debug_type parse_coff_enum_type
96 (bfd *, struct coff_symbols *, struct coff_types *,
97 union internal_auxent *, void *);
98 static bfd_boolean parse_coff_symbol
99 (bfd *, struct coff_types *, asymbol *, long, struct internal_syment *,
100 void *, debug_type, bfd_boolean);
101 static bfd_boolean external_coff_symbol_p (int sym_class);
103 /* Return the slot for a type. */
105 static debug_type *
106 coff_get_slot (struct coff_types *types, int indx)
108 struct coff_slots **pps;
110 pps = &types->slots;
112 while (indx >= COFF_SLOTS)
114 if (*pps == NULL)
116 *pps = (struct coff_slots *) xmalloc (sizeof **pps);
117 memset (*pps, 0, sizeof **pps);
119 pps = &(*pps)->next;
120 indx -= COFF_SLOTS;
123 if (*pps == NULL)
125 *pps = (struct coff_slots *) xmalloc (sizeof **pps);
126 memset (*pps, 0, sizeof **pps);
129 return (*pps)->slots + indx;
132 /* Parse a COFF type code in NTYPE. */
134 static debug_type
135 parse_coff_type (bfd *abfd, struct coff_symbols *symbols,
136 struct coff_types *types, long coff_symno, int ntype,
137 union internal_auxent *pauxent, bfd_boolean useaux,
138 void *dhandle)
140 debug_type type;
142 if ((ntype & ~N_BTMASK) != 0)
144 int newtype;
146 newtype = DECREF (ntype);
148 if (ISPTR (ntype))
150 type = parse_coff_type (abfd, symbols, types, coff_symno, newtype,
151 pauxent, useaux, dhandle);
152 type = debug_make_pointer_type (dhandle, type);
154 else if (ISFCN (ntype))
156 type = parse_coff_type (abfd, symbols, types, coff_symno, newtype,
157 pauxent, useaux, dhandle);
158 type = debug_make_function_type (dhandle, type, (debug_type *) NULL,
159 FALSE);
161 else if (ISARY (ntype))
163 int n;
165 if (pauxent == NULL)
166 n = 0;
167 else
169 unsigned short *dim;
170 int i;
172 /* FIXME: If pauxent->x_sym.x_tagndx.l == 0, gdb sets
173 the c_naux field of the syment to 0. */
175 /* Move the dimensions down, so that the next array
176 picks up the next one. */
177 dim = pauxent->x_sym.x_fcnary.x_ary.x_dimen;
178 n = dim[0];
179 for (i = 0; *dim != 0 && i < DIMNUM - 1; i++, dim++)
180 *dim = *(dim + 1);
181 *dim = 0;
184 type = parse_coff_type (abfd, symbols, types, coff_symno, newtype,
185 pauxent, FALSE, dhandle);
186 type = debug_make_array_type (dhandle, type,
187 parse_coff_base_type (abfd, symbols,
188 types,
189 coff_symno,
190 T_INT,
191 NULL, dhandle),
192 0, n - 1, FALSE);
194 else
196 non_fatal (_("parse_coff_type: Bad type code 0x%x"), ntype);
197 return DEBUG_TYPE_NULL;
200 return type;
203 if (pauxent != NULL && pauxent->x_sym.x_tagndx.l > 0)
205 debug_type *slot;
207 /* This is a reference to an existing type. FIXME: gdb checks
208 that the class is not C_STRTAG, nor C_UNTAG, nor C_ENTAG. */
209 slot = coff_get_slot (types, pauxent->x_sym.x_tagndx.l);
210 if (*slot != DEBUG_TYPE_NULL)
211 return *slot;
212 else
213 return debug_make_indirect_type (dhandle, slot, (const char *) NULL);
216 /* If the aux entry has already been used for something, useaux will
217 have been set to false, indicating that parse_coff_base_type
218 should not use it. We need to do it this way, rather than simply
219 passing pauxent as NULL, because we need to be able handle
220 multiple array dimensions while still discarding pauxent after
221 having handled all of them. */
222 if (! useaux)
223 pauxent = NULL;
225 return parse_coff_base_type (abfd, symbols, types, coff_symno, ntype,
226 pauxent, dhandle);
229 /* Parse a basic COFF type in NTYPE. */
231 static debug_type
232 parse_coff_base_type (bfd *abfd, struct coff_symbols *symbols,
233 struct coff_types *types, long coff_symno, int ntype,
234 union internal_auxent *pauxent, void *dhandle)
236 debug_type ret;
237 bfd_boolean set_basic;
238 const char *name;
239 debug_type *slot;
241 if (ntype >= 0
242 && ntype <= T_MAX
243 && types->basic[ntype] != DEBUG_TYPE_NULL)
244 return types->basic[ntype];
246 set_basic = TRUE;
247 name = NULL;
249 switch (ntype)
251 default:
252 ret = debug_make_void_type (dhandle);
253 break;
255 case T_NULL:
256 case T_VOID:
257 ret = debug_make_void_type (dhandle);
258 name = "void";
259 break;
261 case T_CHAR:
262 ret = debug_make_int_type (dhandle, 1, FALSE);
263 name = "char";
264 break;
266 case T_SHORT:
267 ret = debug_make_int_type (dhandle, 2, FALSE);
268 name = "short";
269 break;
271 case T_INT:
272 /* FIXME: Perhaps the size should depend upon the architecture. */
273 ret = debug_make_int_type (dhandle, 4, FALSE);
274 name = "int";
275 break;
277 case T_LONG:
278 ret = debug_make_int_type (dhandle, 4, FALSE);
279 name = "long";
280 break;
282 case T_FLOAT:
283 ret = debug_make_float_type (dhandle, 4);
284 name = "float";
285 break;
287 case T_DOUBLE:
288 ret = debug_make_float_type (dhandle, 8);
289 name = "double";
290 break;
292 case T_LNGDBL:
293 ret = debug_make_float_type (dhandle, 12);
294 name = "long double";
295 break;
297 case T_UCHAR:
298 ret = debug_make_int_type (dhandle, 1, TRUE);
299 name = "unsigned char";
300 break;
302 case T_USHORT:
303 ret = debug_make_int_type (dhandle, 2, TRUE);
304 name = "unsigned short";
305 break;
307 case T_UINT:
308 ret = debug_make_int_type (dhandle, 4, TRUE);
309 name = "unsigned int";
310 break;
312 case T_ULONG:
313 ret = debug_make_int_type (dhandle, 4, TRUE);
314 name = "unsigned long";
315 break;
317 case T_STRUCT:
318 if (pauxent == NULL)
319 ret = debug_make_struct_type (dhandle, TRUE, 0,
320 (debug_field *) NULL);
321 else
322 ret = parse_coff_struct_type (abfd, symbols, types, ntype, pauxent,
323 dhandle);
325 slot = coff_get_slot (types, coff_symno);
326 *slot = ret;
328 set_basic = FALSE;
329 break;
331 case T_UNION:
332 if (pauxent == NULL)
333 ret = debug_make_struct_type (dhandle, FALSE, 0, (debug_field *) NULL);
334 else
335 ret = parse_coff_struct_type (abfd, symbols, types, ntype, pauxent,
336 dhandle);
338 slot = coff_get_slot (types, coff_symno);
339 *slot = ret;
341 set_basic = FALSE;
342 break;
344 case T_ENUM:
345 if (pauxent == NULL)
346 ret = debug_make_enum_type (dhandle, (const char **) NULL,
347 (bfd_signed_vma *) NULL);
348 else
349 ret = parse_coff_enum_type (abfd, symbols, types, pauxent, dhandle);
351 slot = coff_get_slot (types, coff_symno);
352 *slot = ret;
354 set_basic = FALSE;
355 break;
358 if (name != NULL)
359 ret = debug_name_type (dhandle, name, ret);
361 if (set_basic
362 && ntype >= 0
363 && ntype <= T_MAX)
364 types->basic[ntype] = ret;
366 return ret;
369 /* Parse a struct type. */
371 static debug_type
372 parse_coff_struct_type (bfd *abfd, struct coff_symbols *symbols,
373 struct coff_types *types, int ntype,
374 union internal_auxent *pauxent, void *dhandle)
376 long symend;
377 int alloc;
378 debug_field *fields;
379 int count;
380 bfd_boolean done;
382 symend = pauxent->x_sym.x_fcnary.x_fcn.x_endndx.l;
384 alloc = 10;
385 fields = (debug_field *) xmalloc (alloc * sizeof *fields);
386 count = 0;
388 done = FALSE;
389 while (! done
390 && symbols->coff_symno < symend
391 && symbols->symno < symbols->symcount)
393 asymbol *sym;
394 long this_coff_symno;
395 struct internal_syment syment;
396 union internal_auxent auxent;
397 union internal_auxent *psubaux;
398 bfd_vma bitpos = 0, bitsize = 0;
400 sym = symbols->syms[symbols->symno];
402 if (! bfd_coff_get_syment (abfd, sym, &syment))
404 non_fatal (_("bfd_coff_get_syment failed: %s"),
405 bfd_errmsg (bfd_get_error ()));
406 return DEBUG_TYPE_NULL;
409 this_coff_symno = symbols->coff_symno;
411 ++symbols->symno;
412 symbols->coff_symno += 1 + syment.n_numaux;
414 if (syment.n_numaux == 0)
415 psubaux = NULL;
416 else
418 if (! bfd_coff_get_auxent (abfd, sym, 0, &auxent))
420 non_fatal (_("bfd_coff_get_auxent failed: %s"),
421 bfd_errmsg (bfd_get_error ()));
422 return DEBUG_TYPE_NULL;
424 psubaux = &auxent;
427 switch (syment.n_sclass)
429 case C_MOS:
430 case C_MOU:
431 bitpos = 8 * bfd_asymbol_value (sym);
432 bitsize = 0;
433 break;
435 case C_FIELD:
436 bitpos = bfd_asymbol_value (sym);
437 bitsize = auxent.x_sym.x_misc.x_lnsz.x_size;
438 break;
440 case C_EOS:
441 done = TRUE;
442 break;
445 if (! done)
447 debug_type ftype;
448 debug_field f;
450 ftype = parse_coff_type (abfd, symbols, types, this_coff_symno,
451 syment.n_type, psubaux, TRUE, dhandle);
452 f = debug_make_field (dhandle, bfd_asymbol_name (sym), ftype,
453 bitpos, bitsize, DEBUG_VISIBILITY_PUBLIC);
454 if (f == DEBUG_FIELD_NULL)
455 return DEBUG_TYPE_NULL;
457 if (count + 1 >= alloc)
459 alloc += 10;
460 fields = ((debug_field *)
461 xrealloc (fields, alloc * sizeof *fields));
464 fields[count] = f;
465 ++count;
469 fields[count] = DEBUG_FIELD_NULL;
471 return debug_make_struct_type (dhandle, ntype == T_STRUCT,
472 pauxent->x_sym.x_misc.x_lnsz.x_size,
473 fields);
476 /* Parse an enum type. */
478 static debug_type
479 parse_coff_enum_type (bfd *abfd, struct coff_symbols *symbols,
480 struct coff_types *types ATTRIBUTE_UNUSED,
481 union internal_auxent *pauxent, void *dhandle)
483 long symend;
484 int alloc;
485 const char **names;
486 bfd_signed_vma *vals;
487 int count;
488 bfd_boolean done;
490 symend = pauxent->x_sym.x_fcnary.x_fcn.x_endndx.l;
492 alloc = 10;
493 names = (const char **) xmalloc (alloc * sizeof *names);
494 vals = (bfd_signed_vma *) xmalloc (alloc * sizeof *vals);
495 count = 0;
497 done = FALSE;
498 while (! done
499 && symbols->coff_symno < symend
500 && symbols->symno < symbols->symcount)
502 asymbol *sym;
503 struct internal_syment syment;
505 sym = symbols->syms[symbols->symno];
507 if (! bfd_coff_get_syment (abfd, sym, &syment))
509 non_fatal (_("bfd_coff_get_syment failed: %s"),
510 bfd_errmsg (bfd_get_error ()));
511 return DEBUG_TYPE_NULL;
514 ++symbols->symno;
515 symbols->coff_symno += 1 + syment.n_numaux;
517 switch (syment.n_sclass)
519 case C_MOE:
520 if (count + 1 >= alloc)
522 alloc += 10;
523 names = ((const char **)
524 xrealloc (names, alloc * sizeof *names));
525 vals = ((bfd_signed_vma *)
526 xrealloc (vals, alloc * sizeof *vals));
529 names[count] = bfd_asymbol_name (sym);
530 vals[count] = bfd_asymbol_value (sym);
531 ++count;
532 break;
534 case C_EOS:
535 done = TRUE;
536 break;
540 names[count] = NULL;
542 return debug_make_enum_type (dhandle, names, vals);
545 /* Handle a single COFF symbol. */
547 static bfd_boolean
548 parse_coff_symbol (bfd *abfd ATTRIBUTE_UNUSED, struct coff_types *types,
549 asymbol *sym, long coff_symno,
550 struct internal_syment *psyment, void *dhandle,
551 debug_type type, bfd_boolean within_function)
553 switch (psyment->n_sclass)
555 case C_NULL:
556 break;
558 case C_AUTO:
559 if (! debug_record_variable (dhandle, bfd_asymbol_name (sym), type,
560 DEBUG_LOCAL, bfd_asymbol_value (sym)))
561 return FALSE;
562 break;
564 case C_WEAKEXT:
565 case C_EXT:
566 if (! debug_record_variable (dhandle, bfd_asymbol_name (sym), type,
567 DEBUG_GLOBAL, bfd_asymbol_value (sym)))
568 return FALSE;
569 break;
571 case C_STAT:
572 if (! debug_record_variable (dhandle, bfd_asymbol_name (sym), type,
573 (within_function
574 ? DEBUG_LOCAL_STATIC
575 : DEBUG_STATIC),
576 bfd_asymbol_value (sym)))
577 return FALSE;
578 break;
580 case C_REG:
581 /* FIXME: We may need to convert the register number. */
582 if (! debug_record_variable (dhandle, bfd_asymbol_name (sym), type,
583 DEBUG_REGISTER, bfd_asymbol_value (sym)))
584 return FALSE;
585 break;
587 case C_LABEL:
588 break;
590 case C_ARG:
591 if (! debug_record_parameter (dhandle, bfd_asymbol_name (sym), type,
592 DEBUG_PARM_STACK, bfd_asymbol_value (sym)))
593 return FALSE;
594 break;
596 case C_REGPARM:
597 /* FIXME: We may need to convert the register number. */
598 if (! debug_record_parameter (dhandle, bfd_asymbol_name (sym), type,
599 DEBUG_PARM_REG, bfd_asymbol_value (sym)))
600 return FALSE;
601 break;
603 case C_TPDEF:
604 type = debug_name_type (dhandle, bfd_asymbol_name (sym), type);
605 if (type == DEBUG_TYPE_NULL)
606 return FALSE;
607 break;
609 case C_STRTAG:
610 case C_UNTAG:
611 case C_ENTAG:
613 debug_type *slot;
615 type = debug_tag_type (dhandle, bfd_asymbol_name (sym), type);
616 if (type == DEBUG_TYPE_NULL)
617 return FALSE;
619 /* Store the named type into the slot, so that references get
620 the name. */
621 slot = coff_get_slot (types, coff_symno);
622 *slot = type;
624 break;
626 default:
627 break;
630 return TRUE;
633 /* Determine if a symbol has external visibility. */
635 static bfd_boolean
636 external_coff_symbol_p (int sym_class)
638 switch (sym_class)
640 case C_EXT:
641 case C_WEAKEXT:
642 return TRUE;
643 default:
644 break;
646 return FALSE;
649 /* This is the main routine. It looks through all the symbols and
650 handles them. */
652 bfd_boolean
653 parse_coff (bfd *abfd, asymbol **syms, long symcount, void *dhandle)
655 struct coff_symbols symbols;
656 struct coff_types types;
657 int i;
658 long next_c_file;
659 const char *fnname;
660 int fnclass;
661 int fntype;
662 bfd_vma fnend;
663 alent *linenos;
664 bfd_boolean within_function;
665 long this_coff_symno;
667 symbols.syms = syms;
668 symbols.symcount = symcount;
669 symbols.symno = 0;
670 symbols.coff_symno = 0;
672 types.slots = NULL;
673 for (i = 0; i <= T_MAX; i++)
674 types.basic[i] = DEBUG_TYPE_NULL;
676 next_c_file = -1;
677 fnname = NULL;
678 fnclass = 0;
679 fntype = 0;
680 fnend = 0;
681 linenos = NULL;
682 within_function = FALSE;
684 while (symbols.symno < symcount)
686 asymbol *sym;
687 const char *name;
688 struct internal_syment syment;
689 union internal_auxent auxent;
690 union internal_auxent *paux;
691 debug_type type;
693 sym = syms[symbols.symno];
695 if (! bfd_coff_get_syment (abfd, sym, &syment))
697 non_fatal (_("bfd_coff_get_syment failed: %s"),
698 bfd_errmsg (bfd_get_error ()));
699 return FALSE;
702 name = bfd_asymbol_name (sym);
704 this_coff_symno = symbols.coff_symno;
706 ++symbols.symno;
707 symbols.coff_symno += 1 + syment.n_numaux;
709 /* We only worry about the first auxent, because that is the
710 only one which is relevant for debugging information. */
711 if (syment.n_numaux == 0)
712 paux = NULL;
713 else
715 if (! bfd_coff_get_auxent (abfd, sym, 0, &auxent))
717 non_fatal (_("bfd_coff_get_auxent failed: %s"),
718 bfd_errmsg (bfd_get_error ()));
719 return FALSE;
721 paux = &auxent;
724 if (this_coff_symno == next_c_file && syment.n_sclass != C_FILE)
726 /* The last C_FILE symbol points to the first external
727 symbol. */
728 if (! debug_set_filename (dhandle, "*globals*"))
729 return FALSE;
732 switch (syment.n_sclass)
734 case C_EFCN:
735 case C_EXTDEF:
736 case C_ULABEL:
737 case C_USTATIC:
738 case C_LINE:
739 case C_ALIAS:
740 case C_HIDDEN:
741 /* Just ignore these classes. */
742 break;
744 case C_FILE:
745 next_c_file = syment.n_value;
746 if (! debug_set_filename (dhandle, name))
747 return FALSE;
748 break;
750 case C_STAT:
751 /* Ignore static symbols with a type of T_NULL. These
752 represent section entries. */
753 if (syment.n_type == T_NULL)
754 break;
755 /* Fall through. */
756 case C_WEAKEXT:
757 case C_EXT:
758 if (ISFCN (syment.n_type))
760 fnname = name;
761 fnclass = syment.n_sclass;
762 fntype = syment.n_type;
763 if (syment.n_numaux > 0)
764 fnend = bfd_asymbol_value (sym) + auxent.x_sym.x_misc.x_fsize;
765 else
766 fnend = 0;
767 linenos = BFD_SEND (abfd, _get_lineno, (abfd, sym));
768 break;
770 type = parse_coff_type (abfd, &symbols, &types, this_coff_symno,
771 syment.n_type, paux, TRUE, dhandle);
772 if (type == DEBUG_TYPE_NULL)
773 return FALSE;
774 if (! parse_coff_symbol (abfd, &types, sym, this_coff_symno, &syment,
775 dhandle, type, within_function))
776 return FALSE;
777 break;
779 case C_FCN:
780 if (strcmp (name, ".bf") == 0)
782 if (fnname == NULL)
784 non_fatal (_("%ld: .bf without preceding function"),
785 this_coff_symno);
786 return FALSE;
789 type = parse_coff_type (abfd, &symbols, &types, this_coff_symno,
790 DECREF (fntype), paux, FALSE, dhandle);
791 if (type == DEBUG_TYPE_NULL)
792 return FALSE;
794 if (! debug_record_function (dhandle, fnname, type,
795 external_coff_symbol_p (fnclass),
796 bfd_asymbol_value (sym)))
797 return FALSE;
799 if (linenos != NULL)
801 int base;
802 bfd_vma addr;
804 if (syment.n_numaux == 0)
805 base = 0;
806 else
807 base = auxent.x_sym.x_misc.x_lnsz.x_lnno - 1;
809 addr = bfd_get_section_vma (abfd, bfd_get_section (sym));
811 ++linenos;
813 while (linenos->line_number != 0)
815 if (! debug_record_line (dhandle,
816 linenos->line_number + base,
817 linenos->u.offset + addr))
818 return FALSE;
819 ++linenos;
823 fnname = NULL;
824 linenos = NULL;
825 fnclass = 0;
826 fntype = 0;
828 within_function = TRUE;
830 else if (strcmp (name, ".ef") == 0)
832 if (! within_function)
834 non_fatal (_("%ld: unexpected .ef\n"), this_coff_symno);
835 return FALSE;
838 if (bfd_asymbol_value (sym) > fnend)
839 fnend = bfd_asymbol_value (sym);
840 if (! debug_end_function (dhandle, fnend))
841 return FALSE;
843 fnend = 0;
844 within_function = FALSE;
846 break;
848 case C_BLOCK:
849 if (strcmp (name, ".bb") == 0)
851 if (! debug_start_block (dhandle, bfd_asymbol_value (sym)))
852 return FALSE;
854 else if (strcmp (name, ".eb") == 0)
856 if (! debug_end_block (dhandle, bfd_asymbol_value (sym)))
857 return FALSE;
859 break;
861 default:
862 type = parse_coff_type (abfd, &symbols, &types, this_coff_symno,
863 syment.n_type, paux, TRUE, dhandle);
864 if (type == DEBUG_TYPE_NULL)
865 return FALSE;
866 if (! parse_coff_symbol (abfd, &types, sym, this_coff_symno, &syment,
867 dhandle, type, within_function))
868 return FALSE;
869 break;
873 return TRUE;