From 051c948bbe3f64a7c450120963b28a5959382cb8 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 3 Apr 2014 03:13:33 +0000 Subject: [PATCH] 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 --- include/llvm/Object/COFF.h | 2 -- include/llvm/Object/ELFObjectFile.h | 35 ----------------------------------- include/llvm/Object/MachO.h | 2 -- include/llvm/Object/ObjectFile.h | 26 ++++++++++++++++++++++++-- lib/Object/COFFObjectFile.cpp | 16 ---------------- lib/Object/MachOObjectFile.cpp | 23 ----------------------- 6 files changed, 24 insertions(+), 80 deletions(-) diff --git a/include/llvm/Object/COFF.h b/include/llvm/Object/COFF.h index 6ece1b4cd50..6e05c2d0060 100644 --- a/include/llvm/Object/COFF.h +++ b/include/llvm/Object/COFF.h @@ -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, diff --git a/include/llvm/Object/ELFObjectFile.h b/include/llvm/Object/ELFObjectFile.h index bbb09f63289..2958067a298 100644 --- a/include/llvm/Object/ELFObjectFile.h +++ b/include/llvm/Object/ELFObjectFile.h @@ -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; @@ -239,39 +237,6 @@ error_code ELFObjectFile::getSymbolVersion(SymbolRef SymRef, } template -error_code ELFObjectFile::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 error_code ELFObjectFile::getSymbolAddress(DataRefImpl Symb, uint64_t &Result) const { const Elf_Sym *ESym = getSymbol(Symb); diff --git a/include/llvm/Object/MachO.h b/include/llvm/Object/MachO.h index 1a957d69513..f2426111a0c 100644 --- a/include/llvm/Object/MachO.h +++ b/include/llvm/Object/MachO.h @@ -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, diff --git a/include/llvm/Object/ObjectFile.h b/include/llvm/Object/ObjectFile.h index 87c1763a255..fa21417027b 100644 --- a/include/llvm/Object/ObjectFile.h +++ b/include/llvm/Object/ObjectFile.h @@ -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 { diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index cb3d478ff39..a75ebbf2a7c 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -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); diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index 24368df0f2a..12132a4b0c6 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -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); -- 2.11.0