Remove unnecessary target dependencies on relocation format.

2015-11-09  Cary Coutant  <ccoutant@gmail.com>
	    Vladimir Radosavljevic <Vladimir.Radosavljevic@imgtec.com>

gold/
	* copy-relocs.h (Copy_relocs::copy_reloc): Replace reloc parameter
	with type, offset, addend.
	(Copy_relocs::save): Likewise.
	* copy-relocs.cc (Copy_relocs::copy_reloc): Likewise.
	(Copy_relocs::save): Likewise.
	* aarch64.cc (Target_aarch64::copy_reloc): Pass r_type, r_offset,
	and r_addend to Copy_relocs::copy_reloc.
	* arm.cc (Target_arm::copy_reloc): Likewise.
	* i386.cc (Target_i386::copy_reloc): Likewise.
	* mips.cc (Target_mips::copy_reloc): Likewise.
	* powerpc.cc (Target_powerpc::copy_reloc): Likewise.
	* s390.cc (Target_s390::copy_reloc): Likewise.
	* sparc.cc (Target_sparc::copy_reloc): Likewise.
	* tilegx.cc (Target_tilegx::copy_reloc): Likewise.
	* x86_64.cc (Target_x86_64::copy_reloc): Likewise.


diff --git a/gold/aarch64.cc b/gold/aarch64.cc
index bc85c83..5ca5e0a 100644
--- a/gold/aarch64.cc
+++ b/gold/aarch64.cc
@@ -3338,10 +3338,13 @@ class Target_aarch64 : public Sized_target<size, big_endian>
 	     unsigned int shndx, Output_section* output_section,
 	     Symbol* sym, const elfcpp::Rela<size, big_endian>& reloc)
   {
+    unsigned int r_type = elfcpp::elf_r_type<size>(reloc.get_r_info());
     this->copy_relocs_.copy_reloc(symtab, layout,
 				  symtab->get_sized_symbol<size>(sym),
 				  object, shndx, output_section,
-				  reloc, this->rela_dyn_section(layout));
+				  r_type, reloc.get_r_offset(),
+				  reloc.get_r_addend(),
+				  this->rela_dyn_section(layout));
   }
 
   // Information about this specific target which we pass to the
diff --git a/gold/arm.cc b/gold/arm.cc
index 2795c94..4a6d414 100644
--- a/gold/arm.cc
+++ b/gold/arm.cc
@@ -2806,9 +2806,11 @@ class Target_arm : public Sized_target<32, big_endian>
 	     unsigned int shndx, Output_section* output_section,
 	     Symbol* sym, const elfcpp::Rel<32, big_endian>& reloc)
   {
+    unsigned int r_type = elfcpp::elf_r_type<32>(reloc.get_r_info());
     this->copy_relocs_.copy_reloc(symtab, layout,
 				  symtab->get_sized_symbol<32>(sym),
-				  object, shndx, output_section, reloc,
+				  object, shndx, output_section,
+				  r_type, reloc.get_r_offset(), 0,
 				  this->rel_dyn_section(layout));
   }
 
diff --git a/gold/copy-relocs.cc b/gold/copy-relocs.cc
index a7824fe..2d03b1a 100644
--- a/gold/copy-relocs.cc
+++ b/gold/copy-relocs.cc
@@ -42,7 +42,9 @@ Copy_relocs<sh_type, size, big_endian>::copy_reloc(
     Sized_relobj_file<size, big_endian>* object,
     unsigned int shndx,
     Output_section* output_section,
-    const Reloc& rel,
+    unsigned int r_type,
+    typename elfcpp::Elf_types<size>::Elf_Addr r_offset,
+    typename elfcpp::Elf_types<size>::Elf_Swxword r_addend,
     Output_data_reloc<sh_type, true, size, big_endian>* reloc_section)
 {
   if (this->need_copy_reloc(sym, object, shndx))
@@ -51,7 +53,8 @@ Copy_relocs<sh_type, size, big_endian>::copy_reloc(
     {
       // We may not need a COPY relocation.  Save this relocation to
       // possibly be emitted later.
-      this->save(sym, object, shndx, output_section, rel);
+      this->save(sym, object, shndx, output_section,
+		 r_type, r_offset, r_addend);
     }
 }
 
@@ -176,14 +179,13 @@ Copy_relocs<sh_type, size, big_endian>::save(
     Sized_relobj_file<size, big_endian>* object,
     unsigned int shndx,
     Output_section* output_section,
-    const Reloc& rel)
+    unsigned int r_type,
+    typename elfcpp::Elf_types<size>::Elf_Addr r_offset,
+    typename elfcpp::Elf_types<size>::Elf_Swxword r_addend)
 {
-  unsigned int reloc_type = elfcpp::elf_r_type<size>(rel.get_r_info());
-  typename elfcpp::Elf_types<size>::Elf_Addr addend =
-    Reloc_types<sh_type, size, big_endian>::get_reloc_addend_noerror(&rel);
-  this->entries_.push_back(Copy_reloc_entry(sym, reloc_type, object, shndx,
-					    output_section, rel.get_r_offset(),
-					    addend));
+  this->entries_.push_back(Copy_reloc_entry(sym, r_type, object, shndx,
+					    output_section, r_offset,
+					    r_addend));
 }
 
 // Emit any saved relocs.
