gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gold / stringpool.cc
index d9f40506eb07be90ae218b198cc0fc69bfbedb8b..8918f6f054fd1108faceedf6f8b709051995043a 100644 (file)
@@ -1,6 +1,6 @@
 // stringpool.cc -- a string pool for gold
 
-// Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
+// Copyright (C) 2006-2020 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -34,11 +34,14 @@ namespace gold
 {
 
 template<typename Stringpool_char>
-Stringpool_template<Stringpool_char>::Stringpool_template()
+Stringpool_template<Stringpool_char>::Stringpool_template(uint64_t addralign)
   : string_set_(), key_to_offset_(), strings_(), strtab_size_(0),
-    zero_null_(true), optimize_(false)
+    zero_null_(true), optimize_(false), offset_(sizeof(Stringpool_char)),
+    addralign_(addralign)
 {
-  if (parameters->options_valid() && parameters->options().optimize() >= 2)
+  if (parameters->options_valid()
+      && parameters->options().optimize() >= 2
+      && addralign <= sizeof(Stringpool_char))
     this->optimize_ = true;
 }
 
@@ -72,7 +75,10 @@ Stringpool_template<Stringpool_char>::reserve(unsigned int n)
 {
   this->key_to_offset_.reserve(n);
 
-#if defined(HAVE_TR1_UNORDERED_MAP)
+#if defined(HAVE_UNORDERED_MAP)
+  this->string_set_.rehash(this->string_set_.size() + n);
+  return;
+#elif defined(HAVE_TR1_UNORDERED_MAP)
   // rehash() implementation is broken in gcc 4.0.3's stl
   //this->string_set_.rehash(this->string_set_.size() + n);
   //return;
@@ -87,28 +93,6 @@ Stringpool_template<Stringpool_char>::reserve(unsigned int n)
   this->string_set_.swap(new_string_set);
 }
 
-// Return the length of a string of arbitrary character type.
-
-template<typename Stringpool_char>
-size_t
-Stringpool_template<Stringpool_char>::string_length(const Stringpool_char* p)
-{
-  size_t len = 0;
-  for (; *p != 0; ++p)
-    ++len;
-  return len;
-}
-
-// Specialize string_length for char.  Maybe we could just use
-// std::char_traits<>::length?
-
-template<>
-inline size_t
-Stringpool_template<char>::string_length(const char* p)
-{
-  return strlen(p);
-}
-
 // Compare two strings of arbitrary character type for equality.
 
 template<typename Stringpool_char>
@@ -191,7 +175,7 @@ Stringpool_template<Stringpool_char>::add_string(const Stringpool_char* s,
     alc = sizeof(Stringdata) + buffer_size;
   else
     {
-      Stringdata *psd = this->strings_.front();
+      Stringdatapsd = this->strings_.front();
       if (len > psd->alc - psd->len)
        alc = sizeof(Stringdata) + buffer_size;
       else
@@ -207,7 +191,7 @@ Stringpool_template<Stringpool_char>::add_string(const Stringpool_char* s,
        }
     }
 
-  Stringdata *psd = reinterpret_cast<Stringdata*>(new char[alc]);
+  Stringdatapsd = reinterpret_cast<Stringdata*>(new char[alc]);
   psd->alc = alc - sizeof(Stringdata);
   memcpy(psd->data, s, len - sizeof(Stringpool_char));
   memset(psd->data + len - sizeof(Stringpool_char), 0,
@@ -232,6 +216,25 @@ 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_;
+      // Align strings.
+      offset = align_address(offset, this->addralign_);
+      this->offset_ = 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 +262,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 +288,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 +393,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
     {
@@ -428,6 +420,8 @@ Stringpool_template<Stringpool_char>::set_string_offsets()
           if (this->zero_null_ && (*curr)->first.string[0] == 0)
             this_offset = 0;
           else if (last != v.end()
+                   && ((((*curr)->first.length - (*last)->first.length)
+                       % this->addralign_) == 0)
                    && is_suffix((*curr)->first.string,
                                (*curr)->first.length,
                                 (*last)->first.string,
@@ -437,8 +431,8 @@ Stringpool_template<Stringpool_char>::set_string_offsets()
                              * charsize));
           else
             {
-              this_offset = offset;
-              offset += ((*curr)->first.length + 1) * charsize;
+              this_offset = align_address(offset, this->addralign_);
+              offset = this_offset + ((*curr)->first.length + 1) * charsize;
             }
          this->key_to_offset_[(*curr)->second - 1] = this_offset;
          last_offset = this_offset;
@@ -515,7 +509,7 @@ template<typename Stringpool_char>
 void
 Stringpool_template<Stringpool_char>::print_stats(const char* name) const
 {
-#if defined(HAVE_TR1_UNORDERED_MAP) || defined(HAVE_EXT_HASH_MAP)
+#if defined(HAVE_UNORDERED_MAP) || defined(HAVE_TR1_UNORDERED_MAP) || defined(HAVE_EXT_HASH_MAP)
   fprintf(stderr, _("%s: %s entries: %zu; buckets: %zu\n"),
          program_name, name, this->string_set_.size(),
          this->string_set_.bucket_count());
This page took 0.0269 seconds and 4 git commands to generate.