Hook up the MCJIT to the RuntimeDyld library.
authorJim Grosbach <grosbach@apple.com>
Tue, 22 Mar 2011 01:06:42 +0000 (01:06 +0000)
committerJim Grosbach <grosbach@apple.com>
Tue, 22 Mar 2011 01:06:42 +0000 (01:06 +0000)
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

lib/ExecutionEngine/MCJIT/MCJIT.cpp
lib/ExecutionEngine/MCJIT/MCJIT.h
lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp

index 5eda88d1a382d9e5b1b06984d1e7f7872e87fd94..2225ea6a15f15f4a9b9feaa712e6f29fcfa21a6a 100644 (file)
 #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) {
index e81e7c7d3477084bc3ec6fd53a485af7e9d37683..947f7c78e38d1b8aa52b4b564492a8806e151bbd 100644 (file)
@@ -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();
 
index 3186bf26b2d9d80f8c08d6a403793233da8c0120..a57055eb8d2db590c130a157e79e77378f9a8875 100644 (file)
@@ -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())