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