Skip to content

Commit

Permalink
Convert getFileOffset to getOffset and move it to its only user.
Browse files Browse the repository at this point in the history
We normally don't drop functions from the C API's, but in this case I think we
can:

* The old implementation of getFileOffset was fairly broken
* The introduction of LLVMGetSymbolFileOffset was itself a C api breaking
  change as it removed LLVMGetSymbolOffset.
* It is an incredibly specialized use case. The only reason MCJIT needs it is
  because of its odd position of being a dynamic linker of .o files.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206750 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
espindola committed Apr 21, 2014
1 parent d329c79 commit 7426771
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 69 deletions.
12 changes: 0 additions & 12 deletions bindings/python/llvm/object.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,14 +310,6 @@ def address(self):

return lib.LLVMGetSymbolAddress(self)

@CachedProperty
def file_offset(self):
"""The offset of this symbol in the file, in long bytes."""
if self.expired:
raise Exception('Symbol instance has expired.')

return lib.LLVMGetSymbolFileOffset(self)

@CachedProperty
def size(self):
"""The size of the symbol, in long bytes."""
Expand Down Expand Up @@ -345,7 +337,6 @@ def cache(self):
"""Cache all cacheable properties."""
getattr(self, 'name')
getattr(self, 'address')
getattr(self, 'file_offset')
getattr(self, 'size')

def expire(self):
Expand Down Expand Up @@ -495,9 +486,6 @@ def register_library(library):
library.LLVMGetSymbolAddress.argtypes = [Symbol]
library.LLVMGetSymbolAddress.restype = c_uint64

library.LLVMGetSymbolFileOffset.argtypes = [Symbol]
library.LLVMGetSymbolFileOffset.restype = c_uint64

library.LLVMGetSymbolSize.argtypes = [Symbol]
library.LLVMGetSymbolSize.restype = c_uint64

Expand Down
1 change: 0 additions & 1 deletion include/llvm-c/Object.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@ void LLVMMoveToNextRelocation(LLVMRelocationIteratorRef RI);
// SymbolRef accessors
const char *LLVMGetSymbolName(LLVMSymbolIteratorRef SI);
uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI);
uint64_t LLVMGetSymbolFileOffset(LLVMSymbolIteratorRef SI);
uint64_t LLVMGetSymbolSize(LLVMSymbolIteratorRef SI);

