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
);
268 /* FIXME, we need to be able to print the relocation stuff. */
269 /* This prints some garbage for anything but stabs right now. FIXME. */
270 fprintf_filtered (outfile
, " Relocate symbols by 0x%x, 0x%x, 0x%x, 0x%x.\n",
271 ANOFFSET (psymtab
->section_offsets
, 0),
272 ANOFFSET (psymtab
->section_offsets
, 1),
273 ANOFFSET (psymtab
->section_offsets
, 2),
274 ANOFFSET (psymtab
->section_offsets
, 3));
276 fprintf_filtered (outfile
, " Symbols cover text addresses 0x%x-0x%x\n",
277 psymtab
-> textlow
, psymtab
-> texthigh
);
278 fprintf_filtered (outfile
, " Depends on %d other partial symtabs.\n",
279 psymtab
-> number_of_dependencies
);
280 if (psymtab
-> n_global_syms
> 0)
282 print_partial_symbol (objfile
-> global_psymbols
.list
283 + psymtab
-> globals_offset
,
284 psymtab
-> n_global_syms
, "Global", outfile
);
286 if (psymtab
-> n_static_syms
> 0)
288 print_partial_symbol (objfile
-> static_psymbols
.list
289 + psymtab
-> statics_offset
,
290 psymtab
-> n_static_syms
, "Static", outfile
);
292 fprintf_filtered (outfile
, "\n");
296 dump_symtab (objfile
, symtab
, outfile
)
297 struct objfile
*objfile
;
298 struct symtab
*symtab
;
303 register struct linetable
*l
;
304 struct blockvector
*bv
;
305 register struct block
*b
;
308 fprintf (outfile
, "\nSymtab for file %s\n", symtab
->filename
);
309 fprintf (outfile
, "Read from object file %s (%x)\n", objfile
->name
,
310 (unsigned int) objfile
);
311 fprintf (outfile
, "Language: %s\n", language_str (symtab
-> language
));
313 /* First print the line table. */
314 l
= LINETABLE (symtab
);
316 fprintf (outfile
, "\nLine table:\n\n");
318 for (i
= 0; i
< len
; i
++)
319 fprintf (outfile
, " line %d at %x\n", l
->item
[i
].line
,
322 /* Now print the block info. */
323 fprintf (outfile
, "\nBlockvector:\n\n");
324 bv
= BLOCKVECTOR (symtab
);
325 len
= BLOCKVECTOR_NBLOCKS (bv
);
326 for (i
= 0; i
< len
; i
++)
328 b
= BLOCKVECTOR_BLOCK (bv
, i
);
329 depth
= block_depth (b
) * 2;
330 print_spaces (depth
, outfile
);
331 fprintf (outfile
, "block #%03d (object 0x%x) ", i
, (unsigned int) b
);
332 fprintf (outfile
, "[0x%x..0x%x]", BLOCK_START (b
), BLOCK_END (b
));
333 if (BLOCK_SUPERBLOCK (b
))
334 fprintf (outfile
, " (under 0x%x)", (unsigned int) BLOCK_SUPERBLOCK (b
));
335 if (BLOCK_FUNCTION (b
))
336 fprintf (outfile
, " %s", SYMBOL_NAME (BLOCK_FUNCTION (b
)));
337 fputc ('\n', outfile
);
338 blen
= BLOCK_NSYMS (b
);
339 for (j
= 0; j
< blen
; j
++)
341 print_symbol (BLOCK_SYM (b
, j
), depth
+ 1, outfile
);
344 fprintf (outfile
, "\n");
348 printsyms_command (args
, from_tty
)
354 struct cleanup
*cleanups
;
355 char *symname
= NULL
;
356 char *filename
= DEV_TTY
;
357 struct objfile
*objfile
;
364 error ("printsyms takes an output file name and optional symbol file name");
366 else if ((argv
= buildargv (args
)) == NULL
)
370 cleanups
= make_cleanup (freeargv
, (char *) argv
);
375 /* If a second arg is supplied, it is a source file name to match on */
382 filename
= tilde_expand (filename
);
383 make_cleanup (free
, filename
);
385 outfile
= fopen (filename
, "w");
387 perror_with_name (filename
);
388 make_cleanup (fclose
, (char *) outfile
);
391 ALL_SYMTABS (objfile
, s
)
392 if (symname
== NULL
|| (strcmp (symname
, s
-> filename
) == 0))
393 dump_symtab (objfile
, s
, outfile
);
395 do_cleanups (cleanups
);
399 print_symbol (symbol
, depth
, outfile
)
400 struct symbol
*symbol
;
404 print_spaces (depth
, outfile
);
405 if (SYMBOL_NAMESPACE (symbol
) == LABEL_NAMESPACE
)
407 fprintf (outfile
, "label %s at 0x%x\n", SYMBOL_NAME (symbol
),
408 SYMBOL_VALUE_ADDRESS (symbol
));
411 if (SYMBOL_NAMESPACE (symbol
) == STRUCT_NAMESPACE
)
413 if (TYPE_NAME (SYMBOL_TYPE (symbol
)))
415 type_print_1 (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
419 fprintf (outfile
, "%s %s = ",
420 (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_ENUM
422 : (TYPE_CODE (SYMBOL_TYPE (symbol
)) == TYPE_CODE_STRUCT
423 ? "struct" : "union")),
424 SYMBOL_NAME (symbol
));
425 type_print_1 (SYMBOL_TYPE (symbol
), "", outfile
, 1, depth
);
427 fprintf (outfile
, ";\n");
431 if (SYMBOL_CLASS (symbol
) == LOC_TYPEDEF
)
432 fprintf (outfile
, "typedef ");
433 if (SYMBOL_TYPE (symbol
))
435 /* Print details of types, except for enums where it's clutter. */
436 type_print_1 (SYMBOL_TYPE (symbol
), SYMBOL_NAME (symbol
), outfile
,
437 TYPE_CODE (SYMBOL_TYPE (symbol
)) != TYPE_CODE_ENUM
,
439 fprintf (outfile
, "; ");
442 fprintf (outfile
, "%s ", SYMBOL_NAME (symbol
));
444 switch (SYMBOL_CLASS (symbol
))
447 fprintf (outfile
, "const %ld (0x%lx),",
448 SYMBOL_VALUE (symbol
), SYMBOL_VALUE (symbol
));
451 case LOC_CONST_BYTES
:
452 fprintf (outfile
, "const %u hex bytes:",
453 TYPE_LENGTH (SYMBOL_TYPE (symbol
)));
456 for (i
= 0; i
< TYPE_LENGTH (SYMBOL_TYPE (symbol
)); i
++)
457 fprintf (outfile
, " %2x",
458 (unsigned)SYMBOL_VALUE_BYTES (symbol
) [i
]);
459 fprintf (outfile
, ",");
464 fprintf (outfile
, "static at 0x%x,", SYMBOL_VALUE_ADDRESS (symbol
));
468 fprintf (outfile
, "register %ld,", SYMBOL_VALUE (symbol
));
472 if (SYMBOL_BASEREG_VALID (symbol
))
474 fprintf (outfile
, "arg at 0x%lx from register %d,",
475 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
479 fprintf (outfile
, "arg at 0x%lx,", SYMBOL_VALUE (symbol
));
484 if (SYMBOL_BASEREG_VALID (symbol
))
486 fprintf (outfile
, "arg at offset 0x%lx from register %d,",
487 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
491 fprintf (outfile
, "arg at offset 0x%lx from fp,",
492 SYMBOL_VALUE (symbol
));
496 fprintf (outfile
, "reference arg at 0x%lx,", SYMBOL_VALUE (symbol
));
500 fprintf (outfile
, "parameter register %ld,", SYMBOL_VALUE (symbol
));
504 if (SYMBOL_BASEREG_VALID (symbol
))
506 fprintf (outfile
, "local at 0x%lx from register %d",
507 SYMBOL_VALUE (symbol
), SYMBOL_BASEREG (symbol
));
511 fprintf (outfile
, "local at 0x%lx,", SYMBOL_VALUE (symbol
));
519 fprintf (outfile
, "label at 0x%lx", SYMBOL_VALUE_ADDRESS (symbol
));
523 fprintf (outfile
, "block (object 0x%x) starting at 0x%x,",
524 (unsigned int) SYMBOL_BLOCK_VALUE (symbol
),
525 BLOCK_START (SYMBOL_BLOCK_VALUE (symbol
)));
529 fprintf (outfile
, "botched symbol class %x", SYMBOL_CLASS (symbol
));
533 fprintf (outfile
, "\n");
537 printpsyms_command (args
, from_tty
)
543 struct cleanup
*cleanups
;
544 char *symname
= NULL
;
545 char *filename
= DEV_TTY
;
546 struct objfile
*objfile
;
547 struct partial_symtab
*ps
;
553 error ("printpsyms takes an output file name and optional symbol file name");
555 else if ((argv
= buildargv (args
)) == NULL
)
559 cleanups
= make_cleanup (freeargv
, (char *) argv
);
564 /* If a second arg is supplied, it is a source file name to match on */
571 filename
= tilde_expand (filename
);
572 make_cleanup (free
, filename
);
574 outfile
= fopen (filename
, "w");
576 perror_with_name (filename
);
577 make_cleanup (fclose
, outfile
);
580 ALL_PSYMTABS (objfile
, ps
)
581 if (symname
== NULL
|| (strcmp (symname
, ps
-> filename
) == 0))
582 dump_psymtab (objfile
, ps
, outfile
);
584 do_cleanups (cleanups
);
588 print_partial_symbol (p
, count
, what
, outfile
)
589 struct partial_symbol
*p
;
595 fprintf_filtered (outfile
, " %s partial symbols:\n", what
);
598 fprintf_filtered (outfile
, " `%s', ", SYMBOL_NAME(p
));
599 switch (SYMBOL_NAMESPACE (p
))
601 case UNDEF_NAMESPACE
:
602 fputs_filtered ("undefined namespace, ", outfile
);
605 /* This is the usual thing -- don't print it */
607 case STRUCT_NAMESPACE
:
608 fputs_filtered ("struct namespace, ", outfile
);
610 case LABEL_NAMESPACE
:
611 fputs_filtered ("label namespace, ", outfile
);
614 fputs_filtered ("<invalid namespace>, ", outfile
);
617 switch (SYMBOL_CLASS (p
))
620 fputs_filtered ("undefined", outfile
);
623 fputs_filtered ("constant int", outfile
);
626 fputs_filtered ("static", outfile
);
629 fputs_filtered ("register", outfile
);
632 fputs_filtered ("pass by value", outfile
);
635 fputs_filtered ("pass by reference", outfile
);
638 fputs_filtered ("register parameter", outfile
);
641 fputs_filtered ("stack parameter", outfile
);
644 fputs_filtered ("type", outfile
);
647 fputs_filtered ("label", outfile
);
650 fputs_filtered ("function", outfile
);
652 case LOC_CONST_BYTES
:
653 fputs_filtered ("constant bytes", outfile
);
656 fputs_filtered ("shuffled arg", outfile
);
659 fputs_filtered ("<invalid location>", outfile
);
662 fputs_filtered (", ", outfile
);
663 fprintf_filtered (outfile
, "0x%x\n", SYMBOL_VALUE (p
));
669 printmsyms_command (args
, from_tty
)
675 struct cleanup
*cleanups
;
676 char *filename
= DEV_TTY
;
677 char *symname
= NULL
;
678 struct objfile
*objfile
;
684 error ("printmsyms takes an output file name and optional symbol file name");
686 else if ((argv
= buildargv (args
)) == NULL
)
690 cleanups
= make_cleanup (freeargv
, argv
);
695 /* If a second arg is supplied, it is a source file name to match on */
702 filename
= tilde_expand (filename
);
703 make_cleanup (free
, filename
);
705 outfile
= fopen (filename
, "w");
707 perror_with_name (filename
);
708 make_cleanup (fclose
, outfile
);
711 ALL_OBJFILES (objfile
)
712 if (symname
== NULL
|| (strcmp (symname
, objfile
-> name
) == 0))
713 dump_msymbols (objfile
, outfile
);
715 fprintf_filtered (outfile
, "\n\n");
716 do_cleanups (cleanups
);
720 printobjfiles_command (ignore
, from_tty
)
724 struct objfile
*objfile
;
729 ALL_OBJFILES (objfile
)
730 dump_objfile (objfile
);
734 /* Return the nexting depth of a block within other blocks in its symtab. */
741 while (block
= BLOCK_SUPERBLOCK (block
)) i
++;
746 /* Increase the space allocated for LISTP, which is probably
747 global_psymbol_list or static_psymbol_list. This space will eventually
748 be freed in free_objfile(). */
751 extend_psymbol_list (listp
, objfile
)
752 register struct psymbol_allocation_list
*listp
;
753 struct objfile
*objfile
;
756 if (listp
->size
== 0)
759 listp
->list
= (struct partial_symbol
*)
760 xmmalloc (objfile
-> md
, new_size
* sizeof (struct partial_symbol
));
764 new_size
= listp
->size
* 2;
765 listp
->list
= (struct partial_symbol
*)
766 xmrealloc (objfile
-> md
, (char *) listp
->list
,
767 new_size
* sizeof (struct partial_symbol
));
769 /* Next assumes we only went one over. Should be good if
770 program works correctly */
771 listp
->next
= listp
->list
+ listp
->size
;
772 listp
->size
= new_size
;
777 /* The work performed by this function is normally done by the macro
778 ADD_PSYMBOL_TO_LIST defined in symfile.h. When debugging gdb, this
779 function makes things easier. */
782 add_psymbol_to_list (name
, namelength
, namespace, class, listp
, psymval
)
785 enum namespace namespace;
786 enum address_class
class;
787 struct psymbol_allocation_list
*listp
;
788 unsigned long psymval
;
790 register struct partial_symbol
*psym
;
792 if (listp
-> next
>= listp
-> list
+ listp
-> size
)
793 extend_psymbol_list (listp
, objfile
);
794 psym
= listp
-> next
++;
795 SYMBOL_NAME (psym
) = (char *) obstack_alloc (&objfile
->psymbol_obstack
,
797 memcpy (SYMBOL_NAME (psym
), name
, namelength
);
798 SYMBOL_NAME (psym
)[namelength
] = '\0';
799 SYMBOL_NAMESPACE (psym
) = namespace;
800 SYMBOL_CLASS (psym
) = class;
801 SYMBOL_VALUE (psym
) = psymval
;
804 /* The work performed by this function is normally done by the macro
805 ADD_PSYMBOL_ADDR_TO_LIST defined in symfile.h. When debugging gdb, this
806 function makes things easier. */
809 add_psymbol_addr_to_list (name
, namelength
, namespace, class, listp
, psymval
)
812 enum namespace namespace;
813 enum address_class
class;
814 struct psymbol_allocation_list
*listp
;
817 register struct partial_symbol
*psym
;
819 if (listp
-> next
>= listp
-> list
+ listp
-> size
)
820 extend_psymbol_list (listp
, objfile
);
821 psym
= listp
-> next
++;
822 SYMBOL_NAME (psym
) = (char *) obstack_alloc (&objfile
->psymbol_obstack
,
824 memcpy (SYMBOL_NAME (psym
), name
, namelength
);
825 SYMBOL_NAME (psym
)[namelength
] = '\0';
826 SYMBOL_NAMESPACE (psym
) = namespace;
827 SYMBOL_CLASS (psym
) = class;
828 SYMBOL_VALUE_ADDRESS (psym
) = psymval
;
834 _initialize_symmisc ()
836 add_com ("printmsyms", class_obscure
, printmsyms_command
,
837 "Print dump of current minimal symbol definitions to file OUTFILE.\n\
838 If a SOURCE file is specified, dump only that file's symbols.");
839 add_com ("printpsyms", class_obscure
, printpsyms_command
,
840 "Print dump of current partial symbol definitions to file OUTFILE.\n\
841 If a SOURCE file is specified, dump only that file's partial symbols.");
842 add_com ("printsyms", class_obscure
, printsyms_command
,
843 "Print dump of current symbol definitions to file OUTFILE.\n\
844 If a SOURCE file is specified, dump only that file's symbols.");
845 add_com ("printobjfiles", class_obscure
, printobjfiles_command
,
846 "Print dump of current object file definitions.");
This page took 0.070398 seconds and 4 git commands to generate.