diff --git a/gold/copy-relocs.h b/gold/copy-relocs.h
index 6724fd9..a9a9ec1 100644
--- a/gold/copy-relocs.h
+++ b/gold/copy-relocs.h
@@ -65,10 +65,15 @@ class Copy_relocs
   // will wind up.  REL is the reloc itself.  The Output_data_reloc
   // section is where the dynamic relocs are put.
   void
-  copy_reloc(Symbol_table*, Layout*, Sized_symbol<size>* sym,
+  copy_reloc(Symbol_table*,
+	     Layout*,
+	     Sized_symbol<size>* sym,
              Sized_relobj_file<size, big_endian>* object,
-	     unsigned int shndx, Output_section* output_section,
-	     const Reloc& rel,
+	     unsigned int shndx,
+	     Output_section* output_section,
+	     unsigned int r_type,
+	     typename elfcpp::Elf_types<size>::Elf_Addr r_offset,
+	     typename elfcpp::Elf_types<size>::Elf_Swxword r_addend,
 	     Output_data_reloc<sh_type, true, size, big_endian>*);
 
   // Return whether there are any saved relocations.
@@ -135,8 +140,13 @@ class Copy_relocs
 
   // Save a reloc against SYM for possible emission later.
   void
-  save(Symbol*, Sized_relobj_file<size, big_endian>*, unsigned int shndx,
-       Output_section*, const Reloc& rel);
+  save(Symbol*,
+       Sized_relobj_file<size, big_endian>*,
+       unsigned int shndx,
+       Output_section*,
+       unsigned int r_type,
+       typename elfcpp::Elf_types<size>::Elf_Addr r_offset,
+       typename elfcpp::Elf_types<size>::Elf_Swxword r_addend);
 
   // The target specific relocation type of the COPY relocation.
   const unsigned int copy_reloc_type_;
diff --git a/gold/i386.cc b/gold/i386.cc
index 386de03..4f41be4 100644
--- a/gold/i386.cc
+++ b/gold/i386.cc
@@ -828,9 +828,11 @@ class Target_i386 : public Sized_target<32, false>
 	     unsigned int shndx, Output_section* output_section,
 	     Symbol* sym, const elfcpp::Rel<32, false>& reloc)
   {
+    unsigned int r_type = elfcpp::elf_r_type<32>(reloc.get_r_info());
     this->copy_relocs_.copy_reloc(symtab, layout,
 				  symtab->get_sized_symbol<32>(sym),
-				  object, shndx, output_section, reloc,
+				  object, shndx, output_section,
+				  r_type, reloc.get_r_offset(), 0,
 				  this->rel_dyn_section(layout));
   }
 
diff --git a/gold/mips.cc b/gold/mips.cc
index 6cfe924..051d49a 100644
--- a/gold/mips.cc
+++ b/gold/mips.cc
@@ -3602,10 +3602,12 @@ class Target_mips : public Sized_target<size, big_endian>
              unsigned int shndx, Output_section* output_section,
              Symbol* sym, const elfcpp::Rel<size, big_endian>& reloc)
   {
+    unsigned int r_type = elfcpp::elf_r_type<size>(reloc.get_r_info());
     this->copy_relocs_.copy_reloc(symtab, layout,
                                   symtab->get_sized_symbol<size>(sym),
                                   object, shndx, output_section,
-                                  reloc, this->rel_dyn_section(layout));
+				  r_type, reloc.get_r_offset(), 0,
+                                  this->rel_dyn_section(layout));
   }
 
   void
