mirror of
https://github.com/intel/llvm.git
synced 2026-01-31 16:29:50 +08:00
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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user