diff options
author | Doug Kwan <dougkwan@google.com> | 2010-03-16 01:26:15 +0000 |
---|---|---|
committer | Doug Kwan <dougkwan@google.com> | 2010-03-16 01:26:15 +0000 |
commit | 1aa37384696ad1fcec310e8d3c7955b0266f61d5 (patch) | |
tree | a1ac5f2059d8b607e64bf0f3796228043f50c687 /gold/stringpool.h | |
parent | ac0cd78b43c40ce8311a9381da2e42bb40eaaea9 (diff) | |
download | fsf-binutils-gdb-1aa37384696ad1fcec310e8d3c7955b0266f61d5.zip fsf-binutils-gdb-1aa37384696ad1fcec310e8d3c7955b0266f61d5.tar.gz fsf-binutils-gdb-1aa37384696ad1fcec310e8d3c7955b0266f61d5.tar.bz2 |
2010-03-15 Doug Kwan <dougkwan@google.com>
* stringpool.cc (Stringpool_template::Stringpool_template): Initialize
offset_.
(Stringpool_template::new_key_offset): New method.
(Stringpool_template::add_string): Assign offsets when adding new
strings.
(Stringpool_template::set_string_offsets): Do not set string offsets
when not optimizing.
* stringpool.h (Chunked_vector::Chunked_vector): Initialize data
member size_.
(Chunked_vector::clear): Clear size_.
(Chunked_vector::reserve): Call reserve method of all Element_vectors.
(Chunked_vector::size): Return size_.
(Chunked_vector::push_back): Use size_ to find insert position.
(Chunked_vector::size_): New data member.
(Stringpool_template::set_no_zero_null): Assert string set is empty.
(Stringpool_template::new_key_offset): New method declaration.
(Stringpool_template::offset_): New data member.
Diffstat (limited to 'gold/stringpool.h')
-rw-r--r-- | gold/stringpool.h | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/gold/stringpool.h b/gold/stringpool.h index 906ceaa..df3826d 100644 --- a/gold/stringpool.h +++ b/gold/stringpool.h @@ -77,48 +77,50 @@ class Chunked_vector { public: Chunked_vector() - : chunks_() + : chunks_(), size_(0) { } // Clear the elements. void clear() - { this->chunks_.clear(); } + { + this->chunks_.clear(); + this->size_ = 0; + } // Reserve elements. void reserve(unsigned int n) { - n += chunk_size - 1; - while (n >= chunk_size) + if (n > this->chunks_.size() * chunk_size) { - this->chunks_.push_back(Element_vector()); - this->chunks_.back().reserve(chunk_size); - n -= chunk_size; + this->chunks_.resize((n + chunk_size - 1) / chunk_size); + // We need to call reserve() of all chunks since changing + // this->chunks_ casues Element_vectors to be copied. The + // reserved capacity of an Element_vector may be lost in copying. + for (size_t i = 0; i < this->chunks_.size(); ++i) + this->chunks_[i].reserve(chunk_size); } } // Get the number of elements. size_t size() const - { - if (this->chunks_.empty()) - return 0; - else - return ((this->chunks_.size() - 1) * chunk_size - + this->chunks_.back().size()); - } + { return this->size_; } // Push a new element on the back of the vector. void push_back(const Element& element) { - if (this->chunks_.empty() || this->chunks_.back().size() == chunk_size) + size_t chunk_index = this->size_ / chunk_size; + if (chunk_index >= this->chunks_.size()) { this->chunks_.push_back(Element_vector()); this->chunks_.back().reserve(chunk_size); + gold_assert(chunk_index < this->chunks_.size()); } - this->chunks_.back().push_back(element); + this->chunks_[chunk_index].push_back(element); + this->size_++; } // Return a reference to an entry in the vector. @@ -137,6 +139,7 @@ class Chunked_vector typedef std::vector<Element_vector> Chunk_vector; Chunk_vector chunks_; + size_t size_; }; @@ -174,7 +177,10 @@ class Stringpool_template // should not be called for a proper ELF SHT_STRTAB section. void set_no_zero_null() - { this->zero_null_ = false; } + { + gold_assert(this->string_set_.empty()); + this->zero_null_ = false; + } // Indicate that this string pool should be optimized, even if not // running with -O2. @@ -282,6 +288,10 @@ class Stringpool_template char data[1]; }; + // Add a new key offset entry. + void + new_key_offset(size_t); + // Copy a string into the buffers, returning a canonical string. const Stringpool_char* add_string(const Stringpool_char*, size_t); @@ -372,6 +382,8 @@ class Stringpool_template bool zero_null_; // Whether to optimize the string table. bool optimize_; + // offset of the next string. + section_offset_type offset_; }; // The most common type of Stringpool. |