From: Cary Coutant Date: Tue, 15 Apr 2014 18:19:18 +0000 (-0700) Subject: Allow target to derive from Copy_relocs class. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=91f43acd5d692518f95a901e92dec7dbb6347564;p=binutils-gdb.git Allow target to derive from Copy_relocs class. 2014-04-15 Sasa Stankovic gold/ * copy-relocs.cc (Copy_relocs::Copy_reloc_entry::emit): Remove and inline into ... (Copy_relocs::emit): ... here. * copy-relocs.h (Copy_reloc_entry): Change from class to struct. (Copy_reloc_entry::make_copy_reloc): Change from private to protected. (Copy_reloc_entry::entries_): Change from private to protected. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index 4db6d851866..4ddef9a37d7 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,12 @@ +2014-04-15 Sasa Stankovic + + * copy-relocs.cc (Copy_relocs::Copy_reloc_entry::emit): Remove and + inline into ... + (Copy_relocs::emit): ... here. + * copy-relocs.h (Copy_reloc_entry): Change from class to struct. + (Copy_reloc_entry::make_copy_reloc): Change from private to protected. + (Copy_reloc_entry::entries_): Change from private to protected. + 2014-04-02 Sriraman Tallam * icf.cc (get_section_contents): Replace copies of reloc diff --git a/gold/copy-relocs.cc b/gold/copy-relocs.cc index 651bd1f0ef2..41b65631aad 100644 --- a/gold/copy-relocs.cc +++ b/gold/copy-relocs.cc @@ -28,25 +28,6 @@ namespace gold { -// Copy_relocs::Copy_reloc_entry methods. - -// Emit the reloc if appropriate. - -template -void -Copy_relocs::Copy_reloc_entry::emit( - Output_data_reloc* reloc_section) -{ - // If the symbol is no longer defined in a dynamic object, then we - // emitted a COPY relocation, and we do not want to emit this - // dynamic relocation. - if (this->sym_->is_from_dynobj()) - reloc_section->add_global_generic(this->sym_, this->reloc_type_, - this->output_section_, this->relobj_, - this->shndx_, this->address_, - this->addend_); -} - // Copy_relocs methods. // Handle a relocation against a symbol which may force us to generate @@ -215,7 +196,18 @@ Copy_relocs::emit( for (typename Copy_reloc_entries::iterator p = this->entries_.begin(); p != this->entries_.end(); ++p) - p->emit(reloc_section); + { + Copy_reloc_entry& entry = *p; + + // If the symbol is no longer defined in a dynamic object, then we + // emitted a COPY relocation, and we do not want to emit this + // dynamic relocation. + if (entry.sym_->is_from_dynobj()) + reloc_section->add_global_generic(entry.sym_, entry.reloc_type_, + entry.output_section_, entry.relobj_, + entry.shndx_, entry.address_, + entry.addend_); + } // We no longer need the saved information. this->entries_.clear(); diff --git a/gold/copy-relocs.h b/gold/copy-relocs.h index 2ec7a143ca6..800c0e7eddf 100644 --- a/gold/copy-relocs.h +++ b/gold/copy-relocs.h @@ -54,7 +54,7 @@ class Copy_relocs public: Copy_relocs(unsigned int copy_reloc_type) - : copy_reloc_type_(copy_reloc_type), dynbss_(NULL), entries_() + : entries_(), copy_reloc_type_(copy_reloc_type), dynbss_(NULL) { } // This is called while scanning relocs if we see a relocation @@ -87,16 +87,15 @@ class Copy_relocs Output_data*, off_t, Output_data_reloc*); - private: + protected: typedef typename elfcpp::Elf_types::Elf_Addr Address; typedef typename elfcpp::Elf_types::Elf_Addr Addend; // This POD class holds the relocations we are saving. We will emit // these relocations if it turns out that the symbol does not // require a COPY relocation. - class Copy_reloc_entry + struct Copy_reloc_entry { - public: Copy_reloc_entry(Symbol* sym, unsigned int reloc_type, Sized_relobj_file* relobj, unsigned int shndx, @@ -107,13 +106,6 @@ class Copy_relocs address_(address), addend_(addend) { } - // Emit this reloc if appropriate. This is called after we have - // scanned all the relocations, so we know whether we emitted a - // COPY relocation for SYM_. - void - emit(Output_data_reloc*); - - private: Symbol* sym_; unsigned int reloc_type_; Sized_relobj_file* relobj_; @@ -123,20 +115,24 @@ class Copy_relocs Addend addend_; }; + // Make a new COPY reloc and emit it. + void + make_copy_reloc(Symbol_table*, Layout*, Sized_symbol*, + Output_data_reloc*); + // A list of relocs to be saved. typedef std::vector Copy_reloc_entries; + // The list of relocs we are saving. + Copy_reloc_entries entries_; + + private: // Return whether we need a COPY reloc. bool need_copy_reloc(Sized_symbol* gsym, Sized_relobj_file* object, unsigned int shndx) const; - // Make a new COPY reloc and emit it. - void - make_copy_reloc(Symbol_table*, Layout*, Sized_symbol*, - Output_data_reloc*); - // Save a reloc against SYM for possible emission later. void save(Symbol*, Sized_relobj_file*, unsigned int shndx, @@ -147,8 +143,6 @@ class Copy_relocs // The dynamic BSS data which goes into the .bss section. This is // where variables which require COPY relocations are placed. Output_data_space* dynbss_; - // The list of relocs we are saving. - Copy_reloc_entries entries_; }; } // End namespace gold.