aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gold/ChangeLog12
-rw-r--r--gold/layout.cc4
-rw-r--r--gold/stringpool.cc6
-rw-r--r--gold/stringpool.h8
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.