[vmkit-commits] [vmkit] r63520 - in /vmkit/trunk/lib/JnJVM: LLVMRuntime/runtime-default.ll VMCore/JavaJIT.cpp VMCore/JavaRuntimeJIT.cpp VMCore/JavaThread.cpp VMCore/JavaThread.h VMCore/JnjvmModule.cpp VMCore/JnjvmModule.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Mon Feb 2 08:09:41 PST 2009


Author: geoffray
Date: Mon Feb  2 10:09:41 2009
New Revision: 63520

URL: http://llvm.org/viewvc/llvm-project?rev=63520&view=rev
Log:
Code cleanup: inline some exception functions in the LLVM code.


Modified:
    vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll
    vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h

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=63520&r1=63519&r2=63520&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original)
+++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Mon Feb  2 10:09:41 2009
@@ -199,12 +199,7 @@
 declare void @indexOutOfBoundsException(%JavaObject*, i32)
 declare void @negativeArraySizeException(i32)
 declare void @outOfMemoryError(i32)
-
-declare void         @JavaThreadThrowException(%JavaObject*)
-declare void         @JavaThreadClearException()
-declare i8*          @JavaThreadGetException()
-declare %JavaObject* @JavaThreadGetJavaException()
-declare i1           @JavaThreadCompareException(%JavaClass*)
+declare void @JavaThreadThrowException(%JavaObject*)
 
 declare void @jniProceedPendingException()
 declare i8*  @getSJLJBuffer()

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=63520&r1=63519&r2=63520&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Mon Feb  2 10:09:41 2009
@@ -836,16 +836,23 @@
       ReturnInst::Create(currentBlock);
   }
 
+  currentBlock = endExceptionBlock;
   PI = pred_begin(endExceptionBlock);
   PE = pred_end(endExceptionBlock);
   if (PI == PE) {
     endExceptionBlock->eraseFromParent();
   } else {
-    CallInst* ptr_eh_ptr = CallInst::Create(module->GetExceptionFunction,
-                                            "eh_ptr", endExceptionBlock);
-    llvm::CallInst::Create(module->unwindResume, ptr_eh_ptr, "",
-                           endExceptionBlock);
-    new UnreachableInst(endExceptionBlock);
+    Value* threadId = getCurrentThread();
+    Value* geps2[2] = { module->constantZero,
+                        module->OffsetCXXExceptionInThreadConstant };
+    
+    Value* cxxExceptionPtr = GetElementPtrInst::Create(threadId, geps2,
+                                                       geps2 + 2, "",
+                                                       currentBlock);
+    cxxExceptionPtr = new LoadInst(cxxExceptionPtr, "", currentBlock);
+    llvm::CallInst::Create(module->unwindResume, cxxExceptionPtr, "",
+                           currentBlock);
+    new UnreachableInst(currentBlock);
   }
   
   PI = pred_begin(unifiedUnreachable);
@@ -1133,20 +1140,7 @@
       cur->exceptionPHI->addIncoming(ptr_eh_ptr, cur->catcher);
     } 
     
-    // We now implement the tester of the handler.
-    Value* cl = 0;
     currentBlock = cur->tester;
-#ifdef ISOLATE_SHARING
-    // We're dealing with exceptions, don't catch the exception if the class can
-    // not be found.
-    if (cur->catche) cl = getResolvedClass(cur->catche, false, false, 0);
-    else cl = CallInst::Create(module->GetJnjvmExceptionClassFunction,
-                               isolateLocal, "", currentBlock);
-#else
-    // We know catchClass exists because we have loaded all exceptions catched
-    // by the method when we loaded the class that defined this method.
-    cl = module->getNativeClass(cur->catchClass);
-#endif
     
 #ifdef SERVICE
     // Verifies that the current isolate is not stopped. If it is, we don't
@@ -1178,10 +1172,28 @@
     }
 #endif
    
