diff options
Diffstat (limited to 'gold')
-rw-r--r-- | gold/ChangeLog | 12 | ||||
-rw-r--r-- | gold/layout.cc | 4 | ||||
-rw-r--r-- | gold/stringpool.cc | 6 | ||||
-rw-r--r-- | gold/stringpool.h | 8 |
4 files changed, 28 insertions, 2 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index ebb7a54..c62aa99 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,15 @@ +2009-06-23 Ian Lance Taylor <iant@google.com> + + PR 10133 + * stringpool.h (class Stringpool_template): Add optimize_ field. + (Stringpool_template::set_optimize): New function. + * stringpool.cc (Stringpool_template::Stringpool_template): + Initialize optimize_ field. + (Stringpool_template::set_string_offsets): Test local optimize + fild rather than parameter. + * layout.cc (Layout::Layout): Call set_optimize on the section + name stringpool. + 2009-06-22 Ian Lance Taylor <iant@google.com> PR 10030 diff --git a/gold/layout.cc b/gold/layout.cc index ae2a5dc..4efb9c1 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -137,6 +137,10 @@ Layout::Layout(int number_of_input_files, Script_options* script_options) // Initialize structure needed for an incremental build. if (parameters->options().incremental()) this->incremental_inputs_ = new Incremental_inputs; + + // The section name pool is worth optimizing in all cases, because + // it is small, but there are often overlaps due to .rel sections. + this->namepool_.set_optimize(); } // Hash a key we use to look up an output section mapping. diff --git a/gold/stringpool.cc b/gold/stringpool.cc index e37846b..05d1d68 100644 --- a/gold/stringpool.cc +++ b/gold/stringpool.cc @@ -36,8 +36,10 @@ namespace gold template<typename Stringpool_char> Stringpool_template<Stringpool_char>::Stringpool_template() : string_set_(), key_to_offset_(), strings_(), strtab_size_(0), - zero_null_(true) + zero_null_(true), optimize_(false) { + if (parameters->options_valid() && parameters->options().optimize() >= 2) + this->optimize_ = true; } template<typename Stringpool_char> @@ -395,7 +397,7 @@ Stringpool_template<Stringpool_char>::set_string_offsets() // the strtab size, and gives a relatively small benefit (it's // typically rare for a symbol to be a suffix of another), we only // take the time to sort when the user asks for heavy optimization. - if (parameters->options().optimize() < 2) + if (!this->optimize_) { for (typename String_set_type::iterator curr = this->string_set_.begin(); curr != this->string_set_.end(); diff --git a/gold/stringpool.h b/gold/stringpool.h index 6fe2066..906ceaa 100644 --- a/gold/stringpool.h +++ b/gold/stringpool.h @@ -176,6 +176,12 @@ class Stringpool_template set_no_zero_null() { this->zero_null_ = false; } + // Indicate that this string pool should be optimized, even if not + // running with -O2. + void + set_optimize() + { this->optimize_ = true; } + // Add the string S to the pool. This returns a canonical permanent // pointer to the string in the pool. If COPY is true, the string // is copied into permanent storage. If PKEY is not NULL, this sets @@ -364,6 +370,8 @@ class Stringpool_template section_size_type strtab_size_; // Whether to reserve offset 0 to hold the null string. bool zero_null_; + // Whether to optimize the string table. + bool optimize_; }; // The most common type of Stringpool. |