diff options
-rw-r--r-- | lld/ELF/InputSection.cpp | 4 | ||||
-rw-r--r-- | lld/ELF/LinkerScript.cpp | 2 | ||||
-rw-r--r-- | lld/ELF/OutputSections.cpp | 2 | ||||
-rw-r--r-- | lld/ELF/SyntheticSections.cpp | 96 | ||||
-rw-r--r-- | lld/ELF/SyntheticSections.h | 78 | ||||
-rw-r--r-- | lld/ELF/Writer.cpp | 9 |
6 files changed, 86 insertions, 105 deletions
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 064f12fbf51..a0660194d60 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -88,7 +88,7 @@ InputSectionBase::InputSectionBase(elf::ObjectFile<ELFT> *File, } template <class ELFT> size_t InputSectionBase::getSize() const { - if (auto *S = dyn_cast<SyntheticSection<ELFT>>(this)) + if (auto *S = dyn_cast<SyntheticSection>(this)) return S->getSize(); return Data.size(); @@ -545,7 +545,7 @@ template <class ELFT> void InputSection::writeTo(uint8_t *Buf) { if (this->Type == SHT_NOBITS) return; - if (auto *S = dyn_cast<SyntheticSection<ELFT>>(this)) { + if (auto *S = dyn_cast<SyntheticSection>(this)) { S->writeTo(Buf + OutSecOff); return; } diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index 3b045f08555..04df93b1100 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -490,7 +490,7 @@ template <class ELFT> void LinkerScript<ELFT>::process(BaseCommand &Base) { // empty ones afterwards (because there is no way to know whether they were // going be empty or not other than actually running linker scripts.) // We need to ignore remains of empty sections. - if (auto *Sec = dyn_cast<SyntheticSection<ELFT>>(ID)) + if (auto *Sec = dyn_cast<SyntheticSection>(ID)) if (Sec->empty()) continue; diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index 89bc4408fd0..39b2fe08257 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -137,7 +137,7 @@ template <class ELFT> void OutputSection::finalize() { return; InputSection *First = Sections[0]; - if (isa<SyntheticSection<ELFT>>(First)) + if (isa<SyntheticSection>(First)) return; this->Link = In<ELFT>::SymTab->OutSec->SectionIndex; diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index 1d8825773f9..9f66c12193d 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -45,6 +45,12 @@ using namespace llvm::support::endian; using namespace lld; using namespace lld::elf; +uint64_t SyntheticSection::getVA() const { + if (this->OutSec) + return this->OutSec->Addr + this->OutSecOff; + return 0; +} + template <class ELFT> static std::vector<DefinedCommon *> getCommonSymbols() { std::vector<DefinedCommon *> V; for (Symbol *S : Symtab<ELFT>::X->getSymbols()) @@ -118,7 +124,7 @@ template <class ELFT> MergeInputSection<ELFT> *elf::createCommentSection() { // .MIPS.abiflags section. template <class ELFT> MipsAbiFlagsSection<ELFT>::MipsAbiFlagsSection(Elf_Mips_ABIFlags Flags) - : SyntheticSection<ELFT>(SHF_ALLOC, SHT_MIPS_ABIFLAGS, 8, ".MIPS.abiflags"), + : SyntheticSection(SHF_ALLOC, SHT_MIPS_ABIFLAGS, 8, ".MIPS.abiflags"), Flags(Flags) {} template <class ELFT> void MipsAbiFlagsSection<ELFT>::writeTo(uint8_t *Buf) { @@ -175,7 +181,7 @@ MipsAbiFlagsSection<ELFT> *MipsAbiFlagsSection<ELFT>::create() { // .MIPS.options section. template <class ELFT> MipsOptionsSection<ELFT>::MipsOptionsSection(Elf_Mips_RegInfo Reginfo) - : SyntheticSection<ELFT>(SHF_ALLOC, SHT_MIPS_OPTIONS, 8, ".MIPS.options"), + : SyntheticSection(SHF_ALLOC, SHT_MIPS_OPTIONS, 8, ".MIPS.options"), Reginfo(Reginfo) {} template <class ELFT> void MipsOptionsSection<ELFT>::writeTo(uint8_t *Buf) { @@ -235,7 +241,7 @@ MipsOptionsSection<ELFT> *MipsOptionsSection<ELFT>::create() { // MIPS .reginfo section. template <class ELFT> MipsReginfoSection<ELFT>::MipsReginfoSection(Elf_Mips_RegInfo Reginfo) - : SyntheticSection<ELFT>(SHF_ALLOC, SHT_MIPS_REGINFO, 4, ".reginfo"), + : SyntheticSection(SHF_ALLOC, SHT_MIPS_REGINFO, 4, ".reginfo"), Reginfo(Reginfo) {} template <class ELFT> void MipsReginfoSection<ELFT>::writeTo(uint8_t *Buf) { @@ -317,7 +323,7 @@ static size_t getHashSize() { template <class ELFT> BuildIdSection<ELFT>::BuildIdSection() - : SyntheticSection<ELFT>(SHF_ALLOC, SHT_NOTE, 1, ".note.gnu.build-id"), + : SyntheticSection(SHF_ALLOC, SHT_NOTE, 1, ".note.gnu.build-id"), HashSize(getHashSize()) {} template <class ELFT> void BuildIdSection<ELFT>::writeTo(uint8_t *Buf) { @@ -363,8 +369,8 @@ void BuildIdSection<ELFT>::computeHash( template <class ELFT> CopyRelSection<ELFT>::CopyRelSection(bool ReadOnly, uintX_t AddrAlign, size_t S) - : SyntheticSection<ELFT>(SHF_ALLOC, SHT_NOBITS, AddrAlign, - ReadOnly ? ".bss.rel.ro" : ".bss"), + : SyntheticSection(SHF_ALLOC, SHT_NOBITS, AddrAlign, + ReadOnly ? ".bss.rel.ro" : ".bss"), Size(S) { if (!ReadOnly) this->Flags |= SHF_WRITE; @@ -402,7 +408,7 @@ void BuildIdSection<ELFT>::writeBuildId(ArrayRef<uint8_t> Buf) { template <class ELFT> EhFrameSection<ELFT>::EhFrameSection() - : SyntheticSection<ELFT>(SHF_ALLOC, SHT_PROGBITS, 1, ".eh_frame") {} + : SyntheticSection(SHF_ALLOC, SHT_PROGBITS, 1, ".eh_frame") {} // Search for an existing CIE record or create a new one. // CIE records from input object files are uniquified by their contents @@ -606,8 +612,8 @@ template <class ELFT> void EhFrameSection<ELFT>::writeTo(uint8_t *Buf) { template <class ELFT> GotSection<ELFT>::GotSection() - : SyntheticSection<ELFT>(SHF_ALLOC | SHF_WRITE, SHT_PROGBITS, - Target->GotEntrySize, ".got") {} + : SyntheticSection(SHF_ALLOC | SHF_WRITE, SHT_PROGBITS, + Target->GotEntrySize, ".got") {} template <class ELFT> void GotSection<ELFT>::addEntry(SymbolBody &Sym) { Sym.GotIndex = NumEntries; @@ -661,8 +667,8 @@ template <class ELFT> void GotSection<ELFT>::writeTo(uint8_t *Buf) { template <class ELFT> MipsGotSection<ELFT>::MipsGotSection() - : SyntheticSection<ELFT>(SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL, - SHT_PROGBITS, 16, ".got") {} + : SyntheticSection(SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL, SHT_PROGBITS, 16, + ".got") {} template <class ELFT> void MipsGotSection<ELFT>::addEntry(SymbolBody &Sym, int64_t Addend, @@ -922,8 +928,8 @@ template <class ELFT> void MipsGotSection<ELFT>::writeTo(uint8_t *Buf) { template <class ELFT> GotPltSection<ELFT>::GotPltSection() - : SyntheticSection<ELFT>(SHF_ALLOC | SHF_WRITE, SHT_PROGBITS, - Target->GotPltEntrySize, ".got.plt") {} + : SyntheticSection(SHF_ALLOC | SHF_WRITE, SHT_PROGBITS, + Target->GotPltEntrySize, ".got.plt") {} template <class ELFT> void GotPltSection<ELFT>::addEntry(SymbolBody &Sym) { Sym.GotPltIndex = Target->GotPltHeaderEntriesNum + Entries.size(); @@ -948,10 +954,9 @@ template <class ELFT> void GotPltSection<ELFT>::writeTo(uint8_t *Buf) { // part of the .got.plt template <class ELFT> IgotPltSection<ELFT>::IgotPltSection() - : SyntheticSection<ELFT>(SHF_ALLOC | SHF_WRITE, SHT_PROGBITS, - Target->GotPltEntrySize, - Config->EMachine == EM_ARM ? ".got" : ".got.plt") { -} + : SyntheticSection(SHF_ALLOC | SHF_WRITE, SHT_PROGBITS, + Target->GotPltEntrySize, + Config->EMachine == EM_ARM ? ".got" : ".got.plt") {} template <class ELFT> void IgotPltSection<ELFT>::addEntry(SymbolBody &Sym) { Sym.IsInIgot = true; @@ -972,8 +977,7 @@ template <class ELFT> void IgotPltSection<ELFT>::writeTo(uint8_t *Buf) { template <class ELFT> StringTableSection<ELFT>::StringTableSection(StringRef Name, bool Dynamic) - : SyntheticSection<ELFT>(Dynamic ? (uintX_t)SHF_ALLOC : 0, SHT_STRTAB, 1, - Name), + : SyntheticSection(Dynamic ? (uintX_t)SHF_ALLOC : 0, SHT_STRTAB, 1, Name), Dynamic(Dynamic) { // ELF string tables start with a NUL byte. addString(""); @@ -1010,8 +1014,8 @@ static unsigned getVerDefNum() { return Config->VersionDefinitions.size() + 1; } template <class ELFT> DynamicSection<ELFT>::DynamicSection() - : SyntheticSection<ELFT>(SHF_ALLOC | SHF_WRITE, SHT_DYNAMIC, - sizeof(uintX_t), ".dynamic") { + : SyntheticSection(SHF_ALLOC | SHF_WRITE, SHT_DYNAMIC, sizeof(uintX_t), + ".dynamic") { this->Entsize = ELFT::Is64Bits ? 16 : 8; // .dynamic section is not writable on MIPS. // See "Special Section" in Chapter 4 in the following document: @@ -1199,8 +1203,8 @@ template <class ELFT> uint32_t DynamicReloc<ELFT>::getSymIndex() const { template <class ELFT> RelocationSection<ELFT>::RelocationSection(StringRef Name, bool Sort) - : SyntheticSection<ELFT>(SHF_ALLOC, Config->Rela ? SHT_RELA : SHT_REL, - sizeof(uintX_t), Name), + : SyntheticSection(SHF_ALLOC, Config->Rela ? SHT_RELA : SHT_REL, + sizeof(uintX_t), Name), Sort(Sort) { this->Entsize = Config->Rela ? sizeof(Elf_Rela) : sizeof(Elf_Rel); } @@ -1266,10 +1270,10 @@ template <class ELFT> void RelocationSection<ELFT>::finalize() { template <class ELFT> SymbolTableSection<ELFT>::SymbolTableSection( StringTableSection<ELFT> &StrTabSec) - : SyntheticSection<ELFT>(StrTabSec.isDynamic() ? (uintX_t)SHF_ALLOC : 0, - StrTabSec.isDynamic() ? SHT_DYNSYM : SHT_SYMTAB, - sizeof(uintX_t), - StrTabSec.isDynamic() ? ".dynsym" : ".symtab"), + : SyntheticSection(StrTabSec.isDynamic() ? (uintX_t)SHF_ALLOC : 0, + StrTabSec.isDynamic() ? SHT_DYNSYM : SHT_SYMTAB, + sizeof(uintX_t), + StrTabSec.isDynamic() ? ".dynsym" : ".symtab"), StrTabSec(StrTabSec) { this->Entsize = sizeof(Elf_Sym); } @@ -1470,8 +1474,7 @@ SymbolTableSection<ELFT>::getOutputSection(SymbolBody *Sym) { template <class ELFT> GnuHashTableSection<ELFT>::GnuHashTableSection() - : SyntheticSection<ELFT>(SHF_ALLOC, SHT_GNU_HASH, sizeof(uintX_t), - ".gnu.hash") { + : SyntheticSection(SHF_ALLOC, SHT_GNU_HASH, sizeof(uintX_t), ".gnu.hash") { this->Entsize = ELFT::Is64Bits ? 0 : 4; } @@ -1618,7 +1621,7 @@ void GnuHashTableSection<ELFT>::addSymbols(std::vector<SymbolTableEntry> &V) { template <class ELFT> HashTableSection<ELFT>::HashTableSection() - : SyntheticSection<ELFT>(SHF_ALLOC, SHT_HASH, sizeof(Elf_Word), ".hash") { + : SyntheticSection(SHF_ALLOC, SHT_HASH, sizeof(Elf_Word), ".hash") { this->Entsize = sizeof(Elf_Word); } @@ -1657,8 +1660,7 @@ template <class ELFT> void HashTableSection<ELFT>::writeTo(uint8_t *Buf) { template <class ELFT> PltSection<ELFT>::PltSection(size_t S) - : SyntheticSection<ELFT>(SHF_ALLOC | SHF_EXECINSTR, SHT_PROGBITS, 16, - ".plt"), + : SyntheticSection(SHF_ALLOC | SHF_EXECINSTR, SHT_PROGBITS, 16, ".plt"), HeaderSize(S) {} template <class ELFT> void PltSection<ELFT>::writeTo(uint8_t *Buf) { @@ -1714,7 +1716,7 @@ template <class ELFT> unsigned PltSection<ELFT>::getPltRelocOff() const { template <class ELFT> GdbIndexSection<ELFT>::GdbIndexSection() - : SyntheticSection<ELFT>(0, SHT_PROGBITS, 1, ".gdb_index"), + : SyntheticSection(0, SHT_PROGBITS, 1, ".gdb_index"), StringPool(llvm::StringTableBuilder::ELF) {} template <class ELFT> void GdbIndexSection<ELFT>::parseDebugSections() { @@ -1858,7 +1860,7 @@ template <class ELFT> bool GdbIndexSection<ELFT>::empty() const { template <class ELFT> EhFrameHeader<ELFT>::EhFrameHeader() - : SyntheticSection<ELFT>(SHF_ALLOC, SHT_PROGBITS, 1, ".eh_frame_hdr") {} + : SyntheticSection(SHF_ALLOC, SHT_PROGBITS, 1, ".eh_frame_hdr") {} // .eh_frame_hdr contains a binary search table of pointers to FDEs. // Each entry of the search table consists of two values, @@ -1907,8 +1909,8 @@ template <class ELFT> bool EhFrameHeader<ELFT>::empty() const { template <class ELFT> VersionDefinitionSection<ELFT>::VersionDefinitionSection() - : SyntheticSection<ELFT>(SHF_ALLOC, SHT_GNU_verdef, sizeof(uint32_t), - ".gnu.version_d") {} + : SyntheticSection(SHF_ALLOC, SHT_GNU_verdef, sizeof(uint32_t), + ".gnu.version_d") {} static StringRef getFileDefName() { if (!Config->SoName.empty()) @@ -1966,8 +1968,8 @@ template <class ELFT> size_t VersionDefinitionSection<ELFT>::getSize() const { template <class ELFT> VersionTableSection<ELFT>::VersionTableSection() - : SyntheticSection<ELFT>(SHF_ALLOC, SHT_GNU_versym, sizeof(uint16_t), - ".gnu.version") {} + : SyntheticSection(SHF_ALLOC, SHT_GNU_versym, sizeof(uint16_t), + ".gnu.version") {} template <class ELFT> void VersionTableSection<ELFT>::finalize() { this->OutSec->Entsize = this->Entsize = sizeof(Elf_Versym); @@ -1994,8 +1996,8 @@ template <class ELFT> bool VersionTableSection<ELFT>::empty() const { template <class ELFT> VersionNeedSection<ELFT>::VersionNeedSection() - : SyntheticSection<ELFT>(SHF_ALLOC, SHT_GNU_verneed, sizeof(uint32_t), - ".gnu.version_r") { + : SyntheticSection(SHF_ALLOC, SHT_GNU_verneed, sizeof(uint32_t), + ".gnu.version_r") { // Identifiers in verneed section start at 2 because 0 and 1 are reserved // for VER_NDX_LOCAL and VER_NDX_GLOBAL. // First identifiers are reserved by verdef section if it exist. @@ -2084,7 +2086,7 @@ template <class ELFT> MergeSyntheticSection<ELFT>::MergeSyntheticSection(StringRef Name, uint32_t Type, uintX_t Flags, uintX_t Alignment) - : SyntheticSection<ELFT>(Flags, Type, Alignment, Name), + : SyntheticSection(Flags, Type, Alignment, Name), Builder(StringTableBuilder::RAW, Alignment) {} template <class ELFT> @@ -2154,8 +2156,8 @@ template <class ELFT> size_t MergeSyntheticSection<ELFT>::getSize() const { template <class ELFT> MipsRldMapSection<ELFT>::MipsRldMapSection() - : SyntheticSection<ELFT>(SHF_ALLOC | SHF_WRITE, SHT_PROGBITS, - sizeof(typename ELFT::uint), ".rld_map") {} + : SyntheticSection(SHF_ALLOC | SHF_WRITE, SHT_PROGBITS, + sizeof(typename ELFT::uint), ".rld_map") {} template <class ELFT> void MipsRldMapSection<ELFT>::writeTo(uint8_t *Buf) { // Apply filler from linker script. @@ -2166,8 +2168,8 @@ template <class ELFT> void MipsRldMapSection<ELFT>::writeTo(uint8_t *Buf) { template <class ELFT> ARMExidxSentinelSection<ELFT>::ARMExidxSentinelSection() - : SyntheticSection<ELFT>(SHF_ALLOC | SHF_LINK_ORDER, SHT_ARM_EXIDX, - sizeof(typename ELFT::uint), ".ARM.exidx") {} + : SyntheticSection(SHF_ALLOC | SHF_LINK_ORDER, SHT_ARM_EXIDX, + sizeof(typename ELFT::uint), ".ARM.exidx") {} // Write a terminating sentinel entry to the end of the .ARM.exidx table. // This section will have been sorted last in the .ARM.exidx table. @@ -2188,8 +2190,8 @@ void ARMExidxSentinelSection<ELFT>::writeTo(uint8_t *Buf) { template <class ELFT> ThunkSection<ELFT>::ThunkSection(OutputSection *OS, uint64_t Off) - : SyntheticSection<ELFT>(SHF_ALLOC | SHF_EXECINSTR, SHT_PROGBITS, - sizeof(typename ELFT::uint), ".text.thunk") { + : SyntheticSection(SHF_ALLOC | SHF_EXECINSTR, SHT_PROGBITS, + sizeof(typename ELFT::uint), ".text.thunk") { this->OutSec = OS; this->OutSecOff = Off; } diff --git a/lld/ELF/SyntheticSections.h b/lld/ELF/SyntheticSections.h index 88b1dd29231..513a70f3a40 100644 --- a/lld/ELF/SyntheticSections.h +++ b/lld/ELF/SyntheticSections.h @@ -30,11 +30,9 @@ namespace lld { namespace elf { -template <class ELFT> class SyntheticSection : public InputSection { - typedef typename ELFT::uint uintX_t; - +class SyntheticSection : public InputSection { public: - SyntheticSection(uintX_t Flags, uint32_t Type, uintX_t Addralign, + SyntheticSection(uint64_t Flags, uint32_t Type, uint64_t Addralign, StringRef Name) : InputSection(Flags, Type, Addralign, {}, Name, InputSectionBase::Synthetic) { @@ -46,10 +44,7 @@ public: virtual size_t getSize() const = 0; virtual void finalize() {} virtual bool empty() const { return false; } - - uintX_t getVA() const { - return this->OutSec ? this->OutSec->Addr + this->OutSecOff : 0; - } + uint64_t getVA() const; static bool classof(const InputSectionBase *D) { return D->kind() == InputSectionBase::Synthetic; @@ -62,8 +57,7 @@ struct CieRecord { }; // Section for .eh_frame. -template <class ELFT> -class EhFrameSection final : public SyntheticSection<ELFT> { +template <class ELFT> class EhFrameSection final : public SyntheticSection { typedef typename ELFT::uint uintX_t; typedef typename ELFT::Shdr Elf_Shdr; typedef typename ELFT::Rel Elf_Rel; @@ -105,7 +99,7 @@ private: llvm::DenseMap<std::pair<ArrayRef<uint8_t>, SymbolBody *>, CieRecord> CieMap; }; -template <class ELFT> class GotSection final : public SyntheticSection<ELFT> { +template <class ELFT> class GotSection final : public SyntheticSection { typedef typename ELFT::uint uintX_t; public: @@ -135,7 +129,7 @@ private: }; // .note.gnu.build-id section. -template <class ELFT> class BuildIdSection : public SyntheticSection<ELFT> { +template <class ELFT> class BuildIdSection : public SyntheticSection { // First 16 bytes are a header. static const unsigned HeaderSize = 16; @@ -155,8 +149,7 @@ private: // For each copy relocation, we create an instance of this class to // reserve space in .bss or .bss.rel.ro. -template <class ELFT> -class CopyRelSection final : public SyntheticSection<ELFT> { +template <class ELFT> class CopyRelSection final : public SyntheticSection { typedef typename ELFT::uint uintX_t; public: @@ -166,8 +159,7 @@ public: size_t Size; }; -template <class ELFT> -class MipsGotSection final : public SyntheticSection<ELFT> { +template <class ELFT> class MipsGotSection final : public SyntheticSection { typedef typename ELFT::uint uintX_t; public: @@ -266,8 +258,7 @@ private: uintX_t Size = 0; }; -template <class ELFT> -class GotPltSection final : public SyntheticSection<ELFT> { +template <class ELFT> class GotPltSection final : public SyntheticSection { typedef typename ELFT::uint uintX_t; public: @@ -285,8 +276,7 @@ private: // Symbols that will be relocated by Target->IRelativeRel. // On most Targets the IgotPltSection will immediately follow the GotPltSection // on ARM the IgotPltSection will immediately follow the GotSection. -template <class ELFT> -class IgotPltSection final : public SyntheticSection<ELFT> { +template <class ELFT> class IgotPltSection final : public SyntheticSection { typedef typename ELFT::uint uintX_t; public: @@ -300,8 +290,7 @@ private: std::vector<const SymbolBody *> Entries; }; -template <class ELFT> -class StringTableSection final : public SyntheticSection<ELFT> { +template <class ELFT> class StringTableSection final : public SyntheticSection { public: typedef typename ELFT::uint uintX_t; StringTableSection(StringRef Name, bool Dynamic); @@ -344,8 +333,7 @@ private: int64_t Addend; }; -template <class ELFT> -class DynamicSection final : public SyntheticSection<ELFT> { +template <class ELFT> class DynamicSection final : public SyntheticSection { typedef typename ELFT::Dyn Elf_Dyn; typedef typename ELFT::Rel Elf_Rel; typedef typename ELFT::Rela Elf_Rela; @@ -392,8 +380,7 @@ private: uintX_t Size = 0; }; -template <class ELFT> -class RelocationSection final : public SyntheticSection<ELFT> { +template <class ELFT> class RelocationSection final : public SyntheticSection { typedef typename ELFT::Rel Elf_Rel; typedef typename ELFT::Rela Elf_Rela; typedef typename ELFT::uint uintX_t; @@ -419,8 +406,7 @@ struct SymbolTableEntry { size_t StrTabOffset; }; -template <class ELFT> -class SymbolTableSection final : public SyntheticSection<ELFT> { +template <class ELFT> class SymbolTableSection final : public SyntheticSection { public: typedef typename ELFT::Shdr Elf_Shdr; typedef typename ELFT::Sym Elf_Sym; @@ -456,7 +442,7 @@ private: // Outputs GNU Hash section. For detailed explanation see: // https://blogs.oracle.com/ali/entry/gnu_hash_elf_sections template <class ELFT> -class GnuHashTableSection final : public SyntheticSection<ELFT> { +class GnuHashTableSection final : public SyntheticSection { typedef typename ELFT::Off Elf_Off; typedef typename ELFT::Word Elf_Word; typedef typename ELFT::uint uintX_t; @@ -493,8 +479,7 @@ private: uintX_t Size = 0; }; -template <class ELFT> -class HashTableSection final : public SyntheticSection<ELFT> { +template <class ELFT> class HashTableSection final : public SyntheticSection { typedef typename ELFT::Word Elf_Word; public: @@ -511,7 +496,7 @@ private: // header as its first entry that is used at run-time to resolve lazy binding. // The latter is used for GNU Ifunc symbols, that will be subject to a // Target->IRelativeRel. -template <class ELFT> class PltSection : public SyntheticSection<ELFT> { +template <class ELFT> class PltSection : public SyntheticSection { public: PltSection(size_t HeaderSize); void writeTo(uint8_t *Buf) override; @@ -529,8 +514,7 @@ private: size_t HeaderSize; }; -template <class ELFT> -class GdbIndexSection final : public SyntheticSection<ELFT> { +template <class ELFT> class GdbIndexSection final : public SyntheticSection { typedef typename ELFT::uint uintX_t; const unsigned OffsetTypeSize = 4; @@ -582,8 +566,7 @@ private: // Detailed info about internals can be found in Ian Lance Taylor's blog: // http://www.airs.com/blog/archives/460 (".eh_frame") // http://www.airs.com/blog/archives/462 (".eh_frame_hdr") -template <class ELFT> -class EhFrameHeader final : public SyntheticSection<ELFT> { +template <class ELFT> class EhFrameHeader final : public SyntheticSection { typedef typename ELFT::uint uintX_t; public: @@ -611,7 +594,7 @@ private: // The section shall contain an array of Elf_Verdef structures, optionally // followed by an array of Elf_Verdaux structures. template <class ELFT> -class VersionDefinitionSection final : public SyntheticSection<ELFT> { +class VersionDefinitionSection final : public SyntheticSection { typedef typename ELFT::Verdef Elf_Verdef; typedef typename ELFT::Verdaux Elf_Verdaux; @@ -634,7 +617,7 @@ private: // The values 0 and 1 are reserved. All other values are used for versions in // the own object or in any of the dependencies. template <class ELFT> -class VersionTableSection final : public SyntheticSection<ELFT> { +class VersionTableSection final : public SyntheticSection { typedef typename ELFT::Versym Elf_Versym; public: @@ -650,8 +633,7 @@ public: // Elf_Verneed specifies the version requirements for a single DSO, and contains // a reference to a linked list of Elf_Vernaux data structures which define the // mapping from version identifiers to version names. -template <class ELFT> -class VersionNeedSection final : public SyntheticSection<ELFT> { +template <class ELFT> class VersionNeedSection final : public SyntheticSection { typedef typename ELFT::Verneed Elf_Verneed; typedef typename ELFT::Vernaux Elf_Vernaux; @@ -677,7 +659,7 @@ public: // we put them into MergeSyntheticSection synthetic input sections which are // attached to regular output sections. template <class ELFT> -class MergeSyntheticSection final : public SyntheticSection<ELFT> { +class MergeSyntheticSection final : public SyntheticSection { typedef typename ELFT::uint uintX_t; public: @@ -700,7 +682,7 @@ private: // .MIPS.abiflags section. template <class ELFT> -class MipsAbiFlagsSection final : public SyntheticSection<ELFT> { +class MipsAbiFlagsSection final : public SyntheticSection { typedef llvm::object::Elf_Mips_ABIFlags<ELFT> Elf_Mips_ABIFlags; public: @@ -715,8 +697,7 @@ private: }; // .MIPS.options section. -template <class ELFT> -class MipsOptionsSection final : public SyntheticSection<ELFT> { +template <class ELFT> class MipsOptionsSection final : public SyntheticSection { typedef llvm::object::Elf_Mips_Options<ELFT> Elf_Mips_Options; typedef llvm::object::Elf_Mips_RegInfo<ELFT> Elf_Mips_RegInfo; @@ -735,8 +716,7 @@ private: }; // MIPS .reginfo section. -template <class ELFT> -class MipsReginfoSection final : public SyntheticSection<ELFT> { +template <class ELFT> class MipsReginfoSection final : public SyntheticSection { typedef llvm::object::Elf_Mips_RegInfo<ELFT> Elf_Mips_RegInfo; public: @@ -754,14 +734,14 @@ private: // of executable file which is pointed to by the DT_MIPS_RLD_MAP entry. // See "Dynamic section" in Chapter 5 in the following document: // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf -template <class ELFT> class MipsRldMapSection : public SyntheticSection<ELFT> { +template <class ELFT> class MipsRldMapSection : public SyntheticSection { public: MipsRldMapSection(); size_t getSize() const override { return sizeof(typename ELFT::uint); } void writeTo(uint8_t *Buf) override; }; -template <class ELFT> class ARMExidxSentinelSection : public SyntheticSection<ELFT> { +template <class ELFT> class ARMExidxSentinelSection : public SyntheticSection { public: ARMExidxSentinelSection(); size_t getSize() const override { return 8; } @@ -770,7 +750,7 @@ public: // A container for one or more linker generated thunks. Instances of these // thunks including ARM interworking and Mips LA25 PI to non-PI thunks. -template <class ELFT> class ThunkSection : public SyntheticSection<ELFT> { +template <class ELFT> class ThunkSection : public SyntheticSection { public: // ThunkSection in OS, with desired OutSecOff of Off ThunkSection(OutputSection *OS, uint64_t Off); diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index a7895110a42..3db4f4fa74b 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -530,7 +530,7 @@ template <class ELFT> void Writer<ELFT>::addSectionSymbols() { InputSection *IS = nullptr; if (!Sec->Sections.empty()) IS = Sec->Sections[0]; - if (!IS || isa<SyntheticSection<ELFT>>(IS) || IS->Type == SHT_REL || + if (!IS || isa<SyntheticSection>(IS) || IS->Type == SHT_REL || IS->Type == SHT_RELA) continue; auto *B = new (BAlloc) @@ -1022,9 +1022,8 @@ template <class ELFT> void Writer<ELFT>::sortSections() { } template <class ELFT> -static void -finalizeSynthetic(const std::vector<SyntheticSection<ELFT> *> &Sections) { - for (SyntheticSection<ELFT> *SS : Sections) +static void finalizeSynthetic(const std::vector<SyntheticSection *> &Sections) { + for (SyntheticSection *SS : Sections) if (SS && SS->OutSec && !SS->empty()) { SS->finalize(); SS->OutSec->Size = 0; @@ -1042,7 +1041,7 @@ static void removeUnusedSyntheticSections(std::vector<OutputSection *> &V) { // all regular ones. We iterate over them all and exit at first // non-synthetic. for (InputSectionBase *S : llvm::reverse(InputSections)) { - SyntheticSection<ELFT> *SS = dyn_cast<SyntheticSection<ELFT>>(S); + SyntheticSection *SS = dyn_cast<SyntheticSection>(S); if (!SS) return; if (!SS->empty() || !SS->OutSec) |