Implement get getSymbolFileOffset with getSymbolAddress.

This has the following advantages:
* Less code.
* The old ELF implementation was wrong for non-relocatable objects.
* The old ELF implementation (and I think MachO) was wrong for thumb.

No current testcase since this is only used from MCJIT and it only uses
relocatable objects and I don't think it supports thumb yet.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205508 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2014-04-03 03:13:33 +00:00
parent 3539519223
commit 051c948bbe
6 changed files with 24 additions and 80 deletions

View File

@ -363,8 +363,6 @@ protected:
void moveSymbolNext(DataRefImpl &Symb) const override;
error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const override;
error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const override;
error_code getSymbolFileOffset(DataRefImpl Symb,
uint64_t &Res) const override;
error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const override;
uint32_t getSymbolFlags(DataRefImpl Symb) const override;
error_code getSymbolType(DataRefImpl Symb,

View File

@ -58,8 +58,6 @@ protected:
void moveSymbolNext(DataRefImpl &Symb) const override;
error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const override;
error_code getSymbolFileOffset(DataRefImpl Symb,
uint64_t &Res) const override;
error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const override;
error_code getSymbolAlignment(DataRefImpl Symb, uint32_t &Res) const override;
error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const override;
@ -238,39 +236,6 @@ error_code ELFObjectFile<ELFT>::getSymbolVersion(SymbolRef SymRef,
return object_error::success;
}
template <class ELFT>
error_code ELFObjectFile<ELFT>::getSymbolFileOffset(DataRefImpl Symb,
uint64_t &Result) const {
const Elf_Sym *ESym = getSymbol(Symb);
const Elf_Shdr *ESec;
switch (EF.getSymbolTableIndex(ESym)) {
case ELF::SHN_COMMON:
// Unintialized symbols have no offset in the object file
case ELF::SHN_UNDEF:
Result = UnknownAddressOrSize;
return object_error::success;
case ELF::SHN_ABS:
Result = ESym->st_value;
return object_error::success;
default:
ESec = EF.getSection(ESym);
}
switch (ESym->getType()) {
case ELF::STT_SECTION:
Result = ESec ? ESec->sh_offset : UnknownAddressOrSize;
return object_error::success;
case ELF::STT_FUNC:
case ELF::STT_OBJECT:
case ELF::STT_NOTYPE:
Result = ESym->st_value + (ESec ? ESec->sh_offset : 0);
return object_error::success;
default:
Result = UnknownAddressOrSize;
return object_error::success;
}
}
template <class ELFT>
error_code ELFObjectFile<ELFT>::getSymbolAddress(DataRefImpl Symb,
uint64_t &Result) const {

View File

@ -62,8 +62,6 @@ public:
void moveSymbolNext(DataRefImpl &Symb) const override;
error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const override;
error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const override;
error_code getSymbolFileOffset(DataRefImpl Symb,
uint64_t &Res) const override;
error_code getSymbolAlignment(DataRefImpl Symb, uint32_t &Res) const override;
error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const override;
error_code getSymbolType(DataRefImpl Symb,

View File

@ -228,7 +228,6 @@ protected:
virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const = 0;
error_code printSymbolName(raw_ostream &OS, DataRefImpl Symb) const override;
virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const = 0;
virtual error_code getSymbolFileOffset(DataRefImpl Symb, uint64_t &Res)const=0;
virtual error_code getSymbolAlignment(DataRefImpl Symb, uint32_t &Res) const;
virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const = 0;
virtual error_code getSymbolType(DataRefImpl Symb,
@ -352,7 +351,30 @@ inline error_code SymbolRef::getAddress(uint64_t &Result) const {
}
inline error_code SymbolRef::getFileOffset(uint64_t &Result) const {
return getObject()->getSymbolFileOffset(getRawDataRefImpl(), Result);
uint64_t Address;
if (error_code EC = getAddress(Address))
return EC;
const ObjectFile *Obj = getObject();
section_iterator SecI(Obj->section_begin());
if (error_code EC = getSection(SecI))
return EC;
uint64_t SectionAddress;
if (error_code EC = SecI->getAddress(SectionAddress))
return EC;
uint64_t OffsetInSection = Address - SectionAddress;
StringRef SecContents;
if (error_code EC = SecI->getContents(SecContents))
return EC;
// FIXME: this is a hack.
uint64_t SectionOffset = (uint64_t)SecContents.data() - (uint64_t)Obj->base();
Result = SectionOffset + OffsetInSection;
return object_error::success;
}
inline error_code SymbolRef::getAlignment(uint32_t &Result) const {

View File

@ -135,22 +135,6 @@ error_code COFFObjectFile::getSymbolName(DataRefImpl Ref,
return getSymbolName(Symb, Result);
}
error_code COFFObjectFile::getSymbolFileOffset(DataRefImpl Ref,
uint64_t &Result) const {
const coff_symbol *Symb = toSymb(Ref);
const coff_section *Section = NULL;
if (error_code EC = getSection(Symb->SectionNumber, Section))
return EC;
if (Symb->SectionNumber == COFF::IMAGE_SYM_UNDEFINED)
Result = UnknownAddressOrSize;
else if (Section)
Result = Section->PointerToRawData + Symb->Value;
else
Result = Symb->Value;
return object_error::success;
}
error_code COFFObjectFile::getSymbolAddress(DataRefImpl Ref,
uint64_t &Result) const {
const coff_symbol *Symb = toSymb(Ref);

View File

@ -479,29 +479,6 @@ error_code MachOObjectFile::getSymbolAddress(DataRefImpl Symb,
return object_error::success;
}
error_code
MachOObjectFile::getSymbolFileOffset(DataRefImpl Symb,
uint64_t &Res) const {
nlist_base Entry = getSymbolTableEntryBase(this, Symb);
getSymbolAddress(Symb, Res);
if (Entry.n_sect) {
uint64_t Delta;
DataRefImpl SecRel;
SecRel.d.a = Entry.n_sect-1;
if (is64Bit()) {
MachO::section_64 Sec = getSection64(SecRel);
Delta = Sec.offset - Sec.addr;
} else {
MachO::section Sec = getSection(SecRel);
Delta = Sec.offset - Sec.addr;
}
Res += Delta;
}
return object_error::success;
}
error_code MachOObjectFile::getSymbolAlignment(DataRefImpl DRI,
uint32_t &Result) const {
uint32_t flags = getSymbolFlags(DRI);