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