Stringpool stats. Also make Symbol_table support functions inline.

This commit is contained in:
Ian Lance Taylor 2007-12-05 00:48:49 +00:00
parent 055f1d8ffc
commit ad8f37d1ba
6 changed files with 43 additions and 7 deletions

View File

@ -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.

View File

@ -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<Output_segment*> Segment_list;

View File

@ -107,6 +107,7 @@ main(int argc, char** argv)
fprintf(stderr, _("%s: output file size: %lld bytes\n"),
program_name, static_cast<long long>(layout.output_file_size()));
symtab.print_stats();
layout.print_stats();
}
gold_exit(errors.error_count() == 0);

View File

@ -457,6 +457,24 @@ Stringpool_template<Stringpool_char>::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<typename Stringpool_char>
void
Stringpool_template<Stringpool_char>::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

View File

@ -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&);

View File

@ -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