1 /* Do various things to symbol tables (other than lookup), for GDB.
2 Copyright 1986, 87, 89, 91, 92, 93, 94, 95, 96, 1998
3 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, Boston, MA 02111-1307, USA. */
27 #include "breakpoint.h"
33 #include "gdb_string.h"
36 #define DEV_TTY "/dev/tty"
39 /* Unfortunately for debugging, stderr is usually a macro. This is painful
40 when calling functions that take FILE *'s from the debugger.
41 So we make a variable which has the same value and which is accessible when
42 debugging GDB with itself. Because stdin et al need not be constants,
43 we initialize them in the _initialize_symmisc function at the bottom
49 /* Prototypes for local functions */
51 static void dump_symtab
PARAMS ((struct objfile
*, struct symtab
*,
54 static void dump_psymtab
PARAMS ((struct objfile
*, struct partial_symtab
*,
57 static void dump_msymbols
PARAMS ((struct objfile
*, GDB_FILE
*));
59 static void dump_objfile
PARAMS ((struct objfile
*));
61 static int block_depth
PARAMS ((struct block
*));
63 static void print_partial_symbols
PARAMS ((struct partial_symbol
**, int,
66 static int print_symbol
PARAMS ((char *));
68 static void free_symtab_block
PARAMS ((struct objfile
*, struct block
*));
70 void _initialize_symmisc
PARAMS ((void));
72 struct print_symbol_args
{
73 struct symbol
*symbol
;
78 static int print_symbol
PARAMS ((char *));
81 free_symtab_block
PARAMS ((struct objfile
*, struct block
*));
84 /* Free a struct block <- B and all the symbols defined in that block. */
87 free_symtab_block (objfile
, b
)
88 struct objfile
*objfile
;
93 for (i
= 0; i
< n
; i
++)
95 mfree (objfile
-> md
, SYMBOL_NAME (BLOCK_SYM (b
, i
)));
96 mfree (objfile
-> md
, (PTR
) BLOCK_SYM (b
, i
));
98 mfree (objfile
-> md
, (PTR
) b
);
101 /* Free all the storage associated with the struct symtab <- S.
102 Note that some symtabs have contents malloc'ed structure by structure,
103 while some have contents that all live inside one big block of memory,
104 and some share the contents of another symbol table and so you should
105 not free the contents on their behalf (except sometimes the linetable,
106 which maybe per symtab even when the rest is not).
107 It is s->free_code that says which alternative to use. */
111 register struct symtab
*s
;
114 register struct blockvector
*bv
;
116 switch (s
->free_code
)
119 /* All the contents are part of a big block of memory (an obstack),
120 and some other symtab is in charge of freeing that block.
121 Therefore, do nothing. */
125 /* Here all the contents were malloc'ed structure by structure
126 and must be freed that way. */
127 /* First free the blocks (and their symbols. */
128 bv
= BLOCKVECTOR (s
);
129 n
= BLOCKVECTOR_NBLOCKS (bv
);
130 for (i
= 0; i
< n
; i
++)
131 free_symtab_block (s
-> objfile
, BLOCKVECTOR_BLOCK (bv
, i
));
132 /* Free the blockvector itself. */
133 mfree (s
-> objfile
-> md
, (PTR
) bv
);
134 /* Also free the linetable. */
137 /* Everything will be freed either by our `free_ptr'
138 or by some other symtab, except for our linetable.
141 mfree (s
-> objfile
-> md
, (PTR
) LINETABLE (s
));
145 /* If there is a single block of memory to free, free it. */
146 if (s
-> free_ptr
!= NULL
)
147 mfree (s
-> objfile
-> md
, s
-> free_ptr
);
149 /* Free source-related stuff */
150 if (s
-> line_charpos
!= NULL
)
151 mfree (s
-> objfile
-> md
, (PTR
) s
-> line_charpos
);
152 if (s
-> fullname
!= NULL
)
153 mfree (s
-> objfile
-> md
, s
-> fullname
);
154 if (s
-> debugformat
!= NULL
)
155 mfree (s
-> objfile
-> md
, s
-> debugformat
);
156 mfree (s
-> objfile
-> md
, (PTR
) s
);
162 print_symbol_bcache_statistics ()
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 ()
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 symbol obstack: %d\n",
207 obstack_memory_used (&objfile
-> symbol_obstack
));
208 printf_filtered (" Total memory used for type obstack: %d\n",
209 obstack_memory_used (&objfile
-> type_obstack
));
215 dump_objfile (objfile
)
216 struct objfile
*objfile
;
218 struct symtab
*symtab
;
219 struct partial_symtab
*psymtab
;
221 printf_filtered ("\nObject file %s: ", objfile
-> name
);
222 printf_filtered ("Objfile at ");
223 gdb_print_address (objfile
, gdb_stdout
);
224 printf_filtered (", bfd at ");
225 gdb_print_address (objfile
->obfd
, gdb_stdout
);
226 printf_filtered (", %d minsyms\n\n",
227 objfile
->minimal_symbol_count
);
229 if (objfile
-> psymtabs
)
231 printf_filtered ("Psymtabs:\n");
232 for (psymtab
= objfile
-> psymtabs
;
234 psymtab
= psymtab
-> next
)
236 printf_filtered ("%s at ",
237 psymtab
-> filename
);
238 gdb_print_address (psymtab
, gdb_stdout
);
239 printf_filtered (", ");
240 if (psymtab
-> objfile
!= objfile
)
242 printf_filtered ("NOT ON CHAIN! ");
246 printf_filtered ("\n\n");
249 if (objfile
-> symtabs
)
251 printf_filtered ("Symtabs:\n");
252 for (symtab
= objfile
-> symtabs
;
254 symtab
= symtab
->next
)
256 printf_filtered ("%s at ", symtab
-> filename
);
257 gdb_print_address (symtab
, gdb_stdout
);
258 printf_filtered (", ");
259 if (symtab
-> objfile
!= objfile
)
261 printf_filtered ("NOT ON CHAIN! ");
265 printf_filtered ("\n\n");
269 /* Print minimal symbols from this objfile. */
272 dump_msymbols (objfile
, outfile
)
273 struct objfile
*objfile
;
276 struct minimal_symbol
*msymbol
;
280 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile
-> name
);
281 if (objfile
-> minimal_symbol_count
== 0)
283 fprintf_filtered (outfile
, "No minimal symbols found.\n");
286 for (index
= 0, msymbol
= objfile
-> msymbols
;
287 SYMBOL_NAME (msymbol
) != NULL
; msymbol
++, index
++)
289 switch (msymbol
-> type
)
297 case mst_solib_trampoline
:
322 fprintf_filtered (outfile
, "[%2d] %c ", index
, ms_type
);
323 print_address_numeric (SYMBOL_VALUE_ADDRESS (msymbol
), 1, outfile
);
324 fprintf_filtered (outfile
, " %s", SYMBOL_NAME (msymbol
));
325 if (SYMBOL_BFD_SECTION (msymbol
))
326 fprintf_filtered (outfile
, " section %s",
327 bfd_section_name (objfile
->obfd
,
328 SYMBOL_BFD_SECTION (msymbol
)));
329 if (SYMBOL_DEMANGLED_NAME (msymbol
) != NULL
)
331 fprintf_filtered (outfile
, " %s", SYMBOL_DEMANGLED_NAME (msymbol
));
333 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
334 if (msymbol
->filename
)
335 fprintf_filtered (outfile
, " %s", msymbol
->filename
);
337 fputs_filtered ("\n", outfile
);
339 if (objfile
-> minimal_symbol_count
!= index
)
341 warning ("internal error: minimal symbol count %d != %d",
342 objfile
-> minimal_symbol_count
, index
);
344 fprintf_filtered (outfile
, "\n");
348 dump_psymtab (objfile
, psymtab
, outfile
)
349 struct objfile
*objfile
;
350 struct partial_symtab
*psymtab
;
355 fprintf_filtered (outfile
, "\nPartial symtab for source file %s ",
356 psymtab
-> filename
);
357 fprintf_filtered (outfile
, "(object ");
358 gdb_print_address (psymtab
, outfile
);
359 fprintf_filtered (outfile
, ")\n\n");
360 fprintf_unfiltered (outfile
, " Read from object file %s (",
362 gdb_print_address (objfile
, outfile
);
363 fprintf_unfiltered (outfile
, ")\n");
365 if (psymtab
-> readin
)
367 fprintf_filtered (outfile
,
368 " Full symtab was read (at ");
369 gdb_print_address (psymtab
->symtab
, outfile
);
370 fprintf_filtered (outfile
, " by function at ");
371 gdb_print_address ((PTR
)psymtab
->read_symtab
, outfile
);
372 fprintf_filtered (outfile
, ")\n");
375 fprintf_filtered (outfile
, " Relocate symbols by ");
376 for (i
= 0; i
< psymtab
->objfile
->num_sections
; ++i
)
379 fprintf_filtered (outfile
, ", ");
381 print_address_numeric (ANOFFSET (psymtab
->section_offsets
, i
),
385 fprintf_filtered (outfile
, "\n");
387 fprintf_filtered (outfile
, " Symbols cover text addresses ");
388 print_address_numeric (psymtab
->textlow
, 1, outfile
);
389 fprintf_filtered (outfile
, "-");
390 print_address_numeric (psymtab
->texthigh
, 1, outfile
);
391 fprintf_filtered (outfile
, "\n");
392 fprintf_filtered (outfile
, " Depends on %d other partial symtabs.\n",
393 psymtab
-> number_of_dependencies
);
394 for (i
= 0; i
< psymtab
-> number_of_dependencies
; i
++)
396 fprintf_filtered (outfile
, " %d ", i
);
397 gdb_print_address (psymtab
-> dependencies
[i
], outfile
);
398 fprintf_filtered (outfile
, " %s\n",
399 psymtab
-> dependencies
[i
] -> filename
);
401 if (psymtab
-> n_global_syms
> 0)
403 print_partial_symbols (objfile
-> global_psymbols
.list
404 + psymtab
-> globals_offset
,
405 psymtab
-> n_global_syms
, "Global", outfile
);
407 if (psymtab
-> n_static_syms
> 0)
409 print_partial_symbols (objfile
-> static_psymbols
.list
410 + psymtab
-> statics_offset
,
411 psymtab
-> n_static_syms
, "Static", outfile
);
413 fprintf_filtered (outfile
, "\n");
417 dump_symtab (objfile
, symtab
, outfile
)
418 struct objfile
*objfile
;
419 struct symtab
*symtab
;
424 register struct linetable
*l
;
425 struct blockvector
*bv
;
426 register struct block
*b
;
429 fprintf_filtered (outfile
, "\nSymtab for file %s\n", symtab
->filename
);
431 fprintf_filtered (outfile
, "Compilation directory is %s\n",
433 fprintf_filtered (outfile
, "Read from object file %s (", objfile
->name
);
434 gdb_print_address (objfile
, outfile
);
435 fprintf_filtered (outfile
, ")\n");
436 fprintf_filtered (outfile
, "Language: %s\n", language_str (symtab
->language
));
438 /* First print the line table. */
439 l
= LINETABLE (symtab
);
442 fprintf_filtered (outfile
, "\nLine table:\n\n");
444 for (i
= 0; i
< len
; i
++)
446 fprintf_filtered (outfile
, " line %d at ", l
->item
[i
].line
);
447 print_address_numeric (l
->item
[i
].pc
, 1, outfile
);
448 fprintf_filtered (outfile
, "\n");
451 /* Now print the block info, but only for primary symtabs since we will
452 print lots of duplicate info otherwise. */
453 if (symtab
-> primary
)
455 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
456 bv
= BLOCKVECTOR (symtab
);
457 len
= BLOCKVECTOR_NBLOCKS (bv
);
458 for (i
= 0; i
< len
; i
++)
460 b
= BLOCKVECTOR_BLOCK (bv
, i
);
461 depth
= block_depth (b
) * 2;
462 print_spaces (depth
, outfile
);
463 fprintf_filtered (outfile
, "block #%03d, object at ", i
);
464 gdb_print_address (b
, outfile
);
465 if (BLOCK_SUPERBLOCK (b
))
467 fprintf_filtered (outfile
, " under ");
468 gdb_print_address (BLOCK_SUPERBLOCK (b
), outfile
);
470 blen
= BLOCK_NSYMS (b
);
471 fprintf_filtered (outfile
, ", %d syms in ", blen
);
472 print_address_numeric (BLOCK_START (b
), 1, outfile
);
473 fprintf_filtered (outfile
, "..");
474 print_address_numeric (BLOCK_END (b
), 1, outfile
);
475 if (BLOCK_FUNCTION (b
))
477 fprintf_filtered (outfile
, ", function %s", SYMBOL_NAME (BLOCK_FUNCTION (b
)));
478 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)) != NULL
)
480 fprintf_filtered (outfile
, ", %s",
481 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)));
484 if (BLOCK_GCC_COMPILED(b
))
485 fprintf_filtered (outfile
, ", compiled with gcc%d", BLOCK_GCC_COMPILED(b
));
486 fprintf_filtered (outfile
, "\n");
487 /* Now print each symbol in this block */
488 for (j
= 0; j
< blen
; j
++)
490 struct print_symbol_args s
;
491 s
.symbol
= BLOCK_SYM (b
, j
);
494 catch_errors (print_symbol
, &s
, "Error printing symbol:\n",
498 fprintf_filtered (outfile
, "\n");
502 fprintf_filtered (outfile
, "\nBlockvector same as previous symtab\n\n");
507 maintenance_print_symbols (args
, from_tty
)
513 struct cleanup
*cleanups
;
514 char *symname
= NULL
;
515 char *filename
= DEV_TTY
;
516 struct objfile
*objfile
;
524 Arguments missing: an output file name and an optional symbol file name");
526 else if ((argv
= buildargv (args
)) == NULL
)
530 cleanups
= make_cleanup ((make_cleanup_func
) freeargv
, (char *) argv
);
535 /* If a second arg is supplied, it is a source file name to match on */
542 filename
= tilde_expand (filename
);
543 make_cleanup (free
, filename
);
545 outfile
= gdb_fopen (filename
, FOPEN_WT
);
547 perror_with_name (filename
);
548 make_cleanup ((make_cleanup_func
) gdb_fclose
, (char *) &outfile
);
551 ALL_SYMTABS (objfile
, s
)
552 if (symname
== NULL
|| (STREQ (symname
, s
-> filename
)))
553 dump_symtab (objfile
, s
, outfile
);
555 do_cleanups (cleanups
);
558 /* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
559 far to indent. ARGS is really a struct print_symbol_args *, but is
560 declared as char * to get it past catch_errors. Returns 0 for error,
567 struct symbol
*symbol
= ((struct print_symbol_args
*)args
)->symbol
;
568 int depth
= ((struct print_symbol_args
*)args
)->depth
;
569 GDB_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_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 (args
, from_tty
)
751 struct cleanup
*cleanups
;
752 char *symname
= NULL
;
753 char *filename
= DEV_TTY
;
754 struct objfile
*objfile
;
755 struct partial_symtab
*ps
;
761 error ("print-psymbols takes an output file name and optional symbol file name");
763 else if ((argv
= buildargv (args
)) == NULL
)
767 cleanups
= make_cleanup ((make_cleanup_func
) freeargv
, (char *) argv
);
772 /* If a second arg is supplied, it is a source file name to match on */
779 filename
= tilde_expand (filename
);
780 make_cleanup (free
, filename
);
782 outfile
= gdb_fopen (filename
, FOPEN_WT
);
784 perror_with_name (filename
);
785 make_cleanup ((make_cleanup_func
) gdb_fclose
, &outfile
);
788 ALL_PSYMTABS (objfile
, ps
)
789 if (symname
== NULL
|| (STREQ (symname
, ps
-> filename
)))
790 dump_psymtab (objfile
, ps
, outfile
);
792 do_cleanups (cleanups
);
796 print_partial_symbols (p
, count
, what
, outfile
)
797 struct partial_symbol
**p
;
802 fprintf_filtered (outfile
, " %s partial symbols:\n", what
);
805 fprintf_filtered (outfile
, " `%s'", SYMBOL_NAME(*p
));
806 if (SYMBOL_DEMANGLED_NAME (*p
) != NULL
)
808 fprintf_filtered (outfile
, " `%s'", SYMBOL_DEMANGLED_NAME (*p
));
810 fputs_filtered (", ", outfile
);
811 switch (SYMBOL_NAMESPACE (*p
))
813 case UNDEF_NAMESPACE
:
814 fputs_filtered ("undefined namespace, ", outfile
);
817 /* This is the usual thing -- don't print it */
819 case STRUCT_NAMESPACE
:
820 fputs_filtered ("struct namespace, ", outfile
);
822 case LABEL_NAMESPACE
:
823 fputs_filtered ("label namespace, ", outfile
);
826 fputs_filtered ("<invalid namespace>, ", outfile
);
829 switch (SYMBOL_CLASS (*p
))
832 fputs_filtered ("undefined", outfile
);
835 fputs_filtered ("constant int", outfile
);
838 fputs_filtered ("static", outfile
);
841 fputs_filtered ("extern global", outfile
);
844 fputs_filtered ("register", outfile
);
847 fputs_filtered ("pass by value", outfile
);
850 fputs_filtered ("pass by reference", outfile
);
853 fputs_filtered ("register parameter", outfile
);
855 case LOC_REGPARM_ADDR
:
856 fputs_filtered ("register address parameter", outfile
);
859 fputs_filtered ("stack parameter", outfile
);
862 fputs_filtered ("type", outfile
);
865 fputs_filtered ("label", outfile
);
868 fputs_filtered ("function", outfile
);
870 case LOC_CONST_BYTES
:
871 fputs_filtered ("constant bytes", outfile
);
874 fputs_filtered ("shuffled arg", outfile
);
877 fputs_filtered ("unresolved", outfile
);
879 case LOC_OPTIMIZED_OUT
:
880 fputs_filtered ("optimized out", outfile
);
883 fputs_filtered ("<invalid location>", outfile
);
886 fputs_filtered (", ", outfile
);
887 print_address_numeric (SYMBOL_VALUE_ADDRESS (*p
), 1, outfile
);
888 fprintf_filtered (outfile
, "\n");
894 maintenance_print_msymbols (args
, from_tty
)
900 struct cleanup
*cleanups
;
901 char *filename
= DEV_TTY
;
902 char *symname
= NULL
;
903 struct objfile
*objfile
;
909 error ("print-msymbols takes an output file name and optional symbol file name");
911 else if ((argv
= buildargv (args
)) == NULL
)
915 cleanups
= make_cleanup ((make_cleanup_func
) freeargv
, argv
);
920 /* If a second arg is supplied, it is a source file name to match on */
927 filename
= tilde_expand (filename
);
928 make_cleanup (free
, filename
);
930 outfile
= gdb_fopen (filename
, FOPEN_WT
);
932 perror_with_name (filename
);
933 make_cleanup ((make_cleanup_func
) gdb_fclose
, &outfile
);
936 ALL_OBJFILES (objfile
)
937 if (symname
== NULL
|| (STREQ (symname
, objfile
-> name
)))
938 dump_msymbols (objfile
, outfile
);
940 fprintf_filtered (outfile
, "\n\n");
941 do_cleanups (cleanups
);
945 maintenance_print_objfiles (ignore
, from_tty
)
949 struct objfile
*objfile
;
954 ALL_OBJFILES (objfile
)
955 dump_objfile (objfile
);
959 /* Check consistency of psymtabs and symtabs. */
962 maintenance_check_symtabs (ignore
, from_tty
)
966 register struct symbol
*sym
;
967 register struct partial_symbol
**psym
;
968 register struct symtab
*s
= NULL
;
969 register struct partial_symtab
*ps
;
970 struct blockvector
*bv
;
971 register struct objfile
*objfile
;
972 register struct block
*b
;
975 ALL_PSYMTABS (objfile
, ps
)
977 s
= PSYMTAB_TO_SYMTAB(ps
);
980 bv
= BLOCKVECTOR (s
);
981 b
= BLOCKVECTOR_BLOCK (bv
, STATIC_BLOCK
);
982 psym
= ps
->objfile
->static_psymbols
.list
+ ps
->statics_offset
;
983 length
= ps
->n_static_syms
;
986 sym
= lookup_block_symbol (b
, SYMBOL_NAME (*psym
),
987 SYMBOL_NAMESPACE (*psym
));
990 printf_filtered ("Static symbol `");
991 puts_filtered (SYMBOL_NAME (*psym
));
992 printf_filtered ("' only found in ");
993 puts_filtered (ps
->filename
);
994 printf_filtered (" psymtab\n");
998 b
= BLOCKVECTOR_BLOCK (bv
, GLOBAL_BLOCK
);
999 psym
= ps
->objfile
->global_psymbols
.list
+ ps
->globals_offset
;
1000 length
= ps
->n_global_syms
;
1003 sym
= lookup_block_symbol (b
, SYMBOL_NAME (*psym
),
1004 SYMBOL_NAMESPACE (*psym
));
1007 printf_filtered ("Global symbol `");
1008 puts_filtered (SYMBOL_NAME (*psym
));
1009 printf_filtered ("' only found in ");
1010 puts_filtered (ps
->filename
);
1011 printf_filtered (" psymtab\n");
1015 if (ps
->texthigh
< ps
->textlow
)
1017 printf_filtered ("Psymtab ");
1018 puts_filtered (ps
->filename
);
1019 printf_filtered (" covers bad range ");
1020 print_address_numeric (ps
->textlow
, 1, stdout
);
1021 printf_filtered (" - ");
1022 print_address_numeric (ps
->texthigh
, 1, stdout
);
1023 printf_filtered ("\n");
1026 if (ps
->texthigh
== 0)
1028 if (ps
->textlow
< BLOCK_START (b
) || ps
->texthigh
> BLOCK_END (b
))
1030 printf_filtered ("Psymtab ");
1031 puts_filtered (ps
->filename
);
1032 printf_filtered (" covers ");
1033 print_address_numeric (ps
->textlow
, 1, stdout
);
1034 printf_filtered (" - ");
1035 print_address_numeric (ps
->texthigh
, 1, stdout
);
1036 printf_filtered (" but symtab covers only ");
1037 print_address_numeric (BLOCK_START (b
), 1, stdout
);
1038 printf_filtered (" - ");
1039 print_address_numeric (BLOCK_END (b
), 1, stdout
);
1040 printf_filtered ("\n");
1046 /* Return the nexting depth of a block within other blocks in its symtab. */
1050 struct block
*block
;
1053 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
1060 #endif /* MAINTENANCE_CMDS */
1063 /* Increase the space allocated for LISTP, which is probably
1064 global_psymbols or static_psymbols. This space will eventually
1065 be freed in free_objfile(). */
1068 extend_psymbol_list (listp
, objfile
)
1069 register struct psymbol_allocation_list
*listp
;
1070 struct objfile
*objfile
;
1073 if (listp
->size
== 0)
1076 listp
->list
= (struct partial_symbol
**)
1077 xmmalloc (objfile
-> md
, new_size
* sizeof (struct partial_symbol
*));
1081 new_size
= listp
->size
* 2;
1082 listp
->list
= (struct partial_symbol
**)
1083 xmrealloc (objfile
-> md
, (char *) listp
->list
,
1084 new_size
* sizeof (struct partial_symbol
*));
1086 /* Next assumes we only went one over. Should be good if
1087 program works correctly */
1088 listp
->next
= listp
->list
+ listp
->size
;
1089 listp
->size
= new_size
;
1093 /* Do early runtime initializations. */
1095 _initialize_symmisc ()