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