diff options
| -rw-r--r-- | lld/ELF/InputFiles.cpp | 6 | ||||
| -rw-r--r-- | lld/ELF/InputFiles.h | 72 | ||||
| -rw-r--r-- | lld/ELF/SymbolTable.cpp | 6 |
3 files changed, 28 insertions, 56 deletions
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index a4a9c672e83..cbb1164ca36 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -67,7 +67,7 @@ ELFFileBase<ELFT>::getNonLocalSymbols() { template <class ELFT> ObjectFile<ELFT>::ObjectFile(MemoryBufferRef M) - : ObjectFileBase<ELFT>(getStaticELFKind<ELFT>(), M) {} + : ELFFileBase<ELFT>(Base::ObjectKind, getStaticELFKind<ELFT>(), M) {} template <class ELFT> typename ObjectFile<ELFT>::Elf_Sym_Range ObjectFile<ELFT>::getLocalSymbols() { @@ -260,7 +260,9 @@ std::vector<MemoryBufferRef> ArchiveFile::getMembers() { template <class ELFT> SharedFile<ELFT>::SharedFile(MemoryBufferRef M) - : SharedFileBase<ELFT>(getStaticELFKind<ELFT>(), M) {} + : ELFFileBase<ELFT>(Base::SharedKind, getStaticELFKind<ELFT>(), M) { + AsNeeded = Config->AsNeeded; +} template <class ELFT> void SharedFile<ELFT>::parseSoName() { typedef typename ELFFile<ELFT>::Elf_Dyn Elf_Dyn; diff --git a/lld/ELF/InputFiles.h b/lld/ELF/InputFiles.h index acbcd2d7f36..0255b74af39 100644 --- a/lld/ELF/InputFiles.h +++ b/lld/ELF/InputFiles.h @@ -80,27 +80,6 @@ protected: Elf_Sym_Range getSymbolsHelper(bool); }; -// .o file. -template <typename ELFT> class ObjectFileBase : public ELFFileBase<ELFT> { - typedef ELFFileBase<ELFT> Base; - -public: - ObjectFileBase(ELFKind EKind, MemoryBufferRef M) - : ELFFileBase<ELFT>(Base::ObjectKind, EKind, M) {} - static bool classof(const InputFile *F) { - return F->kind() == Base::ObjectKind; - } - - ArrayRef<SymbolBody *> getSymbols() { return SymbolBodies; } - virtual void parse(llvm::DenseSet<StringRef> &Comdats) = 0; - -protected: - // List of all symbols referenced or defined by this file. - std::vector<SymbolBody *> SymbolBodies; - - llvm::BumpPtrAllocator Alloc; -}; - template <class ELFT> static ELFKind getStaticELFKind() { if (!ELFT::Is64Bits) { if (ELFT::TargetEndianness == llvm::support::little) @@ -112,8 +91,9 @@ template <class ELFT> static ELFKind getStaticELFKind() { return ELF64BEKind; } -template <class ELFT> class ObjectFile : public ObjectFileBase<ELFT> { - typedef ObjectFileBase<ELFT> Base; +// .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; @@ -130,8 +110,10 @@ public: cast<ELFFileBase<ELFT>>(F)->getELFKind() == getStaticELFKind<ELFT>(); } + ArrayRef<SymbolBody *> getSymbols() { return this->SymbolBodies; } + explicit ObjectFile(MemoryBufferRef M); - void parse(llvm::DenseSet<StringRef> &Comdats) override; + void parse(llvm::DenseSet<StringRef> &Comdats); ArrayRef<InputSection<ELFT> *> getSections() const { return Sections; } @@ -157,6 +139,11 @@ private: std::vector<InputSection<ELFT> *> Sections; ArrayRef<Elf_Word> SymtabSHNDX; + + // List of all symbols referenced or defined by this file. + std::vector<SymbolBody *> SymbolBodies; + + llvm::BumpPtrAllocator Alloc; }; class ArchiveFile : public InputFile { @@ -180,39 +167,17 @@ private: }; // .so file. -template <typename ELFT> class SharedFileBase : public ELFFileBase<ELFT> { +template <class ELFT> class SharedFile : public ELFFileBase<ELFT> { typedef ELFFileBase<ELFT> Base; - -protected: - StringRef SoName; - -public: - SharedFileBase(ELFKind EKind, MemoryBufferRef M) - : ELFFileBase<ELFT>(Base::SharedKind, EKind, M) { - AsNeeded = Config->AsNeeded; - } - static bool classof(const InputFile *F) { - return F->kind() == Base::SharedKind; - } - StringRef getSoName() const { return SoName; } - virtual void parseSoName() = 0; - virtual void parse() = 0; - - // Used for --as-needed - bool AsNeeded = false; - bool IsUsed = false; - bool isNeeded() const { return !AsNeeded || IsUsed; } -}; - -template <class ELFT> class SharedFile : public SharedFileBase<ELFT> { - typedef SharedFileBase<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_Sym_Range Elf_Sym_Range; std::vector<SharedSymbol<ELFT>> SymbolBodies; + StringRef SoName; public: + StringRef getSoName() const { return SoName; } llvm::MutableArrayRef<SharedSymbol<ELFT>> getSharedSymbols() { return SymbolBodies; } @@ -224,8 +189,13 @@ public: explicit SharedFile(MemoryBufferRef M); - void parseSoName() override; - void parse() override; + void parseSoName(); + void parse(); + + // Used for --as-needed + bool AsNeeded = false; + bool IsUsed = false; + bool isNeeded() const { return !AsNeeded || IsUsed; } }; template <typename T> diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index a1c1429bfb3..a91a1807d90 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -47,13 +47,13 @@ void SymbolTable<ELFT>::addFile(std::unique_ptr<InputFile> File) { addLazy(&Sym); return; } - if (auto *S = dyn_cast<SharedFileBase<ELFT>>(File.get())) { + if (auto *S = dyn_cast<SharedFile<ELFT>>(File.get())) { S->parseSoName(); if (!IncludedSoNames.insert(S->getSoName()).second) return; S->parse(); } else { - cast<ObjectFileBase<ELFT>>(File.get())->parse(Comdats); + cast<ObjectFile<ELFT>>(File.get())->parse(Comdats); } addELFFile(cast<ELFFileBase<ELFT>>(File.release())); } @@ -97,7 +97,7 @@ void SymbolTable<ELFT>::addELFFile(ELFFileBase<ELFT> *File) { else if (auto *S = dyn_cast<SharedFile<ELFT>>(File)) SharedFiles.emplace_back(S); - if (auto *O = dyn_cast<ObjectFileBase<ELFT>>(File)) { + if (auto *O = dyn_cast<ObjectFile<ELFT>>(File)) { for (SymbolBody *Body : O->getSymbols()) resolve(Body); } |

