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