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