Allow target to add custom dynamic table entries.
authorCary Coutant <ccoutant@google.com>
Mon, 10 Mar 2014 20:34:53 +0000 (13:34 -0700)
committerCary Coutant <ccoutant@google.com>
Mon, 10 Mar 2014 20:34:53 +0000 (13:34 -0700)
2014-03-10  Sasa Stankovic  <Sasa.Stankovic@imgtec.com>

gold/
* output.cc (Output_data_dynamic::Dynamic_entry::write):
Get the value of DYNAMIC_CUSTOM dynamic entry.
* output.h (Output_data_dynamic::add_custom): New function.
(Dynamic_entry::Dynamic_entry): New constructor for DYNAMIC_CUSTOM
dynamic entry.
(enum Dynamic_entry::Classification): Add DYNAMIC_CUSTOM.
* target.h (Target::dynamic_tag_custom_value): New function.
(Target::do_dynamic_tag_custom_value): New function.

gold/ChangeLog
gold/output.cc
gold/output.h
gold/target.h

index 2727bacc9262eb06ec1ec9d777a7c66904c7a9a6..c29eb1e2c97af9b0536998a00d578c92c2b69990 100644 (file)
@@ -1,3 +1,14 @@
+2014-03-10  Sasa Stankovic  <Sasa.Stankovic@imgtec.com>
+  
+       * output.cc (Output_data_dynamic::Dynamic_entry::write):
+       Get the value of DYNAMIC_CUSTOM dynamic entry.
+       * output.h (Output_data_dynamic::add_custom): New function.
+       (Dynamic_entry::Dynamic_entry): New constructor for DYNAMIC_CUSTOM
+       dynamic entry.
+       (enum Dynamic_entry::Classification): Add DYNAMIC_CUSTOM.
+       * target.h (Target::dynamic_tag_custom_value): New function.
+       (Target::do_dynamic_tag_custom_value): New function.
+
 2014-03-10  Sasa Stankovic  <Sasa.Stankovic@imgtec.com>
 
        * symtab.cc (Symbol_table::set_dynsym_indexes): Allow a target to set
index 29cca5dc35c4b7afa81074a7e5a2d9fe8a839155..c078fbb64d1e6f596899c35bd2bc4a37cc94def3 100644 (file)
@@ -1796,6 +1796,10 @@ Output_data_dynamic::Dynamic_entry::write(
       val = pool->get_offset(this->u_.str);
       break;
 
+    case DYNAMIC_CUSTOM:
+      val = parameters->target().dynamic_tag_custom_value(this->tag_);
+      break;
+
     default:
       val = this->u_.od->address() + this->offset_;
       break;
index 1f4b27df659dcfeaefd45ee515d9154147f88a39..ba0cdaabda953ee71d428b1eefa0aadbe8ef254c 100644 (file)
@@ -2577,6 +2577,11 @@ class Output_data_dynamic : public Output_section_data
   add_string(elfcpp::DT tag, const std::string& str)
   { this->add_string(tag, str.c_str()); }
 
+  // Add a new dynamic entry with custom value.
+  void
+  add_custom(elfcpp::DT tag)
+  { this->add_entry(Dynamic_entry(tag)); }
+
  protected:
   // Adjust the output section to set the entry size.
   void
@@ -2641,6 +2646,11 @@ class Output_data_dynamic : public Output_section_data
       : tag_(tag), offset_(DYNAMIC_STRING)
     { this->u_.str = str; }
 
+    // Create an entry with a custom value.
+    Dynamic_entry(elfcpp::DT tag)
+      : tag_(tag), offset_(DYNAMIC_CUSTOM)
+    { }
+
     // Return the tag of this entry.
     elfcpp::DT
     tag() const
@@ -2664,7 +2674,9 @@ class Output_data_dynamic : public Output_section_data
       // Symbol adress.
       DYNAMIC_SYMBOL = -3U,
       // String.
-      DYNAMIC_STRING = -4U
+      DYNAMIC_STRING = -4U,
+      // Custom value.
+      DYNAMIC_CUSTOM = -5U
       // Any other value indicates a section address plus OFFSET.
     };
 
index 1be300af916461244616f3abc677c8616ba766b9..bd512501b8f24a49c3ee3bce820a0414e894221f 100644 (file)
@@ -470,6 +470,11 @@ class Target
                                        versions, symtab);
   }
 
+  // Get the custom dynamic tag value.
+  unsigned int
+  dynamic_tag_custom_value(elfcpp::DT tag) const
+  { return this->do_dynamic_tag_custom_value(tag); }
+
  protected:
   // This struct holds the constant information for a child class.  We
   // use a struct to avoid the overhead of virtual function calls for
@@ -753,6 +758,11 @@ class Target
                         Symbol_table*) const
   { gold_unreachable(); }
 
+  // This may be overridden by the child class.
+  virtual unsigned int
+  do_dynamic_tag_custom_value(elfcpp::DT) const
+  { gold_unreachable(); }
+
  private:
   // The implementations of the four do_make_elf_object virtual functions are
   // almost identical except for their sizes and endianness.  We use a template.