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 printobjfiles_command
PARAMS ((char *, int));
62 block_depth
PARAMS ((struct block
*));
65 print_partial_symbol
PARAMS ((struct partial_symbol
*, int, char *, FILE *));
68 printpsyms_command
PARAMS ((char *, int));
71 print_symbol
PARAMS ((struct symbol
*, int, FILE *));
74 printsyms_command
PARAMS ((char *, int));
77 free_symtab_block
PARAMS ((struct objfile
*, struct block
*));
80 printmsyms_command
PARAMS ((char *, int));
82 /* Free a struct block <- B and all the symbols defined in that block. */
85 free_symtab_block (objfile
, b
)
86 struct objfile
*objfile
;
91 for (i
= 0; i
< n
; i
++)
93 mfree (objfile
-> md
, SYMBOL_NAME (BLOCK_SYM (b
, i
)));
94 mfree (objfile
-> md
, (PTR
) BLOCK_SYM (b
, i
));
96 mfree (objfile
-> md
, (PTR
) b
);
99 /* Free all the storage associated with the struct symtab <- S.
100 Note that some symtabs have contents malloc'ed structure by structure,
101 while some have contents that all live inside one big block of memory,
102 and some share the contents of another symbol table and so you should
103 not free the contents on their behalf (except sometimes the linetable,
104 which maybe per symtab even when the rest is not).
105 It is s->free_code that says which alternative to use. */
109 register struct symtab
*s
;
112 register struct blockvector
*bv
;
114 switch (s
->free_code
)
117 /* All the contents are part of a big block of memory (an obstack),
118 and some other symtab is in charge of freeing that block.
119 Therefore, do nothing. */
123 /* Here all the contents were malloc'ed structure by structure
124 and must be freed that way. */
125 /* First free the blocks (and their symbols. */
126 bv
= BLOCKVECTOR (s
);
127 n
= BLOCKVECTOR_NBLOCKS (bv
);
128 for (i
= 0; i
< n
; i
++)
129 free_symtab_block (s
-> objfile
, BLOCKVECTOR_BLOCK (bv
, i
));
130 /* Free the blockvector itself. */
131 mfree (s
-> objfile
-> md
, (PTR
) bv
);
132 /* Also free the linetable. */
135 /* Everything will be freed either by our `free_ptr'
136 or by some other symtab, except for our linetable.
139 mfree (s
-> objfile
-> md
, (PTR
) LINETABLE (s
));
143 /* If there is a single block of memory to free, free it. */
144 if (s
-> free_ptr
!= NULL
)
145 mfree (s
-> objfile
-> md
, s
-> free_ptr
);
147 /* Free source-related stuff */
148 if (s
-> line_charpos
!= NULL
)
149 mfree (s
-> objfile
-> md
, (PTR
) s
-> line_charpos
);
150 if (s
-> fullname
!= NULL
)
151 mfree (s
-> objfile
-> md
, s
-> fullname
);
152 mfree (s
-> objfile
-> md
, (PTR
) s
);
156 dump_objfile (objfile
)
157 struct objfile
*objfile
;
159 struct symtab
*symtab
;
160 struct partial_symtab
*psymtab
;
162 printf_filtered ("\nObject file %s: ", objfile
-> name
);
163 printf_filtered ("Objfile at %x, bfd at %x, %d minsyms\n\n",
164 objfile
, objfile
-> obfd
, objfile
->minimal_symbol_count
);
166 if (objfile
-> psymtabs
)
168 printf_filtered ("Psymtabs:\n");
169 for (psymtab
= objfile
-> psymtabs
;
171 psymtab
= psymtab
-> next
)
173 printf_filtered ("%s at %x, ", psymtab
-> filename
, psymtab
);
174 if (psymtab
-> objfile
!= objfile
)
176 printf_filtered ("NOT ON CHAIN! ");
180 printf_filtered ("\n\n");
183 if (objfile
-> symtabs
)
185 printf_filtered ("Symtabs:\n");
186 for (symtab
= objfile
-> symtabs
;
188 symtab
= symtab
->next
)
190 printf_filtered ("%s at %x, ", symtab
-> filename
, symtab
);
191 if (symtab
-> objfile
!= objfile
)
193 printf_filtered ("NOT ON CHAIN! ");
197 printf_filtered ("\n\n");
201 /* Print minimal symbols from this objfile. */
204 dump_msymbols (objfile
, outfile
)
205 struct objfile
*objfile
;
208 struct minimal_symbol
*msymbol
;
212 fprintf_filtered (outfile
, "\nObject file %s:\n\n", objfile
-> name
);
213 for (index
= 0, msymbol
= objfile
-> msymbols
;
214 msymbol
-> name
!= NULL
; msymbol
++, index
++)
216 switch (msymbol
-> type
)
237 fprintf_filtered (outfile
, "[%2d] %c %#10x %s\n", index
, ms_type
,
238 msymbol
-> address
, msymbol
-> name
);
240 if (objfile
-> minimal_symbol_count
!= index
)
242 warning ("internal error: minimal symbol count %d != %d",
243 objfile
-> minimal_symbol_count
, index
);
245 fprintf_filtered (outfile
, "\n");
249 dump_psymtab (objfile
, psymtab
, outfile
)
250 struct objfile
*objfile
;
251 struct partial_symtab
*psymtab
;
255 fprintf_filtered (outfile
, "\nPartial symtab for source file %s ",
256 psymtab
-> filename
);
257 fprintf_filtered (outfile
, "(object 0x%x)\n\n", psymtab
);
258 fprintf (outfile
, " Read from object file %s (0x%x)\n",
259 objfile
-> name
, (unsigned int) objfile
);
261 if (psymtab
-> readin
)
263 fprintf_filtered (outfile
,
264 " Full symtab was read (at 0x%x by function at 0x%x)\n",
265 psymtab
-> symtab
, psymtab
-> read_symtab
);
267 fprintf_filtered (outfile
, " Relocate symbols by 0x%x\n",
269 fprintf_filtered (outfile
, " Symbols cover text addresses 0x%x-0x%x\n",
270 psymtab
-> textlow
, psymtab
-> texthigh
);
271 fprintf_filtered (outfile
, " Depends on %d other partial symtabs.\n",
272 psymtab
-> number_of_dependencies
);
273 if (psymtab
-> n_global_syms
> 0)
275 print_partial_symbol (objfile
-> global_psymbols
.list
276 + psymtab
-> globals_offset
,
277 psymtab
-> n_global_syms
, "Global", outfile
);
279 if (psymtab
-> n_static_syms
> 0)
281 print_partial_symbol (objfile
-> static_psymbols
.list
282 + psymtab
-> statics_offset
,
283 psymtab
-> n_static_syms
, "Static", outfile
);
285 fprintf_filtered (outfile
, "\n");
289 dump_symtab (objfile
, symtab
, outfile
)
290 struct objfile
*objfile
;
291 struct symtab
*symtab
;
296 register struct linetable
*l
;
297 struct blockvector
*bv
;
298 register struct block
*b
;
301 fprintf (outfile
, "\nSymtab for file %s\n", symtab
->filename
);
302 fprintf (outfile
, "Read from object file %s (%x)\n", objfile
->name
,
303 (unsigned int) objfile
);
304 fprintf (outfile
, "Language: %s\n", language_str (symtab
-> language
));
306 /* First print the line table. */
307 l
= LINETABLE (symtab
);
309 fprintf (outfile
, "\nLine table:\n\n");
311 for (i
= 0; i
< len
; i
++)
312 fprintf (outfile
, " line %d at %x\n", l
->item
[i
].line
,
315 /* Now print the block info. */
316 fprintf (outfile
, "\nBlockvector:\n\n");
317 bv
= BLOCKVECTOR (symtab
);
318 len
= BLOCKVECTOR_NBLOCKS (bv
);
319 for (i
= 0; i
< len
; i
++)
321 b
= BLOCKVECTOR_BLOCK (bv
, i
);
322 depth
= block_depth (b
) * 2;
323 print_spaces (depth
, outfile
);
324 fprintf (outfile
, "block #%03d (object 0x%x) ", i
, (unsigned int) b
);
325 fprintf (outfile
, "[0x%x..0x%x]", BLOCK_START (b
), BLOCK_END (b
));
326 if (BLOCK_SUPERBLOCK (b
))
327 fprintf (outfile
, " (under 0x%x)", (unsigned int) BLOCK_SUPERBLOCK (b
));
328 if (BLOCK_FUNCTION (b
))
329 fprintf (outfile
, " %s", SYMBOL_NAME (BLOCK_FUNCTION (b
)));
330 fputc ('\n', outfile
);
331 blen
= BLOCK_NSYMS (b
);
332 for (j
= 0; j
< blen
; j
++)
334 print_symbol (BLOCK_SYM (b
, j
), depth
+ 1, outfile
);
337 fprintf (outfile
, "\n");
341 printsyms_command (args
, from_tty
)
347 struct cleanup
*cleanups
;
348 char *symname
= NULL
;
349 char *filename
= DEV_TTY
;
350 struct objfile
*objfile
;
357 error ("printsyms takes an output file name and optional symbol file name");
359 else if ((argv
= buildargv (args
)) == NULL
)
363 cleanups
= make_cleanup (freeargv
, (char *) argv
);
368 /* If a second arg is supplied, it is a source file name to match on */
375 filename
= tilde_expand (filename
);
376 make_cleanup (free
, filename
);
378 outfile
= fopen (filename
, "w");
380 perror_with_name (filename
);
381 make_cleanup (fclose
, (char *) outfile
);
384 ALL_SYMTABS (objfile
, s
)
385 if (symname
== NULL
|| (strcmp (symname
, s
-> filename
) == 0))
386 dump_symtab (objfile
, s
, outfile
);
388 do_cleanups (cleanups
);
392 print_symbol (symbol
, depth
, outfile
)
393 struct symbol
*symbol
;
397 print_spaces (depth
, outfile
);
398 if (SYMBOL_NAMESPACE (symbol
) == LABEL_NAMESPACE
)
400 fprintf (outfile
, "label %s at 0x%x\n", SYMBOL_NAME (symbol
),
401 SYMBOL_VALUE_ADDRESS (symbol
));
404 if (SYMBOL_NAMESPACE (symbol
) == STRUCT_NAMESPACE
)
406 if (TYPE_NAME (SYMBOL_TYPE (symbol
)))
408 type_print_1 (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
412 fprintf (outfile
, "%s %s = ",
413 (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_ENUM
415 : (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_STRUCT
416 ? "struct" : "union")),
417 SYMBOL_NAME (symbol
));
418 type_print_1 (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
420 fprintf (outfile
, ";\n");
424 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
425 fprintf (outfile
, "typedef ");
426 if (SYMBOL_TYPE (symbol
))
428 /* Print details of types, except for enums where it's clutter. */
429 type_print_1 (SYMBOL_TYPE (symbol
), SYMBOL_NAME (symbol
), outfile
,
430 TYPE_CODE (SYMBOL_TYPE (symbol
)) != TYPE_CODE_ENUM
,
432 fprintf (outfile
, "; ");
435 fprintf (outfile
, "%s ", SYMBOL_NAME (symbol
));
437 switch (SYMBOL_CLASS (symbol
))
440 fprintf (outfile
, "const %ld (0x%lx),",
441 SYMBOL_VALUE (symbol
), SYMBOL_VALUE (symbol
));
444 case LOC_CONST_BYTES
:
445 fprintf (outfile
, "const %u hex bytes:",
446 TYPE_LENGTH (SYMBOL_TYPE (symbol
)));
449 for (i
= 0; i
< TYPE_LENGTH (SYMBOL_TYPE (symbol
)); i
++)
450 fprintf (outfile
, " %2x",
451 (unsigned)SYMBOL_VALUE_BYTES (symbol
) [i
]);
452 fprintf (outfile
, ",");
457 fprintf (outfile
, "static at 0x%x,", SYMBOL_VALUE_ADDRESS (symbol
));
461 fprintf (outfile
, "register %ld,", SYMBOL_VALUE (symbol
));
465 if (SYMBOL_BASEREG_VALID (symbol
))
467 fprintf (outfile
, "arg at 0x%lx from register %d,",
468 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
472 fprintf (outfile
, "arg at 0x%lx,", SYMBOL_VALUE (symbol
));
477 if (SYMBOL_BASEREG_VALID (symbol
))
479 fprintf (outfile
, "arg at offset 0x%lx from register %d,",
480 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
484 fprintf (outfile
, "arg at offset 0x%lx from fp,",
485 SYMBOL_VALUE (symbol
));
489 fprintf (outfile
, "reference arg at 0x%lx,", SYMBOL_VALUE (symbol
));
493 fprintf (outfile
, "parameter register %ld,", SYMBOL_VALUE (symbol
));
497 if (SYMBOL_BASEREG_VALID (symbol
))
499 fprintf (outfile
, "local at 0x%lx from register %d",
500 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
504 fprintf (outfile
, "local at 0x%lx,", SYMBOL_VALUE (symbol
));
512 fprintf (outfile
, "label at 0x%lx", SYMBOL_VALUE_ADDRESS (symbol
));
516 fprintf (outfile
, "block (object 0x%x) starting at 0x%x,",
517 (unsigned int) SYMBOL_BLOCK_VALUE (symbol
),
518 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
)));
522 fprintf (outfile
, "botched symbol class %x", SYMBOL_CLASS (symbol
));
526 fprintf (outfile
, "\n");
530 printpsyms_command (args
, from_tty
)
536 struct cleanup
*cleanups
;
537 char *symname
= NULL
;
538 char *filename
= DEV_TTY
;
539 struct objfile
*objfile
;
540 struct partial_symtab
*ps
;
546 error ("printpsyms takes an output file name and optional symbol file name");
548 else if ((argv
= buildargv (args
)) == NULL
)
552 cleanups
= make_cleanup (freeargv
, (char *) argv
);
557 /* If a second arg is supplied, it is a source file name to match on */
564 filename
= tilde_expand (filename
);
565 make_cleanup (free
, filename
);
567 outfile
= fopen (filename
, "w");
569 perror_with_name (filename
);
570 make_cleanup (fclose
, outfile
);
573 ALL_PSYMTABS (objfile
, ps
)
574 if (symname
== NULL
|| (strcmp (symname
, ps
-> filename
) == 0))
575 dump_psymtab (objfile
, ps
, outfile
);
577 do_cleanups (cleanups
);
581 print_partial_symbol (p
, count
, what
, outfile
)
582 struct partial_symbol
*p
;
588 fprintf_filtered (outfile
, " %s partial symbols:\n", what
);
591 fprintf_filtered (outfile
, " `%s', ", SYMBOL_NAME(p
));
592 switch (SYMBOL_NAMESPACE (p
))
594 case UNDEF_NAMESPACE
:
595 fputs_filtered ("undefined namespace, ", outfile
);
598 /* This is the usual thing -- don't print it */
600 case STRUCT_NAMESPACE
:
601 fputs_filtered ("struct namespace, ", outfile
);
603 case LABEL_NAMESPACE
:
604 fputs_filtered ("label namespace, ", outfile
);
607 fputs_filtered ("<invalid namespace>, ", outfile
);
610 switch (SYMBOL_CLASS (p
))
613 fputs_filtered ("undefined", outfile
);
616 fputs_filtered ("constant int", outfile
);
619 fputs_filtered ("static", outfile
);
622 fputs_filtered ("register", outfile
);
625 fputs_filtered ("pass by value", outfile
);
628 fputs_filtered ("pass by reference", outfile
);
631 fputs_filtered ("register parameter", outfile
);
634 fputs_filtered ("stack parameter", outfile
);
637 fputs_filtered ("type", outfile
);
640 fputs_filtered ("label", outfile
);
643 fputs_filtered ("function", outfile
);
645 case LOC_CONST_BYTES
:
646 fputs_filtered ("constant bytes", outfile
);
649 fputs_filtered ("shuffled arg", outfile
);
652 fputs_filtered ("<invalid location>", outfile
);
655 fputs_filtered (", ", outfile
);
656 fprintf_filtered (outfile
, "0x%x\n", SYMBOL_VALUE (p
));
662 printmsyms_command (args
, from_tty
)
668 struct cleanup
*cleanups
;
669 char *filename
= DEV_TTY
;
670 char *symname
= NULL
;
671 struct objfile
*objfile
;
677 error ("printmsyms takes an output file name and optional symbol file name");
679 else if ((argv
= buildargv (args
)) == NULL
)
683 cleanups
= make_cleanup (freeargv
, argv
);
688 /* If a second arg is supplied, it is a source file name to match on */
695 filename
= tilde_expand (filename
);
696 make_cleanup (free
, filename
);
698 outfile
= fopen (filename
, "w");
700 perror_with_name (filename
);
701 make_cleanup (fclose
, outfile
);
704 ALL_OBJFILES (objfile
)
705 if (symname
== NULL
|| (strcmp (symname
, objfile
-> name
) == 0))
706 dump_msymbols (objfile
, outfile
);
708 fprintf_filtered (outfile
, "\n\n");
709 do_cleanups (cleanups
);
713 printobjfiles_command (ignore
, from_tty
)
717 struct objfile
*objfile
;
722 ALL_OBJFILES (objfile
)
723 dump_objfile (objfile
);
727 /* Return the nexting depth of a block within other blocks in its symtab. */
734 while (block
= BLOCK_SUPERBLOCK (block
)) i
++;
739 /* Increase the space allocated for LISTP, which is probably
740 global_psymbol_list or static_psymbol_list. This space will eventually
741 be freed in free_objfile(). */
744 extend_psymbol_list (listp
, objfile
)
745 register struct psymbol_allocation_list
*listp
;
746 struct objfile
*objfile
;
749 if (listp
->size
== 0)
752 listp
->list
= (struct partial_symbol
*)
753 xmmalloc (objfile
-> md
, new_size
* sizeof (struct partial_symbol
));
757 new_size
= listp
->size
* 2;
758 listp
->list
= (struct partial_symbol
*)
759 xmrealloc (objfile
-> md
, (char *) listp
->list
,
760 new_size
* sizeof (struct partial_symbol
));
762 /* Next assumes we only went one over. Should be good if
763 program works correctly */
764 listp
->next
= listp
->list
+ listp
->size
;
765 listp
->size
= new_size
;
770 /* The work performed by this function is normally done by the macro
771 ADD_PSYMBOL_TO_LIST defined in symfile.h. When debugging gdb, this
772 function makes things easier. */
775 add_psymbol_to_list (name
, namelength
, namespace, class, listp
, psymval
)
778 enum namespace namespace;
779 enum address_class
class;
780 struct psymbol_allocation_list
*listp
;
781 unsigned long psymval
;
783 register struct partial_symbol
*psym
;
785 if (listp
-> next
>= listp
-> list
+ listp
-> size
)
786 extend_psymbol_list (listp
, objfile
);
787 psym
= listp
-> next
++;
788 SYMBOL_NAME (psym
) = (char *) obstack_alloc (&objfile
->psymbol_obstack
,
790 memcpy (SYMBOL_NAME (psym
), name
, namelength
);
791 SYMBOL_NAME (psym
)[namelength
] = '\0';
792 SYMBOL_NAMESPACE (psym
) = namespace;
793 SYMBOL_CLASS (psym
) = class;
794 SYMBOL_VALUE (psym
) = psymval
;
797 /* The work performed by this function is normally done by the macro
798 ADD_PSYMBOL_ADDR_TO_LIST defined in symfile.h. When debugging gdb, this
799 function makes things easier. */
802 add_psymbol_addr_to_list (name
, namelength
, namespace, class, listp
, psymval
)
805 enum namespace namespace;
806 enum address_class
class;
807 struct psymbol_allocation_list
*listp
;
810 register struct partial_symbol
*psym
;
812 if (listp
-> next
>= listp
-> list
+ listp
-> size
)
813 extend_psymbol_list (listp
, objfile
);
814 psym
= listp
-> next
++;
815 SYMBOL_NAME (psym
) = (char *) obstack_alloc (&objfile
->psymbol_obstack
,
817 memcpy (SYMBOL_NAME (psym
), name
, namelength
);
818 SYMBOL_NAME (psym
)[namelength
] = '\0';
819 SYMBOL_NAMESPACE (psym
) = namespace;
820 SYMBOL_CLASS (psym
) = class;
821 SYMBOL_VALUE_ADDRESS (psym
) = psymval
;
827 _initialize_symmisc ()
829 add_com ("printmsyms", class_obscure
, printmsyms_command
,
830 "Print dump of current minimal symbol definitions to file OUTFILE.\n\
831 If a SOURCE file is specified, dump only that file's symbols.");
832 add_com ("printpsyms", class_obscure
, printpsyms_command
,
833 "Print dump of current partial symbol definitions to file OUTFILE.\n\
834 If a SOURCE file is specified, dump only that file's partial symbols.");
835 add_com ("printsyms", class_obscure
, printsyms_command
,
836 "Print dump of current symbol definitions to file OUTFILE.\n\
837 If a SOURCE file is specified, dump only that file's symbols.");
838 add_com ("printobjfiles", class_obscure
, printobjfiles_command
,
839 "Print dump of current object file definitions.");