We don't need a hash table mapping input locations to strings.
authorIan Lance Taylor <iant@google.com>
Sat, 22 Sep 2007 05:38:12 +0000 (05:38 +0000)
committerIan Lance Taylor <iant@google.com>
Sat, 22 Sep 2007 05:38:12 +0000 (05:38 +0000)
gold/merge.cc
gold/merge.h

index 7af4faa03c92ea4937453caf0b36baa5d88f26e7..7f08da6f94c82678fd7013289b4c371eadac0d45 100644 (file)
@@ -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.
index 591ac91e1bf37310f85bd43725e5df26e76e9a55..65600e86d800620806b03c507ffbbea1f8ddd39d 100644 (file)
@@ -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.