// RelocationRef accessors
Expand Down
37 changes: 0 additions & 37 deletions include/llvm/Object/ObjectFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,6 @@ class SymbolRef : public BasicSymbolRef {
/// Returns the symbol virtual address (i.e. address at which it will be
/// mapped).
error_code getAddress(uint64_t &Result) const;
error_code getFileOffset(uint64_t &Result) const;
/// @brief Get the alignment of this symbol as the actual value (not log 2).
error_code getAlignment(uint32_t &Result) const;
error_code getSize(uint64_t &Result) const;
Expand Down Expand Up @@ -348,42 +347,6 @@ inline error_code SymbolRef::getAddress(uint64_t &Result) const {
return getObject()->getSymbolAddress(getRawDataRefImpl(), Result);
}

inline error_code SymbolRef::getFileOffset(uint64_t &Result) const {
uint64_t Address;
if (error_code EC = getAddress(Address))
return EC;
if (Address == UnknownAddressOrSize) {
Result = UnknownAddressOrSize;
return object_error::success;
}

const ObjectFile *Obj = getObject();
section_iterator SecI(Obj->section_begin());
if (error_code EC = getSection(SecI))
return EC;

if (SecI == Obj->section_end()) {
Result = UnknownAddressOrSize;
return object_error::success;
}

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 {
return getObject()->getSymbolAlignment(getRawDataRefImpl(), Result);
}
Expand Down
41 changes: 32 additions & 9 deletions lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,34 @@ void RuntimeDyldImpl::mapSectionAddress(const void *LocalAddress,
llvm_unreachable("Attempting to remap address of unknown section!");
}

static error_code getOffset(const SymbolRef &Sym, uint64_t &Result) {
uint64_t Address;
if (error_code EC = Sym.getAddress(Address))
return EC;

if (Address == UnknownAddressOrSize) {
Result = UnknownAddressOrSize;
return object_error::success;
}

const ObjectFile *Obj = Sym.getObject();
section_iterator SecI(Obj->section_begin());
if (error_code EC = Sym.getSection(SecI))
return EC;

if (SecI == Obj->section_end()) {
Result = UnknownAddressOrSize;
return object_error::success;
}

uint64_t SectionAddress;
if (error_code EC = SecI->getAddress(SectionAddress))
return EC;

Result = Address - SectionAddress;
return object_error::success;
}

ObjectImage *RuntimeDyldImpl::loadObject(ObjectImage *InputObject) {
MutexGuard locked(lock);

Expand Down Expand Up @@ -125,26 +153,21 @@ ObjectImage *RuntimeDyldImpl::loadObject(ObjectImage *InputObject) {
if (SymType == object::SymbolRef::ST_Function ||
SymType == object::SymbolRef::ST_Data ||
SymType == object::SymbolRef::ST_Unknown) {
uint64_t FileOffset;
uint64_t SectOffset;
StringRef SectionData;
bool IsCode;
section_iterator SI = Obj->end_sections();
Check(I->getFileOffset(FileOffset));
Check(getOffset(*I, SectOffset));
Check(I->getSection(SI));
if (SI == Obj->end_sections())
continue;
Check(SI->getContents(SectionData));
Check(SI->isText(IsCode));
const uint8_t *SymPtr =
(const uint8_t *)Obj->getData().data() + (uintptr_t)FileOffset;
uintptr_t SectOffset =
(uintptr_t)(SymPtr - (const uint8_t *)SectionData.begin());
unsigned SectionID =
findOrEmitSection(*Obj, *SI, IsCode, LocalSections);
LocalSymbols[Name.data()] = SymbolLoc(SectionID, SectOffset);
DEBUG(dbgs() << "\tFileOffset: " << format("%p", (uintptr_t)FileOffset)
<< " flags: " << Flags << " SID: " << SectionID
<< " Offset: " << format("%p", SectOffset));
DEBUG(dbgs() << "\tOffset: " << format("%p", (uintptr_t)SectOffset)
<< " flags: " << Flags << " SID: " << SectionID);
GlobalSymbolTable[Name] = SymbolLoc(SectionID, SectOffset);
}
}
Expand Down
7 changes: 0 additions & 7 deletions lib/Object/Object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -184,13 +184,6 @@ uint64_t LLVMGetSymbolAddress(LLVMSymbolIteratorRef SI) {
return ret;
}

uint64_t LLVMGetSymbolFileOffset(LLVMSymbolIteratorRef SI) {
uint64_t ret;
if (error_code ec = (*unwrap(SI))->getFileOffset(ret))
report_fatal_error(ec.message());
return ret;
}

uint64_t LLVMGetSymbolSize(LLVMSymbolIteratorRef SI) {
uint64_t ret;
if (error_code ec = (*unwrap(SI))->getSize(ret))
Expand Down
5 changes: 2 additions & 3 deletions tools/llvm-c-test/object.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,8 @@ int object_list_symbols(void) {
while (!LLVMIsSymbolIteratorAtEnd(O, sym)) {

LLVMMoveToContainingSection(sect, sym);
printf("%s @0x%08" PRIx64 "/0x%08" PRIx64 " +%" PRIu64 " (%s)\n",
LLVMGetSymbolName(sym), LLVMGetSymbolAddress(sym),
LLVMGetSymbolFileOffset(sym), LLVMGetSymbolSize(sym),
printf("%s @0x%08" PRIx64 " +%" PRIu64 " (%s)\n", LLVMGetSymbolName(sym),
LLVMGetSymbolAddress(sym), LLVMGetSymbolSize(sym),
LLVMGetSectionName(sect));

LLVMMoveToNextSymbol(sym);
Expand Down

0 comments on commit 7426771

Please sign in to comment.