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