]> granicus.if.org Git - llvm/commitdiff
[MCJIT] Update MCJIT and get the fibonacci example working again.
authorLang Hames <lhames@gmail.com>
Sat, 11 Jun 2016 05:47:04 +0000 (05:47 +0000)
committerLang Hames <lhames@gmail.com>
Sat, 11 Jun 2016 05:47:04 +0000 (05:47 +0000)
MCJIT will now set the DataLayout on a module when it is added to the JIT,
rather than waiting until it is codegen'd, and the runFunction method will
finalize the module containing the function to be run before running it.

The fibonacci example has been updated to include and link against MCJIT.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272455 91177308-0d34-0410-b5e6-96231b3b80d8

examples/Fibonacci/CMakeLists.txt
examples/Fibonacci/fibonacci.cpp
lib/ExecutionEngine/MCJIT/MCJIT.cpp

index 087ccdd7d841d668769c690b51601be834c3fa0b..e294a2523759a9a08ad2171e9ec3c20aa876a42f 100644 (file)
@@ -3,6 +3,7 @@ set(LLVM_LINK_COMPONENTS
   ExecutionEngine
   Interpreter
   MC
+  MCJIT
   Support
   nativecodegen
   )
index 01f6d01fb1923be8c56e391bf3acd04f2cec1b89..16e52bf04099053916b76ba2add86b9381dcff87 100644 (file)
@@ -27,6 +27,7 @@
 #include "llvm/IR/Verifier.h"
 #include "llvm/ExecutionEngine/ExecutionEngine.h"
 #include "llvm/ExecutionEngine/GenericValue.h"
+#include "llvm/ExecutionEngine/MCJIT.h"
 #include "llvm/IR/Argument.h"
 #include "llvm/IR/BasicBlock.h"
 #include "llvm/IR/Constants.h"
@@ -103,6 +104,7 @@ int main(int argc, char **argv) {
   int n = argc > 1 ? atol(argv[1]) : 24;
 
   InitializeNativeTarget();
+  InitializeNativeTargetAsmPrinter();
   LLVMContext Context;
 
   // Create some module to put our function into it.
index 55c7ff08d2e13a334e393638caed2eb3e735a788..30f18db0a46757ffca77988200a4bbe7d78393cb 100644 (file)
@@ -85,6 +85,9 @@ MCJIT::MCJIT(std::unique_ptr<Module> M, std::unique_ptr<TargetMachine> TM,
   std::unique_ptr<Module> First = std::move(Modules[0]);
   Modules.clear();
 
+  if (First->getDataLayout().isDefault())
+    First->setDataLayout(getDataLayout());
+
   OwnedModules.addModule(std::move(First));
   RegisterJITEventListener(JITEventListener::createGDBRegistrationListener());
 }
@@ -103,6 +106,10 @@ MCJIT::~MCJIT() {
 
 void MCJIT::addModule(std::unique_ptr<Module> M) {
   MutexGuard locked(lock);
+
+  if (M->getDataLayout().isDefault())
+    M->setDataLayout(getDataLayout());
+
   OwnedModules.addModule(std::move(M));
 }
 
@@ -192,11 +199,7 @@ void MCJIT::generateCodeForModule(Module *M) {
   if (ObjCache)
     ObjectToLoad = ObjCache->getObject(M);
 
-  if (M->getDataLayout().isDefault()) {
-    M->setDataLayout(getDataLayout());
-  } else {
-    assert(M->getDataLayout() == getDataLayout() && "DataLayout Mismatch");
-  }
+  assert(M->getDataLayout() == getDataLayout() && "DataLayout Mismatch");
 
   // If the cache did not contain a suitable object, compile the object
   if (!ObjectToLoad) {
@@ -490,6 +493,7 @@ GenericValue MCJIT::runFunction(Function *F, ArrayRef<GenericValue> ArgValues) {
   assert(F && "Function *F was null at entry to run()");
 
   void *FPtr = getPointerToFunction(F);
+  finalizeModule(F->getParent());
   assert(FPtr && "Pointer to fn's code was null after getPointerToFunction");
   FunctionType *FTy = F->getFunctionType();
   Type *RetTy = FTy->getReturnType();