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
;
413 register struct block
*b
;
416 fprintf_filtered (outfile
, "\nSymtab for file %s\n", symtab
->filename
);
418 fprintf_filtered (outfile
, "Compilation directory is %s\n",
420 fprintf_filtered (outfile
, "Read from object file %s (", objfile
->name
);
421 gdb_print_host_address (objfile
, outfile
);
422 fprintf_filtered (outfile
, ")\n");
423 fprintf_filtered (outfile
, "Language: %s\n", language_str (symtab
->language
));
425 /* First print the line table. */
426 l
= LINETABLE (symtab
);
429 fprintf_filtered (outfile
, "\nLine table:\n\n");
431 for (i
= 0; i
< len
; i
++)
433 fprintf_filtered (outfile
, " line %d at ", l
->item
[i
].line
);
434 print_address_numeric (l
->item
[i
].pc
, 1, outfile
);
435 fprintf_filtered (outfile
, "\n");
438 /* Now print the block info, but only for primary symtabs since we will
439 print lots of duplicate info otherwise. */
442 fprintf_filtered (outfile
, "\nBlockvector:\n\n");
443 bv
= BLOCKVECTOR (symtab
);
444 len
= BLOCKVECTOR_NBLOCKS (bv
);
445 for (i
= 0; i
< len
; i
++)
447 b
= BLOCKVECTOR_BLOCK (bv
, i
);
448 depth
= block_depth (b
) * 2;
449 print_spaces (depth
, outfile
);
450 fprintf_filtered (outfile
, "block #%03d, object at ", i
);
451 gdb_print_host_address (b
, outfile
);
452 if (BLOCK_SUPERBLOCK (b
))
454 fprintf_filtered (outfile
, " under ");
455 gdb_print_host_address (BLOCK_SUPERBLOCK (b
), outfile
);
457 blen
= BLOCK_NSYMS (b
);
458 fprintf_filtered (outfile
, ", %d syms in ", blen
);
459 print_address_numeric (BLOCK_START (b
), 1, outfile
);
460 fprintf_filtered (outfile
, "..");
461 print_address_numeric (BLOCK_END (b
), 1, outfile
);
462 if (BLOCK_FUNCTION (b
))
464 fprintf_filtered (outfile
, ", function %s", SYMBOL_NAME (BLOCK_FUNCTION (b
)));
465 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)) != NULL
)
467 fprintf_filtered (outfile
, ", %s",
468 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)));
471 if (BLOCK_GCC_COMPILED (b
))
472 fprintf_filtered (outfile
, ", compiled with gcc%d", BLOCK_GCC_COMPILED (b
));
473 fprintf_filtered (outfile
, "\n");
474 /* Now print each symbol in this block */
475 for (j
= 0; j
< blen
; j
++)
477 struct print_symbol_args s
;
478 s
.symbol
= BLOCK_SYM (b
, j
);
481 catch_errors (print_symbol
, &s
, "Error printing symbol:\n",
485 fprintf_filtered (outfile
, "\n");
489 fprintf_filtered (outfile
, "\nBlockvector same as previous symtab\n\n");
494 maintenance_print_symbols (char *args
, int from_tty
)
497 struct ui_file
*outfile
;
498 struct cleanup
*cleanups
;
499 char *symname
= NULL
;
500 char *filename
= DEV_TTY
;
501 struct objfile
*objfile
;
509 Arguments missing: an output file name and an optional symbol file name");
511 else if ((argv
= buildargv (args
)) == NULL
)
515 cleanups
= make_cleanup_freeargv (argv
);
520 /* If a second arg is supplied, it is a source file name to match on */
527 filename
= tilde_expand (filename
);
528 make_cleanup (xfree
, filename
);
530 outfile
= gdb_fopen (filename
, FOPEN_WT
);
532 perror_with_name (filename
);
533 make_cleanup_ui_file_delete (outfile
);
536 ALL_SYMTABS (objfile
, s
)
537 if (symname
== NULL
|| (STREQ (symname
, s
->filename
)))
538 dump_symtab (objfile
, s
, outfile
);
540 do_cleanups (cleanups
);
543 /* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
544 far to indent. ARGS is really a struct print_symbol_args *, but is
545 declared as char * to get it past catch_errors. Returns 0 for error,
549 print_symbol (PTR args
)
551 struct symbol
*symbol
= ((struct print_symbol_args
*) args
)->symbol
;
552 int depth
= ((struct print_symbol_args
*) args
)->depth
;
553 struct ui_file
*outfile
= ((struct print_symbol_args
*) args
)->outfile
;
555 print_spaces (depth
, outfile
);
556 if (SYMBOL_NAMESPACE (symbol
) == LABEL_NAMESPACE
)
558 fprintf_filtered (outfile
, "label %s at ", SYMBOL_SOURCE_NAME (symbol
));
559 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
560 if (SYMBOL_BFD_SECTION (symbol
))
561 fprintf_filtered (outfile
, " section %s\n",
562 bfd_section_name (SYMBOL_BFD_SECTION (symbol
)->owner
,
563 SYMBOL_BFD_SECTION (symbol
)));
565 fprintf_filtered (outfile
, "\n");
568 if (SYMBOL_NAMESPACE (symbol
) == STRUCT_NAMESPACE
)
570 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol
)))
572 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
576 fprintf_filtered (outfile
, "%s %s = ",
577 (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_ENUM
579 : (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_STRUCT
580 ? "struct" : "union")),
581 SYMBOL_NAME (symbol
));
582 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
584 fprintf_filtered (outfile
, ";\n");
588 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
589 fprintf_filtered (outfile
, "typedef ");
590 if (SYMBOL_TYPE (symbol
))
592 /* Print details of types, except for enums where it's clutter. */
593 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), SYMBOL_SOURCE_NAME (symbol
),
595 TYPE_CODE (SYMBOL_TYPE (symbol
)) != TYPE_CODE_ENUM
,
597 fprintf_filtered (outfile
, "; ");
600 fprintf_filtered (outfile
, "%s ", SYMBOL_SOURCE_NAME (symbol
));
602 switch (SYMBOL_CLASS (symbol
))
605 fprintf_filtered (outfile
, "const %ld (0x%lx)",
606 SYMBOL_VALUE (symbol
),
607 SYMBOL_VALUE (symbol
));
610 case LOC_CONST_BYTES
:
613 struct type
*type
= check_typedef (SYMBOL_TYPE (symbol
));
614 fprintf_filtered (outfile
, "const %u hex bytes:",
616 for (i
= 0; i
< TYPE_LENGTH (type
); i
++)
617 fprintf_filtered (outfile
, " %02x",
618 (unsigned) SYMBOL_VALUE_BYTES (symbol
)[i
]);
623 fprintf_filtered (outfile
, "static at ");
624 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
625 if (SYMBOL_BFD_SECTION (symbol
))
626 fprintf_filtered (outfile
, " section %s",
628 (SYMBOL_BFD_SECTION (symbol
)->owner
,
629 SYMBOL_BFD_SECTION (symbol
)));
633 fprintf_filtered (outfile
, "extern global at *(");
634 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
635 fprintf_filtered (outfile
, "),");
639 fprintf_filtered (outfile
, "register %ld", SYMBOL_VALUE (symbol
));
643 fprintf_filtered (outfile
, "arg at offset 0x%lx",
644 SYMBOL_VALUE (symbol
));
648 fprintf_filtered (outfile
, "arg at offset 0x%lx from fp",
649 SYMBOL_VALUE (symbol
));
653 fprintf_filtered (outfile
, "reference arg at 0x%lx", SYMBOL_VALUE (symbol
));
657 fprintf_filtered (outfile
, "parameter register %ld", SYMBOL_VALUE (symbol
));
660 case LOC_REGPARM_ADDR
:
661 fprintf_filtered (outfile
, "address parameter register %ld", SYMBOL_VALUE (symbol
));
665 fprintf_filtered (outfile
, "local at offset 0x%lx",
666 SYMBOL_VALUE (symbol
));
670 fprintf_filtered (outfile
, "local at 0x%lx from register %d",
671 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
674 case LOC_BASEREG_ARG
:
675 fprintf_filtered (outfile
, "arg at 0x%lx from register %d",
676 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
683 fprintf_filtered (outfile
, "label at ");
684 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol
), 1, outfile
);
685 if (SYMBOL_BFD_SECTION (symbol
))
686 fprintf_filtered (outfile
, " section %s",
688 (SYMBOL_BFD_SECTION (symbol
)->owner
,
689 SYMBOL_BFD_SECTION (symbol
)));
693 fprintf_filtered (outfile
, "block object ");
694 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol
), outfile
);
695 fprintf_filtered (outfile
, ", ");
696 print_address_numeric (BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
)),
699 fprintf_filtered (outfile
, "..");
700 print_address_numeric (BLOCK_END (SYMBOL_BLOCK_VALUE (symbol
)),
703 if (SYMBOL_BFD_SECTION (symbol
))
704 fprintf_filtered (outfile
, " section %s",
706 (SYMBOL_BFD_SECTION (symbol
)->owner
,
707 SYMBOL_BFD_SECTION (symbol
)));
711 fprintf_filtered (outfile
, "unresolved");
714 case LOC_OPTIMIZED_OUT
:
715 fprintf_filtered (outfile
, "optimized out");
719 fprintf_filtered (outfile
, "botched symbol class %x",
720 SYMBOL_CLASS (symbol
));
724 fprintf_filtered (outfile
, "\n");
729 maintenance_print_psymbols (char *args
, int from_tty
)
732 struct ui_file
*outfile
;
733 struct cleanup
*cleanups
;
734 char *symname
= NULL
;
735 char *filename
= DEV_TTY
;
736 struct objfile
*objfile
;
737 struct partial_symtab
*ps
;
743 error ("print-psymbols takes an output file name and optional symbol file name");
745 else if ((argv
= buildargv (args
)) == NULL
)
749 cleanups
= make_cleanup_freeargv (argv
);
754 /* If a second arg is supplied, it is a source file name to match on */
761 filename
= tilde_expand (filename
);
762 make_cleanup (xfree
, filename
);
764 outfile
= gdb_fopen (filename
, FOPEN_WT
);
766 perror_with_name (filename
);
767 make_cleanup_ui_file_delete (outfile
);
770 ALL_PSYMTABS (objfile
, ps
)
771 if (symname
== NULL
|| (STREQ (symname
, ps
->filename
)))
772 dump_psymtab (objfile
, ps
, outfile
);
774 do_cleanups (cleanups
);
778 print_partial_symbols (struct partial_symbol
**p
, int count
, char *what
,
779 struct ui_file
*outfile
)
781 fprintf_filtered (outfile
, " %s partial symbols:\n", what
);
784 fprintf_filtered (outfile
, " `%s'", SYMBOL_NAME (*p
));
785 if (SYMBOL_DEMANGLED_NAME (*p
) != NULL
)
787 fprintf_filtered (outfile
, " `%s'", SYMBOL_DEMANGLED_NAME (*p
));
789 fputs_filtered (", ", outfile
);
790 switch (SYMBOL_NAMESPACE (*p
))
792 case UNDEF_NAMESPACE
:
793 fputs_filtered ("undefined namespace, ", outfile
);
796 /* This is the usual thing -- don't print it */
798 case STRUCT_NAMESPACE
:
799 fputs_filtered ("struct namespace, ", outfile
);
801 case LABEL_NAMESPACE
:
802 fputs_filtered ("label namespace, ", outfile
);
805 fputs_filtered ("<invalid namespace>, ", outfile
);
808 switch (SYMBOL_CLASS (*p
))
811 fputs_filtered ("undefined", outfile
);
814 fputs_filtered ("constant int", outfile
);
817 fputs_filtered ("static", outfile
);
820 fputs_filtered ("extern global", outfile
);
823 fputs_filtered ("register", outfile
);
826 fputs_filtered ("pass by value", outfile
);
829 fputs_filtered ("pass by reference", outfile
);
832 fputs_filtered ("register parameter", outfile
);
834 case LOC_REGPARM_ADDR
:
835 fputs_filtered ("register address parameter", outfile
);
838 fputs_filtered ("stack parameter", outfile
);
841 fputs_filtered ("type", outfile
);
844 fputs_filtered ("label", outfile
);
847 fputs_filtered ("function", outfile
);
849 case LOC_CONST_BYTES
:
850 fputs_filtered ("constant bytes", outfile
);
853 fputs_filtered ("shuffled arg", outfile
);
856 fputs_filtered ("unresolved", outfile
);
858 case LOC_OPTIMIZED_OUT
:
859 fputs_filtered ("optimized out", outfile
);
862 fputs_filtered ("<invalid location>", outfile
);
865 fputs_filtered (", ", outfile
);
866 print_address_numeric (SYMBOL_VALUE_ADDRESS (*p
), 1, outfile
);
867 fprintf_filtered (outfile
, "\n");
873 maintenance_print_msymbols (char *args
, int from_tty
)
876 struct ui_file
*outfile
;
877 struct cleanup
*cleanups
;
878 char *filename
= DEV_TTY
;
879 char *symname
= NULL
;
880 struct objfile
*objfile
;
886 error ("print-msymbols takes an output file name and optional symbol file name");
888 else if ((argv
= buildargv (args
)) == NULL
)
892 cleanups
= make_cleanup_freeargv (argv
);
897 /* If a second arg is supplied, it is a source file name to match on */
904 filename
= tilde_expand (filename
);
905 make_cleanup (xfree
, filename
);
907 outfile
= gdb_fopen (filename
, FOPEN_WT
);
909 perror_with_name (filename
);
910 make_cleanup_ui_file_delete (outfile
);
913 ALL_OBJFILES (objfile
)
914 if (symname
== NULL
|| (STREQ (symname
, objfile
->name
)))
915 dump_msymbols (objfile
, outfile
);
917 fprintf_filtered (outfile
, "\n\n");
918 do_cleanups (cleanups
);
922 maintenance_print_objfiles (char *ignore
, int from_tty
)
924 struct objfile
*objfile
;
929 ALL_OBJFILES (objfile
)
930 dump_objfile (objfile
);
934 /* Check consistency of psymtabs and symtabs. */
937 maintenance_check_symtabs (char *ignore
, int from_tty
)
939 register struct symbol
*sym
;
940 register struct partial_symbol
**psym
;
941 register struct symtab
*s
= NULL
;
942 register struct partial_symtab
*ps
;
943 struct blockvector
*bv
;
944 register struct objfile
*objfile
;
945 register struct block
*b
;
948 ALL_PSYMTABS (objfile
, ps
)
950 s
= PSYMTAB_TO_SYMTAB (ps
);
953 bv
= BLOCKVECTOR (s
);
954 b
= BLOCKVECTOR_BLOCK (bv
, STATIC_BLOCK
);
955 psym
= ps
->objfile
->static_psymbols
.list
+ ps
->statics_offset
;
956 length
= ps
->n_static_syms
;
959 sym
= lookup_block_symbol (b
, SYMBOL_NAME (*psym
),
960 SYMBOL_NAMESPACE (*psym
));
963 printf_filtered ("Static symbol `");
964 puts_filtered (SYMBOL_NAME (*psym
));
965 printf_filtered ("' only found in ");
966 puts_filtered (ps
->filename
);
967 printf_filtered (" psymtab\n");
971 b
= BLOCKVECTOR_BLOCK (bv
, GLOBAL_BLOCK
);
972 psym
= ps
->objfile
->global_psymbols
.list
+ ps
->globals_offset
;
973 length
= ps
->n_global_syms
;
976 sym
= lookup_block_symbol (b
, SYMBOL_NAME (*psym
),
977 SYMBOL_NAMESPACE (*psym
));
980 printf_filtered ("Global symbol `");
981 puts_filtered (SYMBOL_NAME (*psym
));
982 printf_filtered ("' only found in ");
983 puts_filtered (ps
->filename
);
984 printf_filtered (" psymtab\n");
988 if (ps
->texthigh
< ps
->textlow
)
990 printf_filtered ("Psymtab ");
991 puts_filtered (ps
->filename
);
992 printf_filtered (" covers bad range ");
993 print_address_numeric (ps
->textlow
, 1, gdb_stdout
);
994 printf_filtered (" - ");
995 print_address_numeric (ps
->texthigh
, 1, gdb_stdout
);
996 printf_filtered ("\n");
999 if (ps
->texthigh
== 0)
1001 if (ps
->textlow
< BLOCK_START (b
) || ps
->texthigh
> BLOCK_END (b
))
1003 printf_filtered ("Psymtab ");
1004 puts_filtered (ps
->filename
);
1005 printf_filtered (" covers ");
1006 print_address_numeric (ps
->textlow
, 1, gdb_stdout
);
1007 printf_filtered (" - ");
1008 print_address_numeric (ps
->texthigh
, 1, gdb_stdout
);
1009 printf_filtered (" but symtab covers only ");
1010 print_address_numeric (BLOCK_START (b
), 1, gdb_stdout
);
1011 printf_filtered (" - ");
1012 print_address_numeric (BLOCK_END (b
), 1, gdb_stdout
);
1013 printf_filtered ("\n");
1019 /* Return the nexting depth of a block within other blocks in its symtab. */
1022 block_depth (struct block
*block
)
1025 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
1033 /* Increase the space allocated for LISTP, which is probably
1034 global_psymbols or static_psymbols. This space will eventually
1035 be freed in free_objfile(). */
1038 extend_psymbol_list (register struct psymbol_allocation_list
*listp
,
1039 struct objfile
*objfile
)
1042 if (listp
->size
== 0)
1045 listp
->list
= (struct partial_symbol
**)
1046 xmmalloc (objfile
->md
, new_size
* sizeof (struct partial_symbol
*));
1050 new_size
= listp
->size
* 2;
1051 listp
->list
= (struct partial_symbol
**)
1052 xmrealloc (objfile
->md
, (char *) listp
->list
,
1053 new_size
* sizeof (struct partial_symbol
*));
1055 /* Next assumes we only went one over. Should be good if
1056 program works correctly */
1057 listp
->next
= listp
->list
+ listp
->size
;
1058 listp
->size
= new_size
;
1062 /* Do early runtime initializations. */
1064 _initialize_symmisc (void)
This page took 0.051158 seconds and 4 git commands to generate.