1/* stabs.c -- Parse COFF debugging information
2   Copyright 1996, 1999, 2000, 2002, 2003, 2007
3   Free Software Foundation, Inc.
4   Written by Ian Lance Taylor <ian@cygnus.com>.
5
6   This file is part of GNU Binutils.
7
8   This program is free software; you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 2 of the License, or
11   (at your option) any later version.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with this program; if not, write to the Free Software
20   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
21   02110-1301, USA.  */
22
23/* This file contains code which parses COFF debugging information.  */
24
25#include "sysdep.h"
26#include "bfd.h"
27#include "coff/internal.h"
28#include "libiberty.h"
29#include "bucomm.h"
30#include "debug.h"
31#include "budbg.h"
32
33/* FIXME: We should not need this BFD internal file.  We need it for
34   the N_BTMASK, etc., values.  */
35#include "libcoff.h"
36
37/* These macros extract the right mask and shifts for this BFD.  They
38   assume that there is a local variable named ABFD.  This is so that
39   macros like ISFCN and DECREF, from coff/internal.h, will work
40   without modification.  */
41#define N_BTMASK (coff_data (abfd)->local_n_btmask)
42#define	N_BTSHFT (coff_data (abfd)->local_n_btshft)
43#define	N_TMASK  (coff_data (abfd)->local_n_tmask)
44#define	N_TSHIFT (coff_data (abfd)->local_n_tshift)
45
46/* This structure is used to hold the symbols, as well as the current
47   location within the symbols.  */
48
49struct coff_symbols
50{
51  /* The symbols.  */
52  asymbol **syms;
53  /* The number of symbols.  */
54  long symcount;
55  /* The index of the current symbol.  */
56  long symno;
57  /* The index of the current symbol in the COFF symbol table (where
58     each auxent counts as a symbol).  */
59  long coff_symno;
60};
61
62/* The largest basic type we are prepared to handle.  */
63
64#define T_MAX (T_LNGDBL)
65
66/* This structure is used to hold slots.  */
67
68struct coff_slots
69{
70  /* Next set of slots.  */
71  struct coff_slots *next;
72  /* Slots.  */
73#define COFF_SLOTS (16)
74  debug_type slots[COFF_SLOTS];
75};
76
77/* This structure is used to map symbol indices to types.  */
78
79struct coff_types
80{
81  /* Slots.  */
82  struct coff_slots *slots;
83  /* Basic types.  */
84  debug_type basic[T_MAX + 1];
85};
86
87static debug_type *coff_get_slot (struct coff_types *, int);
88static debug_type parse_coff_type
89  (bfd *, struct coff_symbols *, struct coff_types *, long, int,
90   union internal_auxent *, bfd_boolean, void *);
91static debug_type parse_coff_base_type
92  (bfd *, struct coff_symbols *, struct coff_types *, long, int,
93   union internal_auxent *, void *);
94static debug_type parse_coff_struct_type
95  (bfd *, struct coff_symbols *, struct coff_types *, int,
96   union internal_auxent *, void *);
97static debug_type parse_coff_enum_type
98  (bfd *, struct coff_symbols *, struct coff_types *,
99   union internal_auxent *, void *);
100static bfd_boolean parse_coff_symbol
101  (bfd *, struct coff_types *, asymbol *, long, struct internal_syment *,
102   void *, debug_type, bfd_boolean);
103static bfd_boolean external_coff_symbol_p (int sym_class);
104
105/* Return the slot for a type.  */
106
107static debug_type *
108coff_get_slot (struct coff_types *types, int indx)
109{
110  struct coff_slots **pps;
111
112  pps = &types->slots;
113
114  while (indx >= COFF_SLOTS)
115    {
116      if (*pps == NULL)
117	{
118	  *pps = (struct coff_slots *) xmalloc (sizeof **pps);
119	  memset (*pps, 0, sizeof **pps);
120	}
121      pps = &(*pps)->next;
122      indx -= COFF_SLOTS;
123    }
124
125  if (*pps == NULL)
126    {
127      *pps = (struct coff_slots *) xmalloc (sizeof **pps);
128      memset (*pps, 0, sizeof **pps);
129    }
130
131  return (*pps)->slots + indx;
132}
133
134/* Parse a COFF type code in NTYPE.  */
135
136static debug_type
137parse_coff_type (bfd *abfd, struct coff_symbols *symbols,
138		 struct coff_types *types, long coff_symno, int ntype,
139		 union internal_auxent *pauxent, bfd_boolean useaux,
140		 void *dhandle)
141{
142  debug_type type;
143
144  if ((ntype & ~N_BTMASK) != 0)
145    {
146      int newtype;
147
148      newtype = DECREF (ntype);
149
150      if (ISPTR (ntype))
151	{
152	  type = parse_coff_type (abfd, symbols, types, coff_symno, newtype,
153				  pauxent, useaux, dhandle);
154	  type = debug_make_pointer_type (dhandle, type);
155	}
156      else if (ISFCN (ntype))
157	{
158	  type = parse_coff_type (abfd, symbols, types, coff_symno, newtype,
159				  pauxent, useaux, dhandle);
160	  type = debug_make_function_type (dhandle, type, (debug_type *) NULL,
161					   FALSE);
162	}
163      else if (ISARY (ntype))
164	{
165	  int n;
166
167	  if (pauxent == NULL)
168	    n = 0;
169	  else
170	    {
171	      unsigned short *dim;
172	      int i;
173
174	      /* FIXME: If pauxent->x_sym.x_tagndx.l == 0, gdb sets
175                 the c_naux field of the syment to 0.  */
176
177	      /* Move the dimensions down, so that the next array
178                 picks up the next one.  */
179	      dim = pauxent->x_sym.x_fcnary.x_ary.x_dimen;
180	      n = dim[0];
181	      for (i = 0; *dim != 0 && i < DIMNUM - 1; i++, dim++)
182		*dim = *(dim + 1);
183	      *dim = 0;
184	    }
185
186	  type = parse_coff_type (abfd, symbols, types, coff_symno, newtype,
187				  pauxent, FALSE, dhandle);
188	  type = debug_make_array_type (dhandle, type,
189					parse_coff_base_type (abfd, symbols,
190							      types,
191							      coff_symno,
192							      T_INT,
193							      NULL, dhandle),
194					0, n - 1, FALSE);
195	}
196      else
197	{
198	  non_fatal (_("parse_coff_type: Bad type code 0x%x"), ntype);
199	  return DEBUG_TYPE_NULL;
200	}
201
202      return type;
203    }
204
205  if (pauxent != NULL && pauxent->x_sym.x_tagndx.l > 0)
206    {
207      debug_type *slot;
208
209      /* This is a reference to an existing type.  FIXME: gdb checks
210	 that the class is not C_STRTAG, nor C_UNTAG, nor C_ENTAG.  */
211      slot = coff_get_slot (types, pauxent->x_sym.x_tagndx.l);
212      if (*slot != DEBUG_TYPE_NULL)
213	return *slot;
214      else
215	return debug_make_indirect_type (dhandle, slot, (const char *) NULL);
216    }
217
218  /* If the aux entry has already been used for something, useaux will
219     have been set to false, indicating that parse_coff_base_type
220     should not use it.  We need to do it this way, rather than simply
221     passing pauxent as NULL, because we need to be able handle
222     multiple array dimensions while still discarding pauxent after
223     having handled all of them.  */
224  if (! useaux)
225    pauxent = NULL;
226
227  return parse_coff_base_type (abfd, symbols, types, coff_symno, ntype,
228			       pauxent, dhandle);
229}
230
231/* Parse a basic COFF type in NTYPE.  */
232
233static debug_type
234parse_coff_base_type (bfd *abfd, struct coff_symbols *symbols,
235		      struct coff_types *types, long coff_symno, int ntype,
236		      union internal_auxent *pauxent, void *dhandle)
237{
238  debug_type ret;
239  bfd_boolean set_basic;
240  const char *name;
241  debug_type *slot;
242
243  if (ntype >= 0
244      && ntype <= T_MAX
245      && types->basic[ntype] != DEBUG_TYPE_NULL)
246    return types->basic[ntype];
247
248  set_basic = TRUE;
249  name = NULL;
250
251  switch (ntype)
252    {
253    default:
254      ret = debug_make_void_type (dhandle);
255      break;
256
257    case T_NULL:
258    case T_VOID:
259      ret = debug_make_void_type (dhandle);
260      name = "void";
261      break;
262
263    case T_CHAR:
264      ret = debug_make_int_type (dhandle, 1, FALSE);
265      name = "char";
266      break;
267
268    case T_SHORT:
269      ret = debug_make_int_type (dhandle, 2, FALSE);
270      name = "short";
271      break;
272
273    case T_INT:
274      /* FIXME: Perhaps the size should depend upon the architecture.  */
275      ret = debug_make_int_type (dhandle, 4, FALSE);
276      name = "int";
277      break;
278
279    case T_LONG:
280      ret = debug_make_int_type (dhandle, 4, FALSE);
281      name = "long";
282      break;
283
284    case T_FLOAT:
285      ret = debug_make_float_type (dhandle, 4);
286      name = "float";
287      break;
288
289    case T_DOUBLE:
290      ret = debug_make_float_type (dhandle, 8);
291      name = "double";
292      break;
293
294    case T_LNGDBL:
295      ret = debug_make_float_type (dhandle, 12);
296      name = "long double";
297      break;
298
299    case T_UCHAR:
300      ret = debug_make_int_type (dhandle, 1, TRUE);
301      name = "unsigned char";
302      break;
303
304    case T_USHORT:
305      ret = debug_make_int_type (dhandle, 2, TRUE);
306      name = "unsigned short";
307      break;
308
309    case T_UINT:
310      ret = debug_make_int_type (dhandle, 4, TRUE);
311      name = "unsigned int";
312      break;
313
314    case T_ULONG:
315      ret = debug_make_int_type (dhandle, 4, TRUE);
316      name = "unsigned long";
317      break;
318
319    case T_STRUCT:
320      if (pauxent == NULL)
321	ret = debug_make_struct_type (dhandle, TRUE, 0,
322				      (debug_field *) NULL);
323      else
324	ret = parse_coff_struct_type (abfd, symbols, types, ntype, pauxent,
325				      dhandle);
326
327      slot = coff_get_slot (types, coff_symno);
328      *slot = ret;
329
330      set_basic = FALSE;
331      break;
332
333    case T_UNION:
334      if (pauxent == NULL)
335	ret = debug_make_struct_type (dhandle, FALSE, 0, (debug_field *) NULL);
336      else
337	ret = parse_coff_struct_type (abfd, symbols, types, ntype, pauxent,
338				      dhandle);
339
340      slot = coff_get_slot (types, coff_symno);
341      *slot = ret;
342
343      set_basic = FALSE;
344      break;
345
346    case T_ENUM:
347      if (pauxent == NULL)
348	ret = debug_make_enum_type (dhandle, (const char **) NULL,
349				    (bfd_signed_vma *) NULL);
350      else
351	ret = parse_coff_enum_type (abfd, symbols, types, pauxent, dhandle);
352
353      slot = coff_get_slot (types, coff_symno);
354      *slot = ret;
355
356      set_basic = FALSE;
357      break;
358    }
359
360  if (name != NULL)
361    ret = debug_name_type (dhandle, name, ret);
362
363  if (set_basic
364      && ntype >= 0
365      && ntype <= T_MAX)
366    types->basic[ntype] = ret;
367
368  return ret;
369}
370
371/* Parse a struct type.  */
372
373static debug_type
374parse_coff_struct_type (bfd *abfd, struct coff_symbols *symbols,
375			struct coff_types *types, int ntype,
376			union internal_auxent *pauxent, void *dhandle)
377{
378  long symend;
379  int alloc;
380  debug_field *fields;
381  int count;
382  bfd_boolean done;
383
384  symend = pauxent->x_sym.x_fcnary.x_fcn.x_endndx.l;
385
386  alloc = 10;
387  fields = (debug_field *) xmalloc (alloc * sizeof *fields);
388  count = 0;
389
390  done = FALSE;
391  while (! done
392	 && symbols->coff_symno < symend
393	 && symbols->symno < symbols->symcount)
394    {
395      asymbol *sym;
396      long this_coff_symno;
397      struct internal_syment syment;
398      union internal_auxent auxent;
399      union internal_auxent *psubaux;
400      bfd_vma bitpos = 0, bitsize = 0;
401
402      sym = symbols->syms[symbols->symno];
403
404      if (! bfd_coff_get_syment (abfd, sym, &syment))
405	{
406	  non_fatal (_("bfd_coff_get_syment failed: %s"),
407		     bfd_errmsg (bfd_get_error ()));
408	  return DEBUG_TYPE_NULL;
409	}
410
411      this_coff_symno = symbols->coff_symno;
412
413      ++symbols->symno;
414      symbols->coff_symno += 1 + syment.n_numaux;
415
416      if (syment.n_numaux == 0)
417	psubaux = NULL;
418      else
419	{
420	  if (! bfd_coff_get_auxent (abfd, sym, 0, &auxent))
421	    {
422	      non_fatal (_("bfd_coff_get_auxent failed: %s"),
423			 bfd_errmsg (bfd_get_error ()));
424	      return DEBUG_TYPE_NULL;
425	    }
426	  psubaux = &auxent;
427	}
428
429      switch (syment.n_sclass)
430	{
431	case C_MOS:
432	case C_MOU:
433	  bitpos = 8 * bfd_asymbol_value (sym);
434	  bitsize = 0;
435	  break;
436
437	case C_FIELD:
438	  bitpos = bfd_asymbol_value (sym);
439	  bitsize = auxent.x_sym.x_misc.x_lnsz.x_size;
440	  break;
441
442	case C_EOS:
443	  done = TRUE;
444	  break;
445	}
446
447      if (! done)
448	{
449	  debug_type ftype;
450	  debug_field f;
451
452	  ftype = parse_coff_type (abfd, symbols, types, this_coff_symno,
453				   syment.n_type, psubaux, TRUE, dhandle);
454	  f = debug_make_field (dhandle, bfd_asymbol_name (sym), ftype,
455				bitpos, bitsize, DEBUG_VISIBILITY_PUBLIC);
456	  if (f == DEBUG_FIELD_NULL)
457	    return DEBUG_TYPE_NULL;
458
459	  if (count + 1 >= alloc)
460	    {
461	      alloc += 10;
462	      fields = ((debug_field *)
463			xrealloc (fields, alloc * sizeof *fields));
464	    }
465
466	  fields[count] = f;
467	  ++count;
468	}
469    }
470
471  fields[count] = DEBUG_FIELD_NULL;
472
473  return debug_make_struct_type (dhandle, ntype == T_STRUCT,
474				 pauxent->x_sym.x_misc.x_lnsz.x_size,
475				 fields);
476}
477
478/* Parse an enum type.  */
479
480static debug_type
481parse_coff_enum_type (bfd *abfd, struct coff_symbols *symbols,
482		      struct coff_types *types ATTRIBUTE_UNUSED,
483		      union internal_auxent *pauxent, void *dhandle)
484{
485  long symend;
486  int alloc;
487  const char **names;
488  bfd_signed_vma *vals;
489  int count;
490  bfd_boolean done;
491
492  symend = pauxent->x_sym.x_fcnary.x_fcn.x_endndx.l;
493
494  alloc = 10;
495  names = (const char **) xmalloc (alloc * sizeof *names);
496  vals = (bfd_signed_vma *) xmalloc (alloc * sizeof *vals);
497  count = 0;
498
499  done = FALSE;
500  while (! done
501	 && symbols->coff_symno < symend
502	 && symbols->symno < symbols->symcount)
503    {
504      asymbol *sym;
505      struct internal_syment syment;
506
507      sym = symbols->syms[symbols->symno];
508
509      if (! bfd_coff_get_syment (abfd, sym, &syment))
510	{
511	  non_fatal (_("bfd_coff_get_syment failed: %s"),
512		     bfd_errmsg (bfd_get_error ()));
513	  return DEBUG_TYPE_NULL;
514	}
515
516      ++symbols->symno;
517      symbols->coff_symno += 1 + syment.n_numaux;
518
519      switch (syment.n_sclass)
520	{
521	case C_MOE:
522	  if (count + 1 >= alloc)
523	    {
524	      alloc += 10;
525	      names = ((const char **)
526		       xrealloc (names, alloc * sizeof *names));
527	      vals = ((bfd_signed_vma *)
528		      xrealloc (vals, alloc * sizeof *vals));
529	    }
530
531	  names[count] = bfd_asymbol_name (sym);
532	  vals[count] = bfd_asymbol_value (sym);
533	  ++count;
534	  break;
535
536	case C_EOS:
537	  done = TRUE;
538	  break;
539	}
540    }
541
542  names[count] = NULL;
543
544  return debug_make_enum_type (dhandle, names, vals);
545}
546
547/* Handle a single COFF symbol.  */
548
549static bfd_boolean
550parse_coff_symbol (bfd *abfd ATTRIBUTE_UNUSED, struct coff_types *types,
551		   asymbol *sym, long coff_symno,
552		   struct internal_syment *psyment, void *dhandle,
553		   debug_type type, bfd_boolean within_function)
554{
555  switch (psyment->n_sclass)
556    {
557    case C_NULL:
558      break;
559
560    case C_AUTO:
561      if (! debug_record_variable (dhandle, bfd_asymbol_name (sym), type,
562				   DEBUG_LOCAL, bfd_asymbol_value (sym)))
563	return FALSE;
564      break;
565
566    case C_WEAKEXT:
567    case C_EXT:
568      if (! debug_record_variable (dhandle, bfd_asymbol_name (sym), type,
569				   DEBUG_GLOBAL, bfd_asymbol_value (sym)))
570	return FALSE;
571      break;
572
573    case C_STAT:
574      if (! debug_record_variable (dhandle, bfd_asymbol_name (sym), type,
575				   (within_function
576				    ? DEBUG_LOCAL_STATIC
577				    : DEBUG_STATIC),
578				   bfd_asymbol_value (sym)))
579	return FALSE;
580      break;
581
582    case C_REG:
583      /* FIXME: We may need to convert the register number.  */
584      if (! debug_record_variable (dhandle, bfd_asymbol_name (sym), type,
585				   DEBUG_REGISTER, bfd_asymbol_value (sym)))
586	return FALSE;
587      break;
588
589    case C_LABEL:
590      break;
591
592    case C_ARG:
593      if (! debug_record_parameter (dhandle, bfd_asymbol_name (sym), type,
594				    DEBUG_PARM_STACK, bfd_asymbol_value (sym)))
595	return FALSE;
596      break;
597
598    case C_REGPARM:
599      /* FIXME: We may need to convert the register number.  */
600      if (! debug_record_parameter (dhandle, bfd_asymbol_name (sym), type,
601				    DEBUG_PARM_REG, bfd_asymbol_value (sym)))
602	return FALSE;
603      break;
604
605    case C_TPDEF:
606      type = debug_name_type (dhandle, bfd_asymbol_name (sym), type);
607      if (type == DEBUG_TYPE_NULL)
608	return FALSE;
609      break;
610
611    case C_STRTAG:
612    case C_UNTAG:
613    case C_ENTAG:
614      {
615	debug_type *slot;
616
617	type = debug_tag_type (dhandle, bfd_asymbol_name (sym), type);
618	if (type == DEBUG_TYPE_NULL)
619	  return FALSE;
620
621	/* Store the named type into the slot, so that references get
622           the name.  */
623	slot = coff_get_slot (types, coff_symno);
624	*slot = type;
625      }
626      break;
627
628    default:
629      break;
630    }
631
632  return TRUE;
633}
634
635/* Determine if a symbol has external visibility.  */
636
637static bfd_boolean
638external_coff_symbol_p (int sym_class)
639{
640  switch (sym_class)
641    {
642    case C_EXT:
643    case C_WEAKEXT:
644      return TRUE;
645    default:
646      break;
647    }
648  return FALSE;
649}
650
651/* This is the main routine.  It looks through all the symbols and
652   handles them.  */
653
654bfd_boolean
655parse_coff (bfd *abfd, asymbol **syms, long symcount, void *dhandle)
656{
657  struct coff_symbols symbols;
658  struct coff_types types;
659  int i;
660  long next_c_file;
661  const char *fnname;
662  int fnclass;
663  int fntype;
664  bfd_vma fnend;
665  alent *linenos;
666  bfd_boolean within_function;
667  long this_coff_symno;
668
669  symbols.syms = syms;
670  symbols.symcount = symcount;
671  symbols.symno = 0;
672  symbols.coff_symno = 0;
673
674  types.slots = NULL;
675  for (i = 0; i <= T_MAX; i++)
676    types.basic[i] = DEBUG_TYPE_NULL;
677
678  next_c_file = -1;
679  fnname = NULL;
680  fnclass = 0;
681  fntype = 0;
682  fnend = 0;
683  linenos = NULL;
684  within_function = FALSE;
685
686  while (symbols.symno < symcount)
687    {
688      asymbol *sym;
689      const char *name;
690      struct internal_syment syment;
691      union internal_auxent auxent;
692      union internal_auxent *paux;
693      debug_type type;
694
695      sym = syms[symbols.symno];
696
697      if (! bfd_coff_get_syment (abfd, sym, &syment))
698	{
699	  non_fatal (_("bfd_coff_get_syment failed: %s"),
700		     bfd_errmsg (bfd_get_error ()));
701	  return FALSE;
702	}
703
704      name = bfd_asymbol_name (sym);
705
706      this_coff_symno = symbols.coff_symno;
707
708      ++symbols.symno;
709      symbols.coff_symno += 1 + syment.n_numaux;
710
711      /* We only worry about the first auxent, because that is the
712	 only one which is relevant for debugging information.  */
713      if (syment.n_numaux == 0)
714	paux = NULL;
715      else
716	{
717	  if (! bfd_coff_get_auxent (abfd, sym, 0, &auxent))
718	    {
719	      non_fatal (_("bfd_coff_get_auxent failed: %s"),
720			 bfd_errmsg (bfd_get_error ()));
721	      return FALSE;
722	    }
723	  paux = &auxent;
724	}
725
726      if (this_coff_symno == next_c_file && syment.n_sclass != C_FILE)
727	{
728	  /* The last C_FILE symbol points to the first external
729             symbol.  */
730	  if (! debug_set_filename (dhandle, "*globals*"))
731	    return FALSE;
732	}
733
734      switch (syment.n_sclass)
735	{
736	case C_EFCN:
737	case C_EXTDEF:
738	case C_ULABEL:
739	case C_USTATIC:
740	case C_LINE:
741	case C_ALIAS:
742	case C_HIDDEN:
743	  /* Just ignore these classes.  */
744	  break;
745
746	case C_FILE:
747	  next_c_file = syment.n_value;
748	  if (! debug_set_filename (dhandle, name))
749	    return FALSE;
750	  break;
751
752	case C_STAT:
753	  /* Ignore static symbols with a type of T_NULL.  These
754             represent section entries.  */
755	  if (syment.n_type == T_NULL)
756	    break;
757	  /* Fall through.  */
758	case C_WEAKEXT:
759	case C_EXT:
760	  if (ISFCN (syment.n_type))
761	    {
762	      fnname = name;
763	      fnclass = syment.n_sclass;
764	      fntype = syment.n_type;
765	      if (syment.n_numaux > 0)
766		fnend = bfd_asymbol_value (sym) + auxent.x_sym.x_misc.x_fsize;
767	      else
768		fnend = 0;
769	      linenos = BFD_SEND (abfd, _get_lineno, (abfd, sym));
770	      break;
771	    }
772	  type = parse_coff_type (abfd, &symbols, &types, this_coff_symno,
773				  syment.n_type, paux, TRUE, dhandle);
774	  if (type == DEBUG_TYPE_NULL)
775	    return FALSE;
776	  if (! parse_coff_symbol (abfd, &types, sym, this_coff_symno, &syment,
777				   dhandle, type, within_function))
778	    return FALSE;
779	  break;
780
781	case C_FCN:
782	  if (strcmp (name, ".bf") == 0)
783	    {
784	      if (fnname == NULL)
785		{
786		  non_fatal (_("%ld: .bf without preceding function"),
787			     this_coff_symno);
788		  return FALSE;
789		}
790
791	      type = parse_coff_type (abfd, &symbols, &types, this_coff_symno,
792				      DECREF (fntype), paux, FALSE, dhandle);
793	      if (type == DEBUG_TYPE_NULL)
794		return FALSE;
795
796	      if (! debug_record_function (dhandle, fnname, type,
797					   external_coff_symbol_p (fnclass),
798					   bfd_asymbol_value (sym)))
799		return FALSE;
800
801	      if (linenos != NULL)
802		{
803		  int base;
804		  bfd_vma addr;
805
806		  if (syment.n_numaux == 0)
807		    base = 0;
808		  else
809		    base = auxent.x_sym.x_misc.x_lnsz.x_lnno - 1;
810
811		  addr = bfd_get_section_vma (abfd, bfd_get_section (sym));
812
813		  ++linenos;
814
815		  while (linenos->line_number != 0)
816		    {
817		      if (! debug_record_line (dhandle,
818					       linenos->line_number + base,
819					       linenos->u.offset + addr))
820			return FALSE;
821		      ++linenos;
822		    }
823		}
824
825	      fnname = NULL;
826	      linenos = NULL;
827	      fnclass = 0;
828	      fntype = 0;
829
830	      within_function = TRUE;
831	    }
832	  else if (strcmp (name, ".ef") == 0)
833	    {
834	      if (! within_function)
835		{
836		  non_fatal (_("%ld: unexpected .ef\n"), this_coff_symno);
837		  return FALSE;
838		}
839
840	      if (bfd_asymbol_value (sym) > fnend)
841		fnend = bfd_asymbol_value (sym);
842	      if (! debug_end_function (dhandle, fnend))
843		return FALSE;
844
845	      fnend = 0;
846	      within_function = FALSE;
847	    }
848	  break;
849
850	case C_BLOCK:
851	  if (strcmp (name, ".bb") == 0)
852	    {
853	      if (! debug_start_block (dhandle, bfd_asymbol_value (sym)))
854		return FALSE;
855	    }
856	  else if (strcmp (name, ".eb") == 0)
857	    {
858	      if (! debug_end_block (dhandle, bfd_asymbol_value (sym)))
859		return FALSE;
860	    }
861	  break;
862
863	default:
864	  type = parse_coff_type (abfd, &symbols, &types, this_coff_symno,
865				  syment.n_type, paux, TRUE, dhandle);
866	  if (type == DEBUG_TYPE_NULL)
867	    return FALSE;
868	  if (! parse_coff_symbol (abfd, &types, sym, this_coff_symno, &syment,
869				   dhandle, type, within_function))
870	    return FALSE;
871	  break;
872	}
873    }
874
875  return TRUE;
876}
877