Simplify the InputFile type hierarchy by removing unnecessary middle classses.

llvm-svn: 250006
This commit is contained in:
Rafael Espindola 2015-10-12 02:22:58 +00:00
parent af70764aa1
commit dfce5a25cb
3 changed files with 28 additions and 56 deletions

View File

@ -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;

View File

@ -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>

View File

@ -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);
}