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