New syntax for mt print symbols,msymbols,psymbols.
[deliverable/binutils-gdb.git] / gdb / symmisc.c
CommitLineData
c906108c 1/* Do various things to symbol tables (other than lookup), for GDB.
af5f3db6 2
618f726f 3 Copyright (C) 1986-2016 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"
c906108c
SS
30#include "language.h"
31#include "bcache.h"
fe898f56 32#include "block.h"
44ea7b70 33#include "gdb_regex.h"
53ce3c39 34#include <sys/stat.h>
de4f826b 35#include "dictionary.h"
79d43c61 36#include "typeprint.h"
80480540 37#include "gdbcmd.h"
05cba821 38#include "source.h"
dbda9972 39#include "readline/readline.h"
c906108c 40
ccefe4c4
TT
41#include "psymtab.h"
42
c906108c
SS
43/* Unfortunately for debugging, stderr is usually a macro. This is painful
44 when calling functions that take FILE *'s from the debugger.
45 So we make a variable which has the same value and which is accessible when
46 debugging GDB with itself. Because stdin et al need not be constants,
47 we initialize them in the _initialize_symmisc function at the bottom
48 of the file. */
49FILE *std_in;
50FILE *std_out;
51FILE *std_err;
52
53/* Prototypes for local functions */
54
a14ed312 55static int block_depth (struct block *);
c906108c 56
a14ed312 57void _initialize_symmisc (void);
c906108c 58
c5aa993b
JM
59struct print_symbol_args
60 {
5af949e3 61 struct gdbarch *gdbarch;
c5aa993b
JM
62 struct symbol *symbol;
63 int depth;
d9fcf2fb 64 struct ui_file *outfile;
c5aa993b 65 };
c906108c 66
4efb68b1 67static int print_symbol (void *);
c906108c 68\f
c906108c 69
c906108c 70void
fba45db2 71print_symbol_bcache_statistics (void)
c906108c 72{
6c95b8df 73 struct program_space *pspace;
c906108c
SS
74 struct objfile *objfile;
75
6c95b8df
PA
76 ALL_PSPACES (pspace)
77 ALL_PSPACE_OBJFILES (pspace, objfile)
c5aa993b 78 {
27618ce4 79 QUIT;
4262abfb
JK
80 printf_filtered (_("Byte cache statistics for '%s':\n"),
81 objfile_name (objfile));
710e1a31
SW
82 print_bcache_statistics (psymbol_bcache_get_bcache (objfile->psymbol_cache),
83 "partial symbol cache");
6532ff36
TT
84 print_bcache_statistics (objfile->per_bfd->macro_cache,
85 "preprocessor macro cache");
706e3705
TT
86 print_bcache_statistics (objfile->per_bfd->filename_cache,
87 "file name cache");
c5aa993b 88 }
c906108c
SS
89}
90
91void
fba45db2 92print_objfile_statistics (void)
c906108c 93{
6c95b8df 94 struct program_space *pspace;
c906108c 95 struct objfile *objfile;
43f3e411 96 struct compunit_symtab *cu;
c4f90d87 97 struct symtab *s;
c4f90d87 98 int i, linetables, blockvectors;
c906108c 99
6c95b8df
PA
100 ALL_PSPACES (pspace)
101 ALL_PSPACE_OBJFILES (pspace, objfile)
c5aa993b 102 {
27618ce4 103 QUIT;
4262abfb 104 printf_filtered (_("Statistics for '%s':\n"), objfile_name (objfile));
c5aa993b 105 if (OBJSTAT (objfile, n_stabs) > 0)
a3f17187 106 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
c5aa993b 107 OBJSTAT (objfile, n_stabs));
5f6cac40 108 if (objfile->per_bfd->n_minsyms > 0)
a3f17187 109 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
5f6cac40 110 objfile->per_bfd->n_minsyms);
c5aa993b 111 if (OBJSTAT (objfile, n_psyms) > 0)
a3f17187 112 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
c5aa993b
JM
113 OBJSTAT (objfile, n_psyms));
114 if (OBJSTAT (objfile, n_syms) > 0)
a3f17187 115 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
c5aa993b
JM
116 OBJSTAT (objfile, n_syms));
117 if (OBJSTAT (objfile, n_types) > 0)
a3f17187 118 printf_filtered (_(" Number of \"types\" defined: %d\n"),
c5aa993b 119 OBJSTAT (objfile, n_types));
ccefe4c4
TT
120 if (objfile->sf)
121 objfile->sf->qf->print_stats (objfile);
c4f90d87 122 i = linetables = blockvectors = 0;
43f3e411 123 ALL_OBJFILE_FILETABS (objfile, cu, s)
c4f90d87
JM
124 {
125 i++;
8435453b 126 if (SYMTAB_LINETABLE (s) != NULL)
c4f90d87 127 linetables++;
c4f90d87 128 }
43f3e411
DE
129 ALL_OBJFILE_COMPUNITS (objfile, cu)
130 blockvectors++;
a3f17187 131 printf_filtered (_(" Number of symbol tables: %d\n"), i);
26a84859 132 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
c4f90d87 133 linetables);
26a84859 134 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
c4f90d87 135 blockvectors);
26a84859 136
c5aa993b 137 if (OBJSTAT (objfile, sz_strtab) > 0)
1736a7bd 138 printf_filtered (_(" Space used by string tables: %d\n"),
c5aa993b 139 OBJSTAT (objfile, sz_strtab));
241fd515
AM
140 printf_filtered (_(" Total memory used for objfile obstack: %s\n"),
141 pulongest (obstack_memory_used (&objfile
142 ->objfile_obstack)));
143 printf_filtered (_(" Total memory used for BFD obstack: %s\n"),
144 pulongest (obstack_memory_used (&objfile->per_bfd
145 ->storage_obstack)));
a3f17187 146 printf_filtered (_(" Total memory used for psymbol cache: %d\n"),
710e1a31
SW
147 bcache_memory_used (psymbol_bcache_get_bcache
148 (objfile->psymbol_cache)));
a3f17187 149 printf_filtered (_(" Total memory used for macro cache: %d\n"),
6532ff36 150 bcache_memory_used (objfile->per_bfd->macro_cache));
10abe6bf 151 printf_filtered (_(" Total memory used for file name cache: %d\n"),
706e3705 152 bcache_memory_used (objfile->per_bfd->filename_cache));
c5aa993b 153 }
c906108c
SS
154}
155
c5aa993b 156static void
fba45db2 157dump_objfile (struct objfile *objfile)
c906108c 158{
43f3e411 159 struct compunit_symtab *cust;
c906108c 160 struct symtab *symtab;
c906108c 161
4262abfb 162 printf_filtered ("\nObject file %s: ", objfile_name (objfile));
c906108c 163 printf_filtered ("Objfile at ");
d4f3574e 164 gdb_print_host_address (objfile, gdb_stdout);
c906108c 165 printf_filtered (", bfd at ");
d4f3574e 166 gdb_print_host_address (objfile->obfd, gdb_stdout);
c906108c 167 printf_filtered (", %d minsyms\n\n",
34643a32 168 objfile->per_bfd->minimal_symbol_count);
c906108c 169
ccefe4c4
TT
170 if (objfile->sf)
171 objfile->sf->qf->dump (objfile);
c906108c 172
43f3e411 173 if (objfile->compunit_symtabs != NULL)
c906108c
SS
174 {
175 printf_filtered ("Symtabs:\n");
43f3e411 176 ALL_OBJFILE_FILETABS (objfile, cust, symtab)
c906108c 177 {
05cba821 178 printf_filtered ("%s at ", symtab_to_filename_for_display (symtab));
d4f3574e 179 gdb_print_host_address (symtab, gdb_stdout);
c906108c 180 printf_filtered (", ");
eb822aa6 181 if (SYMTAB_OBJFILE (symtab) != objfile)
c906108c
SS
182 {
183 printf_filtered ("NOT ON CHAIN! ");
184 }
185 wrap_here (" ");
186 }
187 printf_filtered ("\n\n");
188 }
189}
190
191/* Print minimal symbols from this objfile. */
c5aa993b
JM
192
193static void
fba45db2 194dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
c906108c 195{
5af949e3 196 struct gdbarch *gdbarch = get_objfile_arch (objfile);
c906108c
SS
197 struct minimal_symbol *msymbol;
198 int index;
199 char ms_type;
c5aa993b 200
4262abfb 201 fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile_name (objfile));
34643a32 202 if (objfile->per_bfd->minimal_symbol_count == 0)
c906108c
SS
203 {
204 fprintf_filtered (outfile, "No minimal symbols found.\n");
205 return;
206 }
3567439c
DJ
207 index = 0;
208 ALL_OBJFILE_MSYMBOLS (objfile, msymbol)
c906108c 209 {
efd66ac6 210 struct obj_section *section = MSYMBOL_OBJ_SECTION (objfile, msymbol);
714835d5 211
712f90be 212 switch (MSYMBOL_TYPE (msymbol))
c906108c 213 {
c5aa993b
JM
214 case mst_unknown:
215 ms_type = 'u';
216 break;
217 case mst_text:
218 ms_type = 'T';
219 break;
0875794a
JK
220 case mst_text_gnu_ifunc:
221 ms_type = 'i';
222 break;
c5aa993b
JM
223 case mst_solib_trampoline:
224 ms_type = 'S';
225 break;
226 case mst_data:
227 ms_type = 'D';
228 break;
229 case mst_bss:
230 ms_type = 'B';
231 break;
232 case mst_abs:
233 ms_type = 'A';
234 break;
235 case mst_file_text:
236 ms_type = 't';
237 break;
238 case mst_file_data:
239 ms_type = 'd';
240 break;
241 case mst_file_bss:
242 ms_type = 'b';
243 break;
244 default:
245 ms_type = '?';
246 break;
c906108c
SS
247 }
248 fprintf_filtered (outfile, "[%2d] %c ", index, ms_type);
77e371c0
TT
249 fputs_filtered (paddress (gdbarch, MSYMBOL_VALUE_ADDRESS (objfile,
250 msymbol)),
5af949e3 251 outfile);
efd66ac6 252 fprintf_filtered (outfile, " %s", MSYMBOL_LINKAGE_NAME (msymbol));
714835d5 253 if (section)
8625fc1b
TT
254 {
255 if (section->the_bfd_section != NULL)
256 fprintf_filtered (outfile, " section %s",
257 bfd_section_name (objfile->obfd,
258 section->the_bfd_section));
259 else
260 fprintf_filtered (outfile, " spurious section %ld",
4c8429ef 261 (long) (section - objfile->sections));
8625fc1b 262 }
efd66ac6 263 if (MSYMBOL_DEMANGLED_NAME (msymbol) != NULL)
c906108c 264 {
efd66ac6 265 fprintf_filtered (outfile, " %s", MSYMBOL_DEMANGLED_NAME (msymbol));
c906108c 266 }
c906108c
SS
267 if (msymbol->filename)
268 fprintf_filtered (outfile, " %s", msymbol->filename);
c906108c 269 fputs_filtered ("\n", outfile);
3567439c 270 index++;
c906108c 271 }
34643a32 272 if (objfile->per_bfd->minimal_symbol_count != index)
c906108c 273 {
8a3fe4f8 274 warning (_("internal error: minimal symbol count %d != %d"),
34643a32 275 objfile->per_bfd->minimal_symbol_count, index);
c906108c
SS
276 }
277 fprintf_filtered (outfile, "\n");
278}
279
c5aa993b 280static void
d04c1a59 281dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile)
c906108c 282{
d04c1a59 283 struct objfile *objfile = SYMTAB_OBJFILE (symtab);
5af949e3 284 struct gdbarch *gdbarch = get_objfile_arch (objfile);
de4f826b
DC
285 int i;
286 struct dict_iterator iter;
952a6d41 287 int len;
de4f826b 288 struct linetable *l;
346d1dfe 289 const struct blockvector *bv;
e88c90f2 290 struct symbol *sym;
de4f826b 291 struct block *b;
c906108c
SS
292 int depth;
293
05cba821
JK
294 fprintf_filtered (outfile, "\nSymtab for file %s\n",
295 symtab_to_filename_for_display (symtab));
ee6f8984 296 if (SYMTAB_DIRNAME (symtab) != NULL)
c906108c 297 fprintf_filtered (outfile, "Compilation directory is %s\n",
ee6f8984 298 SYMTAB_DIRNAME (symtab));
4262abfb
JK
299 fprintf_filtered (outfile, "Read from object file %s (",
300 objfile_name (objfile));
d4f3574e 301 gdb_print_host_address (objfile, outfile);
c906108c 302 fprintf_filtered (outfile, ")\n");
3e43a32a
MS
303 fprintf_filtered (outfile, "Language: %s\n",
304 language_str (symtab->language));
c906108c
SS
305
306 /* First print the line table. */
8435453b 307 l = SYMTAB_LINETABLE (symtab);
c906108c
SS
308 if (l)
309 {
310 fprintf_filtered (outfile, "\nLine table:\n\n");
311 len = l->nitems;
312 for (i = 0; i < len; i++)
313 {
314 fprintf_filtered (outfile, " line %d at ", l->item[i].line);
5af949e3 315 fputs_filtered (paddress (gdbarch, l->item[i].pc), outfile);
c906108c
SS
316 fprintf_filtered (outfile, "\n");
317 }
318 }
43f3e411 319 /* Now print the block info, but only for compunit symtabs since we will
c378eb4e 320 print lots of duplicate info otherwise. */
43f3e411 321 if (symtab == COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab)))
c906108c
SS
322 {
323 fprintf_filtered (outfile, "\nBlockvector:\n\n");
439247b6 324 bv = SYMTAB_BLOCKVECTOR (symtab);
c906108c
SS
325 len = BLOCKVECTOR_NBLOCKS (bv);
326 for (i = 0; i < len; i++)
327 {
328 b = BLOCKVECTOR_BLOCK (bv, i);
329 depth = block_depth (b) * 2;
330 print_spaces (depth, outfile);
331 fprintf_filtered (outfile, "block #%03d, object at ", i);
d4f3574e 332 gdb_print_host_address (b, outfile);
c906108c
SS
333 if (BLOCK_SUPERBLOCK (b))
334 {
335 fprintf_filtered (outfile, " under ");
d4f3574e 336 gdb_print_host_address (BLOCK_SUPERBLOCK (b), outfile);
c906108c 337 }
261397f8
DJ
338 /* drow/2002-07-10: We could save the total symbols count
339 even if we're using a hashtable, but nothing else but this message
340 wants it. */
de4f826b
DC
341 fprintf_filtered (outfile, ", %d syms/buckets in ",
342 dict_size (BLOCK_DICT (b)));
5af949e3 343 fputs_filtered (paddress (gdbarch, BLOCK_START (b)), outfile);
c906108c 344 fprintf_filtered (outfile, "..");
5af949e3 345 fputs_filtered (paddress (gdbarch, BLOCK_END (b)), outfile);
c906108c
SS
346 if (BLOCK_FUNCTION (b))
347 {
3567439c
DJ
348 fprintf_filtered (outfile, ", function %s",
349 SYMBOL_LINKAGE_NAME (BLOCK_FUNCTION (b)));
c906108c
SS
350 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)) != NULL)
351 {
352 fprintf_filtered (outfile, ", %s",
c5aa993b 353 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)));
c906108c
SS
354 }
355 }
c906108c 356 fprintf_filtered (outfile, "\n");
261397f8 357 /* Now print each symbol in this block (in no particular order, if
8157b174
TT
358 we're using a hashtable). Note that we only want this
359 block, not any blocks from included symtabs. */
360 ALL_DICT_SYMBOLS (BLOCK_DICT (b), iter, sym)
c906108c
SS
361 {
362 struct print_symbol_args s;
433759f7 363
5af949e3 364 s.gdbarch = gdbarch;
e88c90f2 365 s.symbol = sym;
c906108c
SS
366 s.depth = depth + 1;
367 s.outfile = outfile;
368 catch_errors (print_symbol, &s, "Error printing symbol:\n",
5c3ce3f7 369 RETURN_MASK_ERROR);
c906108c
SS
370 }
371 }
372 fprintf_filtered (outfile, "\n");
373 }
374 else
375 {
6c739336
DE
376 const char *compunit_filename
377 = symtab_to_filename_for_display (COMPUNIT_FILETABS (SYMTAB_COMPUNIT (symtab)));
378
379 fprintf_filtered (outfile,
380 "\nBlockvector same as owning compunit: %s\n\n",
381 compunit_filename);
c906108c
SS
382 }
383}
384
44b164c5 385static void
d04c1a59 386dump_symtab (struct symtab *symtab, struct ui_file *outfile)
44b164c5 387{
44b164c5
JB
388 /* Set the current language to the language of the symtab we're dumping
389 because certain routines used during dump_symtab() use the current
969107c5
EZ
390 language to print an image of the symbol. We'll restore it later.
391 But use only real languages, not placeholders. */
392 if (symtab->language != language_unknown
393 && symtab->language != language_auto)
394 {
395 enum language saved_lang;
396
397 saved_lang = set_language (symtab->language);
44b164c5 398
d04c1a59 399 dump_symtab_1 (symtab, outfile);
44b164c5 400
969107c5
EZ
401 set_language (saved_lang);
402 }
403 else
d04c1a59 404 dump_symtab_1 (symtab, outfile);
44b164c5
JB
405}
406
80480540 407static void
fba45db2 408maintenance_print_symbols (char *args, int from_tty)
c906108c
SS
409{
410 char **argv;
34c41c68 411 struct ui_file *outfile = gdb_stdout;
c906108c 412 struct cleanup *cleanups;
34c41c68
DE
413 char *address_arg = NULL, *source_arg = NULL, *objfile_arg = NULL;
414 int i, outfile_idx;
c906108c
SS
415
416 dont_repeat ();
417
d1a41061 418 argv = gdb_buildargv (args);
7a292a7a 419 cleanups = make_cleanup_freeargv (argv);
c906108c 420
34c41c68 421 for (i = 0; argv[i] != NULL; ++i)
c906108c 422 {
34c41c68
DE
423 if (strcmp (argv[i], "-pc") == 0)
424 {
425 if (argv[i + 1] == NULL)
426 error (_("Missing pc value"));
427 address_arg = argv[++i];
428 }
429 else if (strcmp (argv[i], "-source") == 0)
430 {
431 if (argv[i + 1] == NULL)
432 error (_("Missing source file"));
433 source_arg = argv[++i];
434 }
435 else if (strcmp (argv[i], "-objfile") == 0)
436 {
437 if (argv[i + 1] == NULL)
438 error (_("Missing objfile name"));
439 objfile_arg = argv[++i];
440 }
441 else if (strcmp (argv[i], "--") == 0)
442 {
443 /* End of options. */
444 ++i;
445 break;
446 }
447 else if (argv[i][0] == '-')
c906108c 448 {
34c41c68
DE
449 /* Future proofing: Don't allow OUTFILE to begin with "-". */
450 error (_("Unknown option: %s"), argv[i]);
c906108c 451 }
34c41c68
DE
452 else
453 break;
c906108c 454 }
34c41c68 455 outfile_idx = i;
c906108c 456
34c41c68
DE
457 if (address_arg != NULL && source_arg != NULL)
458 error (_("Must specify at most one of -pc and -source"));
c5aa993b 459
34c41c68
DE
460 if (argv[outfile_idx] != NULL)
461 {
462 char *outfile_name;
463
464 if (argv[outfile_idx + 1] != NULL)
465 error (_("Junk at end of command"));
466 outfile_name = tilde_expand (argv[outfile_idx]);
467 make_cleanup (xfree, outfile_name);
468 outfile = gdb_fopen (outfile_name, FOPEN_WT);
469 if (outfile == NULL)
470 perror_with_name (outfile_name);
471 make_cleanup_ui_file_delete (outfile);
472 }
c906108c 473
34c41c68 474 if (address_arg != NULL)
27618ce4 475 {
34c41c68
DE
476 CORE_ADDR pc = parse_and_eval_address (address_arg);
477 struct symtab *s = find_pc_line_symtab (pc);
478
479 if (s == NULL)
480 error (_("No symtab for address: %s"), address_arg);
481 dump_symtab (s, outfile);
27618ce4 482 }
34c41c68
DE
483 else
484 {
485 struct objfile *objfile;
486 struct compunit_symtab *cu;
487 struct symtab *s;
488 int found = 0;
489
490 ALL_OBJFILES (objfile)
491 {
492 int print_for_objfile = 1;
493
494 if (objfile_arg != NULL)
495 print_for_objfile
496 = compare_filenames_for_search (objfile_name (objfile),
497 objfile_arg);
498 if (!print_for_objfile)
499 continue;
500
501 ALL_OBJFILE_FILETABS (objfile, cu, s)
502 {
503 int print_for_source = 0;
504
505 QUIT;
506 if (source_arg != NULL)
507 {
508 print_for_source
509 = compare_filenames_for_search
510 (symtab_to_filename_for_display (s), source_arg);
511 found = 1;
512 }
513 if (source_arg == NULL
514 || print_for_source)
515 dump_symtab (s, outfile);
516 }
517 }
518
519 if (source_arg != NULL && !found)
520 error (_("No symtab for source file: %s"), source_arg);
521 }
522
c906108c
SS
523 do_cleanups (cleanups);
524}
525
526/* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
527 far to indent. ARGS is really a struct print_symbol_args *, but is
528 declared as char * to get it past catch_errors. Returns 0 for error,
529 1 for success. */
530
531static int
4efb68b1 532print_symbol (void *args)
c906108c 533{
5af949e3 534 struct gdbarch *gdbarch = ((struct print_symbol_args *) args)->gdbarch;
c5aa993b
JM
535 struct symbol *symbol = ((struct print_symbol_args *) args)->symbol;
536 int depth = ((struct print_symbol_args *) args)->depth;
d9fcf2fb 537 struct ui_file *outfile = ((struct print_symbol_args *) args)->outfile;
1994afbf
DE
538 struct obj_section *section;
539
540 if (SYMBOL_OBJFILE_OWNED (symbol))
541 section = SYMBOL_OBJ_SECTION (symbol_objfile (symbol), symbol);
542 else
543 section = NULL;
c906108c
SS
544
545 print_spaces (depth, outfile);
176620f1 546 if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN)
c906108c 547 {
de5ad195 548 fprintf_filtered (outfile, "label %s at ", SYMBOL_PRINT_NAME (symbol));
5af949e3
UW
549 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
550 outfile);
714835d5 551 if (section)
c906108c 552 fprintf_filtered (outfile, " section %s\n",
714835d5
UW
553 bfd_section_name (section->the_bfd_section->owner,
554 section->the_bfd_section));
c906108c
SS
555 else
556 fprintf_filtered (outfile, "\n");
557 return 1;
558 }
176620f1 559 if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN)
c906108c
SS
560 {
561 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol)))
562 {
79d43c61
TT
563 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
564 &type_print_raw_options);
c906108c
SS
565 }
566 else
567 {
568 fprintf_filtered (outfile, "%s %s = ",
c5aa993b
JM
569 (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_ENUM
570 ? "enum"
571 : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
572 ? "struct" : "union")),
3567439c 573 SYMBOL_LINKAGE_NAME (symbol));
79d43c61
TT
574 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
575 &type_print_raw_options);
c906108c
SS
576 }
577 fprintf_filtered (outfile, ";\n");
578 }
579 else
580 {
581 if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
582 fprintf_filtered (outfile, "typedef ");
583 if (SYMBOL_TYPE (symbol))
584 {
585 /* Print details of types, except for enums where it's clutter. */
de5ad195 586 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol),
c906108c
SS
587 outfile,
588 TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
79d43c61
TT
589 depth,
590 &type_print_raw_options);
c906108c
SS
591 fprintf_filtered (outfile, "; ");
592 }
593 else
de5ad195 594 fprintf_filtered (outfile, "%s ", SYMBOL_PRINT_NAME (symbol));
c906108c
SS
595
596 switch (SYMBOL_CLASS (symbol))
597 {
598 case LOC_CONST:
12df843f
JK
599 fprintf_filtered (outfile, "const %s (%s)",
600 plongest (SYMBOL_VALUE (symbol)),
601 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
602 break;
603
604 case LOC_CONST_BYTES:
605 {
606 unsigned i;
607 struct type *type = check_typedef (SYMBOL_TYPE (symbol));
433759f7 608
c906108c
SS
609 fprintf_filtered (outfile, "const %u hex bytes:",
610 TYPE_LENGTH (type));
611 for (i = 0; i < TYPE_LENGTH (type); i++)
612 fprintf_filtered (outfile, " %02x",
c5aa993b 613 (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
c906108c
SS
614 }
615 break;
616
617 case LOC_STATIC:
618 fprintf_filtered (outfile, "static at ");
5af949e3
UW
619 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
620 outfile);
714835d5 621 if (section)
c906108c 622 fprintf_filtered (outfile, " section %s",
714835d5
UW
623 bfd_section_name (section->the_bfd_section->owner,
624 section->the_bfd_section));
c906108c
SS
625 break;
626
c906108c 627 case LOC_REGISTER:
2a2d4dc3 628 if (SYMBOL_IS_ARGUMENT (symbol))
12df843f
JK
629 fprintf_filtered (outfile, "parameter register %s",
630 plongest (SYMBOL_VALUE (symbol)));
2a2d4dc3 631 else
12df843f
JK
632 fprintf_filtered (outfile, "register %s",
633 plongest (SYMBOL_VALUE (symbol)));
c906108c
SS
634 break;
635
636 case LOC_ARG:
12df843f
JK
637 fprintf_filtered (outfile, "arg at offset %s",
638 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
639 break;
640
c906108c 641 case LOC_REF_ARG:
12df843f
JK
642 fprintf_filtered (outfile, "reference arg at %s",
643 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
644 break;
645
c906108c 646 case LOC_REGPARM_ADDR:
12df843f
JK
647 fprintf_filtered (outfile, "address parameter register %s",
648 plongest (SYMBOL_VALUE (symbol)));
c906108c
SS
649 break;
650
651 case LOC_LOCAL:
12df843f
JK
652 fprintf_filtered (outfile, "local at offset %s",
653 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
654 break;
655
c906108c
SS
656 case LOC_TYPEDEF:
657 break;
658
659 case LOC_LABEL:
660 fprintf_filtered (outfile, "label at ");
5af949e3
UW
661 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
662 outfile);
714835d5 663 if (section)
c906108c 664 fprintf_filtered (outfile, " section %s",
714835d5
UW
665 bfd_section_name (section->the_bfd_section->owner,
666 section->the_bfd_section));
c906108c
SS
667 break;
668
669 case LOC_BLOCK:
670 fprintf_filtered (outfile, "block object ");
d4f3574e 671 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol), outfile);
c906108c 672 fprintf_filtered (outfile, ", ");
5af949e3
UW
673 fputs_filtered (paddress (gdbarch,
674 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol))),
ed49a04f 675 outfile);
c906108c 676 fprintf_filtered (outfile, "..");
5af949e3
UW
677 fputs_filtered (paddress (gdbarch,
678 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol))),
ed49a04f 679 outfile);
714835d5 680 if (section)
c906108c 681 fprintf_filtered (outfile, " section %s",
714835d5
UW
682 bfd_section_name (section->the_bfd_section->owner,
683 section->the_bfd_section));
c906108c
SS
684 break;
685
4c2df51b 686 case LOC_COMPUTED:
4c2df51b
DJ
687 fprintf_filtered (outfile, "computed at runtime");
688 break;
689
c906108c
SS
690 case LOC_UNRESOLVED:
691 fprintf_filtered (outfile, "unresolved");
692 break;
693
694 case LOC_OPTIMIZED_OUT:
695 fprintf_filtered (outfile, "optimized out");
696 break;
697
c5aa993b 698 default:
c906108c
SS
699 fprintf_filtered (outfile, "botched symbol class %x",
700 SYMBOL_CLASS (symbol));
701 break;
702 }
703 }
704 fprintf_filtered (outfile, "\n");
705 return 1;
706}
707
80480540 708static void
fba45db2 709maintenance_print_msymbols (char *args, int from_tty)
c906108c
SS
710{
711 char **argv;
34c41c68 712 struct ui_file *outfile = gdb_stdout;
c906108c 713 struct cleanup *cleanups;
34c41c68 714 char *objfile_arg = NULL;
c906108c 715 struct objfile *objfile;
34c41c68 716 int i, outfile_idx;
07318b29 717
c906108c
SS
718 dont_repeat ();
719
d1a41061 720 argv = gdb_buildargv (args);
7a292a7a 721 cleanups = make_cleanup_freeargv (argv);
c906108c 722
34c41c68 723 for (i = 0; argv[i] != NULL; ++i)
c906108c 724 {
34c41c68 725 if (strcmp (argv[i], "-objfile") == 0)
c906108c 726 {
34c41c68
DE
727 if (argv[i + 1] == NULL)
728 error (_("Missing objfile name"));
729 objfile_arg = argv[++i];
730 }
731 else if (strcmp (argv[i], "--") == 0)
732 {
733 /* End of options. */
734 ++i;
735 break;
c906108c 736 }
34c41c68
DE
737 else if (argv[i][0] == '-')
738 {
739 /* Future proofing: Don't allow OUTFILE to begin with "-". */
740 error (_("Unknown option: %s"), argv[i]);
741 }
742 else
743 break;
c906108c 744 }
34c41c68 745 outfile_idx = i;
c906108c 746
34c41c68
DE
747 if (argv[outfile_idx] != NULL)
748 {
749 char *outfile_name;
750
751 if (argv[outfile_idx + 1] != NULL)
752 error (_("Junk at end of command"));
753 outfile_name = tilde_expand (argv[outfile_idx]);
754 make_cleanup (xfree, outfile_name);
755 outfile = gdb_fopen (outfile_name, FOPEN_WT);
756 if (outfile == NULL)
757 perror_with_name (outfile_name);
758 make_cleanup_ui_file_delete (outfile);
759 }
c5aa993b 760
34c41c68
DE
761 ALL_OBJFILES (objfile)
762 {
763 QUIT;
764 if (objfile_arg == NULL
765 || compare_filenames_for_search (objfile_name (objfile), objfile_arg))
766 dump_msymbols (objfile, outfile);
767 }
c906108c 768
c906108c
SS
769 do_cleanups (cleanups);
770}
771
80480540 772static void
52e260a3 773maintenance_print_objfiles (char *regexp, int from_tty)
c906108c 774{
6c95b8df 775 struct program_space *pspace;
c906108c
SS
776 struct objfile *objfile;
777
778 dont_repeat ();
779
52e260a3
DE
780 if (regexp)
781 re_comp (regexp);
782
6c95b8df
PA
783 ALL_PSPACES (pspace)
784 ALL_PSPACE_OBJFILES (pspace, objfile)
27618ce4
TT
785 {
786 QUIT;
52e260a3 787 if (! regexp
4262abfb 788 || re_exec (objfile_name (objfile)))
52e260a3 789 dump_objfile (objfile);
27618ce4 790 }
c906108c
SS
791}
792
5e7b2f39 793/* List all the symbol tables whose names match REGEXP (optional). */
b5ebcee6 794
80480540 795static void
5e7b2f39 796maintenance_info_symtabs (char *regexp, int from_tty)
44ea7b70 797{
6c95b8df 798 struct program_space *pspace;
44ea7b70
JB
799 struct objfile *objfile;
800
db68bbae
DE
801 dont_repeat ();
802
44ea7b70
JB
803 if (regexp)
804 re_comp (regexp);
805
6c95b8df
PA
806 ALL_PSPACES (pspace)
807 ALL_PSPACE_OBJFILES (pspace, objfile)
44ea7b70 808 {
43f3e411 809 struct compunit_symtab *cust;
44ea7b70 810 struct symtab *symtab;
26a84859 811
44ea7b70
JB
812 /* We don't want to print anything for this objfile until we
813 actually find a symtab whose name matches. */
814 int printed_objfile_start = 0;
815
43f3e411 816 ALL_OBJFILE_COMPUNITS (objfile, cust)
8a498d38 817 {
43f3e411 818 int printed_compunit_symtab_start = 0;
8a498d38 819
43f3e411 820 ALL_COMPUNIT_FILETABS (cust, symtab)
8a498d38 821 {
43f3e411
DE
822 QUIT;
823
824 if (! regexp
825 || re_exec (symtab_to_filename_for_display (symtab)))
8a498d38 826 {
43f3e411
DE
827 if (! printed_objfile_start)
828 {
829 printf_filtered ("{ objfile %s ", objfile_name (objfile));
830 wrap_here (" ");
831 printf_filtered ("((struct objfile *) %s)\n",
832 host_address_to_string (objfile));
833 printed_objfile_start = 1;
834 }
835 if (! printed_compunit_symtab_start)
836 {
837 printf_filtered (" { ((struct compunit_symtab *) %s)\n",
838 host_address_to_string (cust));
839 printf_filtered (" debugformat %s\n",
840 COMPUNIT_DEBUGFORMAT (cust));
841 printf_filtered (" producer %s\n",
842 COMPUNIT_PRODUCER (cust) != NULL
843 ? COMPUNIT_PRODUCER (cust)
844 : "(null)");
845 printf_filtered (" dirname %s\n",
846 COMPUNIT_DIRNAME (cust) != NULL
847 ? COMPUNIT_DIRNAME (cust)
848 : "(null)");
849 printf_filtered (" blockvector"
850 " ((struct blockvector *) %s)\n",
851 host_address_to_string
852 (COMPUNIT_BLOCKVECTOR (cust)));
853 printed_compunit_symtab_start = 1;
854 }
855
856 printf_filtered ("\t{ symtab %s ",
857 symtab_to_filename_for_display (symtab));
858 wrap_here (" ");
859 printf_filtered ("((struct symtab *) %s)\n",
860 host_address_to_string (symtab));
861 printf_filtered ("\t fullname %s\n",
862 symtab->fullname != NULL
863 ? symtab->fullname
864 : "(null)");
865 printf_filtered ("\t "
866 "linetable ((struct linetable *) %s)\n",
867 host_address_to_string (symtab->linetable));
868 printf_filtered ("\t}\n");
8a498d38 869 }
8a498d38 870 }
43f3e411
DE
871
872 if (printed_compunit_symtab_start)
873 printf_filtered (" }\n");
8a498d38 874 }
44ea7b70
JB
875
876 if (printed_objfile_start)
877 printf_filtered ("}\n");
878 }
879}
7d0c9981
DE
880
881/* Check consistency of symtabs.
882 An example of what this checks for is NULL blockvectors.
883 They can happen if there's a bug during debug info reading.
884 GDB assumes they are always non-NULL.
885
886 Note: This does not check for psymtab vs symtab consistency.
887 Use "maint check-psymtabs" for that. */
888
889static void
890maintenance_check_symtabs (char *ignore, int from_tty)
891{
892 struct program_space *pspace;
893 struct objfile *objfile;
894
895 ALL_PSPACES (pspace)
896 ALL_PSPACE_OBJFILES (pspace, objfile)
897 {
43f3e411 898 struct compunit_symtab *cust;
7d0c9981
DE
899
900 /* We don't want to print anything for this objfile until we
901 actually find something worth printing. */
902 int printed_objfile_start = 0;
903
43f3e411 904 ALL_OBJFILE_COMPUNITS (objfile, cust)
7d0c9981
DE
905 {
906 int found_something = 0;
43f3e411 907 struct symtab *symtab = compunit_primary_filetab (cust);
7d0c9981
DE
908
909 QUIT;
910
43f3e411 911 if (COMPUNIT_BLOCKVECTOR (cust) == NULL)
7d0c9981
DE
912 found_something = 1;
913 /* Add more checks here. */
914
915 if (found_something)
916 {
917 if (! printed_objfile_start)
918 {
4262abfb 919 printf_filtered ("{ objfile %s ", objfile_name (objfile));
7d0c9981 920 wrap_here (" ");
26a84859 921 printf_filtered ("((struct objfile *) %s)\n",
7d0c9981
DE
922 host_address_to_string (objfile));
923 printed_objfile_start = 1;
924 }
925 printf_filtered (" { symtab %s\n",
926 symtab_to_filename_for_display (symtab));
43f3e411 927 if (COMPUNIT_BLOCKVECTOR (cust) == NULL)
7d0c9981
DE
928 printf_filtered (" NULL blockvector\n");
929 printf_filtered (" }\n");
930 }
931 }
932
933 if (printed_objfile_start)
934 printf_filtered ("}\n");
935 }
936}
937
938/* Helper function for maintenance_expand_symtabs.
939 This is the name_matcher function for expand_symtabs_matching. */
940
941static int
942maintenance_expand_name_matcher (const char *symname, void *data)
943{
944 /* Since we're not searching on symbols, just return TRUE. */
945 return 1;
946}
947
948/* Helper function for maintenance_expand_symtabs.
949 This is the file_matcher function for expand_symtabs_matching. */
950
951static int
952maintenance_expand_file_matcher (const char *filename, void *data,
953 int basenames)
954{
19ba03f4 955 const char *regexp = (const char *) data;
7d0c9981
DE
956
957 QUIT;
958
959 /* KISS: Only apply the regexp to the complete file name. */
960 if (basenames)
961 return 0;
962
963 if (regexp == NULL || re_exec (filename))
964 return 1;
965
966 return 0;
967}
968
969/* Expand all symbol tables whose name matches an optional regexp. */
970
971static void
972maintenance_expand_symtabs (char *args, int from_tty)
973{
974 struct program_space *pspace;
975 struct objfile *objfile;
976 struct cleanup *cleanups;
977 char **argv;
978 char *regexp = NULL;
979
980 /* We use buildargv here so that we handle spaces in the regexp
981 in a way that allows adding more arguments later. */
982 argv = gdb_buildargv (args);
983 cleanups = make_cleanup_freeargv (argv);
984
985 if (argv != NULL)
986 {
987 if (argv[0] != NULL)
988 {
989 regexp = argv[0];
990 if (argv[1] != NULL)
991 error (_("Extra arguments after regexp."));
992 }
993 }
994
995 if (regexp)
996 re_comp (regexp);
997
998 ALL_PSPACES (pspace)
999 ALL_PSPACE_OBJFILES (pspace, objfile)
1000 {
1001 if (objfile->sf)
1002 {
1003 objfile->sf->qf->expand_symtabs_matching
1004 (objfile, maintenance_expand_file_matcher,
276d885b 1005 maintenance_expand_name_matcher, NULL, ALL_DOMAIN, regexp);
7d0c9981
DE
1006 }
1007 }
4e993a19
TT
1008
1009 do_cleanups (cleanups);
7d0c9981 1010}
c906108c 1011\f
c5aa993b 1012
c906108c
SS
1013/* Return the nexting depth of a block within other blocks in its symtab. */
1014
1015static int
fba45db2 1016block_depth (struct block *block)
c906108c 1017{
52f0bd74 1018 int i = 0;
433759f7 1019
c5aa993b 1020 while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
c906108c
SS
1021 {
1022 i++;
1023 }
1024 return i;
1025}
c906108c 1026\f
c5aa993b 1027
f2403c39
AB
1028/* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
1029 single line table. */
1030
1031static int
1032maintenance_print_one_line_table (struct symtab *symtab, void *data)
1033{
1034 struct linetable *linetable;
1035 struct objfile *objfile;
1036
1037 objfile = symtab->compunit_symtab->objfile;
1038 printf_filtered (_("objfile: %s ((struct objfile *) %s)\n"),
1039 objfile_name (objfile),
1040 host_address_to_string (objfile));
1041 printf_filtered (_("compunit_symtab: ((struct compunit_symtab *) %s)\n"),
1042 host_address_to_string (symtab->compunit_symtab));
1043 printf_filtered (_("symtab: %s ((struct symtab *) %s)\n"),
1044 symtab_to_fullname (symtab),
1045 host_address_to_string (symtab));
1046 linetable = SYMTAB_LINETABLE (symtab);
1047 printf_filtered (_("linetable: ((struct linetable *) %s):\n"),
1048 host_address_to_string (linetable));
1049
1050 if (linetable == NULL)
1051 printf_filtered (_("No line table.\n"));
1052 else if (linetable->nitems <= 0)
1053 printf_filtered (_("Line table has no lines.\n"));
1054 else
1055 {
1056 int i;
1057
1058 /* Leave space for 6 digits of index and line number. After that the
1059 tables will just not format as well. */
1060 printf_filtered (_("%-6s %6s %s\n"),
1061 _("INDEX"), _("LINE"), _("ADDRESS"));
1062
1063 for (i = 0; i < linetable->nitems; ++i)
1064 {
1065 struct linetable_entry *item;
f2403c39
AB
1066
1067 item = &linetable->item [i];
1068 printf_filtered (_("%-6d %6d %s\n"), i, item->line,
1069 core_addr_to_string (item->pc));
1070 }
1071 }
1072
1073 return 0;
1074}
1075
1076/* Implement the 'maint info line-table' command. */
1077
1078static void
1079maintenance_info_line_tables (char *regexp, int from_tty)
1080{
1081 struct program_space *pspace;
1082 struct objfile *objfile;
1083
1084 dont_repeat ();
1085
1086 if (regexp != NULL)
1087 re_comp (regexp);
1088
1089 ALL_PSPACES (pspace)
1090 ALL_PSPACE_OBJFILES (pspace, objfile)
1091 {
1092 struct compunit_symtab *cust;
1093 struct symtab *symtab;
1094
1095 ALL_OBJFILE_COMPUNITS (objfile, cust)
1096 {
1097 ALL_COMPUNIT_FILETABS (cust, symtab)
1098 {
1099 QUIT;
1100
1101 if (regexp == NULL
1102 || re_exec (symtab_to_filename_for_display (symtab)))
1103 maintenance_print_one_line_table (symtab, NULL);
1104 }
1105 }
1106 }
1107}
1108
1109\f
1110
c378eb4e 1111/* Do early runtime initializations. */
b5ebcee6 1112
c906108c 1113void
fba45db2 1114_initialize_symmisc (void)
c906108c 1115{
c5aa993b 1116 std_in = stdin;
c906108c
SS
1117 std_out = stdout;
1118 std_err = stderr;
80480540
YQ
1119
1120 add_cmd ("symbols", class_maintenance, maintenance_print_symbols, _("\
1121Print dump of current symbol definitions.\n\
34c41c68
DE
1122Usage: mt print symbols [-pc address] [--] [outfile]\n\
1123 mt print symbols [-objfile objfile] [-source source] [--] [outfile]\n\
1124Entries in the full symbol table are dumped to file OUTFILE,\n\
1125or the terminal if OUTFILE is unspecified.\n\
1126If ADDRESS is provided, dump only the file for that address.\n\
1127If SOURCE is provided, dump only that file's symbols.\n\
1128If OBJFILE is provided, dump only that file's minimal symbols."),
80480540
YQ
1129 &maintenanceprintlist);
1130
1131 add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols, _("\
1132Print dump of current minimal symbol definitions.\n\
34c41c68
DE
1133Usage: mt print msymbols [-objfile objfile] [--] [outfile]\n\
1134Entries in the minimal symbol table are dumped to file OUTFILE,\n\
1135or the terminal if OUTFILE is unspecified.\n\
1136If OBJFILE is provided, dump only that file's minimal symbols."),
80480540
YQ
1137 &maintenanceprintlist);
1138
1139 add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles,
52e260a3
DE
1140 _("Print dump of current object file definitions.\n\
1141With an argument REGEXP, list the object files with matching names."),
80480540
YQ
1142 &maintenanceprintlist);
1143
1144 add_cmd ("symtabs", class_maintenance, maintenance_info_symtabs, _("\
1145List the full symbol tables for all object files.\n\
1146This does not include information about individual symbols, blocks, or\n\
1147linetables --- just the symbol table structures themselves.\n\
db68bbae 1148With an argument REGEXP, list the symbol tables with matching names."),
80480540 1149 &maintenanceinfolist);
7d0c9981 1150
f2403c39
AB
1151 add_cmd ("line-table", class_maintenance, maintenance_info_line_tables, _("\
1152List the contents of all line tables, from all symbol tables.\n\
1153With an argument REGEXP, list just the line tables for the symbol\n\
1154tables with matching names."),
1155 &maintenanceinfolist);
1156
7d0c9981
DE
1157 add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
1158 _("\
1159Check consistency of currently expanded symtabs."),
1160 &maintenancelist);
1161
1162 add_cmd ("expand-symtabs", class_maintenance, maintenance_expand_symtabs,
1163 _("Expand symbol tables.\n\
1164With an argument REGEXP, only expand the symbol tables with matching names."),
1165 &maintenancelist);
c906108c 1166}
This page took 2.663306 seconds and 4 git commands to generate.