-    // Compare the exception with the exception class we catch.
-    Value* cmp = CallInst::Create(module->CompareExceptionFunction, cl, "",
-                                  currentBlock);
+    Value* threadId = getCurrentThread();
+    Value* geps[2] = { module->constantZero,
+                       module->OffsetJavaExceptionInThreadConstant };
+
+    Value* javaExceptionPtr = GetElementPtrInst::Create(threadId, geps,
+                                                        geps + 2, "",
+                                                        currentBlock);
+    
+    // Get the Java exception.
+    Value* obj = new LoadInst(javaExceptionPtr, "", currentBlock);
+
+    Value* objCl = CallInst::Create(module->GetClassFunction, obj, "",
+                                    currentBlock);
+
+    Value* depthCl = ConstantInt::get(Type::Int32Ty, cur->catchClass->depth);
+    Value* depthClObj = CallInst::Create(module->GetDepthFunction, objCl, "",
+                                         currentBlock);
     
+    // Compare the exception with the exception class we catch.
+    Value* cmp = new ICmpInst(ICmpInst::ICMP_ULE, depthCl, depthClObj, "",
+                              currentBlock);
+
     // If we are catching this exception, then jump to the nativeHandler,
     // otherwise jump to our next handler.
     BranchInst::Create(cur->nativeHandler, bbNext, cmp, currentBlock);
@@ -1190,11 +1202,27 @@
     // just catched.
     if (nodeNext)
       nodeNext->addIncoming(cur->exceptionPHI, currentBlock);
-   
-    // Get the Java exception and clear it from the execution context.
-    Value* exc = CallInst::Create(module->GetJavaExceptionFunction,
-                                  "", cur->nativeHandler);
-    CallInst::Create(module->ClearExceptionFunction, "", cur->nativeHandler);
+    
+    currentBlock = cur->nativeHandler;
+ 
+    threadId = getCurrentThread();
+    javaExceptionPtr = GetElementPtrInst::Create(threadId, geps, geps + 2, "",
+                                                 currentBlock);
+    
+    // Get the Java exception.
+    Value* exc = new LoadInst(javaExceptionPtr, "", currentBlock);
+    
+    Value* geps2[2] = { module->constantZero,
+                        module->OffsetCXXExceptionInThreadConstant };
+    
+    Value* cxxExceptionPtr = GetElementPtrInst::Create(threadId, geps2,
+                                                       geps2 + 2, "",
+                                                       currentBlock);
+
+    // Clear exceptions.
+    new StoreInst(module->constantPtrNull, cxxExceptionPtr, currentBlock);
+    new StoreInst(module->JavaObjectNullConstant, javaExceptionPtr,
+                  currentBlock);
 
     // Call the CXX begin and end catcher.
     CallInst::Create(module->exceptionBeginCatch, cur->exceptionPHI,

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=63520&r1=63519&r2=63520&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Mon Feb  2 10:09:41 2009
@@ -390,32 +390,12 @@
   return cl1->isAssignableFrom(cl2);
 }
 
-// Never throws.
-extern "C" void* JavaThreadGetException() {
-  return JavaThread::get()->getException();
-}
-
-// Never throws.
-extern "C" JavaObject* JavaThreadGetJavaException() {
-  return JavaThread::get()->getJavaException();
-}
-
 // Does not call any Java code.
 extern "C" void JavaThreadThrowException(JavaObject* obj) {
   return JavaThread::get()->throwException(obj);
 }
 
 // Never throws.
-extern "C" bool JavaThreadCompareException(UserClass* cl) {
-  return JavaThread::get()->compareException(cl);
-}
-
-// Never throws.
-extern "C" void JavaThreadClearException() {
-  return JavaThread::get()->clearException();
-}
-
-// Never throws.
 extern "C" void overflowThinLock(JavaObject* obj) {
   obj->overflowThinLock();
 }

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=63520&r1=63519&r2=63520&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Mon Feb  2 10:09:41 2009
@@ -59,7 +59,8 @@
   assert(th->pendingException == 0 && "pending exception already there?");
   th->pendingException = obj;
   void* exc = __cxa_allocate_exception(0);
-  th->internalPendingException = exc;
+  // 32 = sizeof(_Unwind_Exception) in libgcc...  
+  th->internalPendingException = (void*)((uintptr_t)exc - 32);
   __cxa_throw(exc, 0, 0);
 }
 
@@ -67,7 +68,7 @@
   JavaThread* th = JavaThread::get();
   assert(th->pendingException);
   void* exc = __cxa_allocate_exception(0);
