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