aboutsummaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
Diffstat (limited to 'gold')
-rw-r--r--gold/layout.cc10
-rw-r--r--gold/layout.h4
-rw-r--r--gold/main.cc1
-rw-r--r--gold/stringpool.cc18
-rw-r--r--gold/stringpool.h4
-rw-r--r--gold/symtab.cc13
6 files changed, 43 insertions, 7 deletions
diff --git a/gold/layout.cc b/gold/layout.cc
index 39008cd..1139cf1 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 d909ace..a790892 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<Output_segment*> Segment_list;
diff --git a/gold/main.cc b/gold/main.cc
index fe56aad..921d148 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<long long>(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 39bb9d0..19698e2 100644
--- a/gold/stringpool.cc
+++ b/gold/stringpool.cc
@@ -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
diff --git a/gold/stringpool.h b/gold/stringpool.h
index e902b8e..c5a3baf 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 6094c2a..40b3080 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