[vmkit-commits] [vmkit] r199502 - Able to throw and catch my first exceptions.

Gael Thomas gael.thomas at lip6.fr
Fri Jan 17 08:30:09 PST 2014


Author: gthomas
Date: Fri Jan 17 10:30:09 2014
New Revision: 199502

URL: http://llvm.org/viewvc/llvm-project?rev=199502&view=rev
Log:
Able to throw and catch my first exceptions.

Modified:
    vmkit/branches/mcjit/include/j3/j3.h
    vmkit/branches/mcjit/include/j3/j3codegen.h
    vmkit/branches/mcjit/include/j3/j3jni.h
    vmkit/branches/mcjit/include/j3/j3meta.def
    vmkit/branches/mcjit/include/j3/j3thread.h
    vmkit/branches/mcjit/include/vmkit/vmkit.h
    vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc
    vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
    vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc
    vmkit/branches/mcjit/lib/j3/vm/j3javavm.cc
    vmkit/branches/mcjit/lib/j3/vm/j3method.cc
    vmkit/branches/mcjit/lib/j3/vm/j3thread.cc
    vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc
    vmkit/branches/mcjit/lib/vmkit/vmkit.cc

Modified: vmkit/branches/mcjit/include/j3/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199502&r1=199501&r2=199502&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Fri Jan 17 10:30:09 2014
@@ -163,7 +163,7 @@ namespace j3 {
 
 		static void    illegalArgumentException(const char* msg) __attribute__((noreturn));
 
-		static void    printStackTrace();
+		void           printStackTrace();
 
 		void forceSymbolDefinition();
 	};

Modified: vmkit/branches/mcjit/include/j3/j3codegen.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199502&r1=199501&r2=199502&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3codegen.h (original)
+++ vmkit/branches/mcjit/include/j3/j3codegen.h Fri Jan 17 10:30:09 2014
@@ -154,6 +154,7 @@ namespace j3 {
 		void                selectExceptionNode(uint32_t idx);
 
 		void                translate();
+		void                z_translate();
 
 		void                initExceptionNode(J3ExceptionNode** pnode, uint32_t pc, J3ExceptionNode* node);
 		void                addToExceptionNode(J3ExceptionNode* node, J3ExceptionEntry* entry);

Modified: vmkit/branches/mcjit/include/j3/j3jni.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3jni.h?rev=199502&r1=199501&r2=199502&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3jni.h (original)
+++ vmkit/branches/mcjit/include/j3/j3jni.h Fri Jan 17 10:30:09 2014
@@ -9,6 +9,8 @@ namespace j3 {
 }
 
 #define enterJVM() try {
-#define leaveJVM() } catch(void* e) { J3Thread::get()->setPendingException(J3Thread::get()->push((J3Object*)e)); }
+#define leaveJVM() } catch(void* e) {																		\
+	J3Thread::get()->setPendingException(J3Thread::get()->push((J3Object*)e)); \
+ }
 
 #endif

