[vmkit-commits] [vmkit] r196289 - retreive the function pointer after compilation from a J3CodeGen
Gael Thomas
gael.thomas at lip6.fr
Tue Dec 3 07:40:05 PST 2013
Author: gthomas
Date: Tue Dec 3 09:40:05 2013
New Revision: 196289
URL: http://llvm.org/viewvc/llvm-project?rev=196289&view=rev
Log:
retreive the function pointer after compilation from a J3CodeGen
Modified:
vmkit/branches/mcjit/include/j3/j3codegen.h
vmkit/branches/mcjit/include/j3/j3method.h
vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
vmkit/branches/mcjit/lib/j3/vm/j3method.cc
Modified: vmkit/branches/mcjit/include/j3/j3codegen.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=196289&r1=196288&r2=196289&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3codegen.h (original)
+++ vmkit/branches/mcjit/include/j3/j3codegen.h Tue Dec 3 09:40:05 2013
@@ -60,7 +60,7 @@ namespace j3 {
llvm::Module* module;
llvm::BasicBlock* bb;
llvm::IRBuilder<>* builder;
- llvm::Function* llvmFunction;
+ llvm::Function* _llvmFunction;
J3* vm;
J3Class* cl;
@@ -202,7 +202,8 @@ namespace j3 {
static J3CodeGen* create(J3Method* method);
static void destroy(J3CodeGen* codeGen);
- llvm::Function* generate();
+ llvm::Function* llvmFunction() { return _llvmFunction; }
+ uint8_t* fnPtr();
};
}
Modified: vmkit/branches/mcjit/include/j3/j3method.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=196289&r1=196288&r2=196289&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3method.h (original)
+++ vmkit/branches/mcjit/include/j3/j3method.h Tue Dec 3 09:40:05 2013
@@ -65,7 +65,8 @@ namespace j3 {
J3MethodType* _methodType;
J3Attributes* _attributes;
uint32_t _index;
- llvm::Function* _compiledFunction;
+ llvm::Function* _llvmFunction;
+ uint8_t* _fnPtr;
char* volatile _llvmAllNames; /* md_ + llvm Name */
size_t _llvmAllNamesLength;
void* _nativeFnPtr;
Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=196289&r1=196288&r2=196289&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Tue Dec 3 09:40:05 2013
@@ -12,11 +12,15 @@
#include "j3/j3jni.h"
#include "j3/j3object.h"
+#include "llvm/ExecutionEngine/ExecutionEngine.h"
+
#include "llvm/IR/Function.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Argument.h"
+
#include "llvm/DebugInfo.h"
#include "llvm/DIBuilder.h"
+#include "llvm/PassManager.h"
using namespace j3;
@@ -40,8 +44,8 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato
module = loader->module();
vm = loader->vm();
- llvmFunction = method->llvmFunction(0, module);
- llvmFunction->setGC("vmkit");
+ _llvmFunction = method->llvmFunction(0, module);
+ llvmFunction()->setGC("vmkit");
bbCheckCastFailed = 0;
bbNullCheckFailed = 0;
@@ -87,6 +91,19 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato
ziTry =
(llvm::Function*)module->getOrInsertFunction("vmkit.try",
llvm::FunctionType::get(llvm::Type::getVoidTy(module->getContext()), 0));
+
+ bb = llvm::BasicBlock::Create(llvmFunction()->getContext(), "entry", llvmFunction());
+ llvm::IRBuilder<> _builder(bb);
+
+ builder = &_builder;
+
+ if(J3Cst::isNative(method->access()))
+ generateNative();
+ else
+ generateJava();
+
+ loader->pm()->run(*llvmFunction());
+ vm->ee()->recompileAndRelinkFunction(llvmFunction());
}
J3CodeGen::~J3CodeGen() {
@@ -110,6 +127,10 @@ void J3CodeGen::destroy(J3CodeGen* codeG
vmkit::BumpAllocator::destroy(allocator);
}
+uint8_t* J3CodeGen::fnPtr() {
+ return (uint8_t*)vm->ee()->getPointerToFunction(llvmFunction());
+}
+
uint32_t J3CodeGen::wideReadU1() {
if(isWide) {
isWide = 0;
@@ -193,10 +214,10 @@ llvm::Value* J3CodeGen::vt(J3Type* type)
llvm::Value* J3CodeGen::nullCheck(llvm::Value* obj) {
if(exceptionNodes[curExceptionNode]->landingPad) {
- llvm::BasicBlock* succeed = llvm::BasicBlock::Create(llvmFunction->getContext(), "nullcheck-succeed", llvmFunction);
+ llvm::BasicBlock* succeed = llvm::BasicBlock::Create(llvmFunction()->getContext(), "nullcheck-succeed", llvmFunction());
if(!bbNullCheckFailed) {
- bbNullCheckFailed = llvm::BasicBlock::Create(llvmFunction->getContext(), "nullcheck-failed", llvmFunction);
+ bbNullCheckFailed = llvm::BasicBlock::Create(llvmFunction()->getContext(), "nullcheck-failed", llvmFunction());
builder->SetInsertPoint(bbNullCheckFailed);
builder->CreateInvoke(funcNullPointerException, bbRet, exceptionNodes[curExceptionNode]->landingPad);
builder->SetInsertPoint(bb);
@@ -225,7 +246,7 @@ void J3CodeGen::invoke(J3Method* target,
llvm::Value* res;
if(exceptionNodes[curExceptionNode]->landingPad) {
- llvm::BasicBlock* after = llvm::BasicBlock::Create(llvmFunction->getContext(), "invoke-after", llvmFunction);
+ llvm::BasicBlock* after = llvm::BasicBlock::Create(llvmFunction()->getContext(), "invoke-after", llvmFunction());
res = builder->CreateInvoke(func, after, exceptionNodes[curExceptionNode]->landingPad, args);
bb = after;
builder->SetInsertPoint(bb);
@@ -405,8 +426,8 @@ llvm::Value* J3CodeGen::isAssignableTo(l
void J3CodeGen::instanceof(llvm::Value* obj, J3Type* type) {
llvm::BasicBlock* after = forwardBranch("instanceof-after", codeReader->tell(), 0, 0);
- llvm::BasicBlock* ok = llvm::BasicBlock::Create(llvmFunction->getContext(), "instanceof-ok", llvmFunction);
- llvm::BasicBlock* test = llvm::BasicBlock::Create(llvmFunction->getContext(), "instanceof", llvmFunction);
+ llvm::BasicBlock* ok = llvm::BasicBlock::Create(llvmFunction()->getContext(), "instanceof-ok", llvmFunction());
+ llvm::BasicBlock* test = llvm::BasicBlock::Create(llvmFunction()->getContext(), "instanceof", llvmFunction());
builder->CreateCondBr(builder->CreateIsNull(obj), ok, test);
@@ -422,12 +443,12 @@ void J3CodeGen::instanceof(llvm::Value*
void J3CodeGen::checkCast(llvm::Value* obj, J3Type* type) {
llvm::BasicBlock* succeed = forwardBranch("checkcast-succeed", codeReader->tell(), 0, 0);
- llvm::BasicBlock* test = llvm::BasicBlock::Create(llvmFunction->getContext(), "checkcast", llvmFunction);
+ llvm::BasicBlock* test = llvm::BasicBlock::Create(llvmFunction()->getContext(), "checkcast", llvmFunction());
builder->CreateCondBr(builder->CreateIsNull(obj), succeed, test);
if(!bbCheckCastFailed) {
- bbCheckCastFailed = llvm::BasicBlock::Create(llvmFunction->getContext(), "checkcast-failed", llvmFunction);
+ bbCheckCastFailed = llvm::BasicBlock::Create(llvmFunction()->getContext(), "checkcast-failed", llvmFunction());
builder->SetInsertPoint(bbCheckCastFailed);
builder->CreateCall(funcClassCastException);
builder->CreateBr(bbRet);
@@ -539,7 +560,7 @@ llvm::BasicBlock* J3CodeGen::forwardBran
opInfos[pc].bb = after;
return after;
} else {
- llvm::BasicBlock* res = llvm::BasicBlock::Create(llvmFunction->getContext(), id, llvmFunction);
+ llvm::BasicBlock* res = llvm::BasicBlock::Create(llvmFunction()->getContext(), id, llvmFunction());
if(doAlloc) {
opInfos[pc].metaStack = (llvm::Type**)allocator->allocate(sizeof(llvm::Type**)*stack.topStack);
@@ -701,7 +722,7 @@ void J3CodeGen::translate() {
switch(vm->options()->debugTranslate) {
case 4:
fprintf(stderr, "--------------------------------------------\n");
- llvmFunction->dump();
+ llvmFunction()->dump();
case 3:
fprintf(stderr, "stack:\n");
stack.dump();
@@ -1298,7 +1319,7 @@ void J3CodeGen::initExceptionNode(J3Exce
void J3CodeGen::addToExceptionNode(J3ExceptionNode* node, J3ExceptionEntry* entry) {
if(!node->nbEntries) {
- node->landingPad = llvm::BasicBlock::Create(llvmFunction->getContext(), "landing-pad", llvmFunction);
+ node->landingPad = llvm::BasicBlock::Create(llvmFunction()->getContext(), "landing-pad", llvmFunction());
node->curCheck = node->landingPad;
builder->SetInsertPoint(node->landingPad);
@@ -1322,7 +1343,7 @@ void J3CodeGen::addToExceptionNode(J3Exc
if(node->curCheck) { /* = 0 if I already have a finally */
builder->SetInsertPoint(node->curCheck);
- node->curCheck = llvm::BasicBlock::Create(llvmFunction->getContext(), "next-exception-check", llvmFunction);
+ node->curCheck = llvm::BasicBlock::Create(llvmFunction()->getContext(), "next-exception-check", llvmFunction());
if(entry->catchType) {
stack.metaStack[0] = vm->typeJ3ObjectPtr;
@@ -1362,8 +1383,8 @@ void J3CodeGen::generateJava() {
dbgInfo =
loader->dbgBuilder()->createFunction(llvm::DIDescriptor(), // Function scope
- llvmFunction->getName(), // Function name
- llvmFunction->getName(), // Mangled name
+ llvmFunction()->getName(), // Function name
+ llvmFunction()->getName(), // Mangled name
llvm::DIFile(), // File where this variable is defined
0, // Line number
loader->dbgBuilder() // Function type.
@@ -1384,7 +1405,7 @@ void J3CodeGen::generateJava() {
ret.init(this, 1, allocator->allocate(J3CodeGenVar::reservedSize(1)));
uint32_t n=0;
- for(llvm::Function::arg_iterator cur=llvmFunction->arg_begin(); cur!=llvmFunction->arg_end(); cur++, n++) {
+ for(llvm::Function::arg_iterator cur=llvmFunction()->arg_begin(); cur!=llvmFunction()->arg_end(); cur++, n++) {
locals.setAt(flatten(cur, methodType->ins(n)), n);
}
@@ -1397,7 +1418,7 @@ void J3CodeGen::generateJava() {
J3Reader codeReaderTmp(cl->bytes(), reader.tell(), codeLength);
codeReader = &codeReaderTmp;
- bbRet = llvm::BasicBlock::Create(llvmFunction->getContext(), "ret", llvmFunction);
+ bbRet = llvm::BasicBlock::Create(llvmFunction()->getContext(), "ret", llvmFunction());
builder->SetInsertPoint(bbRet);
if(vm->options()->genDebugExecute) {
char buf[256];
@@ -1527,7 +1548,7 @@ void J3CodeGen::generateNative() {
if(methodType->nbIns()) {
uint32_t i = 0;
- for(llvm::Function::arg_iterator cur=llvmFunction->arg_begin(); cur!=llvmFunction->arg_end(); cur++, i++) {
+ for(llvm::Function::arg_iterator cur=llvmFunction()->arg_begin(); cur!=llvmFunction()->arg_end(); cur++, i++) {
llvm::Value* a;
if(methodType->ins(i)->llvmType()->isPointerTy())
a = builder->CreateCall2(funcJ3ThreadPush, thread, flatten(cur, methodType->ins(i)));
@@ -1546,8 +1567,8 @@ void J3CodeGen::generateNative() {
builder->CreateCall2(funcJ3ThreadRestore, thread, frame);
if(methodType->out()->llvmType()->isPointerTy()) {
- llvm::BasicBlock* ifnull = llvm::BasicBlock::Create(llvmFunction->getContext(), "ifnull", llvmFunction);
- llvm::BasicBlock* ifnotnull = llvm::BasicBlock::Create(llvmFunction->getContext(), "ifnotnull", llvmFunction);
+ llvm::BasicBlock* ifnull = llvm::BasicBlock::Create(llvmFunction()->getContext(), "ifnull", llvmFunction());
+ llvm::BasicBlock* ifnotnull = llvm::BasicBlock::Create(llvmFunction()->getContext(), "ifnotnull", llvmFunction());
builder->CreateCondBr(builder->CreateIsNull(res), ifnull, ifnotnull);
builder->SetInsertPoint(bb = ifnull);
@@ -1559,20 +1580,3 @@ void J3CodeGen::generateNative() {
builder->CreateRet(res);
}
}
-
-llvm::Function* J3CodeGen::generate() {
- bb = llvm::BasicBlock::Create(llvmFunction->getContext(), "entry", llvmFunction);
- llvm::IRBuilder<> _builder(bb);
-
- builder = &_builder;
-
- if(J3Cst::isNative(method->access()))
- generateNative();
- else
- generateJava();
-
- //llvmFunction->dump();
- //module->dump();
-
- return llvmFunction;
-}
Modified: vmkit/branches/mcjit/lib/j3/vm/j3method.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3method.cc?rev=196289&r1=196288&r2=196289&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Tue Dec 3 09:40:05 2013
@@ -46,8 +46,8 @@ uint32_t J3Method::index() {
void* J3Method::fnPtr() {
void* res;
-
- if(!_compiledFunction) {
+
+ if(!_fnPtr) {
//fprintf(stderr, "materializing: %ls::%ls%ls\n", cl()->name()->cStr(), name()->cStr(), sign()->cStr());
if(!isResolved()) {
if(cl()->loader()->vm()->options()->debugLinking)
@@ -59,22 +59,16 @@ void* J3Method::fnPtr() {
}
J3CodeGen* codeGen = J3CodeGen::create(this);
- _compiledFunction = codeGen->generate();
+ _llvmFunction = codeGen->llvmFunction();
+ _fnPtr = codeGen->fnPtr();
J3CodeGen::destroy(codeGen);
+ }
- cl()->loader()->pm()->run(*_compiledFunction);
-
- //_compiledFunction->dump();
-
- res = cl()->loader()->vm()->ee()->recompileAndRelinkFunction(_compiledFunction);
- } else
- res = cl()->loader()->vm()->ee()->getPointerToFunction(_compiledFunction);
-
- return res;
+ return _fnPtr;
}
void* J3Method::functionPointerOrTrampoline() {
- return _compiledFunction ? fnPtr() : _trampoline;
+ return _fnPtr ? _fnPtr : _trampoline;
}
void J3Method::setResolved(uint32_t index) {
@@ -151,9 +145,8 @@ J3Value J3Method::internalInvoke(bool st
target = resolve(self);
}
- if(!_compiledFunction)
- fnPtr(); /* ensure that the function is fully compiled */
- llvm::GenericValue res = cl()->loader()->vm()->ee()->runFunction(_compiledFunction, *args);
+ fnPtr(); /* ensure that the function is compiled */
+ llvm::GenericValue res = cl()->loader()->vm()->ee()->runFunction(_llvmFunction, *args);
J3Value holder;
J3* vm = cl()->loader()->vm();
@@ -355,7 +348,7 @@ llvm::GlobalValue* J3Method::llvmDescrip
llvm::Function* J3Method::llvmFunction(bool isStub, llvm::Module* module, J3Class* from) {
llvm::Function* res;
- if(isStub && !_compiledFunction) {
+ if(isStub) {
char id[llvmFunctionNameLength() + 16];
memcpy(id, llvmFunctionName(), llvmFunctionNameLength());
memcpy(id + llvmFunctionNameLength(), "_stub", 6);
More information about the vmkit-commits
mailing list