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 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 psymbol obstack: %d\n",
234 obstack_memory_used (&objfile
->psymbol_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
));
239 printf_filtered (" Total memory used for symbol obstack: %d\n",
240 obstack_memory_used (&objfile
->symbol_obstack
));
241 printf_filtered (" Total memory used for type obstack: %d\n",
242 obstack_memory_used (&objfile
->type_obstack
));
248 dump_objfile (struct objfile
*objfile
)
250 struct symtab
*symtab
;
251 struct partial_symtab
*psymtab
;
253 printf_filtered ("\nObject file %s: ", objfile
->name
);
254 printf_filtered ("Objfile at ");
255 gdb_print_host_address (objfile
, gdb_stdout
);
256 printf_filtered (", bfd at ");
257 gdb_print_host_address (objfile
->obfd
, gdb_stdout
);
258 printf_filtered (", %d minsyms\n\n",
259 objfile
->minimal_symbol_count
);
261 if (objfile
->psymtabs
)
263 printf_filtered ("Psymtabs:\n");
264 for (psymtab
= objfile
->psymtabs
;
266 psymtab
= psymtab
->next
)
268 printf_filtered ("%s at ",
270 gdb_print_host_address (psymtab
, gdb_stdout
);
271 printf_filtered (", ");
272 if (psymtab
->objfile
!= objfile
)
274 printf_filtered ("NOT ON CHAIN! ");
278 printf_filtered ("\n\n");
281 if (objfile
->symtabs
)
283 printf_filtered ("Symtabs:\n");
284 for (symtab
= objfile
->symtabs
;
286 symtab
= symtab
->next
)
288 printf_filtered ("%s at ", symtab
->filename
);
289 gdb_print_host_address (symtab
, gdb_stdout
);
290 printf_filtered (", ");
291 if (symtab
->objfile
!= objfile
)
293 printf_filtered ("NOT ON CHAIN! ");
297 printf_filtered ("\n\n");
301 /* Print minimal symbols from this objfile. */
304 dump_msymbols (struct objfile
*objfile
, struct ui_file
*outfile
)
306 struct minimal_symbol
*msymbol
;
310 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile
->name
);
311 if (objfile
->minimal_symbol_count
== 0)
313 fprintf_filtered (outfile
, "No minimal symbols found.\n");
316 for (index
= 0, msymbol
= objfile
->msymbols
;
317 DEPRECATED_SYMBOL_NAME (msymbol
) != NULL
; msymbol
++, index
++)
319 switch (msymbol
->type
)
327 case mst_solib_trampoline
:
352 fprintf_filtered (outfile
, "[%2d] %c ", index
, ms_type
);
353 print_address_numeric (SYMBOL_VALUE_ADDRESS (msymbol
), 1, outfile
);
354 fprintf_filtered (outfile
, " %s", DEPRECATED_SYMBOL_NAME (msymbol
));
355 if (SYMBOL_BFD_SECTION (msymbol
))
356 fprintf_filtered (outfile
, " section %s",
357 bfd_section_name (objfile
->obfd
,
358 SYMBOL_BFD_SECTION (msymbol
)));
359 if (SYMBOL_DEMANGLED_NAME (msymbol
) != NULL
)
361 fprintf_filtered (outfile
, " %s", SYMBOL_DEMANGLED_NAME (msymbol
));
363 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
364 if (msymbol
->filename
)
365 fprintf_filtered (outfile
, " %s", msymbol
->filename
);
367 fputs_filtered ("\n", outfile
);
369 if (objfile
->minimal_symbol_count
!= index
)
371 warning ("internal error: minimal symbol count %d != %d",
372 objfile
->minimal_symbol_count
, index
);
374 fprintf_filtered (outfile
, "\n");
378 dump_psymtab (struct objfile
*objfile
, struct partial_symtab
*psymtab
,
379 struct ui_file
*outfile
)
383 fprintf_filtered (outfile
, "\nPartial symtab for source file %s ",
385 fprintf_filtered (outfile
, "(object ");
386 gdb_print_host_address (psymtab
, outfile
);
387 fprintf_filtered (outfile
, ")\n\n");
388 fprintf_unfiltered (outfile
, " Read from object file %s (",
390 gdb_print_host_address (objfile
, outfile
);
391 fprintf_unfiltered (outfile
, ")\n");
395 fprintf_filtered (outfile
,
396 " Full symtab was read (at ");
397 gdb_print_host_address (psymtab
->symtab
, outfile
);
398 fprintf_filtered (outfile
, " by function at ");
399 gdb_print_host_address (psymtab
->read_symtab
, outfile
);
400 fprintf_filtered (outfile
, ")\n");
403 fprintf_filtered (outfile
, " Relocate symbols by ");
404 for (i
= 0; i
< psymtab
->objfile
->num_sections
; ++i
)
407 fprintf_filtered (outfile
, ", ");
409 print_address_numeric (ANOFFSET (psymtab
->section_offsets
, i
),
413 fprintf_filtered (outfile
, "\n");
415 fprintf_filtered (outfile
, " Symbols cover text addresses ");
416 print_address_numeric (psymtab
->textlow
, 1, outfile
);
417 fprintf_filtered (outfile
, "-");
418 print_address_numeric (psymtab
->texthigh
, 1, outfile
);
419 fprintf_filtered (outfile
, "\n");
420 fprintf_filtered (outfile
, " Depends on %d other partial symtabs.\n",
421 psymtab
->number_of_dependencies
);
422 for (i
= 0; i
< psymtab
->number_of_dependencies
; i
++)
424 fprintf_filtered (outfile
, " %d ", i
);
425 gdb_print_host_address (psymtab
->dependencies
[i
], outfile
);
426 fprintf_filtered (outfile
, " %s\n",
427 psymtab
->dependencies
[i
]->filename
);
429 if (psymtab
->n_global_syms
> 0)
431 print_partial_symbols (objfile
->global_psymbols
.list
432 + psymtab
->globals_offset
,
433 psymtab
->n_global_syms
, "Global", outfile
);
435 if (psymtab
->n_static_syms
> 0)
437 print_partial_symbols (objfile
->static_psymbols
.list
438 + psymtab
->statics_offset
,
439 psymtab
->n_static_syms
, "Static", outfile
);
441 fprintf_filtered (outfile
, "\n");
445 dump_symtab (struct objfile
*objfile
, struct symtab
*symtab
,
446 struct ui_file
*outfile
)
449 struct dict_iterator iter
;
452 struct blockvector
*bv
;
457 fprintf_filtered (outfile
, "\nSymtab for file %s\n", symtab
->filename
);
459 fprintf_filtered (outfile
, "Compilation directory is %s\n",
461 fprintf_filtered (outfile
, "Read from object file %s (", objfile
->name
);
462 gdb_print_host_address (objfile
, outfile
);
463 fprintf_filtered (outfile
, ")\n");
464 fprintf_filtered (outfile
, "Language: %s\n", language_str (symtab
->language
));
466 /* First print the line table. */
467 l
= LINETABLE (symtab
);
470 fprintf_filtered (outfile
, "\nLine table:\n\n");
472 for (i
= 0; i
< len
; i
++)
474 fprintf_filtered (outfile
, " line %d at ", l
->item
[i
].line
);
475 print_address_numeric (l
->item
[i
].pc
, 1, outfile
);
476 fprintf_filtered (outfile
, "\n");
479 /* Now print the block info, but only for primary symtabs since we will
480 print lots of duplicate info otherwise. */
483 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
484 bv
= BLOCKVECTOR (symtab
);
485 len
= BLOCKVECTOR_NBLOCKS (bv
);
486 for (i
= 0; i
< len
; i
++)
488 b
= BLOCKVECTOR_BLOCK (bv
, i
);
489 depth
= block_depth (b
) * 2;
490 print_spaces (depth
, outfile
);
491 fprintf_filtered (outfile
, "block #%03d, object at ", i
);
492 gdb_print_host_address (b
, outfile
);
493 if (BLOCK_SUPERBLOCK (b
))
495 fprintf_filtered (outfile
, " under ");
496 gdb_print_host_address (BLOCK_SUPERBLOCK (b
), outfile
);
498 /* drow/2002-07-10: We could save the total symbols count
499 even if we're using a hashtable, but nothing else but this message
501 fprintf_filtered (outfile
, ", %d syms/buckets in ",
502 dict_size (BLOCK_DICT (b
)));
503 print_address_numeric (BLOCK_START (b
), 1, outfile
);
504 fprintf_filtered (outfile
, "..");
505 print_address_numeric (BLOCK_END (b
), 1, outfile
);
506 if (BLOCK_FUNCTION (b
))
508 fprintf_filtered (outfile
, ", function %s", DEPRECATED_SYMBOL_NAME (BLOCK_FUNCTION (b
)));
509 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)) != NULL
)
511 fprintf_filtered (outfile
, ", %s",
512 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)));
515 if (BLOCK_GCC_COMPILED (b
))
516 fprintf_filtered (outfile
, ", compiled with gcc%d", BLOCK_GCC_COMPILED (b
));
517 fprintf_filtered (outfile
, "\n");
518 /* Now print each symbol in this block (in no particular order, if
519 we're using a hashtable). */
520 ALL_BLOCK_SYMBOLS (b
, iter
, sym
)
522 struct print_symbol_args s
;
526 catch_errors (print_symbol
, &s
, "Error printing symbol:\n",
530 fprintf_filtered (outfile
, "\n");
534 fprintf_filtered (outfile
, "\nBlockvector same as previous symtab\n\n");
539 maintenance_print_symbols (char *args
, int from_tty
)
542 struct ui_file
*outfile
;
543 struct cleanup
*cleanups
;
544 char *symname
= NULL
;
545 char *filename
= DEV_TTY
;
546 struct objfile
*objfile
;
554 Arguments missing: an output file name and an optional symbol file name");
556 else if ((argv
= buildargv (args
)) == NULL
)
560 cleanups
= make_cleanup_freeargv (argv
);
565 /* If a second arg is supplied, it is a source file name to match on */
572 filename
= tilde_expand (filename
);
573 make_cleanup (xfree
, filename
);
575 outfile
= gdb_fopen (filename
, FOPEN_WT
);
577 perror_with_name (filename
);
578 make_cleanup_ui_file_delete (outfile
);
581 ALL_SYMTABS (objfile
, s
)
582 if (symname
== NULL
|| (STREQ (symname
, s
->filename
)))
583 dump_symtab (objfile
, s
, outfile
);
585 do_cleanups (cleanups
);
588 /* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
589 far to indent. ARGS is really a struct print_symbol_args *, but is
590 declared as char * to get it past catch_errors. Returns 0 for error,
594 print_symbol (void *args
)
596 struct symbol
*symbol
= ((struct print_symbol_args
*) args
)->symbol
;
597 int depth
= ((struct print_symbol_args
*) args
)->depth
;
598 struct ui_file
*outfile
= ((struct print_symbol_args
*) args
)->outfile
;
600 print_spaces (depth
, outfile
);
601 if (SYMBOL_DOMAIN (symbol
) == LABEL_DOMAIN
)
603 fprintf_filtered (outfile
, "label %s at ", SYMBOL_PRINT_NAME (symbol
));
604 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
605 if (SYMBOL_BFD_SECTION (symbol
))
606 fprintf_filtered (outfile
, " section %s\n",
607 bfd_section_name (SYMBOL_BFD_SECTION (symbol
)->owner
,
608 SYMBOL_BFD_SECTION (symbol
)));
610 fprintf_filtered (outfile
, "\n");
613 if (SYMBOL_DOMAIN (symbol
) == STRUCT_DOMAIN
)
615 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol
)))
617 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
621 fprintf_filtered (outfile
, "%s %s = ",
622 (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_ENUM
624 : (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_STRUCT
625 ? "struct" : "union")),
626 DEPRECATED_SYMBOL_NAME (symbol
));
627 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
629 fprintf_filtered (outfile
, ";\n");
633 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
634 fprintf_filtered (outfile
, "typedef ");
635 if (SYMBOL_TYPE (symbol
))
637 /* Print details of types, except for enums where it's clutter. */
638 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), SYMBOL_PRINT_NAME (symbol
),
640 TYPE_CODE (SYMBOL_TYPE (symbol
)) != TYPE_CODE_ENUM
,
642 fprintf_filtered (outfile
, "; ");
645 fprintf_filtered (outfile
, "%s ", SYMBOL_PRINT_NAME (symbol
));
647 switch (SYMBOL_CLASS (symbol
))
650 fprintf_filtered (outfile
, "const %ld (0x%lx)",
651 SYMBOL_VALUE (symbol
),
652 SYMBOL_VALUE (symbol
));
655 case LOC_CONST_BYTES
:
658 struct type
*type
= check_typedef (SYMBOL_TYPE (symbol
));
659 fprintf_filtered (outfile
, "const %u hex bytes:",
661 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
662 fprintf_filtered (outfile
, " %02x",
663 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
668 fprintf_filtered (outfile
, "static at ");
669 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
670 if (SYMBOL_BFD_SECTION (symbol
))
671 fprintf_filtered (outfile
, " section %s",
673 (SYMBOL_BFD_SECTION (symbol
)->owner
,
674 SYMBOL_BFD_SECTION (symbol
)));
678 fprintf_filtered (outfile
, "extern global at *(");
679 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
680 fprintf_filtered (outfile
, "),");
684 fprintf_filtered (outfile
, "register %ld", SYMBOL_VALUE (symbol
));
688 fprintf_filtered (outfile
, "arg at offset 0x%lx",
689 SYMBOL_VALUE (symbol
));
693 fprintf_filtered (outfile
, "arg at offset 0x%lx from fp",
694 SYMBOL_VALUE (symbol
));
698 fprintf_filtered (outfile
, "reference arg at 0x%lx", SYMBOL_VALUE (symbol
));
702 fprintf_filtered (outfile
, "parameter register %ld", SYMBOL_VALUE (symbol
));
705 case LOC_REGPARM_ADDR
:
706 fprintf_filtered (outfile
, "address parameter register %ld", SYMBOL_VALUE (symbol
));
710 fprintf_filtered (outfile
, "local at offset 0x%lx",
711 SYMBOL_VALUE (symbol
));
715 fprintf_filtered (outfile
, "local at 0x%lx from register %d",
716 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
719 case LOC_BASEREG_ARG
:
720 fprintf_filtered (outfile
, "arg at 0x%lx from register %d",
721 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
728 fprintf_filtered (outfile
, "label at ");
729 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
730 if (SYMBOL_BFD_SECTION (symbol
))
731 fprintf_filtered (outfile
, " section %s",
733 (SYMBOL_BFD_SECTION (symbol
)->owner
,
734 SYMBOL_BFD_SECTION (symbol
)));
738 fprintf_filtered (outfile
, "block object ");
739 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol
), outfile
);
740 fprintf_filtered (outfile
, ", ");
741 print_address_numeric (BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
)),
744 fprintf_filtered (outfile
, "..");
745 print_address_numeric (BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
)),
748 if (SYMBOL_BFD_SECTION (symbol
))
749 fprintf_filtered (outfile
, " section %s",
751 (SYMBOL_BFD_SECTION (symbol
)->owner
,
752 SYMBOL_BFD_SECTION (symbol
)));
756 case LOC_COMPUTED_ARG
:
757 fprintf_filtered (outfile
, "computed at runtime");
761 fprintf_filtered (outfile
, "unresolved");
764 case LOC_OPTIMIZED_OUT
:
765 fprintf_filtered (outfile
, "optimized out");
769 fprintf_filtered (outfile
, "botched symbol class %x",
770 SYMBOL_CLASS (symbol
));
774 fprintf_filtered (outfile
, "\n");
779 maintenance_print_psymbols (char *args
, int from_tty
)
782 struct ui_file
*outfile
;
783 struct cleanup
*cleanups
;
784 char *symname
= NULL
;
785 char *filename
= DEV_TTY
;
786 struct objfile
*objfile
;
787 struct partial_symtab
*ps
;
793 error ("print-psymbols takes an output file name and optional symbol file name");
795 else if ((argv
= buildargv (args
)) == NULL
)
799 cleanups
= make_cleanup_freeargv (argv
);
804 /* If a second arg is supplied, it is a source file name to match on */
811 filename
= tilde_expand (filename
);
812 make_cleanup (xfree
, filename
);
814 outfile
= gdb_fopen (filename
, FOPEN_WT
);
816 perror_with_name (filename
);
817 make_cleanup_ui_file_delete (outfile
);
820 ALL_PSYMTABS (objfile
, ps
)
821 if (symname
== NULL
|| (STREQ (symname
, ps
->filename
)))
822 dump_psymtab (objfile
, ps
, outfile
);
824 do_cleanups (cleanups
);
828 print_partial_symbols (struct partial_symbol
**p
, int count
, char *what
,
829 struct ui_file
*outfile
)
831 fprintf_filtered (outfile
, " %s partial symbols:\n", what
);
834 fprintf_filtered (outfile
, " `%s'", DEPRECATED_SYMBOL_NAME (*p
));
835 if (SYMBOL_DEMANGLED_NAME (*p
) != NULL
)
837 fprintf_filtered (outfile
, " `%s'", SYMBOL_DEMANGLED_NAME (*p
));
839 fputs_filtered (", ", outfile
);
840 switch (SYMBOL_DOMAIN (*p
))
843 fputs_filtered ("undefined domain, ", outfile
);
846 /* This is the usual thing -- don't print it */
849 fputs_filtered ("struct domain, ", outfile
);
852 fputs_filtered ("label domain, ", outfile
);
855 fputs_filtered ("<invalid domain>, ", outfile
);
858 switch (SYMBOL_CLASS (*p
))
861 fputs_filtered ("undefined", outfile
);
864 fputs_filtered ("constant int", outfile
);
867 fputs_filtered ("static", outfile
);
870 fputs_filtered ("extern global", outfile
);
873 fputs_filtered ("register", outfile
);
876 fputs_filtered ("pass by value", outfile
);
879 fputs_filtered ("pass by reference", outfile
);
882 fputs_filtered ("register parameter", outfile
);
884 case LOC_REGPARM_ADDR
:
885 fputs_filtered ("register address parameter", outfile
);
888 fputs_filtered ("stack parameter", outfile
);
891 fputs_filtered ("type", outfile
);
894 fputs_filtered ("label", outfile
);
897 fputs_filtered ("function", outfile
);
899 case LOC_CONST_BYTES
:
900 fputs_filtered ("constant bytes", outfile
);
903 fputs_filtered ("shuffled arg", outfile
);
906 fputs_filtered ("unresolved", outfile
);
908 case LOC_OPTIMIZED_OUT
:
909 fputs_filtered ("optimized out", outfile
);
912 case LOC_COMPUTED_ARG
:
913 fputs_filtered ("computed at runtime", outfile
);
916 fputs_filtered ("<invalid location>", outfile
);
919 fputs_filtered (", ", outfile
);
920 print_address_numeric (SYMBOL_VALUE_ADDRESS (*p
), 1, outfile
);
921 fprintf_filtered (outfile
, "\n");
927 maintenance_print_msymbols (char *args
, int from_tty
)
930 struct ui_file
*outfile
;
931 struct cleanup
*cleanups
;
932 char *filename
= DEV_TTY
;
933 char *symname
= NULL
;
934 struct objfile
*objfile
;
940 error ("print-msymbols takes an output file name and optional symbol file name");
942 else if ((argv
= buildargv (args
)) == NULL
)
946 cleanups
= make_cleanup_freeargv (argv
);
951 /* If a second arg is supplied, it is a source file name to match on */
958 filename
= tilde_expand (filename
);
959 make_cleanup (xfree
, filename
);
961 outfile
= gdb_fopen (filename
, FOPEN_WT
);
963 perror_with_name (filename
);
964 make_cleanup_ui_file_delete (outfile
);
967 ALL_OBJFILES (objfile
)
968 if (symname
== NULL
|| (STREQ (symname
, objfile
->name
)))
969 dump_msymbols (objfile
, outfile
);
971 fprintf_filtered (outfile
, "\n\n");
972 do_cleanups (cleanups
);
976 maintenance_print_objfiles (char *ignore
, int from_tty
)
978 struct objfile
*objfile
;
983 ALL_OBJFILES (objfile
)
984 dump_objfile (objfile
);
989 /* List all the symbol tables whose names match REGEXP (optional). */
991 maintenance_info_symtabs (char *regexp
, int from_tty
)
993 struct objfile
*objfile
;
998 ALL_OBJFILES (objfile
)
1000 struct symtab
*symtab
;
1002 /* We don't want to print anything for this objfile until we
1003 actually find a symtab whose name matches. */
1004 int printed_objfile_start
= 0;
1006 ALL_OBJFILE_SYMTABS (objfile
, symtab
)
1008 || re_exec (symtab
->filename
))
1010 if (! printed_objfile_start
)
1012 printf_filtered ("{ objfile %s ", objfile
->name
);
1014 printf_filtered ("((struct objfile *) %p)\n", objfile
);
1015 printed_objfile_start
= 1;
1018 printf_filtered (" { symtab %s ", symtab
->filename
);
1020 printf_filtered ("((struct symtab *) %p)\n", symtab
);
1021 printf_filtered (" dirname %s\n",
1022 symtab
->dirname
? symtab
->dirname
: "(null)");
1023 printf_filtered (" fullname %s\n",
1024 symtab
->fullname
? symtab
->fullname
: "(null)");
1025 printf_filtered (" blockvector ((struct blockvector *) %p)%s\n",
1026 symtab
->blockvector
,
1027 symtab
->primary
? " (primary)" : "");
1028 printf_filtered (" debugformat %s\n", symtab
->debugformat
);
1029 printf_filtered (" }\n");
1032 if (printed_objfile_start
)
1033 printf_filtered ("}\n");
1038 /* List all the partial symbol tables whose names match REGEXP (optional). */
1040 maintenance_info_psymtabs (char *regexp
, int from_tty
)
1042 struct objfile
*objfile
;
1047 ALL_OBJFILES (objfile
)
1049 struct partial_symtab
*psymtab
;
1051 /* We don't want to print anything for this objfile until we
1052 actually find a symtab whose name matches. */
1053 int printed_objfile_start
= 0;
1055 ALL_OBJFILE_PSYMTABS (objfile
, psymtab
)
1057 || re_exec (psymtab
->filename
))
1059 if (! printed_objfile_start
)
1061 printf_filtered ("{ objfile %s ", objfile
->name
);
1063 printf_filtered ("((struct objfile *) %p)\n", objfile
);
1064 printed_objfile_start
= 1;
1067 printf_filtered (" { psymtab %s ", psymtab
->filename
);
1069 printf_filtered ("((struct partial_symtab *) %p)\n", psymtab
);
1070 printf_filtered (" readin %s\n",
1071 psymtab
->readin
? "yes" : "no");
1072 printf_filtered (" fullname %s\n",
1073 psymtab
->fullname
? psymtab
->fullname
: "(null)");
1074 printf_filtered (" text addresses ");
1075 print_address_numeric (psymtab
->textlow
, 1, gdb_stdout
);
1076 printf_filtered (" -- ");
1077 print_address_numeric (psymtab
->texthigh
, 1, gdb_stdout
);
1078 printf_filtered ("\n");
1079 printf_filtered (" globals ");
1080 if (psymtab
->n_global_syms
)
1082 printf_filtered ("(* (struct partial_symbol **) %p @ %d)\n",
1083 (psymtab
->objfile
->global_psymbols
.list
1084 + psymtab
->globals_offset
),
1085 psymtab
->n_global_syms
);
1088 printf_filtered ("(none)\n");
1089 printf_filtered (" statics ");
1090 if (psymtab
->n_static_syms
)
1092 printf_filtered ("(* (struct partial_symbol **) %p @ %d)\n",
1093 (psymtab
->objfile
->static_psymbols
.list
1094 + psymtab
->statics_offset
),
1095 psymtab
->n_static_syms
);
1098 printf_filtered ("(none)\n");
1099 printf_filtered (" dependencies ");
1100 if (psymtab
->number_of_dependencies
)
1104 printf_filtered ("{\n");
1105 for (i
= 0; i
< psymtab
->number_of_dependencies
; i
++)
1107 struct partial_symtab
*dep
= psymtab
->dependencies
[i
];
1109 /* Note the string concatenation there --- no comma. */
1110 printf_filtered (" psymtab %s "
1111 "((struct partial_symtab *) %p)\n",
1112 dep
->filename
, dep
);
1114 printf_filtered (" }\n");
1117 printf_filtered ("(none)\n");
1118 printf_filtered (" }\n");
1121 if (printed_objfile_start
)
1122 printf_filtered ("}\n");
1127 /* Check consistency of psymtabs and symtabs. */
1130 maintenance_check_symtabs (char *ignore
, int from_tty
)
1133 struct partial_symbol
**psym
;
1134 struct symtab
*s
= NULL
;
1135 struct partial_symtab
*ps
;
1136 struct blockvector
*bv
;
1137 struct objfile
*objfile
;
1141 ALL_PSYMTABS (objfile
, ps
)
1143 s
= PSYMTAB_TO_SYMTAB (ps
);
1146 bv
= BLOCKVECTOR (s
);
1147 b
= BLOCKVECTOR_BLOCK (bv
, STATIC_BLOCK
);
1148 psym
= ps
->objfile
->static_psymbols
.list
+ ps
->statics_offset
;
1149 length
= ps
->n_static_syms
;
1152 sym
= lookup_block_symbol (b
, DEPRECATED_SYMBOL_NAME (*psym
),
1153 NULL
, SYMBOL_DOMAIN (*psym
));
1156 printf_filtered ("Static symbol `");
1157 puts_filtered (DEPRECATED_SYMBOL_NAME (*psym
));
1158 printf_filtered ("' only found in ");
1159 puts_filtered (ps
->filename
);
1160 printf_filtered (" psymtab\n");
1164 b
= BLOCKVECTOR_BLOCK (bv
, GLOBAL_BLOCK
);
1165 psym
= ps
->objfile
->global_psymbols
.list
+ ps
->globals_offset
;
1166 length
= ps
->n_global_syms
;
1169 sym
= lookup_block_symbol (b
, DEPRECATED_SYMBOL_NAME (*psym
),
1170 NULL
, SYMBOL_DOMAIN (*psym
));
1173 printf_filtered ("Global symbol `");
1174 puts_filtered (DEPRECATED_SYMBOL_NAME (*psym
));
1175 printf_filtered ("' only found in ");
1176 puts_filtered (ps
->filename
);
1177 printf_filtered (" psymtab\n");
1181 if (ps
->texthigh
< ps
->textlow
)
1183 printf_filtered ("Psymtab ");
1184 puts_filtered (ps
->filename
);
1185 printf_filtered (" covers bad range ");
1186 print_address_numeric (ps
->textlow
, 1, gdb_stdout
);
1187 printf_filtered (" - ");
1188 print_address_numeric (ps
->texthigh
, 1, gdb_stdout
);
1189 printf_filtered ("\n");
1192 if (ps
->texthigh
== 0)
1194 if (ps
->textlow
< BLOCK_START (b
) || ps
->texthigh
> BLOCK_END (b
))
1196 printf_filtered ("Psymtab ");
1197 puts_filtered (ps
->filename
);
1198 printf_filtered (" covers ");
1199 print_address_numeric (ps
->textlow
, 1, gdb_stdout
);
1200 printf_filtered (" - ");
1201 print_address_numeric (ps
->texthigh
, 1, gdb_stdout
);
1202 printf_filtered (" but symtab covers only ");
1203 print_address_numeric (BLOCK_START (b
), 1, gdb_stdout
);
1204 printf_filtered (" - ");
1205 print_address_numeric (BLOCK_END (b
), 1, gdb_stdout
);
1206 printf_filtered ("\n");
1212 /* Return the nexting depth of a block within other blocks in its symtab. */
1215 block_depth (struct block
*block
)
1218 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
1226 /* Increase the space allocated for LISTP, which is probably
1227 global_psymbols or static_psymbols. This space will eventually
1228 be freed in free_objfile(). */
1231 extend_psymbol_list (struct psymbol_allocation_list
*listp
,
1232 struct objfile
*objfile
)
1235 if (listp
->size
== 0)
1238 listp
->list
= (struct partial_symbol
**)
1239 xmmalloc (objfile
->md
, new_size
* sizeof (struct partial_symbol
*));
1243 new_size
= listp
->size
* 2;
1244 listp
->list
= (struct partial_symbol
**)
1245 xmrealloc (objfile
->md
, (char *) listp
->list
,
1246 new_size
* sizeof (struct partial_symbol
*));
1248 /* Next assumes we only went one over. Should be good if
1249 program works correctly */
1250 listp
->next
= listp
->list
+ listp
->size
;
1251 listp
->size
= new_size
;
1255 /* Do early runtime initializations. */
1257 _initialize_symmisc (void)
This page took 0.055737 seconds and 4 git commands to generate.