]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/symmisc.c
* configure.ac: Switch license to GPLv3.
[thirdparty/binutils-gdb.git] / gdb / symmisc.c
CommitLineData
c906108c 1/* Do various things to symbol tables (other than lookup), for GDB.
af5f3db6 2
6aba47ca
DJ
3 Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
4 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2007
5 Free Software Foundation, Inc.
c906108c 6
c5aa993b 7 This file is part of GDB.
c906108c 8
c5aa993b
JM
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
c906108c 13
c5aa993b
JM
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
c906108c 18
c5aa993b
JM
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
197e01b6
EZ
21 Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 Boston, MA 02110-1301, USA. */
c906108c
SS
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"
04ea0df1 32#include "gdb_obstack.h"
60250e8b 33#include "exceptions.h"
c906108c
SS
34#include "language.h"
35#include "bcache.h"
fe898f56 36#include "block.h"
44ea7b70 37#include "gdb_regex.h"
07318b29 38#include "gdb_stat.h"
de4f826b 39#include "dictionary.h"
c906108c
SS
40
41#include "gdb_string.h"
dbda9972 42#include "readline/readline.h"
c906108c
SS
43
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
JM
63static void dump_psymtab (struct objfile *, struct partial_symtab *,
64 struct ui_file *);
c906108c 65
d9fcf2fb 66static void dump_msymbols (struct objfile *, struct ui_file *);
c906108c 67
a14ed312 68static void dump_objfile (struct objfile *);
c906108c 69
a14ed312 70static int block_depth (struct block *);
c906108c 71
d9fcf2fb
JM
72static void print_partial_symbols (struct partial_symbol **, int,
73 char *, struct ui_file *);
c906108c 74
a14ed312 75static void free_symtab_block (struct objfile *, struct block *);
c906108c 76
a14ed312 77void _initialize_symmisc (void);
c906108c 78
c5aa993b
JM
79struct print_symbol_args
80 {
81 struct symbol *symbol;
82 int depth;
d9fcf2fb 83 struct ui_file *outfile;
c5aa993b 84 };
c906108c 85
4efb68b1 86static int print_symbol (void *);
c906108c 87
a14ed312 88static void free_symtab_block (struct objfile *, struct block *);
c906108c 89\f
c5aa993b 90
c906108c
SS
91/* Free a struct block <- B and all the symbols defined in that block. */
92
de4f826b
DC
93/* FIXME: carlton/2003-04-28: I don't believe this is currently ever
94 used. */
95
c906108c 96static void
fba45db2 97free_symtab_block (struct objfile *objfile, struct block *b)
c906108c 98{
de4f826b
DC
99 struct dict_iterator iter;
100 struct symbol *sym;
261397f8 101
de4f826b 102 ALL_BLOCK_SYMBOLS (b, iter, sym)
c906108c 103 {
2dc74dc1
AC
104 xfree (DEPRECATED_SYMBOL_NAME (sym));
105 xfree (sym);
c906108c 106 }
de4f826b
DC
107
108 dict_free (BLOCK_DICT (b));
2dc74dc1 109 xfree (b);
c906108c
SS
110}
111
112/* Free all the storage associated with the struct symtab <- S.
113 Note that some symtabs have contents malloc'ed structure by structure,
114 while some have contents that all live inside one big block of memory,
115 and some share the contents of another symbol table and so you should
116 not free the contents on their behalf (except sometimes the linetable,
117 which maybe per symtab even when the rest is not).
118 It is s->free_code that says which alternative to use. */
119
120void
aa1ee363 121free_symtab (struct symtab *s)
c906108c 122{
52f0bd74
AC
123 int i, n;
124 struct blockvector *bv;
c906108c
SS
125
126 switch (s->free_code)
127 {
128 case free_nothing:
129 /* All the contents are part of a big block of memory (an obstack),
c5aa993b
JM
130 and some other symtab is in charge of freeing that block.
131 Therefore, do nothing. */
c906108c
SS
132 break;
133
134 case free_contents:
135 /* Here all the contents were malloc'ed structure by structure
c5aa993b 136 and must be freed that way. */
c906108c
SS
137 /* First free the blocks (and their symbols. */
138 bv = BLOCKVECTOR (s);
139 n = BLOCKVECTOR_NBLOCKS (bv);
140 for (i = 0; i < n; i++)
c5aa993b 141 free_symtab_block (s->objfile, BLOCKVECTOR_BLOCK (bv, i));
c906108c 142 /* Free the blockvector itself. */
2dc74dc1 143 xfree (bv);
c906108c 144 /* Also free the linetable. */
c5aa993b 145
c906108c 146 case free_linetable:
de4f826b 147 /* Everything will be freed either by our `free_func'
c5aa993b
JM
148 or by some other symtab, except for our linetable.
149 Free that now. */
c906108c 150 if (LINETABLE (s))
2dc74dc1 151 xfree (LINETABLE (s));
c906108c
SS
152 break;
153 }
154
155 /* If there is a single block of memory to free, free it. */
de4f826b
DC
156 if (s->free_func != NULL)
157 s->free_func (s);
c906108c
SS
158
159 /* Free source-related stuff */
c5aa993b 160 if (s->line_charpos != NULL)
2dc74dc1 161 xfree (s->line_charpos);
c5aa993b 162 if (s->fullname != NULL)
2dc74dc1 163 xfree (s->fullname);
c5aa993b 164 if (s->debugformat != NULL)
2dc74dc1
AC
165 xfree (s->debugformat);
166 xfree (s);
c906108c
SS
167}
168
c906108c 169void
fba45db2 170print_symbol_bcache_statistics (void)
c906108c
SS
171{
172 struct objfile *objfile;
173
174 immediate_quit++;
175 ALL_OBJFILES (objfile)
c5aa993b 176 {
a3f17187 177 printf_filtered (_("Byte cache statistics for '%s':\n"), objfile->name);
af5f3db6 178 print_bcache_statistics (objfile->psymbol_cache, "partial symbol cache");
c5aa993b 179 }
c906108c
SS
180 immediate_quit--;
181}
182
183void
fba45db2 184print_objfile_statistics (void)
c906108c
SS
185{
186 struct objfile *objfile;
c4f90d87
JM
187 struct symtab *s;
188 struct partial_symtab *ps;
189 int i, linetables, blockvectors;
c906108c
SS
190
191 immediate_quit++;
192 ALL_OBJFILES (objfile)
c5aa993b 193 {
a3f17187 194 printf_filtered (_("Statistics for '%s':\n"), objfile->name);
c5aa993b 195 if (OBJSTAT (objfile, n_stabs) > 0)
a3f17187 196 printf_filtered (_(" Number of \"stab\" symbols read: %d\n"),
c5aa993b
JM
197 OBJSTAT (objfile, n_stabs));
198 if (OBJSTAT (objfile, n_minsyms) > 0)
a3f17187 199 printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
c5aa993b
JM
200 OBJSTAT (objfile, n_minsyms));
201 if (OBJSTAT (objfile, n_psyms) > 0)
a3f17187 202 printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
c5aa993b
JM
203 OBJSTAT (objfile, n_psyms));
204 if (OBJSTAT (objfile, n_syms) > 0)
a3f17187 205 printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
c5aa993b
JM
206 OBJSTAT (objfile, n_syms));
207 if (OBJSTAT (objfile, n_types) > 0)
a3f17187 208 printf_filtered (_(" Number of \"types\" defined: %d\n"),
c5aa993b 209 OBJSTAT (objfile, n_types));
c4f90d87
JM
210 i = 0;
211 ALL_OBJFILE_PSYMTABS (objfile, ps)
212 {
213 if (ps->readin == 0)
214 i++;
215 }
a3f17187 216 printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"), i);
c4f90d87
JM
217 i = linetables = blockvectors = 0;
218 ALL_OBJFILE_SYMTABS (objfile, s)
219 {
220 i++;
221 if (s->linetable != NULL)
222 linetables++;
223 if (s->primary == 1)
224 blockvectors++;
225 }
a3f17187
AC
226 printf_filtered (_(" Number of symbol tables: %d\n"), i);
227 printf_filtered (_(" Number of symbol tables with line tables: %d\n"),
c4f90d87 228 linetables);
a3f17187 229 printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"),
c4f90d87
JM
230 blockvectors);
231
c5aa993b 232 if (OBJSTAT (objfile, sz_strtab) > 0)
a3f17187 233 printf_filtered (_(" Space used by a.out string tables: %d\n"),
c5aa993b 234 OBJSTAT (objfile, sz_strtab));
a3f17187 235 printf_filtered (_(" Total memory used for objfile obstack: %d\n"),
4a146b47 236 obstack_memory_used (&objfile->objfile_obstack));
a3f17187 237 printf_filtered (_(" Total memory used for psymbol cache: %d\n"),
af5f3db6 238 bcache_memory_used (objfile->psymbol_cache));
a3f17187 239 printf_filtered (_(" Total memory used for macro cache: %d\n"),
af5f3db6 240 bcache_memory_used (objfile->macro_cache));
c5aa993b 241 }
c906108c
SS
242 immediate_quit--;
243}
244
c5aa993b 245static void
fba45db2 246dump_objfile (struct objfile *objfile)
c906108c
SS
247{
248 struct symtab *symtab;
249 struct partial_symtab *psymtab;
250
c5aa993b 251 printf_filtered ("\nObject file %s: ", objfile->name);
c906108c 252 printf_filtered ("Objfile at ");
d4f3574e 253 gdb_print_host_address (objfile, gdb_stdout);
c906108c 254 printf_filtered (", bfd at ");
d4f3574e 255 gdb_print_host_address (objfile->obfd, gdb_stdout);
c906108c
SS
256 printf_filtered (", %d minsyms\n\n",
257 objfile->minimal_symbol_count);
258
c5aa993b 259 if (objfile->psymtabs)
c906108c
SS
260 {
261 printf_filtered ("Psymtabs:\n");
c5aa993b 262 for (psymtab = objfile->psymtabs;
c906108c 263 psymtab != NULL;
c5aa993b 264 psymtab = psymtab->next)
c906108c
SS
265 {
266 printf_filtered ("%s at ",
c5aa993b 267 psymtab->filename);
d4f3574e 268 gdb_print_host_address (psymtab, gdb_stdout);
c906108c 269 printf_filtered (", ");
c5aa993b 270 if (psymtab->objfile != objfile)
c906108c
SS
271 {
272 printf_filtered ("NOT ON CHAIN! ");
273 }
274 wrap_here (" ");
275 }
276 printf_filtered ("\n\n");
277 }
278
c5aa993b 279 if (objfile->symtabs)
c906108c
SS
280 {
281 printf_filtered ("Symtabs:\n");
c5aa993b 282 for (symtab = objfile->symtabs;
c906108c
SS
283 symtab != NULL;
284 symtab = symtab->next)
285 {
c5aa993b 286 printf_filtered ("%s at ", symtab->filename);
d4f3574e 287 gdb_print_host_address (symtab, gdb_stdout);
c906108c 288 printf_filtered (", ");
c5aa993b 289 if (symtab->objfile != objfile)
c906108c
SS
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. */
c5aa993b
JM
300
301static void
fba45db2 302dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
c906108c
SS
303{
304 struct minimal_symbol *msymbol;
305 int index;
306 char ms_type;
c5aa993b
JM
307
308 fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile->name);
309 if (objfile->minimal_symbol_count == 0)
c906108c
SS
310 {
311 fprintf_filtered (outfile, "No minimal symbols found.\n");
312 return;
313 }
c5aa993b 314 for (index = 0, msymbol = objfile->msymbols;
22abf04a 315 DEPRECATED_SYMBOL_NAME (msymbol) != NULL; msymbol++, index++)
c906108c 316 {
c5aa993b 317 switch (msymbol->type)
c906108c 318 {
c5aa993b
JM
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;
c906108c
SS
349 }
350 fprintf_filtered (outfile, "[%2d] %c ", index, ms_type);
66bf4b3a 351 deprecated_print_address_numeric (SYMBOL_VALUE_ADDRESS (msymbol), 1, outfile);
22abf04a 352 fprintf_filtered (outfile, " %s", DEPRECATED_SYMBOL_NAME (msymbol));
c906108c
SS
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 }
c5aa993b 367 if (objfile->minimal_symbol_count != index)
c906108c 368 {
8a3fe4f8 369 warning (_("internal error: minimal symbol count %d != %d"),
c5aa993b 370 objfile->minimal_symbol_count, index);
c906108c
SS
371 }
372 fprintf_filtered (outfile, "\n");
373}
374
375static void
fba45db2
KB
376dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
377 struct ui_file *outfile)
c906108c
SS
378{
379 int i;
380
381 fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
c5aa993b 382 psymtab->filename);
c906108c 383 fprintf_filtered (outfile, "(object ");
d4f3574e 384 gdb_print_host_address (psymtab, outfile);
c906108c
SS
385 fprintf_filtered (outfile, ")\n\n");
386 fprintf_unfiltered (outfile, " Read from object file %s (",
c5aa993b 387 objfile->name);
d4f3574e 388 gdb_print_host_address (objfile, outfile);
c906108c
SS
389 fprintf_unfiltered (outfile, ")\n");
390
c5aa993b 391 if (psymtab->readin)
c906108c
SS
392 {
393 fprintf_filtered (outfile,
c5aa993b 394 " Full symtab was read (at ");
d4f3574e 395 gdb_print_host_address (psymtab->symtab, outfile);
c906108c 396 fprintf_filtered (outfile, " by function at ");
4efb68b1 397 gdb_print_host_address (psymtab->read_symtab, outfile);
c906108c
SS
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 (" ");
66bf4b3a 407 deprecated_print_address_numeric (ANOFFSET (psymtab->section_offsets, i),
c906108c
SS
408 1,
409 outfile);
410 }
411 fprintf_filtered (outfile, "\n");
412
413 fprintf_filtered (outfile, " Symbols cover text addresses ");
66bf4b3a 414 deprecated_print_address_numeric (psymtab->textlow, 1, outfile);
c906108c 415 fprintf_filtered (outfile, "-");
66bf4b3a 416 deprecated_print_address_numeric (psymtab->texthigh, 1, outfile);
c906108c
SS
417 fprintf_filtered (outfile, "\n");
418 fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n",
c5aa993b
JM
419 psymtab->number_of_dependencies);
420 for (i = 0; i < psymtab->number_of_dependencies; i++)
c906108c
SS
421 {
422 fprintf_filtered (outfile, " %d ", i);
d4f3574e 423 gdb_print_host_address (psymtab->dependencies[i], outfile);
c906108c 424 fprintf_filtered (outfile, " %s\n",
c5aa993b 425 psymtab->dependencies[i]->filename);
c906108c 426 }
c5aa993b 427 if (psymtab->n_global_syms > 0)
c906108c 428 {
c5aa993b
JM
429 print_partial_symbols (objfile->global_psymbols.list
430 + psymtab->globals_offset,
431 psymtab->n_global_syms, "Global", outfile);
c906108c 432 }
c5aa993b 433 if (psymtab->n_static_syms > 0)
c906108c 434 {
c5aa993b
JM
435 print_partial_symbols (objfile->static_psymbols.list
436 + psymtab->statics_offset,
437 psymtab->n_static_syms, "Static", outfile);
c906108c
SS
438 }
439 fprintf_filtered (outfile, "\n");
440}
441
c5aa993b 442static void
44b164c5
JB
443dump_symtab_1 (struct objfile *objfile, struct symtab *symtab,
444 struct ui_file *outfile)
c906108c 445{
de4f826b
DC
446 int i;
447 struct dict_iterator iter;
c906108c 448 int len, blen;
de4f826b 449 struct linetable *l;
c906108c 450 struct blockvector *bv;
e88c90f2 451 struct symbol *sym;
de4f826b 452 struct block *b;
c906108c
SS
453 int depth;
454
455 fprintf_filtered (outfile, "\nSymtab for file %s\n", symtab->filename);
456 if (symtab->dirname)
457 fprintf_filtered (outfile, "Compilation directory is %s\n",
458 symtab->dirname);
459 fprintf_filtered (outfile, "Read from object file %s (", objfile->name);
d4f3574e 460 gdb_print_host_address (objfile, outfile);
c906108c
SS
461 fprintf_filtered (outfile, ")\n");
462 fprintf_filtered (outfile, "Language: %s\n", language_str (symtab->language));
463
464 /* First print the line table. */
465 l = LINETABLE (symtab);
466 if (l)
467 {
468 fprintf_filtered (outfile, "\nLine table:\n\n");
469 len = l->nitems;
470 for (i = 0; i < len; i++)
471 {
472 fprintf_filtered (outfile, " line %d at ", l->item[i].line);
66bf4b3a 473 deprecated_print_address_numeric (l->item[i].pc, 1, outfile);
c906108c
SS
474 fprintf_filtered (outfile, "\n");
475 }
476 }
477 /* Now print the block info, but only for primary symtabs since we will
478 print lots of duplicate info otherwise. */
c5aa993b 479 if (symtab->primary)
c906108c
SS
480 {
481 fprintf_filtered (outfile, "\nBlockvector:\n\n");
482 bv = BLOCKVECTOR (symtab);
483 len = BLOCKVECTOR_NBLOCKS (bv);
484 for (i = 0; i < len; i++)
485 {
486 b = BLOCKVECTOR_BLOCK (bv, i);
487 depth = block_depth (b) * 2;
488 print_spaces (depth, outfile);
489 fprintf_filtered (outfile, "block #%03d, object at ", i);
d4f3574e 490 gdb_print_host_address (b, outfile);
c906108c
SS
491 if (BLOCK_SUPERBLOCK (b))
492 {
493 fprintf_filtered (outfile, " under ");
d4f3574e 494 gdb_print_host_address (BLOCK_SUPERBLOCK (b), outfile);
c906108c 495 }
261397f8
DJ
496 /* drow/2002-07-10: We could save the total symbols count
497 even if we're using a hashtable, but nothing else but this message
498 wants it. */
de4f826b
DC
499 fprintf_filtered (outfile, ", %d syms/buckets in ",
500 dict_size (BLOCK_DICT (b)));
66bf4b3a 501 deprecated_print_address_numeric (BLOCK_START (b), 1, outfile);
c906108c 502 fprintf_filtered (outfile, "..");
66bf4b3a 503 deprecated_print_address_numeric (BLOCK_END (b), 1, outfile);
c906108c
SS
504 if (BLOCK_FUNCTION (b))
505 {
22abf04a 506 fprintf_filtered (outfile, ", function %s", DEPRECATED_SYMBOL_NAME (BLOCK_FUNCTION (b)));
c906108c
SS
507 if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)) != NULL)
508 {
509 fprintf_filtered (outfile, ", %s",
c5aa993b 510 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)));
c906108c
SS
511 }
512 }
c5aa993b
JM
513 if (BLOCK_GCC_COMPILED (b))
514 fprintf_filtered (outfile, ", compiled with gcc%d", BLOCK_GCC_COMPILED (b));
c906108c 515 fprintf_filtered (outfile, "\n");
261397f8
DJ
516 /* Now print each symbol in this block (in no particular order, if
517 we're using a hashtable). */
de4f826b 518 ALL_BLOCK_SYMBOLS (b, iter, sym)
c906108c
SS
519 {
520 struct print_symbol_args s;
e88c90f2 521 s.symbol = sym;
c906108c
SS
522 s.depth = depth + 1;
523 s.outfile = outfile;
524 catch_errors (print_symbol, &s, "Error printing symbol:\n",
525 RETURN_MASK_ALL);
526 }
527 }
528 fprintf_filtered (outfile, "\n");
529 }
530 else
531 {
532 fprintf_filtered (outfile, "\nBlockvector same as previous symtab\n\n");
533 }
534}
535
44b164c5
JB
536static void
537dump_symtab (struct objfile *objfile, struct symtab *symtab,
538 struct ui_file *outfile)
539{
540 enum language saved_lang;
541
542 /* Set the current language to the language of the symtab we're dumping
543 because certain routines used during dump_symtab() use the current
544 language to print an image of the symbol. We'll restore it later. */
545 saved_lang = set_language (symtab->language);
546
547 dump_symtab_1 (objfile, symtab, outfile);
548
549 set_language (saved_lang);
550}
551
c906108c 552void
fba45db2 553maintenance_print_symbols (char *args, int from_tty)
c906108c
SS
554{
555 char **argv;
d9fcf2fb 556 struct ui_file *outfile;
c906108c
SS
557 struct cleanup *cleanups;
558 char *symname = NULL;
559 char *filename = DEV_TTY;
560 struct objfile *objfile;
561 struct symtab *s;
562
563 dont_repeat ();
564
565 if (args == NULL)
566 {
8a3fe4f8
AC
567 error (_("\
568Arguments missing: an output file name and an optional symbol file name"));
c906108c
SS
569 }
570 else if ((argv = buildargv (args)) == NULL)
571 {
572 nomem (0);
573 }
7a292a7a 574 cleanups = make_cleanup_freeargv (argv);
c906108c
SS
575
576 if (argv[0] != NULL)
577 {
578 filename = argv[0];
579 /* If a second arg is supplied, it is a source file name to match on */
580 if (argv[1] != NULL)
581 {
582 symname = argv[1];
583 }
584 }
585
586 filename = tilde_expand (filename);
b8c9b27d 587 make_cleanup (xfree, filename);
c5aa993b 588
c906108c
SS
589 outfile = gdb_fopen (filename, FOPEN_WT);
590 if (outfile == 0)
591 perror_with_name (filename);
d9fcf2fb 592 make_cleanup_ui_file_delete (outfile);
c906108c
SS
593
594 immediate_quit++;
595 ALL_SYMTABS (objfile, s)
6314a349 596 if (symname == NULL || strcmp (symname, s->filename) == 0)
c5aa993b 597 dump_symtab (objfile, s, outfile);
c906108c
SS
598 immediate_quit--;
599 do_cleanups (cleanups);
600}
601
602/* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how
603 far to indent. ARGS is really a struct print_symbol_args *, but is
604 declared as char * to get it past catch_errors. Returns 0 for error,
605 1 for success. */
606
607static int
4efb68b1 608print_symbol (void *args)
c906108c 609{
c5aa993b
JM
610 struct symbol *symbol = ((struct print_symbol_args *) args)->symbol;
611 int depth = ((struct print_symbol_args *) args)->depth;
d9fcf2fb 612 struct ui_file *outfile = ((struct print_symbol_args *) args)->outfile;
c906108c
SS
613
614 print_spaces (depth, outfile);
176620f1 615 if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN)
c906108c 616 {
de5ad195 617 fprintf_filtered (outfile, "label %s at ", SYMBOL_PRINT_NAME (symbol));
66bf4b3a 618 deprecated_print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol), 1, outfile);
c906108c
SS
619 if (SYMBOL_BFD_SECTION (symbol))
620 fprintf_filtered (outfile, " section %s\n",
c5aa993b
JM
621 bfd_section_name (SYMBOL_BFD_SECTION (symbol)->owner,
622 SYMBOL_BFD_SECTION (symbol)));
c906108c
SS
623 else
624 fprintf_filtered (outfile, "\n");
625 return 1;
626 }
176620f1 627 if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN)
c906108c
SS
628 {
629 if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol)))
630 {
631 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
632 }
633 else
634 {
635 fprintf_filtered (outfile, "%s %s = ",
c5aa993b
JM
636 (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_ENUM
637 ? "enum"
638 : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
639 ? "struct" : "union")),
22abf04a 640 DEPRECATED_SYMBOL_NAME (symbol));
c906108c
SS
641 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
642 }
643 fprintf_filtered (outfile, ";\n");
644 }
645 else
646 {
647 if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
648 fprintf_filtered (outfile, "typedef ");
649 if (SYMBOL_TYPE (symbol))
650 {
651 /* Print details of types, except for enums where it's clutter. */
de5ad195 652 LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol),
c906108c
SS
653 outfile,
654 TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
655 depth);
656 fprintf_filtered (outfile, "; ");
657 }
658 else
de5ad195 659 fprintf_filtered (outfile, "%s ", SYMBOL_PRINT_NAME (symbol));
c906108c
SS
660
661 switch (SYMBOL_CLASS (symbol))
662 {
663 case LOC_CONST:
664 fprintf_filtered (outfile, "const %ld (0x%lx)",
665 SYMBOL_VALUE (symbol),
666 SYMBOL_VALUE (symbol));
667 break;
668
669 case LOC_CONST_BYTES:
670 {
671 unsigned i;
672 struct type *type = check_typedef (SYMBOL_TYPE (symbol));
673 fprintf_filtered (outfile, "const %u hex bytes:",
674 TYPE_LENGTH (type));
675 for (i = 0; i < TYPE_LENGTH (type); i++)
676 fprintf_filtered (outfile, " %02x",
c5aa993b 677 (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
c906108c
SS
678 }
679 break;
680
681 case LOC_STATIC:
682 fprintf_filtered (outfile, "static at ");
66bf4b3a 683 deprecated_print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol), 1, outfile);
c906108c
SS
684 if (SYMBOL_BFD_SECTION (symbol))
685 fprintf_filtered (outfile, " section %s",
686 bfd_section_name
687 (SYMBOL_BFD_SECTION (symbol)->owner,
688 SYMBOL_BFD_SECTION (symbol)));
689 break;
690
691 case LOC_INDIRECT:
692 fprintf_filtered (outfile, "extern global at *(");
66bf4b3a 693 deprecated_print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol), 1, outfile);
c906108c
SS
694 fprintf_filtered (outfile, "),");
695 break;
696
697 case LOC_REGISTER:
698 fprintf_filtered (outfile, "register %ld", SYMBOL_VALUE (symbol));
699 break;
700
701 case LOC_ARG:
702 fprintf_filtered (outfile, "arg at offset 0x%lx",
703 SYMBOL_VALUE (symbol));
704 break;
705
706 case LOC_LOCAL_ARG:
707 fprintf_filtered (outfile, "arg at offset 0x%lx from fp",
c5aa993b 708 SYMBOL_VALUE (symbol));
c906108c
SS
709 break;
710
711 case LOC_REF_ARG:
712 fprintf_filtered (outfile, "reference arg at 0x%lx", SYMBOL_VALUE (symbol));
713 break;
714
715 case LOC_REGPARM:
716 fprintf_filtered (outfile, "parameter register %ld", SYMBOL_VALUE (symbol));
717 break;
718
719 case LOC_REGPARM_ADDR:
720 fprintf_filtered (outfile, "address parameter register %ld", SYMBOL_VALUE (symbol));
721 break;
722
723 case LOC_LOCAL:
724 fprintf_filtered (outfile, "local at offset 0x%lx",
725 SYMBOL_VALUE (symbol));
726 break;
727
728 case LOC_BASEREG:
729 fprintf_filtered (outfile, "local at 0x%lx from register %d",
c5aa993b 730 SYMBOL_VALUE (symbol), SYMBOL_BASEREG (symbol));
c906108c
SS
731 break;
732
733 case LOC_BASEREG_ARG:
734 fprintf_filtered (outfile, "arg at 0x%lx from register %d",
c5aa993b 735 SYMBOL_VALUE (symbol), SYMBOL_BASEREG (symbol));
c906108c
SS
736 break;
737
738 case LOC_TYPEDEF:
739 break;
740
741 case LOC_LABEL:
742 fprintf_filtered (outfile, "label at ");
66bf4b3a 743 deprecated_print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol), 1, outfile);
c906108c
SS
744 if (SYMBOL_BFD_SECTION (symbol))
745 fprintf_filtered (outfile, " section %s",
746 bfd_section_name
747 (SYMBOL_BFD_SECTION (symbol)->owner,
748 SYMBOL_BFD_SECTION (symbol)));
749 break;
750
751 case LOC_BLOCK:
752 fprintf_filtered (outfile, "block object ");
d4f3574e 753 gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol), outfile);
c906108c 754 fprintf_filtered (outfile, ", ");
66bf4b3a 755 deprecated_print_address_numeric (BLOCK_START (SYMBOL_BLOCK_VALUE (symbol)),
c906108c
SS
756 1,
757 outfile);
758 fprintf_filtered (outfile, "..");
66bf4b3a 759 deprecated_print_address_numeric (BLOCK_END (SYMBOL_BLOCK_VALUE (symbol)),
c906108c
SS
760 1,
761 outfile);
762 if (SYMBOL_BFD_SECTION (symbol))
763 fprintf_filtered (outfile, " section %s",
764 bfd_section_name
765 (SYMBOL_BFD_SECTION (symbol)->owner,
766 SYMBOL_BFD_SECTION (symbol)));
767 break;
768
4c2df51b
DJ
769 case LOC_COMPUTED:
770 case LOC_COMPUTED_ARG:
771 fprintf_filtered (outfile, "computed at runtime");
772 break;
773
c906108c
SS
774 case LOC_UNRESOLVED:
775 fprintf_filtered (outfile, "unresolved");
776 break;
777
778 case LOC_OPTIMIZED_OUT:
779 fprintf_filtered (outfile, "optimized out");
780 break;
781
c5aa993b 782 default:
c906108c
SS
783 fprintf_filtered (outfile, "botched symbol class %x",
784 SYMBOL_CLASS (symbol));
785 break;
786 }
787 }
788 fprintf_filtered (outfile, "\n");
789 return 1;
790}
791
792void
fba45db2 793maintenance_print_psymbols (char *args, int from_tty)
c906108c
SS
794{
795 char **argv;
d9fcf2fb 796 struct ui_file *outfile;
c906108c
SS
797 struct cleanup *cleanups;
798 char *symname = NULL;
799 char *filename = DEV_TTY;
800 struct objfile *objfile;
801 struct partial_symtab *ps;
802
803 dont_repeat ();
804
805 if (args == NULL)
806 {
8a3fe4f8 807 error (_("print-psymbols takes an output file name and optional symbol file name"));
c906108c
SS
808 }
809 else if ((argv = buildargv (args)) == NULL)
810 {
811 nomem (0);
812 }
7a292a7a 813 cleanups = make_cleanup_freeargv (argv);
c906108c
SS
814
815 if (argv[0] != NULL)
816 {
817 filename = argv[0];
818 /* If a second arg is supplied, it is a source file name to match on */
819 if (argv[1] != NULL)
820 {
821 symname = argv[1];
822 }
823 }
824
825 filename = tilde_expand (filename);
b8c9b27d 826 make_cleanup (xfree, filename);
c5aa993b 827
c906108c
SS
828 outfile = gdb_fopen (filename, FOPEN_WT);
829 if (outfile == 0)
830 perror_with_name (filename);
d9fcf2fb 831 make_cleanup_ui_file_delete (outfile);
c906108c
SS
832
833 immediate_quit++;
834 ALL_PSYMTABS (objfile, ps)
6314a349 835 if (symname == NULL || strcmp (symname, ps->filename) == 0)
c5aa993b 836 dump_psymtab (objfile, ps, outfile);
c906108c
SS
837 immediate_quit--;
838 do_cleanups (cleanups);
839}
840
841static void
fba45db2
KB
842print_partial_symbols (struct partial_symbol **p, int count, char *what,
843 struct ui_file *outfile)
c906108c
SS
844{
845 fprintf_filtered (outfile, " %s partial symbols:\n", what);
846 while (count-- > 0)
847 {
22abf04a 848 fprintf_filtered (outfile, " `%s'", DEPRECATED_SYMBOL_NAME (*p));
c906108c
SS
849 if (SYMBOL_DEMANGLED_NAME (*p) != NULL)
850 {
851 fprintf_filtered (outfile, " `%s'", SYMBOL_DEMANGLED_NAME (*p));
852 }
853 fputs_filtered (", ", outfile);
176620f1 854 switch (SYMBOL_DOMAIN (*p))
c906108c 855 {
176620f1
EZ
856 case UNDEF_DOMAIN:
857 fputs_filtered ("undefined domain, ", outfile);
c906108c 858 break;
176620f1 859 case VAR_DOMAIN:
c906108c
SS
860 /* This is the usual thing -- don't print it */
861 break;
176620f1
EZ
862 case STRUCT_DOMAIN:
863 fputs_filtered ("struct domain, ", outfile);
c906108c 864 break;
176620f1
EZ
865 case LABEL_DOMAIN:
866 fputs_filtered ("label domain, ", outfile);
c906108c
SS
867 break;
868 default:
176620f1 869 fputs_filtered ("<invalid domain>, ", outfile);
c906108c
SS
870 break;
871 }
872 switch (SYMBOL_CLASS (*p))
873 {
874 case LOC_UNDEF:
875 fputs_filtered ("undefined", outfile);
876 break;
877 case LOC_CONST:
878 fputs_filtered ("constant int", outfile);
879 break;
880 case LOC_STATIC:
881 fputs_filtered ("static", outfile);
882 break;
883 case LOC_INDIRECT:
884 fputs_filtered ("extern global", outfile);
885 break;
886 case LOC_REGISTER:
887 fputs_filtered ("register", outfile);
888 break;
889 case LOC_ARG:
890 fputs_filtered ("pass by value", outfile);
891 break;
892 case LOC_REF_ARG:
893 fputs_filtered ("pass by reference", outfile);
894 break;
895 case LOC_REGPARM:
896 fputs_filtered ("register parameter", outfile);
897 break;
898 case LOC_REGPARM_ADDR:
899 fputs_filtered ("register address parameter", outfile);
900 break;
901 case LOC_LOCAL:
902 fputs_filtered ("stack parameter", outfile);
903 break;
904 case LOC_TYPEDEF:
905 fputs_filtered ("type", outfile);
906 break;
907 case LOC_LABEL:
908 fputs_filtered ("label", outfile);
909 break;
910 case LOC_BLOCK:
911 fputs_filtered ("function", outfile);
912 break;
913 case LOC_CONST_BYTES:
914 fputs_filtered ("constant bytes", outfile);
915 break;
916 case LOC_LOCAL_ARG:
917 fputs_filtered ("shuffled arg", outfile);
918 break;
919 case LOC_UNRESOLVED:
920 fputs_filtered ("unresolved", outfile);
921 break;
922 case LOC_OPTIMIZED_OUT:
923 fputs_filtered ("optimized out", outfile);
924 break;
4c2df51b
DJ
925 case LOC_COMPUTED:
926 case LOC_COMPUTED_ARG:
927 fputs_filtered ("computed at runtime", outfile);
928 break;
c906108c
SS
929 default:
930 fputs_filtered ("<invalid location>", outfile);
931 break;
932 }
933 fputs_filtered (", ", outfile);
66bf4b3a 934 deprecated_print_address_numeric (SYMBOL_VALUE_ADDRESS (*p), 1, outfile);
c906108c
SS
935 fprintf_filtered (outfile, "\n");
936 p++;
937 }
938}
939
940void
fba45db2 941maintenance_print_msymbols (char *args, int from_tty)
c906108c
SS
942{
943 char **argv;
d9fcf2fb 944 struct ui_file *outfile;
c906108c
SS
945 struct cleanup *cleanups;
946 char *filename = DEV_TTY;
947 char *symname = NULL;
948 struct objfile *objfile;
949
07318b29
CV
950 struct stat sym_st, obj_st;
951
c906108c
SS
952 dont_repeat ();
953
954 if (args == NULL)
955 {
8a3fe4f8 956 error (_("print-msymbols takes an output file name and optional symbol file name"));
c906108c
SS
957 }
958 else if ((argv = buildargv (args)) == NULL)
959 {
960 nomem (0);
961 }
7a292a7a 962 cleanups = make_cleanup_freeargv (argv);
c906108c
SS
963
964 if (argv[0] != NULL)
965 {
966 filename = argv[0];
967 /* If a second arg is supplied, it is a source file name to match on */
968 if (argv[1] != NULL)
969 {
07318b29
CV
970 symname = xfullpath (argv[1]);
971 make_cleanup (xfree, symname);
972 if (symname && stat (symname, &sym_st))
973 perror_with_name (symname);
c906108c
SS
974 }
975 }
976
977 filename = tilde_expand (filename);
b8c9b27d 978 make_cleanup (xfree, filename);
c5aa993b 979
c906108c
SS
980 outfile = gdb_fopen (filename, FOPEN_WT);
981 if (outfile == 0)
982 perror_with_name (filename);
d9fcf2fb 983 make_cleanup_ui_file_delete (outfile);
c906108c
SS
984
985 immediate_quit++;
986 ALL_OBJFILES (objfile)
07318b29
CV
987 if (symname == NULL
988 || (!stat (objfile->name, &obj_st) && sym_st.st_ino == obj_st.st_ino))
989 dump_msymbols (objfile, outfile);
c906108c
SS
990 immediate_quit--;
991 fprintf_filtered (outfile, "\n\n");
992 do_cleanups (cleanups);
993}
994
995void
fba45db2 996maintenance_print_objfiles (char *ignore, int from_tty)
c906108c
SS
997{
998 struct objfile *objfile;
999
1000 dont_repeat ();
1001
1002 immediate_quit++;
1003 ALL_OBJFILES (objfile)
1004 dump_objfile (objfile);
1005 immediate_quit--;
1006}
1007
44ea7b70 1008
5e7b2f39 1009/* List all the symbol tables whose names match REGEXP (optional). */
44ea7b70 1010void
5e7b2f39 1011maintenance_info_symtabs (char *regexp, int from_tty)
44ea7b70
JB
1012{
1013 struct objfile *objfile;
1014
1015 if (regexp)
1016 re_comp (regexp);
1017
1018 ALL_OBJFILES (objfile)
1019 {
1020 struct symtab *symtab;
1021
1022 /* We don't want to print anything for this objfile until we
1023 actually find a symtab whose name matches. */
1024 int printed_objfile_start = 0;
1025
1026 ALL_OBJFILE_SYMTABS (objfile, symtab)
1027 if (! regexp
1028 || re_exec (symtab->filename))
1029 {
1030 if (! printed_objfile_start)
1031 {
1032 printf_filtered ("{ objfile %s ", objfile->name);
1033 wrap_here (" ");
1034 printf_filtered ("((struct objfile *) %p)\n", objfile);
1035 printed_objfile_start = 1;
1036 }
1037
1038 printf_filtered (" { symtab %s ", symtab->filename);
1039 wrap_here (" ");
1040 printf_filtered ("((struct symtab *) %p)\n", symtab);
1041 printf_filtered (" dirname %s\n",
1042 symtab->dirname ? symtab->dirname : "(null)");
1043 printf_filtered (" fullname %s\n",
1044 symtab->fullname ? symtab->fullname : "(null)");
1045 printf_filtered (" blockvector ((struct blockvector *) %p)%s\n",
1046 symtab->blockvector,
1047 symtab->primary ? " (primary)" : "");
1048 printf_filtered (" debugformat %s\n", symtab->debugformat);
1049 printf_filtered (" }\n");
1050 }
1051
1052 if (printed_objfile_start)
1053 printf_filtered ("}\n");
1054 }
1055}
1056
1057
5e7b2f39 1058/* List all the partial symbol tables whose names match REGEXP (optional). */
44ea7b70 1059void
5e7b2f39 1060maintenance_info_psymtabs (char *regexp, int from_tty)
44ea7b70
JB
1061{
1062 struct objfile *objfile;
1063
1064 if (regexp)
1065 re_comp (regexp);
1066
1067 ALL_OBJFILES (objfile)
1068 {
1069 struct partial_symtab *psymtab;
1070
1071 /* We don't want to print anything for this objfile until we
1072 actually find a symtab whose name matches. */
1073 int printed_objfile_start = 0;
1074
1075 ALL_OBJFILE_PSYMTABS (objfile, psymtab)
1076 if (! regexp
1077 || re_exec (psymtab->filename))
1078 {
1079 if (! printed_objfile_start)
1080 {
1081 printf_filtered ("{ objfile %s ", objfile->name);
1082 wrap_here (" ");
1083 printf_filtered ("((struct objfile *) %p)\n", objfile);
1084 printed_objfile_start = 1;
1085 }
1086
1087 printf_filtered (" { psymtab %s ", psymtab->filename);
1088 wrap_here (" ");
1089 printf_filtered ("((struct partial_symtab *) %p)\n", psymtab);
1090 printf_filtered (" readin %s\n",
1091 psymtab->readin ? "yes" : "no");
1092 printf_filtered (" fullname %s\n",
1093 psymtab->fullname ? psymtab->fullname : "(null)");
1094 printf_filtered (" text addresses ");
66bf4b3a 1095 deprecated_print_address_numeric (psymtab->textlow, 1, gdb_stdout);
44ea7b70 1096 printf_filtered (" -- ");
66bf4b3a 1097 deprecated_print_address_numeric (psymtab->texthigh, 1, gdb_stdout);
44ea7b70
JB
1098 printf_filtered ("\n");
1099 printf_filtered (" globals ");
1100 if (psymtab->n_global_syms)
1101 {
1102 printf_filtered ("(* (struct partial_symbol **) %p @ %d)\n",
1103 (psymtab->objfile->global_psymbols.list
1104 + psymtab->globals_offset),
1105 psymtab->n_global_syms);
1106 }
1107 else
1108 printf_filtered ("(none)\n");
1109 printf_filtered (" statics ");
1110 if (psymtab->n_static_syms)
1111 {
1112 printf_filtered ("(* (struct partial_symbol **) %p @ %d)\n",
1113 (psymtab->objfile->static_psymbols.list
1114 + psymtab->statics_offset),
1115 psymtab->n_static_syms);
1116 }
1117 else
1118 printf_filtered ("(none)\n");
1119 printf_filtered (" dependencies ");
1120 if (psymtab->number_of_dependencies)
1121 {
1122 int i;
1123
1124 printf_filtered ("{\n");
1125 for (i = 0; i < psymtab->number_of_dependencies; i++)
1126 {
1127 struct partial_symtab *dep = psymtab->dependencies[i];
1128
1129 /* Note the string concatenation there --- no comma. */
1130 printf_filtered (" psymtab %s "
1131 "((struct partial_symtab *) %p)\n",
1132 dep->filename, dep);
1133 }
1134 printf_filtered (" }\n");
1135 }
1136 else
1137 printf_filtered ("(none)\n");
1138 printf_filtered (" }\n");
1139 }
1140
1141 if (printed_objfile_start)
1142 printf_filtered ("}\n");
1143 }
1144}
1145
1146
c906108c
SS
1147/* Check consistency of psymtabs and symtabs. */
1148
1149void
fba45db2 1150maintenance_check_symtabs (char *ignore, int from_tty)
c906108c 1151{
52f0bd74
AC
1152 struct symbol *sym;
1153 struct partial_symbol **psym;
1154 struct symtab *s = NULL;
1155 struct partial_symtab *ps;
c906108c 1156 struct blockvector *bv;
52f0bd74
AC
1157 struct objfile *objfile;
1158 struct block *b;
c906108c
SS
1159 int length;
1160
1161 ALL_PSYMTABS (objfile, ps)
c5aa993b
JM
1162 {
1163 s = PSYMTAB_TO_SYMTAB (ps);
1164 if (s == NULL)
1165 continue;
1166 bv = BLOCKVECTOR (s);
1167 b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
1168 psym = ps->objfile->static_psymbols.list + ps->statics_offset;
1169 length = ps->n_static_syms;
1170 while (length--)
1171 {
22abf04a 1172 sym = lookup_block_symbol (b, DEPRECATED_SYMBOL_NAME (*psym),
176620f1 1173 NULL, SYMBOL_DOMAIN (*psym));
c5aa993b
JM
1174 if (!sym)
1175 {
1176 printf_filtered ("Static symbol `");
22abf04a 1177 puts_filtered (DEPRECATED_SYMBOL_NAME (*psym));
c5aa993b
JM
1178 printf_filtered ("' only found in ");
1179 puts_filtered (ps->filename);
1180 printf_filtered (" psymtab\n");
1181 }
1182 psym++;
1183 }
1184 b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
1185 psym = ps->objfile->global_psymbols.list + ps->globals_offset;
1186 length = ps->n_global_syms;
1187 while (length--)
1188 {
22abf04a 1189 sym = lookup_block_symbol (b, DEPRECATED_SYMBOL_NAME (*psym),
176620f1 1190 NULL, SYMBOL_DOMAIN (*psym));
c5aa993b
JM
1191 if (!sym)
1192 {
1193 printf_filtered ("Global symbol `");
22abf04a 1194 puts_filtered (DEPRECATED_SYMBOL_NAME (*psym));
c5aa993b
JM
1195 printf_filtered ("' only found in ");
1196 puts_filtered (ps->filename);
1197 printf_filtered (" psymtab\n");
1198 }
1199 psym++;
1200 }
1201 if (ps->texthigh < ps->textlow)
1202 {
1203 printf_filtered ("Psymtab ");
1204 puts_filtered (ps->filename);
1205 printf_filtered (" covers bad range ");
66bf4b3a 1206 deprecated_print_address_numeric (ps->textlow, 1, gdb_stdout);
c5aa993b 1207 printf_filtered (" - ");
66bf4b3a 1208 deprecated_print_address_numeric (ps->texthigh, 1, gdb_stdout);
c5aa993b 1209 printf_filtered ("\n");
c906108c 1210 continue;
c5aa993b
JM
1211 }
1212 if (ps->texthigh == 0)
1213 continue;
1214 if (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b))
1215 {
1216 printf_filtered ("Psymtab ");
1217 puts_filtered (ps->filename);
1218 printf_filtered (" covers ");
66bf4b3a 1219 deprecated_print_address_numeric (ps->textlow, 1, gdb_stdout);
c5aa993b 1220 printf_filtered (" - ");
66bf4b3a 1221 deprecated_print_address_numeric (ps->texthigh, 1, gdb_stdout);
c5aa993b 1222 printf_filtered (" but symtab covers only ");
66bf4b3a 1223 deprecated_print_address_numeric (BLOCK_START (b), 1, gdb_stdout);
c5aa993b 1224 printf_filtered (" - ");
66bf4b3a 1225 deprecated_print_address_numeric (BLOCK_END (b), 1, gdb_stdout);
c5aa993b
JM
1226 printf_filtered ("\n");
1227 }
1228 }
c906108c 1229}
c906108c 1230\f
c5aa993b 1231
c906108c
SS
1232/* Return the nexting depth of a block within other blocks in its symtab. */
1233
1234static int
fba45db2 1235block_depth (struct block *block)
c906108c 1236{
52f0bd74 1237 int i = 0;
c5aa993b 1238 while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
c906108c
SS
1239 {
1240 i++;
1241 }
1242 return i;
1243}
c906108c 1244\f
c5aa993b 1245
c906108c
SS
1246/* Increase the space allocated for LISTP, which is probably
1247 global_psymbols or static_psymbols. This space will eventually
1248 be freed in free_objfile(). */
1249
1250void
aa1ee363 1251extend_psymbol_list (struct psymbol_allocation_list *listp,
fba45db2 1252 struct objfile *objfile)
c906108c
SS
1253{
1254 int new_size;
1255 if (listp->size == 0)
1256 {
1257 new_size = 255;
1258 listp->list = (struct partial_symbol **)
7936743b 1259 xmalloc (new_size * sizeof (struct partial_symbol *));
c906108c
SS
1260 }
1261 else
1262 {
1263 new_size = listp->size * 2;
1264 listp->list = (struct partial_symbol **)
0efffb96
AC
1265 xrealloc ((char *) listp->list,
1266 new_size * sizeof (struct partial_symbol *));
c906108c
SS
1267 }
1268 /* Next assumes we only went one over. Should be good if
1269 program works correctly */
1270 listp->next = listp->list + listp->size;
1271 listp->size = new_size;
1272}
1273
1274
1275/* Do early runtime initializations. */
1276void
fba45db2 1277_initialize_symmisc (void)
c906108c 1278{
c5aa993b 1279 std_in = stdin;
c906108c
SS
1280 std_out = stdout;
1281 std_err = stderr;
1282}