[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