Make GOT entry size target-dependent
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 29 Oct 2015 15:47:12 +0000 (08:47 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 29 Oct 2015 16:26:41 +0000 (09:26 -0700)
The GOT entry size is target-dependent.  This patch adds a got_entry_size
function to Sized_target class so that a target can provide a value
different from default.

PR gold/19184
* incremental.cc (Got_plt_view_info): Add got_entry_size.
(Local_got_offset_visitor::visit): Replace got_entry_size_
with info_.got_entry_size.
(Local_got_offset_visitor::got_entry_size_): Removed.
(Global_got_offset_visitor::visit): Replace got_entry_size_
with info_.got_entry_size.
(Global_got_offset_visitor::got_entry_size_): Removed.
(Output_section_incremental_inputs::write_got_plt): Initialize
view_info.got_entry_size.
* target.h (Sized_target::got_entry_size): New virtual function.
* x86_64.cc (Target_x86_64::got_entry_size): New function.

gold/ChangeLog
gold/incremental.cc
gold/target.h
gold/x86_64.cc

index 3b77230422f6375d36de42d67a4556c86d125879..7cc77eca2801ecec923c2630f59bd714148f34b6 100644 (file)
@@ -1,3 +1,18 @@
+2015-10-29  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR gold/19184
+       * incremental.cc (Got_plt_view_info): Add got_entry_size.
+       (Local_got_offset_visitor::visit): Replace got_entry_size_
+       with info_.got_entry_size.
+       (Local_got_offset_visitor::got_entry_size_): Removed.
+       (Global_got_offset_visitor::visit): Replace got_entry_size_
+       with info_.got_entry_size.
+       (Global_got_offset_visitor::got_entry_size_): Removed.
+       (Output_section_incremental_inputs::write_got_plt): Initialize
+       view_info.got_entry_size.
+       * target.h (Sized_target::got_entry_size): New virtual function.
+       * x86_64.cc (Target_x86_64::got_entry_size): New function.
+
 2015-10-28  Marcin Koƛcielnicki  <koriakin@0x04.net>
 
        * testsuite/binary_test.cc: Add __attribute__((aligned(1))).
index b4fff11a1b1cf3e5740e6032aa6b3e46ee46f2ff..4e35055786fddd93809a6626b997f909de222e70 100644 (file)
@@ -1818,6 +1818,8 @@ struct Got_plt_view_info
   unsigned int first_plt_entry_offset;
   // Size of a PLT entry (this is a target-dependent value).
   unsigned int plt_entry_size;
+  // Size of a GOT entry (this is a target-dependent value).
+  unsigned int got_entry_size;
   // Symbol index to write in the GOT descriptor array.  For global symbols,
   // this is the global symbol table index; for local symbols, it is the
   // local symbol table index.
@@ -1843,7 +1845,7 @@ class Local_got_offset_visitor : public Got_offset_list::Visitor
   void
   visit(unsigned int got_type, unsigned int got_offset)
   {
-    unsigned int got_index = got_offset / this->got_entry_size_;
+    unsigned int got_index = got_offset / this->info_.got_entry_size;
     gold_assert(got_index < this->info_.got_count);
     // We can only handle GOT entry types in the range 0..0x7e
     // because we use a byte array to store them, and we use the
@@ -1856,7 +1858,6 @@ class Local_got_offset_visitor : public Got_offset_list::Visitor
   }
 
  private:
-  static const unsigned int got_entry_size_ = size / 8;
   struct Got_plt_view_info& info_;
 };
 
@@ -1875,7 +1876,7 @@ class Global_got_offset_visitor : public Got_offset_list::Visitor
   void
   visit(unsigned int got_type, unsigned int got_offset)
   {
-    unsigned int got_index = got_offset / this->got_entry_size_;
+    unsigned int got_index = got_offset / this->info_.got_entry_size;
     gold_assert(got_index < this->info_.got_count);
     // We can only handle GOT entry types in the range 0..0x7e
     // because we use a byte array to store them, and we use the
@@ -1888,7 +1889,6 @@ class Global_got_offset_visitor : public Got_offset_list::Visitor
   }
 
  private:
-  static const unsigned int got_entry_size_ = size / 8;
   struct Got_plt_view_info& info_;
 };
 
@@ -1948,6 +1948,7 @@ Output_section_incremental_inputs<size, big_endian>::write_got_plt(
   view_info.plt_count = target->plt_entry_count();
   view_info.first_plt_entry_offset = target->first_plt_entry_offset();
   view_info.plt_entry_size = target->plt_entry_size();
+  view_info.got_entry_size = target->got_entry_size();
   view_info.got_type_p = pov + 8;
   view_info.got_desc_p = (view_info.got_type_p
                          + ((view_info.got_count + 3) & ~3));
index db093b7fe0011d717ad8200cf438bde8a2a13662..b21c56a479528c921bb48e7baf34214fdfe8a70d 100644 (file)
@@ -1004,6 +1004,14 @@ class Sized_target : public Target
   plt_entry_size() const
   { gold_unreachable(); }
 
+  // Return the size of each GOT entry.  This is only used for
+  // laying out the incremental link info sections.  A target needs
+  // to implement this if its GOT size is different.
+
+  virtual unsigned int
+  got_entry_size() const
+  { return size / 8; }
+
   // Create the GOT and PLT sections for an incremental update.
   // A target needs to implement this to support incremental linking.
 
index d637b5ef7fea70cb97f82d7e8db8ee03e1f32e06..3651d398ff673ab0d56ed8a0211482ccf132ead7 100644 (file)
@@ -594,6 +594,11 @@ class Target_x86_64 : public Sized_target<size, false>
   unsigned int
   plt_entry_size() const;
 
+  // Return the size of each GOT entry.
+  unsigned int
+  got_entry_size() const
+  { return 8; };
+
   // Create the GOT section for an incremental update.
   Output_data_got_base*
   init_got_plt_for_update(Symbol_table* symtab,