1 /* Do various things to symbol tables (other than lookup), for GDB.
2 Copyright 1986, 1987, 1989, 1991, 1992 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
26 #include "breakpoint.h"
34 #define DEV_TTY "/dev/tty"
37 /* Unfortunately for debugging, stderr is usually a macro. Better if we
38 make a variable which has the same value and which is accessible when
39 debugging GDB with itself. */
41 FILE *std_out
= stdout
;
42 FILE *std_err
= stderr
;
44 /* Prototypes for local functions */
47 dump_symtab
PARAMS ((struct objfile
*, struct symtab
*, FILE *));
50 dump_psymtab
PARAMS ((struct objfile
*, struct partial_symtab
*, FILE *));
53 dump_msymbols
PARAMS ((struct objfile
*, FILE *));
56 dump_objfile
PARAMS ((struct objfile
*));
59 block_depth
PARAMS ((struct block
*));
62 print_partial_symbol
PARAMS ((struct partial_symbol
*, int, char *, FILE *));
65 print_symbol
PARAMS ((struct symbol
*, int, FILE *));
68 free_symtab_block
PARAMS ((struct objfile
*, struct block
*));
71 /* Free a struct block <- B and all the symbols defined in that block. */
74 free_symtab_block (objfile
, b
)
75 struct objfile
*objfile
;
80 for (i
= 0; i
< n
; i
++)
82 mfree (objfile
-> md
, SYMBOL_NAME (BLOCK_SYM (b
, i
)));
83 mfree (objfile
-> md
, (PTR
) BLOCK_SYM (b
, i
));
85 mfree (objfile
-> md
, (PTR
) b
);
88 /* Free all the storage associated with the struct symtab <- S.
89 Note that some symtabs have contents malloc'ed structure by structure,
90 while some have contents that all live inside one big block of memory,
91 and some share the contents of another symbol table and so you should
92 not free the contents on their behalf (except sometimes the linetable,
93 which maybe per symtab even when the rest is not).
94 It is s->free_code that says which alternative to use. */
98 register struct symtab
*s
;
101 register struct blockvector
*bv
;
103 switch (s
->free_code
)
106 /* All the contents are part of a big block of memory (an obstack),
107 and some other symtab is in charge of freeing that block.
108 Therefore, do nothing. */
112 /* Here all the contents were malloc'ed structure by structure
113 and must be freed that way. */
114 /* First free the blocks (and their symbols. */
115 bv
= BLOCKVECTOR (s
);
116 n
= BLOCKVECTOR_NBLOCKS (bv
);
117 for (i
= 0; i
< n
; i
++)
118 free_symtab_block (s
-> objfile
, BLOCKVECTOR_BLOCK (bv
, i
));
119 /* Free the blockvector itself. */
120 mfree (s
-> objfile
-> md
, (PTR
) bv
);
121 /* Also free the linetable. */
124 /* Everything will be freed either by our `free_ptr'
125 or by some other symtab, except for our linetable.
128 mfree (s
-> objfile
-> md
, (PTR
) LINETABLE (s
));
132 /* If there is a single block of memory to free, free it. */
133 if (s
-> free_ptr
!= NULL
)
134 mfree (s
-> objfile
-> md
, s
-> free_ptr
);
136 /* Free source-related stuff */
137 if (s
-> line_charpos
!= NULL
)
138 mfree (s
-> objfile
-> md
, (PTR
) s
-> line_charpos
);
139 if (s
-> fullname
!= NULL
)
140 mfree (s
-> objfile
-> md
, s
-> fullname
);
141 mfree (s
-> objfile
-> md
, (PTR
) s
);
147 dump_objfile (objfile
)
148 struct objfile
*objfile
;
150 struct symtab
*symtab
;
151 struct partial_symtab
*psymtab
;
153 printf_filtered ("\nObject file %s: ", objfile
-> name
);
154 printf_filtered ("Objfile at %x, bfd at %x, %d minsyms\n\n",
155 objfile
, objfile
-> obfd
, objfile
->minimal_symbol_count
);
157 if (objfile
-> psymtabs
)
159 printf_filtered ("Psymtabs:\n");
160 for (psymtab
= objfile
-> psymtabs
;
162 psymtab
= psymtab
-> next
)
164 printf_filtered ("%s at %x, ", psymtab
-> filename
, psymtab
);
165 if (psymtab
-> objfile
!= objfile
)
167 printf_filtered ("NOT ON CHAIN! ");
171 printf_filtered ("\n\n");
174 if (objfile
-> symtabs
)
176 printf_filtered ("Symtabs:\n");
177 for (symtab
= objfile
-> symtabs
;
179 symtab
= symtab
->next
)
181 printf_filtered ("%s at %x, ", symtab
-> filename
, symtab
);
182 if (symtab
-> objfile
!= objfile
)
184 printf_filtered ("NOT ON CHAIN! ");
188 printf_filtered ("\n\n");
192 /* Print minimal symbols from this objfile. */
195 dump_msymbols (objfile
, outfile
)
196 struct objfile
*objfile
;
199 struct minimal_symbol
*msymbol
;
203 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile
-> name
);
204 for (index
= 0, msymbol
= objfile
-> msymbols
;
205 SYMBOL_NAME (msymbol
) != NULL
; msymbol
++, index
++)
207 switch (msymbol
-> type
)
228 fprintf_filtered (outfile
, "[%2d] %c %#10x %s", index
, ms_type
,
229 SYMBOL_VALUE_ADDRESS (msymbol
), SYMBOL_NAME (msymbol
));
230 if (SYMBOL_LANGUAGE (msymbol
) == language_cplus
&&
231 SYMBOL_DEMANGLED_NAME (msymbol
) != NULL
)
233 fprintf_filtered (outfile
, " %s", SYMBOL_DEMANGLED_NAME (msymbol
));
235 fputs_filtered ("\n", outfile
);
237 if (objfile
-> minimal_symbol_count
!= index
)
239 warning ("internal error: minimal symbol count %d != %d",
240 objfile
-> minimal_symbol_count
, index
);
242 fprintf_filtered (outfile
, "\n");
246 dump_psymtab (objfile
, psymtab
, outfile
)
247 struct objfile
*objfile
;
248 struct partial_symtab
*psymtab
;
252 fprintf_filtered (outfile
, "\nPartial symtab for source file %s ",
253 psymtab
-> filename
);
254 fprintf_filtered (outfile
, "(object 0x%x)\n\n", psymtab
);
255 fprintf (outfile
, " Read from object file %s (0x%x)\n",
256 objfile
-> name
, (unsigned int) objfile
);
258 if (psymtab
-> readin
)
260 fprintf_filtered (outfile
,
261 " Full symtab was read (at 0x%x by function at 0x%x)\n",
262 psymtab
-> symtab
, psymtab
-> read_symtab
);
265 /* FIXME, we need to be able to print the relocation stuff. */
266 /* This prints some garbage for anything but stabs right now. FIXME. */
267 if (psymtab
->section_offsets
)
268 fprintf_filtered (outfile
, " Relocate symbols by 0x%x, 0x%x, 0x%x, 0x%x.\n",
269 ANOFFSET (psymtab
->section_offsets
, 0),
270 ANOFFSET (psymtab
->section_offsets
, 1),
271 ANOFFSET (psymtab
->section_offsets
, 2),
272 ANOFFSET (psymtab
->section_offsets
, 3));
274 fprintf_filtered (outfile
, " Symbols cover text addresses 0x%x-0x%x\n",
275 psymtab
-> textlow
, psymtab
-> texthigh
);
276 fprintf_filtered (outfile
, " Depends on %d other partial symtabs.\n",
277 psymtab
-> number_of_dependencies
);
278 if (psymtab
-> n_global_syms
> 0)
280 print_partial_symbol (objfile
-> global_psymbols
.list
281 + psymtab
-> globals_offset
,
282 psymtab
-> n_global_syms
, "Global", outfile
);
284 if (psymtab
-> n_static_syms
> 0)
286 print_partial_symbol (objfile
-> static_psymbols
.list
287 + psymtab
-> statics_offset
,
288 psymtab
-> n_static_syms
, "Static", outfile
);
290 fprintf_filtered (outfile
, "\n");
294 dump_symtab (objfile
, symtab
, outfile
)
295 struct objfile
*objfile
;
296 struct symtab
*symtab
;
301 register struct linetable
*l
;
302 struct blockvector
*bv
;
303 register struct block
*b
;
306 fprintf (outfile
, "\nSymtab for file %s\n", symtab
->filename
);
307 fprintf (outfile
, "Read from object file %s (%x)\n", objfile
->name
,
308 (unsigned int) objfile
);
309 fprintf (outfile
, "Language: %s\n", language_str (symtab
-> language
));
311 /* First print the line table. */
312 l
= LINETABLE (symtab
);
314 fprintf (outfile
, "\nLine table:\n\n");
316 for (i
= 0; i
< len
; i
++)
317 fprintf (outfile
, " line %d at %x\n", l
->item
[i
].line
,
320 /* Now print the block info. */
321 fprintf (outfile
, "\nBlockvector:\n\n");
322 bv
= BLOCKVECTOR (symtab
);
323 len
= BLOCKVECTOR_NBLOCKS (bv
);
324 for (i
= 0; i
< len
; i
++)
326 b
= BLOCKVECTOR_BLOCK (bv
, i
);
327 depth
= block_depth (b
) * 2;
328 print_spaces (depth
, outfile
);
329 fprintf (outfile
, "block #%03d (object 0x%x) ", i
, (unsigned int) b
);
330 fprintf (outfile
, "[0x%x..0x%x]", BLOCK_START (b
), BLOCK_END (b
));
331 if (BLOCK_SUPERBLOCK (b
))
332 fprintf (outfile
, " (under 0x%x)", (unsigned int) BLOCK_SUPERBLOCK (b
));
333 if (BLOCK_FUNCTION (b
))
335 fprintf (outfile
, " %s", SYMBOL_NAME (BLOCK_FUNCTION (b
)));
336 if (SYMBOL_LANGUAGE (BLOCK_FUNCTION (b
)) == language_cplus
&&
337 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)) != NULL
)
339 fprintf (outfile
, " %s",
340 SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b
)));
343 if (BLOCK_GCC_COMPILED(b
))
344 fprintf (outfile
, " gcc%d compiled", BLOCK_GCC_COMPILED(b
));
345 fputc ('\n', outfile
);
346 blen
= BLOCK_NSYMS (b
);
347 for (j
= 0; j
< blen
; j
++)
349 print_symbol (BLOCK_SYM (b
, j
), depth
+ 1, outfile
);
352 fprintf (outfile
, "\n");
356 maintenance_print_symbols (args
, from_tty
)
362 struct cleanup
*cleanups
;
363 char *symname
= NULL
;
364 char *filename
= DEV_TTY
;
365 struct objfile
*objfile
;
372 error ("print-symbols takes an output file name and optional symbol file name");
374 else if ((argv
= buildargv (args
)) == NULL
)
378 cleanups
= make_cleanup (freeargv
, (char *) argv
);
383 /* If a second arg is supplied, it is a source file name to match on */
390 filename
= tilde_expand (filename
);
391 make_cleanup (free
, filename
);
393 outfile
= fopen (filename
, "w");
395 perror_with_name (filename
);
396 make_cleanup (fclose
, (char *) outfile
);
399 ALL_SYMTABS (objfile
, s
)
400 if (symname
== NULL
|| (STREQ (symname
, s
-> filename
)))
401 dump_symtab (objfile
, s
, outfile
);
403 do_cleanups (cleanups
);
407 print_symbol (symbol
, depth
, outfile
)
408 struct symbol
*symbol
;
412 print_spaces (depth
, outfile
);
413 if (SYMBOL_NAMESPACE (symbol
) == LABEL_NAMESPACE
)
415 fprintf (outfile
, "label %s at 0x%x\n", SYMBOL_SOURCE_NAME (symbol
),
416 SYMBOL_VALUE_ADDRESS (symbol
));
419 if (SYMBOL_NAMESPACE (symbol
) == STRUCT_NAMESPACE
)
421 if (TYPE_NAME (SYMBOL_TYPE (symbol
)))
423 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
427 fprintf (outfile
, "%s %s = ",
428 (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_ENUM
430 : (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_STRUCT
431 ? "struct" : "union")),
432 SYMBOL_NAME (symbol
));
433 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
435 fprintf (outfile
, ";\n");
439 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
440 fprintf (outfile
, "typedef ");
441 if (SYMBOL_TYPE (symbol
))
443 /* Print details of types, except for enums where it's clutter. */
444 LA_PRINT_TYPE (SYMBOL_TYPE (symbol
), SYMBOL_NAME (symbol
), outfile
,
445 TYPE_CODE (SYMBOL_TYPE (symbol
)) != TYPE_CODE_ENUM
,
447 fprintf (outfile
, "; ");
450 fprintf (outfile
, "%s ", SYMBOL_SOURCE_NAME (symbol
));
452 switch (SYMBOL_CLASS (symbol
))
455 fprintf (outfile
, "const %ld (0x%lx),",
456 SYMBOL_VALUE (symbol
), SYMBOL_VALUE (symbol
));
459 case LOC_CONST_BYTES
:
460 fprintf (outfile
, "const %u hex bytes:",
461 TYPE_LENGTH (SYMBOL_TYPE (symbol
)));
464 for (i
= 0; i
< TYPE_LENGTH (SYMBOL_TYPE (symbol
)); i
++)
465 fprintf (outfile
, " %2x",
466 (unsigned)SYMBOL_VALUE_BYTES (symbol
) [i
]);
467 fprintf (outfile
, ",");
472 fprintf (outfile
, "static at 0x%x,", SYMBOL_VALUE_ADDRESS (symbol
));
476 fprintf (outfile
, "register %ld,", SYMBOL_VALUE (symbol
));
480 if (SYMBOL_BASEREG_VALID (symbol
))
482 fprintf (outfile
, "arg at 0x%lx from register %d,",
483 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
487 fprintf (outfile
, "arg at 0x%lx,", SYMBOL_VALUE (symbol
));
492 if (SYMBOL_BASEREG_VALID (symbol
))
494 fprintf (outfile
, "arg at offset 0x%lx from register %d,",
495 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
499 fprintf (outfile
, "arg at offset 0x%lx from fp,",
500 SYMBOL_VALUE (symbol
));
504 fprintf (outfile
, "reference arg at 0x%lx,", SYMBOL_VALUE (symbol
));
508 fprintf (outfile
, "parameter register %ld,", SYMBOL_VALUE (symbol
));
512 if (SYMBOL_BASEREG_VALID (symbol
))
514 fprintf (outfile
, "local at 0x%lx from register %d",
515 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
519 fprintf (outfile
, "local at 0x%lx,", SYMBOL_VALUE (symbol
));
527 fprintf (outfile
, "label at 0x%lx", SYMBOL_VALUE_ADDRESS (symbol
));
531 fprintf (outfile
, "block (object 0x%x) starting at 0x%x,",
532 (unsigned int) SYMBOL_BLOCK_VALUE (symbol
),
533 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
)));
537 fprintf (outfile
, "botched symbol class %x", SYMBOL_CLASS (symbol
));
541 fprintf (outfile
, "\n");
545 maintenance_print_psymbols (args
, from_tty
)
551 struct cleanup
*cleanups
;
552 char *symname
= NULL
;
553 char *filename
= DEV_TTY
;
554 struct objfile
*objfile
;
555 struct partial_symtab
*ps
;
561 error ("print-psymbols takes an output file name and optional symbol file name");
563 else if ((argv
= buildargv (args
)) == NULL
)
567 cleanups
= make_cleanup (freeargv
, (char *) argv
);
572 /* If a second arg is supplied, it is a source file name to match on */
579 filename
= tilde_expand (filename
);
580 make_cleanup (free
, filename
);
582 outfile
= fopen (filename
, "w");
584 perror_with_name (filename
);
585 make_cleanup (fclose
, outfile
);
588 ALL_PSYMTABS (objfile
, ps
)
589 if (symname
== NULL
|| (STREQ (symname
, ps
-> filename
)))
590 dump_psymtab (objfile
, ps
, outfile
);
592 do_cleanups (cleanups
);
596 print_partial_symbol (p
, count
, what
, outfile
)
597 struct partial_symbol
*p
;
603 fprintf_filtered (outfile
, " %s partial symbols:\n", what
);
606 fprintf_filtered (outfile
, " `%s'", SYMBOL_NAME(p
));
607 if (SYMBOL_LANGUAGE (p
) == language_cplus
&&
608 SYMBOL_DEMANGLED_NAME (p
) != NULL
)
610 fprintf_filtered (outfile
, " `%s'", SYMBOL_DEMANGLED_NAME (p
));
612 fputs_filtered (", ", outfile
);
613 switch (SYMBOL_NAMESPACE (p
))
615 case UNDEF_NAMESPACE
:
616 fputs_filtered ("undefined namespace, ", outfile
);
619 /* This is the usual thing -- don't print it */
621 case STRUCT_NAMESPACE
:
622 fputs_filtered ("struct namespace, ", outfile
);
624 case LABEL_NAMESPACE
:
625 fputs_filtered ("label namespace, ", outfile
);
628 fputs_filtered ("<invalid namespace>, ", outfile
);
631 switch (SYMBOL_CLASS (p
))
634 fputs_filtered ("undefined", outfile
);
637 fputs_filtered ("constant int", outfile
);
640 fputs_filtered ("static", outfile
);
643 fputs_filtered ("register", outfile
);
646 fputs_filtered ("pass by value", outfile
);
649 fputs_filtered ("pass by reference", outfile
);
652 fputs_filtered ("register parameter", outfile
);
655 fputs_filtered ("stack parameter", outfile
);
658 fputs_filtered ("type", outfile
);
661 fputs_filtered ("label", outfile
);
664 fputs_filtered ("function", outfile
);
666 case LOC_CONST_BYTES
:
667 fputs_filtered ("constant bytes", outfile
);
670 fputs_filtered ("shuffled arg", outfile
);
673 fputs_filtered ("<invalid location>", outfile
);
676 fputs_filtered (", ", outfile
);
677 fprintf_filtered (outfile
, "0x%x\n", SYMBOL_VALUE (p
));
683 maintenance_print_msymbols (args
, from_tty
)
689 struct cleanup
*cleanups
;
690 char *filename
= DEV_TTY
;
691 char *symname
= NULL
;
692 struct objfile
*objfile
;
698 error ("print-msymbols takes an output file name and optional symbol file name");
700 else if ((argv
= buildargv (args
)) == NULL
)
704 cleanups
= make_cleanup (freeargv
, argv
);
709 /* If a second arg is supplied, it is a source file name to match on */
716 filename
= tilde_expand (filename
);
717 make_cleanup (free
, filename
);
719 outfile
= fopen (filename
, "w");
721 perror_with_name (filename
);
722 make_cleanup (fclose
, outfile
);
725 ALL_OBJFILES (objfile
)
726 if (symname
== NULL
|| (STREQ (symname
, objfile
-> name
)))
727 dump_msymbols (objfile
, outfile
);
729 fprintf_filtered (outfile
, "\n\n");
730 do_cleanups (cleanups
);
734 maintenance_print_objfiles (ignore
, from_tty
)
738 struct objfile
*objfile
;
743 ALL_OBJFILES (objfile
)
744 dump_objfile (objfile
);
749 /* Return the nexting depth of a block within other blocks in its symtab. */
756 while ((block
= BLOCK_SUPERBLOCK (block
)) != NULL
)
763 #endif /* MAINTENANCE_CMDS */
766 /* Increase the space allocated for LISTP, which is probably
767 global_psymbol_list or static_psymbol_list. This space will eventually
768 be freed in free_objfile(). */
771 extend_psymbol_list (listp
, objfile
)
772 register struct psymbol_allocation_list
*listp
;
773 struct objfile
*objfile
;
776 if (listp
->size
== 0)
779 listp
->list
= (struct partial_symbol
*)
780 xmmalloc (objfile
-> md
, new_size
* sizeof (struct partial_symbol
));
784 new_size
= listp
->size
* 2;
785 listp
->list
= (struct partial_symbol
*)
786 xmrealloc (objfile
-> md
, (char *) listp
->list
,
787 new_size
* sizeof (struct partial_symbol
));
789 /* Next assumes we only went one over. Should be good if
790 program works correctly */
791 listp
->next
= listp
->list
+ listp
->size
;
792 listp
->size
= new_size
;
This page took 0.045206 seconds and 4 git commands to generate.