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 mfree (objfile
->md
, SYMBOL_NAME (BLOCK_SYM (b
, i
)));
93 mfree (objfile
->md
, (PTR
) BLOCK_SYM (b
, i
));
95 mfree (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 mfree (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 mfree (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 mfree (s
->objfile
->md
, s
->free_ptr
);
145 /* Free source-related stuff */
146 if (s
->line_charpos
!= NULL
)
147 mfree (s
->objfile
->md
, (PTR
) s
->line_charpos
);
148 if (s
->fullname
!= NULL
)
149 mfree (s
->objfile
->md
, s
->fullname
);
150 if (s
->debugformat
!= NULL
)
151 mfree (s
->objfile
->md
, s
->debugformat
);
152 mfree (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 symbol obstack: %d\n",
201 obstack_memory_used (&objfile
->symbol_obstack
));
202 printf_filtered (" Total memory used for type obstack: %d\n",
203 obstack_memory_used (&objfile
->type_obstack
));
209 dump_objfile (struct objfile
*objfile
)
211 struct symtab
*symtab
;
212 struct partial_symtab
*psymtab
;
214 printf_filtered ("\nObject file %s: ", objfile
->name
);
215 printf_filtered ("Objfile at ");
216 gdb_print_host_address (objfile
, gdb_stdout
);
217 printf_filtered (", bfd at ");
218 gdb_print_host_address (objfile
->obfd
, gdb_stdout
);
219 printf_filtered (", %d minsyms\n\n",
220 objfile
->minimal_symbol_count
);
222 if (objfile
->psymtabs
)
224 printf_filtered ("Psymtabs:\n");
225 for (psymtab
= objfile
->psymtabs
;
227 psymtab
= psymtab
->next
)
229 printf_filtered ("%s at ",
231 gdb_print_host_address (psymtab
, gdb_stdout
);
232 printf_filtered (", ");
233 if (psymtab
->objfile
!= objfile
)
235 printf_filtered ("NOT ON CHAIN! ");
239 printf_filtered ("\n\n");
242 if (objfile
->symtabs
)
244 printf_filtered ("Symtabs:\n");
245 for (symtab
= objfile
->symtabs
;
247 symtab
= symtab
->next
)
249 printf_filtered ("%s at ", symtab
->filename
);
250 gdb_print_host_address (symtab
, gdb_stdout
);
251 printf_filtered (", ");
252 if (symtab
->objfile
!= objfile
)
254 printf_filtered ("NOT ON CHAIN! ");
258 printf_filtered ("\n\n");
262 /* Print minimal symbols from this objfile. */
265 dump_msymbols (struct objfile
*objfile
, struct ui_file
*outfile
)
267 struct minimal_symbol
*msymbol
;
271 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile
->name
);
272 if (objfile
->minimal_symbol_count
== 0)
274 fprintf_filtered (outfile
, "No minimal symbols found.\n");
277 for (index
= 0, msymbol
= objfile
->msymbols
;
278 SYMBOL_NAME (msymbol
) != NULL
; msymbol
++, index
++)
280 switch (msymbol
->type
)
288 case mst_solib_trampoline
:
313 fprintf_filtered (outfile
, "[%2d] %c ", index
, ms_type
);
314 print_address_numeric (SYMBOL_VALUE_ADDRESS (msymbol
), 1, outfile
);
315 fprintf_filtered (outfile
, " %s", SYMBOL_NAME (msymbol
));
316 if (SYMBOL_BFD_SECTION (msymbol
))
317 fprintf_filtered (outfile
, " section %s",
318 bfd_section_name (objfile
->obfd
,
319 SYMBOL_BFD_SECTION (msymbol
)));
320 if (SYMBOL_DEMANGLED_NAME (msymbol
) != NULL
)
322 fprintf_filtered (outfile
, " %s", SYMBOL_DEMANGLED_NAME (msymbol
));
324 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
325 if (msymbol
->filename
)
326 fprintf_filtered (outfile
, " %s", msymbol
->filename
);
328 fputs_filtered ("\n", outfile
);
330 if (objfile
->minimal_symbol_count
!= index
)
332 warning ("internal error: minimal symbol count %d != %d",
333 objfile
->minimal_symbol_count
, index
);
335 fprintf_filtered (outfile
, "\n");
339 dump_psymtab (struct objfile
*objfile
, struct partial_symtab
*psymtab
,
340 struct ui_file
*outfile
)
344 fprintf_filtered (outfile
, "\nPartial symtab for source file %s ",
346 fprintf_filtered (outfile
, "(object ");
347 gdb_print_host_address (psymtab
, outfile
);
348 fprintf_filtered (outfile
, ")\n\n");
349 fprintf_unfiltered (outfile
, " Read from object file %s (",
351 gdb_print_host_address (objfile
, outfile
);
352 fprintf_unfiltered (outfile
, ")\n");
356 fprintf_filtered (outfile
,
357 " Full symtab was read (at ");
358 gdb_print_host_address (psymtab
->symtab
, outfile
);
359 fprintf_filtered (outfile
, " by function at ");
360 gdb_print_host_address ((PTR
) psymtab
->read_symtab
, outfile
);
361 fprintf_filtered (outfile
, ")\n");
364 fprintf_filtered (outfile
, " Relocate symbols by ");
365 for (i
= 0; i
< psymtab
->objfile
->num_sections
; ++i
)
368 fprintf_filtered (outfile
, ", ");
370 print_address_numeric (ANOFFSET (psymtab
->section_offsets
, i
),
374 fprintf_filtered (outfile
, "\n");
376 fprintf_filtered (outfile
, " Symbols cover text addresses ");
377 print_address_numeric (psymtab
->textlow
, 1, outfile
);
378 fprintf_filtered (outfile
, "-");
379 print_address_numeric (psymtab
->texthigh
, 1, outfile
);
380 fprintf_filtered (outfile
, "\n");
381 fprintf_filtered (outfile
, " Depends on %d other partial symtabs.\n",
382 psymtab
->number_of_dependencies
);
383 for (i
= 0; i
< psymtab
->number_of_dependencies
; i
++)
385 fprintf_filtered (outfile
, " %d ", i
);
386 gdb_print_host_address (psymtab
->dependencies
[i
], outfile
);
387 fprintf_filtered (outfile
, " %s\n",
388 psymtab
->dependencies
[i
]->filename
);
390 if (psymtab
->n_global_syms
> 0)
392 print_partial_symbols (objfile
->global_psymbols
.list
393 + psymtab
->globals_offset
,
394 psymtab
->n_global_syms
, "Global", outfile
);
396 if (psymtab
->n_static_syms
> 0)
398 print_partial_symbols (objfile
->static_psymbols
.list
399 + psymtab
->statics_offset
,
400 psymtab
->n_static_syms
, "Static", outfile
);
402 fprintf_filtered (outfile
, "\n");
406 dump_symtab (struct objfile
*objfile
, struct symtab
*symtab
,
407 struct ui_file
*outfile
)
411 register struct linetable
*l
;
412 struct blockvector
*bv
;
414 register struct block
*b
;
417 fprintf_filtered (outfile
, "\nSymtab for file %s\n", symtab
->filename
);
419 fprintf_filtered (outfile
, "Compilation directory is %s\n",
421 fprintf_filtered (outfile
, "Read from object file %s (", objfile
->name
);
422 gdb_print_host_address (objfile
, outfile
);
423 fprintf_filtered (outfile
, ")\n");
424 fprintf_filtered (outfile
, "Language: %s\n", language_str (symtab
->language
));
426 /* First print the line table. */
427 l
= LINETABLE (symtab
);
430 fprintf_filtered (outfile
, "\nLine table:\n\n");
432 for (i
= 0; i
< len
; i
++)
434 fprintf_filtered (outfile
, " line %d at ", l
->item
[i
].line
);
435 print_address_numeric (l
->item
[i
].pc
, 1, outfile
);
436 fprintf_filtered (outfile
, "\n");
439 /* Now print the block info, but only for primary symtabs since we will
440 print lots of duplicate info otherwise. */
443 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
444 bv
= BLOCKVECTOR (symtab
);
445 len
= BLOCKVECTOR_NBLOCKS (bv
);
446 for (i
= 0; i
< len
; i
++)
448 b
= BLOCKVECTOR_BLOCK (bv
, i
);
449 depth
= block_depth (b
) * 2;
450 print_spaces (depth
, outfile
);
451 fprintf_filtered (outfile
, "block #%03d, object at ", i
);
452 gdb_print_host_address (b
, outfile
);
453 if (BLOCK_SUPERBLOCK (b
))
455 fprintf_filtered (outfile
, " under ");
456 gdb_print_host_address (BLOCK_SUPERBLOCK (b
), outfile
);
458 blen
= BLOCK_NSYMS (b
);
459 fprintf_filtered (outfile
, ", %d syms in ", blen
);
460 print_address_numeric (BLOCK_START (b
), 1, outfile
);
461 fprintf_filtered (outfile
, "..");
462 print_address_numeric (BLOCK_END (b
), 1, outfile
);
463 if (BLOCK_FUNCTION (b
))
465 fprintf_filtered (outfile
, ", function %s", SYMBOL_NAME (BLOCK_FUNCTION (b
)));
466 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)) != NULL
)
468 fprintf_filtered (outfile
, ", %s",
469 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)));
472 if (BLOCK_GCC_COMPILED (b
))
473 fprintf_filtered (outfile
, ", compiled with gcc%d", BLOCK_GCC_COMPILED (b
));
474 fprintf_filtered (outfile
, "\n");
475 /* Now print each symbol in this block. */
477 ALL_BLOCK_SYMBOLS (b
, j
, sym
)
479 struct print_symbol_args s
;
483 catch_errors (print_symbol
, &s
, "Error printing symbol:\n",
487 fprintf_filtered (outfile
, "\n");
491 fprintf_filtered (outfile
, "\nBlockvector same as previous symtab\n\n");
496 maintenance_print_symbols (char *args
, int from_tty
)
499 struct ui_file
*outfile
;
500 struct cleanup
*cleanups
;
501 char *symname
= NULL
;
502 char *filename
= DEV_TTY
;
503 struct objfile
*objfile
;
511 Arguments missing: an output file name and an optional symbol file name");
513 else if ((argv
= buildargv (args
)) == NULL
)
517 cleanups
= make_cleanup_freeargv (argv
);
522 /* If a second arg is supplied, it is a source file name to match on */
529 filename
= tilde_expand (filename
);
530 make_cleanup (xfree
, filename
);
532 outfile
= gdb_fopen (filename
, FOPEN_WT
);
534 perror_with_name (filename
);
535 make_cleanup_ui_file_delete (outfile
);
538 ALL_SYMTABS (objfile
, s
)
539 if (symname
== NULL
|| (STREQ (symname
, s
->filename
)))
540 dump_symtab (objfile
, s
, outfile
);
542 do_cleanups (cleanups
);
545 /* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
546 far to indent. ARGS is really a struct print_symbol_args *, but is
547 declared as char * to get it past catch_errors. Returns 0 for error,
551 print_symbol (PTR args
)
553 struct symbol
*symbol
= ((struct print_symbol_args
*) args
)->symbol
;
554 int depth
= ((struct print_symbol_args
*) args
)->depth
;
555 struct ui_file
*outfile
= ((struct print_symbol_args
*) args
)->outfile
;
557 print_spaces (depth
, outfile
);
558 if (SYMBOL_NAMESPACE (symbol
) == LABEL_NAMESPACE
)
560 fprintf_filtered (outfile
, "label %s at ", SYMBOL_SOURCE_NAME (symbol
));
561 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
562 if (SYMBOL_BFD_SECTION (symbol
))
563 fprintf_filtered (outfile
, " section %s\n",
564 bfd_section_name (SYMBOL_BFD_SECTION (symbol
)->owner
,
565 SYMBOL_BFD_SECTION (symbol
)));
567 fprintf_filtered (outfile
, "\n");
570 if (SYMBOL_NAMESPACE (symbol
) == STRUCT_NAMESPACE
)
572 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol
)))
574 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
578 fprintf_filtered (outfile
, "%s %s = ",
579 (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_ENUM
581 : (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_STRUCT
582 ? "struct" : "union")),
583 SYMBOL_NAME (symbol
));
584 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
586 fprintf_filtered (outfile
, ";\n");
590 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
591 fprintf_filtered (outfile
, "typedef ");
592 if (SYMBOL_TYPE (symbol
))
594 /* Print details of types, except for enums where it's clutter. */
595 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), SYMBOL_SOURCE_NAME (symbol
),
597 TYPE_CODE (SYMBOL_TYPE (symbol
)) != TYPE_CODE_ENUM
,
599 fprintf_filtered (outfile
, "; ");
602 fprintf_filtered (outfile
, "%s ", SYMBOL_SOURCE_NAME (symbol
));
604 switch (SYMBOL_CLASS (symbol
))
607 fprintf_filtered (outfile
, "const %ld (0x%lx)",
608 SYMBOL_VALUE (symbol
),
609 SYMBOL_VALUE (symbol
));
612 case LOC_CONST_BYTES
:
615 struct type
*type
= check_typedef (SYMBOL_TYPE (symbol
));
616 fprintf_filtered (outfile
, "const %u hex bytes:",
618 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
619 fprintf_filtered (outfile
, " %02x",
620 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
625 fprintf_filtered (outfile
, "static at ");
626 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
627 if (SYMBOL_BFD_SECTION (symbol
))
628 fprintf_filtered (outfile
, " section %s",
630 (SYMBOL_BFD_SECTION (symbol
)->owner
,
631 SYMBOL_BFD_SECTION (symbol
)));
635 fprintf_filtered (outfile
, "extern global at *(");
636 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
637 fprintf_filtered (outfile
, "),");
641 fprintf_filtered (outfile
, "register %ld", SYMBOL_VALUE (symbol
));
645 fprintf_filtered (outfile
, "arg at offset 0x%lx",
646 SYMBOL_VALUE (symbol
));
650 fprintf_filtered (outfile
, "arg at offset 0x%lx from fp",
651 SYMBOL_VALUE (symbol
));
655 fprintf_filtered (outfile
, "reference arg at 0x%lx", SYMBOL_VALUE (symbol
));
659 fprintf_filtered (outfile
, "parameter register %ld", SYMBOL_VALUE (symbol
));
662 case LOC_REGPARM_ADDR
:
663 fprintf_filtered (outfile
, "address parameter register %ld", SYMBOL_VALUE (symbol
));
667 fprintf_filtered (outfile
, "local at offset 0x%lx",
668 SYMBOL_VALUE (symbol
));
672 fprintf_filtered (outfile
, "local at 0x%lx from register %d",
673 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
676 case LOC_BASEREG_ARG
:
677 fprintf_filtered (outfile
, "arg at 0x%lx from register %d",
678 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
685 fprintf_filtered (outfile
, "label at ");
686 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
687 if (SYMBOL_BFD_SECTION (symbol
))
688 fprintf_filtered (outfile
, " section %s",
690 (SYMBOL_BFD_SECTION (symbol
)->owner
,
691 SYMBOL_BFD_SECTION (symbol
)));
695 fprintf_filtered (outfile
, "block object ");
696 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol
), outfile
);
697 fprintf_filtered (outfile
, ", ");
698 print_address_numeric (BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
)),
701 fprintf_filtered (outfile
, "..");
702 print_address_numeric (BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
)),
705 if (SYMBOL_BFD_SECTION (symbol
))
706 fprintf_filtered (outfile
, " section %s",
708 (SYMBOL_BFD_SECTION (symbol
)->owner
,
709 SYMBOL_BFD_SECTION (symbol
)));
713 fprintf_filtered (outfile
, "unresolved");
716 case LOC_OPTIMIZED_OUT
:
717 fprintf_filtered (outfile
, "optimized out");
721 fprintf_filtered (outfile
, "botched symbol class %x",
722 SYMBOL_CLASS (symbol
));
726 fprintf_filtered (outfile
, "\n");
731 maintenance_print_psymbols (char *args
, int from_tty
)
734 struct ui_file
*outfile
;
735 struct cleanup
*cleanups
;
736 char *symname
= NULL
;
737 char *filename
= DEV_TTY
;
738 struct objfile
*objfile
;
739 struct partial_symtab
*ps
;
745 error ("print-psymbols takes an output file name and optional symbol file name");
747 else if ((argv
= buildargv (args
)) == NULL
)
751 cleanups
= make_cleanup_freeargv (argv
);
756 /* If a second arg is supplied, it is a source file name to match on */
763 filename
= tilde_expand (filename
);
764 make_cleanup (xfree
, filename
);
766 outfile
= gdb_fopen (filename
, FOPEN_WT
);
768 perror_with_name (filename
);
769 make_cleanup_ui_file_delete (outfile
);
772 ALL_PSYMTABS (objfile
, ps
)
773 if (symname
== NULL
|| (STREQ (symname
, ps
->filename
)))
774 dump_psymtab (objfile
, ps
, outfile
);
776 do_cleanups (cleanups
);
780 print_partial_symbols (struct partial_symbol
**p
, int count
, char *what
,
781 struct ui_file
*outfile
)
783 fprintf_filtered (outfile
, " %s partial symbols:\n", what
);
786 fprintf_filtered (outfile
, " `%s'", SYMBOL_NAME (*p
));
787 if (SYMBOL_DEMANGLED_NAME (*p
) != NULL
)
789 fprintf_filtered (outfile
, " `%s'", SYMBOL_DEMANGLED_NAME (*p
));
791 fputs_filtered (", ", outfile
);
792 switch (SYMBOL_NAMESPACE (*p
))
794 case UNDEF_NAMESPACE
:
795 fputs_filtered ("undefined namespace, ", outfile
);
798 /* This is the usual thing -- don't print it */
800 case STRUCT_NAMESPACE
:
801 fputs_filtered ("struct namespace, ", outfile
);
803 case LABEL_NAMESPACE
:
804 fputs_filtered ("label namespace, ", outfile
);
807 fputs_filtered ("<invalid namespace>, ", outfile
);
810 switch (SYMBOL_CLASS (*p
))
813 fputs_filtered ("undefined", outfile
);
816 fputs_filtered ("constant int", outfile
);
819 fputs_filtered ("static", outfile
);
822 fputs_filtered ("extern global", outfile
);
825 fputs_filtered ("register", outfile
);
828 fputs_filtered ("pass by value", outfile
);
831 fputs_filtered ("pass by reference", outfile
);
834 fputs_filtered ("register parameter", outfile
);
836 case LOC_REGPARM_ADDR
:
837 fputs_filtered ("register address parameter", outfile
);
840 fputs_filtered ("stack parameter", outfile
);
843 fputs_filtered ("type", outfile
);
846 fputs_filtered ("label", outfile
);
849 fputs_filtered ("function", outfile
);
851 case LOC_CONST_BYTES
:
852 fputs_filtered ("constant bytes", outfile
);
855 fputs_filtered ("shuffled arg", outfile
);
858 fputs_filtered ("unresolved", outfile
);
860 case LOC_OPTIMIZED_OUT
:
861 fputs_filtered ("optimized out", outfile
);
864 fputs_filtered ("<invalid location>", outfile
);
867 fputs_filtered (", ", outfile
);
868 print_address_numeric (SYMBOL_VALUE_ADDRESS (*p
), 1, outfile
);
869 fprintf_filtered (outfile
, "\n");
875 maintenance_print_msymbols (char *args
, int from_tty
)
878 struct ui_file
*outfile
;
879 struct cleanup
*cleanups
;
880 char *filename
= DEV_TTY
;
881 char *symname
= NULL
;
882 struct objfile
*objfile
;
888 error ("print-msymbols takes an output file name and optional symbol file name");
890 else if ((argv
= buildargv (args
)) == NULL
)
894 cleanups
= make_cleanup_freeargv (argv
);
899 /* If a second arg is supplied, it is a source file name to match on */
906 filename
= tilde_expand (filename
);
907 make_cleanup (xfree
, filename
);
909 outfile
= gdb_fopen (filename
, FOPEN_WT
);
911 perror_with_name (filename
);
912 make_cleanup_ui_file_delete (outfile
);
915 ALL_OBJFILES (objfile
)
916 if (symname
== NULL
|| (STREQ (symname
, objfile
->name
)))
917 dump_msymbols (objfile
, outfile
);
919 fprintf_filtered (outfile
, "\n\n");
920 do_cleanups (cleanups
);
924 maintenance_print_objfiles (char *ignore
, int from_tty
)
926 struct objfile
*objfile
;
931 ALL_OBJFILES (objfile
)
932 dump_objfile (objfile
);
936 /* Check consistency of psymtabs and symtabs. */
939 maintenance_check_symtabs (char *ignore
, int from_tty
)
941 register struct symbol
*sym
;
942 register struct partial_symbol
**psym
;
943 register struct symtab
*s
= NULL
;
944 register struct partial_symtab
*ps
;
945 struct blockvector
*bv
;
946 register struct objfile
*objfile
;
947 register struct block
*b
;
950 ALL_PSYMTABS (objfile
, ps
)
952 s
= PSYMTAB_TO_SYMTAB (ps
);
955 bv
= BLOCKVECTOR (s
);
956 b
= BLOCKVECTOR_BLOCK (bv
, STATIC_BLOCK
);
957 psym
= ps
->objfile
->static_psymbols
.list
+ ps
->statics_offset
;
958 length
= ps
->n_static_syms
;
961 sym
= lookup_block_symbol (b
, SYMBOL_NAME (*psym
),
962 SYMBOL_NAMESPACE (*psym
));
965 printf_filtered ("Static symbol `");
966 puts_filtered (SYMBOL_NAME (*psym
));
967 printf_filtered ("' only found in ");
968 puts_filtered (ps
->filename
);
969 printf_filtered (" psymtab\n");
973 b
= BLOCKVECTOR_BLOCK (bv
, GLOBAL_BLOCK
);
974 psym
= ps
->objfile
->global_psymbols
.list
+ ps
->globals_offset
;
975 length
= ps
->n_global_syms
;
978 sym
= lookup_block_symbol (b
, SYMBOL_NAME (*psym
),
979 SYMBOL_NAMESPACE (*psym
));
982 printf_filtered ("Global symbol `");
983 puts_filtered (SYMBOL_NAME (*psym
));
984 printf_filtered ("' only found in ");
985 puts_filtered (ps
->filename
);
986 printf_filtered (" psymtab\n");
990 if (ps
->texthigh
< ps
->textlow
)
992 printf_filtered ("Psymtab ");
993 puts_filtered (ps
->filename
);
994 printf_filtered (" covers bad range ");
995 print_address_numeric (ps
->textlow
, 1, gdb_stdout
);
996 printf_filtered (" - ");
997 print_address_numeric (ps
->texthigh
, 1, gdb_stdout
);
998 printf_filtered ("\n");
1001 if (ps
->texthigh
== 0)
1003 if (ps
->textlow
< BLOCK_START (b
) || ps
->texthigh
> BLOCK_END (b
))
1005 printf_filtered ("Psymtab ");
1006 puts_filtered (ps
->filename
);
1007 printf_filtered (" covers ");
1008 print_address_numeric (ps
->textlow
, 1, gdb_stdout
);
1009 printf_filtered (" - ");
1010 print_address_numeric (ps
->texthigh
, 1, gdb_stdout
);
1011 printf_filtered (" but symtab covers only ");
1012 print_address_numeric (BLOCK_START (b
), 1, gdb_stdout
);
1013 printf_filtered (" - ");
1014 print_address_numeric (BLOCK_END (b
), 1, gdb_stdout
);
1015 printf_filtered ("\n");
1021 /* Return the nexting depth of a block within other blocks in its symtab. */
1024 block_depth (struct block
*block
)
1027 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
1035 /* Increase the space allocated for LISTP, which is probably
1036 global_psymbols or static_psymbols. This space will eventually
1037 be freed in free_objfile(). */
1040 extend_psymbol_list (register struct psymbol_allocation_list
*listp
,
1041 struct objfile
*objfile
)
1044 if (listp
->size
== 0)
1047 listp
->list
= (struct partial_symbol
**)
1048 xmmalloc (objfile
->md
, new_size
* sizeof (struct partial_symbol
*));
1052 new_size
= listp
->size
* 2;
1053 listp
->list
= (struct partial_symbol
**)
1054 xmrealloc (objfile
->md
, (char *) listp
->list
,
1055 new_size
* sizeof (struct partial_symbol
*));
1057 /* Next assumes we only went one over. Should be good if
1058 program works correctly */
1059 listp
->next
= listp
->list
+ listp
->size
;
1060 listp
->size
= new_size
;
1064 /* Do early runtime initializations. */
1066 _initialize_symmisc (void)
This page took 0.069523 seconds and 4 git commands to generate.