|
|
1.1 ! root 1: /* Symbol table lookup for the GNU debugger, GDB. ! 2: Copyright (C) 1986, 1987, 1988 Free Software Foundation, Inc. ! 3: ! 4: GDB is distributed in the hope that it will be useful, but WITHOUT ANY ! 5: WARRANTY. No author or distributor accepts responsibility to anyone ! 6: for the consequences of using it or for whether it serves any ! 7: particular purpose or works at all, unless he says so in writing. ! 8: Refer to the GDB General Public License for full details. ! 9: ! 10: Everyone is granted permission to copy, modify and redistribute GDB, ! 11: but only under the conditions described in the GDB General Public ! 12: License. A copy of this license is supposed to have been given to you ! 13: along with GDB so you can know your rights and responsibilities. It ! 14: should be in a file named COPYING. Among other things, the copyright ! 15: notice and this notice must be preserved on all copies. ! 16: ! 17: In other words, go ahead and share GDB, but don't try to stop ! 18: anyone else from sharing it farther. Help stamp out software hoarding! ! 19: */ ! 20: ! 21: #include "defs.h" ! 22: #include "initialize.h" ! 23: #include "symtab.h" ! 24: #include "param.h" ! 25: ! 26: #include <stdio.h> ! 27: #include <obstack.h> ! 28: ! 29: START_FILE ! 30: ! 31: /* Allocate an obstack to hold objects that should be freed ! 32: when we load a new symbol table. ! 33: This includes the symbols made by dbxread ! 34: and the types that are not permanent. */ ! 35: ! 36: struct obstack obstack1; ! 37: ! 38: struct obstack *symbol_obstack = &obstack1; ! 39: ! 40: /* These variables point to the objects ! 41: representing the predefined C data types. */ ! 42: ! 43: struct type *builtin_type_void; ! 44: struct type *builtin_type_char; ! 45: struct type *builtin_type_short; ! 46: struct type *builtin_type_int; ! 47: struct type *builtin_type_long; ! 48: struct type *builtin_type_unsigned_char; ! 49: struct type *builtin_type_unsigned_short; ! 50: struct type *builtin_type_unsigned_int; ! 51: struct type *builtin_type_unsigned_long; ! 52: struct type *builtin_type_float; ! 53: struct type *builtin_type_double; ! 54: ! 55: /* Lookup the symbol table of a source file named NAME. */ ! 56: ! 57: struct symtab * ! 58: lookup_symtab (name) ! 59: char *name; ! 60: { ! 61: register struct symtab *s; ! 62: register char *copy; ! 63: ! 64: for (s = symtab_list; s; s = s->next) ! 65: if (!strcmp (name, s->filename)) ! 66: return s; ! 67: ! 68: /* If name not found as specified, see if adding ".c" helps. */ ! 69: ! 70: copy = (char *) alloca (strlen (name) + 3); ! 71: strcpy (copy, name); ! 72: strcat (copy, ".c"); ! 73: for (s = symtab_list; s; s = s->next) ! 74: if (!strcmp (copy, s->filename)) ! 75: return s; ! 76: ! 77: return 0; ! 78: } ! 79: ! 80: /* Lookup a typedef or primitive type named NAME, ! 81: visible in lexical block BLOCK. ! 82: If NOERR is nonzero, return zero if NAME is not suitably defined. */ ! 83: ! 84: struct type * ! 85: lookup_typename (name, block, noerr) ! 86: char *name; ! 87: struct block *block; ! 88: int noerr; ! 89: { ! 90: register struct symbol *sym = lookup_symbol (name, block, VAR_NAMESPACE); ! 91: if (sym == 0 || SYMBOL_CLASS (sym) != LOC_TYPEDEF) ! 92: { ! 93: if (!strcmp (name, "int")) ! 94: return builtin_type_int; ! 95: if (!strcmp (name, "long")) ! 96: return builtin_type_long; ! 97: if (!strcmp (name, "short")) ! 98: return builtin_type_short; ! 99: if (!strcmp (name, "char")) ! 100: return builtin_type_char; ! 101: if (!strcmp (name, "float")) ! 102: return builtin_type_float; ! 103: if (!strcmp (name, "double")) ! 104: return builtin_type_double; ! 105: if (!strcmp (name, "void")) ! 106: return builtin_type_void; ! 107: ! 108: if (noerr) ! 109: return 0; ! 110: error ("No type named %s.", name); ! 111: } ! 112: return SYMBOL_TYPE (sym); ! 113: } ! 114: ! 115: struct type * ! 116: lookup_unsigned_typename (name) ! 117: char *name; ! 118: { ! 119: if (!strcmp (name, "int")) ! 120: return builtin_type_unsigned_int; ! 121: if (!strcmp (name, "long")) ! 122: return builtin_type_unsigned_long; ! 123: if (!strcmp (name, "short")) ! 124: return builtin_type_unsigned_short; ! 125: if (!strcmp (name, "char")) ! 126: return builtin_type_unsigned_char; ! 127: error ("No type named unsigned %s.", name); ! 128: } ! 129: ! 130: /* Lookup a structure type named "struct NAME", ! 131: visible in lexical block BLOCK. */ ! 132: ! 133: struct type * ! 134: lookup_struct (name, block) ! 135: char *name; ! 136: struct block *block; ! 137: { ! 138: register struct symbol *sym = lookup_symbol (name, block, STRUCT_NAMESPACE); ! 139: if (sym == 0) ! 140: error ("No struct type named %s.", name); ! 141: if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_STRUCT) ! 142: error ("This context has union or enum %s, not a struct.", name); ! 143: return SYMBOL_TYPE (sym); ! 144: } ! 145: ! 146: /* Lookup a union type named "union NAME", ! 147: visible in lexical block BLOCK. */ ! 148: ! 149: struct type * ! 150: lookup_union (name, block) ! 151: char *name; ! 152: struct block *block; ! 153: { ! 154: register struct symbol *sym = lookup_symbol (name, block, STRUCT_NAMESPACE); ! 155: if (sym == 0) ! 156: error ("No union type named %s.", name); ! 157: if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_UNION) ! 158: error ("This context has struct or enum %s, not a union.", name); ! 159: return SYMBOL_TYPE (sym); ! 160: } ! 161: ! 162: /* Lookup an enum type named "enum NAME", ! 163: visible in lexical block BLOCK. */ ! 164: ! 165: struct type * ! 166: lookup_enum (name, block) ! 167: char *name; ! 168: struct block *block; ! 169: { ! 170: register struct symbol *sym = lookup_symbol (name, block, STRUCT_NAMESPACE); ! 171: if (sym == 0) ! 172: error ("No enum type named %s.", name); ! 173: if (TYPE_CODE (SYMBOL_TYPE (sym)) != TYPE_CODE_ENUM) ! 174: error ("This context has struct or union %s, not an enum.", name); ! 175: return SYMBOL_TYPE (sym); ! 176: } ! 177: ! 178: /* Given a type TYPE, return a type of pointers to that type. ! 179: May need to construct such a type if this is the first use. */ ! 180: ! 181: struct type * ! 182: lookup_pointer_type (type) ! 183: struct type *type; ! 184: { ! 185: register struct type *ptype = TYPE_POINTER_TYPE (type); ! 186: if (ptype) return ptype; ! 187: ! 188: /* This is the first time anyone wanted a pointer to a TYPE. */ ! 189: if (TYPE_FLAGS (type) & TYPE_FLAG_PERM) ! 190: ptype = (struct type *) xmalloc (sizeof (struct type)); ! 191: else ! 192: ptype = (struct type *) obstack_alloc (symbol_obstack, ! 193: sizeof (struct type)); ! 194: ! 195: bzero (ptype, sizeof (struct type)); ! 196: TYPE_TARGET_TYPE (ptype) = type; ! 197: TYPE_POINTER_TYPE (type) = ptype; ! 198: /* New type is permanent if type pointed to is permanent. */ ! 199: if (TYPE_FLAGS (type) & TYPE_FLAG_PERM) ! 200: TYPE_FLAGS (ptype) |= TYPE_FLAG_PERM; ! 201: /* We assume the machine has only one representation for pointers! */ ! 202: TYPE_LENGTH (ptype) = sizeof (char *); ! 203: TYPE_CODE (ptype) = TYPE_CODE_PTR; ! 204: return ptype; ! 205: } ! 206: ! 207: /* Given a type TYPE, return a type of functions that return that type. ! 208: May need to construct such a type if this is the first use. */ ! 209: ! 210: struct type * ! 211: lookup_function_type (type) ! 212: struct type *type; ! 213: { ! 214: register struct type *ptype = TYPE_FUNCTION_TYPE (type); ! 215: if (ptype) return ptype; ! 216: ! 217: /* This is the first time anyone wanted a function returning a TYPE. */ ! 218: if (TYPE_FLAGS (type) & TYPE_FLAG_PERM) ! 219: ptype = (struct type *) xmalloc (sizeof (struct type)); ! 220: else ! 221: ptype = (struct type *) obstack_alloc (symbol_obstack, ! 222: sizeof (struct type)); ! 223: ! 224: bzero (ptype, sizeof (struct type)); ! 225: TYPE_TARGET_TYPE (ptype) = type; ! 226: TYPE_FUNCTION_TYPE (type) = ptype; ! 227: /* New type is permanent if type returned is permanent. */ ! 228: if (TYPE_FLAGS (type) & TYPE_FLAG_PERM) ! 229: TYPE_FLAGS (ptype) |= TYPE_FLAG_PERM; ! 230: TYPE_LENGTH (ptype) = 1; ! 231: TYPE_CODE (ptype) = TYPE_CODE_FUNC; ! 232: TYPE_NFIELDS (ptype) = 0; ! 233: return ptype; ! 234: } ! 235: ! 236: /* Smash TYPE to be a type of pointers to TO_TYPE. ! 237: If TO_TYPE is not permanent and has no pointer-type yet, ! 238: record TYPE as its pointer-type. */ ! 239: ! 240: void ! 241: smash_to_pointer_type (type, to_type) ! 242: struct type *type, *to_type; ! 243: { ! 244: bzero (type, sizeof (struct type)); ! 245: TYPE_TARGET_TYPE (type) = to_type; ! 246: /* We assume the machine has only one representation for pointers! */ ! 247: TYPE_LENGTH (type) = sizeof (char *); ! 248: TYPE_CODE (type) = TYPE_CODE_PTR; ! 249: ! 250: if (TYPE_POINTER_TYPE (to_type) == 0 ! 251: && !(TYPE_FLAGS (type) & TYPE_FLAG_PERM)) ! 252: { ! 253: TYPE_POINTER_TYPE (to_type) = type; ! 254: } ! 255: } ! 256: ! 257: /* Smash TYPE to be a type of functions returning TO_TYPE. ! 258: If TO_TYPE is not permanent and has no function-type yet, ! 259: record TYPE as its function-type. */ ! 260: ! 261: void ! 262: smash_to_function_type (type, to_type) ! 263: struct type *type, *to_type; ! 264: { ! 265: bzero (type, sizeof (struct type)); ! 266: TYPE_TARGET_TYPE (type) = to_type; ! 267: TYPE_LENGTH (type) = 1; ! 268: TYPE_CODE (type) = TYPE_CODE_FUNC; ! 269: TYPE_NFIELDS (type) = 0; ! 270: ! 271: if (TYPE_FUNCTION_TYPE (to_type) == 0 ! 272: && !(TYPE_FLAGS (type) & TYPE_FLAG_PERM)) ! 273: { ! 274: TYPE_FUNCTION_TYPE (to_type) = type; ! 275: } ! 276: } ! 277: ! 278: static struct symbol *lookup_block_symbol (); ! 279: ! 280: /* Find the definition for a specified symbol name NAME ! 281: in namespace NAMESPACE, visible from lexical block BLOCK. ! 282: Returns the struct symbol pointer, or zero if no symbol is found. */ ! 283: ! 284: struct symbol * ! 285: lookup_symbol (name, block, namespace) ! 286: char *name; ! 287: register struct block *block; ! 288: enum namespace namespace; ! 289: { ! 290: register int i, n; ! 291: register struct symbol *sym; ! 292: register struct symtab *s; ! 293: struct blockvector *bv; ! 294: ! 295: /* Search specified block and its superiors. */ ! 296: ! 297: while (block != 0) ! 298: { ! 299: sym = lookup_block_symbol (block, name, namespace); ! 300: if (sym) return sym; ! 301: block = BLOCK_SUPERBLOCK (block); ! 302: } ! 303: ! 304: /* Now search all symtabs' global blocks. */ ! 305: ! 306: for (s = symtab_list; s; s = s->next) ! 307: { ! 308: bv = BLOCKVECTOR (s); ! 309: block = BLOCKVECTOR_BLOCK (bv, 0); ! 310: sym = lookup_block_symbol (block, name, namespace); ! 311: if (sym) return sym; ! 312: } ! 313: ! 314: /* Now search all symtabs' per-file blocks. ! 315: Not strictly correct, but more useful than an error. */ ! 316: ! 317: for (s = symtab_list; s; s = s->next) ! 318: { ! 319: bv = BLOCKVECTOR (s); ! 320: block = BLOCKVECTOR_BLOCK (bv, 1); ! 321: sym = lookup_block_symbol (block, name, namespace); ! 322: if (sym) return sym; ! 323: } ! 324: return 0; ! 325: } ! 326: ! 327: /* Look for a symbol in block BLOCK. */ ! 328: ! 329: static struct symbol * ! 330: lookup_block_symbol (block, name, namespace) ! 331: register struct block *block; ! 332: char *name; ! 333: enum namespace namespace; ! 334: { ! 335: register int bot, top, inc; ! 336: register struct symbol *sym; ! 337: ! 338: top = BLOCK_NSYMS (block); ! 339: bot = 0; ! 340: ! 341: /* If the blocks's symbols were sorted, start with a binary search. */ ! 342: ! 343: if (BLOCK_SHOULD_SORT (block)) ! 344: { ! 345: /* First, advance BOT to not far before ! 346: the first symbol whose name is NAME. */ ! 347: ! 348: while (1) ! 349: { ! 350: inc = (top - bot + 1); ! 351: /* No need to keep binary searching for the last few bits worth. */ ! 352: if (inc < 4) ! 353: break; ! 354: inc = (inc >> 1) + bot; ! 355: sym = BLOCK_SYM (block, inc); ! 356: if (SYMBOL_NAME (sym)[0] < name[0]) ! 357: bot = inc; ! 358: else if (SYMBOL_NAME (sym)[0] > name[0]) ! 359: top = inc; ! 360: else if (strcmp (SYMBOL_NAME (sym), name) < 0) ! 361: bot = inc; ! 362: else ! 363: top = inc; ! 364: } ! 365: ! 366: /* Now scan forward until we run out of symbols, ! 367: find one whose name is greater than NAME, ! 368: or find one we want. ! 369: If there is more than one symbol with the right name and namespace, ! 370: we return the first one. dbxread.c is careful to make sure ! 371: that if one is a register then it comes first. */ ! 372: ! 373: top = BLOCK_NSYMS (block); ! 374: while (bot < top) ! 375: { ! 376: sym = BLOCK_SYM (block, bot); ! 377: inc = SYMBOL_NAME (sym)[0] - name[0]; ! 378: if (inc == 0) ! 379: inc = strcmp (SYMBOL_NAME (sym), name); ! 380: if (inc == 0 && SYMBOL_NAMESPACE (sym) == namespace) ! 381: return sym; ! 382: if (inc > 0) ! 383: return 0; ! 384: bot++; ! 385: } ! 386: return 0; ! 387: } ! 388: ! 389: /* Here if block isn't sorted. ! 390: This loop is equivalent to the loop above, ! 391: but hacked greatly for speed. */ ! 392: ! 393: top = BLOCK_NSYMS (block); ! 394: inc = name[0]; ! 395: while (bot < top) ! 396: { ! 397: sym = BLOCK_SYM (block, bot); ! 398: if (SYMBOL_NAME (sym)[0] == inc ! 399: && !strcmp (SYMBOL_NAME (sym), name) ! 400: && SYMBOL_NAMESPACE (sym) == namespace) ! 401: return sym; ! 402: bot++; ! 403: } ! 404: return 0; ! 405: } ! 406: ! 407: /* Return the symbol for the function which contains a specified ! 408: lexical block, described by a struct block BL. */ ! 409: ! 410: struct symbol * ! 411: block_function (bl) ! 412: struct block *bl; ! 413: { ! 414: while (BLOCK_FUNCTION (bl) == 0 && BLOCK_SUPERBLOCK (bl) != 0) ! 415: bl = BLOCK_SUPERBLOCK (bl); ! 416: ! 417: return BLOCK_FUNCTION (bl); ! 418: } ! 419: ! 420: /* Subroutine of find_pc_line */ ! 421: ! 422: static struct symtab * ! 423: find_pc_symtab (pc) ! 424: register CORE_ADDR pc; ! 425: { ! 426: register struct block *b; ! 427: struct blockvector *bv; ! 428: register struct symtab *s; ! 429: ! 430: /* Search all symtabs for one whose file contains our pc */ ! 431: ! 432: for (s = symtab_list; s; s = s->next) ! 433: { ! 434: bv = BLOCKVECTOR (s); ! 435: b = BLOCKVECTOR_BLOCK (bv, 0); ! 436: if (BLOCK_START (b) <= pc ! 437: && BLOCK_END (b) > pc) ! 438: break; ! 439: } ! 440: ! 441: return s; ! 442: } ! 443: ! 444: /* Find the source file and line number for a given PC value. ! 445: Return a structure containing a symtab pointer, a line number, ! 446: and a pc range for the entire source line. ! 447: The value's .pc field is NOT the specified pc. ! 448: NOTCURRENT nonzero means, if specified pc is on a line boundary, ! 449: use the line that ends there. Otherwise, in that case, the line ! 450: that begins there is used. */ ! 451: ! 452: struct symtab_and_line ! 453: find_pc_line (pc, notcurrent) ! 454: CORE_ADDR pc; ! 455: int notcurrent; ! 456: { ! 457: struct symtab *s; ! 458: register struct linetable *l; ! 459: register int len; ! 460: register int i, item; ! 461: int line; ! 462: struct symtab_and_line value; ! 463: struct blockvector *bv; ! 464: ! 465: /* Info on best line seen so far, and where it starts, and its file. */ ! 466: ! 467: int best_line = 0; ! 468: CORE_ADDR best_pc = 0; ! 469: CORE_ADDR best_end = 0; ! 470: struct symtab *best_symtab = 0; ! 471: ! 472: /* Store here the first line number ! 473: of a file which contains the line at the smallest pc after PC. ! 474: If we don't find a line whose range contains PC, ! 475: we will use a line one less than this, ! 476: with a range from the start of that file to the first line's pc. */ ! 477: int alt_line = 0; ! 478: CORE_ADDR alt_pc = 0; ! 479: struct symtab *alt_symtab = 0; ! 480: ! 481: /* Info on best line seen in this file. */ ! 482: ! 483: int prev_line; ! 484: CORE_ADDR prev_pc; ! 485: ! 486: /* Info on first line of this file. */ ! 487: ! 488: int first_line; ! 489: CORE_ADDR first_pc; ! 490: ! 491: /* If this pc is not from the current frame, ! 492: it is the address of the end of a call instruction. ! 493: Quite likely that is the start of the following statement. ! 494: But what we want is the statement containing the instruction. ! 495: Fudge the pc to make sure we get that. */ ! 496: ! 497: if (notcurrent) pc -= 1; ! 498: ! 499: s = find_pc_symtab (pc); ! 500: if (s == 0) ! 501: { ! 502: value.symtab = 0; ! 503: value.line = 0; ! 504: value.pc = pc; ! 505: return value; ! 506: } ! 507: ! 508: bv = BLOCKVECTOR (s); ! 509: ! 510: /* Look at all the symtabs that share this blockvector. ! 511: They all have the same apriori range, that we found was right; ! 512: but they have different line tables. */ ! 513: ! 514: for (; s && BLOCKVECTOR (s) == bv; s = s->next) ! 515: { ! 516: /* Find the best line in this symtab. */ ! 517: l = LINETABLE (s); ! 518: len = l->nitems; ! 519: prev_line = -1; ! 520: first_line = -1; ! 521: for (i = 0; i < len; i++) ! 522: { ! 523: item = l->item[i]; ! 524: if (item < 0) ! 525: line = - item - 1; ! 526: else ! 527: { ! 528: line++; ! 529: if (first_line < 0) ! 530: { ! 531: first_line = line; ! 532: first_pc = item; ! 533: } ! 534: /* Return the last line that did not start after PC. */ ! 535: if (pc >= item) ! 536: { ! 537: prev_line = line; ! 538: prev_pc = item; ! 539: } ! 540: else ! 541: break; ! 542: } ! 543: } ! 544: ! 545: /* Is this file's best line closer than the best in the other files? ! 546: If so, record this file, and its best line, as best so far. */ ! 547: if (prev_line >= 0 && prev_pc > best_pc) ! 548: { ! 549: best_pc = prev_pc; ! 550: best_line = prev_line; ! 551: best_symtab = s; ! 552: if (i < len) ! 553: best_end = item; ! 554: else ! 555: best_end = 0; ! 556: } ! 557: /* Is this file's first line closer than the first lines of other files? ! 558: If so, record this file, and its first line, as best alternate. */ ! 559: if (first_line >= 0 && first_pc > pc ! 560: && (alt_pc == 0 || first_pc < alt_pc)) ! 561: { ! 562: alt_pc = first_pc; ! 563: alt_line = first_line; ! 564: alt_symtab = s; ! 565: } ! 566: } ! 567: if (best_symtab == 0) ! 568: { ! 569: value.symtab = alt_symtab; ! 570: value.line = alt_line - 1; ! 571: value.pc = BLOCK_END (BLOCKVECTOR_BLOCK (bv, 0)); ! 572: value.end = alt_pc; ! 573: } ! 574: else ! 575: { ! 576: value.symtab = best_symtab; ! 577: value.line = best_line; ! 578: value.pc = best_pc; ! 579: value.end = (best_end ? best_end ! 580: : (alt_pc ? alt_pc ! 581: : BLOCK_END (BLOCKVECTOR_BLOCK (bv, 0)))); ! 582: } ! 583: return value; ! 584: } ! 585: ! 586: /* Find the PC value for a given source file and line number. ! 587: Returns zero for invalid line number. ! 588: The source file is specified with a struct symtab. */ ! 589: ! 590: CORE_ADDR ! 591: find_line_pc (symtab, line) ! 592: struct symtab *symtab; ! 593: int line; ! 594: { ! 595: register struct linetable *l; ! 596: register int index; ! 597: int dummy; ! 598: ! 599: if (symtab == 0) ! 600: return 0; ! 601: l = LINETABLE (symtab); ! 602: index = find_line_common(l, line, &dummy); ! 603: return index ? l->item[index] : 0; ! 604: } ! 605: ! 606: /* Find the range of pc values in a line. ! 607: Store the starting pc of the line into *STARTPTR ! 608: and the ending pc (start of next line) into *ENDPTR. ! 609: Returns 1 to indicate success. ! 610: Returns 0 if could not find the specified line. */ ! 611: ! 612: int ! 613: find_line_pc_range (symtab, thisline, startptr, endptr) ! 614: struct symtab *symtab; ! 615: int thisline; ! 616: CORE_ADDR *startptr, *endptr; ! 617: { ! 618: register struct linetable *l; ! 619: register int index; ! 620: int exact_match; /* did we get an exact linenumber match */ ! 621: register CORE_ADDR prev_pc; ! 622: CORE_ADDR last_pc; ! 623: ! 624: if (symtab == 0) ! 625: return 0; ! 626: ! 627: l = LINETABLE (symtab); ! 628: index = find_line_common (l, thisline, &exact_match); ! 629: if (index) ! 630: { ! 631: *startptr = l->item[index]; ! 632: /* If we have not seen an entry for the specified line, ! 633: assume that means the specified line has zero bytes. */ ! 634: if (!exact_match || index == l->nitems-1) ! 635: *endptr = *startptr; ! 636: else ! 637: /* Perhaps the following entry is for the following line. ! 638: It's worth a try. */ ! 639: if (l->item[index+1] > 0) ! 640: *endptr = l->item[index+1]; ! 641: else ! 642: *endptr = find_line_pc (symtab, thisline+1); ! 643: return 1; ! 644: } ! 645: ! 646: return 0; ! 647: } ! 648: ! 649: /* Given a line table and a line number, return the index into the line ! 650: table for the pc of the nearest line whose number is >= the specified one. ! 651: Return 0 if none is found. The value is never zero is it is an index. ! 652: ! 653: Set *EXACT_MATCH nonzero if the value returned is an exact match. */ ! 654: ! 655: static int ! 656: find_line_common (l, lineno, exact_match) ! 657: register struct linetable *l; ! 658: register int lineno; ! 659: int *exact_match; ! 660: { ! 661: register int i; ! 662: register int len; ! 663: ! 664: /* BEST is the smallest linenumber > LINENO so far seen, ! 665: or 0 if none has been seen so far. ! 666: BEST_INDEX identifies the item for it. */ ! 667: ! 668: int best_index = 0; ! 669: int best = 0; ! 670: ! 671: int nextline = -1; ! 672: ! 673: if (lineno <= 0) ! 674: return 0; ! 675: ! 676: len = l->nitems; ! 677: for (i = 0; i < len; i++) ! 678: { ! 679: register int item = l->item[i]; ! 680: ! 681: if (item < 0) ! 682: nextline = - item - 1; ! 683: else ! 684: { ! 685: nextline++; ! 686: if (nextline == lineno) ! 687: { ! 688: *exact_match = 1; ! 689: return i; ! 690: } ! 691: ! 692: if (nextline > lineno && (best == 0 || nextline < best)) ! 693: { ! 694: best = lineno; ! 695: best_index = i; ! 696: } ! 697: } ! 698: } ! 699: ! 700: /* If we got here, we didn't get an exact match. */ ! 701: ! 702: *exact_match = 0; ! 703: return best_index; ! 704: } ! 705: ! 706: int ! 707: find_pc_line_pc_range (pc, startptr, endptr) ! 708: CORE_ADDR pc; ! 709: CORE_ADDR *startptr, *endptr; ! 710: { ! 711: struct symtab_and_line sal; ! 712: sal = find_pc_line (pc, 0); ! 713: *startptr = sal.pc; ! 714: *endptr = sal.end; ! 715: return sal.symtab != 0; ! 716: } ! 717: ! 718: /* Parse a string that specifies a line number. ! 719: Pass the address of a char * variable; that variable will be ! 720: advanced over the characters actually parsed. ! 721: ! 722: The string can be: ! 723: ! 724: LINENUM -- that line number in current file. PC returned is 0. ! 725: FILE:LINENUM -- that line in that file. PC returned is 0. ! 726: FUNCTION -- line number of openbrace of that function. ! 727: PC returned is the start of the function. ! 728: FILE:FUNCTION -- likewise, but prefer functions in that file. ! 729: *EXPR -- line in which address EXPR appears. ! 730: ! 731: FUNCTION may be an undebuggable function found in misc_function_vector. ! 732: ! 733: If the argument FUNFIRSTLINE is nonzero, we want the first line ! 734: of real code inside a function when a function is specified. ! 735: ! 736: DEFAULT_SYMTAB specifies the file to use if none is specified. ! 737: It defaults to current_source_symtab. ! 738: DEFAULT_LINE specifies the line number to use for relative ! 739: line numbers (that start with signs). Defaults to current_source_line. ! 740: ! 741: Note that it is possible to return zero for the symtab ! 742: if no file is validly specified. Callers must check that. ! 743: Also, the line number returned may be invalid. */ ! 744: ! 745: struct symtab_and_line ! 746: decode_line_1 (argptr, funfirstline, default_symtab, default_line) ! 747: char **argptr; ! 748: int funfirstline; ! 749: struct symtab *default_symtab; ! 750: int default_line; ! 751: { ! 752: struct symtab_and_line value; ! 753: register char *p, *p1; ! 754: register struct symtab *s; ! 755: register struct symbol *sym; ! 756: register CORE_ADDR pc; ! 757: register int i; ! 758: char *copy; ! 759: ! 760: /* Defaults have defaults. */ ! 761: ! 762: if (default_symtab == 0) ! 763: { ! 764: default_symtab = current_source_symtab; ! 765: default_line = current_source_line; ! 766: } ! 767: ! 768: /* See if arg is *PC */ ! 769: ! 770: if (**argptr == '*') ! 771: { ! 772: (*argptr)++; ! 773: pc = parse_and_eval_address_1 (argptr); ! 774: value = find_pc_line (pc, 0); ! 775: value.pc = pc; ! 776: return value; ! 777: } ! 778: ! 779: /* Maybe arg is FILE : LINENUM or FILE : FUNCTION */ ! 780: ! 781: s = 0; ! 782: ! 783: for (p = *argptr; *p; p++) ! 784: { ! 785: if (p[0] == ':' || p[0] == ' ' || p[0] == '\t') ! 786: break; ! 787: } ! 788: while (p[0] == ' ' || p[0] == '\t') p++; ! 789: ! 790: if (p[0] == ':') ! 791: { ! 792: /* Extract the file name. */ ! 793: p1 = p; ! 794: while (p != *argptr && p[-1] == ' ') --p; ! 795: copy = (char *) alloca (p - *argptr + 1); ! 796: bcopy (*argptr, copy, p - *argptr); ! 797: copy[p - *argptr] = 0; ! 798: ! 799: /* Find that file's data. */ ! 800: s = lookup_symtab (copy); ! 801: if (s == 0) ! 802: { ! 803: if (symtab_list == 0) ! 804: error ("No symbol table is loaded. Use the \"symbol-file\" command."); ! 805: error ("No source file named %s.", copy); ! 806: } ! 807: ! 808: /* Discard the file name from the arg. */ ! 809: p = p1 + 1; ! 810: while (*p == ' ' || *p == '\t') p++; ! 811: *argptr = p; ! 812: } ! 813: ! 814: /* S is specified file's symtab, or 0 if no file specified. ! 815: arg no longer contains the file name. */ ! 816: ! 817: /* Check whether arg is all digits (and sign) */ ! 818: ! 819: p = *argptr; ! 820: if (*p == '-' || *p == '+') p++; ! 821: while (*p >= '0' && *p <= '9') ! 822: p++; ! 823: ! 824: if (p != *argptr && (*p == 0 || *p == ' ' || *p == '\t' || *p == ',')) ! 825: { ! 826: /* We found a token consisting of all digits -- at least one digit. */ ! 827: enum sign {none, plus, minus} sign = none; ! 828: ! 829: if (**argptr == '+') ! 830: sign = plus, (*argptr)++; ! 831: else if (**argptr == '-') ! 832: sign = minus, (*argptr)++; ! 833: value.line = atoi (*argptr); ! 834: switch (sign) ! 835: { ! 836: case plus: ! 837: if (p == *argptr) ! 838: value.line = 5; ! 839: if (s == 0) ! 840: value.line = default_line + value.line; ! 841: break; ! 842: case minus: ! 843: if (p == *argptr) ! 844: value.line = 15; ! 845: if (s == 0) ! 846: value.line = default_line - value.line; ! 847: else ! 848: value.line = 1; ! 849: break; ! 850: } ! 851: ! 852: while (*p == ' ' || *p == '\t') p++; ! 853: *argptr = p; ! 854: if (s == 0) ! 855: s = default_symtab; ! 856: value.symtab = s; ! 857: value.pc = 0; ! 858: return value; ! 859: } ! 860: ! 861: /* Arg token is not digits => try it as a function name ! 862: Find the next token (everything up to end or next whitespace). */ ! 863: p = *argptr; ! 864: while (*p && *p != ' ' && *p != '\t' && *p != ',') p++; ! 865: copy = (char *) alloca (p - *argptr + 1); ! 866: bcopy (*argptr, copy, p - *argptr); ! 867: copy[p - *argptr] = 0; ! 868: while (*p == ' ' || *p == '\t') p++; ! 869: *argptr = p; ! 870: ! 871: /* Look up that token as a function. ! 872: If file specified, use that file's per-file block to start with. */ ! 873: ! 874: sym = lookup_symbol (copy, s ? BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), 1) : 0, ! 875: VAR_NAMESPACE); ! 876: ! 877: if (sym && SYMBOL_CLASS (sym) == LOC_BLOCK) ! 878: { ! 879: /* Arg is the name of a function */ ! 880: pc = BLOCK_START (SYMBOL_BLOCK_VALUE (sym)) + FUNCTION_START_OFFSET; ! 881: if (funfirstline) ! 882: SKIP_PROLOGUE (pc); ! 883: value = find_pc_line (pc, 0); ! 884: value.pc = (value.end && value.pc != pc) ? value.end : pc; ! 885: return value; ! 886: } ! 887: ! 888: if (sym) ! 889: error ("%s is not a function.", copy); ! 890: ! 891: if ((i = lookup_misc_func (copy)) < 0) ! 892: error ("Function %s not defined.", copy); ! 893: else ! 894: { ! 895: value.symtab = 0; ! 896: value.line = 0; ! 897: value.pc = misc_function_vector[i].address + FUNCTION_START_OFFSET; ! 898: if (funfirstline) ! 899: SKIP_PROLOGUE (value.pc); ! 900: return value; ! 901: } ! 902: ! 903: if (symtab_list == 0) ! 904: error ("No symbol table is loaded. Use the \"symbol-file\" command."); ! 905: error ("Function %s not defined.", copy); ! 906: } ! 907: ! 908: struct symtab_and_line ! 909: decode_line_spec (string, funfirstline) ! 910: char *string; ! 911: int funfirstline; ! 912: { ! 913: struct symtab_and_line sal; ! 914: if (string == 0) ! 915: error ("Empty line specification."); ! 916: sal = decode_line_1 (&string, funfirstline, ! 917: current_source_symtab, current_source_line); ! 918: if (*string) ! 919: error ("Junk at end of line specification: %s", string); ! 920: return sal; ! 921: } ! 922: ! 923: /* Return the index of misc function named NAME. */ ! 924: ! 925: static ! 926: lookup_misc_func (name) ! 927: register char *name; ! 928: { ! 929: register int i; ! 930: ! 931: for (i = 0; i < misc_function_count; i++) ! 932: if (!strcmp (misc_function_vector[i].name, name)) ! 933: return i; ! 934: return -1; /* not found */ ! 935: } ! 936: ! 937: static void ! 938: sources_info () ! 939: { ! 940: register struct symtab *s; ! 941: register int column = 0; ! 942: ! 943: if (symtab_list == 0) ! 944: { ! 945: printf ("No symbol table is loaded.\n"); ! 946: return; ! 947: } ! 948: printf ("Source files for which symbol table is known:\n"); ! 949: for (s = symtab_list; s; s = s->next) ! 950: { ! 951: if (column != 0 && column + strlen (s->filename) >= 70) ! 952: { ! 953: printf ("\n"); ! 954: column = 0; ! 955: } ! 956: else if (column != 0) ! 957: { ! 958: printf (" "); ! 959: column++; ! 960: } ! 961: printf ("%s", s->filename); ! 962: column += strlen (s->filename); ! 963: if (s->next) ! 964: { ! 965: printf (","); ! 966: column++; ! 967: } ! 968: } ! 969: printf ("\n"); ! 970: } ! 971: ! 972: /* List all symbols (if REGEXP is 0) or all symbols matching REGEXP. ! 973: If CLASS is zero, list all symbols except functions and type names. ! 974: If CLASS is 1, list only functions. ! 975: If CLASS is 2, list only type names. */ ! 976: ! 977: #define MORE \ ! 978: { print_count++; \ ! 979: if (print_count >= 21) \ ! 980: { printf ("--Type Return to print more--"); \ ! 981: print_count = 0; \ ! 982: fflush (stdout); \ ! 983: read_line (); } } ! 984: ! 985: static void sort_block_syms (); ! 986: ! 987: static void ! 988: list_symbols (regexp, class) ! 989: char *regexp; ! 990: int class; ! 991: { ! 992: register struct symtab *s; ! 993: register struct blockvector *bv; ! 994: struct blockvector *prev_bv = 0; ! 995: register struct block *b; ! 996: register int i, j; ! 997: register struct symbol *sym; ! 998: char *val; ! 999: int found_in_file; ! 1000: static char *classnames[] ! 1001: = {"variable", "function", "type"}; ! 1002: int print_count = 0; ! 1003: ! 1004: if (regexp) ! 1005: if (val = (char *) re_comp (regexp)) ! 1006: error ("Invalid regexp: %s", val); ! 1007: ! 1008: printf (regexp ! 1009: ? "All %ss matching regular expression \"%s\":\n" ! 1010: : "All defined %ss:\n", ! 1011: classnames[class], ! 1012: regexp); ! 1013: ! 1014: for (s = symtab_list; s; s = s->next) ! 1015: { ! 1016: found_in_file = 0; ! 1017: bv = BLOCKVECTOR (s); ! 1018: /* Often many files share a blockvector. ! 1019: Scan each blockvector only once so that ! 1020: we don't get every symbol many times. ! 1021: It happens that the first symtab in the list ! 1022: for any given blockvector is the main file. */ ! 1023: if (bv != prev_bv) ! 1024: for (i = 0; i < 2; i++) ! 1025: { ! 1026: b = BLOCKVECTOR_BLOCK (bv, i); ! 1027: /* Skip the sort if this block is always sorted. */ ! 1028: if (!BLOCK_SHOULD_SORT (b)) ! 1029: sort_block_syms (b); ! 1030: for (j = 0; j < BLOCK_NSYMS (b); j++) ! 1031: { ! 1032: QUIT; ! 1033: sym = BLOCK_SYM (b, j); ! 1034: if ((regexp == 0 || re_exec (SYMBOL_NAME (sym))) ! 1035: && ((class == 0 && SYMBOL_CLASS (sym) != LOC_TYPEDEF ! 1036: && SYMBOL_CLASS (sym) != LOC_BLOCK) ! 1037: || (class == 1 && SYMBOL_CLASS (sym) == LOC_BLOCK) ! 1038: || (class == 2 && SYMBOL_CLASS (sym) == LOC_TYPEDEF))) ! 1039: { ! 1040: if (!found_in_file) ! 1041: { ! 1042: printf ("\nFile %s:\n", s->filename); ! 1043: print_count += 2; ! 1044: } ! 1045: found_in_file = 1; ! 1046: MORE; ! 1047: if (class != 2 && i == 1) ! 1048: printf ("static "); ! 1049: if (class == 2 ! 1050: && SYMBOL_NAMESPACE (sym) != STRUCT_NAMESPACE) ! 1051: printf ("typedef "); ! 1052: ! 1053: type_print (SYMBOL_TYPE (sym), ! 1054: (SYMBOL_CLASS (sym) == LOC_TYPEDEF ! 1055: ? "" : SYMBOL_NAME (sym)), ! 1056: stdout, 0); ! 1057: if (class == 2 ! 1058: && SYMBOL_NAMESPACE (sym) != STRUCT_NAMESPACE ! 1059: && (TYPE_NAME ((SYMBOL_TYPE (sym))) == 0 ! 1060: || 0 != strcmp (TYPE_NAME ((SYMBOL_TYPE (sym))), ! 1061: SYMBOL_NAME (sym)))) ! 1062: printf (" %s", SYMBOL_NAME (sym)); ! 1063: printf (";\n"); ! 1064: } ! 1065: } ! 1066: } ! 1067: prev_bv = bv; ! 1068: } ! 1069: } ! 1070: ! 1071: static void ! 1072: variables_info (regexp) ! 1073: char *regexp; ! 1074: { ! 1075: list_symbols (regexp, 0); ! 1076: } ! 1077: ! 1078: static void ! 1079: functions_info (regexp) ! 1080: char *regexp; ! 1081: { ! 1082: list_symbols (regexp, 1); ! 1083: } ! 1084: ! 1085: static void ! 1086: types_info (regexp) ! 1087: char *regexp; ! 1088: { ! 1089: list_symbols (regexp, 2); ! 1090: } ! 1091: ! 1092: /* Call sort_block_syms to sort alphabetically the symbols of one block. */ ! 1093: ! 1094: static int ! 1095: compare_symbols (s1, s2) ! 1096: struct symbol **s1, **s2; ! 1097: { ! 1098: /* Names that are less should come first. */ ! 1099: register int namediff = strcmp (SYMBOL_NAME (*s1), SYMBOL_NAME (*s2)); ! 1100: if (namediff != 0) return namediff; ! 1101: /* For symbols of the same name, registers should come first. */ ! 1102: return ((SYMBOL_CLASS (*s2) == LOC_REGISTER) ! 1103: - (SYMBOL_CLASS (*s1) == LOC_REGISTER)); ! 1104: } ! 1105: ! 1106: static void ! 1107: sort_block_syms (b) ! 1108: register struct block *b; ! 1109: { ! 1110: qsort (&BLOCK_SYM (b, 0), BLOCK_NSYMS (b), ! 1111: sizeof (struct symbol *), compare_symbols); ! 1112: } ! 1113: ! 1114: /* Initialize the standard C scalar types. */ ! 1115: ! 1116: static ! 1117: struct type * ! 1118: init_type (code, length, uns, name) ! 1119: enum type_code code; ! 1120: int length, uns; ! 1121: char *name; ! 1122: { ! 1123: register struct type *type; ! 1124: ! 1125: type = (struct type *) xmalloc (sizeof (struct type)); ! 1126: bzero (type, sizeof *type); ! 1127: TYPE_CODE (type) = code; ! 1128: TYPE_LENGTH (type) = length; ! 1129: TYPE_FLAGS (type) = uns ? TYPE_FLAG_UNSIGNED : 0; ! 1130: TYPE_FLAGS (type) |= TYPE_FLAG_PERM; ! 1131: TYPE_NFIELDS (type) = 0; ! 1132: TYPE_NAME (type) = name; ! 1133: ! 1134: return type; ! 1135: } ! 1136: ! 1137: static ! 1138: initialize () ! 1139: { ! 1140: add_info ("variables", variables_info, ! 1141: "All global and static variable names, or those matching REGEXP."); ! 1142: add_info ("functions", functions_info, ! 1143: "All function names, or those matching REGEXP."); ! 1144: add_info ("types", types_info, ! 1145: "All types names, or those matching REGEXP."); ! 1146: add_info ("sources", sources_info, ! 1147: "Source files in the program."); ! 1148: ! 1149: obstack_init (symbol_obstack); ! 1150: ! 1151: builtin_type_void = init_type (TYPE_CODE_VOID, 0, 0, "void"); ! 1152: ! 1153: builtin_type_float = init_type (TYPE_CODE_FLT, sizeof (float), 0, "float"); ! 1154: builtin_type_double = init_type (TYPE_CODE_FLT, sizeof (double), 0, "double"); ! 1155: ! 1156: builtin_type_char = init_type (TYPE_CODE_INT, sizeof (char), 0, "char"); ! 1157: builtin_type_short = init_type (TYPE_CODE_INT, sizeof (short), 0, "short"); ! 1158: builtin_type_long = init_type (TYPE_CODE_INT, sizeof (long), 0, "long"); ! 1159: builtin_type_int = init_type (TYPE_CODE_INT, sizeof (int), 0, "int"); ! 1160: ! 1161: builtin_type_unsigned_char = init_type (TYPE_CODE_INT, sizeof (char), 1, "unsigned char"); ! 1162: builtin_type_unsigned_short = init_type (TYPE_CODE_INT, sizeof (short), 1, "unsigned short"); ! 1163: builtin_type_unsigned_long = init_type (TYPE_CODE_INT, sizeof (long), 1, "unsigned long"); ! 1164: builtin_type_unsigned_int = init_type (TYPE_CODE_INT, sizeof (int), 1, "unsigned int"); ! 1165: } ! 1166: ! 1167: END_FILE
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.