[vmkit-commits] [vmkit] r196291 - create the llvmFunction and its module in J3Method::fnPtr.

Gael Thomas gael.thomas at lip6.fr
Tue Dec 3 08:02:44 PST 2013


Author: gthomas
Date: Tue Dec  3 10:02:44 2013
New Revision: 196291

URL: http://llvm.org/viewvc/llvm-project?rev=196291&view=rev
Log:
create the llvmFunction and its module in J3Method::fnPtr.

Modified:
    vmkit/branches/mcjit/include/j3/j3codegen.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=196291&r1=196290&r2=196291&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3codegen.h (original)
+++ vmkit/branches/mcjit/include/j3/j3codegen.h Tue Dec  3 10:02:44 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;
@@ -193,16 +193,13 @@ namespace j3 {
 		llvm::Function*    ziTry;
 		llvm::GlobalValue* gvTypeInfo;            /* typename void* */
 
-		J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* method);
+		J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* method, llvm::Function* _llvmFunction);
 		~J3CodeGen();
 
 		void* operator new(size_t n, vmkit::BumpAllocator* _allocator);
 		void  operator delete(void* ptr);
 	public:
-		static J3CodeGen* create(J3Method* method);
-		static void       destroy(J3CodeGen* codeGen);
-
-		llvm::Function*   llvmFunction() { return _llvmFunction; }
+		static void translate(J3Method* method, llvm::Function* llvmFunction);
 	};
 }
 

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=196291&r1=196290&r2=196291&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Tue Dec  3 10:02:44 2013
@@ -34,18 +34,18 @@ void J3ExceptionEntry::dump() {
 	fprintf(stderr, "    catchType: %u\n", catchType);
 }
 
-J3CodeGen::J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* m) {
+J3CodeGen::J3CodeGen(vmkit::BumpAllocator* _allocator, J3Method* m, llvm::Function* _llvmFunction) {
 	allocator = _allocator;
 
 	method = m;
 	cl = method->cl();
 	methodType = method->methodType();
 	loader = cl->loader();
-	module = loader->module();
 	vm = loader->vm();
 
-	_llvmFunction = method->llvmFunction(0, module);
-	llvmFunction()->setGC("vmkit");
+	llvmFunction = _llvmFunction;
+	llvmFunction->setGC("vmkit");
+	module = llvmFunction->getParent();
 
 	bbCheckCastFailed = 0;
 	bbNullCheckFailed = 0;
@@ -92,7 +92,7 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato
 		(llvm::Function*)module->getOrInsertFunction("vmkit.try", 
 																								 llvm::FunctionType::get(llvm::Type::getVoidTy(module->getContext()), 0));
 
-	bb    = llvm::BasicBlock::Create(llvmFunction()->getContext(), "entry", llvmFunction());
+	bb    = llvm::BasicBlock::Create(llvmFunction->getContext(), "entry", llvmFunction);
 	llvm::IRBuilder<> _builder(bb);
 
 	builder = &_builder;
@@ -113,14 +113,9 @@ void* J3CodeGen::operator new(size_t n,
 void J3CodeGen::operator delete(void* ptr) {
 }
 
-J3CodeGen* J3CodeGen::create(J3Method* method) {
+void J3CodeGen::translate(J3Method* method, llvm::Function* llvmFunction) {
 	vmkit::BumpAllocator* allocator = vmkit::BumpAllocator::create();
-	return new(allocator) J3CodeGen(allocator, method);
-}
-
-void J3CodeGen::destroy(J3CodeGen* codeGen) {
-	vmkit::BumpAllocator* allocator = codeGen->allocator;
-	delete codeGen;
+	delete new(allocator) J3CodeGen(allocator, method, llvmFunction);
 	vmkit::BumpAllocator::destroy(allocator);
 }
 
@@ -207,10 +202,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);
@@ -239,7 +234,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);
@@ -419,8 +414,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);
 
@@ -436,12 +431,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);
@@ -553,7 +548,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);
@@ -715,7 +710,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();
@@ -1312,7 +1307,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);
 
@@ -1336,7 +1331,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;
@@ -1376,8 +1371,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.
@@ -1398,7 +1393,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);
 	}
 
@@ -1411,7 +1406,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];
@@ -1541,7 +1536,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)));
@@ -1560,8 +1555,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);

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=196291&r1=196290&r2=196291&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Tue Dec  3 10:02:44 2013
@@ -58,9 +58,10 @@ void* J3Method::fnPtr() {
 				J3::noSuchMethodError(L"unable to find method", cl(), name(), sign());
 		}
 
-		J3CodeGen* codeGen = J3CodeGen::create(this);
-		_llvmFunction = codeGen->llvmFunction();
-		J3CodeGen::destroy(codeGen);
+		llvm::Module* module = cl()->loader()->module();
+		_llvmFunction = llvmFunction(0, module);
+
+		J3CodeGen::translate(this, _llvmFunction);
 
 		cl()->loader()->pm()->run(*_llvmFunction);
 		llvm::ExecutionEngine* ee = cl()->loader()->vm()->ee();





More information about the vmkit-commits mailing list