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.
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;
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);
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
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&);
{
}
-// 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
{
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