1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00

[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.

llvm-svn: 272455
This commit is contained in:
Lang Hames 2016-06-11 05:47:04 +00:00
parent 9a64a1c8f7
commit a4ac14ea38
3 changed files with 12 additions and 5 deletions

View File

@ -3,6 +3,7 @@ set(LLVM_LINK_COMPONENTS
ExecutionEngine ExecutionEngine
Interpreter Interpreter
MC MC
MCJIT
Support Support
nativecodegen nativecodegen
) )

View File

@ -27,6 +27,7 @@
#include "llvm/IR/Verifier.h" #include "llvm/IR/Verifier.h"
#include "llvm/ExecutionEngine/ExecutionEngine.h" #include "llvm/ExecutionEngine/ExecutionEngine.h"
#include "llvm/ExecutionEngine/GenericValue.h" #include "llvm/ExecutionEngine/GenericValue.h"
#include "llvm/ExecutionEngine/MCJIT.h"
#include "llvm/IR/Argument.h" #include "llvm/IR/Argument.h"
#include "llvm/IR/BasicBlock.h" #include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constants.h" #include "llvm/IR/Constants.h"
@ -103,6 +104,7 @@ int main(int argc, char **argv) {
int n = argc > 1 ? atol(argv[1]) : 24; int n = argc > 1 ? atol(argv[1]) : 24;
InitializeNativeTarget(); InitializeNativeTarget();
InitializeNativeTargetAsmPrinter();
LLVMContext Context; LLVMContext Context;
// Create some module to put our function into it. // Create some module to put our function into it.

View 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]); std::unique_ptr<Module> First = std::move(Modules[0]);
Modules.clear(); Modules.clear();
if (First->getDataLayout().isDefault())
First->setDataLayout(getDataLayout());
OwnedModules.addModule(std::move(First)); OwnedModules.addModule(std::move(First));
RegisterJITEventListener(JITEventListener::createGDBRegistrationListener()); RegisterJITEventListener(JITEventListener::createGDBRegistrationListener());
} }
@ -103,6 +106,10 @@ MCJIT::~MCJIT() {
void MCJIT::addModule(std::unique_ptr<Module> M) { void MCJIT::addModule(std::unique_ptr<Module> M) {
MutexGuard locked(lock); MutexGuard locked(lock);
if (M->getDataLayout().isDefault())
M->setDataLayout(getDataLayout());
OwnedModules.addModule(std::move(M)); OwnedModules.addModule(std::move(M));
} }
@ -192,11 +199,7 @@ void MCJIT::generateCodeForModule(Module *M) {
if (ObjCache) if (ObjCache)
ObjectToLoad = ObjCache->getObject(M); ObjectToLoad = ObjCache->getObject(M);
if (M->getDataLayout().isDefault()) { assert(M->getDataLayout() == getDataLayout() && "DataLayout Mismatch");
M->setDataLayout(getDataLayout());
} else {
assert(M->getDataLayout() == getDataLayout() && "DataLayout Mismatch");
}
// If the cache did not contain a suitable object, compile the object // If the cache did not contain a suitable object, compile the object
if (!ObjectToLoad) { if (!ObjectToLoad) {
@ -490,6 +493,7 @@ GenericValue MCJIT::runFunction(Function *F, ArrayRef<GenericValue> ArgValues) {
assert(F && "Function *F was null at entry to run()"); assert(F && "Function *F was null at entry to run()");
void *FPtr = getPointerToFunction(F); void *FPtr = getPointerToFunction(F);
finalizeModule(F->getParent());
assert(FPtr && "Pointer to fn's code was null after getPointerToFunction"); assert(FPtr && "Pointer to fn's code was null after getPointerToFunction");
FunctionType *FTy = F->getFunctionType(); FunctionType *FTy = F->getFunctionType();
Type *RetTy = FTy->getReturnType(); Type *RetTy = FTy->getReturnType();