From: Jim Grosbach Date: Tue, 22 Mar 2011 01:06:42 +0000 (+0000) Subject: Hook up the MCJIT to the RuntimeDyld library. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=f922910494377909b4cf2a0b73f509b2b1925799;p=oota-llvm.git 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 --- diff --git a/lib/ExecutionEngine/MCJIT/MCJIT.cpp b/lib/ExecutionEngine/MCJIT/MCJIT.cpp index 5eda88d1a38..2225ea6a15f 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 e81e7c7d347..947f7c78e38 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 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 3186bf26b2d..a57055eb8d2 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())