forked from OSchip/llvm-project
Simplify the InputFile type hierarchy by removing unnecessary middle classses.
llvm-svn: 250006
This commit is contained in:
parent
af70764aa1
commit
dfce5a25cb
|
@ -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;
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue