[lld] r250006 - Simplify the InputFile type hierarchy by removing unnecessary middle classses.
Rafael Espindola via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 11 19:22:58 PDT 2015
Author: rafael
Date: Sun Oct 11 21:22:58 2015
New Revision: 250006
URL: http://llvm.org/viewvc/llvm-project?rev=250006&view=rev
Log:
Simplify the InputFile type hierarchy by removing unnecessary middle classses.
Modified:
lld/trunk/ELF/InputFiles.cpp
lld/trunk/ELF/InputFiles.h
lld/trunk/ELF/SymbolTable.cpp
Modified: lld/trunk/ELF/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=250006&r1=250005&r2=250006&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.cpp (original)
+++ lld/trunk/ELF/InputFiles.cpp Sun Oct 11 21:22:58 2015
@@ -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
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;
Modified: lld/trunk/ELF/InputFiles.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.h?rev=250006&r1=250005&r2=250006&view=diff
==============================================================================
--- lld/trunk/ELF/InputFiles.h (original)
+++ lld/trunk/ELF/InputFiles.h Sun Oct 11 21:22:58 2015
@@ -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 get
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>
Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=250006&r1=250005&r2=250006&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Sun Oct 11 21:22:58 2015
@@ -47,13 +47,13 @@ void SymbolTable<ELFT>::addFile(std::uni
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(ELFFi
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);
}
More information about the llvm-commits
mailing list