From 4829711b6ba57568d5fec3c2e8c747a2edb2aa8f Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sat, 20 Mar 2021 17:23:40 -0600 Subject: Move psymtab statistics printing to psymtab.c This moves all the psymtab statistics printing code form symmisc.c to psymtab.c. This changes the formatting of the output a little, but considering that it is a maint command (and, I assume, a rarely used one), this seems fine to me. This change helps further dissociate the psymtab from the objfile. In the end there will be no direct connect -- only via the quick_symbol_functions interface. gdb/ChangeLog 2021-03-20 Tom Tromey * dwarf2/read.c (dwarf2_base_index_functions::print_stats): Add print_bcache parameter. * symfile-debug.c (objfile::print_stats): Add print_bcache parameter. * quick-symbol.h (struct quick_symbol_functions) : Add print_bcache parameter. * symmisc.c (print_symbol_bcache_statistics, count_psyms): Move code to psymtab.c. (print_objfile_statistics): Move psymtab code to psymtab.c. * psymtab.c (count_psyms): Move from symmisc.c. (psymbol_functions::print_stats): Print partial symbol and bcache statistics. Add print_bcache parameter. * objfiles.h (print_symbol_bcache_statistics): Don't declare. (struct objfile) : Add print_bcache parameter. * maint.c (maintenance_print_statistics): Update. gdb/testsuite/ChangeLog 2021-03-20 Tom Tromey * gdb.base/maint.exp: Update "maint print statistics" output. --- gdb/ChangeLog | 18 +++++++++++++++ gdb/dwarf2/read.c | 8 +++++-- gdb/maint.c | 1 - gdb/objfiles.h | 3 +-- gdb/psympriv.h | 2 +- gdb/psymtab.c | 43 ++++++++++++++++++++++++++++++----- gdb/quick-symbol.h | 6 +++-- gdb/symfile-debug.c | 8 +++---- gdb/symmisc.c | 49 +++++++--------------------------------- gdb/testsuite/ChangeLog | 4 ++++ gdb/testsuite/gdb.base/maint.exp | 2 +- 11 files changed, 84 insertions(+), 60 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index fcc8f2a..47aa9ea 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,23 @@ 2021-03-20 Tom Tromey + * dwarf2/read.c (dwarf2_base_index_functions::print_stats): Add + print_bcache parameter. + * symfile-debug.c (objfile::print_stats): Add print_bcache + parameter. + * quick-symbol.h (struct quick_symbol_functions) + : Add print_bcache parameter. + * symmisc.c (print_symbol_bcache_statistics, count_psyms): Move + code to psymtab.c. + (print_objfile_statistics): Move psymtab code to psymtab.c. + * psymtab.c (count_psyms): Move from symmisc.c. + (psymbol_functions::print_stats): Print partial symbol and bcache + statistics. Add print_bcache parameter. + * objfiles.h (print_symbol_bcache_statistics): Don't declare. + (struct objfile) : Add print_bcache parameter. + * maint.c (maintenance_print_statistics): Update. + +2021-03-20 Tom Tromey + * dwarf2/read.h (struct dwarf2_per_bfd) : New member. * dwarf2/read.c (create_addrmap_from_index) diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 483c6fb..b6069c5 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -2214,7 +2214,7 @@ struct dwarf2_base_index_functions : public quick_symbol_functions return language_unknown; } - void print_stats (struct objfile *objfile) override; + void print_stats (struct objfile *objfile, bool print_bcache) override; void expand_all_symtabs (struct objfile *objfile) override; @@ -3681,8 +3681,12 @@ dwarf2_gdb_index::lookup_symbol (struct objfile *objfile, } void -dwarf2_base_index_functions::print_stats (struct objfile *objfile) +dwarf2_base_index_functions::print_stats (struct objfile *objfile, + bool print_bcache) { + if (print_bcache) + return; + dwarf2_per_objfile *per_objfile = get_dwarf2_per_objfile (objfile); int total = (per_objfile->per_bfd->all_comp_units.size () + per_objfile->per_bfd->all_type_units.size ()); diff --git a/gdb/maint.c b/gdb/maint.c index bfdd1d5..5254cd6 100644 --- a/gdb/maint.c +++ b/gdb/maint.c @@ -518,7 +518,6 @@ static void maintenance_print_statistics (const char *args, int from_tty) { print_objfile_statistics (); - print_symbol_bcache_statistics (); } static void diff --git a/gdb/objfiles.h b/gdb/objfiles.h index cd136ee..ff60e18 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -211,7 +211,6 @@ struct objstats #define OBJSTAT(objfile, expr) (objfile -> stats.expr) #define OBJSTATS struct objstats stats extern void print_objfile_statistics (void); -extern void print_symbol_bcache_statistics (void); /* Number of entries in the minimal symbol hash table. */ #define MINIMAL_SYMBOL_HASH_SIZE 2039 @@ -568,7 +567,7 @@ public: domain_enum domain); /* See quick_symbol_functions. */ - void print_stats (); + void print_stats (bool print_bcache); /* See quick_symbol_functions. */ void dump (); diff --git a/gdb/psympriv.h b/gdb/psympriv.h index 0f24c10..943d6c1 100644 --- a/gdb/psympriv.h +++ b/gdb/psympriv.h @@ -496,7 +496,7 @@ struct psymbol_functions : public quick_symbol_functions domain_enum domain, bool *symbol_found_p) override; - void print_stats (struct objfile *objfile) override; + void print_stats (struct objfile *objfile, bool print_bcache) override; void dump (struct objfile *objfile) override; diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 45a4db7..867b715 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -975,21 +975,52 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab, fprintf_filtered (outfile, "\n"); } +/* Count the number of partial symbols in OBJFILE. */ + +static int +count_psyms (struct objfile *objfile) +{ + int count = 0; + for (partial_symtab *pst : objfile->psymtabs ()) + { + count += pst->global_psymbols.size (); + count += pst->static_psymbols.size (); + } + return count; +} + /* Psymtab version of print_stats. See its definition in the definition of quick_symbol_functions in symfile.h. */ void -psymbol_functions::print_stats (struct objfile *objfile) +psymbol_functions::print_stats (struct objfile *objfile, bool print_bcache) { int i; - i = 0; - for (partial_symtab *ps : require_partial_symbols (objfile, true)) + if (!print_bcache) + { + int n_psyms = count_psyms (objfile); + if (n_psyms > 0) + printf_filtered (_(" Number of \"partial\" symbols read: %d\n"), + n_psyms); + + i = 0; + for (partial_symtab *ps : require_partial_symbols (objfile, true)) + { + if (!ps->readin_p (objfile)) + i++; + } + printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"), + i); + printf_filtered (_(" Total memory used for psymbol cache: %d\n"), + objfile->partial_symtabs->psymbol_cache.memory_used ()); + } + else { - if (!ps->readin_p (objfile)) - i++; + printf_filtered (_("Psymbol byte cache statistics:\n")); + objfile->partial_symtabs->psymbol_cache.print_statistics + ("partial symbol cache"); } - printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"), i); } /* Psymtab version of dump. See its definition in diff --git a/gdb/quick-symbol.h b/gdb/quick-symbol.h index 319ffe6..315a97a 100644 --- a/gdb/quick-symbol.h +++ b/gdb/quick-symbol.h @@ -126,8 +126,10 @@ struct quick_symbol_functions /* Print statistics about any indices loaded for OBJFILE. The statistics should be printed to gdb_stdout. This is used for - "maint print statistics". */ - virtual void print_stats (struct objfile *objfile) = 0; + "maint print statistics". Statistics are printed in two + sections. PRINT_BCACHE is false when printing the first section + of general statistics, and true when printing bcache statistics. */ + virtual void print_stats (struct objfile *objfile, bool print_bcache) = 0; /* Dump any indices loaded for OBJFILE. The dump should go to gdb_stdout. This is used for "maint print objfiles". */ diff --git a/gdb/symfile-debug.c b/gdb/symfile-debug.c index 55865ab..406eac0 100644 --- a/gdb/symfile-debug.c +++ b/gdb/symfile-debug.c @@ -174,14 +174,14 @@ objfile::lookup_symbol (block_enum kind, const char *name, domain_enum domain) } void -objfile::print_stats () +objfile::print_stats (bool print_bcache) { if (debug_symfile) - fprintf_filtered (gdb_stdlog, "qf->print_stats (%s)\n", - objfile_debug_name (this)); + fprintf_filtered (gdb_stdlog, "qf->print_stats (%s, %d)\n", + objfile_debug_name (this), print_bcache); if (qf != nullptr) - qf->print_stats (this); + qf->print_stats (this, print_bcache); } void diff --git a/gdb/symmisc.c b/gdb/symmisc.c index 0aab30d..9ea5cb5 100644 --- a/gdb/symmisc.c +++ b/gdb/symmisc.c @@ -38,9 +38,6 @@ #include "source.h" #include "readline/tilde.h" -#include "psymtab.h" -#include "psympriv.h" - /* Prototypes for local functions */ static int block_depth (const struct block *); @@ -50,35 +47,6 @@ static void print_symbol (struct gdbarch *gdbarch, struct symbol *symbol, void -print_symbol_bcache_statistics (void) -{ - for (struct program_space *pspace : program_spaces) - for (objfile *objfile : pspace->objfiles ()) - { - QUIT; - printf_filtered (_("Byte cache statistics for '%s':\n"), - objfile_name (objfile)); - objfile->partial_symtabs->psymbol_cache.print_statistics - ("partial symbol cache"); - objfile->per_bfd->string_cache.print_statistics ("string cache"); - } -} - -/* Count the number of partial symbols in OBJFILE. */ - -static int -count_psyms (struct objfile *objfile) -{ - int count = 0; - for (partial_symtab *pst : objfile->psymtabs ()) - { - count += pst->global_psymbols.size (); - count += pst->static_psymbols.size (); - } - return count; -} - -void print_objfile_statistics (void) { int i, linetables, blockvectors; @@ -94,18 +62,13 @@ print_objfile_statistics (void) if (objfile->per_bfd->n_minsyms > 0) printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"), objfile->per_bfd->n_minsyms); - - int n_psyms = count_psyms (objfile); - if (n_psyms > 0) - printf_filtered (_(" Number of \"partial\" symbols read: %d\n"), - n_psyms); if (OBJSTAT (objfile, n_syms) > 0) printf_filtered (_(" Number of \"full\" symbols read: %d\n"), OBJSTAT (objfile, n_syms)); if (OBJSTAT (objfile, n_types) > 0) printf_filtered (_(" Number of \"types\" defined: %d\n"), OBJSTAT (objfile, n_types)); - objfile->print_stats (); + i = linetables = 0; for (compunit_symtab *cu : objfile->compunits ()) { @@ -124,6 +87,8 @@ print_objfile_statistics (void) printf_filtered (_(" Number of symbol tables with blockvectors: %d\n"), blockvectors); + objfile->print_stats (false); + if (OBJSTAT (objfile, sz_strtab) > 0) printf_filtered (_(" Space used by string tables: %d\n"), OBJSTAT (objfile, sz_strtab)); @@ -133,11 +98,13 @@ print_objfile_statistics (void) printf_filtered (_(" Total memory used for BFD obstack: %s\n"), pulongest (obstack_memory_used (&objfile->per_bfd ->storage_obstack))); - printf_filtered - (_(" Total memory used for psymbol cache: %d\n"), - objfile->partial_symtabs->psymbol_cache.memory_used ()); + printf_filtered (_(" Total memory used for string cache: %d\n"), objfile->per_bfd->string_cache.memory_used ()); + printf_filtered (_("Byte cache statistics for '%s':\n"), + objfile_name (objfile)); + objfile->per_bfd->string_cache.print_statistics ("string cache"); + objfile->print_stats (true); } } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index d5ff002..e764c8f 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2021-03-20 Tom Tromey + + * gdb.base/maint.exp: Update "maint print statistics" output. + 2021-03-19 Kevin Buettner * lib/gdbserver-support.exp (gdbserver_exit): Use the diff --git a/gdb/testsuite/gdb.base/maint.exp b/gdb/testsuite/gdb.base/maint.exp index b418c02..e723922 100644 --- a/gdb/testsuite/gdb.base/maint.exp +++ b/gdb/testsuite/gdb.base/maint.exp @@ -193,7 +193,7 @@ if [istarget "*-*-cygwin*"] { send_gdb "maint print statistics\n" gdb_expect { - -re "Statistics for\[^\n\r\]*maint\[^\n\r\]*:\r\n Number of \"minimal\" symbols read: $decimal\r\n( Number of \"partial\" symbols read: $decimal\r\n)? Number of \"full\" symbols read: $decimal\r\n Number of \"types\" defined: $decimal\r\n( Number of psym tables \\(not yet expanded\\): $decimal\r\n)?( Number of read CUs: $decimal\r\n Number of unread CUs: $decimal\r\n)? Number of symbol tables: $decimal\r\n Number of symbol tables with line tables: $decimal\r\n Number of symbol tables with blockvectors: $decimal\r\n Total memory used for objfile obstack: $decimal\r\n Total memory used for BFD obstack: $decimal\r\n Total memory used for psymbol cache: $decimal\r\n Total memory used for string cache: $decimal\r\n" { + -re "Statistics for\[^\n\r\]*maint\[^\n\r\]*:\r\n Number of \"minimal\" symbols read: $decimal\r\n Number of \"full\" symbols read: $decimal\r\n Number of \"types\" defined: $decimal\r\n( Number of read CUs: $decimal\r\n Number of unread CUs: $decimal\r\n)? Number of symbol tables: $decimal\r\n Number of symbol tables with line tables: $decimal\r\n Number of symbol tables with blockvectors: $decimal\r\n( Number of \"partial\" symbols read: $decimal\r\n)?( Number of psym tables \\(not yet expanded\\): $decimal\r\n)? Total memory used for psymbol cache: $decimal\r\n Total memory used for objfile obstack: $decimal\r\n Total memory used for BFD obstack: $decimal\r\n Total memory used for string cache: $decimal\r\n" { gdb_expect { -re "$gdb_prompt $" { pass "maint print statistics" -- cgit v1.1