[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