]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/symmisc.c
* gdb.python/py-infthread.exp: Load gdb-python.exp.
[thirdparty/binutils-gdb.git] / gdb / symmisc.c
CommitLineData
c906108c 1/* Do various things to symbol tables (other than lookup), for GDB.
af5f3db6 2
6aba47ca 3 Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
7b6bb8da
JB
4 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2007, 2008, 2009, 2010,
5 2011 Free Software Foundation, Inc.
c906108c 6
c5aa993b 7 This file is part of GDB.
c906108c 8
c5aa993b
JM
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
c5aa993b 12 (at your option) any later version.
c906108c 13
c5aa993b
JM
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
c906108c 18
c5aa993b 19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
21
22#include "defs.h"
23#include "symtab.h"
24#include "gdbtypes.h"
25#include "bfd.h"
26#include "symfile.h"
27#include "objfiles.h"
28#include "breakpoint.h"
29#include "command.h"
04ea0df1 30#include "gdb_obstack.h"
60250e8b 31#include "exceptions.h"
c906108c
SS
32#include "language.h"
33#include "bcache.h"
fe898f56 34#include "block.h"
44ea7b70 35#include "gdb_regex.h"
07318b29 36#include "gdb_stat.h"
de4f826b 37#include "dictionary.h"
c906108c
SS
38
39#include "gdb_string.h"
dbda9972 40#include "readline/readline.h"
c906108c 41
ccefe4c4
TT
42#include "psymtab.h"
43
c906108c
SS
44#ifndef DEV_TTY
45#define DEV_TTY "/dev/tty"
46#endif
47
48/* Unfortunately for debugging, stderr is usually a macro. This is painful
49 when calling functions that take FILE *'s from the debugger.
50 So we make a variable which has the same value and which is accessible when
51 debugging GDB with itself. Because stdin et al need not be constants,
52 we initialize them in the _initialize_symmisc function at the bottom
53 of the file. */
54FILE *std_in;
55FILE *std_out;
56FILE *std_err;
57
58/* Prototypes for local functions */
59
d9fcf2fb
JM
60static void dump_symtab (struct objfile *, struct symtab *,
61 struct ui_file *);
c906108c 62
d9fcf2fb 63static void dump_msymbols (struct objfile *, struct ui_file *);
c906108c 64
a14ed312 65static void dump_objfile (struct objfile *);
c906108c 66
a14ed312 67static int block_depth (struct block *);
c906108c 68
a14ed312 69void _initialize_symmisc (void);
c906108c 70
c5aa993b
JM
71struct print_symbol_args
72 {
5af949e3 73 struct gdbarch *gdbarch;
c5aa993b
JM
74 struct symbol *symbol;
75 int depth;
d9fcf2fb 76 struct ui_file *outfile;
c5aa993b 77 };
c906108c 78
4efb68b1 79static int print_symbol (void *);
c906108c 80\f
c906108c 81/* Free all the storage associated with the struct symtab <- S.
f73634e5
DE
82 Note that some symtabs have contents that all live inside one big block of
83 memory, and some share the contents of another symbol table and so you
84 should not free the contents on their behalf (except sometimes the
85 linetable, which maybe per symtab even when the rest is not).
c906108c
SS
86 It is s->free_code that says which alternative to use. */
87
88void
aa1ee363 89free_symtab (struct symtab *s)
c906108c 90{
c906108c
SS
91 switch (s->free_code)
92 {
93 case free_nothing:
94 /* All the contents are part of a big block of memory (an obstack),
c5aa993b
JM
95 and some other symtab is in charge of freeing that block.
96 Therefore, do nothing. */
c906108c
SS
97 break;
98
c906108c 99 case free_linetable:
de4f826b 100 /* Everything will be freed either by our `free_func'
c5aa993b
JM
101 or by some other symtab, except for our linetable.
102 Free that now. */
c906108c 103 if (LINETABLE (s))
2dc74dc1 104 xfree (LINETABLE (s));
c906108c
SS
105 break;
106 }
107
108 /* If there is a single block of memory to free, free it. */
de4f826b
DC
109 if (s->free_func != NULL)
110 s->free_func (s);
c906108c
SS
111
112 /* Free source-related stuff */
c5aa993b 113 if (s->line_charpos != NULL)
2dc74dc1 114 xfree (s->line_charpos);
c5aa993b 115 if (s->fullname != NULL)
2dc74dc1 116 xfree (s->fullname);
c5aa993b 117 if (s->debugformat != NULL)
2dc74dc1
AC
118 xfree (s->debugformat);
119 xfree (s);
c906108c
SS
120}
121
c906108c 122void
fba45db2 123print_symbol_bcache_statistics (void)
c906108c 124{
6c95b8df 125 struct program_space *pspace;
c906108c
SS
126 struct objfile *objfile;
127
128 immediate_quit++;
6c95b8df
PA
129 ALL_PSPACES (pspace)
130 ALL_PSPACE_OBJFILES (pspace, objfile)
c5aa993b 131 {
a3f17187 132 printf_filtered (_("Byte cache statistics for '%s':\n"), objfile->name);
710e1a31
SW
133 print_bcache_statistics (psymbol_bcache_get_bcache (objfile->psymbol_cache),
134 "partial symbol cache");
d4ce0d3f 135 print_bcache_statistics (objfile->macro_cache, "preprocessor macro cache");
10abe6bf 136 print_bcache_statistics (objfile->filename_cache, "file name cache");
c5aa993b 137 }
c906108c
SS
138 immediate_quit--;
139}
140
141void
fba45db2 142print_objfile_statistics (void)
c906108c 143{
6c95b8df 144 struct program_space *pspace;
c906108c 145 struct objfile *objfile;
c4f90d87 146 struct symtab *s;
c4f90d87 147 int i, linetables, blockvectors;
c906108c
SS
148
149 immediate_quit++;
6c95b8df
PA
150 ALL_PSPACES (pspace)
151 ALL_PSPACE_OBJFILES (pspace, objfile)
c5aa993b 152 {
a3f17187 153 printf_filtered (_("Statistics for '%s':\n"), objfile->name);
c5aa993b 154 if (OBJSTAT (objfile, n_stabs) > 0)
a3f17187 155 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
c5aa993b
JM
156 OBJSTAT (objfile, n_stabs));
157 if (OBJSTAT (objfile, n_minsyms) > 0)
a3f17187 158 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
c5aa993b
JM
159 OBJSTAT (objfile, n_minsyms));
160 if (OBJSTAT (objfile, n_psyms) > 0)
a3f17187 161 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
c5aa993b
JM
162 OBJSTAT (objfile, n_psyms));
163 if (OBJSTAT (objfile, n_syms) > 0)
a3f17187 164 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
c5aa993b
JM
165 OBJSTAT (objfile, n_syms));
166 if (OBJSTAT (objfile, n_types) > 0)
a3f17187 167 printf_filtered (_(" Number of \"types\" defined: %d\n"),
c5aa993b 168 OBJSTAT (objfile, n_types));
ccefe4c4
TT
169 if (objfile->sf)
170 objfile->sf->qf->print_stats (objfile);
c4f90d87
JM
171 i = linetables = blockvectors = 0;
172 ALL_OBJFILE_SYMTABS (objfile, s)
173 {
174 i++;
175 if (s->linetable != NULL)
176 linetables++;
177 if (s->primary == 1)
178 blockvectors++;
179 }
a3f17187
AC
180 printf_filtered (_(" Number of symbol tables: %d\n"), i);
181 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
c4f90d87 182 linetables);
a3f17187 183 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
c4f90d87
JM
184 blockvectors);
185
c5aa993b 186 if (OBJSTAT (objfile, sz_strtab) > 0)
a3f17187 187 printf_filtered (_(" Space used by a.out string tables: %d\n"),
c5aa993b 188 OBJSTAT (objfile, sz_strtab));
a3f17187 189 printf_filtered (_(" Total memory used for objfile obstack: %d\n"),
4a146b47 190 obstack_memory_used (&objfile->objfile_obstack));
a3f17187 191 printf_filtered (_(" Total memory used for psymbol cache: %d\n"),
710e1a31
SW
192 bcache_memory_used (psymbol_bcache_get_bcache
193 (objfile->psymbol_cache)));
a3f17187 194 printf_filtered (_(" Total memory used for macro cache: %d\n"),
af5f3db6 195 bcache_memory_used (objfile->macro_cache));
10abe6bf
TT
196 printf_filtered (_(" Total memory used for file name cache: %d\n"),
197 bcache_memory_used (objfile->filename_cache));
c5aa993b 198 }
c906108c
SS
199 immediate_quit--;
200}
201
c5aa993b 202static void
fba45db2 203dump_objfile (struct objfile *objfile)
c906108c
SS
204{
205 struct symtab *symtab;
c906108c 206
c5aa993b 207 printf_filtered ("\nObject file %s: ", objfile->name);
c906108c 208 printf_filtered ("Objfile at ");
d4f3574e 209 gdb_print_host_address (objfile, gdb_stdout);
c906108c 210 printf_filtered (", bfd at ");
d4f3574e 211 gdb_print_host_address (objfile->obfd, gdb_stdout);
c906108c
SS
212 printf_filtered (", %d minsyms\n\n",
213 objfile->minimal_symbol_count);
214
ccefe4c4
TT
215 if (objfile->sf)
216 objfile->sf->qf->dump (objfile);
c906108c 217
c5aa993b 218 if (objfile->symtabs)
c906108c
SS
219 {
220 printf_filtered ("Symtabs:\n");
c5aa993b 221 for (symtab = objfile->symtabs;
c906108c
SS
222 symtab != NULL;
223 symtab = symtab->next)
224 {
c5aa993b 225 printf_filtered ("%s at ", symtab->filename);
d4f3574e 226 gdb_print_host_address (symtab, gdb_stdout);
c906108c 227 printf_filtered (", ");
c5aa993b 228 if (symtab->objfile != objfile)
c906108c
SS
229 {
230 printf_filtered ("NOT ON CHAIN! ");
231 }
232 wrap_here (" ");
233 }
234 printf_filtered ("\n\n");
235 }
236}
237
238/* Print minimal symbols from this objfile. */
c5aa993b
JM
239
240static void
fba45db2 241dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
c906108c 242{
5af949e3 243 struct gdbarch *gdbarch = get_objfile_arch (objfile);
c906108c
SS
244 struct minimal_symbol *msymbol;
245 int index;
246 char ms_type;
c5aa993b
JM
247
248 fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile->name);
249 if (objfile->minimal_symbol_count == 0)
c906108c
SS
250 {
251 fprintf_filtered (outfile, "No minimal symbols found.\n");
252 return;
253 }
3567439c
DJ
254 index = 0;
255 ALL_OBJFILE_MSYMBOLS (objfile, msymbol)
c906108c 256 {
714835d5
UW
257 struct obj_section *section = SYMBOL_OBJ_SECTION (msymbol);
258
712f90be 259 switch (MSYMBOL_TYPE (msymbol))
c906108c 260 {
c5aa993b
JM
261 case mst_unknown:
262 ms_type = 'u';
263 break;
264 case mst_text:
265 ms_type = 'T';
266 break;
267 case mst_solib_trampoline:
268 ms_type = 'S';
269 break;
270 case mst_data:
271 ms_type = 'D';
272 break;
273 case mst_bss:
274 ms_type = 'B';
275 break;
276 case mst_abs:
277 ms_type = 'A';
278 break;
279 case mst_file_text:
280 ms_type = 't';
281 break;
282 case mst_file_data:
283 ms_type = 'd';
284 break;
285 case mst_file_bss:
286 ms_type = 'b';
287 break;
288 default:
289 ms_type = '?';
290 break;
c906108c
SS
291 }
292 fprintf_filtered (outfile, "[%2d] %c ", index, ms_type);
5af949e3
UW
293 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msymbol)),
294 outfile);
3567439c 295 fprintf_filtered (outfile, " %s", SYMBOL_LINKAGE_NAME (msymbol));
714835d5 296 if (section)
c906108c
SS
297 fprintf_filtered (outfile, " section %s",
298 bfd_section_name (objfile->obfd,
714835d5 299 section->the_bfd_section));
c906108c
SS
300 if (SYMBOL_DEMANGLED_NAME (msymbol) != NULL)
301 {
302 fprintf_filtered (outfile, " %s", SYMBOL_DEMANGLED_NAME (msymbol));
303 }
c906108c
SS
304 if (msymbol->filename)
305 fprintf_filtered (outfile, " %s", msymbol->filename);
c906108c 306 fputs_filtered ("\n", outfile);
3567439c 307 index++;
c906108c 308 }
c5aa993b 309 if (objfile->minimal_symbol_count != index)
c906108c 310 {
8a3fe4f8 311 warning (_("internal error: minimal symbol count %d != %d"),
c5aa993b 312 objfile->minimal_symbol_count, index);
c906108c
SS
313 }
314 fprintf_filtered (outfile, "\n");
315}
316
c5aa993b 317static void
44b164c5
JB
318dump_symtab_1 (struct objfile *objfile, struct symtab *symtab,
319 struct ui_file *outfile)
c906108c 320{
5af949e3 321 struct gdbarch *gdbarch = get_objfile_arch (objfile);
de4f826b
DC
322 int i;
323 struct dict_iterator iter;
952a6d41 324 int len;
de4f826b 325 struct linetable *l;
c906108c 326 struct blockvector *bv;
e88c90f2 327 struct symbol *sym;
de4f826b 328 struct block *b;
c906108c
SS
329 int depth;
330
331 fprintf_filtered (outfile, "\nSymtab for file %s\n", symtab->filename);
332 if (symtab->dirname)
333 fprintf_filtered (outfile, "Compilation directory is %s\n",
334 symtab->dirname);
335 fprintf_filtered (outfile, "Read from object file %s (", objfile->name);
d4f3574e 336 gdb_print_host_address (objfile, outfile);
c906108c 337 fprintf_filtered (outfile, ")\n");
3e43a32a
MS
338 fprintf_filtered (outfile, "Language: %s\n",
339 language_str (symtab->language));
c906108c
SS
340
341 /* First print the line table. */
342 l = LINETABLE (symtab);
343 if (l)
344 {
345 fprintf_filtered (outfile, "\nLine table:\n\n");
346 len = l->nitems;
347 for (i = 0; i < len; i++)
348 {
349 fprintf_filtered (outfile, " line %d at ", l->item[i].line);
5af949e3 350 fputs_filtered (paddress (gdbarch, l->item[i].pc), outfile);
c906108c
SS
351 fprintf_filtered (outfile, "\n");
352 }
353 }
354 /* Now print the block info, but only for primary symtabs since we will
355 print lots of duplicate info otherwise. */
c5aa993b 356 if (symtab->primary)
c906108c
SS
357 {
358 fprintf_filtered (outfile, "\nBlockvector:\n\n");
359 bv = BLOCKVECTOR (symtab);
360 len = BLOCKVECTOR_NBLOCKS (bv);
361 for (i = 0; i < len; i++)
362 {
363 b = BLOCKVECTOR_BLOCK (bv, i);
364 depth = block_depth (b) * 2;
365 print_spaces (depth, outfile);
366 fprintf_filtered (outfile, "block #%03d, object at ", i);
d4f3574e 367 gdb_print_host_address (b, outfile);
c906108c
SS
368 if (BLOCK_SUPERBLOCK (b))
369 {
370 fprintf_filtered (outfile, " under ");
d4f3574e 371 gdb_print_host_address (BLOCK_SUPERBLOCK (b), outfile);
c906108c 372 }
261397f8
DJ
373 /* drow/2002-07-10: We could save the total symbols count
374 even if we're using a hashtable, but nothing else but this message
375 wants it. */
de4f826b
DC
376 fprintf_filtered (outfile, ", %d syms/buckets in ",
377 dict_size (BLOCK_DICT (b)));
5af949e3 378 fputs_filtered (paddress (gdbarch, BLOCK_START (b)), outfile);
c906108c 379 fprintf_filtered (outfile, "..");
5af949e3 380 fputs_filtered (paddress (gdbarch, BLOCK_END (b)), outfile);
c906108c
SS
381 if (BLOCK_FUNCTION (b))
382 {
3567439c
DJ
383 fprintf_filtered (outfile, ", function %s",
384 SYMBOL_LINKAGE_NAME (BLOCK_FUNCTION (b)));
c906108c
SS
385 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)) != NULL)
386 {
387 fprintf_filtered (outfile, ", %s",
c5aa993b 388 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)));
c906108c
SS
389 }
390 }
c906108c 391 fprintf_filtered (outfile, "\n");
261397f8
DJ
392 /* Now print each symbol in this block (in no particular order, if
393 we're using a hashtable). */
de4f826b 394 ALL_BLOCK_SYMBOLS (b, iter, sym)
c906108c
SS
395 {
396 struct print_symbol_args s;
433759f7 397
5af949e3 398 s.gdbarch = gdbarch;
e88c90f2 399 s.symbol = sym;
c906108c
SS
400 s.depth = depth + 1;
401 s.outfile = outfile;
402 catch_errors (print_symbol, &s, "Error printing symbol:\n",
5c3ce3f7 403 RETURN_MASK_ERROR);
c906108c
SS
404 }
405 }
406 fprintf_filtered (outfile, "\n");
407 }
408 else
409 {
410 fprintf_filtered (outfile, "\nBlockvector same as previous symtab\n\n");
411 }
412}
413
44b164c5
JB
414static void
415dump_symtab (struct objfile *objfile, struct symtab *symtab,
416 struct ui_file *outfile)
417{
44b164c5
JB
418 /* Set the current language to the language of the symtab we're dumping
419 because certain routines used during dump_symtab() use the current
969107c5
EZ
420 language to print an image of the symbol. We'll restore it later.
421 But use only real languages, not placeholders. */
422 if (symtab->language != language_unknown
423 && symtab->language != language_auto)
424 {
425 enum language saved_lang;
426
427 saved_lang = set_language (symtab->language);
44b164c5 428
969107c5 429 dump_symtab_1 (objfile, symtab, outfile);
44b164c5 430
969107c5
EZ
431 set_language (saved_lang);
432 }
433 else
434 dump_symtab_1 (objfile, symtab, outfile);
44b164c5
JB
435}
436
c906108c 437void
fba45db2 438maintenance_print_symbols (char *args, int from_tty)
c906108c
SS
439{
440 char **argv;
d9fcf2fb 441 struct ui_file *outfile;
c906108c
SS
442 struct cleanup *cleanups;
443 char *symname = NULL;
444 char *filename = DEV_TTY;
445 struct objfile *objfile;
446 struct symtab *s;
447
448 dont_repeat ();
449
450 if (args == NULL)
451 {
3e43a32a
MS
452 error (_("Arguments missing: an output file name "
453 "and an optional symbol file name"));
c906108c 454 }
d1a41061 455 argv = gdb_buildargv (args);
7a292a7a 456 cleanups = make_cleanup_freeargv (argv);
c906108c
SS
457
458 if (argv[0] != NULL)
459 {
460 filename = argv[0];
461 /* If a second arg is supplied, it is a source file name to match on */
462 if (argv[1] != NULL)
463 {
464 symname = argv[1];
465 }
466 }
467
468 filename = tilde_expand (filename);
b8c9b27d 469 make_cleanup (xfree, filename);
c5aa993b 470
c906108c
SS
471 outfile = gdb_fopen (filename, FOPEN_WT);
472 if (outfile == 0)
473 perror_with_name (filename);
d9fcf2fb 474 make_cleanup_ui_file_delete (outfile);
c906108c
SS
475
476 immediate_quit++;
477 ALL_SYMTABS (objfile, s)
6314a349 478 if (symname == NULL || strcmp (symname, s->filename) == 0)
c5aa993b 479 dump_symtab (objfile, s, outfile);
c906108c
SS
480 immediate_quit--;
481 do_cleanups (cleanups);
482}
483
484/* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
485 far to indent. ARGS is really a struct print_symbol_args *, but is
486 declared as char * to get it past catch_errors. Returns 0 for error,
487 1 for success. */
488
489static int
4efb68b1 490print_symbol (void *args)
c906108c 491{
5af949e3 492 struct gdbarch *gdbarch = ((struct print_symbol_args *) args)->gdbarch;
c5aa993b
JM
493 struct symbol *symbol = ((struct print_symbol_args *) args)->symbol;
494 int depth = ((struct print_symbol_args *) args)->depth;
d9fcf2fb 495 struct ui_file *outfile = ((struct print_symbol_args *) args)->outfile;
714835d5 496 struct obj_section *section = SYMBOL_OBJ_SECTION (symbol);
c906108c
SS
497
498 print_spaces (depth, outfile);
176620f1 499 if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN)
c906108c 500 {
de5ad195 501 fprintf_filtered (outfile, "label %s at ", SYMBOL_PRINT_NAME (symbol));
5af949e3
UW
502 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
503 outfile);
714835d5 504 if (section)
c906108c 505 fprintf_filtered (outfile, " section %s\n",
714835d5
UW
506 bfd_section_name (section->the_bfd_section->owner,
507 section->the_bfd_section));
c906108c
SS
508 else
509 fprintf_filtered (outfile, "\n");
510 return 1;
511 }
176620f1 512 if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN)
c906108c
SS
513 {
514 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol)))
515 {
516 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
517 }
518 else
519 {
520 fprintf_filtered (outfile, "%s %s = ",
c5aa993b
JM
521 (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_ENUM
522 ? "enum"
523 : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
524 ? "struct" : "union")),
3567439c 525 SYMBOL_LINKAGE_NAME (symbol));
c906108c
SS
526 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
527 }
528 fprintf_filtered (outfile, ";\n");
529 }
530 else
531 {
532 if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
533 fprintf_filtered (outfile, "typedef ");
534 if (SYMBOL_TYPE (symbol))
535 {
536 /* Print details of types, except for enums where it's clutter. */
de5ad195 537 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol),
c906108c
SS
538 outfile,
539 TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
540 depth);
541 fprintf_filtered (outfile, "; ");
542 }
543 else
de5ad195 544 fprintf_filtered (outfile, "%s ", SYMBOL_PRINT_NAME (symbol));
c906108c
SS
545
546 switch (SYMBOL_CLASS (symbol))
547 {
548 case LOC_CONST:
549 fprintf_filtered (outfile, "const %ld (0x%lx)",
550 SYMBOL_VALUE (symbol),
551 SYMBOL_VALUE (symbol));
552 break;
553
554 case LOC_CONST_BYTES:
555 {
556 unsigned i;
557 struct type *type = check_typedef (SYMBOL_TYPE (symbol));
433759f7 558
c906108c
SS
559 fprintf_filtered (outfile, "const %u hex bytes:",
560 TYPE_LENGTH (type));
561 for (i = 0; i < TYPE_LENGTH (type); i++)
562 fprintf_filtered (outfile, " %02x",
c5aa993b 563 (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
c906108c
SS
564 }
565 break;
566
567 case LOC_STATIC:
568 fprintf_filtered (outfile, "static at ");
5af949e3
UW
569 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
570 outfile);
714835d5 571 if (section)
c906108c 572 fprintf_filtered (outfile, " section %s",
714835d5
UW
573 bfd_section_name (section->the_bfd_section->owner,
574 section->the_bfd_section));
c906108c
SS
575 break;
576
c906108c 577 case LOC_REGISTER:
2a2d4dc3
AS
578 if (SYMBOL_IS_ARGUMENT (symbol))
579 fprintf_filtered (outfile, "parameter register %ld",
580 SYMBOL_VALUE (symbol));
581 else
582 fprintf_filtered (outfile, "register %ld", SYMBOL_VALUE (symbol));
c906108c
SS
583 break;
584
585 case LOC_ARG:
586 fprintf_filtered (outfile, "arg at offset 0x%lx",
587 SYMBOL_VALUE (symbol));
588 break;
589
c906108c
SS
590 case LOC_REF_ARG:
591 fprintf_filtered (outfile, "reference arg at 0x%lx", SYMBOL_VALUE (symbol));
592 break;
593
c906108c
SS
594 case LOC_REGPARM_ADDR:
595 fprintf_filtered (outfile, "address parameter register %ld", SYMBOL_VALUE (symbol));
596 break;
597
598 case LOC_LOCAL:
599 fprintf_filtered (outfile, "local at offset 0x%lx",
600 SYMBOL_VALUE (symbol));
601 break;
602
c906108c
SS
603 case LOC_TYPEDEF:
604 break;
605
606 case LOC_LABEL:
607 fprintf_filtered (outfile, "label at ");
5af949e3
UW
608 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
609 outfile);
714835d5 610 if (section)
c906108c 611 fprintf_filtered (outfile, " section %s",
714835d5
UW
612 bfd_section_name (section->the_bfd_section->owner,
613 section->the_bfd_section));
c906108c
SS
614 break;
615
616 case LOC_BLOCK:
617 fprintf_filtered (outfile, "block object ");
d4f3574e 618 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol), outfile);
c906108c 619 fprintf_filtered (outfile, ", ");
5af949e3
UW
620 fputs_filtered (paddress (gdbarch,
621 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol))),
ed49a04f 622 outfile);
c906108c 623 fprintf_filtered (outfile, "..");
5af949e3
UW
624 fputs_filtered (paddress (gdbarch,
625 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol))),
ed49a04f 626 outfile);
714835d5 627 if (section)
c906108c 628 fprintf_filtered (outfile, " section %s",
714835d5
UW
629 bfd_section_name (section->the_bfd_section->owner,
630 section->the_bfd_section));
c906108c
SS
631 break;
632
4c2df51b 633 case LOC_COMPUTED:
4c2df51b
DJ
634 fprintf_filtered (outfile, "computed at runtime");
635 break;
636
c906108c
SS
637 case LOC_UNRESOLVED:
638 fprintf_filtered (outfile, "unresolved");
639 break;
640
641 case LOC_OPTIMIZED_OUT:
642 fprintf_filtered (outfile, "optimized out");
643 break;
644
c5aa993b 645 default:
c906108c
SS
646 fprintf_filtered (outfile, "botched symbol class %x",
647 SYMBOL_CLASS (symbol));
648 break;
649 }
650 }
651 fprintf_filtered (outfile, "\n");
652 return 1;
653}
654
c906108c 655void
fba45db2 656maintenance_print_msymbols (char *args, int from_tty)
c906108c
SS
657{
658 char **argv;
d9fcf2fb 659 struct ui_file *outfile;
c906108c
SS
660 struct cleanup *cleanups;
661 char *filename = DEV_TTY;
662 char *symname = NULL;
6c95b8df 663 struct program_space *pspace;
c906108c
SS
664 struct objfile *objfile;
665
07318b29
CV
666 struct stat sym_st, obj_st;
667
c906108c
SS
668 dont_repeat ();
669
670 if (args == NULL)
671 {
3e43a32a
MS
672 error (_("print-msymbols takes an output file "
673 "name and optional symbol file name"));
c906108c 674 }
d1a41061 675 argv = gdb_buildargv (args);
7a292a7a 676 cleanups = make_cleanup_freeargv (argv);
c906108c
SS
677
678 if (argv[0] != NULL)
679 {
680 filename = argv[0];
681 /* If a second arg is supplied, it is a source file name to match on */
682 if (argv[1] != NULL)
683 {
07318b29
CV
684 symname = xfullpath (argv[1]);
685 make_cleanup (xfree, symname);
686 if (symname && stat (symname, &sym_st))
687 perror_with_name (symname);
c906108c
SS
688 }
689 }
690
691 filename = tilde_expand (filename);
b8c9b27d 692 make_cleanup (xfree, filename);
c5aa993b 693
c906108c
SS
694 outfile = gdb_fopen (filename, FOPEN_WT);
695 if (outfile == 0)
696 perror_with_name (filename);
d9fcf2fb 697 make_cleanup_ui_file_delete (outfile);
c906108c
SS
698
699 immediate_quit++;
6c95b8df
PA
700 ALL_PSPACES (pspace)
701 ALL_PSPACE_OBJFILES (pspace, objfile)
3e43a32a
MS
702 if (symname == NULL || (!stat (objfile->name, &obj_st)
703 && sym_st.st_ino == obj_st.st_ino))
6c95b8df 704 dump_msymbols (objfile, outfile);
c906108c
SS
705 immediate_quit--;
706 fprintf_filtered (outfile, "\n\n");
707 do_cleanups (cleanups);
708}
709
710void
fba45db2 711maintenance_print_objfiles (char *ignore, int from_tty)
c906108c 712{
6c95b8df 713 struct program_space *pspace;
c906108c
SS
714 struct objfile *objfile;
715
716 dont_repeat ();
717
718 immediate_quit++;
6c95b8df
PA
719 ALL_PSPACES (pspace)
720 ALL_PSPACE_OBJFILES (pspace, objfile)
721 dump_objfile (objfile);
c906108c
SS
722 immediate_quit--;
723}
724
44ea7b70 725
5e7b2f39 726/* List all the symbol tables whose names match REGEXP (optional). */
44ea7b70 727void
5e7b2f39 728maintenance_info_symtabs (char *regexp, int from_tty)
44ea7b70 729{
6c95b8df 730 struct program_space *pspace;
44ea7b70
JB
731 struct objfile *objfile;
732
733 if (regexp)
734 re_comp (regexp);
735
6c95b8df
PA
736 ALL_PSPACES (pspace)
737 ALL_PSPACE_OBJFILES (pspace, objfile)
44ea7b70
JB
738 {
739 struct symtab *symtab;
740
741 /* We don't want to print anything for this objfile until we
742 actually find a symtab whose name matches. */
743 int printed_objfile_start = 0;
744
745 ALL_OBJFILE_SYMTABS (objfile, symtab)
8a498d38
DE
746 {
747 QUIT;
748
749 if (! regexp
750 || re_exec (symtab->filename))
751 {
752 if (! printed_objfile_start)
753 {
754 printf_filtered ("{ objfile %s ", objfile->name);
755 wrap_here (" ");
a74ce742
PM
756 printf_filtered ("((struct objfile *) %s)\n",
757 host_address_to_string (objfile));
8a498d38
DE
758 printed_objfile_start = 1;
759 }
760
761 printf_filtered (" { symtab %s ", symtab->filename);
762 wrap_here (" ");
a74ce742
PM
763 printf_filtered ("((struct symtab *) %s)\n",
764 host_address_to_string (symtab));
8a498d38
DE
765 printf_filtered (" dirname %s\n",
766 symtab->dirname ? symtab->dirname : "(null)");
767 printf_filtered (" fullname %s\n",
768 symtab->fullname ? symtab->fullname : "(null)");
3e43a32a
MS
769 printf_filtered (" "
770 "blockvector ((struct blockvector *) %s)%s\n",
a74ce742 771 host_address_to_string (symtab->blockvector),
8a498d38 772 symtab->primary ? " (primary)" : "");
3e43a32a
MS
773 printf_filtered (" "
774 "linetable ((struct linetable *) %s)\n",
a74ce742 775 host_address_to_string (symtab->linetable));
3e43a32a
MS
776 printf_filtered (" debugformat %s\n",
777 symtab->debugformat);
8a498d38
DE
778 printf_filtered (" }\n");
779 }
780 }
44ea7b70
JB
781
782 if (printed_objfile_start)
783 printf_filtered ("}\n");
784 }
785}
c906108c 786\f
c5aa993b 787
c906108c
SS
788/* Return the nexting depth of a block within other blocks in its symtab. */
789
790static int
fba45db2 791block_depth (struct block *block)
c906108c 792{
52f0bd74 793 int i = 0;
433759f7 794
c5aa993b 795 while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
c906108c
SS
796 {
797 i++;
798 }
799 return i;
800}
c906108c 801\f
c5aa993b 802
c906108c
SS
803/* Do early runtime initializations. */
804void
fba45db2 805_initialize_symmisc (void)
c906108c 806{
c5aa993b 807 std_in = stdin;
c906108c
SS
808 std_out = stdout;
809 std_err = stderr;
810}