-  th->internalPendingException = exc;
+  th->internalPendingException = (void*)((uintptr_t)exc - 32);
   __cxa_throw(exc, 0, 0);
 }
 

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h?rev=63520&r1=63519&r2=63520&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Mon Feb  2 10:09:41 2009
@@ -154,14 +154,6 @@
       return 0;
   }
  
-  /// getException - Return the C++ specific exception object.
-  ///
-  void* getException() {
-    // 32 = sizeof(_Unwind_Exception) in libgcc...
-    return (void*)
-      ((uintptr_t)JavaThread::get()->internalPendingException - 32);
-  }
- 
   /// throwException - Throw the given exception in the current thread.
   ///
   void throwException(JavaObject* obj);

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=63520&r1=63519&r2=63520&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Feb  2 10:09:41 2009
@@ -92,6 +92,8 @@
 llvm::ConstantInt*  JnjvmModule::OffsetTaskClassMirrorInClassConstant;
 llvm::ConstantInt*  JnjvmModule::OffsetStaticInstanceInTaskClassMirrorConstant;
 llvm::ConstantInt*  JnjvmModule::OffsetStatusInTaskClassMirrorConstant;
+llvm::ConstantInt*  JnjvmModule::OffsetJavaExceptionInThreadConstant;
+llvm::ConstantInt*  JnjvmModule::OffsetCXXExceptionInThreadConstant;
 llvm::ConstantInt*  JnjvmModule::ClassReadyConstant;
 const llvm::Type*   JnjvmModule::JavaClassType;
 const llvm::Type*   JnjvmModule::JavaClassPrimitiveType;
@@ -2020,6 +2022,9 @@
   OffsetStaticInstanceInTaskClassMirrorConstant = mvm::MvmModule::constantOne;
   OffsetStatusInTaskClassMirrorConstant = mvm::MvmModule::constantZero;
   
+  OffsetJavaExceptionInThreadConstant = ConstantInt::get(Type::Int32Ty, 9);
+  OffsetCXXExceptionInThreadConstant = ConstantInt::get(Type::Int32Ty, 10);
+  
   ClassReadyConstant = ConstantInt::get(Type::Int32Ty, ready);
  
 
@@ -2179,9 +2184,6 @@
   VirtualFieldLookupFunction = module->getFunction("virtualFieldLookup");
   StaticFieldLookupFunction = module->getFunction("staticFieldLookup");
   
-  GetExceptionFunction = module->getFunction("JavaThreadGetException");
-  GetJavaExceptionFunction = module->getFunction("JavaThreadGetJavaException");
-  CompareExceptionFunction = module->getFunction("JavaThreadCompareException");
   JniProceedPendingExceptionFunction = 
     module->getFunction("jniProceedPendingException");
   GetSJLJBufferFunction = module->getFunction("getSJLJBuffer");
@@ -2203,8 +2205,6 @@
 
   ThrowExceptionFunction = module->getFunction("JavaThreadThrowException");
 
-  ClearExceptionFunction = module->getFunction("JavaThreadClearException");
-  
   GetArrayClassFunction = module->getFunction("getArrayClass");
   
 

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=63520&r1=63519&r2=63520&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Mon Feb  2 10:09:41 2009
@@ -367,17 +367,16 @@
   static llvm::ConstantInt* OffsetStaticInstanceInTaskClassMirrorConstant;
   static llvm::ConstantInt* OffsetStatusInTaskClassMirrorConstant;
   
+  static llvm::ConstantInt* OffsetJavaExceptionInThreadConstant;
+  static llvm::ConstantInt* OffsetCXXExceptionInThreadConstant;
+  
   static llvm::ConstantInt* ClassReadyConstant;
 
   static llvm::Constant*    JavaObjectNullConstant;
   static llvm::Constant*    MaxArraySizeConstant;
   static llvm::Constant*    JavaArraySizeConstant;
 
-  llvm::Function* GetExceptionFunction;
-  llvm::Function* GetJavaExceptionFunction;
   llvm::Function* ThrowExceptionFunction;
-  llvm::Function* ClearExceptionFunction;
-  llvm::Function* CompareExceptionFunction;
   llvm::Function* NullPointerExceptionFunction;
   llvm::Function* IndexOutOfBoundsExceptionFunction;
   llvm::Function* ClassCastExceptionFunction;





More information about the vmkit-commits mailing list