* script-sections.cc (class Orphan_section_placement): Define
[binutils-gdb.git] / gold / stringpool.cc
index d9f40506eb07be90ae218b198cc0fc69bfbedb8b..10d6d274e399d82c1cce24914f0bf81d695ae479 100644 (file)
@@ -36,7 +36,7 @@ namespace gold
 template<typename Stringpool_char>
 Stringpool_template<Stringpool_char>::Stringpool_template()
   : string_set_(), key_to_offset_(), strings_(), strtab_size_(0),
-    zero_null_(true), optimize_(false)
+    zero_null_(true), optimize_(false), offset_(sizeof(Stringpool_char))
 {
   if (parameters->options_valid() && parameters->options().optimize() >= 2)
     this->optimize_ = true;
@@ -232,6 +232,23 @@ Stringpool_template<Stringpool_char>::add(const Stringpool_char* s, bool copy,
   return this->add_with_length(s, string_length(s), copy, pkey);
 }
 
+// Add a new key offset entry.
+
+template<typename Stringpool_char>
+void
+Stringpool_template<Stringpool_char>::new_key_offset(size_t length)
+{
+  section_offset_type offset;
+  if (this->zero_null_ && length == 0)
+    offset = 0;
+  else
+    {
+      offset = this->offset_;
+      this->offset_ += (length + 1) * sizeof(Stringpool_char);
+    }
+  this->key_to_offset_.push_back(offset);
+}
+
 template<typename Stringpool_char>
 const Stringpool_char*
 Stringpool_template<Stringpool_char>::add_with_length(const Stringpool_char* s,
@@ -259,7 +276,7 @@ Stringpool_template<Stringpool_char>::add_with_length(const Stringpool_char* s,
        {
          // We just added the string.  The key value has now been
          // used.
-         this->key_to_offset_.push_back(0);
+         this->new_key_offset(length);
        }
       else
        {
@@ -285,7 +302,7 @@ Stringpool_template<Stringpool_char>::add_with_length(const Stringpool_char* s,
       return p->first.string;
     }
 
-  this->key_to_offset_.push_back(0);
+  this->new_key_offset(length);
 
   hk.string = this->add_string(s, length);
   // The contents of the string stay the same, so we don't need to
@@ -390,19 +407,8 @@ Stringpool_template<Stringpool_char>::set_string_offsets()
   // take the time to sort when the user asks for heavy optimization.
   if (!this->optimize_)
     {
-      for (typename String_set_type::iterator curr = this->string_set_.begin();
-           curr != this->string_set_.end();
-           curr++)
-        {
-         section_offset_type* poff = &this->key_to_offset_[curr->second - 1];
-          if (this->zero_null_ && curr->first.string[0] == 0)
-            *poff = 0;
-          else
-            {
-              *poff = offset;
-              offset += (curr->first.length + 1) * charsize;
-            }
-        }
+      // If we are not optimizing, the offsets are already assigned.
+      offset = this->offset_;
     }
   else
     {