[vmkit-commits] [vmkit] r76420 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathVMRuntime.inc Compiler/JavaJIT.cpp LLVMRuntime/runtime-default.ll VMCore/JavaRuntimeJIT.cpp VMCore/JavaThread.cpp VMCore/JavaThread.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Mon Jul 20 03:19:58 PDT 2009


Author: geoffray
Date: Mon Jul 20 05:19:51 2009
New Revision: 76420

URL: http://llvm.org/viewvc/llvm-project?rev=76420&view=rev
Log:
Use the thread stack to allocate jmp_buf buffers instead of a vector.


Modified:
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.inc
    vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp
    vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll
    vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h

Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.inc?rev=76420&r1=76419&r2=76420&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.inc Mon Jul 20 05:19:51 2009
@@ -76,8 +76,9 @@
 #endif
 
 typedef int (*onLoad_t)(const void**, void*);
-extern "C" void  jnjvmJNIProceedPendingException(uint32** old);
-extern "C" void* jnjvmGetSJLJBuffer(uint32* num, uint32** old);
+extern "C" void  jnjvmJNIProceedPendingException(uint32** old, void** oldBuf);
+extern "C" void  jnjvmGetSJLJBuffer(uint32* num, uint32** old, void* newBuf,
+                                    void** newBuf);
 
 // Calls the JNI_OnLoad function of a dynamic library.
 void callOnLoad(void* res, JnjvmClassLoader* loader, Jnjvm* vm) {
@@ -87,13 +88,15 @@
   if (onLoad) {
     uint32 num = 0;
     uint32* old = 0;
-    void* buf = jnjvmGetSJLJBuffer(&num, &old);
+    void* oldBuf = 0;
+    jmp_buf buf;
+    jnjvmGetSJLJBuffer(&num, &old, (void*)buf, &oldBuf);
     
     if (setjmp((jumpbuf_t)buf) == 0) {
       onLoad(&vm->javavmEnv, res);
     }
 
-    jnjvmJNIProceedPendingException(&old);
+    jnjvmJNIProceedPendingException(&old, &oldBuf);
   }
 }
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp Mon Jul 20 05:19:51 2009
@@ -273,11 +273,16 @@
     compilingMethod->setCompiledPtr((void*)natPtr, functionName);
     return llvmFunction;
   }
-  
+
+
   currentExceptionBlock = endExceptionBlock = 0;
   currentBlock = createBasicBlock("start");
   BasicBlock* executeBlock = createBasicBlock("execute");
   endBlock = createBasicBlock("end block");
+  
+  Constant* sizeB = llvmContext->getConstantInt(Type::Int32Ty, sizeof(jmp_buf));
+  Value* oldJB = new AllocaInst(module->ptrType, "", currentBlock);
+  Value* newJB = new AllocaInst(Type::Int8Ty, sizeB, "", currentBlock);
       
   // Allocate currentLocalIndexNumber pointer
   Value* temp = new AllocaInst(Type::Int32Ty, "",
@@ -288,11 +293,12 @@
   Value* oldCLIN = new AllocaInst(PointerType::getUnqual(Type::Int32Ty), "",
                                   currentBlock);
 
-  Value* Args2[2] = { temp, oldCLIN };
+  Value* Args4[4] = { temp, oldCLIN, newJB, oldJB };
+
+  CallInst::Create(module->GetSJLJBufferFunction, Args4, Args4 + 4, "",
+                   currentBlock);
 
-  Value* buf = CallInst::Create(module->GetSJLJBufferFunction,
-                                Args2, Args2 + 2, "", currentBlock);
-  Value* test = CallInst::Create(module->setjmpLLVM, buf, "",
+  Value* test = CallInst::Create(module->setjmpLLVM, newJB, "",
                                  currentBlock);
 
   test = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, test,
@@ -436,9 +442,11 @@
   currentBlock = endBlock; 
   if (isSynchro(compilingMethod->access))
     endSynchronize();
-  
-  CallInst::Create(module->JniProceedPendingExceptionFunction, oldCLIN, "",
-                   currentBlock);
+ 
+  Value* Args2[2] = { oldCLIN, oldJB };
+
+  CallInst::Create(module->JniProceedPendingExceptionFunction, Args2, Args2 + 2,
+                   "", currentBlock);
   
   if (returnType != Type::VoidTy)
     ReturnInst::Create(endNode, currentBlock);

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=76420&r1=76419&r2=76420&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original)
+++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Mon Jul 20 05:19:51 2009
@@ -221,8 +221,8 @@
 declare void @jnjvmThrowException(%JavaObject*)
 declare void @jnjvmThrowExceptionFromJIT()
 
-declare void @jnjvmJNIProceedPendingException(i32**)
-declare i8*  @jnjvmGetSJLJBuffer(i32*, i32**)
+declare void @jnjvmJNIProceedPendingException(i32**, i8**)
+declare void @jnjvmGetSJLJBuffer(i32*, i32**, i8*, i8**)
 
 declare %JavaObject* @gcmalloc(i32, %VT*)
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Mon Jul 20 05:19:51 2009
@@ -369,20 +369,19 @@
 }
 
 // Does not call Java code.
