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