* linespec.c (linespec_lexer_lex_number): The input
[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 355 /* Now print each symbol in this block (in no particular order, if
8157b174
TT
356 we're using a hashtable). Note that we only want this
357 block, not any blocks from included symtabs. */
358 ALL_DICT_SYMBOLS (BLOCK_DICT (b), iter, sym)
c906108c
SS
359 {
360 struct print_symbol_args s;
433759f7 361
5af949e3 362 s.gdbarch = gdbarch;
e88c90f2 363 s.symbol = sym;
c906108c
SS
364 s.depth = depth + 1;
365 s.outfile = outfile;
366 catch_errors (print_symbol, &s, "Error printing symbol:\n",
5c3ce3f7 367 RETURN_MASK_ERROR);
c906108c
SS
368 }
369 }
370 fprintf_filtered (outfile, "\n");
371 }
372 else
373 {
374 fprintf_filtered (outfile, "\nBlockvector same as previous symtab\n\n");
375 }
376}
377
44b164c5
JB
378static void
379dump_symtab (struct objfile *objfile, struct symtab *symtab,
380 struct ui_file *outfile)
381{
44b164c5
JB
382 /* Set the current language to the language of the symtab we're dumping
383 because certain routines used during dump_symtab() use the current
969107c5
EZ
384 language to print an image of the symbol. We'll restore it later.
385 But use only real languages, not placeholders. */
386 if (symtab->language != language_unknown
387 && symtab->language != language_auto)
388 {
389 enum language saved_lang;
390
391 saved_lang = set_language (symtab->language);
44b164c5 392
969107c5 393 dump_symtab_1 (objfile, symtab, outfile);
44b164c5 394
969107c5
EZ
395 set_language (saved_lang);
396 }
397 else
398 dump_symtab_1 (objfile, symtab, outfile);
44b164c5
JB
399}
400
c906108c 401void
fba45db2 402maintenance_print_symbols (char *args, int from_tty)
c906108c
SS
403{
404 char **argv;
d9fcf2fb 405 struct ui_file *outfile;
c906108c
SS
406 struct cleanup *cleanups;
407 char *symname = NULL;
408 char *filename = DEV_TTY;
409 struct objfile *objfile;
410 struct symtab *s;
411
412 dont_repeat ();
413
414 if (args == NULL)
415 {
3e43a32a
MS
416 error (_("Arguments missing: an output file name "
417 "and an optional symbol file name"));
c906108c 418 }
d1a41061 419 argv = gdb_buildargv (args);
7a292a7a 420 cleanups = make_cleanup_freeargv (argv);
c906108c
SS
421
422 if (argv[0] != NULL)
423 {
424 filename = argv[0];
c378eb4e 425 /* If a second arg is supplied, it is a source file name to match on. */
c906108c
SS
426 if (argv[1] != NULL)
427 {
428 symname = argv[1];
429 }
430 }
431
432 filename = tilde_expand (filename);
b8c9b27d 433 make_cleanup (xfree, filename);
c5aa993b 434
c906108c
SS
435 outfile = gdb_fopen (filename, FOPEN_WT);
436 if (outfile == 0)
437 perror_with_name (filename);
d9fcf2fb 438 make_cleanup_ui_file_delete (outfile);
c906108c
SS
439
440 immediate_quit++;
441 ALL_SYMTABS (objfile, s)
0ba1096a 442 if (symname == NULL || filename_cmp (symname, s->filename) == 0)
c5aa993b 443 dump_symtab (objfile, s, outfile);
c906108c
SS
444 immediate_quit--;
445 do_cleanups (cleanups);
446}
447
448/* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
449 far to indent. ARGS is really a struct print_symbol_args *, but is
450 declared as char * to get it past catch_errors. Returns 0 for error,
451 1 for success. */
452
453static int
4efb68b1 454print_symbol (void *args)
c906108c 455{
5af949e3 456 struct gdbarch *gdbarch = ((struct print_symbol_args *) args)->gdbarch;
c5aa993b
JM
457 struct symbol *symbol = ((struct print_symbol_args *) args)->symbol;
458 int depth = ((struct print_symbol_args *) args)->depth;
d9fcf2fb 459 struct ui_file *outfile = ((struct print_symbol_args *) args)->outfile;
714835d5 460 struct obj_section *section = SYMBOL_OBJ_SECTION (symbol);
c906108c
SS
461
462 print_spaces (depth, outfile);
176620f1 463 if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN)
c906108c 464 {
de5ad195 465 fprintf_filtered (outfile, "label %s at ", SYMBOL_PRINT_NAME (symbol));
5af949e3
UW
466 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
467 outfile);
714835d5 468 if (section)
c906108c 469 fprintf_filtered (outfile, " section %s\n",
714835d5
UW
470 bfd_section_name (section->the_bfd_section->owner,
471 section->the_bfd_section));
c906108c
SS
472 else
473 fprintf_filtered (outfile, "\n");
474 return 1;
475 }
176620f1 476 if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN)
c906108c
SS
477 {
478 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol)))
479 {
480 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
481 }
482 else
483 {
484 fprintf_filtered (outfile, "%s %s = ",
c5aa993b
JM
485 (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_ENUM
486 ? "enum"
487 : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
488 ? "struct" : "union")),
3567439c 489 SYMBOL_LINKAGE_NAME (symbol));
c906108c
SS
490 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
491 }
492 fprintf_filtered (outfile, ";\n");
493 }
494 else
495 {
496 if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
497 fprintf_filtered (outfile, "typedef ");
498 if (SYMBOL_TYPE (symbol))
499 {
500 /* Print details of types, except for enums where it's clutter. */
de5ad195 501 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol),
c906108c
SS
502 outfile,
503 TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
504 depth);
505 fprintf_filtered (outfile, "; ");
506 }
507 else
de5ad195 508 fprintf_filtered (outfile, "%s ", SYMBOL_PRINT_NAME (symbol));
c906108c
SS
509
510 switch (SYMBOL_CLASS (symbol))
511 {
512 case LOC_CONST:
12df843f
JK
513 fprintf_filtered (outfile, "const %s (%s)",
514 plongest (SYMBOL_VALUE (symbol)),
515 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
516 break;
517
518 case LOC_CONST_BYTES:
519 {
520 unsigned i;
521 struct type *type = check_typedef (SYMBOL_TYPE (symbol));
433759f7 522
c906108c
SS
523 fprintf_filtered (outfile, "const %u hex bytes:",
524 TYPE_LENGTH (type));
525 for (i = 0; i < TYPE_LENGTH (type); i++)
526 fprintf_filtered (outfile, " %02x",
c5aa993b 527 (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
c906108c
SS
528 }
529 break;
530
531 case LOC_STATIC:
532 fprintf_filtered (outfile, "static at ");
5af949e3
UW
533 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
534 outfile);
714835d5 535 if (section)
c906108c 536 fprintf_filtered (outfile, " section %s",
714835d5
UW
537 bfd_section_name (section->the_bfd_section->owner,
538 section->the_bfd_section));
c906108c
SS
539 break;
540
c906108c 541 case LOC_REGISTER:
2a2d4dc3 542 if (SYMBOL_IS_ARGUMENT (symbol))
12df843f
JK
543 fprintf_filtered (outfile, "parameter register %s",
544 plongest (SYMBOL_VALUE (symbol)));
2a2d4dc3 545 else
12df843f
JK
546 fprintf_filtered (outfile, "register %s",
547 plongest (SYMBOL_VALUE (symbol)));
c906108c
SS
548 break;
549
550 case LOC_ARG:
12df843f
JK
551 fprintf_filtered (outfile, "arg at offset %s",
552 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
553 break;
554
c906108c 555 case LOC_REF_ARG:
12df843f
JK
556 fprintf_filtered (outfile, "reference arg at %s",
557 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
558 break;
559
c906108c 560 case LOC_REGPARM_ADDR:
12df843f
JK
561 fprintf_filtered (outfile, "address parameter register %s",
562 plongest (SYMBOL_VALUE (symbol)));
c906108c
SS
563 break;
564
565 case LOC_LOCAL:
12df843f
JK
566 fprintf_filtered (outfile, "local at offset %s",
567 hex_string (SYMBOL_VALUE (symbol)));
c906108c
SS
568 break;
569
c906108c
SS
570 case LOC_TYPEDEF:
571 break;
572
573 case LOC_LABEL:
574 fprintf_filtered (outfile, "label at ");
5af949e3
UW
575 fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
576 outfile);
714835d5 577 if (section)
c906108c 578 fprintf_filtered (outfile, " section %s",
714835d5
UW
579 bfd_section_name (section->the_bfd_section->owner,
580 section->the_bfd_section));
c906108c
SS
581 break;
582
583 case LOC_BLOCK:
584 fprintf_filtered (outfile, "block object ");
d4f3574e 585 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol), outfile);
c906108c 586 fprintf_filtered (outfile, ", ");
5af949e3
UW
587 fputs_filtered (paddress (gdbarch,
588 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol))),
ed49a04f 589 outfile);
c906108c 590 fprintf_filtered (outfile, "..");
5af949e3
UW
591 fputs_filtered (paddress (gdbarch,
592 BLOCK_END (SYMBOL_BLOCK_VALUE (symbol))),
ed49a04f 593 outfile);
714835d5 594 if (section)
c906108c 595 fprintf_filtered (outfile, " section %s",
714835d5
UW
596 bfd_section_name (section->the_bfd_section->owner,
597 section->the_bfd_section));
c906108c
SS
598 break;
599
4c2df51b 600 case LOC_COMPUTED:
4c2df51b
DJ
601 fprintf_filtered (outfile, "computed at runtime");
602 break;
603
c906108c
SS
604 case LOC_UNRESOLVED:
605 fprintf_filtered (outfile, "unresolved");
606 break;
607
608 case LOC_OPTIMIZED_OUT:
609 fprintf_filtered (outfile, "optimized out");
610 break;
611
c5aa993b 612 default:
c906108c
SS
613 fprintf_filtered (outfile, "botched symbol class %x",
614 SYMBOL_CLASS (symbol));
615 break;
616 }
617 }
618 fprintf_filtered (outfile, "\n");
619 return 1;
620}
621
c906108c 622void
fba45db2 623maintenance_print_msymbols (char *args, int from_tty)
c906108c
SS
624{
625 char **argv;
d9fcf2fb 626 struct ui_file *outfile;
c906108c
SS
627 struct cleanup *cleanups;
628 char *filename = DEV_TTY;
629 char *symname = NULL;
6c95b8df 630 struct program_space *pspace;
c906108c
SS
631 struct objfile *objfile;
632
07318b29
CV
633 struct stat sym_st, obj_st;
634
c906108c
SS
635 dont_repeat ();
636
637 if (args == NULL)
638 {
3e43a32a
MS
639 error (_("print-msymbols takes an output file "
640 "name and optional symbol file name"));
c906108c 641 }
d1a41061 642 argv = gdb_buildargv (args);
7a292a7a 643 cleanups = make_cleanup_freeargv (argv);
c906108c
SS
644
645 if (argv[0] != NULL)
646 {
647 filename = argv[0];
c378eb4e 648 /* If a second arg is supplied, it is a source file name to match on. */
c906108c
SS
649 if (argv[1] != NULL)
650 {
07318b29
CV
651 symname = xfullpath (argv[1]);
652 make_cleanup (xfree, symname);
653 if (symname && stat (symname, &sym_st))
654 perror_with_name (symname);
c906108c
SS
655 }
656 }
657
658 filename = tilde_expand (filename);
b8c9b27d 659 make_cleanup (xfree, filename);
c5aa993b 660
c906108c
SS
661 outfile = gdb_fopen (filename, FOPEN_WT);
662 if (outfile == 0)
663 perror_with_name (filename);
d9fcf2fb 664 make_cleanup_ui_file_delete (outfile);
c906108c
SS
665
666 immediate_quit++;
6c95b8df
PA
667 ALL_PSPACES (pspace)
668 ALL_PSPACE_OBJFILES (pspace, objfile)
3e43a32a
MS
669 if (symname == NULL || (!stat (objfile->name, &obj_st)
670 && sym_st.st_ino == obj_st.st_ino))
6c95b8df 671 dump_msymbols (objfile, outfile);
c906108c
SS
672 immediate_quit--;
673 fprintf_filtered (outfile, "\n\n");
674 do_cleanups (cleanups);
675}
676
677void
fba45db2 678maintenance_print_objfiles (char *ignore, int from_tty)
c906108c 679{
6c95b8df 680 struct program_space *pspace;
c906108c
SS
681 struct objfile *objfile;
682
683 dont_repeat ();
684
685 immediate_quit++;
6c95b8df
PA
686 ALL_PSPACES (pspace)
687 ALL_PSPACE_OBJFILES (pspace, objfile)
688 dump_objfile (objfile);
c906108c
SS
689 immediate_quit--;
690}
691
44ea7b70 692
5e7b2f39 693/* List all the symbol tables whose names match REGEXP (optional). */
44ea7b70 694void
5e7b2f39 695maintenance_info_symtabs (char *regexp, int from_tty)
44ea7b70 696{
6c95b8df 697 struct program_space *pspace;
44ea7b70
JB
698 struct objfile *objfile;
699
700 if (regexp)
701 re_comp (regexp);
702
6c95b8df
PA
703 ALL_PSPACES (pspace)
704 ALL_PSPACE_OBJFILES (pspace, objfile)
44ea7b70
JB
705 {
706 struct symtab *symtab;
707
708 /* We don't want to print anything for this objfile until we
709 actually find a symtab whose name matches. */
710 int printed_objfile_start = 0;
711
712 ALL_OBJFILE_SYMTABS (objfile, symtab)
8a498d38
DE
713 {
714 QUIT;
715
716 if (! regexp
717 || re_exec (symtab->filename))
718 {
719 if (! printed_objfile_start)
720 {
721 printf_filtered ("{ objfile %s ", objfile->name);
722 wrap_here (" ");
a74ce742
PM
723 printf_filtered ("((struct objfile *) %s)\n",
724 host_address_to_string (objfile));
8a498d38
DE
725 printed_objfile_start = 1;
726 }
727
728 printf_filtered (" { symtab %s ", symtab->filename);
729 wrap_here (" ");
a74ce742
PM
730 printf_filtered ("((struct symtab *) %s)\n",
731 host_address_to_string (symtab));
8a498d38
DE
732 printf_filtered (" dirname %s\n",
733 symtab->dirname ? symtab->dirname : "(null)");
734 printf_filtered (" fullname %s\n",
735 symtab->fullname ? symtab->fullname : "(null)");
3e43a32a
MS
736 printf_filtered (" "
737 "blockvector ((struct blockvector *) %s)%s\n",
a74ce742 738 host_address_to_string (symtab->blockvector),
8a498d38 739 symtab->primary ? " (primary)" : "");
3e43a32a
MS
740 printf_filtered (" "
741 "linetable ((struct linetable *) %s)\n",
a74ce742 742 host_address_to_string (symtab->linetable));
3e43a32a
MS
743 printf_filtered (" debugformat %s\n",
744 symtab->debugformat);
8a498d38
DE
745 printf_filtered (" }\n");
746 }
747 }
44ea7b70
JB
748
749 if (printed_objfile_start)
750 printf_filtered ("}\n");
751 }
752}
c906108c 753\f
c5aa993b 754
c906108c
SS
755/* Return the nexting depth of a block within other blocks in its symtab. */
756
757static int
fba45db2 758block_depth (struct block *block)
c906108c 759{
52f0bd74 760 int i = 0;
433759f7 761
c5aa993b 762 while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
c906108c
SS
763 {
764 i++;
765 }
766 return i;
767}
c906108c 768\f
c5aa993b 769
c378eb4e 770/* Do early runtime initializations. */
c906108c 771void
fba45db2 772_initialize_symmisc (void)
c906108c 773{
c5aa993b 774 std_in = stdin;
c906108c
SS
775 std_out = stdout;
776 std_err = stderr;
777}
This page took 1.526247 seconds and 4 git commands to generate.