import strstr and strerror modules
[deliverable/binutils-gdb.git] / gdb / symmisc.c
CommitLineData
c906108c 1/* Do various things to symbol tables (other than lookup), for GDB.
af5f3db6 2
28e7fd62 3 Copyright (C) 1986-2013 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"
60250e8b 30#include "exceptions.h"
c906108c
SS
31#include "language.h"
32#include "bcache.h"
fe898f56 33#include "block.h"
44ea7b70 34#include "gdb_regex.h"
07318b29 35#include "gdb_stat.h"
de4f826b 36#include "dictionary.h"
79d43c61 37#include "typeprint.h"
80480540 38#include "gdbcmd.h"
05cba821 39#include "source.h"
c906108c
SS
40
41#include "gdb_string.h"
dbda9972 42#include "readline/readline.h"
c906108c 43
ccefe4c4
TT
44#include "psymtab.h"
45
c906108c
SS
46#ifndef DEV_TTY
47#define DEV_TTY "/dev/tty"
48#endif
49
50/* Unfortunately for debugging, stderr is usually a macro. This is painful
51 when calling functions that take FILE *'s from the debugger.
52 So we make a variable which has the same value and which is accessible when
53 debugging GDB with itself. Because stdin et al need not be constants,
54 we initialize them in the _initialize_symmisc function at the bottom
55 of the file. */
56FILE *std_in;
57FILE *std_out;
58FILE *std_err;
59
60/* Prototypes for local functions */
61
a14ed312 62static int block_depth (struct block *);
c906108c 63
a14ed312 64void _initialize_symmisc (void);
c906108c 65
c5aa993b
JM
66struct print_symbol_args
67 {
5af949e3 68 struct gdbarch *gdbarch;
c5aa993b
JM
69 struct symbol *symbol;
70 int depth;
d9fcf2fb 71 struct ui_file *outfile;
c5aa993b 72 };
c906108c 73
4efb68b1 74static int print_symbol (void *);
c906108c 75\f
c906108c 76
c906108c 77void
fba45db2 78print_symbol_bcache_statistics (void)
c906108c 79{
6c95b8df 80 struct program_space *pspace;
c906108c
SS
81 struct objfile *objfile;
82
6c95b8df
PA
83 ALL_PSPACES (pspace)
84 ALL_PSPACE_OBJFILES (pspace, objfile)
c5aa993b 85 {
27618ce4 86 QUIT;
4262abfb
JK
87 printf_filtered (_("Byte cache statistics for '%s':\n"),
88 objfile_name (objfile));
710e1a31
SW
89 print_bcache_statistics (psymbol_bcache_get_bcache (objfile->psymbol_cache),
90 "partial symbol cache");
6532ff36
TT
91 print_bcache_statistics (objfile->per_bfd->macro_cache,
92 "preprocessor macro cache");
706e3705
TT
93 print_bcache_statistics (objfile->per_bfd->filename_cache,
94 "file name cache");
c5aa993b 95 }
c906108c
SS
96}
97
98void
fba45db2 99print_objfile_statistics (void)
c906108c 100{
6c95b8df 101 struct program_space *pspace;
c906108c 102 struct objfile *objfile;
c4f90d87 103 struct symtab *s;
c4f90d87 104 int i, linetables, blockvectors;
c906108c 105
6c95b8df
PA
106 ALL_PSPACES (pspace)
107 ALL_PSPACE_OBJFILES (pspace, objfile)
c5aa993b 108 {
27618ce4 109 QUIT;
4262abfb 110 printf_filtered (_("Statistics for '%s':\n"), objfile_name (objfile));
c5aa993b 111 if (OBJSTAT (objfile, n_stabs) > 0)
a3f17187 112 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
c5aa993b
JM
113 OBJSTAT (objfile, n_stabs));
114 if (OBJSTAT (objfile, n_minsyms) > 0)
a3f17187 115 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
c5aa993b
JM
116 OBJSTAT (objfile, n_minsyms));
117 if (OBJSTAT (objfile, n_psyms) > 0)
a3f17187 118 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
c5aa993b
JM
119 OBJSTAT (objfile, n_psyms));
120 if (OBJSTAT (objfile, n_syms) > 0)
a3f17187 121 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
c5aa993b
JM
122 OBJSTAT (objfile, n_syms));
123 if (OBJSTAT (objfile, n_types) > 0)
a3f17187 124 printf_filtered (_(" Number of \"types\" defined: %d\n"),
c5aa993b 125 OBJSTAT (objfile, n_types));
ccefe4c4
TT
126 if (objfile->sf)
127 objfile->sf->qf->print_stats (objfile);
c4f90d87
JM
128 i = linetables = blockvectors = 0;
129 ALL_OBJFILE_SYMTABS (objfile, s)
130 {
131 i++;
132 if (s->linetable != NULL)
133 linetables++;
134 if (s->primary == 1)
135 blockvectors++;
136 }
a3f17187
AC
137 printf_filtered (_(" Number of symbol tables: %d\n"), i);
138 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
c4f90d87 139 linetables);
a3f17187 140 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
c4f90d87
JM
141 blockvectors);
142
c5aa993b 143 if (OBJSTAT (objfile, sz_strtab) > 0)
a3f17187 144 printf_filtered (_(" Space used by a.out string tables: %d\n"),
c5aa993b 145 OBJSTAT (objfile, sz_strtab));
a3f17187 146 printf_filtered (_(" Total memory used for objfile obstack: %d\n"),
4a146b47 147 obstack_memory_used (&objfile->objfile_obstack));
706e3705
TT
148 printf_filtered (_(" Total memory used for BFD obstack: %d\n"),
149 obstack_memory_used (&objfile->per_bfd->storage_obstack));
a3f17187 150 printf_filtered (_(" Total memory used for psymbol cache: %d\n"),
710e1a31
SW
151 bcache_memory_used (psymbol_bcache_get_bcache
152 (objfile->psymbol_cache)));
a3f17187 153 printf_filtered (_(" Total memory used for macro cache: %d\n"),
6532ff36 154 bcache_memory_used (objfile->per_bfd->macro_cache));
10abe6bf 155 printf_filtered (_(" Total memory used for file name cache: %d\n"),
706e3705 156 bcache_memory_used (objfile->per_bfd->filename_cache));
c5aa993b 157 }
c906108c
SS
158}
159
c5aa993b 160static void
fba45db2 161dump_objfile (struct objfile *objfile)
c906108c
SS
162{
163 struct symtab *symtab;
c906108c 164
4262abfb 165 printf_filtered ("\nObject file %s: ", objfile_name (objfile));
c906108c 166 printf_filtered ("Objfile at ");
d4f3574e 167 gdb_print_host_address (objfile, gdb_stdout);
c906108c 168 printf_filtered (", bfd at ");
d4f3574e 169 gdb_print_host_address (objfile->obfd, gdb_stdout);
c906108c
SS
170 printf_filtered (", %d minsyms\n\n",
171 objfile->minimal_symbol_count);
172
ccefe4c4
TT
173 if (objfile->sf)
174 objfile->sf->qf->dump (objfile);
c906108c 175
c5aa993b 176 if (objfile->symtabs)
c906108c
SS
177 {
178 printf_filtered ("Symtabs:\n");
c5aa993b 179 for (symtab = objfile->symtabs;
c906108c
SS
180 symtab != NULL;
181 symtab = symtab->next)
182 {
05cba821 183 printf_filtered ("%s at ", symtab_to_filename_for_display (symtab));
d4f3574e 184 gdb_print_host_address (symtab, gdb_stdout);
c906108c 185 printf_filtered (", ");
c5aa993b 186 if (symtab->objfile != objfile)
c906108c
SS
187 {
188 printf_filtered ("NOT ON CHAIN! ");
189 }
190 wrap_here (" ");
191 }
192 printf_filtered ("\n\n");
193 }
194}
195
196/* Print minimal symbols from this objfile. */
c5aa993b
JM
197
198static void
fba45db2 199dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
c906108c 200{
5af949e3 201 struct gdbarch *gdbarch = get_objfile_arch (objfile);
c906108c
SS
202 struct minimal_symbol *msymbol;
203 int index;
204 char ms_type;
c5aa993b 205
4262abfb 206 fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile_name (objfile));
c5aa993b 207 if (objfile->minimal_symbol_count == 0)
c906108c
SS
208 {
209 fprintf_filtered (outfile, "No minimal symbols found.\n");
210 return;
211 }
3567439c
DJ
212 index = 0;
213 ALL_OBJFILE_MSYMBOLS (objfile, msymbol)
c906108c 214 {
e27d198c 215 struct obj_section *section = SYMBOL_OBJ_SECTION (objfile, msymbol);
714835d5 216
712f90be 217 switch (MSYMBOL_TYPE (msymbol))
c906108c 218 {
c5aa993b
JM
219 case mst_unknown:
220 ms_type = 'u';
221 break;
222 case mst_text:
223 ms_type = 'T';
224 break;
0875794a
JK
225 case mst_text_gnu_ifunc:
226 ms_type = 'i';
227 break;
c5aa993b
JM
228 case mst_solib_trampoline:
229 ms_type = 'S';
230 break;
231 case mst_data:
232 ms_type = 'D';
233 break;
234 case mst_bss:
235 ms_type = 'B';
236 break;
237 case mst_abs:
238 ms_type = 'A';
239 break;
240 case mst_file_text:
241 ms_type = 't';
242 break;
243 case mst_file_data:
244 ms_type = 'd';
245 break;
246 case mst_file_bss:
247 ms_type = 'b';
248 break;
249 default:
250 ms_type = '?';
251 break;
c906108c
SS
252 }
253 fprintf_filtered (outfile, "[%2d] %c ", index, ms_type);
5af949e3
UW
254 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msymbol)),
255 outfile);
3567439c 256 fprintf_filtered (outfile, " %s", SYMBOL_LINKAGE_NAME (msymbol));
714835d5 257 if (section)
8625fc1b
TT
258 {
259 if (section->the_bfd_section != NULL)
260 fprintf_filtered (outfile, " section %s",
261 bfd_section_name (objfile->obfd,
262 section->the_bfd_section));
263 else
264 fprintf_filtered (outfile, " spurious section %ld",
4c8429ef 265 (long) (section - objfile->sections));
8625fc1b 266 }
c906108c
SS
267 if (SYMBOL_DEMANGLED_NAME (msymbol) != NULL)
268 {
269 fprintf_filtered (outfile, " %s", SYMBOL_DEMANGLED_NAME (msymbol));
270 }
c906108c
SS
271 if (msymbol->filename)
272 fprintf_filtered (outfile, " %s", msymbol->filename);
c906108c 273 fputs_filtered ("\n", outfile);
3567439c 274 index++;
c906108c 275 }
c5aa993b 276 if (objfile->minimal_symbol_count != index)
c906108c 277 {
8a3fe4f8 278 warning (_("internal error: minimal symbol count %d != %d"),
c5aa993b 279 objfile->minimal_symbol_count, index);
c906108c
SS
280 }
281 fprintf_filtered (outfile, "\n");
282}
283
c5aa993b 284static void
44b164c5
JB
285dump_symtab_1 (struct objfile *objfile, struct symtab *symtab,
286 struct ui_file *outfile)
c906108c 287{
5af949e3 288 struct gdbarch *gdbarch = get_objfile_arch (objfile);
de4f826b
DC
289 int i;
290 struct dict_iterator iter;
952a6d41 291 int len;
de4f826b 292 struct linetable *l;
c906108c 293 struct blockvector *bv;
e88c90f2 294 struct symbol *sym;
de4f826b 295 struct block *b;
c906108c
SS
296 int depth;
297
05cba821
JK
298 fprintf_filtered (outfile, "\nSymtab for file %s\n",
299 symtab_to_filename_for_display (symtab));
c906108c
SS
300 if (symtab->dirname)
301 fprintf_filtered (outfile, "Compilation directory is %s\n",
302 symtab->dirname);
4262abfb
JK
303 fprintf_filtered (outfile, "Read from object file %s (",
304 objfile_name (objfile));
d4f3574e 305 gdb_print_host_address (objfile, outfile);
c906108c 306 fprintf_filtered (outfile, ")\n");
3e43a32a
MS
307 fprintf_filtered (outfile, "Language: %s\n",
308 language_str (symtab->language));
c906108c
SS
309
310 /* First print the line table. */
311 l = LINETABLE (symtab);
312 if (l)
313 {
314 fprintf_filtered (outfile, "\nLine table:\n\n");
315 len = l->nitems;
316 for (i = 0; i < len; i++)
317 {
318 fprintf_filtered (outfile, " line %d at ", l->item[i].line);
5af949e3 319 fputs_filtered (paddress (gdbarch, l->item[i].pc), outfile);
c906108c
SS
320 fprintf_filtered (outfile, "\n");
321 }
322 }
323 /* Now print the block info, but only for primary symtabs since we will
c378eb4e 324 print lots of duplicate info otherwise. */
c5aa993b 325 if (symtab->primary)
c906108c
SS
326 {
327 fprintf_filtered (outfile, "\nBlockvector:\n\n");
328 bv = BLOCKVECTOR (symtab);
329 len = BLOCKVECTOR_NBLOCKS (bv);
330 for (i = 0; i < len; i++)
331 {
332 b = BLOCKVECTOR_BLOCK (bv, i);
333 depth = block_depth (b) * 2;
334 print_spaces (depth, outfile);
335 fprintf_filtered (outfile, "block #%03d, object at ", i);
d4f3574e 336 gdb_print_host_address (b, outfile);
c906108c
SS
337 if (BLOCK_SUPERBLOCK (b))
338 {
339 fprintf_filtered (outfile, " under ");
d4f3574e 340 gdb_print_host_address (BLOCK_SUPERBLOCK (b), outfile);
c906108c 341 }
261397f8
DJ
342 /* drow/2002-07-10: We could save the total symbols count
343 even if we're using a hashtable, but nothing else but this message
344 wants it. */
de4f826b
DC
345 fprintf_filtered (outfile, ", %d syms/buckets in ",
346 dict_size (BLOCK_DICT (b)));
5af949e3 347 fputs_filtered (paddress (gdbarch, BLOCK_START (b)), outfile);
c906108c 348 fprintf_filtered (outfile, "..");
5af949e3 349 fputs_filtered (paddress (gdbarch, BLOCK_END (b)), outfile);
c906108c
SS
350 if (BLOCK_FUNCTION (b))
351 {
3567439c
DJ
352 fprintf_filtered (outfile, ", function %s",
353 SYMBOL_LINKAGE_NAME (BLOCK_FUNCTION (b)));
c906108c
SS
354 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)) != NULL)
355 {
356 fprintf_filtered (outfile, ", %s",
c5aa993b 357 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)));
c906108c
SS
358 }
359 }
c906108c 360 fprintf_filtered (outfile, "\n");
261397f8 361 /* Now print each symbol in this block (in no particular order, if
8157b174
TT
362 we're using a hashtable). Note that we only want this
363 block, not any blocks from included symtabs. */
364 ALL_DICT_SYMBOLS (BLOCK_DICT (b), iter, sym)
c906108c
SS
365 {
366 struct print_symbol_args s;
433759f7 367
5af949e3 368 s.gdbarch = gdbarch;
e88c90f2 369 s.symbol = sym;
c906108c
SS
370 s.depth = depth + 1;
371 s.outfile = outfile;
372 catch_errors (print_symbol, &s, "Error printing symbol:\n",
5c3ce3f7 373 RETURN_MASK_ERROR);
c906108c
SS
374 }
375 }
376 fprintf_filtered (outfile, "\n");
377 }
378 else
379 {
380 fprintf_filtered (outfile, "\nBlockvector same as previous symtab\n\n");
381 }
382}
383
44b164c5
JB
384static void
385dump_symtab (struct objfile *objfile, struct symtab *symtab,
386 struct ui_file *outfile)
387{
44b164c5
JB
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
969107c5
EZ
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);
44b164c5 398
969107c5 399 dump_symtab_1 (objfile, symtab, outfile);
44b164c5 400
969107c5
EZ
401 set_language (saved_lang);
402 }
403 else
404 dump_symtab_1 (objfile, symtab, outfile);
44b164c5
JB
405}
406
80480540 407static void
fba45db2 408maintenance_print_symbols (char *args, int from_tty)
c906108c
SS
409{
410 char **argv;
d9fcf2fb 411 struct ui_file *outfile;
c906108c
SS
412 struct cleanup *cleanups;
413 char *symname = NULL;
414 char *filename = DEV_TTY;
415 struct objfile *objfile;
416 struct symtab *s;
417
418 dont_repeat ();
419
420 if (args == NULL)
421 {
3e43a32a
MS
422 error (_("Arguments missing: an output file name "
423 "and an optional symbol file name"));
c906108c 424 }
d1a41061 425 argv = gdb_buildargv (args);
7a292a7a 426 cleanups = make_cleanup_freeargv (argv);
c906108c
SS
427
428 if (argv[0] != NULL)
429 {
430 filename = argv[0];
c378eb4e 431 /* If a second arg is supplied, it is a source file name to match on. */
c906108c
SS
432 if (argv[1] != NULL)
433 {
434 symname = argv[1];
435 }
436 }
437
438 filename = tilde_expand (filename);
b8c9b27d 439 make_cleanup (xfree, filename);
c5aa993b 440
c906108c
SS
441 outfile = gdb_fopen (filename, FOPEN_WT);
442 if (outfile == 0)
443 perror_with_name (filename);
d9fcf2fb 444 make_cleanup_ui_file_delete (outfile);
c906108c 445
c906108c 446 ALL_SYMTABS (objfile, s)
27618ce4
TT
447 {
448 QUIT;
05cba821
JK
449 if (symname == NULL
450 || filename_cmp (symname, symtab_to_filename_for_display (s)) == 0)
27618ce4
TT
451 dump_symtab (objfile, s, outfile);
452 }
c906108c
SS
453 do_cleanups (cleanups);
454}
455
456/* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
457 far to indent. ARGS is really a struct print_symbol_args *, but is
458 declared as char * to get it past catch_errors. Returns 0 for error,
459 1 for success. */
460
461static int
4efb68b1 462print_symbol (void *args)
c906108c 463{
5af949e3 464 struct gdbarch *gdbarch = ((struct print_symbol_args *) args)->gdbarch;
c5aa993b
JM
465 struct symbol *symbol = ((struct print_symbol_args *) args)->symbol;
466 int depth = ((struct print_symbol_args *) args)->depth;
d9fcf2fb 467 struct ui_file *outfile = ((struct print_symbol_args *) args)->outfile;
e27d198c
TT
468 struct obj_section *section = SYMBOL_OBJ_SECTION (SYMBOL_OBJFILE (symbol),
469 symbol);
c906108c
SS
470
471 print_spaces (depth, outfile);
176620f1 472 if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN)
c906108c 473 {
de5ad195 474 fprintf_filtered (outfile, "label %s at ", SYMBOL_PRINT_NAME (symbol));
5af949e3
UW
475 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
476 outfile);
714835d5 477 if (section)
c906108c 478 fprintf_filtered (outfile, " section %s\n",
714835d5
UW
479 bfd_section_name (section->the_bfd_section->owner,
480 section->the_bfd_section));
c906108c
SS
481 else
482 fprintf_filtered (outfile, "\n");
483 return 1;
484 }
176620f1 485 if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN)
c906108c
SS
486 {
487 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol)))
488 {
79d43c61
TT
489 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
490 &type_print_raw_options);
c906108c
SS
491 }
492 else
493 {
494 fprintf_filtered (outfile, "%s %s = ",
c5aa993b
JM
495 (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_ENUM
496 ? "enum"
497 : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
498 ? "struct" : "union")),
3567439c 499 SYMBOL_LINKAGE_NAME (symbol));
79d43c61
TT
500 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
501 &type_print_raw_options);
c906108c
SS
502 }
503 fprintf_filtered (outfile, ";\n");
504 }
505 else
506 {
507 if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
508 fprintf_filtered (outfile, "typedef ");
509 if (SYMBOL_TYPE (symbol))
510 {
511 /* Print details of types, except for enums where it's clutter. */
de5ad195 512 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol),
c906108c
SS
513 outfile,
514 TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
79d43c61
TT
515 depth,
516 &type_print_raw_options);
c906108c
SS
517 fprintf_filtered (outfile, "; ");
518 }
519 else
de5ad195 520 fprintf_filtered (outfile, "%s ", SYMBOL_PRINT_NAME (symbol));
c906108c
SS
521
522 switch (SYMBOL_CLASS (symbol))
523 {
524 case LOC_CONST:
12df843f
JK
525 fprintf_filtered (outfile, "const %s (%s)",
526 plongest (SYMBOL_VALUE (symbol)),
527 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
528 break;
529
530 case LOC_CONST_BYTES:
531 {
532 unsigned i;
533 struct type *type = check_typedef (SYMBOL_TYPE (symbol));
433759f7 534
c906108c
SS
535 fprintf_filtered (outfile, "const %u hex bytes:",
536 TYPE_LENGTH (type));
537 for (i = 0; i < TYPE_LENGTH (type); i++)
538 fprintf_filtered (outfile, " %02x",
c5aa993b 539 (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
c906108c
SS
540 }
541 break;
542
543 case LOC_STATIC:
544 fprintf_filtered (outfile, "static at ");
5af949e3
UW
545 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
546 outfile);
714835d5 547 if (section)
c906108c 548 fprintf_filtered (outfile, " section %s",
714835d5
UW
549 bfd_section_name (section->the_bfd_section->owner,
550 section->the_bfd_section));
c906108c
SS
551 break;
552
c906108c 553 case LOC_REGISTER:
2a2d4dc3 554 if (SYMBOL_IS_ARGUMENT (symbol))
12df843f
JK
555 fprintf_filtered (outfile, "parameter register %s",
556 plongest (SYMBOL_VALUE (symbol)));
2a2d4dc3 557 else
12df843f
JK
558 fprintf_filtered (outfile, "register %s",
559 plongest (SYMBOL_VALUE (symbol)));
c906108c
SS
560 break;
561
562 case LOC_ARG:
12df843f
JK
563 fprintf_filtered (outfile, "arg at offset %s",
564 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
565 break;
566
c906108c 567 case LOC_REF_ARG:
12df843f
JK
568 fprintf_filtered (outfile, "reference arg at %s",
569 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
570 break;
571
c906108c 572 case LOC_REGPARM_ADDR:
12df843f
JK
573 fprintf_filtered (outfile, "address parameter register %s",
574 plongest (SYMBOL_VALUE (symbol)));
c906108c
SS
575 break;
576
577 case LOC_LOCAL:
12df843f
JK
578 fprintf_filtered (outfile, "local at offset %s",
579 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
580 break;
581
c906108c
SS
582 case LOC_TYPEDEF:
583 break;
584
585 case LOC_LABEL:
586 fprintf_filtered (outfile, "label at ");
5af949e3
UW
587 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
588 outfile);
714835d5 589 if (section)
c906108c 590 fprintf_filtered (outfile, " section %s",
714835d5
UW
591 bfd_section_name (section->the_bfd_section->owner,
592 section->the_bfd_section));
c906108c
SS
593 break;
594
595 case LOC_BLOCK:
596 fprintf_filtered (outfile, "block object ");
d4f3574e 597 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol), outfile);
c906108c 598 fprintf_filtered (outfile, ", ");
5af949e3
UW
599 fputs_filtered (paddress (gdbarch,
600 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol))),
ed49a04f 601 outfile);
c906108c 602 fprintf_filtered (outfile, "..");
5af949e3
UW
603 fputs_filtered (paddress (gdbarch,
604 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol))),
ed49a04f 605 outfile);
714835d5 606 if (section)
c906108c 607 fprintf_filtered (outfile, " section %s",
714835d5
UW
608 bfd_section_name (section->the_bfd_section->owner,
609 section->the_bfd_section));
c906108c
SS
610 break;
611
4c2df51b 612 case LOC_COMPUTED:
4c2df51b
DJ
613 fprintf_filtered (outfile, "computed at runtime");
614 break;
615
c906108c
SS
616 case LOC_UNRESOLVED:
617 fprintf_filtered (outfile, "unresolved");
618 break;
619
620 case LOC_OPTIMIZED_OUT:
621 fprintf_filtered (outfile, "optimized out");
622 break;
623
c5aa993b 624 default:
c906108c
SS
625 fprintf_filtered (outfile, "botched symbol class %x",
626 SYMBOL_CLASS (symbol));
627 break;
628 }
629 }
630 fprintf_filtered (outfile, "\n");
631 return 1;
632}
633
80480540 634static void
fba45db2 635maintenance_print_msymbols (char *args, int from_tty)
c906108c
SS
636{
637 char **argv;
d9fcf2fb 638 struct ui_file *outfile;
c906108c
SS
639 struct cleanup *cleanups;
640 char *filename = DEV_TTY;
641 char *symname = NULL;
6c95b8df 642 struct program_space *pspace;
c906108c
SS
643 struct objfile *objfile;
644
07318b29
CV
645 struct stat sym_st, obj_st;
646
c906108c
SS
647 dont_repeat ();
648
649 if (args == NULL)
650 {
3e43a32a
MS
651 error (_("print-msymbols takes an output file "
652 "name and optional symbol file name"));
c906108c 653 }
d1a41061 654 argv = gdb_buildargv (args);
7a292a7a 655 cleanups = make_cleanup_freeargv (argv);
c906108c
SS
656
657 if (argv[0] != NULL)
658 {
659 filename = argv[0];
c378eb4e 660 /* If a second arg is supplied, it is a source file name to match on. */
c906108c
SS
661 if (argv[1] != NULL)
662 {
f5b95b50 663 symname = gdb_realpath (argv[1]);
07318b29
CV
664 make_cleanup (xfree, symname);
665 if (symname && stat (symname, &sym_st))
666 perror_with_name (symname);
c906108c
SS
667 }
668 }
669
670 filename = tilde_expand (filename);
b8c9b27d 671 make_cleanup (xfree, filename);
c5aa993b 672
c906108c
SS
673 outfile = gdb_fopen (filename, FOPEN_WT);
674 if (outfile == 0)
675 perror_with_name (filename);
d9fcf2fb 676 make_cleanup_ui_file_delete (outfile);
c906108c 677
6c95b8df
PA
678 ALL_PSPACES (pspace)
679 ALL_PSPACE_OBJFILES (pspace, objfile)
27618ce4
TT
680 {
681 QUIT;
4262abfb 682 if (symname == NULL || (!stat (objfile_name (objfile), &obj_st)
3b74cdc3 683 && sym_st.st_dev == obj_st.st_dev
27618ce4
TT
684 && sym_st.st_ino == obj_st.st_ino))
685 dump_msymbols (objfile, outfile);
686 }
c906108c
SS
687 fprintf_filtered (outfile, "\n\n");
688 do_cleanups (cleanups);
689}
690
80480540 691static void
52e260a3 692maintenance_print_objfiles (char *regexp, int from_tty)
c906108c 693{
6c95b8df 694 struct program_space *pspace;
c906108c
SS
695 struct objfile *objfile;
696
697 dont_repeat ();
698
52e260a3
DE
699 if (regexp)
700 re_comp (regexp);
701
6c95b8df
PA
702 ALL_PSPACES (pspace)
703 ALL_PSPACE_OBJFILES (pspace, objfile)
27618ce4
TT
704 {
705 QUIT;
52e260a3 706 if (! regexp
4262abfb 707 || re_exec (objfile_name (objfile)))
52e260a3 708 dump_objfile (objfile);
27618ce4 709 }
c906108c
SS
710}
711
5e7b2f39 712/* List all the symbol tables whose names match REGEXP (optional). */
b5ebcee6 713
80480540 714static void
5e7b2f39 715maintenance_info_symtabs (char *regexp, int from_tty)
44ea7b70 716{
6c95b8df 717 struct program_space *pspace;
44ea7b70
JB
718 struct objfile *objfile;
719
db68bbae
DE
720 dont_repeat ();
721
44ea7b70
JB
722 if (regexp)
723 re_comp (regexp);
724
6c95b8df
PA
725 ALL_PSPACES (pspace)
726 ALL_PSPACE_OBJFILES (pspace, objfile)
44ea7b70
JB
727 {
728 struct symtab *symtab;
729
730 /* We don't want to print anything for this objfile until we
731 actually find a symtab whose name matches. */
732 int printed_objfile_start = 0;
733
734 ALL_OBJFILE_SYMTABS (objfile, symtab)
8a498d38
DE
735 {
736 QUIT;
737
738 if (! regexp
05cba821 739 || re_exec (symtab_to_filename_for_display (symtab)))
8a498d38
DE
740 {
741 if (! printed_objfile_start)
742 {
4262abfb 743 printf_filtered ("{ objfile %s ", objfile_name (objfile));
8a498d38 744 wrap_here (" ");
a74ce742
PM
745 printf_filtered ("((struct objfile *) %s)\n",
746 host_address_to_string (objfile));
8a498d38
DE
747 printed_objfile_start = 1;
748 }
749
05cba821
JK
750 printf_filtered (" { symtab %s ",
751 symtab_to_filename_for_display (symtab));
8a498d38 752 wrap_here (" ");
a74ce742
PM
753 printf_filtered ("((struct symtab *) %s)\n",
754 host_address_to_string (symtab));
8a498d38
DE
755 printf_filtered (" dirname %s\n",
756 symtab->dirname ? symtab->dirname : "(null)");
757 printf_filtered (" fullname %s\n",
758 symtab->fullname ? symtab->fullname : "(null)");
3e43a32a
MS
759 printf_filtered (" "
760 "blockvector ((struct blockvector *) %s)%s\n",
a74ce742 761 host_address_to_string (symtab->blockvector),
8a498d38 762 symtab->primary ? " (primary)" : "");
3e43a32a
MS
763 printf_filtered (" "
764 "linetable ((struct linetable *) %s)\n",
a74ce742 765 host_address_to_string (symtab->linetable));
3e43a32a
MS
766 printf_filtered (" debugformat %s\n",
767 symtab->debugformat);
8a498d38
DE
768 printf_filtered (" }\n");
769 }
770 }
44ea7b70
JB
771
772 if (printed_objfile_start)
773 printf_filtered ("}\n");
774 }
775}
7d0c9981
DE
776
777/* Check consistency of symtabs.
778 An example of what this checks for is NULL blockvectors.
779 They can happen if there's a bug during debug info reading.
780 GDB assumes they are always non-NULL.
781
782 Note: This does not check for psymtab vs symtab consistency.
783 Use "maint check-psymtabs" for that. */
784
785static void
786maintenance_check_symtabs (char *ignore, int from_tty)
787{
788 struct program_space *pspace;
789 struct objfile *objfile;
790
791 ALL_PSPACES (pspace)
792 ALL_PSPACE_OBJFILES (pspace, objfile)
793 {
794 struct symtab *symtab;
795
796 /* We don't want to print anything for this objfile until we
797 actually find something worth printing. */
798 int printed_objfile_start = 0;
799
800 ALL_OBJFILE_SYMTABS (objfile, symtab)
801 {
802 int found_something = 0;
803
804 QUIT;
805
806 if (symtab->blockvector == NULL)
807 found_something = 1;
808 /* Add more checks here. */
809
810 if (found_something)
811 {
812 if (! printed_objfile_start)
813 {
4262abfb 814 printf_filtered ("{ objfile %s ", objfile_name (objfile));
7d0c9981
DE
815 wrap_here (" ");
816 printf_filtered ("((struct objfile *) %s)\n",
817 host_address_to_string (objfile));
818 printed_objfile_start = 1;
819 }
820 printf_filtered (" { symtab %s\n",
821 symtab_to_filename_for_display (symtab));
822 if (symtab->blockvector == NULL)
823 printf_filtered (" NULL blockvector\n");
824 printf_filtered (" }\n");
825 }
826 }
827
828 if (printed_objfile_start)
829 printf_filtered ("}\n");
830 }
831}
832
833/* Helper function for maintenance_expand_symtabs.
834 This is the name_matcher function for expand_symtabs_matching. */
835
836static int
837maintenance_expand_name_matcher (const char *symname, void *data)
838{
839 /* Since we're not searching on symbols, just return TRUE. */
840 return 1;
841}
842
843/* Helper function for maintenance_expand_symtabs.
844 This is the file_matcher function for expand_symtabs_matching. */
845
846static int
847maintenance_expand_file_matcher (const char *filename, void *data,
848 int basenames)
849{
850 const char *regexp = data;
851
852 QUIT;
853
854 /* KISS: Only apply the regexp to the complete file name. */
855 if (basenames)
856 return 0;
857
858 if (regexp == NULL || re_exec (filename))
859 return 1;
860
861 return 0;
862}
863
864/* Expand all symbol tables whose name matches an optional regexp. */
865
866static void
867maintenance_expand_symtabs (char *args, int from_tty)
868{
869 struct program_space *pspace;
870 struct objfile *objfile;
871 struct cleanup *cleanups;
872 char **argv;
873 char *regexp = NULL;
874
875 /* We use buildargv here so that we handle spaces in the regexp
876 in a way that allows adding more arguments later. */
877 argv = gdb_buildargv (args);
878 cleanups = make_cleanup_freeargv (argv);
879
880 if (argv != NULL)
881 {
882 if (argv[0] != NULL)
883 {
884 regexp = argv[0];
885 if (argv[1] != NULL)
886 error (_("Extra arguments after regexp."));
887 }
888 }
889
890 if (regexp)
891 re_comp (regexp);
892
893 ALL_PSPACES (pspace)
894 ALL_PSPACE_OBJFILES (pspace, objfile)
895 {
896 if (objfile->sf)
897 {
898 objfile->sf->qf->expand_symtabs_matching
899 (objfile, maintenance_expand_file_matcher,
900 maintenance_expand_name_matcher, ALL_DOMAIN, regexp);
901 }
902 }
4e993a19
TT
903
904 do_cleanups (cleanups);
7d0c9981 905}
c906108c 906\f
c5aa993b 907
c906108c
SS
908/* Return the nexting depth of a block within other blocks in its symtab. */
909
910static int
fba45db2 911block_depth (struct block *block)
c906108c 912{
52f0bd74 913 int i = 0;
433759f7 914
c5aa993b 915 while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
c906108c
SS
916 {
917 i++;
918 }
919 return i;
920}
c906108c 921\f
c5aa993b 922
c378eb4e 923/* Do early runtime initializations. */
b5ebcee6 924
c906108c 925void
fba45db2 926_initialize_symmisc (void)
c906108c 927{
c5aa993b 928 std_in = stdin;
c906108c
SS
929 std_out = stdout;
930 std_err = stderr;
80480540
YQ
931
932 add_cmd ("symbols", class_maintenance, maintenance_print_symbols, _("\
933Print dump of current symbol definitions.\n\
934Entries in the full symbol table are dumped to file OUTFILE.\n\
935If a SOURCE file is specified, dump only that file's symbols."),
936 &maintenanceprintlist);
937
938 add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols, _("\
939Print dump of current minimal symbol definitions.\n\
940Entries in the minimal symbol table are dumped to file OUTFILE.\n\
941If a SOURCE file is specified, dump only that file's minimal symbols."),
942 &maintenanceprintlist);
943
944 add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles,
52e260a3
DE
945 _("Print dump of current object file definitions.\n\
946With an argument REGEXP, list the object files with matching names."),
80480540
YQ
947 &maintenanceprintlist);
948
949 add_cmd ("symtabs", class_maintenance, maintenance_info_symtabs, _("\
950List the full symbol tables for all object files.\n\
951This does not include information about individual symbols, blocks, or\n\
952linetables --- just the symbol table structures themselves.\n\
db68bbae 953With an argument REGEXP, list the symbol tables with matching names."),
80480540 954 &maintenanceinfolist);
7d0c9981
DE
955
956 add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
957 _("\
958Check consistency of currently expanded symtabs."),
959 &maintenancelist);
960
961 add_cmd ("expand-symtabs", class_maintenance, maintenance_expand_symtabs,
962 _("Expand symbol tables.\n\
963With an argument REGEXP, only expand the symbol tables with matching names."),
964 &maintenancelist);
c906108c 965}
This page took 1.373338 seconds and 4 git commands to generate.