Stringpool stats. Also make Symbol_table support functions inline.
This commit is contained in:
parent
055f1d8ffc
commit
ad8f37d1ba
6 changed files with 43 additions and 7 deletions
|
@ -1958,6 +1958,16 @@ Layout::write_sections_after_input_sections(Output_file* of)
|
||||||
this->section_headers_->write(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.
|
// Write_sections_task methods.
|
||||||
|
|
||||||
// We can always run this task.
|
// We can always run this task.
|
||||||
|
|
|
@ -226,6 +226,10 @@ class Layout
|
||||||
find_output_segment(elfcpp::PT type, elfcpp::Elf_Word set,
|
find_output_segment(elfcpp::PT type, elfcpp::Elf_Word set,
|
||||||
elfcpp::Elf_Word clear) const;
|
elfcpp::Elf_Word clear) const;
|
||||||
|
|
||||||
|
// Dump statistical information to stderr.
|
||||||
|
void
|
||||||
|
print_stats() const;
|
||||||
|
|
||||||
// The list of segments.
|
// The list of segments.
|
||||||
|
|
||||||
typedef std::vector<Output_segment*> Segment_list;
|
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"),
|
fprintf(stderr, _("%s: output file size: %lld bytes\n"),
|
||||||
program_name, static_cast<long long>(layout.output_file_size()));
|
program_name, static_cast<long long>(layout.output_file_size()));
|
||||||
symtab.print_stats();
|
symtab.print_stats();
|
||||||
|
layout.print_stats();
|
||||||
}
|
}
|
||||||
|
|
||||||
gold_exit(errors.error_count() == 0);
|
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);
|
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.
|
// Instantiate the templates we need.
|
||||||
|
|
||||||
template
|
template
|
||||||
|
|
|
@ -149,6 +149,10 @@ class Stringpool_template
|
||||||
void
|
void
|
||||||
write_to_buffer(unsigned char* buffer, size_t buffer_size);
|
write_to_buffer(unsigned char* buffer, size_t buffer_size);
|
||||||
|
|
||||||
|
// Dump statistical information to stderr.
|
||||||
|
void
|
||||||
|
print_stats(const char*) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Stringpool_template(const Stringpool_template&);
|
Stringpool_template(const Stringpool_template&);
|
||||||
Stringpool_template& operator=(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
|
// The hash function. The key values are Stringpool keys.
|
||||||
// simple combination of the pointers.
|
|
||||||
|
|
||||||
size_t
|
inline size_t
|
||||||
Symbol_table::Symbol_table_hash::operator()(const Symbol_table_key& key) const
|
Symbol_table::Symbol_table_hash::operator()(const Symbol_table_key& key) const
|
||||||
{
|
{
|
||||||
return key.first ^ key.second;
|
return key.first ^ key.second;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The symbol table key equality function. This is only called with
|
// The symbol table key equality function. This is called with
|
||||||
// canonicalized name and version strings, so we can use pointer
|
// Stringpool keys.
|
||||||
// comparison.
|
|
||||||
|
|
||||||
bool
|
inline bool
|
||||||
Symbol_table::Symbol_table_eq::operator()(const Symbol_table_key& k1,
|
Symbol_table::Symbol_table_eq::operator()(const Symbol_table_key& k1,
|
||||||
const Symbol_table_key& k2) const
|
const Symbol_table_key& k2) const
|
||||||
{
|
{
|
||||||
|
@ -1909,6 +1907,7 @@ Symbol_table::print_stats() const
|
||||||
fprintf(stderr, _("%s: symbol table entries: %zu\n"),
|
fprintf(stderr, _("%s: symbol table entries: %zu\n"),
|
||||||
program_name, this->table_.size());
|
program_name, this->table_.size());
|
||||||
#endif
|
#endif
|
||||||
|
this->namepool_.print_stats("symbol table stringpool");
|
||||||
}
|
}
|
||||||
|
|
||||||
// We check for ODR violations by looking for symbols with the same
|
// We check for ODR violations by looking for symbols with the same
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue