From ad8f37d1ba63a4d799f35e2244b2facb0fedf59b Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 5 Dec 2007 00:48:49 +0000 Subject: [PATCH] Stringpool stats. Also make Symbol_table support functions inline. --- gold/layout.cc | 10 ++++++++++ gold/layout.h | 4 ++++ gold/main.cc | 1 + gold/stringpool.cc | 18 ++++++++++++++++++ gold/stringpool.h | 4 ++++ gold/symtab.cc | 13 ++++++------- 6 files changed, 43 insertions(+), 7 deletions(-) diff --git a/gold/layout.cc b/gold/layout.cc index 39008cd46fe..1139cf1baa3 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -1958,6 +1958,16 @@ Layout::write_sections_after_input_sections(Output_file* of) this->section_headers_->write(of); } +// Print statistical information to stderr. This is used for --stats. + +void +Layout::print_stats() const +{ + this->namepool_.print_stats("section name pool"); + this->sympool_.print_stats("output symbol name pool"); + this->dynpool_.print_stats("dynamic name pool"); +} + // Write_sections_task methods. // We can always run this task. diff --git a/gold/layout.h b/gold/layout.h index d909acec94b..a7908925149 100644 --- a/gold/layout.h +++ b/gold/layout.h @@ -226,6 +226,10 @@ class Layout find_output_segment(elfcpp::PT type, elfcpp::Elf_Word set, elfcpp::Elf_Word clear) const; + // Dump statistical information to stderr. + void + print_stats() const; + // The list of segments. typedef std::vector Segment_list; diff --git a/gold/main.cc b/gold/main.cc index fe56aade444..921d14808d9 100644 --- a/gold/main.cc +++ b/gold/main.cc @@ -107,6 +107,7 @@ main(int argc, char** argv) fprintf(stderr, _("%s: output file size: %lld bytes\n"), program_name, static_cast(layout.output_file_size())); symtab.print_stats(); + layout.print_stats(); } gold_exit(errors.error_count() == 0); diff --git a/gold/stringpool.cc b/gold/stringpool.cc index 39bb9d0c358..19698e24c0b 100644 --- a/gold/stringpool.cc +++ b/gold/stringpool.cc @@ -457,6 +457,24 @@ Stringpool_template::write(Output_file* of, off_t offset) of->write_output_view(offset, this->strtab_size_, view); } +// Print statistical information to stderr. This is used for --stats. + +template +void +Stringpool_template::print_stats(const char* name) const +{ +#if defined(HAVE_TR1_UNORDERED_MAP) || defined(HAVE_EXT_HASH_MAP) + fprintf(stderr, _("%s: %s entries: %zu; buckets: %zu\n"), + program_name, name, this->string_set_.size(), + this->string_set_.bucket_count()); +#else + fprintf(stderr, _("%s: %s entries: %zu\n"), + program_name, name, this->table_.size()); +#endif + fprintf(stderr, _("%s: %s Stringdata structures: %zu\n"), + program_name, name, this->strings_.size()); +} + // Instantiate the templates we need. template diff --git a/gold/stringpool.h b/gold/stringpool.h index e902b8e4aae..c5a3baf884b 100644 --- a/gold/stringpool.h +++ b/gold/stringpool.h @@ -149,6 +149,10 @@ class Stringpool_template void write_to_buffer(unsigned char* buffer, size_t buffer_size); + // Dump statistical information to stderr. + void + print_stats(const char*) const; + private: Stringpool_template(const Stringpool_template&); Stringpool_template& operator=(const Stringpool_template&); diff --git a/gold/symtab.cc b/gold/symtab.cc index 6094c2af1e0..40b30809005 100644 --- a/gold/symtab.cc +++ b/gold/symtab.cc @@ -306,20 +306,18 @@ Symbol_table::~Symbol_table() { } -// The hash function. The key is always canonicalized, so we use a -// simple combination of the pointers. +// The hash function. The key values are Stringpool keys. -size_t +inline size_t Symbol_table::Symbol_table_hash::operator()(const Symbol_table_key& key) const { return key.first ^ key.second; } -// The symbol table key equality function. This is only called with -// canonicalized name and version strings, so we can use pointer -// comparison. +// The symbol table key equality function. This is called with +// Stringpool keys. -bool +inline bool Symbol_table::Symbol_table_eq::operator()(const Symbol_table_key& k1, const Symbol_table_key& k2) const { @@ -1909,6 +1907,7 @@ Symbol_table::print_stats() const fprintf(stderr, _("%s: symbol table entries: %zu\n"), program_name, this->table_.size()); #endif + this->namepool_.print_stats("symbol table stringpool"); } // We check for ODR violations by looking for symbols with the same -- 2.30.2