of->write(this->offset(), this->p_, this->len_);
}
-// Compute a hash code for a Merge_string_key, which is an object, a
-// section index, and an offset.
-
-template<typename Char_type>
-size_t
-Output_merge_string<Char_type>::Merge_string_key_hash::operator()(
- const Merge_string_key& key) const
-{
- // This is a very simple minded hash code. Fix it if it we get too
- // many collisions.
- const std::string& oname(key.object->name());
- return oname[0] + oname.length() + key.shndx + key.offset;
-}
-
-// Compare two Merge_string_keys for equality.
-
-template<typename Char_type>
-bool
-Output_merge_string<Char_type>::Merge_string_key_eq::operator()(
- const Merge_string_key& k1, const Merge_string_key& k2) const
-{
- return (k1.object == k2.object
- && k1.shndx == k2.shndx
- && k1.offset == k2.offset);
-}
-
// Add an input section to a merged string section.
template<typename Char_type>
const Char_type* str = this->stringpool_.add(p, NULL);
- Merge_string_key k(object, shndx, i);
- typename Merge_string_hashtable::value_type v(k, str);
- bool b = this->hashtable_.insert(v).second;
- gold_assert(b);
+ this->merged_strings_.push_back(Merged_string(object, shndx, i, str));
p += plen + 1;
i += plen + 1;
{
this->stringpool_.set_string_offsets();
- for (typename Merge_string_hashtable::const_iterator p =
- this->hashtable_.begin();
- p != this->hashtable_.end();
+ for (typename Merged_strings::const_iterator p =
+ this->merged_strings_.begin();
+ p != this->merged_strings_.end();
++p)
- this->add_mapping(p->first.object, p->first.shndx, p->first.offset,
- this->stringpool_.get_offset(p->second));
+ this->add_mapping(p->object, p->shndx, p->offset,
+ this->stringpool_.get_offset(p->string));
this->set_data_size(this->stringpool_.get_strtab_size());
// Save some memory.
- this->hashtable_.clear();
+ this->merged_strings_.clear();
}
// Write out a merged string section.
{
public:
Output_merge_string()
- : Output_merge_base(sizeof(Char_type)), stringpool_(), hashtable_()
+ : Output_merge_base(sizeof(Char_type)), stringpool_(), merged_strings_()
{ this->stringpool_.set_no_zero_null(); }
// Add an input section.
private:
// As we see input sections, we build a mapping from object, section
// index and offset to strings.
- struct Merge_string_key
+ struct Merged_string
{
+ // The input object where the string was found.
Relobj* object;
+ // The input section in the input object.
unsigned int shndx;
+ // The offset in the input section.
off_t offset;
+ // The string itself, a pointer into a Stringpool.
+ const Char_type* string;
- Merge_string_key(Relobj *objecta, unsigned int shndxa, off_t offseta)
- : object(objecta), shndx(shndxa), offset(offseta)
+ Merged_string(Relobj *objecta, unsigned int shndxa, off_t offseta,
+ const Char_type* stringa)
+ : object(objecta), shndx(shndxa), offset(offseta), string(stringa)
{ }
};
- struct Merge_string_key_hash
- {
- size_t
- operator()(const Merge_string_key&) const;
- };
-
- struct Merge_string_key_eq
- {
- bool
- operator()(const Merge_string_key&, const Merge_string_key&) const;
- };
-
- typedef Unordered_map<Merge_string_key, const Char_type*,
- Merge_string_key_hash, Merge_string_key_eq>
- Merge_string_hashtable;
+ typedef std::vector<Merged_string> Merged_strings;
// As we see the strings, we add them to a Stringpool.
Stringpool_template<Char_type> stringpool_;
// Map from a location in an input object to an entry in the
// Stringpool.
- Merge_string_hashtable hashtable_;
+ Merged_strings merged_strings_;
};
} // End namespace gold.