This is the mail archive of the binutils-cvs@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]

[binutils-gdb] [GOLD] Further tidy to powerpc can_add_to_stub_group


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=8a37735f20f4cbd0cba49d49e57974faf8b9f19b

commit 8a37735f20f4cbd0cba49d49e57974faf8b9f19b
Author: Alan Modra <amodra@gmail.com>
Date:   Wed Aug 31 17:06:32 2016 +0930

    [GOLD] Further tidy to powerpc can_add_to_stub_group
    
    This patch adds a little more debug output, and replaces two variables
    with one, tracking current max group size by group_size_ rather than
    by has14_.
    
    	* powerpc.cc (class Stub_control): Delete stub14_group_size_
    	and has14_.  Add group_size_.
    	(Stub_control::can_add_to_stub_group): Adjust to suit.  Print
    	debug info when switching to adding sections before stubs.

Diff:
---
 gold/ChangeLog  |  7 +++++++
 gold/powerpc.cc | 39 ++++++++++++++++++++-------------------
 2 files changed, 27 insertions(+), 19 deletions(-)

diff --git a/gold/ChangeLog b/gold/ChangeLog
index 2cf964d..bde2268 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,5 +1,12 @@
 2016-08-31  Alan Modra  <amodra@gmail.com>
 
+	* powerpc.cc (class Stub_control): Delete stub14_group_size_
+	and has14_.  Add group_size_.
+	(Stub_control::can_add_to_stub_group): Adjust to suit.  Print
+	debug info when switching to adding sections before stubs.
+
+2016-08-31  Alan Modra  <amodra@gmail.com>
+
 	* debug.h (DEBUG_TARGET): New.
 	(DEBUG_ALL): Add DEBUG_TARGET.
 	(gold_debug): Delete FORMAT param.
diff --git a/gold/powerpc.cc b/gold/powerpc.cc
index 1d5cd97..8f5d259 100644
--- a/gold/powerpc.cc
+++ b/gold/powerpc.cc
@@ -2439,9 +2439,8 @@ class Stub_control
   // the stubbed branches.
   Stub_control(int32_t size, bool no_size_errors)
     : state_(NO_GROUP), stub_group_size_(abs(size)),
-      stub14_group_size_(abs(size) >> 10),
       stubs_always_before_branch_(size < 0),
-      suppress_size_errors_(no_size_errors), has14_(false),
+      suppress_size_errors_(no_size_errors), group_size_(0),
       group_end_addr_(0), owner_(NULL), output_section_(NULL)
   {
   }
@@ -2479,10 +2478,12 @@ class Stub_control
 
   State state_;
   uint32_t stub_group_size_;
-  uint32_t stub14_group_size_;
   bool stubs_always_before_branch_;
   bool suppress_size_errors_;
-  bool has14_;
+  // Current max size of group.  Starts at stub_group_size_ but is
+  // reduced to stub_group_size_/1024 on seeing a section with
+  // external conditional branches.
+  uint32_t group_size_;
   uint64_t group_end_addr_;
   // owner_ and output_section_ specify the section to which stubs are
   // attached.  The stubs are placed at the end of this section.
@@ -2513,9 +2514,9 @@ Stub_control::can_add_to_stub_group(Output_section* o,
       this_size = i->data_size();
     }
 
-  uint32_t group_size
-    = has14 ? this->stub14_group_size_ : this->stub_group_size_;
-  uint64_t end_addr = start_addr + this_size;
+  uint32_t group_size = this->stub_group_size_;
+  if (has14)
+    this->group_size_ = group_size = group_size >> 10;
 
   if (this_size > group_size && !this->suppress_size_errors_)
     gold_warning(_("%s:%s exceeds group size"),
@@ -2529,14 +2530,12 @@ Stub_control::can_add_to_stub_group(Output_section* o,
 	     (long long) this_size,
 	     (long long) this->group_end_addr_ - start_addr);
 
-  this->has14_ = this->has14_ || has14;
-  group_size = this->has14_ ? this->stub14_group_size_ : this->stub_group_size_;
-
+  uint64_t end_addr = start_addr + this_size;
   if (this->state_ == HAS_STUB_SECTION)
     {
       // Can we add this section, which is before the stubs, to the
       // group?
-      if (this->group_end_addr_ - start_addr <= group_size)
+      if (this->group_end_addr_ - start_addr <= this->group_size_)
 	return true;
     }
   else
@@ -2557,19 +2556,20 @@ Stub_control::can_add_to_stub_group(Output_section* o,
 
       if (this->state_ == FINDING_STUB_SECTION)
 	{
-	  if (this->group_end_addr_ - start_addr <= group_size)
+	  if (this->group_end_addr_ - start_addr <= this->group_size_)
 	    return true;
 	  // The group after the stubs has reached maximum size.
 	  // Now see about adding sections before the stubs to the
 	  // group.  If the current section has a 14-bit branch and
-	  // the group after the stubs exceeds stub14_group_size_
-	  // (because they didn't have 14-bit branches), don't add
-	  // sections before the stubs:  The size of stubs for such a
-	  // large group may exceed the reach of a 14-bit branch.
+	  // the group after the stubs exceeds group_size_ (because
+	  // they didn't have 14-bit branches), don't add sections
+	  // before the stubs:  The size of stubs for such a large
+	  // group may exceed the reach of a 14-bit branch.
 	  if (!this->stubs_always_before_branch_
-	      && this_size <= group_size
-	      && this->group_end_addr_ - end_addr <= group_size)
+	      && this_size <= this->group_size_
+	      && this->group_end_addr_ - end_addr <= this->group_size_)
 	    {
+	      gold_debug(DEBUG_TARGET, "adding before stubs");
 	      this->state_ = HAS_STUB_SECTION;
 	      this->group_end_addr_ = end_addr;
 	      return true;
@@ -2579,6 +2579,7 @@ Stub_control::can_add_to_stub_group(Output_section* o,
 	{
 	  // Only here on very first use of Stub_control
 	  this->state_ = FINDING_STUB_SECTION;
+	  this->group_size_ = group_size;
 	  this->group_end_addr_ = end_addr;
 	  return true;
 	}
@@ -2593,7 +2594,7 @@ Stub_control::can_add_to_stub_group(Output_section* o,
   // set later after we've retrieved those values for the current
   // group.
   this->state_ = FINDING_STUB_SECTION;
-  this->has14_ = has14;
+  this->group_size_ = group_size;
   this->group_end_addr_ = end_addr;
   return false;
 }


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