aboutsummaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog11
-rw-r--r--gold/stringpool.cc11
-rw-r--r--gold/stringpool.h4
3 files changed, 19 insertions, 7 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index a145899..3d5d94a 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,14 @@
+2008-07-24 Ian Lance Taylor <iant@google.com>
+
+ * stringpool.cc (Stringpool_template::add_with_length): Set key to
+ array size plus one.
+ (Stringpool_template::set_string_offsets): Subtract one from key
+ before using it as an array index.
+ (Stringpool_template::get_offset_with_length): Likewise.
+ (Stringpool_template::write_to_buffer): Likewise.
+ * stringpool.h (Stringpool_template::get_offset_from_key):
+ Likewise.
+
2008-07-23 Ian Lance Taylor <iant@google.com>
PR 6658
diff --git a/gold/stringpool.cc b/gold/stringpool.cc
index 0d0c904..e37846b 100644
--- a/gold/stringpool.cc
+++ b/gold/stringpool.cc
@@ -248,7 +248,8 @@ Stringpool_template<Stringpool_char>::add_with_length(const Stringpool_char* s,
{
typedef std::pair<typename String_set_type::iterator, bool> Insert_type;
- const Key k = this->key_to_offset_.size();
+ // We add 1 so that 0 is always invalid.
+ const Key k = this->key_to_offset_.size() + 1;
if (!copy)
{
@@ -400,7 +401,7 @@ Stringpool_template<Stringpool_char>::set_string_offsets()
curr != this->string_set_.end();
curr++)
{
- section_offset_type* poff = &this->key_to_offset_[curr->second];
+ section_offset_type* poff = &this->key_to_offset_[curr->second - 1];
if (this->zero_null_ && curr->first.string[0] == 0)
*poff = 0;
else
@@ -446,7 +447,7 @@ Stringpool_template<Stringpool_char>::set_string_offsets()
this_offset = offset;
offset += ((*curr)->first.length + 1) * charsize;
}
- this->key_to_offset_[(*curr)->second] = this_offset;
+ this->key_to_offset_[(*curr)->second - 1] = this_offset;
last_offset = this_offset;
}
}
@@ -475,7 +476,7 @@ Stringpool_template<Stringpool_char>::get_offset_with_length(
Hashkey hk(s, length);
typename String_set_type::const_iterator p = this->string_set_.find(hk);
if (p != this->string_set_.end())
- return this->key_to_offset_[p->second];
+ return this->key_to_offset_[p->second - 1];
gold_unreachable();
}
@@ -496,7 +497,7 @@ Stringpool_template<Stringpool_char>::write_to_buffer(
++p)
{
const int len = (p->first.length + 1) * sizeof(Stringpool_char);
- const section_offset_type offset = this->key_to_offset_[p->second];
+ const section_offset_type offset = this->key_to_offset_[p->second - 1];
gold_assert(static_cast<section_size_type>(offset) + len
<= this->strtab_size_);
memcpy(buffer + offset, p->first.string, len);
diff --git a/gold/stringpool.h b/gold/stringpool.h
index 1b80842..6fe2066 100644
--- a/gold/stringpool.h
+++ b/gold/stringpool.h
@@ -220,8 +220,8 @@ class Stringpool_template
section_offset_type
get_offset_from_key(Key k) const
{
- gold_assert(k < this->key_to_offset_.size());
- return this->key_to_offset_[k];
+ gold_assert(k <= this->key_to_offset_.size());
+ return this->key_to_offset_[k - 1];
}
// Get the size of the string table. This returns the number of