diff options
author | Lang Hames <lhames@gmail.com> | 2013-12-07 03:05:51 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2013-12-07 03:05:51 +0000 |
commit | e7777cdc643d15671c5a7bc7c24753820298c100 (patch) | |
tree | 474612a707de090c7ca2651c5d1d391c2c855fff /lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp | |
parent | eb2934e78230f0a03db4b35b33ba9eda77755967 (diff) | |
download | llvm-e7777cdc643d15671c5a7bc7c24753820298c100.tar.gz llvm-e7777cdc643d15671c5a7bc7c24753820298c100.tar.bz2 llvm-e7777cdc643d15671c5a7bc7c24753820298c100.tar.xz |
Add support for archives and object file caching under MCJIT.
Patch by Andy Kaylor, with minor edits to resolve merge conflicts.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196639 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp')
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp index 161135a4f8..800a75ef7e 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp @@ -82,12 +82,24 @@ ObjectImage *RuntimeDyldImpl::createObjectImage(ObjectBuffer *InputBuffer) { return new ObjectImageCommon(InputBuffer); } +ObjectImage *RuntimeDyldImpl::createObjectImageFromFile(ObjectFile *InputObject) { + return new ObjectImageCommon(InputObject); +} + +ObjectImage *RuntimeDyldImpl::loadObject(ObjectFile *InputObject) { + return loadObject(createObjectImageFromFile(InputObject)); +} + ObjectImage *RuntimeDyldImpl::loadObject(ObjectBuffer *InputBuffer) { + return loadObject(createObjectImage(InputBuffer)); +} + +ObjectImage *RuntimeDyldImpl::loadObject(ObjectImage *InputObject) { MutexGuard locked(lock); - OwningPtr<ObjectImage> obj(createObjectImage(InputBuffer)); + OwningPtr<ObjectImage> obj(InputObject); if (!obj) - report_fatal_error("Unable to create object image from memory buffer!"); + return NULL; // Save information about our target Arch = (Triple::ArchType)obj->getArch(); @@ -139,7 +151,7 @@ ObjectImage *RuntimeDyldImpl::loadObject(ObjectBuffer *InputBuffer) { if (si == obj->end_sections()) continue; Check(si->getContents(SectionData)); Check(si->isText(IsCode)); - const uint8_t* SymPtr = (const uint8_t*)InputBuffer->getBufferStart() + + const uint8_t* SymPtr = (const uint8_t*)InputObject->getData().data() + (uintptr_t)FileOffset; uintptr_t SectOffset = (uintptr_t)(SymPtr - (const uint8_t*)SectionData.begin()); @@ -563,6 +575,22 @@ RuntimeDyld::~RuntimeDyld() { delete Dyld; } +ObjectImage *RuntimeDyld::loadObject(ObjectFile *InputObject) { + if (!Dyld) { + if (InputObject->isELF()) + Dyld = new RuntimeDyldELF(MM); + else if (InputObject->isMachO()) + Dyld = new RuntimeDyldMachO(MM); + else + report_fatal_error("Incompatible object format!"); + } else { + if (!Dyld->isCompatibleFile(InputObject)) + report_fatal_error("Incompatible object format!"); + } + + return Dyld->loadObject(InputObject); +} + ObjectImage *RuntimeDyld::loadObject(ObjectBuffer *InputBuffer) { if (!Dyld) { sys::fs::file_magic Type = |