diff options
author | Ian Lance Taylor <iant@google.com> | 2007-09-22 05:38:12 +0000 |
---|---|---|
committer | Ian Lance Taylor <iant@google.com> | 2007-09-22 05:38:12 +0000 |
commit | 42e3fe0dd99a68834e4af42f8f1a97c76aa5f098 (patch) | |
tree | 8df83e7d66f62cbba62734daaa637109691c7f3b | |
parent | e214a02b9ba50f8d10bfefb54e7e7d51037dc950 (diff) | |
download | gdb-42e3fe0dd99a68834e4af42f8f1a97c76aa5f098.zip gdb-42e3fe0dd99a68834e4af42f8f1a97c76aa5f098.tar.gz gdb-42e3fe0dd99a68834e4af42f8f1a97c76aa5f098.tar.bz2 |
We don't need a hash table mapping input locations to strings.
-rw-r--r-- | gold/merge.cc | 43 | ||||
-rw-r--r-- | gold/merge.h | 32 |
2 files changed, 19 insertions, 56 deletions
diff --git a/gold/merge.cc b/gold/merge.cc index 7af4faa..7f08da6 100644 --- a/gold/merge.cc +++ b/gold/merge.cc @@ -208,32 +208,6 @@ Output_merge_data::do_write(Output_file* of) 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> @@ -275,10 +249,7 @@ Output_merge_string<Char_type>::do_add_input_section(Relobj* object, 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; @@ -297,17 +268,17 @@ Output_merge_string<Char_type>::do_set_address(uint64_t, off_t) { 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. diff --git a/gold/merge.h b/gold/merge.h index 591ac91..65600e8 100644 --- a/gold/merge.h +++ b/gold/merge.h @@ -169,7 +169,7 @@ class Output_merge_string : public Output_merge_base { 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. @@ -187,38 +187,30 @@ class Output_merge_string : public Output_merge_base 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. |