This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

gold patch committed: Always optimize section name pool


The GNU linker optimizes string pools, so that if one string is a suffix
of another string, it is overlapped at the end of the larger string.
gold does not perform this optimization by default, because measurements
showed that it is relatively costly and generally has little effect, as
there are few suffixes (the optimization can be enabled via the -O
option).  However, there section name pool is a case where suffixes are
reasonably likely (because often both .rel.XX and .XX occur, and the
latter may overlap the former), and optimizing is reasonably inexpensive
(because there are normally not too many sections).

I committed this patch to gold to always optimize the section name pool.

Ian


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.


Index: layout.cc
===================================================================
RCS file: /cvs/src/src/gold/layout.cc,v
retrieving revision 1.127
diff -p -u -r1.127 layout.cc
--- layout.cc	22 Jun 2009 20:23:21 -0000	1.127
+++ layout.cc	23 Jun 2009 07:01:52 -0000
@@ -137,6 +137,10 @@ Layout::Layout(int number_of_input_files
   // 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.
Index: stringpool.cc
===================================================================
RCS file: /cvs/src/src/gold/stringpool.cc,v
retrieving revision 1.28
diff -p -u -r1.28 stringpool.cc
--- stringpool.cc	24 Jul 2008 07:23:20 -0000	1.28
+++ stringpool.cc	23 Jun 2009 07:01:52 -0000
@@ -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>::se
   // 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();
Index: stringpool.h
===================================================================
RCS file: /cvs/src/src/gold/stringpool.h,v
retrieving revision 1.22
diff -p -u -r1.22 stringpool.h
--- stringpool.h	24 Jul 2008 07:23:20 -0000	1.22
+++ stringpool.h	23 Jun 2009 07:01:52 -0000
@@ -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.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]