From df424f76e50dd7fb42a6a4949b3c2c892cf8a797 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Sat, 11 Jun 2016 05:47:04 +0000 Subject: [PATCH] [MCJIT] Update MCJIT and get the fibonacci example working again. 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 | 1 + examples/Fibonacci/fibonacci.cpp | 2 ++ lib/ExecutionEngine/MCJIT/MCJIT.cpp | 14 +++++++++----- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/examples/Fibonacci/CMakeLists.txt b/examples/Fibonacci/CMakeLists.txt index 087ccdd7d84..e294a252375 100644 --- a/examples/Fibonacci/CMakeLists.txt +++ b/examples/Fibonacci/CMakeLists.txt @@ -3,6 +3,7 @@ set(LLVM_LINK_COMPONENTS ExecutionEngine Interpreter MC + MCJIT Support nativecodegen ) diff --git a/examples/Fibonacci/fibonacci.cpp b/examples/Fibonacci/fibonacci.cpp index 01f6d01fb19..16e52bf0409 100644 --- a/examples/Fibonacci/fibonacci.cpp +++ b/examples/Fibonacci/fibonacci.cpp @@ -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. diff --git a/lib/ExecutionEngine/MCJIT/MCJIT.cpp b/lib/ExecutionEngine/MCJIT/MCJIT.cpp index 55c7ff08d2e..30f18db0a46 100644 --- a/lib/ExecutionEngine/MCJIT/MCJIT.cpp +++ b/lib/ExecutionEngine/MCJIT/MCJIT.cpp @@ -85,6 +85,9 @@ MCJIT::MCJIT(std::unique_ptr M, std::unique_ptr TM, std::unique_ptr 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 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 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(); -- 2.50.1