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