[vmkit-commits] [vmkit] r145140 - in /vmkit/trunk/lib/j3: Compiler/JavaJIT.cpp VMCore/JavaThread.cpp VMCore/Jni.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Fri Nov 25 16:31:19 PST 2011


Author: geoffray
Date: Fri Nov 25 18:31:19 2011
New Revision: 145140

URL: http://llvm.org/viewvc/llvm-project?rev=145140&view=rev
Log:
Use NonHeapWriteBarrier for GC objects in JavaThread.


Modified:
    vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp
    vmkit/trunk/lib/j3/VMCore/JavaThread.cpp
    vmkit/trunk/lib/j3/VMCore/Jni.cpp

Modified: vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp?rev=145140&r1=145139&r2=145140&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/JavaJIT.cpp Fri Nov 25 18:31:19 2011
@@ -2332,16 +2332,7 @@
     BranchInst::Create(ifNormal, currentBlock);
 
     currentBlock = ifException;
-    CallInst::Create(intrinsics->UnregisterSetjmpFunction, jmpBuffer, "", currentBlock);
- 
-    if (!currentExceptionBlock->empty()) {
-      // Get the Java exception.
-      Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr(getMutatorThreadPtr())); 
-      Value* obj = new LoadInst(javaExceptionPtr, "", currentBlock);
-      Instruction* insn = currentExceptionBlock->begin();
-      PHINode* node = dyn_cast<PHINode>(insn);
-      if (node) node->addIncoming(obj, currentBlock);
-    } 
+    CallInst::Create(intrinsics->UnregisterSetjmpFunction, jmpBuffer, "", currentBlock); 
     BranchInst::Create(currentExceptionBlock, currentBlock);
     currentBlock = ifNormal; 
   }

Modified: vmkit/trunk/lib/j3/VMCore/JavaThread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaThread.cpp?rev=145140&r1=145139&r2=145140&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaThread.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaThread.cpp Fri Nov 25 18:31:19 2011
@@ -32,8 +32,8 @@
 void JavaThread::initialise(JavaObject* thread, JavaObject* vmth) {
   llvm_gcroot(thread, 0);
   llvm_gcroot(vmth, 0);
-  javaThread = thread;
-  vmThread = vmth;
+  vmkit::Collector::objectReferenceNonHeapWriteBarrier((gc**)&javaThread, (gc*)thread);
+  vmkit::Collector::objectReferenceNonHeapWriteBarrier((gc**)&vmThread, (gc*)vmth);
 }
 
 JavaThread::~JavaThread() {
@@ -42,16 +42,14 @@
 
 void JavaThread::throwException(JavaObject* obj) {
   llvm_gcroot(obj, 0);
-  JavaThread* th = JavaThread::get();
-  assert(th->pendingException == 0 && "pending exception already there?");
-  th->pendingException = obj;
-  th->internalThrowException();
+  assert(pendingException == 0 && "pending exception already there?");
+  vmkit::Collector::objectReferenceNonHeapWriteBarrier((gc**)&pendingException, (gc*)obj);
+  internalThrowException();
 }
 
 void JavaThread::throwPendingException() {
-  JavaThread* th = JavaThread::get();
-  assert(th->pendingException);
-  th->internalThrowException();
+  assert(pendingException);
+  internalThrowException();
 }
 
 void JavaThread::startJNI() {
@@ -143,7 +141,8 @@
     next->prev = this;
     return next->addJNIReference(th, obj);
   } else {
-    localReferences[length] = obj;
+    vmkit::Collector::objectReferenceNonHeapWriteBarrier(
+        (gc**)&(localReferences[length]), (gc*)obj);
     return &localReferences[length++];
   }
 }

Modified: vmkit/trunk/lib/j3/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jni.cpp?rev=145140&r1=145139&r2=145140&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jni.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/Jni.cpp Fri Nov 25 18:31:19 2011
@@ -177,7 +177,11 @@
 
 jint Throw(JNIEnv *env, jthrowable obj) {
   BEGIN_JNI_EXCEPTION
-  JavaThread::get()->pendingException = *(JavaObject**)obj;
+  JavaObject* excp = *(JavaObject**)obj;
+  llvm_gcroot(excp, 0);
+  JavaThread* th = JavaThread::get();
+  vmkit::Collector::objectReferenceNonHeapWriteBarrier(
+      (gc**)&(th->pendingException), (gc*)excp);
 
   RETURN_FROM_JNI(0);
 
@@ -212,7 +216,8 @@
                                           false, true, 0);
   str = vm->asciizToStr(msg);
   init->invokeIntSpecial(vm, realCl, res, &str);
-  th->pendingException = res;
+  vmkit::Collector::objectReferenceNonHeapWriteBarrier(
+      (gc**)&(th->pendingException), (gc*)res);
   
   RETURN_FROM_JNI(0);
   





More information about the vmkit-commits mailing list