X-Git-Url: http://drtracing.org/?a=blobdiff_plain;ds=sidebyside;f=gdb%2Fsymmisc.c;h=c3cd7ab00f1b6532eb6a669972de921476ea52e2;hb=de4f826b0f698dc2858f6eda71f2613a89579c50;hp=198b2d632eca8a981721a23fce670595483b8e8f;hpb=2ee563b53258d390d7446e90a67f465d504ae44c;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/symmisc.c b/gdb/symmisc.c index 198b2d632e..c3cd7ab00f 100644 --- a/gdb/symmisc.c +++ b/gdb/symmisc.c @@ -1,8 +1,8 @@ /* Do various things to symbol tables (other than lookup), for GDB. Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, - 1995, 1996, 1997, 1998, 1999, 2000, 2002 Free Software Foundation, - Inc. + 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003 Free Software + Foundation, Inc. This file is part of GDB. @@ -32,8 +32,12 @@ #include "gdb_obstack.h" #include "language.h" #include "bcache.h" +#include "block.h" +#include "gdb_regex.h" +#include "dictionary.h" #include "gdb_string.h" +#include #ifndef DEV_TTY #define DEV_TTY "/dev/tty" @@ -77,30 +81,30 @@ struct print_symbol_args struct ui_file *outfile; }; -static int print_symbol (PTR); +static int print_symbol (void *); static void free_symtab_block (struct objfile *, struct block *); /* Free a struct block <- B and all the symbols defined in that block. */ +/* FIXME: carlton/2003-04-28: I don't believe this is currently ever + used. */ + static void free_symtab_block (struct objfile *objfile, struct block *b) { - register int i, n; - struct symbol *sym, *next_sym; + struct dict_iterator iter; + struct symbol *sym; - n = BLOCK_BUCKETS (b); - for (i = 0; i < n; i++) + ALL_BLOCK_SYMBOLS (b, iter, sym) { - for (sym = BLOCK_BUCKET (b, i); sym; sym = next_sym) - { - next_sym = sym->hash_next; - xmfree (objfile->md, SYMBOL_NAME (sym)); - xmfree (objfile->md, (PTR) sym); - } + xmfree (objfile->md, DEPRECATED_SYMBOL_NAME (sym)); + xmfree (objfile->md, sym); } - xmfree (objfile->md, (PTR) b); + + dict_free (BLOCK_DICT (b)); + xmfree (objfile->md, b); } /* Free all the storage associated with the struct symtab <- S. @@ -134,30 +138,30 @@ free_symtab (register struct symtab *s) for (i = 0; i < n; i++) free_symtab_block (s->objfile, BLOCKVECTOR_BLOCK (bv, i)); /* Free the blockvector itself. */ - xmfree (s->objfile->md, (PTR) bv); + xmfree (s->objfile->md, bv); /* Also free the linetable. */ case free_linetable: - /* Everything will be freed either by our `free_ptr' + /* Everything will be freed either by our `free_func' or by some other symtab, except for our linetable. Free that now. */ if (LINETABLE (s)) - xmfree (s->objfile->md, (PTR) LINETABLE (s)); + xmfree (s->objfile->md, LINETABLE (s)); break; } /* If there is a single block of memory to free, free it. */ - if (s->free_ptr != NULL) - xmfree (s->objfile->md, s->free_ptr); + if (s->free_func != NULL) + s->free_func (s); /* Free source-related stuff */ if (s->line_charpos != NULL) - xmfree (s->objfile->md, (PTR) s->line_charpos); + xmfree (s->objfile->md, s->line_charpos); if (s->fullname != NULL) xmfree (s->objfile->md, s->fullname); if (s->debugformat != NULL) xmfree (s->objfile->md, s->debugformat); - xmfree (s->objfile->md, (PTR) s); + xmfree (s->objfile->md, s); } void @@ -178,6 +182,9 @@ void print_objfile_statistics (void) { struct objfile *objfile; + struct symtab *s; + struct partial_symtab *ps; + int i, linetables, blockvectors; immediate_quit++; ALL_OBJFILES (objfile) @@ -198,6 +205,28 @@ print_objfile_statistics (void) if (OBJSTAT (objfile, n_types) > 0) printf_filtered (" Number of \"types\" defined: %d\n", OBJSTAT (objfile, n_types)); + i = 0; + ALL_OBJFILE_PSYMTABS (objfile, ps) + { + if (ps->readin == 0) + i++; + } + printf_filtered (" Number of psym tables (not yet expanded): %d\n", i); + i = linetables = blockvectors = 0; + ALL_OBJFILE_SYMTABS (objfile, s) + { + i++; + if (s->linetable != NULL) + linetables++; + if (s->primary == 1) + blockvectors++; + } + printf_filtered (" Number of symbol tables: %d\n", i); + printf_filtered (" Number of symbol tables with line tables: %d\n", + linetables); + printf_filtered (" Number of symbol tables with blockvectors: %d\n", + blockvectors); + if (OBJSTAT (objfile, sz_strtab) > 0) printf_filtered (" Space used by a.out string tables: %d\n", OBJSTAT (objfile, sz_strtab)); @@ -285,7 +314,7 @@ dump_msymbols (struct objfile *objfile, struct ui_file *outfile) return; } for (index = 0, msymbol = objfile->msymbols; - SYMBOL_NAME (msymbol) != NULL; msymbol++, index++) + DEPRECATED_SYMBOL_NAME (msymbol) != NULL; msymbol++, index++) { switch (msymbol->type) { @@ -322,7 +351,7 @@ dump_msymbols (struct objfile *objfile, struct ui_file *outfile) } fprintf_filtered (outfile, "[%2d] %c ", index, ms_type); print_address_numeric (SYMBOL_VALUE_ADDRESS (msymbol), 1, outfile); - fprintf_filtered (outfile, " %s", SYMBOL_NAME (msymbol)); + fprintf_filtered (outfile, " %s", DEPRECATED_SYMBOL_NAME (msymbol)); if (SYMBOL_BFD_SECTION (msymbol)) fprintf_filtered (outfile, " section %s", bfd_section_name (objfile->obfd, @@ -367,7 +396,7 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab, " Full symtab was read (at "); gdb_print_host_address (psymtab->symtab, outfile); fprintf_filtered (outfile, " by function at "); - gdb_print_host_address ((PTR) psymtab->read_symtab, outfile); + gdb_print_host_address (psymtab->read_symtab, outfile); fprintf_filtered (outfile, ")\n"); } @@ -416,12 +445,13 @@ static void dump_symtab (struct objfile *objfile, struct symtab *symtab, struct ui_file *outfile) { - register int i, j; + int i; + struct dict_iterator iter; int len, blen; - register struct linetable *l; + struct linetable *l; struct blockvector *bv; struct symbol *sym; - register struct block *b; + struct block *b; int depth; fprintf_filtered (outfile, "\nSymtab for file %s\n", symtab->filename); @@ -468,17 +498,14 @@ dump_symtab (struct objfile *objfile, struct symtab *symtab, /* drow/2002-07-10: We could save the total symbols count even if we're using a hashtable, but nothing else but this message wants it. */ - blen = BLOCK_BUCKETS (b); - if (BLOCK_HASHTABLE (b)) - fprintf_filtered (outfile, ", %d buckets in ", blen); - else - fprintf_filtered (outfile, ", %d syms in ", blen); + fprintf_filtered (outfile, ", %d syms/buckets in ", + dict_size (BLOCK_DICT (b))); print_address_numeric (BLOCK_START (b), 1, outfile); fprintf_filtered (outfile, ".."); print_address_numeric (BLOCK_END (b), 1, outfile); if (BLOCK_FUNCTION (b)) { - fprintf_filtered (outfile, ", function %s", SYMBOL_NAME (BLOCK_FUNCTION (b))); + fprintf_filtered (outfile, ", function %s", DEPRECATED_SYMBOL_NAME (BLOCK_FUNCTION (b))); if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)) != NULL) { fprintf_filtered (outfile, ", %s", @@ -490,7 +517,7 @@ dump_symtab (struct objfile *objfile, struct symtab *symtab, fprintf_filtered (outfile, "\n"); /* Now print each symbol in this block (in no particular order, if we're using a hashtable). */ - ALL_BLOCK_SYMBOLS (b, j, sym) + ALL_BLOCK_SYMBOLS (b, iter, sym) { struct print_symbol_args s; s.symbol = sym; @@ -564,16 +591,16 @@ Arguments missing: an output file name and an optional symbol file name"); 1 for success. */ static int -print_symbol (PTR args) +print_symbol (void *args) { struct symbol *symbol = ((struct print_symbol_args *) args)->symbol; int depth = ((struct print_symbol_args *) args)->depth; struct ui_file *outfile = ((struct print_symbol_args *) args)->outfile; print_spaces (depth, outfile); - if (SYMBOL_NAMESPACE (symbol) == LABEL_NAMESPACE) + if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN) { - fprintf_filtered (outfile, "label %s at ", SYMBOL_SOURCE_NAME (symbol)); + fprintf_filtered (outfile, "label %s at ", SYMBOL_PRINT_NAME (symbol)); print_address_numeric (SYMBOL_VALUE_ADDRESS (symbol), 1, outfile); if (SYMBOL_BFD_SECTION (symbol)) fprintf_filtered (outfile, " section %s\n", @@ -583,7 +610,7 @@ print_symbol (PTR args) fprintf_filtered (outfile, "\n"); return 1; } - if (SYMBOL_NAMESPACE (symbol) == STRUCT_NAMESPACE) + if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN) { if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol))) { @@ -596,7 +623,7 @@ print_symbol (PTR args) ? "enum" : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT ? "struct" : "union")), - SYMBOL_NAME (symbol)); + DEPRECATED_SYMBOL_NAME (symbol)); LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth); } fprintf_filtered (outfile, ";\n"); @@ -608,14 +635,14 @@ print_symbol (PTR args) if (SYMBOL_TYPE (symbol)) { /* Print details of types, except for enums where it's clutter. */ - LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_SOURCE_NAME (symbol), + LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol), outfile, TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM, depth); fprintf_filtered (outfile, "; "); } else - fprintf_filtered (outfile, "%s ", SYMBOL_SOURCE_NAME (symbol)); + fprintf_filtered (outfile, "%s ", SYMBOL_PRINT_NAME (symbol)); switch (SYMBOL_CLASS (symbol)) { @@ -725,6 +752,11 @@ print_symbol (PTR args) SYMBOL_BFD_SECTION (symbol))); break; + case LOC_COMPUTED: + case LOC_COMPUTED_ARG: + fprintf_filtered (outfile, "computed at runtime"); + break; + case LOC_UNRESOLVED: fprintf_filtered (outfile, "unresolved"); break; @@ -799,28 +831,28 @@ print_partial_symbols (struct partial_symbol **p, int count, char *what, fprintf_filtered (outfile, " %s partial symbols:\n", what); while (count-- > 0) { - fprintf_filtered (outfile, " `%s'", SYMBOL_NAME (*p)); + fprintf_filtered (outfile, " `%s'", DEPRECATED_SYMBOL_NAME (*p)); if (SYMBOL_DEMANGLED_NAME (*p) != NULL) { fprintf_filtered (outfile, " `%s'", SYMBOL_DEMANGLED_NAME (*p)); } fputs_filtered (", ", outfile); - switch (SYMBOL_NAMESPACE (*p)) + switch (SYMBOL_DOMAIN (*p)) { - case UNDEF_NAMESPACE: - fputs_filtered ("undefined namespace, ", outfile); + case UNDEF_DOMAIN: + fputs_filtered ("undefined domain, ", outfile); break; - case VAR_NAMESPACE: + case VAR_DOMAIN: /* This is the usual thing -- don't print it */ break; - case STRUCT_NAMESPACE: - fputs_filtered ("struct namespace, ", outfile); + case STRUCT_DOMAIN: + fputs_filtered ("struct domain, ", outfile); break; - case LABEL_NAMESPACE: - fputs_filtered ("label namespace, ", outfile); + case LABEL_DOMAIN: + fputs_filtered ("label domain, ", outfile); break; default: - fputs_filtered (", ", outfile); + fputs_filtered (", ", outfile); break; } switch (SYMBOL_CLASS (*p)) @@ -876,6 +908,10 @@ print_partial_symbols (struct partial_symbol **p, int count, char *what, case LOC_OPTIMIZED_OUT: fputs_filtered ("optimized out", outfile); break; + case LOC_COMPUTED: + case LOC_COMPUTED_ARG: + fputs_filtered ("computed at runtime", outfile); + break; default: fputs_filtered ("", outfile); break; @@ -949,6 +985,145 @@ maintenance_print_objfiles (char *ignore, int from_tty) immediate_quit--; } + +/* List all the symbol tables whose names match REGEXP (optional). */ +void +maintenance_info_symtabs (char *regexp, int from_tty) +{ + struct objfile *objfile; + + if (regexp) + re_comp (regexp); + + ALL_OBJFILES (objfile) + { + struct symtab *symtab; + + /* We don't want to print anything for this objfile until we + actually find a symtab whose name matches. */ + int printed_objfile_start = 0; + + ALL_OBJFILE_SYMTABS (objfile, symtab) + if (! regexp + || re_exec (symtab->filename)) + { + if (! printed_objfile_start) + { + printf_filtered ("{ objfile %s ", objfile->name); + wrap_here (" "); + printf_filtered ("((struct objfile *) %p)\n", objfile); + printed_objfile_start = 1; + } + + printf_filtered (" { symtab %s ", symtab->filename); + wrap_here (" "); + printf_filtered ("((struct symtab *) %p)\n", symtab); + printf_filtered (" dirname %s\n", + symtab->dirname ? symtab->dirname : "(null)"); + printf_filtered (" fullname %s\n", + symtab->fullname ? symtab->fullname : "(null)"); + printf_filtered (" blockvector ((struct blockvector *) %p)%s\n", + symtab->blockvector, + symtab->primary ? " (primary)" : ""); + printf_filtered (" debugformat %s\n", symtab->debugformat); + printf_filtered (" }\n"); + } + + if (printed_objfile_start) + printf_filtered ("}\n"); + } +} + + +/* List all the partial symbol tables whose names match REGEXP (optional). */ +void +maintenance_info_psymtabs (char *regexp, int from_tty) +{ + struct objfile *objfile; + + if (regexp) + re_comp (regexp); + + ALL_OBJFILES (objfile) + { + struct partial_symtab *psymtab; + + /* We don't want to print anything for this objfile until we + actually find a symtab whose name matches. */ + int printed_objfile_start = 0; + + ALL_OBJFILE_PSYMTABS (objfile, psymtab) + if (! regexp + || re_exec (psymtab->filename)) + { + if (! printed_objfile_start) + { + printf_filtered ("{ objfile %s ", objfile->name); + wrap_here (" "); + printf_filtered ("((struct objfile *) %p)\n", objfile); + printed_objfile_start = 1; + } + + printf_filtered (" { psymtab %s ", psymtab->filename); + wrap_here (" "); + printf_filtered ("((struct partial_symtab *) %p)\n", psymtab); + printf_filtered (" readin %s\n", + psymtab->readin ? "yes" : "no"); + printf_filtered (" fullname %s\n", + psymtab->fullname ? psymtab->fullname : "(null)"); + printf_filtered (" text addresses "); + print_address_numeric (psymtab->textlow, 1, gdb_stdout); + printf_filtered (" -- "); + print_address_numeric (psymtab->texthigh, 1, gdb_stdout); + printf_filtered ("\n"); + printf_filtered (" globals "); + if (psymtab->n_global_syms) + { + printf_filtered ("(* (struct partial_symbol **) %p @ %d)\n", + (psymtab->objfile->global_psymbols.list + + psymtab->globals_offset), + psymtab->n_global_syms); + } + else + printf_filtered ("(none)\n"); + printf_filtered (" statics "); + if (psymtab->n_static_syms) + { + printf_filtered ("(* (struct partial_symbol **) %p @ %d)\n", + (psymtab->objfile->static_psymbols.list + + psymtab->statics_offset), + psymtab->n_static_syms); + } + else + printf_filtered ("(none)\n"); + printf_filtered (" dependencies "); + if (psymtab->number_of_dependencies) + { + int i; + + printf_filtered ("{\n"); + for (i = 0; i < psymtab->number_of_dependencies; i++) + { + struct partial_symtab *dep = psymtab->dependencies[i]; + + /* Note the string concatenation there --- no comma. */ + printf_filtered (" psymtab %s " + "((struct partial_symtab *) %p)\n", + dep->filename, dep); + } + printf_filtered (" }\n"); + } + else + printf_filtered ("(none)\n"); + printf_filtered (" }\n"); + } + + if (printed_objfile_start) + printf_filtered ("}\n"); + } +} + + /* Check consistency of psymtabs and symtabs. */ void @@ -974,12 +1149,12 @@ maintenance_check_symtabs (char *ignore, int from_tty) length = ps->n_static_syms; while (length--) { - sym = lookup_block_symbol (b, SYMBOL_NAME (*psym), - NULL, SYMBOL_NAMESPACE (*psym)); + sym = lookup_block_symbol (b, DEPRECATED_SYMBOL_NAME (*psym), + NULL, SYMBOL_DOMAIN (*psym)); if (!sym) { printf_filtered ("Static symbol `"); - puts_filtered (SYMBOL_NAME (*psym)); + puts_filtered (DEPRECATED_SYMBOL_NAME (*psym)); printf_filtered ("' only found in "); puts_filtered (ps->filename); printf_filtered (" psymtab\n"); @@ -991,12 +1166,12 @@ maintenance_check_symtabs (char *ignore, int from_tty) length = ps->n_global_syms; while (length--) { - sym = lookup_block_symbol (b, SYMBOL_NAME (*psym), - NULL, SYMBOL_NAMESPACE (*psym)); + sym = lookup_block_symbol (b, DEPRECATED_SYMBOL_NAME (*psym), + NULL, SYMBOL_DOMAIN (*psym)); if (!sym) { printf_filtered ("Global symbol `"); - puts_filtered (SYMBOL_NAME (*psym)); + puts_filtered (DEPRECATED_SYMBOL_NAME (*psym)); printf_filtered ("' only found in "); puts_filtered (ps->filename); printf_filtered (" psymtab\n");