template<typename Stringpool_char>
Stringpool_template<Stringpool_char>::Stringpool_template()
: string_set_(), key_to_offset_(), strings_(), strtab_size_(0),
- zero_null_(true)
+ zero_null_(true), optimize_(false)
{
+ if (parameters->options_valid() && parameters->options().optimize() >= 2)
+ this->optimize_ = true;
}
template<typename Stringpool_char>
Stringpool_template<Stringpool_char>::string_hash(const Stringpool_char* s,
size_t length)
{
- // This is the hash function used by the dynamic linker for
- // DT_GNU_HASH entries. I compared this to a Fowler/Noll/Vo hash
- // for a C++ program with 385,775 global symbols. This hash
- // function was very slightly worse. However, it is much faster to
- // compute. Overall wall clock time was a win.
- const unsigned char* p = reinterpret_cast<const unsigned char*>(s);
- size_t h = 5381;
- for (size_t i = 0; i < length * sizeof(Stringpool_char); ++i)
- h = h * 33 + *p++;
- return h;
+ return gold::string_hash<Stringpool_char>(s, length);
}
// Add the string S to the list of canonical strings. Return a
// the strtab size, and gives a relatively small benefit (it's
// typically rare for a symbol to be a suffix of another), we only
// take the time to sort when the user asks for heavy optimization.
- if (parameters->options().optimize() < 2)
+ if (!this->optimize_)
{
for (typename String_set_type::iterator curr = this->string_set_.begin();
curr != this->string_set_.end();