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
)
90 for (i
= 0; i
< n
; i
++)
92 xmfree (objfile
->md
, SYMBOL_NAME (BLOCK_SYM (b
, i
)));
93 xmfree (objfile
->md
, (PTR
) BLOCK_SYM (b
, i
));
95 xmfree (objfile
->md
, (PTR
) b
);
98 /* Free all the storage associated with the struct symtab <- S.
99 Note that some symtabs have contents malloc'ed structure by structure,
100 while some have contents that all live inside one big block of memory,
101 and some share the contents of another symbol table and so you should
102 not free the contents on their behalf (except sometimes the linetable,
103 which maybe per symtab even when the rest is not).
104 It is s->free_code that says which alternative to use. */
107 free_symtab (register struct symtab
*s
)
110 register struct blockvector
*bv
;
112 switch (s
->free_code
)
115 /* All the contents are part of a big block of memory (an obstack),
116 and some other symtab is in charge of freeing that block.
117 Therefore, do nothing. */
121 /* Here all the contents were malloc'ed structure by structure
122 and must be freed that way. */
123 /* First free the blocks (and their symbols. */
124 bv
= BLOCKVECTOR (s
);
125 n
= BLOCKVECTOR_NBLOCKS (bv
);
126 for (i
= 0; i
< n
; i
++)
127 free_symtab_block (s
->objfile
, BLOCKVECTOR_BLOCK (bv
, i
));
128 /* Free the blockvector itself. */
129 xmfree (s
->objfile
->md
, (PTR
) bv
);
130 /* Also free the linetable. */
133 /* Everything will be freed either by our `free_ptr'
134 or by some other symtab, except for our linetable.
137 xmfree (s
->objfile
->md
, (PTR
) LINETABLE (s
));
141 /* If there is a single block of memory to free, free it. */
142 if (s
->free_ptr
!= NULL
)
143 xmfree (s
->objfile
->md
, s
->free_ptr
);
145 /* Free source-related stuff */
146 if (s
->line_charpos
!= NULL
)
147 xmfree (s
->objfile
->md
, (PTR
) s
->line_charpos
);
148 if (s
->fullname
!= NULL
)
149 xmfree (s
->objfile
->md
, s
->fullname
);
150 if (s
->debugformat
!= NULL
)
151 xmfree (s
->objfile
->md
, s
->debugformat
);
152 xmfree (s
->objfile
->md
, (PTR
) s
);
156 print_symbol_bcache_statistics (void)
158 struct objfile
*objfile
;
161 ALL_OBJFILES (objfile
)
163 printf_filtered ("Byte cache statistics for '%s':\n", objfile
->name
);
164 print_bcache_statistics (&objfile
->psymbol_cache
, "partial symbol cache");
170 print_objfile_statistics (void)
172 struct objfile
*objfile
;
175 ALL_OBJFILES (objfile
)
177 printf_filtered ("Statistics for '%s':\n", objfile
->name
);
178 if (OBJSTAT (objfile
, n_stabs
) > 0)
179 printf_filtered (" Number of \"stab\" symbols read: %d\n",
180 OBJSTAT (objfile
, n_stabs
));
181 if (OBJSTAT (objfile
, n_minsyms
) > 0)
182 printf_filtered (" Number of \"minimal\" symbols read: %d\n",
183 OBJSTAT (objfile
, n_minsyms
));
184 if (OBJSTAT (objfile
, n_psyms
) > 0)
185 printf_filtered (" Number of \"partial\" symbols read: %d\n",
186 OBJSTAT (objfile
, n_psyms
));
187 if (OBJSTAT (objfile
, n_syms
) > 0)
188 printf_filtered (" Number of \"full\" symbols read: %d\n",
189 OBJSTAT (objfile
, n_syms
));
190 if (OBJSTAT (objfile
, n_types
) > 0)
191 printf_filtered (" Number of \"types\" defined: %d\n",
192 OBJSTAT (objfile
, n_types
));
193 if (OBJSTAT (objfile
, sz_strtab
) > 0)
194 printf_filtered (" Space used by a.out string tables: %d\n",
195 OBJSTAT (objfile
, sz_strtab
));
196 printf_filtered (" Total memory used for psymbol obstack: %d\n",
197 obstack_memory_used (&objfile
->psymbol_obstack
));
198 printf_filtered (" Total memory used for psymbol cache: %d\n",
199 obstack_memory_used (&objfile
->psymbol_cache
.cache
));
200 printf_filtered (" Total memory used for macro cache: %d\n",
201 obstack_memory_used (&objfile
->macro_cache
.cache
));
202 printf_filtered (" Total memory used for symbol obstack: %d\n",
203 obstack_memory_used (&objfile
->symbol_obstack
));
204 printf_filtered (" Total memory used for type obstack: %d\n",
205 obstack_memory_used (&objfile
->type_obstack
));
211 dump_objfile (struct objfile
*objfile
)
213 struct symtab
*symtab
;
214 struct partial_symtab
*psymtab
;
216 printf_filtered ("\nObject file %s: ", objfile
->name
);
217 printf_filtered ("Objfile at ");
218 gdb_print_host_address (objfile
, gdb_stdout
);
219 printf_filtered (", bfd at ");
220 gdb_print_host_address (objfile
->obfd
, gdb_stdout
);
221 printf_filtered (", %d minsyms\n\n",
222 objfile
->minimal_symbol_count
);
224 if (objfile
->psymtabs
)
226 printf_filtered ("Psymtabs:\n");
227 for (psymtab
= objfile
->psymtabs
;
229 psymtab
= psymtab
->next
)
231 printf_filtered ("%s at ",
233 gdb_print_host_address (psymtab
, gdb_stdout
);
234 printf_filtered (", ");
235 if (psymtab
->objfile
!= objfile
)
237 printf_filtered ("NOT ON CHAIN! ");
241 printf_filtered ("\n\n");
244 if (objfile
->symtabs
)
246 printf_filtered ("Symtabs:\n");
247 for (symtab
= objfile
->symtabs
;
249 symtab
= symtab
->next
)
251 printf_filtered ("%s at ", symtab
->filename
);
252 gdb_print_host_address (symtab
, gdb_stdout
);
253 printf_filtered (", ");
254 if (symtab
->objfile
!= objfile
)
256 printf_filtered ("NOT ON CHAIN! ");
260 printf_filtered ("\n\n");
264 /* Print minimal symbols from this objfile. */
267 dump_msymbols (struct objfile
*objfile
, struct ui_file
*outfile
)
269 struct minimal_symbol
*msymbol
;
273 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile
->name
);
274 if (objfile
->minimal_symbol_count
== 0)
276 fprintf_filtered (outfile
, "No minimal symbols found.\n");
279 for (index
= 0, msymbol
= objfile
->msymbols
;
280 SYMBOL_NAME (msymbol
) != NULL
; msymbol
++, index
++)
282 switch (msymbol
->type
)
290 case mst_solib_trampoline
:
315 fprintf_filtered (outfile
, "[%2d] %c ", index
, ms_type
);
316 print_address_numeric (SYMBOL_VALUE_ADDRESS (msymbol
), 1, outfile
);
317 fprintf_filtered (outfile
, " %s", SYMBOL_NAME (msymbol
));
318 if (SYMBOL_BFD_SECTION (msymbol
))
319 fprintf_filtered (outfile
, " section %s",
320 bfd_section_name (objfile
->obfd
,
321 SYMBOL_BFD_SECTION (msymbol
)));
322 if (SYMBOL_DEMANGLED_NAME (msymbol
) != NULL
)
324 fprintf_filtered (outfile
, " %s", SYMBOL_DEMANGLED_NAME (msymbol
));
326 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
327 if (msymbol
->filename
)
328 fprintf_filtered (outfile
, " %s", msymbol
->filename
);
330 fputs_filtered ("\n", outfile
);
332 if (objfile
->minimal_symbol_count
!= index
)
334 warning ("internal error: minimal symbol count %d != %d",
335 objfile
->minimal_symbol_count
, index
);
337 fprintf_filtered (outfile
, "\n");
341 dump_psymtab (struct objfile
*objfile
, struct partial_symtab
*psymtab
,
342 struct ui_file
*outfile
)
346 fprintf_filtered (outfile
, "\nPartial symtab for source file %s ",
348 fprintf_filtered (outfile
, "(object ");
349 gdb_print_host_address (psymtab
, outfile
);
350 fprintf_filtered (outfile
, ")\n\n");
351 fprintf_unfiltered (outfile
, " Read from object file %s (",
353 gdb_print_host_address (objfile
, outfile
);
354 fprintf_unfiltered (outfile
, ")\n");
358 fprintf_filtered (outfile
,
359 " Full symtab was read (at ");
360 gdb_print_host_address (psymtab
->symtab
, outfile
);
361 fprintf_filtered (outfile
, " by function at ");
362 gdb_print_host_address ((PTR
) psymtab
->read_symtab
, outfile
);
363 fprintf_filtered (outfile
, ")\n");
366 fprintf_filtered (outfile
, " Relocate symbols by ");
367 for (i
= 0; i
< psymtab
->objfile
->num_sections
; ++i
)
370 fprintf_filtered (outfile
, ", ");
372 print_address_numeric (ANOFFSET (psymtab
->section_offsets
, i
),
376 fprintf_filtered (outfile
, "\n");
378 fprintf_filtered (outfile
, " Symbols cover text addresses ");
379 print_address_numeric (psymtab
->textlow
, 1, outfile
);
380 fprintf_filtered (outfile
, "-");
381 print_address_numeric (psymtab
->texthigh
, 1, outfile
);
382 fprintf_filtered (outfile
, "\n");
383 fprintf_filtered (outfile
, " Depends on %d other partial symtabs.\n",
384 psymtab
->number_of_dependencies
);
385 for (i
= 0; i
< psymtab
->number_of_dependencies
; i
++)
387 fprintf_filtered (outfile
, " %d ", i
);
388 gdb_print_host_address (psymtab
->dependencies
[i
], outfile
);
389 fprintf_filtered (outfile
, " %s\n",
390 psymtab
->dependencies
[i
]->filename
);
392 if (psymtab
->n_global_syms
> 0)
394 print_partial_symbols (objfile
->global_psymbols
.list
395 + psymtab
->globals_offset
,
396 psymtab
->n_global_syms
, "Global", outfile
);
398 if (psymtab
->n_static_syms
> 0)
400 print_partial_symbols (objfile
->static_psymbols
.list
401 + psymtab
->statics_offset
,
402 psymtab
->n_static_syms
, "Static", outfile
);
404 fprintf_filtered (outfile
, "\n");
408 dump_symtab (struct objfile
*objfile
, struct symtab
*symtab
,
409 struct ui_file
*outfile
)
413 register struct linetable
*l
;
414 struct blockvector
*bv
;
416 register struct block
*b
;
419 fprintf_filtered (outfile
, "\nSymtab for file %s\n", symtab
->filename
);
421 fprintf_filtered (outfile
, "Compilation directory is %s\n",
423 fprintf_filtered (outfile
, "Read from object file %s (", objfile
->name
);
424 gdb_print_host_address (objfile
, outfile
);
425 fprintf_filtered (outfile
, ")\n");
426 fprintf_filtered (outfile
, "Language: %s\n", language_str (symtab
->language
));
428 /* First print the line table. */
429 l
= LINETABLE (symtab
);
432 fprintf_filtered (outfile
, "\nLine table:\n\n");
434 for (i
= 0; i
< len
; i
++)
436 fprintf_filtered (outfile
, " line %d at ", l
->item
[i
].line
);
437 print_address_numeric (l
->item
[i
].pc
, 1, outfile
);
438 fprintf_filtered (outfile
, "\n");
441 /* Now print the block info, but only for primary symtabs since we will
442 print lots of duplicate info otherwise. */
445 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
446 bv
= BLOCKVECTOR (symtab
);
447 len
= BLOCKVECTOR_NBLOCKS (bv
);
448 for (i
= 0; i
< len
; i
++)
450 b
= BLOCKVECTOR_BLOCK (bv
, i
);
451 depth
= block_depth (b
) * 2;
452 print_spaces (depth
, outfile
);
453 fprintf_filtered (outfile
, "block #%03d, object at ", i
);
454 gdb_print_host_address (b
, outfile
);
455 if (BLOCK_SUPERBLOCK (b
))
457 fprintf_filtered (outfile
, " under ");
458 gdb_print_host_address (BLOCK_SUPERBLOCK (b
), outfile
);
460 blen
= BLOCK_NSYMS (b
);
461 fprintf_filtered (outfile
, ", %d syms in ", blen
);
462 print_address_numeric (BLOCK_START (b
), 1, outfile
);
463 fprintf_filtered (outfile
, "..");
464 print_address_numeric (BLOCK_END (b
), 1, outfile
);
465 if (BLOCK_FUNCTION (b
))
467 fprintf_filtered (outfile
, ", function %s", SYMBOL_NAME (BLOCK_FUNCTION (b
)));
468 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)) != NULL
)
470 fprintf_filtered (outfile
, ", %s",
471 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)));
474 if (BLOCK_GCC_COMPILED (b
))
475 fprintf_filtered (outfile
, ", compiled with gcc%d", BLOCK_GCC_COMPILED (b
));
476 fprintf_filtered (outfile
, "\n");
477 /* Now print each symbol in this block. */
479 ALL_BLOCK_SYMBOLS (b
, j
, sym
)
481 struct print_symbol_args s
;
485 catch_errors (print_symbol
, &s
, "Error printing symbol:\n",
489 fprintf_filtered (outfile
, "\n");
493 fprintf_filtered (outfile
, "\nBlockvector same as previous symtab\n\n");
498 maintenance_print_symbols (char *args
, int from_tty
)
501 struct ui_file
*outfile
;
502 struct cleanup
*cleanups
;
503 char *symname
= NULL
;
504 char *filename
= DEV_TTY
;
505 struct objfile
*objfile
;
513 Arguments missing: an output file name and an optional symbol file name");
515 else if ((argv
= buildargv (args
)) == NULL
)
519 cleanups
= make_cleanup_freeargv (argv
);
524 /* If a second arg is supplied, it is a source file name to match on */
531 filename
= tilde_expand (filename
);
532 make_cleanup (xfree
, filename
);
534 outfile
= gdb_fopen (filename
, FOPEN_WT
);
536 perror_with_name (filename
);
537 make_cleanup_ui_file_delete (outfile
);
540 ALL_SYMTABS (objfile
, s
)
541 if (symname
== NULL
|| (STREQ (symname
, s
->filename
)))
542 dump_symtab (objfile
, s
, outfile
);
544 do_cleanups (cleanups
);
547 /* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
548 far to indent. ARGS is really a struct print_symbol_args *, but is
549 declared as char * to get it past catch_errors. Returns 0 for error,
553 print_symbol (PTR args
)
555 struct symbol
*symbol
= ((struct print_symbol_args
*) args
)->symbol
;
556 int depth
= ((struct print_symbol_args
*) args
)->depth
;
557 struct ui_file
*outfile
= ((struct print_symbol_args
*) args
)->outfile
;
559 print_spaces (depth
, outfile
);
560 if (SYMBOL_NAMESPACE (symbol
) == LABEL_NAMESPACE
)
562 fprintf_filtered (outfile
, "label %s at ", SYMBOL_SOURCE_NAME (symbol
));
563 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
564 if (SYMBOL_BFD_SECTION (symbol
))
565 fprintf_filtered (outfile
, " section %s\n",
566 bfd_section_name (SYMBOL_BFD_SECTION (symbol
)->owner
,
567 SYMBOL_BFD_SECTION (symbol
)));
569 fprintf_filtered (outfile
, "\n");
572 if (SYMBOL_NAMESPACE (symbol
) == STRUCT_NAMESPACE
)
574 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol
)))
576 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
580 fprintf_filtered (outfile
, "%s %s = ",
581 (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_ENUM
583 : (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_STRUCT
584 ? "struct" : "union")),
585 SYMBOL_NAME (symbol
));
586 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
588 fprintf_filtered (outfile
, ";\n");
592 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
593 fprintf_filtered (outfile
, "typedef ");
594 if (SYMBOL_TYPE (symbol
))
596 /* Print details of types, except for enums where it's clutter. */
597 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), SYMBOL_SOURCE_NAME (symbol
),
599 TYPE_CODE (SYMBOL_TYPE (symbol
)) != TYPE_CODE_ENUM
,
601 fprintf_filtered (outfile
, "; ");
604 fprintf_filtered (outfile
, "%s ", SYMBOL_SOURCE_NAME (symbol
));
606 switch (SYMBOL_CLASS (symbol
))
609 fprintf_filtered (outfile
, "const %ld (0x%lx)",
610 SYMBOL_VALUE (symbol
),
611 SYMBOL_VALUE (symbol
));
614 case LOC_CONST_BYTES
:
617 struct type
*type
= check_typedef (SYMBOL_TYPE (symbol
));
618 fprintf_filtered (outfile
, "const %u hex bytes:",
620 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
621 fprintf_filtered (outfile
, " %02x",
622 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
627 fprintf_filtered (outfile
, "static at ");
628 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
629 if (SYMBOL_BFD_SECTION (symbol
))
630 fprintf_filtered (outfile
, " section %s",
632 (SYMBOL_BFD_SECTION (symbol
)->owner
,
633 SYMBOL_BFD_SECTION (symbol
)));
637 fprintf_filtered (outfile
, "extern global at *(");
638 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
639 fprintf_filtered (outfile
, "),");
643 fprintf_filtered (outfile
, "register %ld", SYMBOL_VALUE (symbol
));
647 fprintf_filtered (outfile
, "arg at offset 0x%lx",
648 SYMBOL_VALUE (symbol
));
652 fprintf_filtered (outfile
, "arg at offset 0x%lx from fp",
653 SYMBOL_VALUE (symbol
));
657 fprintf_filtered (outfile
, "reference arg at 0x%lx", SYMBOL_VALUE (symbol
));
661 fprintf_filtered (outfile
, "parameter register %ld", SYMBOL_VALUE (symbol
));
664 case LOC_REGPARM_ADDR
:
665 fprintf_filtered (outfile
, "address parameter register %ld", SYMBOL_VALUE (symbol
));
669 fprintf_filtered (outfile
, "local at offset 0x%lx",
670 SYMBOL_VALUE (symbol
));
674 fprintf_filtered (outfile
, "local at 0x%lx from register %d",
675 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
678 case LOC_BASEREG_ARG
:
679 fprintf_filtered (outfile
, "arg at 0x%lx from register %d",
680 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
687 fprintf_filtered (outfile
, "label at ");
688 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
689 if (SYMBOL_BFD_SECTION (symbol
))
690 fprintf_filtered (outfile
, " section %s",
692 (SYMBOL_BFD_SECTION (symbol
)->owner
,
693 SYMBOL_BFD_SECTION (symbol
)));
697 fprintf_filtered (outfile
, "block object ");
698 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol
), outfile
);
699 fprintf_filtered (outfile
, ", ");
700 print_address_numeric (BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
)),
703 fprintf_filtered (outfile
, "..");
704 print_address_numeric (BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
)),
707 if (SYMBOL_BFD_SECTION (symbol
))
708 fprintf_filtered (outfile
, " section %s",
710 (SYMBOL_BFD_SECTION (symbol
)->owner
,
711 SYMBOL_BFD_SECTION (symbol
)));
715 fprintf_filtered (outfile
, "unresolved");
718 case LOC_OPTIMIZED_OUT
:
719 fprintf_filtered (outfile
, "optimized out");
723 fprintf_filtered (outfile
, "botched symbol class %x",
724 SYMBOL_CLASS (symbol
));
728 fprintf_filtered (outfile
, "\n");
733 maintenance_print_psymbols (char *args
, int from_tty
)
736 struct ui_file
*outfile
;
737 struct cleanup
*cleanups
;
738 char *symname
= NULL
;
739 char *filename
= DEV_TTY
;
740 struct objfile
*objfile
;
741 struct partial_symtab
*ps
;
747 error ("print-psymbols takes an output file name and optional symbol file name");
749 else if ((argv
= buildargv (args
)) == NULL
)
753 cleanups
= make_cleanup_freeargv (argv
);
758 /* If a second arg is supplied, it is a source file name to match on */
765 filename
= tilde_expand (filename
);
766 make_cleanup (xfree
, filename
);
768 outfile
= gdb_fopen (filename
, FOPEN_WT
);
770 perror_with_name (filename
);
771 make_cleanup_ui_file_delete (outfile
);
774 ALL_PSYMTABS (objfile
, ps
)
775 if (symname
== NULL
|| (STREQ (symname
, ps
->filename
)))
776 dump_psymtab (objfile
, ps
, outfile
);
778 do_cleanups (cleanups
);
782 print_partial_symbols (struct partial_symbol
**p
, int count
, char *what
,
783 struct ui_file
*outfile
)
785 fprintf_filtered (outfile
, " %s partial symbols:\n", what
);
788 fprintf_filtered (outfile
, " `%s'", SYMBOL_NAME (*p
));
789 if (SYMBOL_DEMANGLED_NAME (*p
) != NULL
)
791 fprintf_filtered (outfile
, " `%s'", SYMBOL_DEMANGLED_NAME (*p
));
793 fputs_filtered (", ", outfile
);
794 switch (SYMBOL_NAMESPACE (*p
))
796 case UNDEF_NAMESPACE
:
797 fputs_filtered ("undefined namespace, ", outfile
);
800 /* This is the usual thing -- don't print it */
802 case STRUCT_NAMESPACE
:
803 fputs_filtered ("struct namespace, ", outfile
);
805 case LABEL_NAMESPACE
:
806 fputs_filtered ("label namespace, ", outfile
);
809 fputs_filtered ("<invalid namespace>, ", outfile
);
812 switch (SYMBOL_CLASS (*p
))
815 fputs_filtered ("undefined", outfile
);
818 fputs_filtered ("constant int", outfile
);
821 fputs_filtered ("static", outfile
);
824 fputs_filtered ("extern global", outfile
);
827 fputs_filtered ("register", outfile
);
830 fputs_filtered ("pass by value", outfile
);
833 fputs_filtered ("pass by reference", outfile
);
836 fputs_filtered ("register parameter", outfile
);
838 case LOC_REGPARM_ADDR
:
839 fputs_filtered ("register address parameter", outfile
);
842 fputs_filtered ("stack parameter", outfile
);
845 fputs_filtered ("type", outfile
);
848 fputs_filtered ("label", outfile
);
851 fputs_filtered ("function", outfile
);
853 case LOC_CONST_BYTES
:
854 fputs_filtered ("constant bytes", outfile
);
857 fputs_filtered ("shuffled arg", outfile
);
860 fputs_filtered ("unresolved", outfile
);
862 case LOC_OPTIMIZED_OUT
:
863 fputs_filtered ("optimized out", outfile
);
866 fputs_filtered ("<invalid location>", outfile
);
869 fputs_filtered (", ", outfile
);
870 print_address_numeric (SYMBOL_VALUE_ADDRESS (*p
), 1, outfile
);
871 fprintf_filtered (outfile
, "\n");
877 maintenance_print_msymbols (char *args
, int from_tty
)
880 struct ui_file
*outfile
;
881 struct cleanup
*cleanups
;
882 char *filename
= DEV_TTY
;
883 char *symname
= NULL
;
884 struct objfile
*objfile
;
890 error ("print-msymbols takes an output file name and optional symbol file name");
892 else if ((argv
= buildargv (args
)) == NULL
)
896 cleanups
= make_cleanup_freeargv (argv
);
901 /* If a second arg is supplied, it is a source file name to match on */
908 filename
= tilde_expand (filename
);
909 make_cleanup (xfree
, filename
);
911 outfile
= gdb_fopen (filename
, FOPEN_WT
);
913 perror_with_name (filename
);
914 make_cleanup_ui_file_delete (outfile
);
917 ALL_OBJFILES (objfile
)
918 if (symname
== NULL
|| (STREQ (symname
, objfile
->name
)))
919 dump_msymbols (objfile
, outfile
);
921 fprintf_filtered (outfile
, "\n\n");
922 do_cleanups (cleanups
);
926 maintenance_print_objfiles (char *ignore
, int from_tty
)
928 struct objfile
*objfile
;
933 ALL_OBJFILES (objfile
)
934 dump_objfile (objfile
);
938 /* Check consistency of psymtabs and symtabs. */
941 maintenance_check_symtabs (char *ignore
, int from_tty
)
943 register struct symbol
*sym
;
944 register struct partial_symbol
**psym
;
945 register struct symtab
*s
= NULL
;
946 register struct partial_symtab
*ps
;
947 struct blockvector
*bv
;
948 register struct objfile
*objfile
;
949 register struct block
*b
;
952 ALL_PSYMTABS (objfile
, ps
)
954 s
= PSYMTAB_TO_SYMTAB (ps
);
957 bv
= BLOCKVECTOR (s
);
958 b
= BLOCKVECTOR_BLOCK (bv
, STATIC_BLOCK
);
959 psym
= ps
->objfile
->static_psymbols
.list
+ ps
->statics_offset
;
960 length
= ps
->n_static_syms
;
963 sym
= lookup_block_symbol (b
, SYMBOL_NAME (*psym
),
964 NULL
, SYMBOL_NAMESPACE (*psym
));
967 printf_filtered ("Static symbol `");
968 puts_filtered (SYMBOL_NAME (*psym
));
969 printf_filtered ("' only found in ");
970 puts_filtered (ps
->filename
);
971 printf_filtered (" psymtab\n");
975 b
= BLOCKVECTOR_BLOCK (bv
, GLOBAL_BLOCK
);
976 psym
= ps
->objfile
->global_psymbols
.list
+ ps
->globals_offset
;
977 length
= ps
->n_global_syms
;
980 sym
= lookup_block_symbol (b
, SYMBOL_NAME (*psym
),
981 NULL
, SYMBOL_NAMESPACE (*psym
));
984 printf_filtered ("Global symbol `");
985 puts_filtered (SYMBOL_NAME (*psym
));
986 printf_filtered ("' only found in ");
987 puts_filtered (ps
->filename
);
988 printf_filtered (" psymtab\n");
992 if (ps
->texthigh
< ps
->textlow
)
994 printf_filtered ("Psymtab ");
995 puts_filtered (ps
->filename
);
996 printf_filtered (" covers bad range ");
997 print_address_numeric (ps
->textlow
, 1, gdb_stdout
);
998 printf_filtered (" - ");
999 print_address_numeric (ps
->texthigh
, 1, gdb_stdout
);
1000 printf_filtered ("\n");
1003 if (ps
->texthigh
== 0)
1005 if (ps
->textlow
< BLOCK_START (b
) || ps
->texthigh
> BLOCK_END (b
))
1007 printf_filtered ("Psymtab ");
1008 puts_filtered (ps
->filename
);
1009 printf_filtered (" covers ");
1010 print_address_numeric (ps
->textlow
, 1, gdb_stdout
);
1011 printf_filtered (" - ");
1012 print_address_numeric (ps
->texthigh
, 1, gdb_stdout
);
1013 printf_filtered (" but symtab covers only ");
1014 print_address_numeric (BLOCK_START (b
), 1, gdb_stdout
);
1015 printf_filtered (" - ");
1016 print_address_numeric (BLOCK_END (b
), 1, gdb_stdout
);
1017 printf_filtered ("\n");
1023 /* Return the nexting depth of a block within other blocks in its symtab. */
1026 block_depth (struct block
*block
)
1029 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
1037 /* Increase the space allocated for LISTP, which is probably
1038 global_psymbols or static_psymbols. This space will eventually
1039 be freed in free_objfile(). */
1042 extend_psymbol_list (register struct psymbol_allocation_list
*listp
,
1043 struct objfile
*objfile
)
1046 if (listp
->size
== 0)
1049 listp
->list
= (struct partial_symbol
**)
1050 xmmalloc (objfile
->md
, new_size
* sizeof (struct partial_symbol
*));
1054 new_size
= listp
->size
* 2;
1055 listp
->list
= (struct partial_symbol
**)
1056 xmrealloc (objfile
->md
, (char *) listp
->list
,
1057 new_size
* sizeof (struct partial_symbol
*));
1059 /* Next assumes we only went one over. Should be good if
1060 program works correctly */
1061 listp
->next
= listp
->list
+ listp
->size
;
1062 listp
->size
= new_size
;
1066 /* Do early runtime initializations. */
1068 _initialize_symmisc (void)
This page took 0.052111 seconds and 4 git commands to generate.