Skip to content

Commit

Permalink
[MCJIT] Update MCJIT and get the fibonacci example working again.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
lhames committed Jun 11, 2016
1 parent ff7edbe commit df424f7
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 5 deletions.
1 change: 1 addition & 0 deletions examples/Fibonacci/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ set(LLVM_LINK_COMPONENTS
ExecutionEngine
Interpreter
MC
MCJIT
Support
nativecodegen
)
Expand Down
2 changes: 2 additions & 0 deletions examples/Fibonacci/fibonacci.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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.
Expand Down
14 changes: 9 additions & 5 deletions lib/ExecutionEngine/MCJIT/MCJIT.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
Expand All @@ -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));
}

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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();
Expand Down

0 comments on commit df424f7

Please sign in to comment.