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