/* Do various things to symbol tables (other than lookup), for GDB.
- Copyright (C) 1986-2000, 2002-2004, 2007-2012 Free Software
- Foundation, Inc.
+ Copyright (C) 1986-2013 Free Software Foundation, Inc.
This file is part of GDB.
#include "gdb_regex.h"
#include "gdb_stat.h"
#include "dictionary.h"
+#include "typeprint.h"
+#include "gdbcmd.h"
+#include "source.h"
#include "gdb_string.h"
#include "readline/readline.h"
printf_filtered (_("Byte cache statistics for '%s':\n"), objfile->name);
print_bcache_statistics (psymbol_bcache_get_bcache (objfile->psymbol_cache),
"partial symbol cache");
- print_bcache_statistics (objfile->macro_cache, "preprocessor macro cache");
- print_bcache_statistics (objfile->filename_cache, "file name cache");
+ print_bcache_statistics (objfile->per_bfd->macro_cache,
+ "preprocessor macro cache");
+ print_bcache_statistics (objfile->per_bfd->filename_cache,
+ "file name cache");
}
}
OBJSTAT (objfile, sz_strtab));
printf_filtered (_(" Total memory used for objfile obstack: %d\n"),
obstack_memory_used (&objfile->objfile_obstack));
+ printf_filtered (_(" Total memory used for BFD obstack: %d\n"),
+ obstack_memory_used (&objfile->per_bfd->storage_obstack));
printf_filtered (_(" Total memory used for psymbol cache: %d\n"),
bcache_memory_used (psymbol_bcache_get_bcache
(objfile->psymbol_cache)));
printf_filtered (_(" Total memory used for macro cache: %d\n"),
- bcache_memory_used (objfile->macro_cache));
+ bcache_memory_used (objfile->per_bfd->macro_cache));
printf_filtered (_(" Total memory used for file name cache: %d\n"),
- bcache_memory_used (objfile->filename_cache));
+ bcache_memory_used (objfile->per_bfd->filename_cache));
}
}
symtab != NULL;
symtab = symtab->next)
{
- printf_filtered ("%s at ", symtab->filename);
+ printf_filtered ("%s at ", symtab_to_filename_for_display (symtab));
gdb_print_host_address (symtab, gdb_stdout);
printf_filtered (", ");
if (symtab->objfile != objfile)
index = 0;
ALL_OBJFILE_MSYMBOLS (objfile, msymbol)
{
- struct obj_section *section = SYMBOL_OBJ_SECTION (msymbol);
+ struct obj_section *section = SYMBOL_OBJ_SECTION (objfile, msymbol);
switch (MSYMBOL_TYPE (msymbol))
{
struct block *b;
int depth;
- fprintf_filtered (outfile, "\nSymtab for file %s\n", symtab->filename);
+ fprintf_filtered (outfile, "\nSymtab for file %s\n",
+ symtab_to_filename_for_display (symtab));
if (symtab->dirname)
fprintf_filtered (outfile, "Compilation directory is %s\n",
symtab->dirname);
dump_symtab_1 (objfile, symtab, outfile);
}
-void
+static void
maintenance_print_symbols (char *args, int from_tty)
{
char **argv;
ALL_SYMTABS (objfile, s)
{
QUIT;
- if (symname == NULL || filename_cmp (symname, s->filename) == 0)
+ if (symname == NULL
+ || filename_cmp (symname, symtab_to_filename_for_display (s)) == 0)
dump_symtab (objfile, s, outfile);
}
do_cleanups (cleanups);
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;
- struct obj_section *section = SYMBOL_OBJ_SECTION (symbol);
+ struct obj_section *section = SYMBOL_OBJ_SECTION (SYMBOL_OBJFILE (symbol),
+ symbol);
print_spaces (depth, outfile);
if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN)
{
if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol)))
{
- LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
+ LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
+ &type_print_raw_options);
}
else
{
: (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
? "struct" : "union")),
SYMBOL_LINKAGE_NAME (symbol));
- LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
+ LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
+ &type_print_raw_options);
}
fprintf_filtered (outfile, ";\n");
}
LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol),
outfile,
TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
- depth);
+ depth,
+ &type_print_raw_options);
fprintf_filtered (outfile, "; ");
}
else
return 1;
}
-void
+static void
maintenance_print_msymbols (char *args, int from_tty)
{
char **argv;
/* If a second arg is supplied, it is a source file name to match on. */
if (argv[1] != NULL)
{
- symname = xfullpath (argv[1]);
+ symname = gdb_realpath (argv[1]);
make_cleanup (xfree, symname);
if (symname && stat (symname, &sym_st))
perror_with_name (symname);
{
QUIT;
if (symname == NULL || (!stat (objfile->name, &obj_st)
+ && sym_st.st_dev == obj_st.st_dev
&& sym_st.st_ino == obj_st.st_ino))
dump_msymbols (objfile, outfile);
}
do_cleanups (cleanups);
}
-void
+static void
maintenance_print_objfiles (char *ignore, int from_tty)
{
struct program_space *pspace;
}
}
-
/* List all the symbol tables whose names match REGEXP (optional). */
-void
+
+static void
maintenance_info_symtabs (char *regexp, int from_tty)
{
struct program_space *pspace;
QUIT;
if (! regexp
- || re_exec (symtab->filename))
+ || re_exec (symtab_to_filename_for_display (symtab)))
{
if (! printed_objfile_start)
{
printed_objfile_start = 1;
}
- printf_filtered (" { symtab %s ", symtab->filename);
+ printf_filtered (" { symtab %s ",
+ symtab_to_filename_for_display (symtab));
wrap_here (" ");
printf_filtered ("((struct symtab *) %s)\n",
host_address_to_string (symtab));
\f
/* Do early runtime initializations. */
+
void
_initialize_symmisc (void)
{
std_in = stdin;
std_out = stdout;
std_err = stderr;
+
+ add_cmd ("symbols", class_maintenance, maintenance_print_symbols, _("\
+Print dump of current symbol definitions.\n\
+Entries in the full symbol table are dumped to file OUTFILE.\n\
+If a SOURCE file is specified, dump only that file's symbols."),
+ &maintenanceprintlist);
+
+ add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols, _("\
+Print dump of current minimal symbol definitions.\n\
+Entries in the minimal symbol table are dumped to file OUTFILE.\n\
+If a SOURCE file is specified, dump only that file's minimal symbols."),
+ &maintenanceprintlist);
+
+ add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles,
+ _("Print dump of current object file definitions."),
+ &maintenanceprintlist);
+
+ add_cmd ("symtabs", class_maintenance, maintenance_info_symtabs, _("\
+List the full symbol tables for all object files.\n\
+This does not include information about individual symbols, blocks, or\n\
+linetables --- just the symbol table structures themselves.\n\
+With an argument REGEXP, list the symbol tables whose names that match that."),
+ &maintenanceinfolist);
}