-extern "C" void jnjvmJNIProceedPendingException(uint32** oldLRN) {
+extern "C" void jnjvmJNIProceedPendingException(uint32** oldLRN, void** oldBuffer) {
   JavaThread* th = JavaThread::get();
-  jmp_buf* buf = th->sjlj_buffers.back();
   
-  // Remove the buffer.
-  th->sjlj_buffers.pop_back();
-  mvm::Allocator& allocator = th->getJVM()->gcAllocator;
-  allocator.freeTemporaryMemory(buf);
-
   // We're going back to Java
   th->endJNI();
-
+  
+  // Update the buffer.
+  th->currentSjljBuffer = *oldBuffer;
+  
+  // Update the number of references.
   th->currentAddedReferences = *oldLRN;
 
+
 #ifdef DWARF_EXCEPTIONS
   // If there's an exception, throw it now.
   if (JavaThread::get()->pendingException) {
@@ -392,12 +391,16 @@
 }
 
 // Never throws.
-extern "C" void* jnjvmGetSJLJBuffer(uint32* localReferencesNumber,
-                                    uint32** oldLocalReferencesNumber) {
+extern "C" void jnjvmGetSJLJBuffer(uint32* localReferencesNumber,
+                                   uint32** oldLocalReferencesNumber,
+                                   void* newBuffer, void** oldBuffer) {
   JavaThread* th = JavaThread::get();
-  mvm::Allocator& allocator = th->getJVM()->gcAllocator;
-  void** buf = (void**)allocator.allocateTemporaryMemory(sizeof(jmp_buf));
-  th->sjlj_buffers.push_back((jmp_buf*)buf);
+ 
+  *oldBuffer = th->currentSjljBuffer;
+  th->currentSjljBuffer = newBuffer;
+ 
+  memset(newBuffer, 0, sizeof(jmp_buf));
+
   *oldLocalReferencesNumber = th->currentAddedReferences;
   th->currentAddedReferences = localReferencesNumber;
 
@@ -405,8 +408,7 @@
   // JNI function.
   th->startJNI(2);
 
-  // Finally, return the buffer that the Java code will use to do the setjmp.
-  return (void*)buf;
+  return;
 }
 
 // Never throws.

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Mon Jul 20 05:19:51 2009
@@ -33,6 +33,7 @@
   jniEnv = isolate->jniEnv;
   localJNIRefs = new JNILocalReferences();
   currentAddedReferences = 0;
+  currentSjljBuffer = 0;
 
 #ifdef SERVICE
   eipIndex = 0;
@@ -298,6 +299,7 @@
 JavaObject** JNILocalReferences::addJNIReference(JavaThread* th,
                                                  JavaObject* obj) {
   if (length == MAXIMUM_REFERENCES) {
+    fprintf(stderr, "CREATE\n");
     JNILocalReferences* next = new JNILocalReferences();
     th->localJNIRefs = next;
     next->prev = this;
@@ -317,9 +319,6 @@
 
   if (num > length) {
     fprintf(stderr, "num = %d et length = %d\n", num, length);
-    if (!prev) {
-      JavaThread::get()->printBacktrace();
-    }
     assert(prev && "No prev and deleting too much local references");
     prev->removeJNIReferences(th, num - length);
   } else {

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Mon Jul 20 05:19:51 2009
@@ -108,11 +108,11 @@
   /// state - The current state of this thread: Running, Waiting or Interrupted.
   uint32 state;
   
-  /// sjlj_buffers - Setjmp buffers pushed when entering a non-JVM native
+  /// currentSjljBuffers - Current buffer pushed when entering a non-JVM native
   /// function and popped when leaving the function. The buffer is used when
   /// the native function throws an exception through a JNI throwException call.
   ///
-  std::vector<jmp_buf*> sjlj_buffers;
+  void* currentSjljBuffer;
 
   /// addresses - The list of return addresses which represent native/Java cross
   /// calls.
@@ -130,7 +130,7 @@
 
   JavaObject** pushJNIRef(JavaObject* obj) {
     if (!obj) return 0;
-    
+   
     ++(*currentAddedReferences);
     return localJNIRefs->addJNIReference(this, obj);
 
@@ -191,12 +191,12 @@
   /// throwFromJNI - Throw an exception after executing JNI code.
   ///
   void throwFromJNI() {
-    assert(sjlj_buffers.size());
+    assert(currentSjljBuffer);
     internalPendingException = 0;
 #if defined(__MACH__)
-    longjmp((int*)sjlj_buffers.back(), 1);
+    longjmp((int*)currentSjljBuffer, 1);
 #else
-    longjmp((__jmp_buf_tag*)sjlj_buffers.back(), 1);
+    longjmp((__jmp_buf_tag*)currentSjljBuffer, 1);
 #endif
   }
   





More information about the vmkit-commits mailing list