[vmkit-commits] [vmkit] r69887 - in /vmkit/trunk: include/jnjvm/JnjvmModule.h lib/JnJVM/Compiler/JavaJITOpcodes.cpp lib/JnJVM/Compiler/JnjvmModule.cpp lib/JnJVM/LLVMRuntime/runtime-default.ll lib/JnJVM/VMCore/JavaRuntimeJIT.cpp lib/JnJVM/VMCore/JavaUpcalls.cpp lib/JnJVM/VMCore/JavaUpcalls.h lib/JnJVM/VMCore/Jnjvm.cpp lib/JnJVM/VMCore/Jnjvm.h
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Thu Apr 23 05:07:17 PDT 2009
Author: geoffray
Date: Thu Apr 23 07:07:08 2009
New Revision: 69887
URL: http://llvm.org/viewvc/llvm-project?rev=69887&view=rev
Log:
Implement division by zero exceptions.
Modified:
vmkit/trunk/include/jnjvm/JnjvmModule.h
vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp
vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp
vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll
vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
Modified: vmkit/trunk/include/jnjvm/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/jnjvm/JnjvmModule.h?rev=69887&r1=69886&r2=69887&view=diff
==============================================================================
--- vmkit/trunk/include/jnjvm/JnjvmModule.h (original)
+++ vmkit/trunk/include/jnjvm/JnjvmModule.h Thu Apr 23 07:07:08 2009
@@ -335,6 +335,7 @@
llvm::Function* OutOfMemoryErrorFunction;
llvm::Function* NegativeArraySizeExceptionFunction;
llvm::Function* ArrayStoreExceptionFunction;
+ llvm::Function* ArithmeticExceptionFunction;
JnjvmModule(llvm::Module*);
Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp?rev=69887&r1=69886&r2=69887&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp Thu Apr 23 07:07:08 2009
@@ -931,6 +931,18 @@
case IDIV : {
Value* val2 = popAsInt();
Value* val1 = popAsInt();
+ if (TheCompiler->hasExceptionsEnabled()) {
+ Value* cmp = new ICmpInst(ICmpInst::ICMP_EQ, val2,
+ module->constantZero,
+ "", currentBlock);
+ BasicBlock* ifFalse = createBasicBlock("non null div");
+ BasicBlock* ifTrue = createBasicBlock("null div");
+
+ BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock);
+ currentBlock = ifTrue;
+ throwException(module->ArithmeticExceptionFunction, 0, 0);
+ currentBlock = ifFalse;
+ }
push(BinaryOperator::CreateSDiv(val1, val2, "", currentBlock),
false);
break;
@@ -941,6 +953,18 @@
llvm::Value* val2 = pop();
pop();
llvm::Value* val1 = pop();
+ if (TheCompiler->hasExceptionsEnabled()) {
+ Value* cmp = new ICmpInst(ICmpInst::ICMP_EQ, val2,
+ module->constantLongZero,
+ "", currentBlock);
+ BasicBlock* ifFalse = createBasicBlock("non null div");
+ BasicBlock* ifTrue = createBasicBlock("null div");
+
+ BranchInst::Create(ifTrue, ifFalse, cmp, currentBlock);
+ currentBlock = ifTrue;
+ throwException(module->ArithmeticExceptionFunction, 0, 0);
+ currentBlock = ifFalse;
+ }
push(BinaryOperator::CreateSDiv(val1, val2, "", currentBlock),
false);
push(module->constantZero, false);
Modified: vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp?rev=69887&r1=69886&r2=69887&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Thu Apr 23 07:07:08 2009
@@ -375,6 +375,7 @@
module->getFunction("jnjvmNegativeArraySizeException");
OutOfMemoryErrorFunction = module->getFunction("jnjvmOutOfMemoryError");
ArrayStoreExceptionFunction = module->getFunction("jnjvmArrayStoreException");
+ ArithmeticExceptionFunction = module->getFunction("jnjvmArithmeticException");
JavaObjectAllocateFunction = module->getFunction("gcmalloc");
Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll?rev=69887&r1=69886&r2=69887&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original)
+++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Thu Apr 23 07:07:08 2009
@@ -216,6 +216,7 @@
declare %JavaObject* @jnjvmNegativeArraySizeException(i32)
declare %JavaObject* @jnjvmOutOfMemoryError(i32)
declare %JavaObject* @jnjvmArrayStoreException(%VT*)
+declare %JavaObject* @jnjvmArithmeticException()
declare void @jnjvmThrowException(%JavaObject*)
declare void @jnjvmJNIProceedPendingException()
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=69887&r1=69886&r2=69887&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Thu Apr 23 07:07:08 2009
@@ -480,6 +480,26 @@
}
// Creates a Java object and then throws it.
+extern "C" JavaObject* jnjvmArithmeticException() {
+ JavaObject *exc = 0;
+ JavaThread *th = JavaThread::get();
+
+ BEGIN_NATIVE_EXCEPTION(1)
+
+ exc = th->getJVM()->CreateArithmeticException();
+
+ END_NATIVE_EXCEPTION
+
+#ifdef DWARF_EXCEPTIONS
+ th->throwException(exc);
+#else
+ th->pendingException = exc;
+#endif
+
+ return exc;
+}
+
+// Creates a Java object and then throws it.
extern "C" JavaObject* jnjvmClassCastException(JavaObject* obj,
UserCommonClass* cl) {
JavaObject *exc = 0;
@@ -541,24 +561,24 @@
return exc;
}
-extern "C" void printMethodStart(JavaMethod* meth) {
+extern "C" void jnjvmPrintMethodStart(JavaMethod* meth) {
fprintf(stderr, "[%p] executing %s\n", (void*)mvm::Thread::get(),
meth->printString());
}
-extern "C" void printMethodEnd(JavaMethod* meth) {
+extern "C" void jnjvmPrintMethodEnd(JavaMethod* meth) {
fprintf(stderr, "[%p] return from %s\n", (void*)mvm::Thread::get(),
meth->printString());
}
-extern "C" void printExecution(uint32 opcode, uint32 index, JavaMethod* meth) {
+extern "C" void jnjvmPrintExecution(uint32 opcode, uint32 index, JavaMethod* meth) {
fprintf(stderr, "[%p] executing %s %s at %d\n", (void*)mvm::Thread::get(),
meth->printString(), OpcodeNames[opcode], index);
}
#ifdef SERVICE
-extern "C" void serviceCallStart(Jnjvm* OldService,
+extern "C" void jnjvmServiceCallStart(Jnjvm* OldService,
Jnjvm* NewService) {
fprintf(stderr, "I have switched from %d to %d\n", OldService->IsolateID,
NewService->IsolateID);
@@ -566,7 +586,7 @@
fprintf(stderr, "Now the thread id is %d\n", mvm::Thread::get()->IsolateID);
}
-extern "C" void serviceCallStop(Jnjvm* OldService,
+extern "C" void jnjvmServiceCallStop(Jnjvm* OldService,
Jnjvm* NewService) {
fprintf(stderr, "End service call\n");
}
@@ -574,7 +594,7 @@
#endif
#ifdef ISOLATE
-extern "C" void* stringLookup(UserClass* cl, uint32 index) {
+extern "C" void* jnjvmStringLookup(UserClass* cl, uint32 index) {
UserConstantPool* ctpInfo = cl->getConstantPool();
const UTF8* utf8 = ctpInfo->UTF8AtForString(index);
JavaString* str = JavaThread::get()->getJVM()->internalUTF8ToStr(utf8);
@@ -585,7 +605,7 @@
}
#ifdef ISOLATE_SHARING
-extern "C" void* enveloppeLookup(UserClass* cl, uint32 index) {
+extern "C" void* jnjvmEnveloppeLookup(UserClass* cl, uint32 index) {
UserConstantPool* ctpInfo = cl->getConstantPool();
mvm::Allocator* allocator = cl->classLoader->allocator;
Enveloppe* enveloppe = new(allocator) Enveloppe(ctpInfo, index);
@@ -593,7 +613,7 @@
return (void*)enveloppe;
}
-extern "C" void* staticCtpLookup(UserClass* cl, uint32 index) {
+extern "C" void* jnjvmStaticCtpLookup(UserClass* cl, uint32 index) {
UserConstantPool* ctpInfo = cl->getConstantPool();
JavaConstantPool* shared = ctpInfo->getSharedPool();
uint32 clIndex = shared->getClassIndexFromMethod(index);
@@ -612,9 +632,9 @@
return (void*)methodCl->getConstantPool();
}
-extern "C" UserConstantPool* specialCtpLookup(UserConstantPool* ctpInfo,
- uint32 index,
- UserConstantPool** res) {
+extern "C" UserConstantPool* jnjvmSpecialCtpLookup(UserConstantPool* ctpInfo,
+ uint32 index,
+ UserConstantPool** res) {
JavaConstantPool* shared = ctpInfo->getSharedPool();
uint32 clIndex = shared->getClassIndexFromMethod(index);
UserClass* refCl = (UserClass*)ctpInfo->loadClass(clIndex);
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=69887&r1=69886&r2=69887&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Thu Apr 23 07:07:08 2009
@@ -141,6 +141,7 @@
Class* Classpath::StackOverflowError;
Class* Classpath::UnknownError;
Class* Classpath::ClassNotFoundException;
+Class* Classpath::ArithmeticException;
JavaMethod* Classpath::InitInvocationTargetException;
JavaMethod* Classpath::InitArrayStoreException;
@@ -172,6 +173,7 @@
JavaMethod* Classpath::InitStackOverflowError;
JavaMethod* Classpath::InitUnknownError;
JavaMethod* Classpath::InitClassNotFoundException;
+JavaMethod* Classpath::InitArithmeticException;
JavaMethod* Classpath::InitObject;
JavaMethod* Classpath::ErrorWithExcpNoClassDefFoundError;
@@ -538,6 +540,7 @@
UPCALL_CLASS_EXCEPTION(loader, StackOverflowError);
UPCALL_CLASS_EXCEPTION(loader, UnknownError);
UPCALL_CLASS_EXCEPTION(loader, ClassNotFoundException);
+ UPCALL_CLASS_EXCEPTION(loader, ArithmeticException);
UPCALL_METHOD_EXCEPTION(loader, InvocationTargetException);
UPCALL_METHOD_EXCEPTION(loader, ArrayStoreException);
@@ -569,6 +572,7 @@
UPCALL_METHOD_EXCEPTION(loader, StackOverflowError);
UPCALL_METHOD_EXCEPTION(loader, UnknownError);
UPCALL_METHOD_EXCEPTION(loader, ClassNotFoundException);
+ UPCALL_METHOD_EXCEPTION(loader, ArithmeticException);
UPCALL_METHOD_WITH_EXCEPTION(loader, NoClassDefFoundError);
UPCALL_METHOD_WITH_EXCEPTION(loader, ExceptionInInitializerError);
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h?rev=69887&r1=69886&r2=69887&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.h Thu Apr 23 07:07:08 2009
@@ -173,6 +173,7 @@
ISOLATE_STATIC UserClass* StackOverflowError;
ISOLATE_STATIC UserClass* UnknownError;
ISOLATE_STATIC UserClass* ClassNotFoundException;
+ ISOLATE_STATIC UserClass* ArithmeticException;
ISOLATE_STATIC JavaMethod* InitInvocationTargetException;
ISOLATE_STATIC JavaMethod* InitArrayStoreException;
@@ -204,6 +205,7 @@
ISOLATE_STATIC JavaMethod* InitStackOverflowError;
ISOLATE_STATIC JavaMethod* InitUnknownError;
ISOLATE_STATIC JavaMethod* InitClassNotFoundException;
+ ISOLATE_STATIC JavaMethod* InitArithmeticException;
ISOLATE_STATIC JavaMethod* InitObject;
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=69887&r1=69886&r2=69887&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Thu Apr 23 07:07:08 2009
@@ -314,6 +314,11 @@
upcalls->InitNegativeArraySizeException, 0);
}
+JavaObject* Jnjvm::CreateArithmeticException() {
+ return CreateError(upcalls->ArithmeticException,
+ upcalls->InitArithmeticException, "/ by zero");
+}
+
JavaObject* Jnjvm::CreateNullPointerException() {
return CreateError(upcalls->NullPointerException,
upcalls->InitNullPointerException, 0);
@@ -881,6 +886,7 @@
LOAD_CLASS(upcalls->StackOverflowError);
LOAD_CLASS(upcalls->UnknownError);
LOAD_CLASS(upcalls->ClassNotFoundException);
+ LOAD_CLASS(upcalls->ArithmeticException);
#undef LOAD_CLASS
loadAppClassLoader();
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=69887&r1=69886&r2=69887&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Thu Apr 23 07:07:08 2009
@@ -253,6 +253,7 @@
JavaObject* CreateClassCastException(JavaObject* obj, UserCommonClass* cl);
JavaObject* CreateLinkageError(const char* msg = "");
JavaObject* CreateArrayStoreException(JavaVirtualTable* VT);
+ JavaObject* CreateArithmeticException();
/// Exceptions - These are the only exceptions VMKit will make.
///
More information about the vmkit-commits
mailing list