PR symtab/8424:
[deliverable/binutils-gdb.git] / gdb / symmisc.c
CommitLineData
c906108c 1/* Do various things to symbol tables (other than lookup), for GDB.
af5f3db6 2
28e7fd62 3 Copyright (C) 1986-2013 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
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
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
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.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
19
20#include "defs.h"
21#include "symtab.h"
22#include "gdbtypes.h"
23#include "bfd.h"
0ba1096a 24#include "filenames.h"
c906108c
SS
25#include "symfile.h"
26#include "objfiles.h"
27#include "breakpoint.h"
28#include "command.h"
04ea0df1 29#include "gdb_obstack.h"
60250e8b 30#include "exceptions.h"
c906108c
SS
31#include "language.h"
32#include "bcache.h"
fe898f56 33#include "block.h"
44ea7b70 34#include "gdb_regex.h"
07318b29 35#include "gdb_stat.h"
de4f826b 36#include "dictionary.h"
79d43c61 37#include "typeprint.h"
80480540 38#include "gdbcmd.h"
05cba821 39#include "source.h"
c906108c
SS
40
41#include "gdb_string.h"
dbda9972 42#include "readline/readline.h"
c906108c 43
ccefe4c4
TT
44#include "psymtab.h"
45
c906108c
SS
46#ifndef DEV_TTY
47#define DEV_TTY "/dev/tty"
48#endif
49
50/* Unfortunately for debugging, stderr is usually a macro. This is painful
51 when calling functions that take FILE *'s from the debugger.
52 So we make a variable which has the same value and which is accessible when
53 debugging GDB with itself. Because stdin et al need not be constants,
54 we initialize them in the _initialize_symmisc function at the bottom
55 of the file. */
56FILE *std_in;
57FILE *std_out;
58FILE *std_err;
59
60/* Prototypes for local functions */
61
d9fcf2fb
JM
62static void dump_symtab (struct objfile *, struct symtab *,
63 struct ui_file *);
c906108c 64
d9fcf2fb 65static void dump_msymbols (struct objfile *, struct ui_file *);
c906108c 66
a14ed312 67static void dump_objfile (struct objfile *);
c906108c 68
a14ed312 69static int block_depth (struct block *);
c906108c 70
a14ed312 71void _initialize_symmisc (void);
c906108c 72
c5aa993b
JM
73struct print_symbol_args
74 {
5af949e3 75 struct gdbarch *gdbarch;
c5aa993b
JM
76 struct symbol *symbol;
77 int depth;
d9fcf2fb 78 struct ui_file *outfile;
c5aa993b 79 };
c906108c 80
4efb68b1 81static int print_symbol (void *);
c906108c 82\f
c906108c 83
c906108c 84void
fba45db2 85print_symbol_bcache_statistics (void)
c906108c 86{
6c95b8df 87 struct program_space *pspace;
c906108c
SS
88 struct objfile *objfile;
89
6c95b8df
PA
90 ALL_PSPACES (pspace)
91 ALL_PSPACE_OBJFILES (pspace, objfile)
c5aa993b 92 {
27618ce4 93 QUIT;
a3f17187 94 printf_filtered (_("Byte cache statistics for '%s':\n"), objfile->name);
710e1a31
SW
95 print_bcache_statistics (psymbol_bcache_get_bcache (objfile->psymbol_cache),
96 "partial symbol cache");
6532ff36
TT
97 print_bcache_statistics (objfile->per_bfd->macro_cache,
98 "preprocessor macro cache");
706e3705
TT
99 print_bcache_statistics (objfile->per_bfd->filename_cache,
100 "file name cache");
c5aa993b 101 }
c906108c
SS
102}
103
104void
fba45db2 105print_objfile_statistics (void)
c906108c 106{
6c95b8df 107 struct program_space *pspace;
c906108c 108 struct objfile *objfile;
c4f90d87 109 struct symtab *s;
c4f90d87 110 int i, linetables, blockvectors;
c906108c 111
6c95b8df
PA
112 ALL_PSPACES (pspace)
113 ALL_PSPACE_OBJFILES (pspace, objfile)
c5aa993b 114 {
27618ce4 115 QUIT;
a3f17187 116 printf_filtered (_("Statistics for '%s':\n"), objfile->name);
c5aa993b 117 if (OBJSTAT (objfile, n_stabs) > 0)
a3f17187 118 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
c5aa993b
JM
119 OBJSTAT (objfile, n_stabs));
120 if (OBJSTAT (objfile, n_minsyms) > 0)
a3f17187 121 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
c5aa993b
JM
122 OBJSTAT (objfile, n_minsyms));
123 if (OBJSTAT (objfile, n_psyms) > 0)
a3f17187 124 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
c5aa993b
JM
125 OBJSTAT (objfile, n_psyms));
126 if (OBJSTAT (objfile, n_syms) > 0)
a3f17187 127 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
c5aa993b
JM
128 OBJSTAT (objfile, n_syms));
129 if (OBJSTAT (objfile, n_types) > 0)
a3f17187 130 printf_filtered (_(" Number of \"types\" defined: %d\n"),
c5aa993b 131 OBJSTAT (objfile, n_types));
ccefe4c4
TT
132 if (objfile->sf)
133 objfile->sf->qf->print_stats (objfile);
c4f90d87
JM
134 i = linetables = blockvectors = 0;
135 ALL_OBJFILE_SYMTABS (objfile, s)
136 {
137 i++;
138 if (s->linetable != NULL)
139 linetables++;
140 if (s->primary == 1)
141 blockvectors++;
142 }
a3f17187
AC
143 printf_filtered (_(" Number of symbol tables: %d\n"), i);
144 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
c4f90d87 145 linetables);
a3f17187 146 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
c4f90d87
JM
147 blockvectors);
148
c5aa993b 149 if (OBJSTAT (objfile, sz_strtab) > 0)
a3f17187 150 printf_filtered (_(" Space used by a.out string tables: %d\n"),
c5aa993b 151 OBJSTAT (objfile, sz_strtab));
a3f17187 152 printf_filtered (_(" Total memory used for objfile obstack: %d\n"),
4a146b47 153 obstack_memory_used (&objfile->objfile_obstack));
706e3705
TT
154 printf_filtered (_(" Total memory used for BFD obstack: %d\n"),
155 obstack_memory_used (&objfile->per_bfd->storage_obstack));
a3f17187 156 printf_filtered (_(" Total memory used for psymbol cache: %d\n"),
710e1a31
SW
157 bcache_memory_used (psymbol_bcache_get_bcache
158 (objfile->psymbol_cache)));
a3f17187 159 printf_filtered (_(" Total memory used for macro cache: %d\n"),
6532ff36 160 bcache_memory_used (objfile->per_bfd->macro_cache));
10abe6bf 161 printf_filtered (_(" Total memory used for file name cache: %d\n"),
706e3705 162 bcache_memory_used (objfile->per_bfd->filename_cache));
c5aa993b 163 }
c906108c
SS
164}
165
c5aa993b 166static void
fba45db2 167dump_objfile (struct objfile *objfile)
c906108c
SS
168{
169 struct symtab *symtab;
c906108c 170
c5aa993b 171 printf_filtered ("\nObject file %s: ", objfile->name);
c906108c 172 printf_filtered ("Objfile at ");
d4f3574e 173 gdb_print_host_address (objfile, gdb_stdout);
c906108c 174 printf_filtered (", bfd at ");
d4f3574e 175 gdb_print_host_address (objfile->obfd, gdb_stdout);
c906108c
SS
176 printf_filtered (", %d minsyms\n\n",
177 objfile->minimal_symbol_count);
178
ccefe4c4
TT
179 if (objfile->sf)
180 objfile->sf->qf->dump (objfile);
c906108c 181
c5aa993b 182 if (objfile->symtabs)
c906108c
SS
183 {
184 printf_filtered ("Symtabs:\n");
c5aa993b 185 for (symtab = objfile->symtabs;
c906108c
SS
186 symtab != NULL;
187 symtab = symtab->next)
188 {
05cba821 189 printf_filtered ("%s at ", symtab_to_filename_for_display (symtab));
d4f3574e 190 gdb_print_host_address (symtab, gdb_stdout);
c906108c 191 printf_filtered (", ");
c5aa993b 192 if (symtab->objfile != objfile)
c906108c
SS
193 {
194 printf_filtered ("NOT ON CHAIN! ");
195 }
196 wrap_here (" ");
197 }
198 printf_filtered ("\n\n");
199 }
200}
201
202/* Print minimal symbols from this objfile. */
c5aa993b
JM
203
204static void
fba45db2 205dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
c906108c 206{
5af949e3 207 struct gdbarch *gdbarch = get_objfile_arch (objfile);
c906108c
SS
208 struct minimal_symbol *msymbol;
209 int index;
210 char ms_type;
c5aa993b
JM
211
212 fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile->name);
213 if (objfile->minimal_symbol_count == 0)
c906108c
SS
214 {
215 fprintf_filtered (outfile, "No minimal symbols found.\n");
216 return;
217 }
3567439c
DJ
218 index = 0;
219 ALL_OBJFILE_MSYMBOLS (objfile, msymbol)
c906108c 220 {
e27d198c 221 struct obj_section *section = SYMBOL_OBJ_SECTION (objfile, msymbol);
714835d5 222
712f90be 223 switch (MSYMBOL_TYPE (msymbol))
c906108c 224 {
c5aa993b
JM
225 case mst_unknown:
226 ms_type = 'u';
227 break;
228 case mst_text:
229 ms_type = 'T';
230 break;
0875794a
JK
231 case mst_text_gnu_ifunc:
232 ms_type = 'i';
233 break;
c5aa993b
JM
234 case mst_solib_trampoline:
235 ms_type = 'S';
236 break;
237 case mst_data:
238 ms_type = 'D';
239 break;
240 case mst_bss:
241 ms_type = 'B';
242 break;
243 case mst_abs:
244 ms_type = 'A';
245 break;
246 case mst_file_text:
247 ms_type = 't';
248 break;
249 case mst_file_data:
250 ms_type = 'd';
251 break;
252 case mst_file_bss:
253 ms_type = 'b';
254 break;
255 default:
256 ms_type = '?';
257 break;
c906108c
SS
258 }
259 fprintf_filtered (outfile, "[%2d] %c ", index, ms_type);
5af949e3
UW
260 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msymbol)),
261 outfile);
3567439c 262 fprintf_filtered (outfile, " %s", SYMBOL_LINKAGE_NAME (msymbol));
714835d5 263 if (section)
c906108c
SS
264 fprintf_filtered (outfile, " section %s",
265 bfd_section_name (objfile->obfd,
714835d5 266 section->the_bfd_section));
c906108c
SS
267 if (SYMBOL_DEMANGLED_NAME (msymbol) != NULL)
268 {
269 fprintf_filtered (outfile, " %s", SYMBOL_DEMANGLED_NAME (msymbol));
270 }
c906108c
SS
271 if (msymbol->filename)
272 fprintf_filtered (outfile, " %s", msymbol->filename);
c906108c 273 fputs_filtered ("\n", outfile);
3567439c 274 index++;
c906108c 275 }
c5aa993b 276 if (objfile->minimal_symbol_count != index)
c906108c 277 {
8a3fe4f8 278 warning (_("internal error: minimal symbol count %d != %d"),
c5aa993b 279 objfile->minimal_symbol_count, index);
c906108c
SS
280 }
281 fprintf_filtered (outfile, "\n");
282}
283
c5aa993b 284static void
44b164c5
JB
285dump_symtab_1 (struct objfile *objfile, struct symtab *symtab,
286 struct ui_file *outfile)
c906108c 287{
5af949e3 288 struct gdbarch *gdbarch = get_objfile_arch (objfile);
de4f826b
DC
289 int i;
290 struct dict_iterator iter;
952a6d41 291 int len;
de4f826b 292 struct linetable *l;
c906108c 293 struct blockvector *bv;
e88c90f2 294 struct symbol *sym;
de4f826b 295 struct block *b;
c906108c
SS
296 int depth;
297
05cba821
JK
298 fprintf_filtered (outfile, "\nSymtab for file %s\n",
299 symtab_to_filename_for_display (symtab));
c906108c
SS
300 if (symtab->dirname)
301 fprintf_filtered (outfile, "Compilation directory is %s\n",
302 symtab->dirname);
303 fprintf_filtered (outfile, "Read from object file %s (", objfile->name);
d4f3574e 304 gdb_print_host_address (objfile, outfile);
c906108c 305 fprintf_filtered (outfile, ")\n");
3e43a32a
MS
306 fprintf_filtered (outfile, "Language: %s\n",
307 language_str (symtab->language));
c906108c
SS
308
309 /* First print the line table. */
310 l = LINETABLE (symtab);
311 if (l)
312 {
313 fprintf_filtered (outfile, "\nLine table:\n\n");
314 len = l->nitems;
315 for (i = 0; i < len; i++)
316 {
317 fprintf_filtered (outfile, " line %d at ", l->item[i].line);
5af949e3 318 fputs_filtered (paddress (gdbarch, l->item[i].pc), outfile);
c906108c
SS
319 fprintf_filtered (outfile, "\n");
320 }
321 }
322 /* Now print the block info, but only for primary symtabs since we will
c378eb4e 323 print lots of duplicate info otherwise. */
c5aa993b 324 if (symtab->primary)
c906108c
SS
325 {
326 fprintf_filtered (outfile, "\nBlockvector:\n\n");
327 bv = BLOCKVECTOR (symtab);
328 len = BLOCKVECTOR_NBLOCKS (bv);
329 for (i = 0; i < len; i++)
330 {
331 b = BLOCKVECTOR_BLOCK (bv, i);
332 depth = block_depth (b) * 2;
333 print_spaces (depth, outfile);
334 fprintf_filtered (outfile, "block #%03d, object at ", i);
d4f3574e 335 gdb_print_host_address (b, outfile);
c906108c
SS
336 if (BLOCK_SUPERBLOCK (b))
337 {
338 fprintf_filtered (outfile, " under ");
d4f3574e 339 gdb_print_host_address (BLOCK_SUPERBLOCK (b), outfile);
c906108c 340 }
261397f8
DJ
341 /* drow/2002-07-10: We could save the total symbols count
342 even if we're using a hashtable, but nothing else but this message
343 wants it. */
de4f826b
DC
344 fprintf_filtered (outfile, ", %d syms/buckets in ",
345 dict_size (BLOCK_DICT (b)));
5af949e3 346 fputs_filtered (paddress (gdbarch, BLOCK_START (b)), outfile);
c906108c 347 fprintf_filtered (outfile, "..");
5af949e3 348 fputs_filtered (paddress (gdbarch, BLOCK_END (b)), outfile);
c906108c
SS
349 if (BLOCK_FUNCTION (b))
350 {
3567439c
DJ
351 fprintf_filtered (outfile, ", function %s",
352 SYMBOL_LINKAGE_NAME (BLOCK_FUNCTION (b)));
c906108c
SS
353 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)) != NULL)
354 {
355 fprintf_filtered (outfile, ", %s",
c5aa993b 356 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)));
c906108c
SS
357 }
358 }
c906108c 359 fprintf_filtered (outfile, "\n");
261397f8 360 /* Now print each symbol in this block (in no particular order, if
8157b174
TT
361 we're using a hashtable). Note that we only want this
362 block, not any blocks from included symtabs. */
363 ALL_DICT_SYMBOLS (BLOCK_DICT (b), iter, sym)
c906108c
SS
364 {
365 struct print_symbol_args s;
433759f7 366
5af949e3 367 s.gdbarch = gdbarch;
e88c90f2 368 s.symbol = sym;
c906108c
SS
369 s.depth = depth + 1;
370 s.outfile = outfile;
371 catch_errors (print_symbol, &s, "Error printing symbol:\n",
5c3ce3f7 372 RETURN_MASK_ERROR);
c906108c
SS
373 }
374 }
375 fprintf_filtered (outfile, "\n");
376 }
377 else
378 {
379 fprintf_filtered (outfile, "\nBlockvector same as previous symtab\n\n");
380 }
381}
382
44b164c5
JB
383static void
384dump_symtab (struct objfile *objfile, struct symtab *symtab,
385 struct ui_file *outfile)
386{
44b164c5
JB
387 /* Set the current language to the language of the symtab we're dumping
388 because certain routines used during dump_symtab() use the current
969107c5
EZ
389 language to print an image of the symbol. We'll restore it later.
390 But use only real languages, not placeholders. */
391 if (symtab->language != language_unknown
392 && symtab->language != language_auto)
393 {
394 enum language saved_lang;
395
396 saved_lang = set_language (symtab->language);
44b164c5 397
969107c5 398 dump_symtab_1 (objfile, symtab, outfile);
44b164c5 399
969107c5
EZ
400 set_language (saved_lang);
401 }
402 else
403 dump_symtab_1 (objfile, symtab, outfile);
44b164c5
JB
404}
405
80480540 406static void
fba45db2 407maintenance_print_symbols (char *args, int from_tty)
c906108c
SS
408{
409 char **argv;
d9fcf2fb 410 struct ui_file *outfile;
c906108c
SS
411 struct cleanup *cleanups;
412 char *symname = NULL;
413 char *filename = DEV_TTY;
414 struct objfile *objfile;
415 struct symtab *s;
416
417 dont_repeat ();
418
419 if (args == NULL)
420 {
3e43a32a
MS
421 error (_("Arguments missing: an output file name "
422 "and an optional symbol file name"));
c906108c 423 }
d1a41061 424 argv = gdb_buildargv (args);
7a292a7a 425 cleanups = make_cleanup_freeargv (argv);
c906108c
SS
426
427 if (argv[0] != NULL)
428 {
429 filename = argv[0];
c378eb4e 430 /* If a second arg is supplied, it is a source file name to match on. */
c906108c
SS
431 if (argv[1] != NULL)
432 {
433 symname = argv[1];
434 }
435 }
436
437 filename = tilde_expand (filename);
b8c9b27d 438 make_cleanup (xfree, filename);
c5aa993b 439
c906108c
SS
440 outfile = gdb_fopen (filename, FOPEN_WT);
441 if (outfile == 0)
442 perror_with_name (filename);
d9fcf2fb 443 make_cleanup_ui_file_delete (outfile);
c906108c 444
c906108c 445 ALL_SYMTABS (objfile, s)
27618ce4
TT
446 {
447 QUIT;
05cba821
JK
448 if (symname == NULL
449 || filename_cmp (symname, symtab_to_filename_for_display (s)) == 0)
27618ce4
TT
450 dump_symtab (objfile, s, outfile);
451 }
c906108c
SS
452 do_cleanups (cleanups);
453}
454
455/* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
456 far to indent. ARGS is really a struct print_symbol_args *, but is
457 declared as char * to get it past catch_errors. Returns 0 for error,
458 1 for success. */
459
460static int
4efb68b1 461print_symbol (void *args)
c906108c 462{
5af949e3 463 struct gdbarch *gdbarch = ((struct print_symbol_args *) args)->gdbarch;
c5aa993b
JM
464 struct symbol *symbol = ((struct print_symbol_args *) args)->symbol;
465 int depth = ((struct print_symbol_args *) args)->depth;
d9fcf2fb 466 struct ui_file *outfile = ((struct print_symbol_args *) args)->outfile;
e27d198c
TT
467 struct obj_section *section = SYMBOL_OBJ_SECTION (SYMBOL_OBJFILE (symbol),
468 symbol);
c906108c
SS
469
470 print_spaces (depth, outfile);
176620f1 471 if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN)
c906108c 472 {
de5ad195 473 fprintf_filtered (outfile, "label %s at ", SYMBOL_PRINT_NAME (symbol));
5af949e3
UW
474 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
475 outfile);
714835d5 476 if (section)
c906108c 477 fprintf_filtered (outfile, " section %s\n",
714835d5
UW
478 bfd_section_name (section->the_bfd_section->owner,
479 section->the_bfd_section));
c906108c
SS
480 else
481 fprintf_filtered (outfile, "\n");
482 return 1;
483 }
176620f1 484 if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN)
c906108c
SS
485 {
486 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol)))
487 {
79d43c61
TT
488 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
489 &type_print_raw_options);
c906108c
SS
490 }
491 else
492 {
493 fprintf_filtered (outfile, "%s %s = ",
c5aa993b
JM
494 (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_ENUM
495 ? "enum"
496 : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
497 ? "struct" : "union")),
3567439c 498 SYMBOL_LINKAGE_NAME (symbol));
79d43c61
TT
499 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
500 &type_print_raw_options);
c906108c
SS
501 }
502 fprintf_filtered (outfile, ";\n");
503 }
504 else
505 {
506 if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
507 fprintf_filtered (outfile, "typedef ");
508 if (SYMBOL_TYPE (symbol))
509 {
510 /* Print details of types, except for enums where it's clutter. */
de5ad195 511 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol),
c906108c
SS
512 outfile,
513 TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
79d43c61
TT
514 depth,
515 &type_print_raw_options);
c906108c
SS
516 fprintf_filtered (outfile, "; ");
517 }
518 else
de5ad195 519 fprintf_filtered (outfile, "%s ", SYMBOL_PRINT_NAME (symbol));
c906108c
SS
520
521 switch (SYMBOL_CLASS (symbol))
522 {
523 case LOC_CONST:
12df843f
JK
524 fprintf_filtered (outfile, "const %s (%s)",
525 plongest (SYMBOL_VALUE (symbol)),
526 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
527 break;
528
529 case LOC_CONST_BYTES:
530 {
531 unsigned i;
532 struct type *type = check_typedef (SYMBOL_TYPE (symbol));
433759f7 533
c906108c
SS
534 fprintf_filtered (outfile, "const %u hex bytes:",
535 TYPE_LENGTH (type));
536 for (i = 0; i < TYPE_LENGTH (type); i++)
537 fprintf_filtered (outfile, " %02x",
c5aa993b 538 (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
c906108c
SS
539 }
540 break;
541
542 case LOC_STATIC:
543 fprintf_filtered (outfile, "static at ");
5af949e3
UW
544 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
545 outfile);
714835d5 546 if (section)
c906108c 547 fprintf_filtered (outfile, " section %s",
714835d5
UW
548 bfd_section_name (section->the_bfd_section->owner,
549 section->the_bfd_section));
c906108c
SS
550 break;
551
c906108c 552 case LOC_REGISTER:
2a2d4dc3 553 if (SYMBOL_IS_ARGUMENT (symbol))
12df843f
JK
554 fprintf_filtered (outfile, "parameter register %s",
555 plongest (SYMBOL_VALUE (symbol)));
2a2d4dc3 556 else
12df843f
JK
557 fprintf_filtered (outfile, "register %s",
558 plongest (SYMBOL_VALUE (symbol)));
c906108c
SS
559 break;
560
561 case LOC_ARG:
12df843f
JK
562 fprintf_filtered (outfile, "arg at offset %s",
563 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
564 break;
565
c906108c 566 case LOC_REF_ARG:
12df843f
JK
567 fprintf_filtered (outfile, "reference arg at %s",
568 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
569 break;
570
c906108c 571 case LOC_REGPARM_ADDR:
12df843f
JK
572 fprintf_filtered (outfile, "address parameter register %s",
573 plongest (SYMBOL_VALUE (symbol)));
c906108c
SS
574 break;
575
576 case LOC_LOCAL:
12df843f
JK
577 fprintf_filtered (outfile, "local at offset %s",
578 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
579 break;
580
c906108c
SS
581 case LOC_TYPEDEF:
582 break;
583
584 case LOC_LABEL:
585 fprintf_filtered (outfile, "label at ");
5af949e3
UW
586 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
587 outfile);
714835d5 588 if (section)
c906108c 589 fprintf_filtered (outfile, " section %s",
714835d5
UW
590 bfd_section_name (section->the_bfd_section->owner,
591 section->the_bfd_section));
c906108c
SS
592 break;
593
594 case LOC_BLOCK:
595 fprintf_filtered (outfile, "block object ");
d4f3574e 596 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol), outfile);
c906108c 597 fprintf_filtered (outfile, ", ");
5af949e3
UW
598 fputs_filtered (paddress (gdbarch,
599 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol))),
ed49a04f 600 outfile);
c906108c 601 fprintf_filtered (outfile, "..");
5af949e3
UW
602 fputs_filtered (paddress (gdbarch,
603 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol))),
ed49a04f 604 outfile);
714835d5 605 if (section)
c906108c 606 fprintf_filtered (outfile, " section %s",
714835d5
UW
607 bfd_section_name (section->the_bfd_section->owner,
608 section->the_bfd_section));
c906108c
SS
609 break;
610
4c2df51b 611 case LOC_COMPUTED:
4c2df51b
DJ
612 fprintf_filtered (outfile, "computed at runtime");
613 break;
614
c906108c
SS
615 case LOC_UNRESOLVED:
616 fprintf_filtered (outfile, "unresolved");
617 break;
618
619 case LOC_OPTIMIZED_OUT:
620 fprintf_filtered (outfile, "optimized out");
621 break;
622
c5aa993b 623 default:
c906108c
SS
624 fprintf_filtered (outfile, "botched symbol class %x",
625 SYMBOL_CLASS (symbol));
626 break;
627 }
628 }
629 fprintf_filtered (outfile, "\n");
630 return 1;
631}
632
80480540 633static void
fba45db2 634maintenance_print_msymbols (char *args, int from_tty)
c906108c
SS
635{
636 char **argv;
d9fcf2fb 637 struct ui_file *outfile;
c906108c
SS
638 struct cleanup *cleanups;
639 char *filename = DEV_TTY;
640 char *symname = NULL;
6c95b8df 641 struct program_space *pspace;
c906108c
SS
642 struct objfile *objfile;
643
07318b29
CV
644 struct stat sym_st, obj_st;
645
c906108c
SS
646 dont_repeat ();
647
648 if (args == NULL)
649 {
3e43a32a
MS
650 error (_("print-msymbols takes an output file "
651 "name and optional symbol file name"));
c906108c 652 }
d1a41061 653 argv = gdb_buildargv (args);
7a292a7a 654 cleanups = make_cleanup_freeargv (argv);
c906108c
SS
655
656 if (argv[0] != NULL)
657 {
658 filename = argv[0];
c378eb4e 659 /* If a second arg is supplied, it is a source file name to match on. */
c906108c
SS
660 if (argv[1] != NULL)
661 {
f5b95b50 662 symname = gdb_realpath (argv[1]);
07318b29
CV
663 make_cleanup (xfree, symname);
664 if (symname && stat (symname, &sym_st))
665 perror_with_name (symname);
c906108c
SS
666 }
667 }
668
669 filename = tilde_expand (filename);
b8c9b27d 670 make_cleanup (xfree, filename);
c5aa993b 671
c906108c
SS
672 outfile = gdb_fopen (filename, FOPEN_WT);
673 if (outfile == 0)
674 perror_with_name (filename);
d9fcf2fb 675 make_cleanup_ui_file_delete (outfile);
c906108c 676
6c95b8df
PA
677 ALL_PSPACES (pspace)
678 ALL_PSPACE_OBJFILES (pspace, objfile)
27618ce4
TT
679 {
680 QUIT;
681 if (symname == NULL || (!stat (objfile->name, &obj_st)
3b74cdc3 682 && sym_st.st_dev == obj_st.st_dev
27618ce4
TT
683 && sym_st.st_ino == obj_st.st_ino))
684 dump_msymbols (objfile, outfile);
685 }
c906108c
SS
686 fprintf_filtered (outfile, "\n\n");
687 do_cleanups (cleanups);
688}
689
80480540 690static void
fba45db2 691maintenance_print_objfiles (char *ignore, int from_tty)
c906108c 692{
6c95b8df 693 struct program_space *pspace;
c906108c
SS
694 struct objfile *objfile;
695
696 dont_repeat ();
697
6c95b8df
PA
698 ALL_PSPACES (pspace)
699 ALL_PSPACE_OBJFILES (pspace, objfile)
27618ce4
TT
700 {
701 QUIT;
702 dump_objfile (objfile);
703 }
c906108c
SS
704}
705
5e7b2f39 706/* List all the symbol tables whose names match REGEXP (optional). */
b5ebcee6 707
80480540 708static void
5e7b2f39 709maintenance_info_symtabs (char *regexp, int from_tty)
44ea7b70 710{
6c95b8df 711 struct program_space *pspace;
44ea7b70
JB
712 struct objfile *objfile;
713
714 if (regexp)
715 re_comp (regexp);
716
6c95b8df
PA
717 ALL_PSPACES (pspace)
718 ALL_PSPACE_OBJFILES (pspace, objfile)
44ea7b70
JB
719 {
720 struct symtab *symtab;
721
722 /* We don't want to print anything for this objfile until we
723 actually find a symtab whose name matches. */
724 int printed_objfile_start = 0;
725
726 ALL_OBJFILE_SYMTABS (objfile, symtab)
8a498d38
DE
727 {
728 QUIT;
729
730 if (! regexp
05cba821 731 || re_exec (symtab_to_filename_for_display (symtab)))
8a498d38
DE
732 {
733 if (! printed_objfile_start)
734 {
735 printf_filtered ("{ objfile %s ", objfile->name);
736 wrap_here (" ");
a74ce742
PM
737 printf_filtered ("((struct objfile *) %s)\n",
738 host_address_to_string (objfile));
8a498d38
DE
739 printed_objfile_start = 1;
740 }
741
05cba821
JK
742 printf_filtered (" { symtab %s ",
743 symtab_to_filename_for_display (symtab));
8a498d38 744 wrap_here (" ");
a74ce742
PM
745 printf_filtered ("((struct symtab *) %s)\n",
746 host_address_to_string (symtab));
8a498d38
DE
747 printf_filtered (" dirname %s\n",
748 symtab->dirname ? symtab->dirname : "(null)");
749 printf_filtered (" fullname %s\n",
750 symtab->fullname ? symtab->fullname : "(null)");
3e43a32a
MS
751 printf_filtered (" "
752 "blockvector ((struct blockvector *) %s)%s\n",
a74ce742 753 host_address_to_string (symtab->blockvector),
8a498d38 754 symtab->primary ? " (primary)" : "");
3e43a32a
MS
755 printf_filtered (" "
756 "linetable ((struct linetable *) %s)\n",
a74ce742 757 host_address_to_string (symtab->linetable));
3e43a32a
MS
758 printf_filtered (" debugformat %s\n",
759 symtab->debugformat);
8a498d38
DE
760 printf_filtered (" }\n");
761 }
762 }
44ea7b70
JB
763
764 if (printed_objfile_start)
765 printf_filtered ("}\n");
766 }
767}
c906108c 768\f
c5aa993b 769
c906108c
SS
770/* Return the nexting depth of a block within other blocks in its symtab. */
771
772static int
fba45db2 773block_depth (struct block *block)
c906108c 774{
52f0bd74 775 int i = 0;
433759f7 776
c5aa993b 777 while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
c906108c
SS
778 {
779 i++;
780 }
781 return i;
782}
c906108c 783\f
c5aa993b 784
c378eb4e 785/* Do early runtime initializations. */
b5ebcee6 786
c906108c 787void
fba45db2 788_initialize_symmisc (void)
c906108c 789{
c5aa993b 790 std_in = stdin;
c906108c
SS
791 std_out = stdout;
792 std_err = stderr;
80480540
YQ
793
794 add_cmd ("symbols", class_maintenance, maintenance_print_symbols, _("\
795Print dump of current symbol definitions.\n\
796Entries in the full symbol table are dumped to file OUTFILE.\n\
797If a SOURCE file is specified, dump only that file's symbols."),
798 &maintenanceprintlist);
799
800 add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols, _("\
801Print dump of current minimal symbol definitions.\n\
802Entries in the minimal symbol table are dumped to file OUTFILE.\n\
803If a SOURCE file is specified, dump only that file's minimal symbols."),
804 &maintenanceprintlist);
805
806 add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles,
807 _("Print dump of current object file definitions."),
808 &maintenanceprintlist);
809
810 add_cmd ("symtabs", class_maintenance, maintenance_info_symtabs, _("\
811List the full symbol tables for all object files.\n\
812This does not include information about individual symbols, blocks, or\n\
813linetables --- just the symbol table structures themselves.\n\
814With an argument REGEXP, list the symbol tables whose names that match that."),
815 &maintenanceinfolist);
c906108c 816}
This page took 1.394248 seconds and 4 git commands to generate.