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