From 859d79870d7975ef8d98ea728ee52a264efe7d1e Mon Sep 17 00:00:00 2001 From: Cary Coutant Date: Mon, 9 Nov 2015 08:43:46 -0800 Subject: [PATCH] Remove unnecessary target dependencies on relocation format. 2015-11-09 Cary Coutant Vladimir Radosavljevic 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. --- gold/ChangeLog | 19 +++++++++++++++++++ gold/aarch64.cc | 5 ++++- gold/arm.cc | 4 +++- gold/copy-relocs.cc | 20 +++++++++++--------- gold/copy-relocs.h | 20 +++++++++++++++----- gold/i386.cc | 4 +++- gold/mips.cc | 4 +++- gold/powerpc.cc | 5 ++++- gold/s390.cc | 5 ++++- gold/sparc.cc | 5 ++++- gold/tilegx.cc | 5 ++++- gold/x86_64.cc | 5 ++++- 12 files changed, 78 insertions(+), 23 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 7996229c8fa..6013ba3b367 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,22 @@ +2015-11-09 Cary Coutant + Vladimir Radosavljevic + + * 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. + 2015-11-05 Cary Coutant PR gold/19119 diff --git a/gold/aarch64.cc b/gold/aarch64.cc index bc85c833415..5ca5e0accff 100644 --- a/gold/aarch64.cc +++ b/gold/aarch64.cc @@ -3338,10 +3338,13 @@ class Target_aarch64 : public Sized_target unsigned int shndx, Output_section* output_section, Symbol* sym, const elfcpp::Rela& reloc) { + unsigned int r_type = elfcpp::elf_r_type(reloc.get_r_info()); this->copy_relocs_.copy_reloc(symtab, layout, symtab->get_sized_symbol(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 2795c943c64..4a6d4144320 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 a7824fe36a2..2d03b1a01b6 100644 --- a/gold/copy-relocs.cc +++ b/gold/copy-relocs.cc @@ -42,7 +42,9 @@ Copy_relocs::copy_reloc( Sized_relobj_file* object, unsigned int shndx, Output_section* output_section, - const Reloc& rel, + unsigned int r_type, + typename elfcpp::Elf_types::Elf_Addr r_offset, + typename elfcpp::Elf_types::Elf_Swxword r_addend, Output_data_reloc* reloc_section) { if (this->need_copy_reloc(sym, object, shndx)) @@ -51,7 +53,8 @@ Copy_relocs::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::save( Sized_relobj_file* object, unsigned int shndx, Output_section* output_section, - const Reloc& rel) + unsigned int r_type, + typename elfcpp::Elf_types::Elf_Addr r_offset, + typename elfcpp::Elf_types::Elf_Swxword r_addend) { - unsigned int reloc_type = elfcpp::elf_r_type(rel.get_r_info()); - typename elfcpp::Elf_types::Elf_Addr addend = - Reloc_types::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 6724fd9d3b4..a9a9ec172ca 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* sym, + copy_reloc(Symbol_table*, + Layout*, + Sized_symbol* sym, Sized_relobj_file* 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::Elf_Addr r_offset, + typename elfcpp::Elf_types::Elf_Swxword r_addend, Output_data_reloc*); // 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*, unsigned int shndx, - Output_section*, const Reloc& rel); + save(Symbol*, + Sized_relobj_file*, + unsigned int shndx, + Output_section*, + unsigned int r_type, + typename elfcpp::Elf_types::Elf_Addr r_offset, + typename elfcpp::Elf_types::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 386de03cfe1..4f41be4a617 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 6cfe924ecd5..051d49a1d3f 100644 --- a/gold/mips.cc +++ b/gold/mips.cc @@ -3602,10 +3602,12 @@ class Target_mips : public Sized_target unsigned int shndx, Output_section* output_section, Symbol* sym, const elfcpp::Rel& reloc) { + unsigned int r_type = elfcpp::elf_r_type(reloc.get_r_info()); this->copy_relocs_.copy_reloc(symtab, layout, symtab->get_sized_symbol(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 28bcd56ad55..e9913716995 100644 --- a/gold/powerpc.cc +++ b/gold/powerpc.cc @@ -1207,10 +1207,13 @@ class Target_powerpc : public Sized_target unsigned int shndx, Output_section* output_section, Symbol* sym, const elfcpp::Rela& reloc) { + unsigned int r_type = elfcpp::elf_r_type(reloc.get_r_info()); this->copy_relocs_.copy_reloc(symtab, layout, symtab->get_sized_symbol(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 020fb15c973..e329703c383 100644 --- a/gold/s390.cc +++ b/gold/s390.cc @@ -681,10 +681,13 @@ class Target_s390 : public Sized_target unsigned int shndx, Output_section* output_section, Symbol* sym, const elfcpp::Rela& reloc) { + unsigned int r_type = elfcpp::elf_r_type(reloc.get_r_info()); this->copy_relocs_.copy_reloc(symtab, layout, symtab->get_sized_symbol(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 fc0dc811808..2b11550e098 100644 --- a/gold/sparc.cc +++ b/gold/sparc.cc @@ -415,10 +415,13 @@ class Target_sparc : public Sized_target unsigned int shndx, Output_section* output_section, Symbol* sym, const elfcpp::Rela& reloc) { + unsigned int r_type = elfcpp::elf_r_type(reloc.get_r_info()); this->copy_relocs_.copy_reloc(symtab, layout, symtab->get_sized_symbol(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 ce449a425b5..b74c8c749d7 100644 --- a/gold/tilegx.cc +++ b/gold/tilegx.cc @@ -594,10 +594,13 @@ class Target_tilegx : public Sized_target unsigned int shndx, Output_section* output_section, Symbol* sym, const elfcpp::Rela& reloc) { + unsigned int r_type = elfcpp::elf_r_type(reloc.get_r_info()); this->copy_relocs_.copy_reloc(symtab, layout, symtab->get_sized_symbol(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 3651d398ff6..503a677a00e 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -968,10 +968,13 @@ class Target_x86_64 : public Sized_target unsigned int shndx, Output_section* output_section, Symbol* sym, const elfcpp::Rela& reloc) { + unsigned int r_type = elfcpp::elf_r_type(reloc.get_r_info()); this->copy_relocs_.copy_reloc(symtab, layout, symtab->get_sized_symbol(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 -- 2.30.2