From 72adc4fad75cca8235786832069b26e7ae3ba5cf Mon Sep 17 00:00:00 2001 From: Doug Kwan Date: Sun, 25 Oct 2009 16:57:32 +0000 Subject: [PATCH] 2009-10-25 Doug Kwan * arm.cc (Arm_output_section, Arm_relobj): Forward class declarations. (Arm_input_section::as_arm_input_section): New method. (Arm_output_section): New class definition. (Arm_output_section::create_stub_group, Arm_output_section::group_sections): New method definitions. --- gold/ChangeLog | 10 ++++++++++ gold/object.h | 38 +++++++++++++++++++++++--------------- gold/reloc.cc | 46 +++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 78 insertions(+), 16 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 7799d6c44a..b2578451b3 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,13 @@ +2009-10-25 Doug Kwan + + * object.h (Sized_relobj::View_size, Sized_relobj::Views): Change + from private to protected to allow access by child class. + (Sized_relobj::do_relocate_sections): New method declaration. + (Sized_relobj::relocate_sections): Virtualize. + * reloc.cc (Sized_relobj::do_relocate_sections): Rename from + Sized_relobj::relocate_sections. Instantiate template explicitly + for different target sizes and endianity. + 2009-10-24 Doug Kwan * arm.cc (Arm_output_section, Arm_relobj): Forward class declarations. diff --git a/gold/object.h b/gold/object.h index ff9668291f..0d4039761c 100644 --- a/gold/object.h +++ b/gold/object.h @@ -1648,6 +1648,25 @@ class Sized_relobj : public Relobj local_values() { return &this->local_values_; } + // Views and sizes when relocating. + struct View_size + { + unsigned char* view; + typename elfcpp::Elf_types::Elf_Addr address; + off_t offset; + section_size_type view_size; + bool is_input_output_view; + bool is_postprocessing_view; + }; + + typedef std::vector Views; + + // This may be overriden by a child class. + virtual void + do_relocate_sections(const General_options& options, + const Symbol_table* symtab, const Layout* layout, + const unsigned char* pshdrs, Views* pviews); + private: // For convenience. typedef Sized_relobj This; @@ -1702,19 +1721,6 @@ class Sized_relobj : public Relobj typename This::Shdr& shdr, unsigned int reloc_shndx, unsigned int reloc_type); - // Views and sizes when relocating. - struct View_size - { - unsigned char* view; - typename elfcpp::Elf_types::Elf_Addr address; - off_t offset; - section_size_type view_size; - bool is_input_output_view; - bool is_postprocessing_view; - }; - - typedef std::vector Views; - // Write section data to the output file. Record the views and // sizes in VIEWS for use when relocating. void @@ -1722,8 +1728,10 @@ class Sized_relobj : public Relobj // Relocate the sections in the output file. void - relocate_sections(const General_options& options, const Symbol_table*, - const Layout*, const unsigned char* pshdrs, Views*); + relocate_sections(const General_options& options, const Symbol_table* symtab, + const Layout* layout, const unsigned char* pshdrs, + Views* pviews) + { this->do_relocate_sections(options, symtab, layout, pshdrs, pviews); } // Scan the input relocations for --emit-relocs. void diff --git a/gold/reloc.cc b/gold/reloc.cc index 3018dc3daf..0d4f0691df 100644 --- a/gold/reloc.cc +++ b/gold/reloc.cc @@ -799,7 +799,7 @@ Sized_relobj::write_sections(const unsigned char* pshdrs, template void -Sized_relobj::relocate_sections( +Sized_relobj::do_relocate_sections( const General_options& options, const Symbol_table* symtab, const Layout* layout, @@ -1536,6 +1536,50 @@ Sized_relobj<64, true>::do_relocate(const General_options& options, Output_file* of); #endif +#ifdef HAVE_TARGET_32_LITTLE +template +void +Sized_relobj<32, false>::do_relocate_sections( + const General_options& options, + const Symbol_table* symtab, + const Layout* layout, + const unsigned char* pshdrs, + Views* pviews); +#endif + +#ifdef HAVE_TARGET_32_BIG +template +void +Sized_relobj<32, true>::do_relocate_sections( + const General_options& options, + const Symbol_table* symtab, + const Layout* layout, + const unsigned char* pshdrs, + Views* pviews); +#endif + +#ifdef HAVE_TARGET_64_LITTLE +template +void +Sized_relobj<64, false>::do_relocate_sections( + const General_options& options, + const Symbol_table* symtab, + const Layout* layout, + const unsigned char* pshdrs, + Views* pviews); +#endif + +#ifdef HAVE_TARGET_64_BIG +template +void +Sized_relobj<64, true>::do_relocate_sections( + const General_options& options, + const Symbol_table* symtab, + const Layout* layout, + const unsigned char* pshdrs, + Views* pviews); +#endif + #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG) template class Merged_symbol_value<32>; -- 2.34.1