2003-02-19 David Carlton <carlton@math.stanford.edu>
[deliverable/binutils-gdb.git] / gdb / symmisc.c
1 /* Do various things to symbol tables (other than lookup), for GDB.
2
3 Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
4 1995, 1996, 1997, 1998, 1999, 2000, 2002 Free Software Foundation,
5 Inc.
6
7 This file is part of GDB.
8
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
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
13
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.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA. */
23
24 #include "defs.h"
25 #include "symtab.h"
26 #include "gdbtypes.h"
27 #include "bfd.h"
28 #include "symfile.h"
29 #include "objfiles.h"
30 #include "breakpoint.h"
31 #include "command.h"
32 #include "gdb_obstack.h"
33 #include "language.h"
34 #include "bcache.h"
35 #include "block.h"
36
37 #include "gdb_string.h"
38 #include <readline/readline.h>
39
40 #ifndef DEV_TTY
41 #define DEV_TTY "/dev/tty"
42 #endif
43
44 /* Unfortunately for debugging, stderr is usually a macro. This is painful
45 when calling functions that take FILE *'s from the debugger.
46 So we make a variable which has the same value and which is accessible when
47 debugging GDB with itself. Because stdin et al need not be constants,
48 we initialize them in the _initialize_symmisc function at the bottom
49 of the file. */
50 FILE *std_in;
51 FILE *std_out;
52 FILE *std_err;
53
54 /* Prototypes for local functions */
55
56 static void dump_symtab (struct objfile *, struct symtab *,
57 struct ui_file *);
58
59 static void dump_psymtab (struct objfile *, struct partial_symtab *,
60 struct ui_file *);
61
62 static void dump_msymbols (struct objfile *, struct ui_file *);
63
64 static void dump_objfile (struct objfile *);
65
66 static int block_depth (struct block *);
67
68 static void print_partial_symbols (struct partial_symbol **, int,
69 char *, struct ui_file *);
70
71 static void free_symtab_block (struct objfile *, struct block *);
72
73 void _initialize_symmisc (void);
74
75 struct print_symbol_args
76 {
77 struct symbol *symbol;
78 int depth;
79 struct ui_file *outfile;
80 };
81
82 static int print_symbol (void *);
83
84 static void free_symtab_block (struct objfile *, struct block *);
85 \f
86
87 /* Free a struct block <- B and all the symbols defined in that block. */
88
89 static void
90 free_symtab_block (struct objfile *objfile, struct block *b)
91 {
92 register int i, n;
93 struct symbol *sym, *next_sym;
94
95 n = BLOCK_BUCKETS (b);
96 for (i = 0; i < n; i++)
97 {
98 for (sym = BLOCK_BUCKET (b, i); sym; sym = next_sym)
99 {
100 next_sym = sym->hash_next;
101 xmfree (objfile->md, SYMBOL_NAME (sym));
102 xmfree (objfile->md, sym);
103 }
104 }
105 xmfree (objfile->md, b);
106 }
107
108 /* Free all the storage associated with the struct symtab <- S.
109 Note that some symtabs have contents malloc'ed structure by structure,
110 while some have contents that all live inside one big block of memory,
111 and some share the contents of another symbol table and so you should
112 not free the contents on their behalf (except sometimes the linetable,
113 which maybe per symtab even when the rest is not).
114 It is s->free_code that says which alternative to use. */
115
116 void
117 free_symtab (register struct symtab *s)
118 {
119 register int i, n;
120 register struct blockvector *bv;
121
122 switch (s->free_code)
123 {
124 case free_nothing:
125 /* All the contents are part of a big block of memory (an obstack),
126 and some other symtab is in charge of freeing that block.
127 Therefore, do nothing. */
128 break;
129
130 case free_contents:
131 /* Here all the contents were malloc'ed structure by structure
132 and must be freed that way. */
133 /* First free the blocks (and their symbols. */
134 bv = BLOCKVECTOR (s);
135 n = BLOCKVECTOR_NBLOCKS (bv);
136 for (i = 0; i < n; i++)
137 free_symtab_block (s->objfile, BLOCKVECTOR_BLOCK (bv, i));
138 /* Free the blockvector itself. */
139 xmfree (s->objfile->md, bv);
140 /* Also free the linetable. */
141
142 case free_linetable:
143 /* Everything will be freed either by our `free_ptr'
144 or by some other symtab, except for our linetable.
145 Free that now. */
146 if (LINETABLE (s))
147 xmfree (s->objfile->md, LINETABLE (s));
148 break;
149 }
150
151 /* If there is a single block of memory to free, free it. */
152 if (s->free_ptr != NULL)
153 xmfree (s->objfile->md, s->free_ptr);
154
155 /* Free source-related stuff */
156 if (s->line_charpos != NULL)
157 xmfree (s->objfile->md, s->line_charpos);
158 if (s->fullname != NULL)
159 xmfree (s->objfile->md, s->fullname);
160 if (s->debugformat != NULL)
161 xmfree (s->objfile->md, s->debugformat);
162 xmfree (s->objfile->md, s);
163 }
164
165 void
166 print_symbol_bcache_statistics (void)
167 {
168 struct objfile *objfile;
169
170 immediate_quit++;
171 ALL_OBJFILES (objfile)
172 {
173 printf_filtered ("Byte cache statistics for '%s':\n", objfile->name);
174 print_bcache_statistics (objfile->psymbol_cache, "partial symbol cache");
175 }
176 immediate_quit--;
177 }
178
179 void
180 print_objfile_statistics (void)
181 {
182 struct objfile *objfile;
183 struct symtab *s;
184 struct partial_symtab *ps;
185 int i, linetables, blockvectors;
186
187 immediate_quit++;
188 ALL_OBJFILES (objfile)
189 {
190 printf_filtered ("Statistics for '%s':\n", objfile->name);
191 if (OBJSTAT (objfile, n_stabs) > 0)
192 printf_filtered (" Number of \"stab\" symbols read: %d\n",
193 OBJSTAT (objfile, n_stabs));
194 if (OBJSTAT (objfile, n_minsyms) > 0)
195 printf_filtered (" Number of \"minimal\" symbols read: %d\n",
196 OBJSTAT (objfile, n_minsyms));
197 if (OBJSTAT (objfile, n_psyms) > 0)
198 printf_filtered (" Number of \"partial\" symbols read: %d\n",
199 OBJSTAT (objfile, n_psyms));
200 if (OBJSTAT (objfile, n_syms) > 0)
201 printf_filtered (" Number of \"full\" symbols read: %d\n",
202 OBJSTAT (objfile, n_syms));
203 if (OBJSTAT (objfile, n_types) > 0)
204 printf_filtered (" Number of \"types\" defined: %d\n",
205 OBJSTAT (objfile, n_types));
206 i = 0;
207 ALL_OBJFILE_PSYMTABS (objfile, ps)
208 {
209 if (ps->readin == 0)
210 i++;
211 }
212 printf_filtered (" Number of psym tables (not yet expanded): %d\n", i);
213 i = linetables = blockvectors = 0;
214 ALL_OBJFILE_SYMTABS (objfile, s)
215 {
216 i++;
217 if (s->linetable != NULL)
218 linetables++;
219 if (s->primary == 1)
220 blockvectors++;
221 }
222 printf_filtered (" Number of symbol tables: %d\n", i);
223 printf_filtered (" Number of symbol tables with line tables: %d\n",
224 linetables);
225 printf_filtered (" Number of symbol tables with blockvectors: %d\n",
226 blockvectors);
227
228 if (OBJSTAT (objfile, sz_strtab) > 0)
229 printf_filtered (" Space used by a.out string tables: %d\n",
230 OBJSTAT (objfile, sz_strtab));
231 printf_filtered (" Total memory used for psymbol obstack: %d\n",
232 obstack_memory_used (&objfile->psymbol_obstack));
233 printf_filtered (" Total memory used for psymbol cache: %d\n",
234 bcache_memory_used (objfile->psymbol_cache));
235 printf_filtered (" Total memory used for macro cache: %d\n",
236 bcache_memory_used (objfile->macro_cache));
237 printf_filtered (" Total memory used for symbol obstack: %d\n",
238 obstack_memory_used (&objfile->symbol_obstack));
239 printf_filtered (" Total memory used for type obstack: %d\n",
240 obstack_memory_used (&objfile->type_obstack));
241 }
242 immediate_quit--;
243 }
244
245 static void
246 dump_objfile (struct objfile *objfile)
247 {
248 struct symtab *symtab;
249 struct partial_symtab *psymtab;
250
251 printf_filtered ("\nObject file %s: ", objfile->name);
252 printf_filtered ("Objfile at ");
253 gdb_print_host_address (objfile, gdb_stdout);
254 printf_filtered (", bfd at ");
255 gdb_print_host_address (objfile->obfd, gdb_stdout);
256 printf_filtered (", %d minsyms\n\n",
257 objfile->minimal_symbol_count);
258
259 if (objfile->psymtabs)
260 {
261 printf_filtered ("Psymtabs:\n");
262 for (psymtab = objfile->psymtabs;
263 psymtab != NULL;
264 psymtab = psymtab->next)
265 {
266 printf_filtered ("%s at ",
267 psymtab->filename);
268 gdb_print_host_address (psymtab, gdb_stdout);
269 printf_filtered (", ");
270 if (psymtab->objfile != objfile)
271 {
272 printf_filtered ("NOT ON CHAIN! ");
273 }
274 wrap_here (" ");
275 }
276 printf_filtered ("\n\n");
277 }
278
279 if (objfile->symtabs)
280 {
281 printf_filtered ("Symtabs:\n");
282 for (symtab = objfile->symtabs;
283 symtab != NULL;
284 symtab = symtab->next)
285 {
286 printf_filtered ("%s at ", symtab->filename);
287 gdb_print_host_address (symtab, gdb_stdout);
288 printf_filtered (", ");
289 if (symtab->objfile != objfile)
290 {
291 printf_filtered ("NOT ON CHAIN! ");
292 }
293 wrap_here (" ");
294 }
295 printf_filtered ("\n\n");
296 }
297 }
298
299 /* Print minimal symbols from this objfile. */
300
301 static void
302 dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
303 {
304 struct minimal_symbol *msymbol;
305 int index;
306 char ms_type;
307
308 fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile->name);
309 if (objfile->minimal_symbol_count == 0)
310 {
311 fprintf_filtered (outfile, "No minimal symbols found.\n");
312 return;
313 }
314 for (index = 0, msymbol = objfile->msymbols;
315 SYMBOL_NAME (msymbol) != NULL; msymbol++, index++)
316 {
317 switch (msymbol->type)
318 {
319 case mst_unknown:
320 ms_type = 'u';
321 break;
322 case mst_text:
323 ms_type = 'T';
324 break;
325 case mst_solib_trampoline:
326 ms_type = 'S';
327 break;
328 case mst_data:
329 ms_type = 'D';
330 break;
331 case mst_bss:
332 ms_type = 'B';
333 break;
334 case mst_abs:
335 ms_type = 'A';
336 break;
337 case mst_file_text:
338 ms_type = 't';
339 break;
340 case mst_file_data:
341 ms_type = 'd';
342 break;
343 case mst_file_bss:
344 ms_type = 'b';
345 break;
346 default:
347 ms_type = '?';
348 break;
349 }
350 fprintf_filtered (outfile, "[%2d] %c ", index, ms_type);
351 print_address_numeric (SYMBOL_VALUE_ADDRESS (msymbol), 1, outfile);
352 fprintf_filtered (outfile, " %s", SYMBOL_NAME (msymbol));
353 if (SYMBOL_BFD_SECTION (msymbol))
354 fprintf_filtered (outfile, " section %s",
355 bfd_section_name (objfile->obfd,
356 SYMBOL_BFD_SECTION (msymbol)));
357 if (SYMBOL_DEMANGLED_NAME (msymbol) != NULL)
358 {
359 fprintf_filtered (outfile, " %s", SYMBOL_DEMANGLED_NAME (msymbol));
360 }
361 #ifdef SOFUN_ADDRESS_MAYBE_MISSING
362 if (msymbol->filename)
363 fprintf_filtered (outfile, " %s", msymbol->filename);
364 #endif
365 fputs_filtered ("\n", outfile);
366 }
367 if (objfile->minimal_symbol_count != index)
368 {
369 warning ("internal error: minimal symbol count %d != %d",
370 objfile->minimal_symbol_count, index);
371 }
372 fprintf_filtered (outfile, "\n");
373 }
374
375 static void
376 dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
377 struct ui_file *outfile)
378 {
379 int i;
380
381 fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
382 psymtab->filename);
383 fprintf_filtered (outfile, "(object ");
384 gdb_print_host_address (psymtab, outfile);
385 fprintf_filtered (outfile, ")\n\n");
386 fprintf_unfiltered (outfile, " Read from object file %s (",
387 objfile->name);
388 gdb_print_host_address (objfile, outfile);
389 fprintf_unfiltered (outfile, ")\n");
390
391 if (psymtab->readin)
392 {
393 fprintf_filtered (outfile,
394 " Full symtab was read (at ");
395 gdb_print_host_address (psymtab->symtab, outfile);
396 fprintf_filtered (outfile, " by function at ");
397 gdb_print_host_address (psymtab->read_symtab, outfile);
398 fprintf_filtered (outfile, ")\n");
399 }
400
401 fprintf_filtered (outfile, " Relocate symbols by ");
402 for (i = 0; i < psymtab->objfile->num_sections; ++i)
403 {
404 if (i != 0)
405 fprintf_filtered (outfile, ", ");
406 wrap_here (" ");
407 print_address_numeric (ANOFFSET (psymtab->section_offsets, i),
408 1,
409 outfile);
410 }
411 fprintf_filtered (outfile, "\n");
412
413 fprintf_filtered (outfile, " Symbols cover text addresses ");
414 print_address_numeric (psymtab->textlow, 1, outfile);
415 fprintf_filtered (outfile, "-");
416 print_address_numeric (psymtab->texthigh, 1, outfile);
417 fprintf_filtered (outfile, "\n");
418 fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n",
419 psymtab->number_of_dependencies);
420 for (i = 0; i < psymtab->number_of_dependencies; i++)
421 {
422 fprintf_filtered (outfile, " %d ", i);
423 gdb_print_host_address (psymtab->dependencies[i], outfile);
424 fprintf_filtered (outfile, " %s\n",
425 psymtab->dependencies[i]->filename);
426 }
427 if (psymtab->n_global_syms > 0)
428 {
429 print_partial_symbols (objfile->global_psymbols.list
430 + psymtab->globals_offset,
431 psymtab->n_global_syms, "Global", outfile);
432 }
433 if (psymtab->n_static_syms > 0)
434 {
435 print_partial_symbols (objfile->static_psymbols.list
436 + psymtab->statics_offset,
437 psymtab->n_static_syms, "Static", outfile);
438 }
439 fprintf_filtered (outfile, "\n");
440 }
441
442 static void
443 dump_symtab (struct objfile *objfile, struct symtab *symtab,
444 struct ui_file *outfile)
445 {
446 register int i, j;
447 int len, blen;
448 register struct linetable *l;
449 struct blockvector *bv;
450 struct symbol *sym;
451 register struct block *b;
452 int depth;
453
454 fprintf_filtered (outfile, "\nSymtab for file %s\n", symtab->filename);
455 if (symtab->dirname)
456 fprintf_filtered (outfile, "Compilation directory is %s\n",
457 symtab->dirname);
458 fprintf_filtered (outfile, "Read from object file %s (", objfile->name);
459 gdb_print_host_address (objfile, outfile);
460 fprintf_filtered (outfile, ")\n");
461 fprintf_filtered (outfile, "Language: %s\n", language_str (symtab->language));
462
463 /* First print the line table. */
464 l = LINETABLE (symtab);
465 if (l)
466 {
467 fprintf_filtered (outfile, "\nLine table:\n\n");
468 len = l->nitems;
469 for (i = 0; i < len; i++)
470 {
471 fprintf_filtered (outfile, " line %d at ", l->item[i].line);
472 print_address_numeric (l->item[i].pc, 1, outfile);
473 fprintf_filtered (outfile, "\n");
474 }
475 }
476 /* Now print the block info, but only for primary symtabs since we will
477 print lots of duplicate info otherwise. */
478 if (symtab->primary)
479 {
480 fprintf_filtered (outfile, "\nBlockvector:\n\n");
481 bv = BLOCKVECTOR (symtab);
482 len = BLOCKVECTOR_NBLOCKS (bv);
483 for (i = 0; i < len; i++)
484 {
485 b = BLOCKVECTOR_BLOCK (bv, i);
486 depth = block_depth (b) * 2;
487 print_spaces (depth, outfile);
488 fprintf_filtered (outfile, "block #%03d, object at ", i);
489 gdb_print_host_address (b, outfile);
490 if (BLOCK_SUPERBLOCK (b))
491 {
492 fprintf_filtered (outfile, " under ");
493 gdb_print_host_address (BLOCK_SUPERBLOCK (b), outfile);
494 }
495 /* drow/2002-07-10: We could save the total symbols count
496 even if we're using a hashtable, but nothing else but this message
497 wants it. */
498 blen = BLOCK_BUCKETS (b);
499 if (BLOCK_HASHTABLE (b))
500 fprintf_filtered (outfile, ", %d buckets in ", blen);
501 else
502 fprintf_filtered (outfile, ", %d syms in ", blen);
503 print_address_numeric (BLOCK_START (b), 1, outfile);
504 fprintf_filtered (outfile, "..");
505 print_address_numeric (BLOCK_END (b), 1, outfile);
506 if (BLOCK_FUNCTION (b))
507 {
508 fprintf_filtered (outfile, ", function %s", SYMBOL_NAME (BLOCK_FUNCTION (b)));
509 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)) != NULL)
510 {
511 fprintf_filtered (outfile, ", %s",
512 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)));
513 }
514 }
515 if (BLOCK_GCC_COMPILED (b))
516 fprintf_filtered (outfile, ", compiled with gcc%d", BLOCK_GCC_COMPILED (b));
517 fprintf_filtered (outfile, "\n");
518 /* Now print each symbol in this block (in no particular order, if
519 we're using a hashtable). */
520 ALL_BLOCK_SYMBOLS (b, j, sym)
521 {
522 struct print_symbol_args s;
523 s.symbol = sym;
524 s.depth = depth + 1;
525 s.outfile = outfile;
526 catch_errors (print_symbol, &s, "Error printing symbol:\n",
527 RETURN_MASK_ALL);
528 }
529 }
530 fprintf_filtered (outfile, "\n");
531 }
532 else
533 {
534 fprintf_filtered (outfile, "\nBlockvector same as previous symtab\n\n");
535 }
536 }
537
538 void
539 maintenance_print_symbols (char *args, int from_tty)
540 {
541 char **argv;
542 struct ui_file *outfile;
543 struct cleanup *cleanups;
544 char *symname = NULL;
545 char *filename = DEV_TTY;
546 struct objfile *objfile;
547 struct symtab *s;
548
549 dont_repeat ();
550
551 if (args == NULL)
552 {
553 error ("\
554 Arguments missing: an output file name and an optional symbol file name");
555 }
556 else if ((argv = buildargv (args)) == NULL)
557 {
558 nomem (0);
559 }
560 cleanups = make_cleanup_freeargv (argv);
561
562 if (argv[0] != NULL)
563 {
564 filename = argv[0];
565 /* If a second arg is supplied, it is a source file name to match on */
566 if (argv[1] != NULL)
567 {
568 symname = argv[1];
569 }
570 }
571
572 filename = tilde_expand (filename);
573 make_cleanup (xfree, filename);
574
575 outfile = gdb_fopen (filename, FOPEN_WT);
576 if (outfile == 0)
577 perror_with_name (filename);
578 make_cleanup_ui_file_delete (outfile);
579
580 immediate_quit++;
581 ALL_SYMTABS (objfile, s)
582 if (symname == NULL || (STREQ (symname, s->filename)))
583 dump_symtab (objfile, s, outfile);
584 immediate_quit--;
585 do_cleanups (cleanups);
586 }
587
588 /* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
589 far to indent. ARGS is really a struct print_symbol_args *, but is
590 declared as char * to get it past catch_errors. Returns 0 for error,
591 1 for success. */
592
593 static int
594 print_symbol (void *args)
595 {
596 struct symbol *symbol = ((struct print_symbol_args *) args)->symbol;
597 int depth = ((struct print_symbol_args *) args)->depth;
598 struct ui_file *outfile = ((struct print_symbol_args *) args)->outfile;
599
600 print_spaces (depth, outfile);
601 if (SYMBOL_NAMESPACE (symbol) == LABEL_NAMESPACE)
602 {
603 fprintf_filtered (outfile, "label %s at ", SYMBOL_SOURCE_NAME (symbol));
604 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol), 1, outfile);
605 if (SYMBOL_BFD_SECTION (symbol))
606 fprintf_filtered (outfile, " section %s\n",
607 bfd_section_name (SYMBOL_BFD_SECTION (symbol)->owner,
608 SYMBOL_BFD_SECTION (symbol)));
609 else
610 fprintf_filtered (outfile, "\n");
611 return 1;
612 }
613 if (SYMBOL_NAMESPACE (symbol) == STRUCT_NAMESPACE)
614 {
615 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol)))
616 {
617 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
618 }
619 else
620 {
621 fprintf_filtered (outfile, "%s %s = ",
622 (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_ENUM
623 ? "enum"
624 : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
625 ? "struct" : "union")),
626 SYMBOL_NAME (symbol));
627 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
628 }
629 fprintf_filtered (outfile, ";\n");
630 }
631 else
632 {
633 if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
634 fprintf_filtered (outfile, "typedef ");
635 if (SYMBOL_TYPE (symbol))
636 {
637 /* Print details of types, except for enums where it's clutter. */
638 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_SOURCE_NAME (symbol),
639 outfile,
640 TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
641 depth);
642 fprintf_filtered (outfile, "; ");
643 }
644 else
645 fprintf_filtered (outfile, "%s ", SYMBOL_SOURCE_NAME (symbol));
646
647 switch (SYMBOL_CLASS (symbol))
648 {
649 case LOC_CONST:
650 fprintf_filtered (outfile, "const %ld (0x%lx)",
651 SYMBOL_VALUE (symbol),
652 SYMBOL_VALUE (symbol));
653 break;
654
655 case LOC_CONST_BYTES:
656 {
657 unsigned i;
658 struct type *type = check_typedef (SYMBOL_TYPE (symbol));
659 fprintf_filtered (outfile, "const %u hex bytes:",
660 TYPE_LENGTH (type));
661 for (i = 0; i < TYPE_LENGTH (type); i++)
662 fprintf_filtered (outfile, " %02x",
663 (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
664 }
665 break;
666
667 case LOC_STATIC:
668 fprintf_filtered (outfile, "static at ");
669 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol), 1, outfile);
670 if (SYMBOL_BFD_SECTION (symbol))
671 fprintf_filtered (outfile, " section %s",
672 bfd_section_name
673 (SYMBOL_BFD_SECTION (symbol)->owner,
674 SYMBOL_BFD_SECTION (symbol)));
675 break;
676
677 case LOC_INDIRECT:
678 fprintf_filtered (outfile, "extern global at *(");
679 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol), 1, outfile);
680 fprintf_filtered (outfile, "),");
681 break;
682
683 case LOC_REGISTER:
684 fprintf_filtered (outfile, "register %ld", SYMBOL_VALUE (symbol));
685 break;
686
687 case LOC_ARG:
688 fprintf_filtered (outfile, "arg at offset 0x%lx",
689 SYMBOL_VALUE (symbol));
690 break;
691
692 case LOC_LOCAL_ARG:
693 fprintf_filtered (outfile, "arg at offset 0x%lx from fp",
694 SYMBOL_VALUE (symbol));
695 break;
696
697 case LOC_REF_ARG:
698 fprintf_filtered (outfile, "reference arg at 0x%lx", SYMBOL_VALUE (symbol));
699 break;
700
701 case LOC_REGPARM:
702 fprintf_filtered (outfile, "parameter register %ld", SYMBOL_VALUE (symbol));
703 break;
704
705 case LOC_REGPARM_ADDR:
706 fprintf_filtered (outfile, "address parameter register %ld", SYMBOL_VALUE (symbol));
707 break;
708
709 case LOC_LOCAL:
710 fprintf_filtered (outfile, "local at offset 0x%lx",
711 SYMBOL_VALUE (symbol));
712 break;
713
714 case LOC_BASEREG:
715 fprintf_filtered (outfile, "local at 0x%lx from register %d",
716 SYMBOL_VALUE (symbol), SYMBOL_BASEREG (symbol));
717 break;
718
719 case LOC_BASEREG_ARG:
720 fprintf_filtered (outfile, "arg at 0x%lx from register %d",
721 SYMBOL_VALUE (symbol), SYMBOL_BASEREG (symbol));
722 break;
723
724 case LOC_TYPEDEF:
725 break;
726
727 case LOC_LABEL:
728 fprintf_filtered (outfile, "label at ");
729 print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol), 1, outfile);
730 if (SYMBOL_BFD_SECTION (symbol))
731 fprintf_filtered (outfile, " section %s",
732 bfd_section_name
733 (SYMBOL_BFD_SECTION (symbol)->owner,
734 SYMBOL_BFD_SECTION (symbol)));
735 break;
736
737 case LOC_BLOCK:
738 fprintf_filtered (outfile, "block object ");
739 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol), outfile);
740 fprintf_filtered (outfile, ", ");
741 print_address_numeric (BLOCK_START (SYMBOL_BLOCK_VALUE (symbol)),
742 1,
743 outfile);
744 fprintf_filtered (outfile, "..");
745 print_address_numeric (BLOCK_END (SYMBOL_BLOCK_VALUE (symbol)),
746 1,
747 outfile);
748 if (SYMBOL_BFD_SECTION (symbol))
749 fprintf_filtered (outfile, " section %s",
750 bfd_section_name
751 (SYMBOL_BFD_SECTION (symbol)->owner,
752 SYMBOL_BFD_SECTION (symbol)));
753 break;
754
755 case LOC_UNRESOLVED:
756 fprintf_filtered (outfile, "unresolved");
757 break;
758
759 case LOC_OPTIMIZED_OUT:
760 fprintf_filtered (outfile, "optimized out");
761 break;
762
763 default:
764 fprintf_filtered (outfile, "botched symbol class %x",
765 SYMBOL_CLASS (symbol));
766 break;
767 }
768 }
769 fprintf_filtered (outfile, "\n");
770 return 1;
771 }
772
773 void
774 maintenance_print_psymbols (char *args, int from_tty)
775 {
776 char **argv;
777 struct ui_file *outfile;
778 struct cleanup *cleanups;
779 char *symname = NULL;
780 char *filename = DEV_TTY;
781 struct objfile *objfile;
782 struct partial_symtab *ps;
783
784 dont_repeat ();
785
786 if (args == NULL)
787 {
788 error ("print-psymbols takes an output file name and optional symbol file name");
789 }
790 else if ((argv = buildargv (args)) == NULL)
791 {
792 nomem (0);
793 }
794 cleanups = make_cleanup_freeargv (argv);
795
796 if (argv[0] != NULL)
797 {
798 filename = argv[0];
799 /* If a second arg is supplied, it is a source file name to match on */
800 if (argv[1] != NULL)
801 {
802 symname = argv[1];
803 }
804 }
805
806 filename = tilde_expand (filename);
807 make_cleanup (xfree, filename);
808
809 outfile = gdb_fopen (filename, FOPEN_WT);
810 if (outfile == 0)
811 perror_with_name (filename);
812 make_cleanup_ui_file_delete (outfile);
813
814 immediate_quit++;
815 ALL_PSYMTABS (objfile, ps)
816 if (symname == NULL || (STREQ (symname, ps->filename)))
817 dump_psymtab (objfile, ps, outfile);
818 immediate_quit--;
819 do_cleanups (cleanups);
820 }
821
822 static void
823 print_partial_symbols (struct partial_symbol **p, int count, char *what,
824 struct ui_file *outfile)
825 {
826 fprintf_filtered (outfile, " %s partial symbols:\n", what);
827 while (count-- > 0)
828 {
829 fprintf_filtered (outfile, " `%s'", SYMBOL_NAME (*p));
830 if (SYMBOL_DEMANGLED_NAME (*p) != NULL)
831 {
832 fprintf_filtered (outfile, " `%s'", SYMBOL_DEMANGLED_NAME (*p));
833 }
834 fputs_filtered (", ", outfile);
835 switch (SYMBOL_NAMESPACE (*p))
836 {
837 case UNDEF_NAMESPACE:
838 fputs_filtered ("undefined namespace, ", outfile);
839 break;
840 case VAR_NAMESPACE:
841 /* This is the usual thing -- don't print it */
842 break;
843 case STRUCT_NAMESPACE:
844 fputs_filtered ("struct namespace, ", outfile);
845 break;
846 case LABEL_NAMESPACE:
847 fputs_filtered ("label namespace, ", outfile);
848 break;
849 default:
850 fputs_filtered ("<invalid namespace>, ", outfile);
851 break;
852 }
853 switch (SYMBOL_CLASS (*p))
854 {
855 case LOC_UNDEF:
856 fputs_filtered ("undefined", outfile);
857 break;
858 case LOC_CONST:
859 fputs_filtered ("constant int", outfile);
860 break;
861 case LOC_STATIC:
862 fputs_filtered ("static", outfile);
863 break;
864 case LOC_INDIRECT:
865 fputs_filtered ("extern global", outfile);
866 break;
867 case LOC_REGISTER:
868 fputs_filtered ("register", outfile);
869 break;
870 case LOC_ARG:
871 fputs_filtered ("pass by value", outfile);
872 break;
873 case LOC_REF_ARG:
874 fputs_filtered ("pass by reference", outfile);
875 break;
876 case LOC_REGPARM:
877 fputs_filtered ("register parameter", outfile);
878 break;
879 case LOC_REGPARM_ADDR:
880 fputs_filtered ("register address parameter", outfile);
881 break;
882 case LOC_LOCAL:
883 fputs_filtered ("stack parameter", outfile);
884 break;
885 case LOC_TYPEDEF:
886 fputs_filtered ("type", outfile);
887 break;
888 case LOC_LABEL:
889 fputs_filtered ("label", outfile);
890 break;
891 case LOC_BLOCK:
892 fputs_filtered ("function", outfile);
893 break;
894 case LOC_CONST_BYTES:
895 fputs_filtered ("constant bytes", outfile);
896 break;
897 case LOC_LOCAL_ARG:
898 fputs_filtered ("shuffled arg", outfile);
899 break;
900 case LOC_UNRESOLVED:
901 fputs_filtered ("unresolved", outfile);
902 break;
903 case LOC_OPTIMIZED_OUT:
904 fputs_filtered ("optimized out", outfile);
905 break;
906 default:
907 fputs_filtered ("<invalid location>", outfile);
908 break;
909 }
910 fputs_filtered (", ", outfile);
911 print_address_numeric (SYMBOL_VALUE_ADDRESS (*p), 1, outfile);
912 fprintf_filtered (outfile, "\n");
913 p++;
914 }
915 }
916
917 void
918 maintenance_print_msymbols (char *args, int from_tty)
919 {
920 char **argv;
921 struct ui_file *outfile;
922 struct cleanup *cleanups;
923 char *filename = DEV_TTY;
924 char *symname = NULL;
925 struct objfile *objfile;
926
927 dont_repeat ();
928
929 if (args == NULL)
930 {
931 error ("print-msymbols takes an output file name and optional symbol file name");
932 }
933 else if ((argv = buildargv (args)) == NULL)
934 {
935 nomem (0);
936 }
937 cleanups = make_cleanup_freeargv (argv);
938
939 if (argv[0] != NULL)
940 {
941 filename = argv[0];
942 /* If a second arg is supplied, it is a source file name to match on */
943 if (argv[1] != NULL)
944 {
945 symname = argv[1];
946 }
947 }
948
949 filename = tilde_expand (filename);
950 make_cleanup (xfree, filename);
951
952 outfile = gdb_fopen (filename, FOPEN_WT);
953 if (outfile == 0)
954 perror_with_name (filename);
955 make_cleanup_ui_file_delete (outfile);
956
957 immediate_quit++;
958 ALL_OBJFILES (objfile)
959 if (symname == NULL || (STREQ (symname, objfile->name)))
960 dump_msymbols (objfile, outfile);
961 immediate_quit--;
962 fprintf_filtered (outfile, "\n\n");
963 do_cleanups (cleanups);
964 }
965
966 void
967 maintenance_print_objfiles (char *ignore, int from_tty)
968 {
969 struct objfile *objfile;
970
971 dont_repeat ();
972
973 immediate_quit++;
974 ALL_OBJFILES (objfile)
975 dump_objfile (objfile);
976 immediate_quit--;
977 }
978
979 /* Check consistency of psymtabs and symtabs. */
980
981 void
982 maintenance_check_symtabs (char *ignore, int from_tty)
983 {
984 register struct symbol *sym;
985 register struct partial_symbol **psym;
986 register struct symtab *s = NULL;
987 register struct partial_symtab *ps;
988 struct blockvector *bv;
989 register struct objfile *objfile;
990 register struct block *b;
991 int length;
992
993 ALL_PSYMTABS (objfile, ps)
994 {
995 s = PSYMTAB_TO_SYMTAB (ps);
996 if (s == NULL)
997 continue;
998 bv = BLOCKVECTOR (s);
999 b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
1000 psym = ps->objfile->static_psymbols.list + ps->statics_offset;
1001 length = ps->n_static_syms;
1002 while (length--)
1003 {
1004 sym = lookup_block_symbol (b, SYMBOL_NAME (*psym),
1005 NULL, SYMBOL_NAMESPACE (*psym));
1006 if (!sym)
1007 {
1008 printf_filtered ("Static symbol `");
1009 puts_filtered (SYMBOL_NAME (*psym));
1010 printf_filtered ("' only found in ");
1011 puts_filtered (ps->filename);
1012 printf_filtered (" psymtab\n");
1013 }
1014 psym++;
1015 }
1016 b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
1017 psym = ps->objfile->global_psymbols.list + ps->globals_offset;
1018 length = ps->n_global_syms;
1019 while (length--)
1020 {
1021 sym = lookup_block_symbol (b, SYMBOL_NAME (*psym),
1022 NULL, SYMBOL_NAMESPACE (*psym));
1023 if (!sym)
1024 {
1025 printf_filtered ("Global symbol `");
1026 puts_filtered (SYMBOL_NAME (*psym));
1027 printf_filtered ("' only found in ");
1028 puts_filtered (ps->filename);
1029 printf_filtered (" psymtab\n");
1030 }
1031 psym++;
1032 }
1033 if (ps->texthigh < ps->textlow)
1034 {
1035 printf_filtered ("Psymtab ");
1036 puts_filtered (ps->filename);
1037 printf_filtered (" covers bad range ");
1038 print_address_numeric (ps->textlow, 1, gdb_stdout);
1039 printf_filtered (" - ");
1040 print_address_numeric (ps->texthigh, 1, gdb_stdout);
1041 printf_filtered ("\n");
1042 continue;
1043 }
1044 if (ps->texthigh == 0)
1045 continue;
1046 if (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b))
1047 {
1048 printf_filtered ("Psymtab ");
1049 puts_filtered (ps->filename);
1050 printf_filtered (" covers ");
1051 print_address_numeric (ps->textlow, 1, gdb_stdout);
1052 printf_filtered (" - ");
1053 print_address_numeric (ps->texthigh, 1, gdb_stdout);
1054 printf_filtered (" but symtab covers only ");
1055 print_address_numeric (BLOCK_START (b), 1, gdb_stdout);
1056 printf_filtered (" - ");
1057 print_address_numeric (BLOCK_END (b), 1, gdb_stdout);
1058 printf_filtered ("\n");
1059 }
1060 }
1061 }
1062 \f
1063
1064 /* Return the nexting depth of a block within other blocks in its symtab. */
1065
1066 static int
1067 block_depth (struct block *block)
1068 {
1069 register int i = 0;
1070 while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
1071 {
1072 i++;
1073 }
1074 return i;
1075 }
1076 \f
1077
1078 /* Increase the space allocated for LISTP, which is probably
1079 global_psymbols or static_psymbols. This space will eventually
1080 be freed in free_objfile(). */
1081
1082 void
1083 extend_psymbol_list (register struct psymbol_allocation_list *listp,
1084 struct objfile *objfile)
1085 {
1086 int new_size;
1087 if (listp->size == 0)
1088 {
1089 new_size = 255;
1090 listp->list = (struct partial_symbol **)
1091 xmmalloc (objfile->md, new_size * sizeof (struct partial_symbol *));
1092 }
1093 else
1094 {
1095 new_size = listp->size * 2;
1096 listp->list = (struct partial_symbol **)
1097 xmrealloc (objfile->md, (char *) listp->list,
1098 new_size * sizeof (struct partial_symbol *));
1099 }
1100 /* Next assumes we only went one over. Should be good if
1101 program works correctly */
1102 listp->next = listp->list + listp->size;
1103 listp->size = new_size;
1104 }
1105
1106
1107 /* Do early runtime initializations. */
1108 void
1109 _initialize_symmisc (void)
1110 {
1111 std_in = stdin;
1112 std_out = stdout;
1113 std_err = stderr;
1114 }
This page took 0.069759 seconds and 4 git commands to generate.