1 /* Do various things to symbol tables (other than lookup), for GDB. 2 3 Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 4 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2007, 2008, 2009, 2010 5 Free Software Foundation, Inc. 6 7 This file is part of GDB. 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 3 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 21 22 #include "defs.h" 23 #include "symtab.h" 24 #include "gdbtypes.h" 25 #include "bfd.h" 26 #include "symfile.h" 27 #include "objfiles.h" 28 #include "breakpoint.h" 29 #include "command.h" 30 #include "gdb_obstack.h" 31 #include "exceptions.h" 32 #include "language.h" 33 #include "bcache.h" 34 #include "block.h" 35 #include "gdb_regex.h" 36 #include "gdb_stat.h" 37 #include "dictionary.h" 38 39 #include "gdb_string.h" 40 #include "readline/readline.h" 41 42 #include "psymtab.h" 43 44 #ifndef DEV_TTY 45 #define DEV_TTY "/dev/tty" 46 #endif 47 48 /* Unfortunately for debugging, stderr is usually a macro. This is painful 49 when calling functions that take FILE *'s from the debugger. 50 So we make a variable which has the same value and which is accessible when 51 debugging GDB with itself. Because stdin et al need not be constants, 52 we initialize them in the _initialize_symmisc function at the bottom 53 of the file. */ 54 FILE *std_in; 55 FILE *std_out; 56 FILE *std_err; 57 58 /* Prototypes for local functions */ 59 60 static void dump_symtab (struct objfile *, struct symtab *, 61 struct ui_file *); 62 63 static void dump_msymbols (struct objfile *, struct ui_file *); 64 65 static void dump_objfile (struct objfile *); 66 67 static int block_depth (struct block *); 68 69 void _initialize_symmisc (void); 70 71 struct print_symbol_args 72 { 73 struct gdbarch *gdbarch; 74 struct symbol *symbol; 75 int depth; 76 struct ui_file *outfile; 77 }; 78 79 static int print_symbol (void *); 80 81 /* Free all the storage associated with the struct symtab <- S. 82 Note that some symtabs have contents that all live inside one big block of 83 memory, and some share the contents of another symbol table and so you 84 should not free the contents on their behalf (except sometimes the 85 linetable, which maybe per symtab even when the rest is not). 86 It is s->free_code that says which alternative to use. */ 87 88 void 89 free_symtab (struct symtab *s) 90 { 91 switch (s->free_code) 92 { 93 case free_nothing: 94 /* All the contents are part of a big block of memory (an obstack), 95 and some other symtab is in charge of freeing that block. 96 Therefore, do nothing. */ 97 break; 98 99 case free_linetable: 100 /* Everything will be freed either by our `free_func' 101 or by some other symtab, except for our linetable. 102 Free that now. */ 103 if (LINETABLE (s)) 104 xfree (LINETABLE (s)); 105 break; 106 } 107 108 /* If there is a single block of memory to free, free it. */ 109 if (s->free_func != NULL) 110 s->free_func (s); 111 112 /* Free source-related stuff */ 113 if (s->line_charpos != NULL) 114 xfree (s->line_charpos); 115 if (s->fullname != NULL) 116 xfree (s->fullname); 117 if (s->debugformat != NULL) 118 xfree (s->debugformat); 119 xfree (s); 120 } 121 122 void 123 print_symbol_bcache_statistics (void) 124 { 125 struct program_space *pspace; 126 struct objfile *objfile; 127 128 immediate_quit++; 129 ALL_PSPACES (pspace) 130 ALL_PSPACE_OBJFILES (pspace, objfile) 131 { 132 printf_filtered (_("Byte cache statistics for '%s':\n"), objfile->name); 133 print_bcache_statistics (objfile->psymbol_cache, "partial symbol cache"); 134 print_bcache_statistics (objfile->macro_cache, "preprocessor macro cache"); 135 print_bcache_statistics (objfile->filename_cache, "file name cache"); 136 } 137 immediate_quit--; 138 } 139 140 void 141 print_objfile_statistics (void) 142 { 143 struct program_space *pspace; 144 struct objfile *objfile; 145 struct symtab *s; 146 int i, linetables, blockvectors; 147 148 immediate_quit++; 149 ALL_PSPACES (pspace) 150 ALL_PSPACE_OBJFILES (pspace, objfile) 151 { 152 printf_filtered (_("Statistics for '%s':\n"), objfile->name); 153 if (OBJSTAT (objfile, n_stabs) > 0) 154 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"), 155 OBJSTAT (objfile, n_stabs)); 156 if (OBJSTAT (objfile, n_minsyms) > 0) 157 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"), 158 OBJSTAT (objfile, n_minsyms)); 159 if (OBJSTAT (objfile, n_psyms) > 0) 160 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"), 161 OBJSTAT (objfile, n_psyms)); 162 if (OBJSTAT (objfile, n_syms) > 0) 163 printf_filtered (_(" Number of \"full\" symbols read: %d\n"), 164 OBJSTAT (objfile, n_syms)); 165 if (OBJSTAT (objfile, n_types) > 0) 166 printf_filtered (_(" Number of \"types\" defined: %d\n"), 167 OBJSTAT (objfile, n_types)); 168 if (objfile->sf) 169 objfile->sf->qf->print_stats (objfile); 170 i = linetables = blockvectors = 0; 171 ALL_OBJFILE_SYMTABS (objfile, s) 172 { 173 i++; 174 if (s->linetable != NULL) 175 linetables++; 176 if (s->primary == 1) 177 blockvectors++; 178 } 179 printf_filtered (_(" Number of symbol tables: %d\n"), i); 180 printf_filtered (_(" Number of symbol tables with line tables: %d\n"), 181 linetables); 182 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"), 183 blockvectors); 184 185 if (OBJSTAT (objfile, sz_strtab) > 0) 186 printf_filtered (_(" Space used by a.out string tables: %d\n"), 187 OBJSTAT (objfile, sz_strtab)); 188 printf_filtered (_(" Total memory used for objfile obstack: %d\n"), 189 obstack_memory_used (&objfile->objfile_obstack)); 190 printf_filtered (_(" Total memory used for psymbol cache: %d\n"), 191 bcache_memory_used (objfile->psymbol_cache)); 192 printf_filtered (_(" Total memory used for macro cache: %d\n"), 193 bcache_memory_used (objfile->macro_cache)); 194 printf_filtered (_(" Total memory used for file name cache: %d\n"), 195 bcache_memory_used (objfile->filename_cache)); 196 } 197 immediate_quit--; 198 } 199 200 static void 201 dump_objfile (struct objfile *objfile) 202 { 203 struct symtab *symtab; 204 205 printf_filtered ("\nObject file %s: ", objfile->name); 206 printf_filtered ("Objfile at "); 207 gdb_print_host_address (objfile, gdb_stdout); 208 printf_filtered (", bfd at "); 209 gdb_print_host_address (objfile->obfd, gdb_stdout); 210 printf_filtered (", %d minsyms\n\n", 211 objfile->minimal_symbol_count); 212 213 if (objfile->sf) 214 objfile->sf->qf->dump (objfile); 215 216 if (objfile->symtabs) 217 { 218 printf_filtered ("Symtabs:\n"); 219 for (symtab = objfile->symtabs; 220 symtab != NULL; 221 symtab = symtab->next) 222 { 223 printf_filtered ("%s at ", symtab->filename); 224 gdb_print_host_address (symtab, gdb_stdout); 225 printf_filtered (", "); 226 if (symtab->objfile != objfile) 227 { 228 printf_filtered ("NOT ON CHAIN! "); 229 } 230 wrap_here (" "); 231 } 232 printf_filtered ("\n\n"); 233 } 234 } 235 236 /* Print minimal symbols from this objfile. */ 237 238 static void 239 dump_msymbols (struct objfile *objfile, struct ui_file *outfile) 240 { 241 struct gdbarch *gdbarch = get_objfile_arch (objfile); 242 struct minimal_symbol *msymbol; 243 int index; 244 char ms_type; 245 246 fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile->name); 247 if (objfile->minimal_symbol_count == 0) 248 { 249 fprintf_filtered (outfile, "No minimal symbols found.\n"); 250 return; 251 } 252 index = 0; 253 ALL_OBJFILE_MSYMBOLS (objfile, msymbol) 254 { 255 struct obj_section *section = SYMBOL_OBJ_SECTION (msymbol); 256 257 switch (MSYMBOL_TYPE (msymbol)) 258 { 259 case mst_unknown: 260 ms_type = 'u'; 261 break; 262 case mst_text: 263 ms_type = 'T'; 264 break; 265 case mst_solib_trampoline: 266 ms_type = 'S'; 267 break; 268 case mst_data: 269 ms_type = 'D'; 270 break; 271 case mst_bss: 272 ms_type = 'B'; 273 break; 274 case mst_abs: 275 ms_type = 'A'; 276 break; 277 case mst_file_text: 278 ms_type = 't'; 279 break; 280 case mst_file_data: 281 ms_type = 'd'; 282 break; 283 case mst_file_bss: 284 ms_type = 'b'; 285 break; 286 default: 287 ms_type = '?'; 288 break; 289 } 290 fprintf_filtered (outfile, "[%2d] %c ", index, ms_type); 291 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msymbol)), 292 outfile); 293 fprintf_filtered (outfile, " %s", SYMBOL_LINKAGE_NAME (msymbol)); 294 if (section) 295 fprintf_filtered (outfile, " section %s", 296 bfd_section_name (objfile->obfd, 297 section->the_bfd_section)); 298 if (SYMBOL_DEMANGLED_NAME (msymbol) != NULL) 299 { 300 fprintf_filtered (outfile, " %s", SYMBOL_DEMANGLED_NAME (msymbol)); 301 } 302 if (msymbol->filename) 303 fprintf_filtered (outfile, " %s", msymbol->filename); 304 fputs_filtered ("\n", outfile); 305 index++; 306 } 307 if (objfile->minimal_symbol_count != index) 308 { 309 warning (_("internal error: minimal symbol count %d != %d"), 310 objfile->minimal_symbol_count, index); 311 } 312 fprintf_filtered (outfile, "\n"); 313 } 314 315 static void 316 dump_symtab_1 (struct objfile *objfile, struct symtab *symtab, 317 struct ui_file *outfile) 318 { 319 struct gdbarch *gdbarch = get_objfile_arch (objfile); 320 int i; 321 struct dict_iterator iter; 322 int len; 323 struct linetable *l; 324 struct blockvector *bv; 325 struct symbol *sym; 326 struct block *b; 327 int depth; 328 329 fprintf_filtered (outfile, "\nSymtab for file %s\n", symtab->filename); 330 if (symtab->dirname) 331 fprintf_filtered (outfile, "Compilation directory is %s\n", 332 symtab->dirname); 333 fprintf_filtered (outfile, "Read from object file %s (", objfile->name); 334 gdb_print_host_address (objfile, outfile); 335 fprintf_filtered (outfile, ")\n"); 336 fprintf_filtered (outfile, "Language: %s\n", language_str (symtab->language)); 337 338 /* First print the line table. */ 339 l = LINETABLE (symtab); 340 if (l) 341 { 342 fprintf_filtered (outfile, "\nLine table:\n\n"); 343 len = l->nitems; 344 for (i = 0; i < len; i++) 345 { 346 fprintf_filtered (outfile, " line %d at ", l->item[i].line); 347 fputs_filtered (paddress (gdbarch, l->item[i].pc), outfile); 348 fprintf_filtered (outfile, "\n"); 349 } 350 } 351 /* Now print the block info, but only for primary symtabs since we will 352 print lots of duplicate info otherwise. */ 353 if (symtab->primary) 354 { 355 fprintf_filtered (outfile, "\nBlockvector:\n\n"); 356 bv = BLOCKVECTOR (symtab); 357 len = BLOCKVECTOR_NBLOCKS (bv); 358 for (i = 0; i < len; i++) 359 { 360 b = BLOCKVECTOR_BLOCK (bv, i); 361 depth = block_depth (b) * 2; 362 print_spaces (depth, outfile); 363 fprintf_filtered (outfile, "block #%03d, object at ", i); 364 gdb_print_host_address (b, outfile); 365 if (BLOCK_SUPERBLOCK (b)) 366 { 367 fprintf_filtered (outfile, " under "); 368 gdb_print_host_address (BLOCK_SUPERBLOCK (b), outfile); 369 } 370 /* drow/2002-07-10: We could save the total symbols count 371 even if we're using a hashtable, but nothing else but this message 372 wants it. */ 373 fprintf_filtered (outfile, ", %d syms/buckets in ", 374 dict_size (BLOCK_DICT (b))); 375 fputs_filtered (paddress (gdbarch, BLOCK_START (b)), outfile); 376 fprintf_filtered (outfile, ".."); 377 fputs_filtered (paddress (gdbarch, BLOCK_END (b)), outfile); 378 if (BLOCK_FUNCTION (b)) 379 { 380 fprintf_filtered (outfile, ", function %s", 381 SYMBOL_LINKAGE_NAME (BLOCK_FUNCTION (b))); 382 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)) != NULL) 383 { 384 fprintf_filtered (outfile, ", %s", 385 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b))); 386 } 387 } 388 fprintf_filtered (outfile, "\n"); 389 /* Now print each symbol in this block (in no particular order, if 390 we're using a hashtable). */ 391 ALL_BLOCK_SYMBOLS (b, iter, sym) 392 { 393 struct print_symbol_args s; 394 395 s.gdbarch = gdbarch; 396 s.symbol = sym; 397 s.depth = depth + 1; 398 s.outfile = outfile; 399 catch_errors (print_symbol, &s, "Error printing symbol:\n", 400 RETURN_MASK_ERROR); 401 } 402 } 403 fprintf_filtered (outfile, "\n"); 404 } 405 else 406 { 407 fprintf_filtered (outfile, "\nBlockvector same as previous symtab\n\n"); 408 } 409 } 410 411 static void 412 dump_symtab (struct objfile *objfile, struct symtab *symtab, 413 struct ui_file *outfile) 414 { 415 /* Set the current language to the language of the symtab we're dumping 416 because certain routines used during dump_symtab() use the current 417 language to print an image of the symbol. We'll restore it later. 418 But use only real languages, not placeholders. */ 419 if (symtab->language != language_unknown 420 && symtab->language != language_auto) 421 { 422 enum language saved_lang; 423 424 saved_lang = set_language (symtab->language); 425 426 dump_symtab_1 (objfile, symtab, outfile); 427 428 set_language (saved_lang); 429 } 430 else 431 dump_symtab_1 (objfile, symtab, outfile); 432 } 433 434 void 435 maintenance_print_symbols (char *args, int from_tty) 436 { 437 char **argv; 438 struct ui_file *outfile; 439 struct cleanup *cleanups; 440 char *symname = NULL; 441 char *filename = DEV_TTY; 442 struct objfile *objfile; 443 struct symtab *s; 444 445 dont_repeat (); 446 447 if (args == NULL) 448 { 449 error (_("\ 450 Arguments missing: an output file name and an optional symbol file name")); 451 } 452 argv = gdb_buildargv (args); 453 cleanups = make_cleanup_freeargv (argv); 454 455 if (argv[0] != NULL) 456 { 457 filename = argv[0]; 458 /* If a second arg is supplied, it is a source file name to match on */ 459 if (argv[1] != NULL) 460 { 461 symname = argv[1]; 462 } 463 } 464 465 filename = tilde_expand (filename); 466 make_cleanup (xfree, filename); 467 468 outfile = gdb_fopen (filename, FOPEN_WT); 469 if (outfile == 0) 470 perror_with_name (filename); 471 make_cleanup_ui_file_delete (outfile); 472 473 immediate_quit++; 474 ALL_SYMTABS (objfile, s) 475 if (symname == NULL || strcmp (symname, s->filename) == 0) 476 dump_symtab (objfile, s, outfile); 477 immediate_quit--; 478 do_cleanups (cleanups); 479 } 480 481 /* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how 482 far to indent. ARGS is really a struct print_symbol_args *, but is 483 declared as char * to get it past catch_errors. Returns 0 for error, 484 1 for success. */ 485 486 static int 487 print_symbol (void *args) 488 { 489 struct gdbarch *gdbarch = ((struct print_symbol_args *) args)->gdbarch; 490 struct symbol *symbol = ((struct print_symbol_args *) args)->symbol; 491 int depth = ((struct print_symbol_args *) args)->depth; 492 struct ui_file *outfile = ((struct print_symbol_args *) args)->outfile; 493 struct obj_section *section = SYMBOL_OBJ_SECTION (symbol); 494 495 print_spaces (depth, outfile); 496 if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN) 497 { 498 fprintf_filtered (outfile, "label %s at ", SYMBOL_PRINT_NAME (symbol)); 499 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)), 500 outfile); 501 if (section) 502 fprintf_filtered (outfile, " section %s\n", 503 bfd_section_name (section->the_bfd_section->owner, 504 section->the_bfd_section)); 505 else 506 fprintf_filtered (outfile, "\n"); 507 return 1; 508 } 509 if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN) 510 { 511 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol))) 512 { 513 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth); 514 } 515 else 516 { 517 fprintf_filtered (outfile, "%s %s = ", 518 (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_ENUM 519 ? "enum" 520 : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT 521 ? "struct" : "union")), 522 SYMBOL_LINKAGE_NAME (symbol)); 523 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth); 524 } 525 fprintf_filtered (outfile, ";\n"); 526 } 527 else 528 { 529 if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF) 530 fprintf_filtered (outfile, "typedef "); 531 if (SYMBOL_TYPE (symbol)) 532 { 533 /* Print details of types, except for enums where it's clutter. */ 534 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol), 535 outfile, 536 TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM, 537 depth); 538 fprintf_filtered (outfile, "; "); 539 } 540 else 541 fprintf_filtered (outfile, "%s ", SYMBOL_PRINT_NAME (symbol)); 542 543 switch (SYMBOL_CLASS (symbol)) 544 { 545 case LOC_CONST: 546 fprintf_filtered (outfile, "const %ld (0x%lx)", 547 SYMBOL_VALUE (symbol), 548 SYMBOL_VALUE (symbol)); 549 break; 550 551 case LOC_CONST_BYTES: 552 { 553 unsigned i; 554 struct type *type = check_typedef (SYMBOL_TYPE (symbol)); 555 556 fprintf_filtered (outfile, "const %u hex bytes:", 557 TYPE_LENGTH (type)); 558 for (i = 0; i < TYPE_LENGTH (type); i++) 559 fprintf_filtered (outfile, " %02x", 560 (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]); 561 } 562 break; 563 564 case LOC_STATIC: 565 fprintf_filtered (outfile, "static at "); 566 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)), 567 outfile); 568 if (section) 569 fprintf_filtered (outfile, " section %s", 570 bfd_section_name (section->the_bfd_section->owner, 571 section->the_bfd_section)); 572 break; 573 574 case LOC_REGISTER: 575 if (SYMBOL_IS_ARGUMENT (symbol)) 576 fprintf_filtered (outfile, "parameter register %ld", 577 SYMBOL_VALUE (symbol)); 578 else 579 fprintf_filtered (outfile, "register %ld", SYMBOL_VALUE (symbol)); 580 break; 581 582 case LOC_ARG: 583 fprintf_filtered (outfile, "arg at offset 0x%lx", 584 SYMBOL_VALUE (symbol)); 585 break; 586 587 case LOC_REF_ARG: 588 fprintf_filtered (outfile, "reference arg at 0x%lx", SYMBOL_VALUE (symbol)); 589 break; 590 591 case LOC_REGPARM_ADDR: 592 fprintf_filtered (outfile, "address parameter register %ld", SYMBOL_VALUE (symbol)); 593 break; 594 595 case LOC_LOCAL: 596 fprintf_filtered (outfile, "local at offset 0x%lx", 597 SYMBOL_VALUE (symbol)); 598 break; 599 600 case LOC_TYPEDEF: 601 break; 602 603 case LOC_LABEL: 604 fprintf_filtered (outfile, "label at "); 605 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)), 606 outfile); 607 if (section) 608 fprintf_filtered (outfile, " section %s", 609 bfd_section_name (section->the_bfd_section->owner, 610 section->the_bfd_section)); 611 break; 612 613 case LOC_BLOCK: 614 fprintf_filtered (outfile, "block object "); 615 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol), outfile); 616 fprintf_filtered (outfile, ", "); 617 fputs_filtered (paddress (gdbarch, 618 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol))), 619 outfile); 620 fprintf_filtered (outfile, ".."); 621 fputs_filtered (paddress (gdbarch, 622 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol))), 623 outfile); 624 if (section) 625 fprintf_filtered (outfile, " section %s", 626 bfd_section_name (section->the_bfd_section->owner, 627 section->the_bfd_section)); 628 break; 629 630 case LOC_COMPUTED: 631 fprintf_filtered (outfile, "computed at runtime"); 632 break; 633 634 case LOC_UNRESOLVED: 635 fprintf_filtered (outfile, "unresolved"); 636 break; 637 638 case LOC_OPTIMIZED_OUT: 639 fprintf_filtered (outfile, "optimized out"); 640 break; 641 642 default: 643 fprintf_filtered (outfile, "botched symbol class %x", 644 SYMBOL_CLASS (symbol)); 645 break; 646 } 647 } 648 fprintf_filtered (outfile, "\n"); 649 return 1; 650 } 651 652 void 653 maintenance_print_msymbols (char *args, int from_tty) 654 { 655 char **argv; 656 struct ui_file *outfile; 657 struct cleanup *cleanups; 658 char *filename = DEV_TTY; 659 char *symname = NULL; 660 struct program_space *pspace; 661 struct objfile *objfile; 662 663 struct stat sym_st, obj_st; 664 665 dont_repeat (); 666 667 if (args == NULL) 668 { 669 error (_("print-msymbols takes an output file name and optional symbol file name")); 670 } 671 argv = gdb_buildargv (args); 672 cleanups = make_cleanup_freeargv (argv); 673 674 if (argv[0] != NULL) 675 { 676 filename = argv[0]; 677 /* If a second arg is supplied, it is a source file name to match on */ 678 if (argv[1] != NULL) 679 { 680 symname = xfullpath (argv[1]); 681 make_cleanup (xfree, symname); 682 if (symname && stat (symname, &sym_st)) 683 perror_with_name (symname); 684 } 685 } 686 687 filename = tilde_expand (filename); 688 make_cleanup (xfree, filename); 689 690 outfile = gdb_fopen (filename, FOPEN_WT); 691 if (outfile == 0) 692 perror_with_name (filename); 693 make_cleanup_ui_file_delete (outfile); 694 695 immediate_quit++; 696 ALL_PSPACES (pspace) 697 ALL_PSPACE_OBJFILES (pspace, objfile) 698 if (symname == NULL 699 || (!stat (objfile->name, &obj_st) && sym_st.st_ino == obj_st.st_ino)) 700 dump_msymbols (objfile, outfile); 701 immediate_quit--; 702 fprintf_filtered (outfile, "\n\n"); 703 do_cleanups (cleanups); 704 } 705 706 void 707 maintenance_print_objfiles (char *ignore, int from_tty) 708 { 709 struct program_space *pspace; 710 struct objfile *objfile; 711 712 dont_repeat (); 713 714 immediate_quit++; 715 ALL_PSPACES (pspace) 716 ALL_PSPACE_OBJFILES (pspace, objfile) 717 dump_objfile (objfile); 718 immediate_quit--; 719 } 720 721 722 /* List all the symbol tables whose names match REGEXP (optional). */ 723 void 724 maintenance_info_symtabs (char *regexp, int from_tty) 725 { 726 struct program_space *pspace; 727 struct objfile *objfile; 728 729 if (regexp) 730 re_comp (regexp); 731 732 ALL_PSPACES (pspace) 733 ALL_PSPACE_OBJFILES (pspace, objfile) 734 { 735 struct symtab *symtab; 736 737 /* We don't want to print anything for this objfile until we 738 actually find a symtab whose name matches. */ 739 int printed_objfile_start = 0; 740 741 ALL_OBJFILE_SYMTABS (objfile, symtab) 742 { 743 QUIT; 744 745 if (! regexp 746 || re_exec (symtab->filename)) 747 { 748 if (! printed_objfile_start) 749 { 750 printf_filtered ("{ objfile %s ", objfile->name); 751 wrap_here (" "); 752 printf_filtered ("((struct objfile *) %s)\n", 753 host_address_to_string (objfile)); 754 printed_objfile_start = 1; 755 } 756 757 printf_filtered (" { symtab %s ", symtab->filename); 758 wrap_here (" "); 759 printf_filtered ("((struct symtab *) %s)\n", 760 host_address_to_string (symtab)); 761 printf_filtered (" dirname %s\n", 762 symtab->dirname ? symtab->dirname : "(null)"); 763 printf_filtered (" fullname %s\n", 764 symtab->fullname ? symtab->fullname : "(null)"); 765 printf_filtered (" blockvector ((struct blockvector *) %s)%s\n", 766 host_address_to_string (symtab->blockvector), 767 symtab->primary ? " (primary)" : ""); 768 printf_filtered (" linetable ((struct linetable *) %s)\n", 769 host_address_to_string (symtab->linetable)); 770 printf_filtered (" debugformat %s\n", symtab->debugformat); 771 printf_filtered (" }\n"); 772 } 773 } 774 775 if (printed_objfile_start) 776 printf_filtered ("}\n"); 777 } 778 } 779 780 781 /* Return the nexting depth of a block within other blocks in its symtab. */ 782 783 static int 784 block_depth (struct block *block) 785 { 786 int i = 0; 787 788 while ((block = BLOCK_SUPERBLOCK (block)) != NULL) 789 { 790 i++; 791 } 792 return i; 793 } 794 795 796 /* Do early runtime initializations. */ 797 void 798 _initialize_symmisc (void) 799 { 800 std_in = stdin; 801 std_out = stdout; 802 std_err = stderr; 803 } 804