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