Now that the ELFFile constructor does nothing, create it when needed.

This avoids duplicating the buffer in InputFile.

llvm-svn: 285965
This commit is contained in:
Rafael Espindola 2016-11-03 20:44:50 +00:00
parent 946242b5d2
commit e19abab9a7
7 changed files with 30 additions and 29 deletions

View File

@ -219,8 +219,8 @@ bool ICF<ELFT>::equalsConstant(const InputSection<ELFT> *A,
for (size_t I = 0, E = A->RelocSections.size(); I != E; ++I) {
const Elf_Shdr *RA = A->RelocSections[I];
const Elf_Shdr *RB = B->RelocSections[I];
ELFFile<ELFT> &FileA = A->File->getObj();
ELFFile<ELFT> &FileB = B->File->getObj();
ELFFile<ELFT> FileA = A->File->getObj();
ELFFile<ELFT> FileB = B->File->getObj();
if (RA->sh_type == SHT_RELA) {
if (!relocationEq(check(FileA.relas(RA)), check(FileB.relas(RB))))
return false;
@ -272,8 +272,8 @@ bool ICF<ELFT>::equalsVariable(const InputSection<ELFT> *A,
for (size_t I = 0, E = A->RelocSections.size(); I != E; ++I) {
const Elf_Shdr *RA = A->RelocSections[I];
const Elf_Shdr *RB = B->RelocSections[I];
ELFFile<ELFT> &FileA = A->File->getObj();
ELFFile<ELFT> &FileB = B->File->getObj();
ELFFile<ELFT> FileA = A->File->getObj();
ELFFile<ELFT> FileB = B->File->getObj();
if (RA->sh_type == SHT_RELA) {
if (!variableEq(A, B, check(FileA.relas(RA)), check(FileB.relas(RB))))
return false;

View File

@ -110,11 +110,10 @@ template <class ELFT> static ELFKind getELFKind() {
}
template <class ELFT>
ELFFileBase<ELFT>::ELFFileBase(Kind K, MemoryBufferRef MB)
: InputFile(K, MB), ELFObj(MB.getBuffer()) {
ELFFileBase<ELFT>::ELFFileBase(Kind K, MemoryBufferRef MB) : InputFile(K, MB) {
EKind = getELFKind<ELFT>();
EMachine = ELFObj.getHeader()->e_machine;
OSABI = ELFObj.getHeader()->e_ident[llvm::ELF::EI_OSABI];
EMachine = getObj().getHeader()->e_machine;
OSABI = getObj().getHeader()->e_ident[llvm::ELF::EI_OSABI];
}
template <class ELFT>
@ -126,18 +125,18 @@ typename ELFT::SymRange ELFFileBase<ELFT>::getElfSymbols(bool OnlyGlobals) {
template <class ELFT>
uint32_t ELFFileBase<ELFT>::getSectionIndex(const Elf_Sym &Sym) const {
return check(ELFObj.getSectionIndex(&Sym, Symbols, SymtabSHNDX));
return check(getObj().getSectionIndex(&Sym, Symbols, SymtabSHNDX));
}
template <class ELFT>
void ELFFileBase<ELFT>::initSymtab(ArrayRef<Elf_Shdr> Sections,
const Elf_Shdr *Symtab) {
FirstNonLocal = Symtab->sh_info;
Symbols = check(ELFObj.symbols(Symtab));
Symbols = check(getObj().symbols(Symtab));
if (FirstNonLocal == 0 || FirstNonLocal > Symbols.size())
fatal(getFilename(this) + ": invalid sh_info in symbol table");
StringTable = check(ELFObj.getStringTableForSymtab(*Symtab, Sections));
StringTable = check(getObj().getStringTableForSymtab(*Symtab, Sections));
}
template <class ELFT>
@ -174,7 +173,7 @@ template <class ELFT> uint32_t elf::ObjectFile<ELFT>::getMipsGp0() const {
template <class ELFT>
void elf::ObjectFile<ELFT>::parse(DenseSet<CachedHashStringRef> &ComdatGroups) {
// Read section and symbol tables.
ArrayRef<Elf_Shdr> ObjSections = check(this->ELFObj.sections());
ArrayRef<Elf_Shdr> ObjSections = check(this->getObj().sections());
initializeSections(ComdatGroups, ObjSections);
initializeSymbols(ObjSections);
}
@ -197,7 +196,7 @@ elf::ObjectFile<ELFT>::getShtGroupSignature(ArrayRef<Elf_Shdr> Sections,
template <class ELFT>
ArrayRef<typename elf::ObjectFile<ELFT>::Elf_Word>
elf::ObjectFile<ELFT>::getShtGroupEntries(const Elf_Shdr &Sec) {
const ELFFile<ELFT> &Obj = this->ELFObj;
const ELFFile<ELFT> &Obj = this->getObj();
ArrayRef<Elf_Word> Entries =
check(Obj.template getSectionContentsAsArray<Elf_Word>(&Sec));
if (Entries.empty() || Entries[0] != GRP_COMDAT)
@ -262,7 +261,7 @@ template <class ELFT>
void elf::ObjectFile<ELFT>::initializeSections(
DenseSet<CachedHashStringRef> &ComdatGroups,
ArrayRef<Elf_Shdr> ObjSections) {
const ELFFile<ELFT> &Obj = this->ELFObj;
const ELFFile<ELFT> &Obj = this->getObj();
uint64_t Size = ObjSections.size();
Sections.resize(Size);
unsigned I = -1;
@ -344,7 +343,8 @@ template <class ELFT>
InputSectionBase<ELFT> *
elf::ObjectFile<ELFT>::createInputSection(const Elf_Shdr &Sec,
StringRef SectionStringTable) {
StringRef Name = check(this->ELFObj.getSectionName(&Sec, SectionStringTable));
StringRef Name =
check(this->getObj().getSectionName(&Sec, SectionStringTable));
switch (Sec.sh_type) {
case SHT_ARM_ATTRIBUTES:
@ -540,7 +540,8 @@ SharedFile<ELFT>::SharedFile(MemoryBufferRef M)
template <class ELFT>
const typename ELFT::Shdr *
SharedFile<ELFT>::getSection(const Elf_Sym &Sym) const {
return check(this->ELFObj.getSection(&Sym, this->Symbols, this->SymtabSHNDX));
return check(
this->getObj().getSection(&Sym, this->Symbols, this->SymtabSHNDX));
}
// Partially parse the shared object file so that we can call
@ -550,7 +551,7 @@ template <class ELFT> void SharedFile<ELFT>::parseSoName() {
typedef typename ELFT::uint uintX_t;
const Elf_Shdr *DynamicSec = nullptr;
const ELFFile<ELFT> Obj = this->ELFObj;
const ELFFile<ELFT> Obj = this->getObj();
ArrayRef<Elf_Shdr> Sections = check(Obj.sections());
for (const Elf_Shdr &Sec : Sections) {
switch (Sec.sh_type) {
@ -614,8 +615,8 @@ SharedFile<ELFT>::parseVerdefs(const Elf_Versym *&Versym) {
return Verdefs;
// The location of the first global versym entry.
Versym = reinterpret_cast<const Elf_Versym *>(this->ELFObj.base() +
VersymSec->sh_offset) +
const char *Base = this->MB.getBuffer().data();
Versym = reinterpret_cast<const Elf_Versym *>(Base + VersymSec->sh_offset) +
this->FirstNonLocal;
// We cannot determine the largest verdef identifier without inspecting
@ -627,7 +628,7 @@ SharedFile<ELFT>::parseVerdefs(const Elf_Versym *&Versym) {
// Build the Verdefs array by following the chain of Elf_Verdef objects
// from the start of the .gnu.version_d section.
const uint8_t *Verdef = this->ELFObj.base() + VerdefSec->sh_offset;
const char *Verdef = Base + VerdefSec->sh_offset;
for (unsigned I = 0; I != VerdefCount; ++I) {
auto *CurVerdef = reinterpret_cast<const Elf_Verdef *>(Verdef);
Verdef += CurVerdef->vd_next;

View File

@ -100,8 +100,9 @@ public:
return K == ObjectKind || K == SharedKind;
}
const llvm::object::ELFFile<ELFT> &getObj() const { return ELFObj; }
llvm::object::ELFFile<ELFT> &getObj() { return ELFObj; }
llvm::object::ELFFile<ELFT> getObj() const {
return llvm::object::ELFFile<ELFT>(MB.getBuffer());
}
StringRef getStringTable() const { return StringTable; }
@ -110,7 +111,6 @@ public:
Elf_Sym_Range getElfSymbols(bool OnlyGlobals);
protected:
llvm::object::ELFFile<ELFT> ELFObj;
ArrayRef<Elf_Sym> Symbols;
uint32_t FirstNonLocal = 0;
ArrayRef<Elf_Word> SymtabSHNDX;

View File

@ -563,7 +563,7 @@ template <class ELFT> void EhInputSection<ELFT>::split() {
return;
if (RelocSection) {
ELFFile<ELFT> &Obj = this->File->getObj();
ELFFile<ELFT> Obj = this->File->getObj();
if (RelocSection->sh_type == SHT_RELA)
split(check(Obj.relas(RelocSection)));
else

View File

@ -80,7 +80,7 @@ static ResolvedReloc<ELFT> resolveReloc(InputSectionBase<ELFT> &Sec,
template <class ELFT>
static void forEachSuccessor(InputSection<ELFT> &Sec,
std::function<void(ResolvedReloc<ELFT>)> Fn) {
ELFFile<ELFT> &Obj = Sec.getFile()->getObj();
ELFFile<ELFT> Obj = Sec.getFile()->getObj();
for (const typename ELFT::Shdr *RelSec : Sec.RelocSections) {
if (RelSec->sh_type == SHT_RELA) {
for (const typename ELFT::Rela &Rel : check(Obj.relas(RelSec)))
@ -153,7 +153,7 @@ scanEhFrameSection(EhInputSection<ELFT> &EH,
// .eh_frame keep other section alive and some don't.
EH.split();
ELFFile<ELFT> &EObj = EH.getFile()->getObj();
ELFFile<ELFT> EObj = EH.getFile()->getObj();
if (EH.RelocSection->sh_type == SHT_RELA)
scanEhFrameSection(EH, check(EObj.relas(EH.RelocSection)), Enqueue);
else

View File

@ -1177,7 +1177,7 @@ void EhOutputSection<ELFT>::addSection(InputSectionBase<ELFT> *C) {
return;
if (const Elf_Shdr *RelSec = Sec->RelocSection) {
ELFFile<ELFT> &Obj = Sec->getFile()->getObj();
ELFFile<ELFT> Obj = Sec->getFile()->getObj();
if (RelSec->sh_type == SHT_RELA)
addSectionAux(Sec, check(Obj.relas(RelSec)));
else

View File

@ -776,7 +776,7 @@ static void scanRelocs(InputSectionBase<ELFT> &C, ArrayRef<RelTy> Rels) {
template <class ELFT>
void scanRelocations(InputSectionBase<ELFT> &S,
const typename ELFT::Shdr &RelSec) {
ELFFile<ELFT> &EObj = S.getFile()->getObj();
ELFFile<ELFT> EObj = S.getFile()->getObj();
if (RelSec.sh_type == SHT_RELA)
scanRelocs(S, check(EObj.relas(&RelSec)));
else
@ -806,7 +806,7 @@ static void createThunks(InputSectionBase<ELFT> &C, ArrayRef<RelTy> Rels) {
template <class ELFT>
void createThunks(InputSectionBase<ELFT> &S,
const typename ELFT::Shdr &RelSec) {
ELFFile<ELFT> &EObj = S.getFile()->getObj();
ELFFile<ELFT> EObj = S.getFile()->getObj();
if (RelSec.sh_type == SHT_RELA)
createThunks(S, check(EObj.relas(&RelSec)));
else