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