Modified: vmkit/branches/mcjit/include/j3/j3meta.def
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199502&r1=199501&r2=199502&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3meta.def (original)
+++ vmkit/branches/mcjit/include/j3/j3meta.def Fri Jan 17 10:30:09 2014
@@ -11,6 +11,7 @@ _x(funcJ3ObjectAllocate,         "j3::J3
 _x(funcJ3ObjectMonitorEnter,     "j3::J3Object::monitorEnter(j3::J3Object*)")
 _x(funcJ3ObjectMonitorExit,      "j3::J3Object::monitorExit(j3::J3Object*)")
 _x(funcThrowException,           "vmkit::VMKit::throwException(void*)")
+_x(funcReplayException,          "j3::J3Thread::replayException()")
 _x(funcClassCastException,       "j3::J3::classCastException()")
 _x(funcNullPointerException,     "j3::J3::nullPointerException()")
 _x(funcJ3ThreadPushHandle,       "j3::J3Thread::push(j3::J3ObjectHandle*)")
@@ -26,4 +27,4 @@ _x(funcFastIsAssignableToNonPrimaryCheck
 _x(funcGXXPersonality,           "__gxx_personality_v0")
 _x(funcCXABeginCatch,            "__cxa_begin_catch")
 _x(funcCXAEndCatch,              "__cxa_end_catch")
-_x(funcFake,                     "j3::J3::forceSymbolDefinition()")
\ No newline at end of file
+_x(funcFake,                     "j3::J3::forceSymbolDefinition()")

Modified: vmkit/branches/mcjit/include/j3/j3thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3thread.h?rev=199502&r1=199501&r2=199502&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3thread.h (original)
+++ vmkit/branches/mcjit/include/j3/j3thread.h Fri Jan 17 10:30:09 2014
@@ -50,6 +50,7 @@ namespace j3 {
 		J3ObjectHandle*    pendingException();
 		bool               hasPendingException() { return _pendingException; }
 		void               setPendingException(J3ObjectHandle* handle) { _pendingException = handle; }
+		static void        replayException();
 
 		J3ObjectHandle*    push(J3ObjectHandle* handle);
 		J3ObjectHandle*    push(J3Object* obj);

Modified: vmkit/branches/mcjit/include/vmkit/vmkit.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/vmkit.h?rev=199502&r1=199501&r2=199502&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/vmkit.h (original)
+++ vmkit/branches/mcjit/include/vmkit/vmkit.h Fri Jan 17 10:30:09 2014
@@ -67,6 +67,7 @@ namespace vmkit {
 		virtual void vinternalError(const char* msg, va_list va) __attribute__((noreturn));
 		virtual void sigsegv(uintptr_t addr) __attribute__((noreturn));
 		virtual void sigend() __attribute__((noreturn));
+		virtual void printStackTrace() = 0;
 
 		static void internalError(const char* msg, ...) __attribute__((noreturn));		
 		static void throwException(void* obj) __attribute__((noreturn));

Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc?rev=199502&r1=199501&r2=199502&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen-debug.cc Fri Jan 17 10:30:09 2014
@@ -51,7 +51,7 @@ void J3CodeGen::echoDebugEnter(uint32_t
 }
 
 void J3CodeGen::echoDebugExecute(uint32_t level, const char* msg, ...) {
-	if(J3Thread::get()->vm()->options()->debugExecute >= level) {
+	if(level == -1 || J3Thread::get()->vm()->options()->debugExecute >= level) {
 		va_list va;
 		va_start(va, msg);
 		vfprintf(stderr, msg, va);

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=199502&r1=199501&r2=199502&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Fri Jan 17 10:30:09 2014
@@ -108,7 +108,7 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato
 		else
 			generateJava();
 
-		if(vm->options()->debugTranslate > 4)
+		if(vm->options()->debugTranslate > 2)
 			llvmFunction->dump();
 	}
 
@@ -918,8 +918,8 @@ void J3CodeGen::translate() {
 				fprintf(stderr, "--------------------------------------------\n");
 				llvmFunction->dump();
 			case 4:
-			case 3:
 				stack.dump();
+			case 3:
 			case 2:
 				fprintf(stderr, "    [%4d] decoding: %s\n", javaPC, J3Cst::opcodeNames[bc]);
 				break;
@@ -1536,11 +1536,16 @@ void J3CodeGen::translate() {
 				break;
 
 			case J3Cst::BC_athrow:                        /* 0xbf */
-				builder->CreateCall(funcThrowException, 
-														builder->CreateBitCast(stack.pop(), 
-																									 funcThrowException->getFunctionType()->getParamType(0)));
-				builder->CreateBr(bbRet);
-				_onEndPoint();
+				{
+					llvm::Value* excp = builder->CreateBitCast(stack.pop(), funcThrowException->getFunctionType()->getParamType(0));
+					if(exceptions.nodes[curExceptionNode]->landingPad)
+						builder->CreateInvoke(funcThrowException, bbRet, exceptions.nodes[curExceptionNode]->landingPad, excp);
+					else {
+						builder->CreateCall(funcThrowException, excp);
+						builder->CreateBr(bbRet);
+					}
+					_onEndPoint();
+				}
 				break;
 
 			case J3Cst::BC_checkcast:                     /* 0xc0 */
@@ -1606,6 +1611,39 @@ void J3CodeGen::explore() {
 }
 #endif
 
+void J3CodeGen::z_translate() {
+	bbRet = newBB("ret");
+	llvm::BasicBlock* landingPad = newBB("landing-pad");
+	llvm::Value* val = builder->CreateIntToPtr(llvm::ConstantInt::get(uintPtrTy, (uintptr_t)0x42),
+																						 vm->typeJ3ObjectPtr);	
+	builder->CreateInvoke(funcThrowException, bbRet, landingPad,
+												builder->CreateBitCast(val, funcThrowException->getFunctionType()->getParamType(0)));
+
+	builder->SetInsertPoint(landingPad);
+	llvm::LandingPadInst *caughtResult = builder->CreateLandingPad(vm->typeGXXException, 
+																																 funcGXXPersonality, 
+																																 1, 
+																																 "landing-pad");
+	caughtResult->addClause(gvTypeInfo);
+
+	llvm::Value* excp = builder->CreateBitCast(builder->CreateCall(funcCXABeginCatch, 
+																																 builder->CreateExtractValue(caughtResult, 0)),
+																						 vm->typeJ3ObjectPtr);
+	
+	builder->CreateCall(funcCXAEndCatch);
+
+	builder->CreateCall3(funcEchoDebugExecute, 
+											 builder->getInt32(-1), /* just to see my first exception :) */
+											 buildString("catching exception %p!\n"),
+											 excp);
+	builder->CreateBr(bbRet);
+
+	builder->SetInsertPoint(bbRet);
+	builder->CreateRetVoid();
+
+	llvmFunction->dump();
+}
+
 void J3CodeGen::generateJava() {
 	J3Attribute* attr = method->attributes()->lookup(vm->codeAttribute);
 
@@ -1778,6 +1816,7 @@ void J3CodeGen::generateNative() {
 	}
 
 	res = builder->CreateCall(nat, args);
+	builder->CreateCall(funcReplayException);
 
 	if(llvmFunction->getReturnType()->isVoidTy()) {
 		builder->CreateCall2(funcJ3ThreadRestore, thread, frame);

Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc?rev=199502&r1=199501&r2=199502&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegenexception.cc Fri Jan 17 10:30:09 2014
@@ -26,16 +26,23 @@ void J3ExceptionNode::addEntry(J3CodeGen
 																																						codeGen->funcGXXPersonality, 
 																																						1, 
 																																						"landing-pad");
+
 		caughtResult->addClause(codeGen->gvTypeInfo);
+
+#if 0
+		codeGen->builder->CreateCall2(codeGen->funcEchoDebugExecute, 
+																	codeGen->builder->getInt32(-1), /* just to see my first exception :) */
+																	codeGen->buildString("catching exception!\n"));
+#endif
+
 		llvm::Value* excp = codeGen->builder->CreateBitCast(codeGen->builder->CreateCall(codeGen->funcCXABeginCatch, 
 																																										 codeGen->builder->CreateExtractValue(caughtResult, 0)),
 																												codeGen->vm->typeJ3ObjectPtr);
 																							 
 		codeGen->builder->CreateCall(codeGen->funcCXAEndCatch);
 
-		codeGen->builder->CreateCall2(codeGen->funcEchoDebugExecute, 
-																	codeGen->builder->getInt32(0), /* just to see my first exception :) */
-																	codeGen->buildString("entering launchpad!\n"));
+		codeGen->stack.topStack = 0;
+		codeGen->stack.push(excp);
 	}
 
 	entries[nbEntries++] = entry;
@@ -61,6 +68,16 @@ void J3ExceptionNode::addEntry(J3CodeGen
 void J3ExceptionNode::close(J3CodeGen* codeGen) {
 	if(curCheck) {
 		codeGen->builder->SetInsertPoint(curCheck);
+#if 0
+		codeGen->builder->CreateCall2(codeGen->funcEchoDebugExecute, 
+																	codeGen->builder->getInt32(-1), 
+																	codeGen->buildString("  not catched here, rethrow\n"));
+#endif
+		codeGen->stack.metaStack[0] = codeGen->vm->typeJ3ObjectPtr;
+		codeGen->stack.topStack = 1;
+		codeGen->builder->CreateCall(codeGen->funcThrowException, 
+																 codeGen->builder->CreateBitCast(codeGen->stack.pop(), 
+																																 codeGen->funcThrowException->getFunctionType()->getParamType(0)));
 		codeGen->builder->CreateBr(codeGen->bbRet);
 	} 
 }

Modified: vmkit/branches/mcjit/lib/j3/vm/j3javavm.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3javavm.cc?rev=199502&r1=199501&r2=199502&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3javavm.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3javavm.cc Fri Jan 17 10:30:09 2014
@@ -4,9 +4,6 @@
 
 namespace j3 {
 
-#define enterJVM() try {
-#define leaveJVM() } catch(void* e) { J3Thread::get()->setPendingException(J3Thread::get()->push((J3Object*)e)); }
-
 #define NYI() { J3Thread::get()->vm()->internalError("not yet implemented: '%s'", __PRETTY_FUNCTION__); }
 
 jint DestroyJavaVM(JavaVM *vm) { enterJVM(); leaveJVM(); NYI(); }

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=199502&r1=199501&r2=199502&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Fri Jan 17 10:30:09 2014
@@ -114,7 +114,16 @@ J3Value J3Method::internalInvoke(J3Objec
 		memcpy(reIn+1, inArgs, n*sizeof(J3Value));
 	} else
 		reIn = inArgs;
-	return cxxCaller()(fnPtr(), reIn);
+
+	J3Value res;
+	try {
+		res = cxxCaller()(fnPtr(), reIn);
+	} catch(void* e) {
+		fprintf(stderr, " catch exception e: %p during the execution of %s::%s%s\n",
+						e, cl()->name()->cStr(), name()->cStr(), signature()->name()->cStr());
+		throw e;
+	}
+	return res;
 }
 
 J3Value J3Method::internalInvoke(J3ObjectHandle* handle, va_list va) {

Modified: vmkit/branches/mcjit/lib/j3/vm/j3thread.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3thread.cc?rev=199502&r1=199501&r2=199502&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3thread.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3thread.cc Fri Jan 17 10:30:09 2014
@@ -58,6 +58,15 @@ J3ObjectHandle* J3Thread::pendingExcepti
 		return 0;
 }
 
+void J3Thread::replayException() {
+	J3Thread* self = J3Thread::get();
+	J3ObjectHandle* pending = self->_pendingException;
+	if(pending) {
+		self->_pendingException = 0;
+		vmkit::VMKit::throwException(pending->obj());
+	}
+}
+
 void J3Thread::ensureCapacity(uint32_t capacity) {
 	_localReferences.ensureCapacity(capacity);
 }

Modified: vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc?rev=199502&r1=199501&r2=199502&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Fri Jan 17 10:30:09 2014
@@ -25,8 +25,9 @@ void J3Trampoline::interfaceTrampoline(J
 		handle->vt()->_interfaceMethodTable[index] = res;
 	} else {
 		for(uint32_t i=0; i<desc->nbMethods; i++)
-			fprintf(stderr, "   method: %s::%s%s\n", desc->methods[i]->cl()->name()->cStr(),
-							desc->methods[i]->name()->cStr(), desc->methods[i]->signature()->name()->cStr());
+			fprintf(stderr, "   method: %s::%s%s - %d\n", desc->methods[i]->cl()->name()->cStr(),
+							desc->methods[i]->name()->cStr(), desc->methods[i]->signature()->name()->cStr(),
+							desc->methods[i]->interfaceIndex());
 		J3::internalError("implement me: interface Trampoline with collision: %d", desc->nbMethods);
 	}
 

Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=199502&r1=199501&r2=199502&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Fri Jan 17 10:30:09 2014
@@ -183,16 +183,9 @@ void VMKit::sigend() {
 	internalError("sig terminate");
 }
 
-static int fake = 0;
-
 void VMKit::throwException(void* obj) {
-#if 0
-	void** exception = (void**)abi::__cxa_allocate_exception(sizeof(void*));
-	*exception = obj;
-	abi::__cxa_throw(exception, (std::type_info*)Thread::get()->vm()->ptrTypeInfo, 0);
-#endif
-	fprintf(stderr, " throw exception...\n");
-	if(fake)
-		throw (void*)0; /* force the symbol typeinfo for void* to be conserved in the bc file */
-	abort();
+	//internalError("throw exception...\n");
+	//fprintf(stderr, "throw %p\n", obj);
+	//Thread::get()->vm()->printStackTrace();
+	throw obj;
 }





More information about the vmkit-commits mailing list