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"
33 #include "exceptions.h"
37 #include "gdb_regex.h"
38 #include "dictionary.h"
40 #include "gdb_string.h"
41 #include "readline/readline.h"
44 #define DEV_TTY "/dev/tty"
47 /* Unfortunately for debugging, stderr is usually a macro. This is painful
48 when calling functions that take FILE *'s from the debugger.
49 So we make a variable which has the same value and which is accessible when
50 debugging GDB with itself. Because stdin et al need not be constants,
51 we initialize them in the _initialize_symmisc function at the bottom
57 /* Prototypes for local functions */
59 static void dump_symtab (struct objfile
*, struct symtab
*,
62 static void dump_psymtab (struct objfile
*, struct partial_symtab
*,
65 static void dump_msymbols (struct objfile
*, struct ui_file
*);
67 static void dump_objfile (struct objfile
*);
69 static int block_depth (struct block
*);
71 static void print_partial_symbols (struct partial_symbol
**, int,
72 char *, struct ui_file
*);
74 static void free_symtab_block (struct objfile
*, struct block
*);
76 void _initialize_symmisc (void);
78 struct print_symbol_args
80 struct symbol
*symbol
;
82 struct ui_file
*outfile
;
85 static int print_symbol (void *);
87 static void free_symtab_block (struct objfile
*, struct block
*);
90 /* Free a struct block <- B and all the symbols defined in that block. */
92 /* FIXME: carlton/2003-04-28: I don't believe this is currently ever
96 free_symtab_block (struct objfile
*objfile
, struct block
*b
)
98 struct dict_iterator iter
;
101 ALL_BLOCK_SYMBOLS (b
, iter
, sym
)
103 xfree (DEPRECATED_SYMBOL_NAME (sym
));
107 dict_free (BLOCK_DICT (b
));
111 /* Free all the storage associated with the struct symtab <- S.
112 Note that some symtabs have contents malloc'ed structure by structure,
113 while some have contents that all live inside one big block of memory,
114 and some share the contents of another symbol table and so you should
115 not free the contents on their behalf (except sometimes the linetable,
116 which maybe per symtab even when the rest is not).
117 It is s->free_code that says which alternative to use. */
120 free_symtab (struct symtab
*s
)
123 struct blockvector
*bv
;
125 switch (s
->free_code
)
128 /* All the contents are part of a big block of memory (an obstack),
129 and some other symtab is in charge of freeing that block.
130 Therefore, do nothing. */
134 /* Here all the contents were malloc'ed structure by structure
135 and must be freed that way. */
136 /* First free the blocks (and their symbols. */
137 bv
= BLOCKVECTOR (s
);
138 n
= BLOCKVECTOR_NBLOCKS (bv
);
139 for (i
= 0; i
< n
; i
++)
140 free_symtab_block (s
->objfile
, BLOCKVECTOR_BLOCK (bv
, i
));
141 /* Free the blockvector itself. */
143 /* Also free the linetable. */
146 /* Everything will be freed either by our `free_func'
147 or by some other symtab, except for our linetable.
150 xfree (LINETABLE (s
));
154 /* If there is a single block of memory to free, free it. */
155 if (s
->free_func
!= NULL
)
158 /* Free source-related stuff */
159 if (s
->line_charpos
!= NULL
)
160 xfree (s
->line_charpos
);
161 if (s
->fullname
!= NULL
)
163 if (s
->debugformat
!= NULL
)
164 xfree (s
->debugformat
);
169 print_symbol_bcache_statistics (void)
171 struct objfile
*objfile
;
174 ALL_OBJFILES (objfile
)
176 printf_filtered ("Byte cache statistics for '%s':\n", objfile
->name
);
177 print_bcache_statistics (objfile
->psymbol_cache
, "partial symbol cache");
183 print_objfile_statistics (void)
185 struct objfile
*objfile
;
187 struct partial_symtab
*ps
;
188 int i
, linetables
, blockvectors
;
191 ALL_OBJFILES (objfile
)
193 printf_filtered ("Statistics for '%s':\n", objfile
->name
);
194 if (OBJSTAT (objfile
, n_stabs
) > 0)
195 printf_filtered (" Number of \"stab\" symbols read: %d\n",
196 OBJSTAT (objfile
, n_stabs
));
197 if (OBJSTAT (objfile
, n_minsyms
) > 0)
198 printf_filtered (" Number of \"minimal\" symbols read: %d\n",
199 OBJSTAT (objfile
, n_minsyms
));
200 if (OBJSTAT (objfile
, n_psyms
) > 0)
201 printf_filtered (" Number of \"partial\" symbols read: %d\n",
202 OBJSTAT (objfile
, n_psyms
));
203 if (OBJSTAT (objfile
, n_syms
) > 0)
204 printf_filtered (" Number of \"full\" symbols read: %d\n",
205 OBJSTAT (objfile
, n_syms
));
206 if (OBJSTAT (objfile
, n_types
) > 0)
207 printf_filtered (" Number of \"types\" defined: %d\n",
208 OBJSTAT (objfile
, n_types
));
210 ALL_OBJFILE_PSYMTABS (objfile
, ps
)
215 printf_filtered (" Number of psym tables (not yet expanded): %d\n", i
);
216 i
= linetables
= blockvectors
= 0;
217 ALL_OBJFILE_SYMTABS (objfile
, s
)
220 if (s
->linetable
!= NULL
)
225 printf_filtered (" Number of symbol tables: %d\n", i
);
226 printf_filtered (" Number of symbol tables with line tables: %d\n",
228 printf_filtered (" Number of symbol tables with blockvectors: %d\n",
231 if (OBJSTAT (objfile
, sz_strtab
) > 0)
232 printf_filtered (" Space used by a.out string tables: %d\n",
233 OBJSTAT (objfile
, sz_strtab
));
234 printf_filtered (" Total memory used for objfile obstack: %d\n",
235 obstack_memory_used (&objfile
->objfile_obstack
));
236 printf_filtered (" Total memory used for psymbol cache: %d\n",
237 bcache_memory_used (objfile
->psymbol_cache
));
238 printf_filtered (" Total memory used for macro cache: %d\n",
239 bcache_memory_used (objfile
->macro_cache
));
245 dump_objfile (struct objfile
*objfile
)
247 struct symtab
*symtab
;
248 struct partial_symtab
*psymtab
;
250 printf_filtered ("\nObject file %s: ", objfile
->name
);
251 printf_filtered ("Objfile at ");
252 gdb_print_host_address (objfile
, gdb_stdout
);
253 printf_filtered (", bfd at ");
254 gdb_print_host_address (objfile
->obfd
, gdb_stdout
);
255 printf_filtered (", %d minsyms\n\n",
256 objfile
->minimal_symbol_count
);
258 if (objfile
->psymtabs
)
260 printf_filtered ("Psymtabs:\n");
261 for (psymtab
= objfile
->psymtabs
;
263 psymtab
= psymtab
->next
)
265 printf_filtered ("%s at ",
267 gdb_print_host_address (psymtab
, gdb_stdout
);
268 printf_filtered (", ");
269 if (psymtab
->objfile
!= objfile
)
271 printf_filtered ("NOT ON CHAIN! ");
275 printf_filtered ("\n\n");
278 if (objfile
->symtabs
)
280 printf_filtered ("Symtabs:\n");
281 for (symtab
= objfile
->symtabs
;
283 symtab
= symtab
->next
)
285 printf_filtered ("%s at ", symtab
->filename
);
286 gdb_print_host_address (symtab
, gdb_stdout
);
287 printf_filtered (", ");
288 if (symtab
->objfile
!= objfile
)
290 printf_filtered ("NOT ON CHAIN! ");
294 printf_filtered ("\n\n");
298 /* Print minimal symbols from this objfile. */
301 dump_msymbols (struct objfile
*objfile
, struct ui_file
*outfile
)
303 struct minimal_symbol
*msymbol
;
307 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile
->name
);
308 if (objfile
->minimal_symbol_count
== 0)
310 fprintf_filtered (outfile
, "No minimal symbols found.\n");
313 for (index
= 0, msymbol
= objfile
->msymbols
;
314 DEPRECATED_SYMBOL_NAME (msymbol
) != NULL
; msymbol
++, index
++)
316 switch (msymbol
->type
)
324 case mst_solib_trampoline
:
349 fprintf_filtered (outfile
, "[%2d] %c ", index
, ms_type
);
350 print_address_numeric (SYMBOL_VALUE_ADDRESS (msymbol
), 1, outfile
);
351 fprintf_filtered (outfile
, " %s", DEPRECATED_SYMBOL_NAME (msymbol
));
352 if (SYMBOL_BFD_SECTION (msymbol
))
353 fprintf_filtered (outfile
, " section %s",
354 bfd_section_name (objfile
->obfd
,
355 SYMBOL_BFD_SECTION (msymbol
)));
356 if (SYMBOL_DEMANGLED_NAME (msymbol
) != NULL
)
358 fprintf_filtered (outfile
, " %s", SYMBOL_DEMANGLED_NAME (msymbol
));
360 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
361 if (msymbol
->filename
)
362 fprintf_filtered (outfile
, " %s", msymbol
->filename
);
364 fputs_filtered ("\n", outfile
);
366 if (objfile
->minimal_symbol_count
!= index
)
368 warning ("internal error: minimal symbol count %d != %d",
369 objfile
->minimal_symbol_count
, index
);
371 fprintf_filtered (outfile
, "\n");
375 dump_psymtab (struct objfile
*objfile
, struct partial_symtab
*psymtab
,
376 struct ui_file
*outfile
)
380 fprintf_filtered (outfile
, "\nPartial symtab for source file %s ",
382 fprintf_filtered (outfile
, "(object ");
383 gdb_print_host_address (psymtab
, outfile
);
384 fprintf_filtered (outfile
, ")\n\n");
385 fprintf_unfiltered (outfile
, " Read from object file %s (",
387 gdb_print_host_address (objfile
, outfile
);
388 fprintf_unfiltered (outfile
, ")\n");
392 fprintf_filtered (outfile
,
393 " Full symtab was read (at ");
394 gdb_print_host_address (psymtab
->symtab
, outfile
);
395 fprintf_filtered (outfile
, " by function at ");
396 gdb_print_host_address (psymtab
->read_symtab
, outfile
);
397 fprintf_filtered (outfile
, ")\n");
400 fprintf_filtered (outfile
, " Relocate symbols by ");
401 for (i
= 0; i
< psymtab
->objfile
->num_sections
; ++i
)
404 fprintf_filtered (outfile
, ", ");
406 print_address_numeric (ANOFFSET (psymtab
->section_offsets
, i
),
410 fprintf_filtered (outfile
, "\n");
412 fprintf_filtered (outfile
, " Symbols cover text addresses ");
413 print_address_numeric (psymtab
->textlow
, 1, outfile
);
414 fprintf_filtered (outfile
, "-");
415 print_address_numeric (psymtab
->texthigh
, 1, outfile
);
416 fprintf_filtered (outfile
, "\n");
417 fprintf_filtered (outfile
, " Depends on %d other partial symtabs.\n",
418 psymtab
->number_of_dependencies
);
419 for (i
= 0; i
< psymtab
->number_of_dependencies
; i
++)
421 fprintf_filtered (outfile
, " %d ", i
);
422 gdb_print_host_address (psymtab
->dependencies
[i
], outfile
);
423 fprintf_filtered (outfile
, " %s\n",
424 psymtab
->dependencies
[i
]->filename
);
426 if (psymtab
->n_global_syms
> 0)
428 print_partial_symbols (objfile
->global_psymbols
.list
429 + psymtab
->globals_offset
,
430 psymtab
->n_global_syms
, "Global", outfile
);
432 if (psymtab
->n_static_syms
> 0)
434 print_partial_symbols (objfile
->static_psymbols
.list
435 + psymtab
->statics_offset
,
436 psymtab
->n_static_syms
, "Static", outfile
);
438 fprintf_filtered (outfile
, "\n");
442 dump_symtab (struct objfile
*objfile
, struct symtab
*symtab
,
443 struct ui_file
*outfile
)
446 struct dict_iterator iter
;
449 struct blockvector
*bv
;
454 fprintf_filtered (outfile
, "\nSymtab for file %s\n", symtab
->filename
);
456 fprintf_filtered (outfile
, "Compilation directory is %s\n",
458 fprintf_filtered (outfile
, "Read from object file %s (", objfile
->name
);
459 gdb_print_host_address (objfile
, outfile
);
460 fprintf_filtered (outfile
, ")\n");
461 fprintf_filtered (outfile
, "Language: %s\n", language_str (symtab
->language
));
463 /* First print the line table. */
464 l
= LINETABLE (symtab
);
467 fprintf_filtered (outfile
, "\nLine table:\n\n");
469 for (i
= 0; i
< len
; i
++)
471 fprintf_filtered (outfile
, " line %d at ", l
->item
[i
].line
);
472 print_address_numeric (l
->item
[i
].pc
, 1, outfile
);
473 fprintf_filtered (outfile
, "\n");
476 /* Now print the block info, but only for primary symtabs since we will
477 print lots of duplicate info otherwise. */
480 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
481 bv
= BLOCKVECTOR (symtab
);
482 len
= BLOCKVECTOR_NBLOCKS (bv
);
483 for (i
= 0; i
< len
; i
++)
485 b
= BLOCKVECTOR_BLOCK (bv
, i
);
486 depth
= block_depth (b
) * 2;
487 print_spaces (depth
, outfile
);
488 fprintf_filtered (outfile
, "block #%03d, object at ", i
);
489 gdb_print_host_address (b
, outfile
);
490 if (BLOCK_SUPERBLOCK (b
))
492 fprintf_filtered (outfile
, " under ");
493 gdb_print_host_address (BLOCK_SUPERBLOCK (b
), outfile
);
495 /* drow/2002-07-10: We could save the total symbols count
496 even if we're using a hashtable, but nothing else but this message
498 fprintf_filtered (outfile
, ", %d syms/buckets in ",
499 dict_size (BLOCK_DICT (b
)));
500 print_address_numeric (BLOCK_START (b
), 1, outfile
);
501 fprintf_filtered (outfile
, "..");
502 print_address_numeric (BLOCK_END (b
), 1, outfile
);
503 if (BLOCK_FUNCTION (b
))
505 fprintf_filtered (outfile
, ", function %s", DEPRECATED_SYMBOL_NAME (BLOCK_FUNCTION (b
)));
506 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)) != NULL
)
508 fprintf_filtered (outfile
, ", %s",
509 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)));
512 if (BLOCK_GCC_COMPILED (b
))
513 fprintf_filtered (outfile
, ", compiled with gcc%d", BLOCK_GCC_COMPILED (b
));
514 fprintf_filtered (outfile
, "\n");
515 /* Now print each symbol in this block (in no particular order, if
516 we're using a hashtable). */
517 ALL_BLOCK_SYMBOLS (b
, iter
, sym
)
519 struct print_symbol_args s
;
523 catch_errors (print_symbol
, &s
, "Error printing symbol:\n",
527 fprintf_filtered (outfile
, "\n");
531 fprintf_filtered (outfile
, "\nBlockvector same as previous symtab\n\n");
536 maintenance_print_symbols (char *args
, int from_tty
)
539 struct ui_file
*outfile
;
540 struct cleanup
*cleanups
;
541 char *symname
= NULL
;
542 char *filename
= DEV_TTY
;
543 struct objfile
*objfile
;
551 Arguments missing: an output file name and an optional symbol file name");
553 else if ((argv
= buildargv (args
)) == NULL
)
557 cleanups
= make_cleanup_freeargv (argv
);
562 /* If a second arg is supplied, it is a source file name to match on */
569 filename
= tilde_expand (filename
);
570 make_cleanup (xfree
, filename
);
572 outfile
= gdb_fopen (filename
, FOPEN_WT
);
574 perror_with_name (filename
);
575 make_cleanup_ui_file_delete (outfile
);
578 ALL_SYMTABS (objfile
, s
)
579 if (symname
== NULL
|| strcmp (symname
, s
->filename
) == 0)
580 dump_symtab (objfile
, s
, outfile
);
582 do_cleanups (cleanups
);
585 /* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
586 far to indent. ARGS is really a struct print_symbol_args *, but is
587 declared as char * to get it past catch_errors. Returns 0 for error,
591 print_symbol (void *args
)
593 struct symbol
*symbol
= ((struct print_symbol_args
*) args
)->symbol
;
594 int depth
= ((struct print_symbol_args
*) args
)->depth
;
595 struct ui_file
*outfile
= ((struct print_symbol_args
*) args
)->outfile
;
597 print_spaces (depth
, outfile
);
598 if (SYMBOL_DOMAIN (symbol
) == LABEL_DOMAIN
)
600 fprintf_filtered (outfile
, "label %s at ", SYMBOL_PRINT_NAME (symbol
));
601 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
602 if (SYMBOL_BFD_SECTION (symbol
))
603 fprintf_filtered (outfile
, " section %s\n",
604 bfd_section_name (SYMBOL_BFD_SECTION (symbol
)->owner
,
605 SYMBOL_BFD_SECTION (symbol
)));
607 fprintf_filtered (outfile
, "\n");
610 if (SYMBOL_DOMAIN (symbol
) == STRUCT_DOMAIN
)
612 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol
)))
614 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
618 fprintf_filtered (outfile
, "%s %s = ",
619 (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_ENUM
621 : (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_STRUCT
622 ? "struct" : "union")),
623 DEPRECATED_SYMBOL_NAME (symbol
));
624 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
626 fprintf_filtered (outfile
, ";\n");
630 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
631 fprintf_filtered (outfile
, "typedef ");
632 if (SYMBOL_TYPE (symbol
))
634 /* Print details of types, except for enums where it's clutter. */
635 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), SYMBOL_PRINT_NAME (symbol
),
637 TYPE_CODE (SYMBOL_TYPE (symbol
)) != TYPE_CODE_ENUM
,
639 fprintf_filtered (outfile
, "; ");
642 fprintf_filtered (outfile
, "%s ", SYMBOL_PRINT_NAME (symbol
));
644 switch (SYMBOL_CLASS (symbol
))
647 fprintf_filtered (outfile
, "const %ld (0x%lx)",
648 SYMBOL_VALUE (symbol
),
649 SYMBOL_VALUE (symbol
));
652 case LOC_CONST_BYTES
:
655 struct type
*type
= check_typedef (SYMBOL_TYPE (symbol
));
656 fprintf_filtered (outfile
, "const %u hex bytes:",
658 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
659 fprintf_filtered (outfile
, " %02x",
660 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
665 fprintf_filtered (outfile
, "static at ");
666 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
667 if (SYMBOL_BFD_SECTION (symbol
))
668 fprintf_filtered (outfile
, " section %s",
670 (SYMBOL_BFD_SECTION (symbol
)->owner
,
671 SYMBOL_BFD_SECTION (symbol
)));
675 fprintf_filtered (outfile
, "extern global at *(");
676 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
677 fprintf_filtered (outfile
, "),");
681 fprintf_filtered (outfile
, "register %ld", SYMBOL_VALUE (symbol
));
685 fprintf_filtered (outfile
, "arg at offset 0x%lx",
686 SYMBOL_VALUE (symbol
));
690 fprintf_filtered (outfile
, "arg at offset 0x%lx from fp",
691 SYMBOL_VALUE (symbol
));
695 fprintf_filtered (outfile
, "reference arg at 0x%lx", SYMBOL_VALUE (symbol
));
699 fprintf_filtered (outfile
, "parameter register %ld", SYMBOL_VALUE (symbol
));
702 case LOC_REGPARM_ADDR
:
703 fprintf_filtered (outfile
, "address parameter register %ld", SYMBOL_VALUE (symbol
));
707 fprintf_filtered (outfile
, "local at offset 0x%lx",
708 SYMBOL_VALUE (symbol
));
712 fprintf_filtered (outfile
, "local at 0x%lx from register %d",
713 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
716 case LOC_BASEREG_ARG
:
717 fprintf_filtered (outfile
, "arg at 0x%lx from register %d",
718 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
725 fprintf_filtered (outfile
, "label at ");
726 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
727 if (SYMBOL_BFD_SECTION (symbol
))
728 fprintf_filtered (outfile
, " section %s",
730 (SYMBOL_BFD_SECTION (symbol
)->owner
,
731 SYMBOL_BFD_SECTION (symbol
)));
735 fprintf_filtered (outfile
, "block object ");
736 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol
), outfile
);
737 fprintf_filtered (outfile
, ", ");
738 print_address_numeric (BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
)),
741 fprintf_filtered (outfile
, "..");
742 print_address_numeric (BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
)),
745 if (SYMBOL_BFD_SECTION (symbol
))
746 fprintf_filtered (outfile
, " section %s",
748 (SYMBOL_BFD_SECTION (symbol
)->owner
,
749 SYMBOL_BFD_SECTION (symbol
)));
753 case LOC_COMPUTED_ARG
:
754 fprintf_filtered (outfile
, "computed at runtime");
758 fprintf_filtered (outfile
, "unresolved");
761 case LOC_OPTIMIZED_OUT
:
762 fprintf_filtered (outfile
, "optimized out");
766 fprintf_filtered (outfile
, "botched symbol class %x",
767 SYMBOL_CLASS (symbol
));
771 fprintf_filtered (outfile
, "\n");
776 maintenance_print_psymbols (char *args
, int from_tty
)
779 struct ui_file
*outfile
;
780 struct cleanup
*cleanups
;
781 char *symname
= NULL
;
782 char *filename
= DEV_TTY
;
783 struct objfile
*objfile
;
784 struct partial_symtab
*ps
;
790 error ("print-psymbols takes an output file name and optional symbol file name");
792 else if ((argv
= buildargv (args
)) == NULL
)
796 cleanups
= make_cleanup_freeargv (argv
);
801 /* If a second arg is supplied, it is a source file name to match on */
808 filename
= tilde_expand (filename
);
809 make_cleanup (xfree
, filename
);
811 outfile
= gdb_fopen (filename
, FOPEN_WT
);
813 perror_with_name (filename
);
814 make_cleanup_ui_file_delete (outfile
);
817 ALL_PSYMTABS (objfile
, ps
)
818 if (symname
== NULL
|| strcmp (symname
, ps
->filename
) == 0)
819 dump_psymtab (objfile
, ps
, outfile
);
821 do_cleanups (cleanups
);
825 print_partial_symbols (struct partial_symbol
**p
, int count
, char *what
,
826 struct ui_file
*outfile
)
828 fprintf_filtered (outfile
, " %s partial symbols:\n", what
);
831 fprintf_filtered (outfile
, " `%s'", DEPRECATED_SYMBOL_NAME (*p
));
832 if (SYMBOL_DEMANGLED_NAME (*p
) != NULL
)
834 fprintf_filtered (outfile
, " `%s'", SYMBOL_DEMANGLED_NAME (*p
));
836 fputs_filtered (", ", outfile
);
837 switch (SYMBOL_DOMAIN (*p
))
840 fputs_filtered ("undefined domain, ", outfile
);
843 /* This is the usual thing -- don't print it */
846 fputs_filtered ("struct domain, ", outfile
);
849 fputs_filtered ("label domain, ", outfile
);
852 fputs_filtered ("<invalid domain>, ", outfile
);
855 switch (SYMBOL_CLASS (*p
))
858 fputs_filtered ("undefined", outfile
);
861 fputs_filtered ("constant int", outfile
);
864 fputs_filtered ("static", outfile
);
867 fputs_filtered ("extern global", outfile
);
870 fputs_filtered ("register", outfile
);
873 fputs_filtered ("pass by value", outfile
);
876 fputs_filtered ("pass by reference", outfile
);
879 fputs_filtered ("register parameter", outfile
);
881 case LOC_REGPARM_ADDR
:
882 fputs_filtered ("register address parameter", outfile
);
885 fputs_filtered ("stack parameter", outfile
);
888 fputs_filtered ("type", outfile
);
891 fputs_filtered ("label", outfile
);
894 fputs_filtered ("function", outfile
);
896 case LOC_CONST_BYTES
:
897 fputs_filtered ("constant bytes", outfile
);
900 fputs_filtered ("shuffled arg", outfile
);
903 fputs_filtered ("unresolved", outfile
);
905 case LOC_OPTIMIZED_OUT
:
906 fputs_filtered ("optimized out", outfile
);
909 case LOC_COMPUTED_ARG
:
910 fputs_filtered ("computed at runtime", outfile
);
913 fputs_filtered ("<invalid location>", outfile
);
916 fputs_filtered (", ", outfile
);
917 print_address_numeric (SYMBOL_VALUE_ADDRESS (*p
), 1, outfile
);
918 fprintf_filtered (outfile
, "\n");
924 maintenance_print_msymbols (char *args
, int from_tty
)
927 struct ui_file
*outfile
;
928 struct cleanup
*cleanups
;
929 char *filename
= DEV_TTY
;
930 char *symname
= NULL
;
931 struct objfile
*objfile
;
937 error ("print-msymbols takes an output file name and optional symbol file name");
939 else if ((argv
= buildargv (args
)) == NULL
)
943 cleanups
= make_cleanup_freeargv (argv
);
948 /* If a second arg is supplied, it is a source file name to match on */
955 filename
= tilde_expand (filename
);
956 make_cleanup (xfree
, filename
);
958 outfile
= gdb_fopen (filename
, FOPEN_WT
);
960 perror_with_name (filename
);
961 make_cleanup_ui_file_delete (outfile
);
964 ALL_OBJFILES (objfile
)
965 if (symname
== NULL
|| strcmp (symname
, objfile
->name
) == 0)
966 dump_msymbols (objfile
, outfile
);
968 fprintf_filtered (outfile
, "\n\n");
969 do_cleanups (cleanups
);
973 maintenance_print_objfiles (char *ignore
, int from_tty
)
975 struct objfile
*objfile
;
980 ALL_OBJFILES (objfile
)
981 dump_objfile (objfile
);
986 /* List all the symbol tables whose names match REGEXP (optional). */
988 maintenance_info_symtabs (char *regexp
, int from_tty
)
990 struct objfile
*objfile
;
995 ALL_OBJFILES (objfile
)
997 struct symtab
*symtab
;
999 /* We don't want to print anything for this objfile until we
1000 actually find a symtab whose name matches. */
1001 int printed_objfile_start
= 0;
1003 ALL_OBJFILE_SYMTABS (objfile
, symtab
)
1005 || re_exec (symtab
->filename
))
1007 if (! printed_objfile_start
)
1009 printf_filtered ("{ objfile %s ", objfile
->name
);
1011 printf_filtered ("((struct objfile *) %p)\n", objfile
);
1012 printed_objfile_start
= 1;
1015 printf_filtered (" { symtab %s ", symtab
->filename
);
1017 printf_filtered ("((struct symtab *) %p)\n", symtab
);
1018 printf_filtered (" dirname %s\n",
1019 symtab
->dirname
? symtab
->dirname
: "(null)");
1020 printf_filtered (" fullname %s\n",
1021 symtab
->fullname
? symtab
->fullname
: "(null)");
1022 printf_filtered (" blockvector ((struct blockvector *) %p)%s\n",
1023 symtab
->blockvector
,
1024 symtab
->primary
? " (primary)" : "");
1025 printf_filtered (" debugformat %s\n", symtab
->debugformat
);
1026 printf_filtered (" }\n");
1029 if (printed_objfile_start
)
1030 printf_filtered ("}\n");
1035 /* List all the partial symbol tables whose names match REGEXP (optional). */
1037 maintenance_info_psymtabs (char *regexp
, int from_tty
)
1039 struct objfile
*objfile
;
1044 ALL_OBJFILES (objfile
)
1046 struct partial_symtab
*psymtab
;
1048 /* We don't want to print anything for this objfile until we
1049 actually find a symtab whose name matches. */
1050 int printed_objfile_start
= 0;
1052 ALL_OBJFILE_PSYMTABS (objfile
, psymtab
)
1054 || re_exec (psymtab
->filename
))
1056 if (! printed_objfile_start
)
1058 printf_filtered ("{ objfile %s ", objfile
->name
);
1060 printf_filtered ("((struct objfile *) %p)\n", objfile
);
1061 printed_objfile_start
= 1;
1064 printf_filtered (" { psymtab %s ", psymtab
->filename
);
1066 printf_filtered ("((struct partial_symtab *) %p)\n", psymtab
);
1067 printf_filtered (" readin %s\n",
1068 psymtab
->readin
? "yes" : "no");
1069 printf_filtered (" fullname %s\n",
1070 psymtab
->fullname
? psymtab
->fullname
: "(null)");
1071 printf_filtered (" text addresses ");
1072 print_address_numeric (psymtab
->textlow
, 1, gdb_stdout
);
1073 printf_filtered (" -- ");
1074 print_address_numeric (psymtab
->texthigh
, 1, gdb_stdout
);
1075 printf_filtered ("\n");
1076 printf_filtered (" globals ");
1077 if (psymtab
->n_global_syms
)
1079 printf_filtered ("(* (struct partial_symbol **) %p @ %d)\n",
1080 (psymtab
->objfile
->global_psymbols
.list
1081 + psymtab
->globals_offset
),
1082 psymtab
->n_global_syms
);
1085 printf_filtered ("(none)\n");
1086 printf_filtered (" statics ");
1087 if (psymtab
->n_static_syms
)
1089 printf_filtered ("(* (struct partial_symbol **) %p @ %d)\n",
1090 (psymtab
->objfile
->static_psymbols
.list
1091 + psymtab
->statics_offset
),
1092 psymtab
->n_static_syms
);
1095 printf_filtered ("(none)\n");
1096 printf_filtered (" dependencies ");
1097 if (psymtab
->number_of_dependencies
)
1101 printf_filtered ("{\n");
1102 for (i
= 0; i
< psymtab
->number_of_dependencies
; i
++)
1104 struct partial_symtab
*dep
= psymtab
->dependencies
[i
];
1106 /* Note the string concatenation there --- no comma. */
1107 printf_filtered (" psymtab %s "
1108 "((struct partial_symtab *) %p)\n",
1109 dep
->filename
, dep
);
1111 printf_filtered (" }\n");
1114 printf_filtered ("(none)\n");
1115 printf_filtered (" }\n");
1118 if (printed_objfile_start
)
1119 printf_filtered ("}\n");
1124 /* Check consistency of psymtabs and symtabs. */
1127 maintenance_check_symtabs (char *ignore
, int from_tty
)
1130 struct partial_symbol
**psym
;
1131 struct symtab
*s
= NULL
;
1132 struct partial_symtab
*ps
;
1133 struct blockvector
*bv
;
1134 struct objfile
*objfile
;
1138 ALL_PSYMTABS (objfile
, ps
)
1140 s
= PSYMTAB_TO_SYMTAB (ps
);
1143 bv
= BLOCKVECTOR (s
);
1144 b
= BLOCKVECTOR_BLOCK (bv
, STATIC_BLOCK
);
1145 psym
= ps
->objfile
->static_psymbols
.list
+ ps
->statics_offset
;
1146 length
= ps
->n_static_syms
;
1149 sym
= lookup_block_symbol (b
, DEPRECATED_SYMBOL_NAME (*psym
),
1150 NULL
, SYMBOL_DOMAIN (*psym
));
1153 printf_filtered ("Static symbol `");
1154 puts_filtered (DEPRECATED_SYMBOL_NAME (*psym
));
1155 printf_filtered ("' only found in ");
1156 puts_filtered (ps
->filename
);
1157 printf_filtered (" psymtab\n");
1161 b
= BLOCKVECTOR_BLOCK (bv
, GLOBAL_BLOCK
);
1162 psym
= ps
->objfile
->global_psymbols
.list
+ ps
->globals_offset
;
1163 length
= ps
->n_global_syms
;
1166 sym
= lookup_block_symbol (b
, DEPRECATED_SYMBOL_NAME (*psym
),
1167 NULL
, SYMBOL_DOMAIN (*psym
));
1170 printf_filtered ("Global symbol `");
1171 puts_filtered (DEPRECATED_SYMBOL_NAME (*psym
));
1172 printf_filtered ("' only found in ");
1173 puts_filtered (ps
->filename
);
1174 printf_filtered (" psymtab\n");
1178 if (ps
->texthigh
< ps
->textlow
)
1180 printf_filtered ("Psymtab ");
1181 puts_filtered (ps
->filename
);
1182 printf_filtered (" covers bad range ");
1183 print_address_numeric (ps
->textlow
, 1, gdb_stdout
);
1184 printf_filtered (" - ");
1185 print_address_numeric (ps
->texthigh
, 1, gdb_stdout
);
1186 printf_filtered ("\n");
1189 if (ps
->texthigh
== 0)
1191 if (ps
->textlow
< BLOCK_START (b
) || ps
->texthigh
> BLOCK_END (b
))
1193 printf_filtered ("Psymtab ");
1194 puts_filtered (ps
->filename
);
1195 printf_filtered (" covers ");
1196 print_address_numeric (ps
->textlow
, 1, gdb_stdout
);
1197 printf_filtered (" - ");
1198 print_address_numeric (ps
->texthigh
, 1, gdb_stdout
);
1199 printf_filtered (" but symtab covers only ");
1200 print_address_numeric (BLOCK_START (b
), 1, gdb_stdout
);
1201 printf_filtered (" - ");
1202 print_address_numeric (BLOCK_END (b
), 1, gdb_stdout
);
1203 printf_filtered ("\n");
1209 /* Return the nexting depth of a block within other blocks in its symtab. */
1212 block_depth (struct block
*block
)
1215 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
1223 /* Increase the space allocated for LISTP, which is probably
1224 global_psymbols or static_psymbols. This space will eventually
1225 be freed in free_objfile(). */
1228 extend_psymbol_list (struct psymbol_allocation_list
*listp
,
1229 struct objfile
*objfile
)
1232 if (listp
->size
== 0)
1235 listp
->list
= (struct partial_symbol
**)
1236 xmalloc (new_size
* sizeof (struct partial_symbol
*));
1240 new_size
= listp
->size
* 2;
1241 listp
->list
= (struct partial_symbol
**)
1242 xrealloc ((char *) listp
->list
,
1243 new_size
* sizeof (struct partial_symbol
*));
1245 /* Next assumes we only went one over. Should be good if
1246 program works correctly */
1247 listp
->next
= listp
->list
+ listp
->size
;
1248 listp
->size
= new_size
;
1252 /* Do early runtime initializations. */
1254 _initialize_symmisc (void)
This page took 0.055778 seconds and 4 git commands to generate.