summaryrefslogtreecommitdiff
path: root/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2013-12-07 03:05:51 +0000
committerLang Hames <lhames@gmail.com>2013-12-07 03:05:51 +0000
commite7777cdc643d15671c5a7bc7c24753820298c100 (patch)
tree474612a707de090c7ca2651c5d1d391c2c855fff /lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
parenteb2934e78230f0a03db4b35b33ba9eda77755967 (diff)
downloadllvm-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.cpp34
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 =