aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ExecutionEngine
diff options
context:
space:
mode:
authorJim Grosbach <grosbach@apple.com>2011-03-22 01:06:42 +0000
committerJim Grosbach <grosbach@apple.com>2011-03-22 01:06:42 +0000
commitf922910494377909b4cf2a0b73f509b2b1925799 (patch)
treec37590a3359f2455da81da8d741d996bb40c0a79 /lib/ExecutionEngine
parentbd17478f2f6dd3630c4e2fafaa71e2424e08c96e (diff)
downloadexternal_llvm-f922910494377909b4cf2a0b73f509b2b1925799.zip
external_llvm-f922910494377909b4cf2a0b73f509b2b1925799.tar.gz
external_llvm-f922910494377909b4cf2a0b73f509b2b1925799.tar.bz2
Hook up the MCJIT to the RuntimeDyld library.
Lots of cleanup to make the interfaces prettier, use the JITMemoryManager, handle multiple functions and modules, etc.. This gets far enough that the MCJIT compiles and runs code, though. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128052 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine')
-rw-r--r--lib/ExecutionEngine/MCJIT/MCJIT.cpp12
-rw-r--r--lib/ExecutionEngine/MCJIT/MCJIT.h3
-rw-r--r--lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp10
3 files changed, 22 insertions, 3 deletions
diff --git a/lib/ExecutionEngine/MCJIT/MCJIT.cpp b/lib/ExecutionEngine/MCJIT/MCJIT.cpp
index 5eda88d..2225ea6 100644
--- a/lib/ExecutionEngine/MCJIT/MCJIT.cpp
+++ b/lib/ExecutionEngine/MCJIT/MCJIT.cpp
@@ -11,8 +11,11 @@
#include "llvm/Function.h"
#include "llvm/ExecutionEngine/GenericValue.h"
#include "llvm/ExecutionEngine/MCJIT.h"
+#include "llvm/ExecutionEngine/JITMemoryManager.h"
+#include "llvm/MC/MCAsmInfo.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/DynamicLibrary.h"
+#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Target/TargetData.h"
using namespace llvm;
@@ -81,6 +84,12 @@ MCJIT::MCJIT(Module *m, TargetMachine *tm, TargetJITInfo &tji,
PM.run(*M);
// Flush the output buffer so the SmallVector gets its data.
OS.flush();
+
+ // Load the object into the dynamic linker.
+ // FIXME: It would be nice to avoid making yet another copy.
+ MemoryBuffer *MB = MemoryBuffer::getMemBufferCopy(StringRef(Buffer.data(),
+ Buffer.size()));
+ Dyld.loadObject(MB);
}
MCJIT::~MCJIT() {
@@ -92,7 +101,8 @@ void *MCJIT::getPointerToBasicBlock(BasicBlock *BB) {
}
void *MCJIT::getPointerToFunction(Function *F) {
- return 0;
+ Twine Name = TM->getMCAsmInfo()->getGlobalPrefix() + F->getName();
+ return Dyld.getSymbolAddress(Name.str());
}
void *MCJIT::recompileAndRelinkFunction(Function *F) {
diff --git a/lib/ExecutionEngine/MCJIT/MCJIT.h b/lib/ExecutionEngine/MCJIT/MCJIT.h
index e81e7c7..947f7c7 100644
--- a/lib/ExecutionEngine/MCJIT/MCJIT.h
+++ b/lib/ExecutionEngine/MCJIT/MCJIT.h
@@ -12,6 +12,7 @@
#include "llvm/PassManager.h"
#include "llvm/ExecutionEngine/ExecutionEngine.h"
+#include "llvm/ExecutionEngine/RuntimeDyld.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/raw_ostream.h"
@@ -37,6 +38,8 @@ class MCJIT : public ExecutionEngine {
SmallVector<char, 4096> Buffer; // Working buffer into which we JIT.
raw_svector_ostream OS;
+ RuntimeDyld Dyld;
+
public:
~MCJIT();
diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
index 3186bf2..a57055e 100644
--- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
+++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
@@ -145,6 +145,10 @@ loadSegment32(const MachOObject *Obj,
SymbolTable[Name] = Address;
}
+ // We've loaded the section; now mark the functions in it as executable.
+ // FIXME: We really should use the JITMemoryManager for this.
+ sys::Memory::setRangeExecutable(Data.base(), Data.size());
+
delete SectionBases;
return false;
}
@@ -220,12 +224,14 @@ loadSegment64(const MachOObject *Obj,
SymbolTable[Name] = Address;
}
+ // We've loaded the section; now mark the functions in it as executable.
+ // FIXME: We really should use the JITMemoryManager for this.
+ sys::Memory::setRangeExecutable(Data.base(), Data.size());
+
delete SectionBases;
return false;
}
-
-
bool RuntimeDyldImpl::loadObject(MemoryBuffer *InputBuffer) {
// If the linker is in an error state, don't do anything.
if (hasError())