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