1 /* Do various things to symbol tables (other than lookup), for GDB.
2 Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
3 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
28 #include "breakpoint.h"
34 #include "gdb_string.h"
37 #define DEV_TTY "/dev/tty"
40 /* Unfortunately for debugging, stderr is usually a macro. This is painful
41 when calling functions that take FILE *'s from the debugger.
42 So we make a variable which has the same value and which is accessible when
43 debugging GDB with itself. Because stdin et al need not be constants,
44 we initialize them in the _initialize_symmisc function at the bottom
50 /* Prototypes for local functions */
52 static void dump_symtab (struct objfile
*, struct symtab
*,
55 static void dump_psymtab (struct objfile
*, struct partial_symtab
*,
58 static void dump_msymbols (struct objfile
*, struct ui_file
*);
60 static void dump_objfile (struct objfile
*);
62 static int block_depth (struct block
*);
64 static void print_partial_symbols (struct partial_symbol
**, int,
65 char *, struct ui_file
*);
67 static void free_symtab_block (struct objfile
*, struct block
*);
69 void _initialize_symmisc (void);
71 struct print_symbol_args
73 struct symbol
*symbol
;
75 struct ui_file
*outfile
;
78 static int print_symbol (PTR
);
80 static void free_symtab_block (struct objfile
*, struct block
*);
83 /* Free a struct block <- B and all the symbols defined in that block. */
86 free_symtab_block (struct objfile
*objfile
, struct block
*b
)
89 struct symbol
*sym
, *next_sym
;
91 n
= BLOCK_BUCKETS (b
);
92 for (i
= 0; i
< n
; i
++)
94 for (sym
= BLOCK_BUCKET (b
, i
); sym
; sym
= next_sym
)
96 next_sym
= sym
->hash_next
;
97 xmfree (objfile
->md
, SYMBOL_NAME (sym
));
98 xmfree (objfile
->md
, (PTR
) sym
);
101 xmfree (objfile
->md
, (PTR
) b
);
104 /* Free all the storage associated with the struct symtab <- S.
105 Note that some symtabs have contents malloc'ed structure by structure,
106 while some have contents that all live inside one big block of memory,
107 and some share the contents of another symbol table and so you should
108 not free the contents on their behalf (except sometimes the linetable,
109 which maybe per symtab even when the rest is not).
110 It is s->free_code that says which alternative to use. */
113 free_symtab (register struct symtab
*s
)
116 register struct blockvector
*bv
;
118 switch (s
->free_code
)
121 /* All the contents are part of a big block of memory (an obstack),
122 and some other symtab is in charge of freeing that block.
123 Therefore, do nothing. */
127 /* Here all the contents were malloc'ed structure by structure
128 and must be freed that way. */
129 /* First free the blocks (and their symbols. */
130 bv
= BLOCKVECTOR (s
);
131 n
= BLOCKVECTOR_NBLOCKS (bv
);
132 for (i
= 0; i
< n
; i
++)
133 free_symtab_block (s
->objfile
, BLOCKVECTOR_BLOCK (bv
, i
));
134 /* Free the blockvector itself. */
135 xmfree (s
->objfile
->md
, (PTR
) bv
);
136 /* Also free the linetable. */
139 /* Everything will be freed either by our `free_ptr'
140 or by some other symtab, except for our linetable.
143 xmfree (s
->objfile
->md
, (PTR
) LINETABLE (s
));
147 /* If there is a single block of memory to free, free it. */
148 if (s
->free_ptr
!= NULL
)
149 xmfree (s
->objfile
->md
, s
->free_ptr
);
151 /* Free source-related stuff */
152 if (s
->line_charpos
!= NULL
)
153 xmfree (s
->objfile
->md
, (PTR
) s
->line_charpos
);
154 if (s
->fullname
!= NULL
)
155 xmfree (s
->objfile
->md
, s
->fullname
);
156 if (s
->debugformat
!= NULL
)
157 xmfree (s
->objfile
->md
, s
->debugformat
);
158 xmfree (s
->objfile
->md
, (PTR
) s
);
162 print_symbol_bcache_statistics (void)
164 struct objfile
*objfile
;
167 ALL_OBJFILES (objfile
)
169 printf_filtered ("Byte cache statistics for '%s':\n", objfile
->name
);
170 print_bcache_statistics (&objfile
->psymbol_cache
, "partial symbol cache");
176 print_objfile_statistics (void)
178 struct objfile
*objfile
;
181 ALL_OBJFILES (objfile
)
183 printf_filtered ("Statistics for '%s':\n", objfile
->name
);
184 if (OBJSTAT (objfile
, n_stabs
) > 0)
185 printf_filtered (" Number of \"stab\" symbols read: %d\n",
186 OBJSTAT (objfile
, n_stabs
));
187 if (OBJSTAT (objfile
, n_minsyms
) > 0)
188 printf_filtered (" Number of \"minimal\" symbols read: %d\n",
189 OBJSTAT (objfile
, n_minsyms
));
190 if (OBJSTAT (objfile
, n_psyms
) > 0)
191 printf_filtered (" Number of \"partial\" symbols read: %d\n",
192 OBJSTAT (objfile
, n_psyms
));
193 if (OBJSTAT (objfile
, n_syms
) > 0)
194 printf_filtered (" Number of \"full\" symbols read: %d\n",
195 OBJSTAT (objfile
, n_syms
));
196 if (OBJSTAT (objfile
, n_types
) > 0)
197 printf_filtered (" Number of \"types\" defined: %d\n",
198 OBJSTAT (objfile
, n_types
));
199 if (OBJSTAT (objfile
, sz_strtab
) > 0)
200 printf_filtered (" Space used by a.out string tables: %d\n",
201 OBJSTAT (objfile
, sz_strtab
));
202 printf_filtered (" Total memory used for psymbol obstack: %d\n",
203 obstack_memory_used (&objfile
->psymbol_obstack
));
204 printf_filtered (" Total memory used for psymbol cache: %d\n",
205 obstack_memory_used (&objfile
->psymbol_cache
.cache
));
206 printf_filtered (" Total memory used for macro cache: %d\n",
207 obstack_memory_used (&objfile
->macro_cache
.cache
));
208 printf_filtered (" Total memory used for symbol obstack: %d\n",
209 obstack_memory_used (&objfile
->symbol_obstack
));
210 printf_filtered (" Total memory used for type obstack: %d\n",
211 obstack_memory_used (&objfile
->type_obstack
));
217 dump_objfile (struct objfile
*objfile
)
219 struct symtab
*symtab
;
220 struct partial_symtab
*psymtab
;
222 printf_filtered ("\nObject file %s: ", objfile
->name
);
223 printf_filtered ("Objfile at ");
224 gdb_print_host_address (objfile
, gdb_stdout
);
225 printf_filtered (", bfd at ");
226 gdb_print_host_address (objfile
->obfd
, gdb_stdout
);
227 printf_filtered (", %d minsyms\n\n",
228 objfile
->minimal_symbol_count
);
230 if (objfile
->psymtabs
)
232 printf_filtered ("Psymtabs:\n");
233 for (psymtab
= objfile
->psymtabs
;
235 psymtab
= psymtab
->next
)
237 printf_filtered ("%s at ",
239 gdb_print_host_address (psymtab
, gdb_stdout
);
240 printf_filtered (", ");
241 if (psymtab
->objfile
!= objfile
)
243 printf_filtered ("NOT ON CHAIN! ");
247 printf_filtered ("\n\n");
250 if (objfile
->symtabs
)
252 printf_filtered ("Symtabs:\n");
253 for (symtab
= objfile
->symtabs
;
255 symtab
= symtab
->next
)
257 printf_filtered ("%s at ", symtab
->filename
);
258 gdb_print_host_address (symtab
, gdb_stdout
);
259 printf_filtered (", ");
260 if (symtab
->objfile
!= objfile
)
262 printf_filtered ("NOT ON CHAIN! ");
266 printf_filtered ("\n\n");
270 /* Print minimal symbols from this objfile. */
273 dump_msymbols (struct objfile
*objfile
, struct ui_file
*outfile
)
275 struct minimal_symbol
*msymbol
;
279 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile
->name
);
280 if (objfile
->minimal_symbol_count
== 0)
282 fprintf_filtered (outfile
, "No minimal symbols found.\n");
285 for (index
= 0, msymbol
= objfile
->msymbols
;
286 SYMBOL_NAME (msymbol
) != NULL
; msymbol
++, index
++)
288 switch (msymbol
->type
)
296 case mst_solib_trampoline
:
321 fprintf_filtered (outfile
, "[%2d] %c ", index
, ms_type
);
322 print_address_numeric (SYMBOL_VALUE_ADDRESS (msymbol
), 1, outfile
);
323 fprintf_filtered (outfile
, " %s", SYMBOL_NAME (msymbol
));
324 if (SYMBOL_BFD_SECTION (msymbol
))
325 fprintf_filtered (outfile
, " section %s",
326 bfd_section_name (objfile
->obfd
,
327 SYMBOL_BFD_SECTION (msymbol
)));
328 if (SYMBOL_DEMANGLED_NAME (msymbol
) != NULL
)
330 fprintf_filtered (outfile
, " %s", SYMBOL_DEMANGLED_NAME (msymbol
));
332 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
333 if (msymbol
->filename
)
334 fprintf_filtered (outfile
, " %s", msymbol
->filename
);
336 fputs_filtered ("\n", outfile
);
338 if (objfile
->minimal_symbol_count
!= index
)
340 warning ("internal error: minimal symbol count %d != %d",
341 objfile
->minimal_symbol_count
, index
);
343 fprintf_filtered (outfile
, "\n");
347 dump_psymtab (struct objfile
*objfile
, struct partial_symtab
*psymtab
,
348 struct ui_file
*outfile
)
352 fprintf_filtered (outfile
, "\nPartial symtab for source file %s ",
354 fprintf_filtered (outfile
, "(object ");
355 gdb_print_host_address (psymtab
, outfile
);
356 fprintf_filtered (outfile
, ")\n\n");
357 fprintf_unfiltered (outfile
, " Read from object file %s (",
359 gdb_print_host_address (objfile
, outfile
);
360 fprintf_unfiltered (outfile
, ")\n");
364 fprintf_filtered (outfile
,
365 " Full symtab was read (at ");
366 gdb_print_host_address (psymtab
->symtab
, outfile
);
367 fprintf_filtered (outfile
, " by function at ");
368 gdb_print_host_address ((PTR
) psymtab
->read_symtab
, outfile
);
369 fprintf_filtered (outfile
, ")\n");
372 fprintf_filtered (outfile
, " Relocate symbols by ");
373 for (i
= 0; i
< psymtab
->objfile
->num_sections
; ++i
)
376 fprintf_filtered (outfile
, ", ");
378 print_address_numeric (ANOFFSET (psymtab
->section_offsets
, i
),
382 fprintf_filtered (outfile
, "\n");
384 fprintf_filtered (outfile
, " Symbols cover text addresses ");
385 print_address_numeric (psymtab
->textlow
, 1, outfile
);
386 fprintf_filtered (outfile
, "-");
387 print_address_numeric (psymtab
->texthigh
, 1, outfile
);
388 fprintf_filtered (outfile
, "\n");
389 fprintf_filtered (outfile
, " Depends on %d other partial symtabs.\n",
390 psymtab
->number_of_dependencies
);
391 for (i
= 0; i
< psymtab
->number_of_dependencies
; i
++)
393 fprintf_filtered (outfile
, " %d ", i
);
394 gdb_print_host_address (psymtab
->dependencies
[i
], outfile
);
395 fprintf_filtered (outfile
, " %s\n",
396 psymtab
->dependencies
[i
]->filename
);
398 if (psymtab
->n_global_syms
> 0)
400 print_partial_symbols (objfile
->global_psymbols
.list
401 + psymtab
->globals_offset
,
402 psymtab
->n_global_syms
, "Global", outfile
);
404 if (psymtab
->n_static_syms
> 0)
406 print_partial_symbols (objfile
->static_psymbols
.list
407 + psymtab
->statics_offset
,
408 psymtab
->n_static_syms
, "Static", outfile
);
410 fprintf_filtered (outfile
, "\n");
414 dump_symtab (struct objfile
*objfile
, struct symtab
*symtab
,
415 struct ui_file
*outfile
)
419 register struct linetable
*l
;
420 struct blockvector
*bv
;
422 register struct block
*b
;
425 fprintf_filtered (outfile
, "\nSymtab for file %s\n", symtab
->filename
);
427 fprintf_filtered (outfile
, "Compilation directory is %s\n",
429 fprintf_filtered (outfile
, "Read from object file %s (", objfile
->name
);
430 gdb_print_host_address (objfile
, outfile
);
431 fprintf_filtered (outfile
, ")\n");
432 fprintf_filtered (outfile
, "Language: %s\n", language_str (symtab
->language
));
434 /* First print the line table. */
435 l
= LINETABLE (symtab
);
438 fprintf_filtered (outfile
, "\nLine table:\n\n");
440 for (i
= 0; i
< len
; i
++)
442 fprintf_filtered (outfile
, " line %d at ", l
->item
[i
].line
);
443 print_address_numeric (l
->item
[i
].pc
, 1, outfile
);
444 fprintf_filtered (outfile
, "\n");
447 /* Now print the block info, but only for primary symtabs since we will
448 print lots of duplicate info otherwise. */
451 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
452 bv
= BLOCKVECTOR (symtab
);
453 len
= BLOCKVECTOR_NBLOCKS (bv
);
454 for (i
= 0; i
< len
; i
++)
456 b
= BLOCKVECTOR_BLOCK (bv
, i
);
457 depth
= block_depth (b
) * 2;
458 print_spaces (depth
, outfile
);
459 fprintf_filtered (outfile
, "block #%03d, object at ", i
);
460 gdb_print_host_address (b
, outfile
);
461 if (BLOCK_SUPERBLOCK (b
))
463 fprintf_filtered (outfile
, " under ");
464 gdb_print_host_address (BLOCK_SUPERBLOCK (b
), outfile
);
466 /* drow/2002-07-10: We could save the total symbols count
467 even if we're using a hashtable, but nothing else but this message
469 blen
= BLOCK_BUCKETS (b
);
470 if (BLOCK_HASHTABLE (b
))
471 fprintf_filtered (outfile
, ", %d buckets in ", blen
);
473 fprintf_filtered (outfile
, ", %d syms in ", blen
);
474 print_address_numeric (BLOCK_START (b
), 1, outfile
);
475 fprintf_filtered (outfile
, "..");
476 print_address_numeric (BLOCK_END (b
), 1, outfile
);
477 if (BLOCK_FUNCTION (b
))
479 fprintf_filtered (outfile
, ", function %s", SYMBOL_NAME (BLOCK_FUNCTION (b
)));
480 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)) != NULL
)
482 fprintf_filtered (outfile
, ", %s",
483 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)));
486 if (BLOCK_GCC_COMPILED (b
))
487 fprintf_filtered (outfile
, ", compiled with gcc%d", BLOCK_GCC_COMPILED (b
));
488 fprintf_filtered (outfile
, "\n");
489 /* Now print each symbol in this block (in no particular order, if
490 we're using a hashtable). */
491 ALL_BLOCK_SYMBOLS (b
, j
, sym
)
493 struct print_symbol_args s
;
497 catch_errors (print_symbol
, &s
, "Error printing symbol:\n",
501 fprintf_filtered (outfile
, "\n");
505 fprintf_filtered (outfile
, "\nBlockvector same as previous symtab\n\n");
510 maintenance_print_symbols (char *args
, int from_tty
)
513 struct ui_file
*outfile
;
514 struct cleanup
*cleanups
;
515 char *symname
= NULL
;
516 char *filename
= DEV_TTY
;
517 struct objfile
*objfile
;
525 Arguments missing: an output file name and an optional symbol file name");
527 else if ((argv
= buildargv (args
)) == NULL
)
531 cleanups
= make_cleanup_freeargv (argv
);
536 /* If a second arg is supplied, it is a source file name to match on */
543 filename
= tilde_expand (filename
);
544 make_cleanup (xfree
, filename
);
546 outfile
= gdb_fopen (filename
, FOPEN_WT
);
548 perror_with_name (filename
);
549 make_cleanup_ui_file_delete (outfile
);
552 ALL_SYMTABS (objfile
, s
)
553 if (symname
== NULL
|| (STREQ (symname
, s
->filename
)))
554 dump_symtab (objfile
, s
, outfile
);
556 do_cleanups (cleanups
);
559 /* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
560 far to indent. ARGS is really a struct print_symbol_args *, but is
561 declared as char * to get it past catch_errors. Returns 0 for error,
565 print_symbol (PTR args
)
567 struct symbol
*symbol
= ((struct print_symbol_args
*) args
)->symbol
;
568 int depth
= ((struct print_symbol_args
*) args
)->depth
;
569 struct ui_file
*outfile
= ((struct print_symbol_args
*) args
)->outfile
;
571 print_spaces (depth
, outfile
);
572 if (SYMBOL_NAMESPACE (symbol
) == LABEL_NAMESPACE
)
574 fprintf_filtered (outfile
, "label %s at ", SYMBOL_SOURCE_NAME (symbol
));
575 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
576 if (SYMBOL_BFD_SECTION (symbol
))
577 fprintf_filtered (outfile
, " section %s\n",
578 bfd_section_name (SYMBOL_BFD_SECTION (symbol
)->owner
,
579 SYMBOL_BFD_SECTION (symbol
)));
581 fprintf_filtered (outfile
, "\n");
584 if (SYMBOL_NAMESPACE (symbol
) == STRUCT_NAMESPACE
)
586 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol
)))
588 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
592 fprintf_filtered (outfile
, "%s %s = ",
593 (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_ENUM
595 : (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_STRUCT
596 ? "struct" : "union")),
597 SYMBOL_NAME (symbol
));
598 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
600 fprintf_filtered (outfile
, ";\n");
604 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
605 fprintf_filtered (outfile
, "typedef ");
606 if (SYMBOL_TYPE (symbol
))
608 /* Print details of types, except for enums where it's clutter. */
609 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), SYMBOL_SOURCE_NAME (symbol
),
611 TYPE_CODE (SYMBOL_TYPE (symbol
)) != TYPE_CODE_ENUM
,
613 fprintf_filtered (outfile
, "; ");
616 fprintf_filtered (outfile
, "%s ", SYMBOL_SOURCE_NAME (symbol
));
618 switch (SYMBOL_CLASS (symbol
))
621 fprintf_filtered (outfile
, "const %ld (0x%lx)",
622 SYMBOL_VALUE (symbol
),
623 SYMBOL_VALUE (symbol
));
626 case LOC_CONST_BYTES
:
629 struct type
*type
= check_typedef (SYMBOL_TYPE (symbol
));
630 fprintf_filtered (outfile
, "const %u hex bytes:",
632 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
633 fprintf_filtered (outfile
, " %02x",
634 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
639 fprintf_filtered (outfile
, "static at ");
640 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
641 if (SYMBOL_BFD_SECTION (symbol
))
642 fprintf_filtered (outfile
, " section %s",
644 (SYMBOL_BFD_SECTION (symbol
)->owner
,
645 SYMBOL_BFD_SECTION (symbol
)));
649 fprintf_filtered (outfile
, "extern global at *(");
650 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
651 fprintf_filtered (outfile
, "),");
655 fprintf_filtered (outfile
, "register %ld", SYMBOL_VALUE (symbol
));
659 fprintf_filtered (outfile
, "arg at offset 0x%lx",
660 SYMBOL_VALUE (symbol
));
664 fprintf_filtered (outfile
, "arg at offset 0x%lx from fp",
665 SYMBOL_VALUE (symbol
));
669 fprintf_filtered (outfile
, "reference arg at 0x%lx", SYMBOL_VALUE (symbol
));
673 fprintf_filtered (outfile
, "parameter register %ld", SYMBOL_VALUE (symbol
));
676 case LOC_REGPARM_ADDR
:
677 fprintf_filtered (outfile
, "address parameter register %ld", SYMBOL_VALUE (symbol
));
681 fprintf_filtered (outfile
, "local at offset 0x%lx",
682 SYMBOL_VALUE (symbol
));
686 fprintf_filtered (outfile
, "local at 0x%lx from register %d",
687 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
690 case LOC_BASEREG_ARG
:
691 fprintf_filtered (outfile
, "arg at 0x%lx from register %d",
692 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
699 fprintf_filtered (outfile
, "label at ");
700 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
701 if (SYMBOL_BFD_SECTION (symbol
))
702 fprintf_filtered (outfile
, " section %s",
704 (SYMBOL_BFD_SECTION (symbol
)->owner
,
705 SYMBOL_BFD_SECTION (symbol
)));
709 fprintf_filtered (outfile
, "block object ");
710 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol
), outfile
);
711 fprintf_filtered (outfile
, ", ");
712 print_address_numeric (BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
)),
715 fprintf_filtered (outfile
, "..");
716 print_address_numeric (BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
)),
719 if (SYMBOL_BFD_SECTION (symbol
))
720 fprintf_filtered (outfile
, " section %s",
722 (SYMBOL_BFD_SECTION (symbol
)->owner
,
723 SYMBOL_BFD_SECTION (symbol
)));
727 fprintf_filtered (outfile
, "unresolved");
730 case LOC_OPTIMIZED_OUT
:
731 fprintf_filtered (outfile
, "optimized out");
735 fprintf_filtered (outfile
, "botched symbol class %x",
736 SYMBOL_CLASS (symbol
));
740 fprintf_filtered (outfile
, "\n");
745 maintenance_print_psymbols (char *args
, int from_tty
)
748 struct ui_file
*outfile
;
749 struct cleanup
*cleanups
;
750 char *symname
= NULL
;
751 char *filename
= DEV_TTY
;
752 struct objfile
*objfile
;
753 struct partial_symtab
*ps
;
759 error ("print-psymbols takes an output file name and optional symbol file name");
761 else if ((argv
= buildargv (args
)) == NULL
)
765 cleanups
= make_cleanup_freeargv (argv
);
770 /* If a second arg is supplied, it is a source file name to match on */
777 filename
= tilde_expand (filename
);
778 make_cleanup (xfree
, filename
);
780 outfile
= gdb_fopen (filename
, FOPEN_WT
);
782 perror_with_name (filename
);
783 make_cleanup_ui_file_delete (outfile
);
786 ALL_PSYMTABS (objfile
, ps
)
787 if (symname
== NULL
|| (STREQ (symname
, ps
->filename
)))
788 dump_psymtab (objfile
, ps
, outfile
);
790 do_cleanups (cleanups
);
794 print_partial_symbols (struct partial_symbol
**p
, int count
, char *what
,
795 struct ui_file
*outfile
)
797 fprintf_filtered (outfile
, " %s partial symbols:\n", what
);
800 fprintf_filtered (outfile
, " `%s'", SYMBOL_NAME (*p
));
801 if (SYMBOL_DEMANGLED_NAME (*p
) != NULL
)
803 fprintf_filtered (outfile
, " `%s'", SYMBOL_DEMANGLED_NAME (*p
));
805 fputs_filtered (", ", outfile
);
806 switch (SYMBOL_NAMESPACE (*p
))
808 case UNDEF_NAMESPACE
:
809 fputs_filtered ("undefined namespace, ", outfile
);
812 /* This is the usual thing -- don't print it */
814 case STRUCT_NAMESPACE
:
815 fputs_filtered ("struct namespace, ", outfile
);
817 case LABEL_NAMESPACE
:
818 fputs_filtered ("label namespace, ", outfile
);
821 fputs_filtered ("<invalid namespace>, ", outfile
);
824 switch (SYMBOL_CLASS (*p
))
827 fputs_filtered ("undefined", outfile
);
830 fputs_filtered ("constant int", outfile
);
833 fputs_filtered ("static", outfile
);
836 fputs_filtered ("extern global", outfile
);
839 fputs_filtered ("register", outfile
);
842 fputs_filtered ("pass by value", outfile
);
845 fputs_filtered ("pass by reference", outfile
);
848 fputs_filtered ("register parameter", outfile
);
850 case LOC_REGPARM_ADDR
:
851 fputs_filtered ("register address parameter", outfile
);
854 fputs_filtered ("stack parameter", outfile
);
857 fputs_filtered ("type", outfile
);
860 fputs_filtered ("label", outfile
);
863 fputs_filtered ("function", outfile
);
865 case LOC_CONST_BYTES
:
866 fputs_filtered ("constant bytes", outfile
);
869 fputs_filtered ("shuffled arg", outfile
);
872 fputs_filtered ("unresolved", outfile
);
874 case LOC_OPTIMIZED_OUT
:
875 fputs_filtered ("optimized out", outfile
);
878 fputs_filtered ("<invalid location>", outfile
);
881 fputs_filtered (", ", outfile
);
882 print_address_numeric (SYMBOL_VALUE_ADDRESS (*p
), 1, outfile
);
883 fprintf_filtered (outfile
, "\n");
889 maintenance_print_msymbols (char *args
, int from_tty
)
892 struct ui_file
*outfile
;
893 struct cleanup
*cleanups
;
894 char *filename
= DEV_TTY
;
895 char *symname
= NULL
;
896 struct objfile
*objfile
;
902 error ("print-msymbols takes an output file name and optional symbol file name");
904 else if ((argv
= buildargv (args
)) == NULL
)
908 cleanups
= make_cleanup_freeargv (argv
);
913 /* If a second arg is supplied, it is a source file name to match on */
920 filename
= tilde_expand (filename
);
921 make_cleanup (xfree
, filename
);
923 outfile
= gdb_fopen (filename
, FOPEN_WT
);
925 perror_with_name (filename
);
926 make_cleanup_ui_file_delete (outfile
);
929 ALL_OBJFILES (objfile
)
930 if (symname
== NULL
|| (STREQ (symname
, objfile
->name
)))
931 dump_msymbols (objfile
, outfile
);
933 fprintf_filtered (outfile
, "\n\n");
934 do_cleanups (cleanups
);
938 maintenance_print_objfiles (char *ignore
, int from_tty
)
940 struct objfile
*objfile
;
945 ALL_OBJFILES (objfile
)
946 dump_objfile (objfile
);
950 /* Check consistency of psymtabs and symtabs. */
953 maintenance_check_symtabs (char *ignore
, int from_tty
)
955 register struct symbol
*sym
;
956 register struct partial_symbol
**psym
;
957 register struct symtab
*s
= NULL
;
958 register struct partial_symtab
*ps
;
959 struct blockvector
*bv
;
960 register struct objfile
*objfile
;
961 register struct block
*b
;
964 ALL_PSYMTABS (objfile
, ps
)
966 s
= PSYMTAB_TO_SYMTAB (ps
);
969 bv
= BLOCKVECTOR (s
);
970 b
= BLOCKVECTOR_BLOCK (bv
, STATIC_BLOCK
);
971 psym
= ps
->objfile
->static_psymbols
.list
+ ps
->statics_offset
;
972 length
= ps
->n_static_syms
;
975 sym
= lookup_block_symbol (b
, SYMBOL_NAME (*psym
),
976 NULL
, SYMBOL_NAMESPACE (*psym
));
979 printf_filtered ("Static symbol `");
980 puts_filtered (SYMBOL_NAME (*psym
));
981 printf_filtered ("' only found in ");
982 puts_filtered (ps
->filename
);
983 printf_filtered (" psymtab\n");
987 b
= BLOCKVECTOR_BLOCK (bv
, GLOBAL_BLOCK
);
988 psym
= ps
->objfile
->global_psymbols
.list
+ ps
->globals_offset
;
989 length
= ps
->n_global_syms
;
992 sym
= lookup_block_symbol (b
, SYMBOL_NAME (*psym
),
993 NULL
, SYMBOL_NAMESPACE (*psym
));
996 printf_filtered ("Global symbol `");
997 puts_filtered (SYMBOL_NAME (*psym
));
998 printf_filtered ("' only found in ");
999 puts_filtered (ps
->filename
);
1000 printf_filtered (" psymtab\n");
1004 if (ps
->texthigh
< ps
->textlow
)
1006 printf_filtered ("Psymtab ");
1007 puts_filtered (ps
->filename
);
1008 printf_filtered (" covers bad range ");
1009 print_address_numeric (ps
->textlow
, 1, gdb_stdout
);
1010 printf_filtered (" - ");
1011 print_address_numeric (ps
->texthigh
, 1, gdb_stdout
);
1012 printf_filtered ("\n");
1015 if (ps
->texthigh
== 0)
1017 if (ps
->textlow
< BLOCK_START (b
) || ps
->texthigh
> BLOCK_END (b
))
1019 printf_filtered ("Psymtab ");
1020 puts_filtered (ps
->filename
);
1021 printf_filtered (" covers ");
1022 print_address_numeric (ps
->textlow
, 1, gdb_stdout
);
1023 printf_filtered (" - ");
1024 print_address_numeric (ps
->texthigh
, 1, gdb_stdout
);
1025 printf_filtered (" but symtab covers only ");
1026 print_address_numeric (BLOCK_START (b
), 1, gdb_stdout
);
1027 printf_filtered (" - ");
1028 print_address_numeric (BLOCK_END (b
), 1, gdb_stdout
);
1029 printf_filtered ("\n");
1035 /* Return the nexting depth of a block within other blocks in its symtab. */
1038 block_depth (struct block
*block
)
1041 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
1049 /* Increase the space allocated for LISTP, which is probably
1050 global_psymbols or static_psymbols. This space will eventually
1051 be freed in free_objfile(). */
1054 extend_psymbol_list (register struct psymbol_allocation_list
*listp
,
1055 struct objfile
*objfile
)
1058 if (listp
->size
== 0)
1061 listp
->list
= (struct partial_symbol
**)
1062 xmmalloc (objfile
->md
, new_size
* sizeof (struct partial_symbol
*));
1066 new_size
= listp
->size
* 2;
1067 listp
->list
= (struct partial_symbol
**)
1068 xmrealloc (objfile
->md
, (char *) listp
->list
,
1069 new_size
* sizeof (struct partial_symbol
*));
1071 /* Next assumes we only went one over. Should be good if
1072 program works correctly */
1073 listp
->next
= listp
->list
+ listp
->size
;
1074 listp
->size
= new_size
;
1078 /* Do early runtime initializations. */
1080 _initialize_symmisc (void)
This page took 0.051822 seconds and 4 git commands to generate.