diff --git a/gold/powerpc.cc b/gold/powerpc.cc
index 28bcd56..e991371 100644
--- a/gold/powerpc.cc
+++ b/gold/powerpc.cc
@@ -1207,10 +1207,13 @@ class Target_powerpc : public Sized_target<size, big_endian>
 	     unsigned int shndx, Output_section* output_section,
 	     Symbol* sym, const elfcpp::Rela<size, big_endian>& reloc)
   {
+    unsigned int r_type = elfcpp::elf_r_type<size>(reloc.get_r_info());
     this->copy_relocs_.copy_reloc(symtab, layout,
 				  symtab->get_sized_symbol<size>(sym),
 				  object, shndx, output_section,
-				  reloc, this->rela_dyn_section(layout));
+				  r_type, reloc.get_r_offset(),
+				  reloc.get_r_addend(),
+				  this->rela_dyn_section(layout));
   }
 
   // Look over all the input sections, deciding where to place stubs.
diff --git a/gold/s390.cc b/gold/s390.cc
index 020fb15..e329703 100644
--- a/gold/s390.cc
+++ b/gold/s390.cc
@@ -681,10 +681,13 @@ class Target_s390 : public Sized_target<size, true>
 	     unsigned int shndx, Output_section* output_section,
 	     Symbol* sym, const elfcpp::Rela<size, true>& reloc)
   {
+    unsigned int r_type = elfcpp::elf_r_type<size>(reloc.get_r_info());
     this->copy_relocs_.copy_reloc(symtab, layout,
 				  symtab->get_sized_symbol<size>(sym),
 				  object, shndx, output_section,
-				  reloc, this->rela_dyn_section(layout));
+				  r_type, reloc.get_r_offset(),
+				  reloc.get_r_addend(),
+				  this->rela_dyn_section(layout));
   }
 
   // Information about this specific target which we pass to the
diff --git a/gold/sparc.cc b/gold/sparc.cc
index fc0dc81..2b11550 100644
--- a/gold/sparc.cc
+++ b/gold/sparc.cc
@@ -415,10 +415,13 @@ class Target_sparc : public Sized_target<size, big_endian>
 	     unsigned int shndx, Output_section* output_section,
 	     Symbol* sym, const elfcpp::Rela<size, big_endian>& reloc)
   {
+    unsigned int r_type = elfcpp::elf_r_type<size>(reloc.get_r_info());
     this->copy_relocs_.copy_reloc(symtab, layout,
 				  symtab->get_sized_symbol<size>(sym),
 				  object, shndx, output_section,
-				  reloc, this->rela_dyn_section(layout));
+				  r_type, reloc.get_r_offset(),
+				  reloc.get_r_addend(),
+				  this->rela_dyn_section(layout));
   }
 
   // Information about this specific target which we pass to the
diff --git a/gold/tilegx.cc b/gold/tilegx.cc
index ce449a4..b74c8c7 100644
--- a/gold/tilegx.cc
+++ b/gold/tilegx.cc
@@ -594,10 +594,13 @@ class Target_tilegx : public Sized_target<size, big_endian>
              unsigned int shndx, Output_section* output_section,
              Symbol* sym, const elfcpp::Rela<size, big_endian>& reloc)
   {
+    unsigned int r_type = elfcpp::elf_r_type<size>(reloc.get_r_info());
     this->copy_relocs_.copy_reloc(symtab, layout,
                                   symtab->get_sized_symbol<size>(sym),
                                   object, shndx, output_section,
-                                  reloc, this->rela_dyn_section(layout));
+				  r_type, reloc.get_r_offset(),
+				  reloc.get_r_addend(),
+                                  this->rela_dyn_section(layout));
   }
 
   // Information about this specific target which we pass to the
diff --git a/gold/x86_64.cc b/gold/x86_64.cc
index 3651d39..503a677 100644
--- a/gold/x86_64.cc
+++ b/gold/x86_64.cc
@@ -968,10 +968,13 @@ class Target_x86_64 : public Sized_target<size, false>
 	     unsigned int shndx, Output_section* output_section,
 	     Symbol* sym, const elfcpp::Rela<size, false>& reloc)
   {
+    unsigned int r_type = elfcpp::elf_r_type<size>(reloc.get_r_info());
     this->copy_relocs_.copy_reloc(symtab, layout,
 				  symtab->get_sized_symbol<size>(sym),
 				  object, shndx, output_section,
-				  reloc, this->rela_dyn_section(layout));
+				  r_type, reloc.get_r_offset(),
+				  reloc.get_r_addend(),
+				  this->rela_dyn_section(layout));
   }
 
   // Information about this specific target which we pass to the
