diff options
-rw-r--r-- | lld/ELF/ICF.cpp | 6 | ||||
-rw-r--r-- | lld/ELF/InputFiles.cpp | 14 | ||||
-rw-r--r-- | lld/ELF/InputFiles.h | 26 | ||||
-rw-r--r-- | lld/ELF/InputSection.cpp | 17 | ||||
-rw-r--r-- | lld/ELF/InputSection.h | 36 | ||||
-rw-r--r-- | lld/ELF/MarkLive.cpp | 6 | ||||
-rw-r--r-- | lld/ELF/OutputSections.cpp | 12 | ||||
-rw-r--r-- | lld/ELF/OutputSections.h | 84 | ||||
-rw-r--r-- | lld/ELF/SymbolTable.h | 4 | ||||
-rw-r--r-- | lld/ELF/Symbols.cpp | 28 | ||||
-rw-r--r-- | lld/ELF/Symbols.h | 47 | ||||
-rw-r--r-- | lld/ELF/Target.cpp | 6 | ||||
-rw-r--r-- | lld/ELF/Target.h | 3 | ||||
-rw-r--r-- | lld/ELF/Writer.cpp | 27 |
14 files changed, 146 insertions, 170 deletions
diff --git a/lld/ELF/ICF.cpp b/lld/ELF/ICF.cpp index 7fad3df56f3..a16b647fbef 100644 --- a/lld/ELF/ICF.cpp +++ b/lld/ELF/ICF.cpp @@ -74,9 +74,9 @@ using namespace llvm::object; namespace lld { namespace elf { template <class ELFT> class ICF { - typedef typename ELFFile<ELFT>::Elf_Shdr Elf_Shdr; - typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym; - typedef typename ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::Shdr Elf_Shdr; + typedef typename ELFT::Sym Elf_Sym; + typedef typename ELFT::uint uintX_t; typedef Elf_Rel_Impl<ELFT, false> Elf_Rel; using Comparator = std::function<bool(const InputSection<ELFT> *, diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index 8e07ffdc05a..3622dc2b8c3 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -45,8 +45,7 @@ ELFKind ELFFileBase<ELFT>::getELFKind() { } template <class ELFT> -typename ELFFileBase<ELFT>::Elf_Sym_Range -ELFFileBase<ELFT>::getElfSymbols(bool OnlyGlobals) { +typename ELFT::SymRange ELFFileBase<ELFT>::getElfSymbols(bool OnlyGlobals) { if (!Symtab) return Elf_Sym_Range(nullptr, nullptr); Elf_Sym_Range Syms = ELFObj.symbols(Symtab); @@ -141,9 +140,8 @@ elf::ObjectFile<ELFT>::getShtGroupEntries(const Elf_Shdr &Sec) { return Entries.slice(1); } -template <class ELFT> -static bool shouldMerge(const typename ELFFile<ELFT>::Elf_Shdr &Sec) { - typedef typename ELFFile<ELFT>::uintX_t uintX_t; +template <class ELFT> static bool shouldMerge(const typename ELFT::Shdr &Sec) { + typedef typename ELFT::uint uintX_t; uintX_t Flags = Sec.sh_flags; if (!(Flags & SHF_MERGE)) return false; @@ -370,7 +368,7 @@ SharedFile<ELFT>::SharedFile(MemoryBufferRef M) : ELFFileBase<ELFT>(Base::SharedKind, M), AsNeeded(Config->AsNeeded) {} template <class ELFT> -const typename ELFFile<ELFT>::Elf_Shdr * +const typename ELFT::Shdr * SharedFile<ELFT>::getSection(const Elf_Sym &Sym) const { uint32_t Index = this->getSectionIndex(Sym); if (Index == 0) @@ -381,8 +379,8 @@ SharedFile<ELFT>::getSection(const Elf_Sym &Sym) const { // Partially parse the shared object file so that we can call // getSoName on this object. template <class ELFT> void SharedFile<ELFT>::parseSoName() { - typedef typename ELFFile<ELFT>::Elf_Dyn Elf_Dyn; - typedef typename ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::Dyn Elf_Dyn; + typedef typename ELFT::uint uintX_t; const Elf_Shdr *DynamicSec = nullptr; const ELFFile<ELFT> Obj = this->ELFObj; diff --git a/lld/ELF/InputFiles.h b/lld/ELF/InputFiles.h index 46c35b1d415..5f7356bdcad 100644 --- a/lld/ELF/InputFiles.h +++ b/lld/ELF/InputFiles.h @@ -56,10 +56,10 @@ private: template <typename ELFT> class ELFFileBase : public InputFile { public: - typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Word Elf_Word; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range; + typedef typename ELFT::Shdr Elf_Shdr; + typedef typename ELFT::Sym Elf_Sym; + typedef typename ELFT::Word Elf_Word; + typedef typename ELFT::SymRange Elf_Sym_Range; ELFFileBase(Kind K, MemoryBufferRef M); static bool classof(const InputFile *F) { @@ -92,11 +92,11 @@ protected: // .o file. template <class ELFT> class ObjectFile : public ELFFileBase<ELFT> { typedef ELFFileBase<ELFT> Base; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Word Elf_Word; - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::Sym Elf_Sym; + typedef typename ELFT::Shdr Elf_Shdr; + typedef typename ELFT::SymRange Elf_Sym_Range; + typedef typename ELFT::Word Elf_Word; + typedef typename ELFT::uint uintX_t; StringRef getShtGroupSignature(const Elf_Shdr &Sec); ArrayRef<Elf_Word> getShtGroupEntries(const Elf_Shdr &Sec); @@ -193,10 +193,10 @@ private: // .so file. template <class ELFT> class SharedFile : public ELFFileBase<ELFT> { typedef ELFFileBase<ELFT> Base; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Word Elf_Word; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range; + typedef typename ELFT::Shdr Elf_Shdr; + typedef typename ELFT::Sym Elf_Sym; + typedef typename ELFT::Word Elf_Word; + typedef typename ELFT::SymRange Elf_Sym_Range; std::vector<SharedSymbol<ELFT>> SymbolBodies; std::vector<StringRef> Undefs; diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 667072f7dce..79f5abb068e 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -48,8 +48,7 @@ ArrayRef<uint8_t> InputSectionBase<ELFT>::getSectionData() const { } template <class ELFT> -typename ELFFile<ELFT>::uintX_t -InputSectionBase<ELFT>::getOffset(uintX_t Offset) { +typename ELFT::uint InputSectionBase<ELFT>::getOffset(uintX_t Offset) { switch (SectionKind) { case Regular: return cast<InputSection<ELFT>>(this)->OutSecOff + Offset; @@ -66,8 +65,7 @@ InputSectionBase<ELFT>::getOffset(uintX_t Offset) { } template <class ELFT> -typename ELFFile<ELFT>::uintX_t -InputSectionBase<ELFT>::getOffset(const Elf_Sym &Sym) { +typename ELFT::uint InputSectionBase<ELFT>::getOffset(const Elf_Sym &Sym) { return getOffset(Sym.st_value); } @@ -362,8 +360,7 @@ bool EHInputSection<ELFT>::classof(const InputSectionBase<ELFT> *S) { } template <class ELFT> -typename EHInputSection<ELFT>::uintX_t -EHInputSection<ELFT>::getOffset(uintX_t Offset) { +typename ELFT::uint EHInputSection<ELFT>::getOffset(uintX_t Offset) { // The file crtbeginT.o has relocations pointing to the start of an empty // .eh_frame that is known to be the first in the link. It does that to // identify the start of the output .eh_frame. Handle this special case. @@ -389,9 +386,8 @@ bool MergeInputSection<ELFT>::classof(const InputSectionBase<ELFT> *S) { } template <class ELFT> -std::pair<std::pair<typename ELFFile<ELFT>::uintX_t, - typename ELFFile<ELFT>::uintX_t> *, - typename ELFFile<ELFT>::uintX_t> +std::pair<std::pair<typename ELFT::uint, typename ELFT::uint> *, + typename ELFT::uint> SplitInputSection<ELFT>::getRangeAndSize(uintX_t Offset) { ArrayRef<uint8_t> D = this->getSectionData(); StringRef Data((const char *)D.data(), D.size()); @@ -411,8 +407,7 @@ SplitInputSection<ELFT>::getRangeAndSize(uintX_t Offset) { } template <class ELFT> -typename MergeInputSection<ELFT>::uintX_t -MergeInputSection<ELFT>::getOffset(uintX_t Offset) { +typename ELFT::uint MergeInputSection<ELFT>::getOffset(uintX_t Offset) { std::pair<std::pair<uintX_t, uintX_t> *, uintX_t> T = this->getRangeAndSize(Offset); std::pair<uintX_t, uintX_t> *I = T.first; diff --git a/lld/ELF/InputSection.h b/lld/ELF/InputSection.h index 3549bd5de82..0b6117ee242 100644 --- a/lld/ELF/InputSection.h +++ b/lld/ELF/InputSection.h @@ -26,11 +26,11 @@ template <class ELFT> class OutputSectionBase; // This corresponds to a section of an input file. template <class ELFT> class InputSectionBase { protected: - typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym; - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::Rel Elf_Rel; + typedef typename ELFT::Rela Elf_Rela; + typedef typename ELFT::Shdr Elf_Shdr; + typedef typename ELFT::Sym Elf_Sym; + typedef typename ELFT::uint uintX_t; const Elf_Shdr *Header; // The file this section is from. @@ -94,8 +94,8 @@ InputSectionBase<ELFT> * // and each piece is copied to a different place in the output. // This class represents such special sections. template <class ELFT> class SplitInputSection : public InputSectionBase<ELFT> { - typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr; - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::Shdr Elf_Shdr; + typedef typename ELFT::uint uintX_t; public: SplitInputSection(ObjectFile<ELFT> *File, const Elf_Shdr *Header, @@ -111,9 +111,9 @@ public: // This corresponds to a SHF_MERGE section of an input file. template <class ELFT> class MergeInputSection : public SplitInputSection<ELFT> { - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr; + typedef typename ELFT::uint uintX_t; + typedef typename ELFT::Sym Elf_Sym; + typedef typename ELFT::Shdr Elf_Shdr; public: MergeInputSection(ObjectFile<ELFT> *F, const Elf_Shdr *Header); @@ -126,8 +126,8 @@ public: // This corresponds to a .eh_frame section of an input file. template <class ELFT> class EHInputSection : public SplitInputSection<ELFT> { public: - typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr; - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::Shdr Elf_Shdr; + typedef typename ELFT::uint uintX_t; EHInputSection(ObjectFile<ELFT> *F, const Elf_Shdr *Header); static bool classof(const InputSectionBase<ELFT> *S); @@ -143,11 +143,11 @@ public: template <class ELFT> class InputSection : public InputSectionBase<ELFT> { friend ICF<ELFT>; typedef InputSectionBase<ELFT> Base; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym; - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::Shdr Elf_Shdr; + typedef typename ELFT::Rela Elf_Rela; + typedef typename ELFT::Rel Elf_Rel; + typedef typename ELFT::Sym Elf_Sym; + typedef typename ELFT::uint uintX_t; public: InputSection(ObjectFile<ELFT> *F, const Elf_Shdr *Header); @@ -186,7 +186,7 @@ private: // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf template <class ELFT> class MipsReginfoInputSection : public InputSectionBase<ELFT> { - typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr; + typedef typename ELFT::Shdr Elf_Shdr; public: MipsReginfoInputSection(ObjectFile<ELFT> *F, const Elf_Shdr *Hdr); diff --git a/lld/ELF/MarkLive.cpp b/lld/ELF/MarkLive.cpp index 0afb7078a24..ecb6ac9dd8f 100644 --- a/lld/ELF/MarkLive.cpp +++ b/lld/ELF/MarkLive.cpp @@ -42,9 +42,9 @@ using namespace lld::elf; template <class ELFT> static void forEachSuccessor(InputSection<ELFT> *Sec, std::function<void(InputSectionBase<ELFT> *)> Fn) { - typedef typename ELFFile<ELFT>::Elf_Rel Elf_Rel; - typedef typename ELFFile<ELFT>::Elf_Rela Elf_Rela; - typedef typename ELFFile<ELFT>::Elf_Shdr Elf_Shdr; + typedef typename ELFT::Rel Elf_Rel; + typedef typename ELFT::Rela Elf_Rela; + typedef typename ELFT::Shdr Elf_Shdr; ELFFile<ELFT> &Obj = Sec->getFile()->getObj(); for (const Elf_Shdr *RelSec : Sec->RelocSections) { diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index 9a15ad1aeb1..97cf56fc362 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -244,7 +244,7 @@ void RelocationSection<ELFT>::addReloc(const DynamicReloc<ELFT> &Reloc) { } template <class ELFT> -typename ELFFile<ELFT>::uintX_t DynamicReloc<ELFT>::getOffset() const { +typename ELFT::uint DynamicReloc<ELFT>::getOffset() const { switch (OKind) { case Off_GTlsIndex: return Out<ELFT>::Got->getGlobalDynAddr(*Sym); @@ -1027,7 +1027,7 @@ uint8_t EHOutputSection<ELFT>::getFdeEncoding(ArrayRef<uint8_t> D) { } template <class ELFT> -static typename ELFFile<ELFT>::uintX_t readEntryLength(ArrayRef<uint8_t> D) { +static typename ELFT::uint readEntryLength(ArrayRef<uint8_t> D) { const endianness E = ELFT::TargetEndianness; if (D.size() < 4) fatal("CIE/FDE too small"); @@ -1140,9 +1140,8 @@ void EHOutputSection<ELFT>::addSection(InputSectionBase<ELFT> *C) { } template <class ELFT> -static typename ELFFile<ELFT>::uintX_t writeAlignedCieOrFde(StringRef Data, - uint8_t *Buf) { - typedef typename ELFFile<ELFT>::uintX_t uintX_t; +static typename ELFT::uint writeAlignedCieOrFde(StringRef Data, uint8_t *Buf) { + typedef typename ELFT::uint uintX_t; const endianness E = ELFT::TargetEndianness; uint64_t Len = alignTo(Data.size(), sizeof(uintX_t)); write32<E>(Buf, Len - 4); @@ -1401,8 +1400,7 @@ void SymbolTableSection<ELFT>::writeLocalSymbols(uint8_t *&Buf) { } template <class ELFT> -static const typename llvm::object::ELFFile<ELFT>::Elf_Sym * -getElfSym(SymbolBody &Body) { +static const typename ELFT::Sym *getElfSym(SymbolBody &Body) { if (auto *EBody = dyn_cast<DefinedElf<ELFT>>(&Body)) return &EBody->Sym; if (auto *EBody = dyn_cast<UndefinedElf<ELFT>>(&Body)) diff --git a/lld/ELF/OutputSections.h b/lld/ELF/OutputSections.h index 5004c252d87..13259bde088 100644 --- a/lld/ELF/OutputSections.h +++ b/lld/ELF/OutputSections.h @@ -33,14 +33,12 @@ template <class ELFT> class ObjectFile; template <class ELFT> class DefinedRegular; template <class ELFT> -static inline typename llvm::object::ELFFile<ELFT>::uintX_t -getAddend(const typename llvm::object::ELFFile<ELFT>::Elf_Rel &Rel) { +static inline typename ELFT::uint getAddend(const typename ELFT::Rel &Rel) { return 0; } template <class ELFT> -static inline typename llvm::object::ELFFile<ELFT>::uintX_t -getAddend(const typename llvm::object::ELFFile<ELFT>::Elf_Rela &Rel) { +static inline typename ELFT::uint getAddend(const typename ELFT::Rela &Rel) { return Rel.r_addend; } @@ -53,8 +51,8 @@ bool isValidCIdentifier(StringRef S); // non-overlapping file offsets and VAs. template <class ELFT> class OutputSectionBase { public: - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr; + typedef typename ELFT::uint uintX_t; + typedef typename ELFT::Shdr Elf_Shdr; OutputSectionBase(StringRef Name, uint32_t Type, uintX_t Flags); void setVA(uintX_t VA) { Header.sh_addr = VA; } @@ -95,7 +93,7 @@ protected: template <class ELFT> class GotSection final : public OutputSectionBase<ELFT> { typedef OutputSectionBase<ELFT> Base; - typedef typename Base::uintX_t uintX_t; + typedef typename ELFT::uint uintX_t; public: GotSection(); @@ -134,7 +132,7 @@ private: template <class ELFT> class GotPltSection final : public OutputSectionBase<ELFT> { - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::uint uintX_t; public: GotPltSection(); @@ -149,7 +147,7 @@ private: template <class ELFT> class PltSection final : public OutputSectionBase<ELFT> { typedef OutputSectionBase<ELFT> Base; - typedef typename Base::uintX_t uintX_t; + typedef typename ELFT::uint uintX_t; public: PltSection(); @@ -163,7 +161,7 @@ private: }; template <class ELFT> struct DynamicReloc { - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::uint uintX_t; uint32_t Type; // Where the relocation is. @@ -201,10 +199,10 @@ template <class ELFT> struct DynamicReloc { template <class ELFT> class SymbolTableSection final : public OutputSectionBase<ELFT> { public: - typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range; - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::Shdr Elf_Shdr; + typedef typename ELFT::Sym Elf_Sym; + typedef typename ELFT::SymRange Elf_Sym_Range; + typedef typename ELFT::uint uintX_t; SymbolTableSection(SymbolTable<ELFT> &Table, StringTableSection<ELFT> &StrTabSec); @@ -236,9 +234,9 @@ private: template <class ELFT> class RelocationSection final : public OutputSectionBase<ELFT> { - typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela; - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::Rel Elf_Rel; + typedef typename ELFT::Rela Elf_Rela; + typedef typename ELFT::uint uintX_t; public: RelocationSection(StringRef Name); @@ -257,11 +255,11 @@ private: template <class ELFT> class OutputSection final : public OutputSectionBase<ELFT> { public: - typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela; - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::Shdr Elf_Shdr; + typedef typename ELFT::Sym Elf_Sym; + typedef typename ELFT::Rel Elf_Rel; + typedef typename ELFT::Rela Elf_Rela; + typedef typename ELFT::uint uintX_t; OutputSection(StringRef Name, uint32_t Type, uintX_t Flags); void addSection(InputSectionBase<ELFT> *C) override; void sortInitFini(); @@ -276,7 +274,7 @@ private: template <class ELFT> class MergeOutputSection final : public OutputSectionBase<ELFT> { - typedef typename OutputSectionBase<ELFT>::uintX_t uintX_t; + typedef typename ELFT::uint uintX_t; bool shouldTailMerge() const; @@ -294,7 +292,7 @@ private: // FDE or CIE template <class ELFT> struct EHRegion { - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::uint uintX_t; EHRegion(EHInputSection<ELFT> *S, unsigned Index); StringRef data() const; EHInputSection<ELFT> *S; @@ -310,10 +308,10 @@ template <class ELFT> struct Cie : public EHRegion<ELFT> { template <class ELFT> class EHOutputSection final : public OutputSectionBase<ELFT> { public: - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela; + typedef typename ELFT::uint uintX_t; + typedef typename ELFT::Shdr Elf_Shdr; + typedef typename ELFT::Rel Elf_Rel; + typedef typename ELFT::Rela Elf_Rela; EHOutputSection(StringRef Name, uint32_t Type, uintX_t Flags); void writeTo(uint8_t *Buf) override; @@ -343,7 +341,7 @@ public: template <class ELFT> class StringTableSection final : public OutputSectionBase<ELFT> { public: - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::uint uintX_t; StringTableSection(StringRef Name, bool Dynamic); unsigned addString(StringRef S, bool HashIt = true); void writeTo(uint8_t *Buf) override; @@ -360,7 +358,7 @@ private: template <class ELFT> class HashTableSection final : public OutputSectionBase<ELFT> { - typedef typename llvm::object::ELFFile<ELFT>::Elf_Word Elf_Word; + typedef typename ELFT::Word Elf_Word; public: HashTableSection(); @@ -372,9 +370,9 @@ public: // https://blogs.oracle.com/ali/entry/gnu_hash_elf_sections template <class ELFT> class GnuHashTableSection final : public OutputSectionBase<ELFT> { - typedef typename llvm::object::ELFFile<ELFT>::Elf_Off Elf_Off; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Word Elf_Word; - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::Off Elf_Off; + typedef typename ELFT::Word Elf_Word; + typedef typename ELFT::uint uintX_t; public: GnuHashTableSection(); @@ -409,12 +407,12 @@ private: template <class ELFT> class DynamicSection final : public OutputSectionBase<ELFT> { typedef OutputSectionBase<ELFT> Base; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Dyn Elf_Dyn; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym; - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::Dyn Elf_Dyn; + typedef typename ELFT::Rel Elf_Rel; + typedef typename ELFT::Rela Elf_Rela; + typedef typename ELFT::Shdr Elf_Shdr; + typedef typename ELFT::Sym Elf_Sym; + typedef typename ELFT::uint uintX_t; // The .dynamic section contains information for the dynamic linker. // The section consists of fixed size entries, which consist of @@ -477,7 +475,7 @@ private: // http://www.airs.com/blog/archives/462 (".eh_frame_hdr") template <class ELFT> class EhFrameHeader final : public OutputSectionBase<ELFT> { - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::uint uintX_t; public: EhFrameHeader(); @@ -519,8 +517,8 @@ private: // globally accessible. Writer initializes them, so don't use them // until Writer is initialized. template <class ELFT> struct Out { - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; - typedef typename llvm::object::ELFFile<ELFT>::Elf_Phdr Elf_Phdr; + typedef typename ELFT::uint uintX_t; + typedef typename ELFT::Phdr Elf_Phdr; static BuildIdSection<ELFT> *BuildId; static DynamicSection<ELFT> *Dynamic; static EhFrameHeader<ELFT> *EhFrameHdr; @@ -566,7 +564,7 @@ template <class ELFT> StringTableSection<ELFT> *Out<ELFT>::ShStrTab; template <class ELFT> StringTableSection<ELFT> *Out<ELFT>::StrTab; template <class ELFT> SymbolTableSection<ELFT> *Out<ELFT>::DynSymTab; template <class ELFT> SymbolTableSection<ELFT> *Out<ELFT>::SymTab; -template <class ELFT> typename Out<ELFT>::Elf_Phdr *Out<ELFT>::TlsPhdr; +template <class ELFT> typename ELFT::Phdr *Out<ELFT>::TlsPhdr; template <class ELFT> OutputSectionBase<ELFT> *Out<ELFT>::ElfHeader; template <class ELFT> OutputSectionBase<ELFT> *Out<ELFT>::ProgramHeaders; diff --git a/lld/ELF/SymbolTable.h b/lld/ELF/SymbolTable.h index a2a991aca63..08f3507607f 100644 --- a/lld/ELF/SymbolTable.h +++ b/lld/ELF/SymbolTable.h @@ -35,8 +35,8 @@ class Undefined; // undefined, it'll read an archive member to read a real definition // to replace the lazy symbol. The logic is implemented in resolve(). template <class ELFT> class SymbolTable { - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym; - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::Sym Elf_Sym; + typedef typename ELFT::uint uintX_t; public: void addFile(std::unique_ptr<InputFile> File); diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index 78662ee4798..e32473e3bd8 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -29,10 +29,10 @@ using namespace lld; using namespace lld::elf; template <class ELFT> -static typename ELFFile<ELFT>::uintX_t -getSymVA(const SymbolBody &Body, typename ELFFile<ELFT>::uintX_t &Addend) { - typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym; - typedef typename ELFFile<ELFT>::uintX_t uintX_t; +static typename ELFT::uint getSymVA(const SymbolBody &Body, + typename ELFT::uint &Addend) { + typedef typename ELFT::Sym Elf_Sym; + typedef typename ELFT::uint uintX_t; switch (Body.kind()) { case SymbolBody::DefinedSyntheticKind: { @@ -119,32 +119,26 @@ template <class ELFT> bool SymbolBody::isGnuIfunc() const { } template <class ELFT> -typename ELFFile<ELFT>::uintX_t -SymbolBody::getVA(typename ELFFile<ELFT>::uintX_t Addend) const { +typename ELFT::uint SymbolBody::getVA(typename ELFT::uint Addend) const { return getSymVA<ELFT>(*this, Addend) + Addend; } -template <class ELFT> -typename ELFFile<ELFT>::uintX_t SymbolBody::getGotVA() const { +template <class ELFT> typename ELFT::uint SymbolBody::getGotVA() const { return Out<ELFT>::Got->getVA() + (Out<ELFT>::Got->getMipsLocalEntriesNum() + GotIndex) * - sizeof(typename ELFFile<ELFT>::uintX_t); + sizeof(typename ELFT::uint); } -template <class ELFT> -typename ELFFile<ELFT>::uintX_t SymbolBody::getGotPltVA() const { - return Out<ELFT>::GotPlt->getVA() + - GotPltIndex * sizeof(typename ELFFile<ELFT>::uintX_t); +template <class ELFT> typename ELFT::uint SymbolBody::getGotPltVA() const { + return Out<ELFT>::GotPlt->getVA() + GotPltIndex * sizeof(typename ELFT::uint); } -template <class ELFT> -typename ELFFile<ELFT>::uintX_t SymbolBody::getPltVA() const { +template <class ELFT> typename ELFT::uint SymbolBody::getPltVA() const { return Out<ELFT>::Plt->getVA() + Target->PltZeroSize + PltIndex * Target->PltEntrySize; } -template <class ELFT> -typename ELFFile<ELFT>::uintX_t SymbolBody::getSize() const { +template <class ELFT> typename ELFT::uint SymbolBody::getSize() const { if (auto *B = dyn_cast<DefinedElf<ELFT>>(this)) return B->Sym.st_size; return 0; diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h index b95d61ef0ab..6c869f680b9 100644 --- a/lld/ELF/Symbols.h +++ b/lld/ELF/Symbols.h @@ -91,16 +91,12 @@ public: bool isInPlt() const { return PltIndex != -1U; } template <class ELFT> - typename llvm::object::ELFFile<ELFT>::uintX_t - getVA(typename llvm::object::ELFFile<ELFT>::uintX_t Addend = 0) const; - template <class ELFT> - typename llvm::object::ELFFile<ELFT>::uintX_t getGotVA() const; - template <class ELFT> - typename llvm::object::ELFFile<ELFT>::uintX_t getGotPltVA() const; - template <class ELFT> - typename llvm::object::ELFFile<ELFT>::uintX_t getPltVA() const; - template <class ELFT> - typename llvm::object::ELFFile<ELFT>::uintX_t getSize() const; + typename ELFT::uint getVA(typename ELFT::uint Addend = 0) const; + + template <class ELFT> typename ELFT::uint getGotVA() const; + template <class ELFT> typename ELFT::uint getGotPltVA() const; + template <class ELFT> typename ELFT::uint getPltVA() const; + template <class ELFT> typename ELFT::uint getSize() const; // A SymbolBody has a backreference to a Symbol. Originally they are // doubly-linked. A backreference will never change. But the pointer @@ -165,7 +161,7 @@ public: // Any defined symbol from an ELF file. template <class ELFT> class DefinedElf : public Defined { protected: - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym; + typedef typename ELFT::Sym Elf_Sym; public: DefinedElf(Kind K, StringRef N, const Elf_Sym &Sym) @@ -207,7 +203,7 @@ public: // Regular defined symbols read from object file symbol tables. template <class ELFT> class DefinedRegular : public DefinedElf<ELFT> { - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym; + typedef typename ELFT::Sym Elf_Sym; public: DefinedRegular(StringRef N, const Elf_Sym &Sym, @@ -240,8 +236,8 @@ InputSectionBase<ELFT> *DefinedRegular<ELFT>::NullInputSection; // takes an output section to calculate output VA, etc. template <class ELFT> class DefinedSynthetic : public Defined { public: - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym; - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::Sym Elf_Sym; + typedef typename ELFT::uint uintX_t; DefinedSynthetic(StringRef N, uintX_t Value, OutputSectionBase<ELFT> &Section, uint8_t Visibility); @@ -271,7 +267,7 @@ public: }; template <class ELFT> class UndefinedElf : public Undefined { - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym; + typedef typename ELFT::Sym Elf_Sym; public: UndefinedElf(StringRef N, const Elf_Sym &Sym); @@ -283,8 +279,8 @@ public: }; template <class ELFT> class SharedSymbol : public DefinedElf<ELFT> { - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym; - typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::Sym Elf_Sym; + typedef typename ELFT::uint uintX_t; public: static bool classof(const SymbolBody *S) { @@ -332,7 +328,7 @@ private: // DefinedRegular symbols, so they need Elf_Sym symbols. // Here we allocate such Elf_Sym symbols statically. template <class ELFT> struct ElfSym { - typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym; + typedef typename ELFT::Sym Elf_Sym; // Used to represent an undefined symbol which we don't want to add to the // output file's symbol table. It has weak binding and can be substituted. @@ -356,14 +352,13 @@ template <class ELFT> struct ElfSym { static Elf_Sym RelaIpltEnd; }; -template <class ELFT> typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::Ignored; -template <class ELFT> typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::Etext; -template <class ELFT> typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::Edata; -template <class ELFT> typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::End; -template <class ELFT> typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::MipsGp; -template <class ELFT> -typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::RelaIpltStart; -template <class ELFT> typename ElfSym<ELFT>::Elf_Sym ElfSym<ELFT>::RelaIpltEnd; +template <class ELFT> typename ELFT::Sym ElfSym<ELFT>::Ignored; +template <class ELFT> typename ELFT::Sym ElfSym<ELFT>::Etext; +template <class ELFT> typename ELFT::Sym ElfSym<ELFT>::Edata; +template <class ELFT> typename ELFT::Sym ElfSym<ELFT>::End; +template <class ELFT> typename ELFT::Sym ElfSym<ELFT>::MipsGp; +template <class ELFT> typename ELFT::Sym ElfSym<ELFT>::RelaIpltStart; +template <class ELFT> typename ELFT::Sym ElfSym<ELFT>::RelaIpltEnd; } // namespace elf } // namespace lld diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index cd5ad878a0e..c968cbe773c 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -1578,8 +1578,8 @@ uint32_t MipsTargetInfo<ELFT>::getDynRel(uint32_t Type) const { template <class ELFT> void MipsTargetInfo<ELFT>::writeGotHeader(uint8_t *Buf) const { - typedef typename ELFFile<ELFT>::Elf_Off Elf_Off; - typedef typename ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::Off Elf_Off; + typedef typename ELFT::uint uintX_t; // Set the MSB of the second GOT slot. This is not required by any // MIPS ABI documentation, though. @@ -1793,7 +1793,7 @@ bool MipsTargetInfo<ELFT>::isRelRelative(uint32_t Type) const { // _gp is a MIPS-specific ABI-defined symbol which points to // a location that is relative to GOT. This function returns // the value for the symbol. -template <class ELFT> typename ELFFile<ELFT>::uintX_t getMipsGpAddr() { +template <class ELFT> typename ELFT::uint getMipsGpAddr() { unsigned GPOffset = 0x7ff0; if (uint64_t V = Out<ELFT>::Got->getVA()) return V + GPOffset; diff --git a/lld/ELF/Target.h b/lld/ELF/Target.h index 1c706ea9204..49f1ea4e66d 100644 --- a/lld/ELF/Target.h +++ b/lld/ELF/Target.h @@ -104,8 +104,7 @@ private: uint64_t getPPC64TocBase(); -template <class ELFT> -typename llvm::object::ELFFile<ELFT>::uintX_t getMipsGpAddr(); +template <class ELFT> typename ELFT::uint getMipsGpAddr(); extern TargetInfo *Target; TargetInfo *createTarget(); diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index f0e16bec73f..a8b1f9bb592 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -32,13 +32,13 @@ namespace { // The writer writes a SymbolTable result to a file. template <class ELFT> class Writer { public: - typedef typename ELFFile<ELFT>::uintX_t uintX_t; - typedef typename ELFFile<ELFT>::Elf_Shdr Elf_Shdr; - typedef typename ELFFile<ELFT>::Elf_Ehdr Elf_Ehdr; - typedef typename ELFFile<ELFT>::Elf_Phdr Elf_Phdr; - typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym; - typedef typename ELFFile<ELFT>::Elf_Sym_Range Elf_Sym_Range; - typedef typename ELFFile<ELFT>::Elf_Rela Elf_Rela; + typedef typename ELFT::uint uintX_t; + typedef typename ELFT::Shdr Elf_Shdr; + typedef typename ELFT::Ehdr Elf_Ehdr; + typedef typename ELFT::Phdr Elf_Phdr; + typedef typename ELFT::Sym Elf_Sym; + typedef typename ELFT::SymRange Elf_Sym_Range; + typedef typename ELFT::Rela Elf_Rela; Writer(SymbolTable<ELFT> &S) : Symtab(S) {} void run(); @@ -123,7 +123,7 @@ private: } // anonymous namespace template <class ELFT> void elf::writeResult(SymbolTable<ELFT> *Symtab) { - typedef typename ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::uint uintX_t; // Create singleton output sections. DynamicSection<ELFT> Dynamic(*Symtab); @@ -515,7 +515,7 @@ static void reportUndefined(SymbolTable<ELFT> &Symtab, SymbolBody *Sym) { template <class ELFT> static bool shouldKeepInSymtab(const elf::ObjectFile<ELFT> &File, StringRef SymName, - const typename ELFFile<ELFT>::Elf_Sym &Sym) { + const typename ELFT::Sym &Sym) { if (Sym.getType() == STT_FILE) return false; @@ -610,7 +610,7 @@ template <class ELFT> static bool isRelroSection(OutputSectionBase<ELFT> *Sec) { template <class ELFT> static bool compareSections(OutputSectionBase<ELFT> *A, OutputSectionBase<ELFT> *B) { - typedef typename ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::uint uintX_t; int Comp = Script->compareSections(A->getName(), B->getName()); if (Comp != 0) @@ -825,8 +825,8 @@ static bool includeInDynsym(const SymbolBody &B) { // linker scripts. namespace { template <class ELFT> class OutputSectionFactory { - typedef typename ELFFile<ELFT>::Elf_Shdr Elf_Shdr; - typedef typename ELFFile<ELFT>::uintX_t uintX_t; + typedef typename ELFT::Shdr Elf_Shdr; + typedef typename ELFT::uint uintX_t; public: std::pair<OutputSectionBase<ELFT> *, bool> create(InputSectionBase<ELFT> *C, @@ -1424,8 +1424,7 @@ static uint32_t getMipsEFlags() { return V; } -template <class ELFT> -static typename ELFFile<ELFT>::uintX_t getEntryAddr() { +template <class ELFT> static typename ELFT::uint getEntryAddr() { if (SymbolBody *B = Config->EntrySym) return B->repl().getVA<ELFT>(); if (Config->EntryAddr != uint64_t(-1)) |