1 /* Do various things to symbol tables (other than lookup), for GDB.
3 Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
4 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004 Free Software
7 This file is part of GDB.
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 2 of the License, or
12 (at your option) any later version.
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.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA. */
30 #include "breakpoint.h"
32 #include "gdb_obstack.h"
36 #include "gdb_regex.h"
37 #include "dictionary.h"
39 #include "gdb_string.h"
40 #include "readline/readline.h"
43 #define DEV_TTY "/dev/tty"
46 /* Unfortunately for debugging, stderr is usually a macro. This is painful
47 when calling functions that take FILE *'s from the debugger.
48 So we make a variable which has the same value and which is accessible when
49 debugging GDB with itself. Because stdin et al need not be constants,
50 we initialize them in the _initialize_symmisc function at the bottom
56 /* Prototypes for local functions */
58 static void dump_symtab (struct objfile
*, struct symtab
*,
61 static void dump_psymtab (struct objfile
*, struct partial_symtab
*,
64 static void dump_msymbols (struct objfile
*, struct ui_file
*);
66 static void dump_objfile (struct objfile
*);
68 static int block_depth (struct block
*);
70 static void print_partial_symbols (struct partial_symbol
**, int,
71 char *, struct ui_file
*);
73 static void free_symtab_block (struct objfile
*, struct block
*);
75 void _initialize_symmisc (void);
77 struct print_symbol_args
79 struct symbol
*symbol
;
81 struct ui_file
*outfile
;
84 static int print_symbol (void *);
86 static void free_symtab_block (struct objfile
*, struct block
*);
89 /* Free a struct block <- B and all the symbols defined in that block. */
91 /* FIXME: carlton/2003-04-28: I don't believe this is currently ever
95 free_symtab_block (struct objfile
*objfile
, struct block
*b
)
97 struct dict_iterator iter
;
100 ALL_BLOCK_SYMBOLS (b
, iter
, sym
)
102 xmfree (objfile
->md
, DEPRECATED_SYMBOL_NAME (sym
));
103 xmfree (objfile
->md
, sym
);
106 dict_free (BLOCK_DICT (b
));
107 xmfree (objfile
->md
, b
);
110 /* Free all the storage associated with the struct symtab <- S.
111 Note that some symtabs have contents malloc'ed structure by structure,
112 while some have contents that all live inside one big block of memory,
113 and some share the contents of another symbol table and so you should
114 not free the contents on their behalf (except sometimes the linetable,
115 which maybe per symtab even when the rest is not).
116 It is s->free_code that says which alternative to use. */
119 free_symtab (struct symtab
*s
)
122 struct blockvector
*bv
;
124 switch (s
->free_code
)
127 /* All the contents are part of a big block of memory (an obstack),
128 and some other symtab is in charge of freeing that block.
129 Therefore, do nothing. */
133 /* Here all the contents were malloc'ed structure by structure
134 and must be freed that way. */
135 /* First free the blocks (and their symbols. */
136 bv
= BLOCKVECTOR (s
);
137 n
= BLOCKVECTOR_NBLOCKS (bv
);
138 for (i
= 0; i
< n
; i
++)
139 free_symtab_block (s
->objfile
, BLOCKVECTOR_BLOCK (bv
, i
));
140 /* Free the blockvector itself. */
141 xmfree (s
->objfile
->md
, bv
);
142 /* Also free the linetable. */
145 /* Everything will be freed either by our `free_func'
146 or by some other symtab, except for our linetable.
149 xmfree (s
->objfile
->md
, LINETABLE (s
));
153 /* If there is a single block of memory to free, free it. */
154 if (s
->free_func
!= NULL
)
157 /* Free source-related stuff */
158 if (s
->line_charpos
!= NULL
)
159 xmfree (s
->objfile
->md
, s
->line_charpos
);
160 if (s
->fullname
!= NULL
)
161 xmfree (s
->objfile
->md
, s
->fullname
);
162 if (s
->debugformat
!= NULL
)
163 xmfree (s
->objfile
->md
, s
->debugformat
);
164 xmfree (s
->objfile
->md
, s
);
168 print_symbol_bcache_statistics (void)
170 struct objfile
*objfile
;
173 ALL_OBJFILES (objfile
)
175 printf_filtered ("Byte cache statistics for '%s':\n", objfile
->name
);
176 print_bcache_statistics (objfile
->psymbol_cache
, "partial symbol cache");
182 print_objfile_statistics (void)
184 struct objfile
*objfile
;
186 struct partial_symtab
*ps
;
187 int i
, linetables
, blockvectors
;
190 ALL_OBJFILES (objfile
)
192 printf_filtered ("Statistics for '%s':\n", objfile
->name
);
193 if (OBJSTAT (objfile
, n_stabs
) > 0)
194 printf_filtered (" Number of \"stab\" symbols read: %d\n",
195 OBJSTAT (objfile
, n_stabs
));
196 if (OBJSTAT (objfile
, n_minsyms
) > 0)
197 printf_filtered (" Number of \"minimal\" symbols read: %d\n",
198 OBJSTAT (objfile
, n_minsyms
));
199 if (OBJSTAT (objfile
, n_psyms
) > 0)
200 printf_filtered (" Number of \"partial\" symbols read: %d\n",
201 OBJSTAT (objfile
, n_psyms
));
202 if (OBJSTAT (objfile
, n_syms
) > 0)
203 printf_filtered (" Number of \"full\" symbols read: %d\n",
204 OBJSTAT (objfile
, n_syms
));
205 if (OBJSTAT (objfile
, n_types
) > 0)
206 printf_filtered (" Number of \"types\" defined: %d\n",
207 OBJSTAT (objfile
, n_types
));
209 ALL_OBJFILE_PSYMTABS (objfile
, ps
)
214 printf_filtered (" Number of psym tables (not yet expanded): %d\n", i
);
215 i
= linetables
= blockvectors
= 0;
216 ALL_OBJFILE_SYMTABS (objfile
, s
)
219 if (s
->linetable
!= NULL
)
224 printf_filtered (" Number of symbol tables: %d\n", i
);
225 printf_filtered (" Number of symbol tables with line tables: %d\n",
227 printf_filtered (" Number of symbol tables with blockvectors: %d\n",
230 if (OBJSTAT (objfile
, sz_strtab
) > 0)
231 printf_filtered (" Space used by a.out string tables: %d\n",
232 OBJSTAT (objfile
, sz_strtab
));
233 printf_filtered (" Total memory used for objfile obstack: %d\n",
234 obstack_memory_used (&objfile
->objfile_obstack
));
235 printf_filtered (" Total memory used for psymbol cache: %d\n",
236 bcache_memory_used (objfile
->psymbol_cache
));
237 printf_filtered (" Total memory used for macro cache: %d\n",
238 bcache_memory_used (objfile
->macro_cache
));
244 dump_objfile (struct objfile
*objfile
)
246 struct symtab
*symtab
;
247 struct partial_symtab
*psymtab
;
249 printf_filtered ("\nObject file %s: ", objfile
->name
);
250 printf_filtered ("Objfile at ");
251 gdb_print_host_address (objfile
, gdb_stdout
);
252 printf_filtered (", bfd at ");
253 gdb_print_host_address (objfile
->obfd
, gdb_stdout
);
254 printf_filtered (", %d minsyms\n\n",
255 objfile
->minimal_symbol_count
);
257 if (objfile
->psymtabs
)
259 printf_filtered ("Psymtabs:\n");
260 for (psymtab
= objfile
->psymtabs
;
262 psymtab
= psymtab
->next
)
264 printf_filtered ("%s at ",
266 gdb_print_host_address (psymtab
, gdb_stdout
);
267 printf_filtered (", ");
268 if (psymtab
->objfile
!= objfile
)
270 printf_filtered ("NOT ON CHAIN! ");
274 printf_filtered ("\n\n");
277 if (objfile
->symtabs
)
279 printf_filtered ("Symtabs:\n");
280 for (symtab
= objfile
->symtabs
;
282 symtab
= symtab
->next
)
284 printf_filtered ("%s at ", symtab
->filename
);
285 gdb_print_host_address (symtab
, gdb_stdout
);
286 printf_filtered (", ");
287 if (symtab
->objfile
!= objfile
)
289 printf_filtered ("NOT ON CHAIN! ");
293 printf_filtered ("\n\n");
297 /* Print minimal symbols from this objfile. */
300 dump_msymbols (struct objfile
*objfile
, struct ui_file
*outfile
)
302 struct minimal_symbol
*msymbol
;
306 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile
->name
);
307 if (objfile
->minimal_symbol_count
== 0)
309 fprintf_filtered (outfile
, "No minimal symbols found.\n");
312 for (index
= 0, msymbol
= objfile
->msymbols
;
313 DEPRECATED_SYMBOL_NAME (msymbol
) != NULL
; msymbol
++, index
++)
315 switch (msymbol
->type
)
323 case mst_solib_trampoline
:
348 fprintf_filtered (outfile
, "[%2d] %c ", index
, ms_type
);
349 print_address_numeric (SYMBOL_VALUE_ADDRESS (msymbol
), 1, outfile
);
350 fprintf_filtered (outfile
, " %s", DEPRECATED_SYMBOL_NAME (msymbol
));
351 if (SYMBOL_BFD_SECTION (msymbol
))
352 fprintf_filtered (outfile
, " section %s",
353 bfd_section_name (objfile
->obfd
,
354 SYMBOL_BFD_SECTION (msymbol
)));
355 if (SYMBOL_DEMANGLED_NAME (msymbol
) != NULL
)
357 fprintf_filtered (outfile
, " %s", SYMBOL_DEMANGLED_NAME (msymbol
));
359 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
360 if (msymbol
->filename
)
361 fprintf_filtered (outfile
, " %s", msymbol
->filename
);
363 fputs_filtered ("\n", outfile
);
365 if (objfile
->minimal_symbol_count
!= index
)
367 warning ("internal error: minimal symbol count %d != %d",
368 objfile
->minimal_symbol_count
, index
);
370 fprintf_filtered (outfile
, "\n");
374 dump_psymtab (struct objfile
*objfile
, struct partial_symtab
*psymtab
,
375 struct ui_file
*outfile
)
379 fprintf_filtered (outfile
, "\nPartial symtab for source file %s ",
381 fprintf_filtered (outfile
, "(object ");
382 gdb_print_host_address (psymtab
, outfile
);
383 fprintf_filtered (outfile
, ")\n\n");
384 fprintf_unfiltered (outfile
, " Read from object file %s (",
386 gdb_print_host_address (objfile
, outfile
);
387 fprintf_unfiltered (outfile
, ")\n");
391 fprintf_filtered (outfile
,
392 " Full symtab was read (at ");
393 gdb_print_host_address (psymtab
->symtab
, outfile
);
394 fprintf_filtered (outfile
, " by function at ");
395 gdb_print_host_address (psymtab
->read_symtab
, outfile
);
396 fprintf_filtered (outfile
, ")\n");
399 fprintf_filtered (outfile
, " Relocate symbols by ");
400 for (i
= 0; i
< psymtab
->objfile
->num_sections
; ++i
)
403 fprintf_filtered (outfile
, ", ");
405 print_address_numeric (ANOFFSET (psymtab
->section_offsets
, i
),
409 fprintf_filtered (outfile
, "\n");
411 fprintf_filtered (outfile
, " Symbols cover text addresses ");
412 print_address_numeric (psymtab
->textlow
, 1, outfile
);
413 fprintf_filtered (outfile
, "-");
414 print_address_numeric (psymtab
->texthigh
, 1, outfile
);
415 fprintf_filtered (outfile
, "\n");
416 fprintf_filtered (outfile
, " Depends on %d other partial symtabs.\n",
417 psymtab
->number_of_dependencies
);
418 for (i
= 0; i
< psymtab
->number_of_dependencies
; i
++)
420 fprintf_filtered (outfile
, " %d ", i
);
421 gdb_print_host_address (psymtab
->dependencies
[i
], outfile
);
422 fprintf_filtered (outfile
, " %s\n",
423 psymtab
->dependencies
[i
]->filename
);
425 if (psymtab
->n_global_syms
> 0)
427 print_partial_symbols (objfile
->global_psymbols
.list
428 + psymtab
->globals_offset
,
429 psymtab
->n_global_syms
, "Global", outfile
);
431 if (psymtab
->n_static_syms
> 0)
433 print_partial_symbols (objfile
->static_psymbols
.list
434 + psymtab
->statics_offset
,
435 psymtab
->n_static_syms
, "Static", outfile
);
437 fprintf_filtered (outfile
, "\n");
441 dump_symtab (struct objfile
*objfile
, struct symtab
*symtab
,
442 struct ui_file
*outfile
)
445 struct dict_iterator iter
;
448 struct blockvector
*bv
;
453 fprintf_filtered (outfile
, "\nSymtab for file %s\n", symtab
->filename
);
455 fprintf_filtered (outfile
, "Compilation directory is %s\n",
457 fprintf_filtered (outfile
, "Read from object file %s (", objfile
->name
);
458 gdb_print_host_address (objfile
, outfile
);
459 fprintf_filtered (outfile
, ")\n");
460 fprintf_filtered (outfile
, "Language: %s\n", language_str (symtab
->language
));
462 /* First print the line table. */
463 l
= LINETABLE (symtab
);
466 fprintf_filtered (outfile
, "\nLine table:\n\n");
468 for (i
= 0; i
< len
; i
++)
470 fprintf_filtered (outfile
, " line %d at ", l
->item
[i
].line
);
471 print_address_numeric (l
->item
[i
].pc
, 1, outfile
);
472 fprintf_filtered (outfile
, "\n");
475 /* Now print the block info, but only for primary symtabs since we will
476 print lots of duplicate info otherwise. */
479 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
480 bv
= BLOCKVECTOR (symtab
);
481 len
= BLOCKVECTOR_NBLOCKS (bv
);
482 for (i
= 0; i
< len
; i
++)
484 b
= BLOCKVECTOR_BLOCK (bv
, i
);
485 depth
= block_depth (b
) * 2;
486 print_spaces (depth
, outfile
);
487 fprintf_filtered (outfile
, "block #%03d, object at ", i
);
488 gdb_print_host_address (b
, outfile
);
489 if (BLOCK_SUPERBLOCK (b
))
491 fprintf_filtered (outfile
, " under ");
492 gdb_print_host_address (BLOCK_SUPERBLOCK (b
), outfile
);
494 /* drow/2002-07-10: We could save the total symbols count
495 even if we're using a hashtable, but nothing else but this message
497 fprintf_filtered (outfile
, ", %d syms/buckets in ",
498 dict_size (BLOCK_DICT (b
)));
499 print_address_numeric (BLOCK_START (b
), 1, outfile
);
500 fprintf_filtered (outfile
, "..");
501 print_address_numeric (BLOCK_END (b
), 1, outfile
);
502 if (BLOCK_FUNCTION (b
))
504 fprintf_filtered (outfile
, ", function %s", DEPRECATED_SYMBOL_NAME (BLOCK_FUNCTION (b
)));
505 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)) != NULL
)
507 fprintf_filtered (outfile
, ", %s",
508 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)));
511 if (BLOCK_GCC_COMPILED (b
))
512 fprintf_filtered (outfile
, ", compiled with gcc%d", BLOCK_GCC_COMPILED (b
));
513 fprintf_filtered (outfile
, "\n");
514 /* Now print each symbol in this block (in no particular order, if
515 we're using a hashtable). */
516 ALL_BLOCK_SYMBOLS (b
, iter
, sym
)
518 struct print_symbol_args s
;
522 catch_errors (print_symbol
, &s
, "Error printing symbol:\n",
526 fprintf_filtered (outfile
, "\n");
530 fprintf_filtered (outfile
, "\nBlockvector same as previous symtab\n\n");
535 maintenance_print_symbols (char *args
, int from_tty
)
538 struct ui_file
*outfile
;
539 struct cleanup
*cleanups
;
540 char *symname
= NULL
;
541 char *filename
= DEV_TTY
;
542 struct objfile
*objfile
;
550 Arguments missing: an output file name and an optional symbol file name");
552 else if ((argv
= buildargv (args
)) == NULL
)
556 cleanups
= make_cleanup_freeargv (argv
);
561 /* If a second arg is supplied, it is a source file name to match on */
568 filename
= tilde_expand (filename
);
569 make_cleanup (xfree
, filename
);
571 outfile
= gdb_fopen (filename
, FOPEN_WT
);
573 perror_with_name (filename
);
574 make_cleanup_ui_file_delete (outfile
);
577 ALL_SYMTABS (objfile
, s
)
578 if (symname
== NULL
|| strcmp (symname
, s
->filename
) == 0)
579 dump_symtab (objfile
, s
, outfile
);
581 do_cleanups (cleanups
);
584 /* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
585 far to indent. ARGS is really a struct print_symbol_args *, but is
586 declared as char * to get it past catch_errors. Returns 0 for error,
590 print_symbol (void *args
)
592 struct symbol
*symbol
= ((struct print_symbol_args
*) args
)->symbol
;
593 int depth
= ((struct print_symbol_args
*) args
)->depth
;
594 struct ui_file
*outfile
= ((struct print_symbol_args
*) args
)->outfile
;
596 print_spaces (depth
, outfile
);
597 if (SYMBOL_DOMAIN (symbol
) == LABEL_DOMAIN
)
599 fprintf_filtered (outfile
, "label %s at ", SYMBOL_PRINT_NAME (symbol
));
600 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
601 if (SYMBOL_BFD_SECTION (symbol
))
602 fprintf_filtered (outfile
, " section %s\n",
603 bfd_section_name (SYMBOL_BFD_SECTION (symbol
)->owner
,
604 SYMBOL_BFD_SECTION (symbol
)));
606 fprintf_filtered (outfile
, "\n");
609 if (SYMBOL_DOMAIN (symbol
) == STRUCT_DOMAIN
)
611 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol
)))
613 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
617 fprintf_filtered (outfile
, "%s %s = ",
618 (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_ENUM
620 : (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_STRUCT
621 ? "struct" : "union")),
622 DEPRECATED_SYMBOL_NAME (symbol
));
623 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
625 fprintf_filtered (outfile
, ";\n");
629 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
630 fprintf_filtered (outfile
, "typedef ");
631 if (SYMBOL_TYPE (symbol
))
633 /* Print details of types, except for enums where it's clutter. */
634 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), SYMBOL_PRINT_NAME (symbol
),
636 TYPE_CODE (SYMBOL_TYPE (symbol
)) != TYPE_CODE_ENUM
,
638 fprintf_filtered (outfile
, "; ");
641 fprintf_filtered (outfile
, "%s ", SYMBOL_PRINT_NAME (symbol
));
643 switch (SYMBOL_CLASS (symbol
))
646 fprintf_filtered (outfile
, "const %ld (0x%lx)",
647 SYMBOL_VALUE (symbol
),
648 SYMBOL_VALUE (symbol
));
651 case LOC_CONST_BYTES
:
654 struct type
*type
= check_typedef (SYMBOL_TYPE (symbol
));
655 fprintf_filtered (outfile
, "const %u hex bytes:",
657 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
658 fprintf_filtered (outfile
, " %02x",
659 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
664 fprintf_filtered (outfile
, "static at ");
665 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
666 if (SYMBOL_BFD_SECTION (symbol
))
667 fprintf_filtered (outfile
, " section %s",
669 (SYMBOL_BFD_SECTION (symbol
)->owner
,
670 SYMBOL_BFD_SECTION (symbol
)));
674 fprintf_filtered (outfile
, "extern global at *(");
675 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
676 fprintf_filtered (outfile
, "),");
680 fprintf_filtered (outfile
, "register %ld", SYMBOL_VALUE (symbol
));
684 fprintf_filtered (outfile
, "arg at offset 0x%lx",
685 SYMBOL_VALUE (symbol
));
689 fprintf_filtered (outfile
, "arg at offset 0x%lx from fp",
690 SYMBOL_VALUE (symbol
));
694 fprintf_filtered (outfile
, "reference arg at 0x%lx", SYMBOL_VALUE (symbol
));
698 fprintf_filtered (outfile
, "parameter register %ld", SYMBOL_VALUE (symbol
));
701 case LOC_REGPARM_ADDR
:
702 fprintf_filtered (outfile
, "address parameter register %ld", SYMBOL_VALUE (symbol
));
706 fprintf_filtered (outfile
, "local at offset 0x%lx",
707 SYMBOL_VALUE (symbol
));
711 fprintf_filtered (outfile
, "local at 0x%lx from register %d",
712 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
715 case LOC_BASEREG_ARG
:
716 fprintf_filtered (outfile
, "arg at 0x%lx from register %d",
717 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
724 fprintf_filtered (outfile
, "label at ");
725 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
726 if (SYMBOL_BFD_SECTION (symbol
))
727 fprintf_filtered (outfile
, " section %s",
729 (SYMBOL_BFD_SECTION (symbol
)->owner
,
730 SYMBOL_BFD_SECTION (symbol
)));
734 fprintf_filtered (outfile
, "block object ");
735 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol
), outfile
);
736 fprintf_filtered (outfile
, ", ");
737 print_address_numeric (BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
)),
740 fprintf_filtered (outfile
, "..");
741 print_address_numeric (BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
)),
744 if (SYMBOL_BFD_SECTION (symbol
))
745 fprintf_filtered (outfile
, " section %s",
747 (SYMBOL_BFD_SECTION (symbol
)->owner
,
748 SYMBOL_BFD_SECTION (symbol
)));
752 case LOC_COMPUTED_ARG
:
753 fprintf_filtered (outfile
, "computed at runtime");
757 fprintf_filtered (outfile
, "unresolved");
760 case LOC_OPTIMIZED_OUT
:
761 fprintf_filtered (outfile
, "optimized out");
765 fprintf_filtered (outfile
, "botched symbol class %x",
766 SYMBOL_CLASS (symbol
));
770 fprintf_filtered (outfile
, "\n");
775 maintenance_print_psymbols (char *args
, int from_tty
)
778 struct ui_file
*outfile
;
779 struct cleanup
*cleanups
;
780 char *symname
= NULL
;
781 char *filename
= DEV_TTY
;
782 struct objfile
*objfile
;
783 struct partial_symtab
*ps
;
789 error ("print-psymbols takes an output file name and optional symbol file name");
791 else if ((argv
= buildargv (args
)) == NULL
)
795 cleanups
= make_cleanup_freeargv (argv
);
800 /* If a second arg is supplied, it is a source file name to match on */
807 filename
= tilde_expand (filename
);
808 make_cleanup (xfree
, filename
);
810 outfile
= gdb_fopen (filename
, FOPEN_WT
);
812 perror_with_name (filename
);
813 make_cleanup_ui_file_delete (outfile
);
816 ALL_PSYMTABS (objfile
, ps
)
817 if (symname
== NULL
|| strcmp (symname
, ps
->filename
) == 0)
818 dump_psymtab (objfile
, ps
, outfile
);
820 do_cleanups (cleanups
);
824 print_partial_symbols (struct partial_symbol
**p
, int count
, char *what
,
825 struct ui_file
*outfile
)
827 fprintf_filtered (outfile
, " %s partial symbols:\n", what
);
830 fprintf_filtered (outfile
, " `%s'", DEPRECATED_SYMBOL_NAME (*p
));
831 if (SYMBOL_DEMANGLED_NAME (*p
) != NULL
)
833 fprintf_filtered (outfile
, " `%s'", SYMBOL_DEMANGLED_NAME (*p
));
835 fputs_filtered (", ", outfile
);
836 switch (SYMBOL_DOMAIN (*p
))
839 fputs_filtered ("undefined domain, ", outfile
);
842 /* This is the usual thing -- don't print it */
845 fputs_filtered ("struct domain, ", outfile
);
848 fputs_filtered ("label domain, ", outfile
);
851 fputs_filtered ("<invalid domain>, ", outfile
);
854 switch (SYMBOL_CLASS (*p
))
857 fputs_filtered ("undefined", outfile
);
860 fputs_filtered ("constant int", outfile
);
863 fputs_filtered ("static", outfile
);
866 fputs_filtered ("extern global", outfile
);
869 fputs_filtered ("register", outfile
);
872 fputs_filtered ("pass by value", outfile
);
875 fputs_filtered ("pass by reference", outfile
);
878 fputs_filtered ("register parameter", outfile
);
880 case LOC_REGPARM_ADDR
:
881 fputs_filtered ("register address parameter", outfile
);
884 fputs_filtered ("stack parameter", outfile
);
887 fputs_filtered ("type", outfile
);
890 fputs_filtered ("label", outfile
);
893 fputs_filtered ("function", outfile
);
895 case LOC_CONST_BYTES
:
896 fputs_filtered ("constant bytes", outfile
);
899 fputs_filtered ("shuffled arg", outfile
);
902 fputs_filtered ("unresolved", outfile
);
904 case LOC_OPTIMIZED_OUT
:
905 fputs_filtered ("optimized out", outfile
);
908 case LOC_COMPUTED_ARG
:
909 fputs_filtered ("computed at runtime", outfile
);
912 fputs_filtered ("<invalid location>", outfile
);
915 fputs_filtered (", ", outfile
);
916 print_address_numeric (SYMBOL_VALUE_ADDRESS (*p
), 1, outfile
);
917 fprintf_filtered (outfile
, "\n");
923 maintenance_print_msymbols (char *args
, int from_tty
)
926 struct ui_file
*outfile
;
927 struct cleanup
*cleanups
;
928 char *filename
= DEV_TTY
;
929 char *symname
= NULL
;
930 struct objfile
*objfile
;
936 error ("print-msymbols takes an output file name and optional symbol file name");
938 else if ((argv
= buildargv (args
)) == NULL
)
942 cleanups
= make_cleanup_freeargv (argv
);
947 /* If a second arg is supplied, it is a source file name to match on */
954 filename
= tilde_expand (filename
);
955 make_cleanup (xfree
, filename
);
957 outfile
= gdb_fopen (filename
, FOPEN_WT
);
959 perror_with_name (filename
);
960 make_cleanup_ui_file_delete (outfile
);
963 ALL_OBJFILES (objfile
)
964 if (symname
== NULL
|| strcmp (symname
, objfile
->name
) == 0)
965 dump_msymbols (objfile
, outfile
);
967 fprintf_filtered (outfile
, "\n\n");
968 do_cleanups (cleanups
);
972 maintenance_print_objfiles (char *ignore
, int from_tty
)
974 struct objfile
*objfile
;
979 ALL_OBJFILES (objfile
)
980 dump_objfile (objfile
);
985 /* List all the symbol tables whose names match REGEXP (optional). */
987 maintenance_info_symtabs (char *regexp
, int from_tty
)
989 struct objfile
*objfile
;
994 ALL_OBJFILES (objfile
)
996 struct symtab
*symtab
;
998 /* We don't want to print anything for this objfile until we
999 actually find a symtab whose name matches. */
1000 int printed_objfile_start
= 0;
1002 ALL_OBJFILE_SYMTABS (objfile
, symtab
)
1004 || re_exec (symtab
->filename
))
1006 if (! printed_objfile_start
)
1008 printf_filtered ("{ objfile %s ", objfile
->name
);
1010 printf_filtered ("((struct objfile *) %p)\n", objfile
);
1011 printed_objfile_start
= 1;
1014 printf_filtered (" { symtab %s ", symtab
->filename
);
1016 printf_filtered ("((struct symtab *) %p)\n", symtab
);
1017 printf_filtered (" dirname %s\n",
1018 symtab
->dirname
? symtab
->dirname
: "(null)");
1019 printf_filtered (" fullname %s\n",
1020 symtab
->fullname
? symtab
->fullname
: "(null)");
1021 printf_filtered (" blockvector ((struct blockvector *) %p)%s\n",
1022 symtab
->blockvector
,
1023 symtab
->primary
? " (primary)" : "");
1024 printf_filtered (" debugformat %s\n", symtab
->debugformat
);
1025 printf_filtered (" }\n");
1028 if (printed_objfile_start
)
1029 printf_filtered ("}\n");
1034 /* List all the partial symbol tables whose names match REGEXP (optional). */
1036 maintenance_info_psymtabs (char *regexp
, int from_tty
)
1038 struct objfile
*objfile
;
1043 ALL_OBJFILES (objfile
)
1045 struct partial_symtab
*psymtab
;
1047 /* We don't want to print anything for this objfile until we
1048 actually find a symtab whose name matches. */
1049 int printed_objfile_start
= 0;
1051 ALL_OBJFILE_PSYMTABS (objfile
, psymtab
)
1053 || re_exec (psymtab
->filename
))
1055 if (! printed_objfile_start
)
1057 printf_filtered ("{ objfile %s ", objfile
->name
);
1059 printf_filtered ("((struct objfile *) %p)\n", objfile
);
1060 printed_objfile_start
= 1;
1063 printf_filtered (" { psymtab %s ", psymtab
->filename
);
1065 printf_filtered ("((struct partial_symtab *) %p)\n", psymtab
);
1066 printf_filtered (" readin %s\n",
1067 psymtab
->readin
? "yes" : "no");
1068 printf_filtered (" fullname %s\n",
1069 psymtab
->fullname
? psymtab
->fullname
: "(null)");
1070 printf_filtered (" text addresses ");
1071 print_address_numeric (psymtab
->textlow
, 1, gdb_stdout
);
1072 printf_filtered (" -- ");
1073 print_address_numeric (psymtab
->texthigh
, 1, gdb_stdout
);
1074 printf_filtered ("\n");
1075 printf_filtered (" globals ");
1076 if (psymtab
->n_global_syms
)
1078 printf_filtered ("(* (struct partial_symbol **) %p @ %d)\n",
1079 (psymtab
->objfile
->global_psymbols
.list
1080 + psymtab
->globals_offset
),
1081 psymtab
->n_global_syms
);
1084 printf_filtered ("(none)\n");
1085 printf_filtered (" statics ");
1086 if (psymtab
->n_static_syms
)
1088 printf_filtered ("(* (struct partial_symbol **) %p @ %d)\n",
1089 (psymtab
->objfile
->static_psymbols
.list
1090 + psymtab
->statics_offset
),
1091 psymtab
->n_static_syms
);
1094 printf_filtered ("(none)\n");
1095 printf_filtered (" dependencies ");
1096 if (psymtab
->number_of_dependencies
)
1100 printf_filtered ("{\n");
1101 for (i
= 0; i
< psymtab
->number_of_dependencies
; i
++)
1103 struct partial_symtab
*dep
= psymtab
->dependencies
[i
];
1105 /* Note the string concatenation there --- no comma. */
1106 printf_filtered (" psymtab %s "
1107 "((struct partial_symtab *) %p)\n",
1108 dep
->filename
, dep
);
1110 printf_filtered (" }\n");
1113 printf_filtered ("(none)\n");
1114 printf_filtered (" }\n");
1117 if (printed_objfile_start
)
1118 printf_filtered ("}\n");
1123 /* Check consistency of psymtabs and symtabs. */
1126 maintenance_check_symtabs (char *ignore
, int from_tty
)
1129 struct partial_symbol
**psym
;
1130 struct symtab
*s
= NULL
;
1131 struct partial_symtab
*ps
;
1132 struct blockvector
*bv
;
1133 struct objfile
*objfile
;
1137 ALL_PSYMTABS (objfile
, ps
)
1139 s
= PSYMTAB_TO_SYMTAB (ps
);
1142 bv
= BLOCKVECTOR (s
);
1143 b
= BLOCKVECTOR_BLOCK (bv
, STATIC_BLOCK
);
1144 psym
= ps
->objfile
->static_psymbols
.list
+ ps
->statics_offset
;
1145 length
= ps
->n_static_syms
;
1148 sym
= lookup_block_symbol (b
, DEPRECATED_SYMBOL_NAME (*psym
),
1149 NULL
, SYMBOL_DOMAIN (*psym
));
1152 printf_filtered ("Static symbol `");
1153 puts_filtered (DEPRECATED_SYMBOL_NAME (*psym
));
1154 printf_filtered ("' only found in ");
1155 puts_filtered (ps
->filename
);
1156 printf_filtered (" psymtab\n");
1160 b
= BLOCKVECTOR_BLOCK (bv
, GLOBAL_BLOCK
);
1161 psym
= ps
->objfile
->global_psymbols
.list
+ ps
->globals_offset
;
1162 length
= ps
->n_global_syms
;
1165 sym
= lookup_block_symbol (b
, DEPRECATED_SYMBOL_NAME (*psym
),
1166 NULL
, SYMBOL_DOMAIN (*psym
));
1169 printf_filtered ("Global symbol `");
1170 puts_filtered (DEPRECATED_SYMBOL_NAME (*psym
));
1171 printf_filtered ("' only found in ");
1172 puts_filtered (ps
->filename
);
1173 printf_filtered (" psymtab\n");
1177 if (ps
->texthigh
< ps
->textlow
)
1179 printf_filtered ("Psymtab ");
1180 puts_filtered (ps
->filename
);
1181 printf_filtered (" covers bad range ");
1182 print_address_numeric (ps
->textlow
, 1, gdb_stdout
);
1183 printf_filtered (" - ");
1184 print_address_numeric (ps
->texthigh
, 1, gdb_stdout
);
1185 printf_filtered ("\n");
1188 if (ps
->texthigh
== 0)
1190 if (ps
->textlow
< BLOCK_START (b
) || ps
->texthigh
> BLOCK_END (b
))
1192 printf_filtered ("Psymtab ");
1193 puts_filtered (ps
->filename
);
1194 printf_filtered (" covers ");
1195 print_address_numeric (ps
->textlow
, 1, gdb_stdout
);
1196 printf_filtered (" - ");
1197 print_address_numeric (ps
->texthigh
, 1, gdb_stdout
);
1198 printf_filtered (" but symtab covers only ");
1199 print_address_numeric (BLOCK_START (b
), 1, gdb_stdout
);
1200 printf_filtered (" - ");
1201 print_address_numeric (BLOCK_END (b
), 1, gdb_stdout
);
1202 printf_filtered ("\n");
1208 /* Return the nexting depth of a block within other blocks in its symtab. */
1211 block_depth (struct block
*block
)
1214 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
1222 /* Increase the space allocated for LISTP, which is probably
1223 global_psymbols or static_psymbols. This space will eventually
1224 be freed in free_objfile(). */
1227 extend_psymbol_list (struct psymbol_allocation_list
*listp
,
1228 struct objfile
*objfile
)
1231 if (listp
->size
== 0)
1234 listp
->list
= (struct partial_symbol
**)
1235 xmmalloc (objfile
->md
, new_size
* sizeof (struct partial_symbol
*));
1239 new_size
= listp
->size
* 2;
1240 listp
->list
= (struct partial_symbol
**)
1241 xmrealloc (objfile
->md
, (char *) listp
->list
,
1242 new_size
* sizeof (struct partial_symbol
*));
1244 /* Next assumes we only went one over. Should be good if
1245 program works correctly */
1246 listp
->next
= listp
->list
+ listp
->size
;
1247 listp
->size
= new_size
;
1251 /* Do early runtime initializations. */
1253 _initialize_symmisc (void)
This page took 0.055633 seconds and 4 git commands to generate.