[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