mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-30 12:44:10 +08:00
Stringpool stats. Also make Symbol_table support functions inline.
This commit is contained in:
parent
055f1d8ffc
commit
ad8f37d1ba
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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&);
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user