[vmkit-commits] [vmkit] r120561 - in /vmkit/branches/multi-vm: include/j3/J3Intrinsics.h include/mvm/JIT.h include/mvm/Threads/Thread.h lib/J3/Compiler/ExceptionsCheck.inc lib/J3/Compiler/J3Intrinsics.cpp lib/J3/Compiler/JavaJIT.cpp lib/J3/Compiler/JavaJIT.h lib/J3/LLVMRuntime/runtime-default.ll lib/J3/VMCore/JavaThread.cpp lib/J3/VMCore/JavaThread.h lib/J3/VMCore/Jnjvm.cpp lib/J3/VMCore/VirtualTables.cpp lib/Mvm/CommonThread/ctthread.cpp lib/Mvm/Compiler/JIT.cpp lib/Mvm/Compiler/mvm-runtime.ll

Gael Thomas gael.thomas at lip6.fr
Tue Nov 30 23:22:08 PST 2010


Author: gthomas
Date: Wed Dec  1 01:22:08 2010
New Revision: 120561

URL: http://llvm.org/viewvc/llvm-project?rev=120561&view=rev
Log:
Move pendingException in mvm::Thread. Don't forget to trace the JavaThread.

Modified:
    vmkit/branches/multi-vm/include/j3/J3Intrinsics.h
    vmkit/branches/multi-vm/include/mvm/JIT.h
    vmkit/branches/multi-vm/include/mvm/Threads/Thread.h
    vmkit/branches/multi-vm/lib/J3/Compiler/ExceptionsCheck.inc
    vmkit/branches/multi-vm/lib/J3/Compiler/J3Intrinsics.cpp
    vmkit/branches/multi-vm/lib/J3/Compiler/JavaJIT.cpp
    vmkit/branches/multi-vm/lib/J3/Compiler/JavaJIT.h
    vmkit/branches/multi-vm/lib/J3/LLVMRuntime/runtime-default.ll
    vmkit/branches/multi-vm/lib/J3/VMCore/JavaThread.cpp
    vmkit/branches/multi-vm/lib/J3/VMCore/JavaThread.h
    vmkit/branches/multi-vm/lib/J3/VMCore/Jnjvm.cpp
    vmkit/branches/multi-vm/lib/J3/VMCore/VirtualTables.cpp
    vmkit/branches/multi-vm/lib/Mvm/CommonThread/ctthread.cpp
    vmkit/branches/multi-vm/lib/Mvm/Compiler/JIT.cpp
    vmkit/branches/multi-vm/lib/Mvm/Compiler/mvm-runtime.ll

Modified: vmkit/branches/multi-vm/include/j3/J3Intrinsics.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/include/j3/J3Intrinsics.h?rev=120561&r1=120560&r2=120561&view=diff
==============================================================================
--- vmkit/branches/multi-vm/include/j3/J3Intrinsics.h (original)
+++ vmkit/branches/multi-vm/include/j3/J3Intrinsics.h Wed Dec  1 01:22:08 2010
@@ -29,6 +29,7 @@
   const llvm::Type* JavaArrayObjectType;
   
   const llvm::Type* JavaObjectType;
+  const llvm::Type* JavaObjectPtrType;
   const llvm::Type* JavaArrayType;
   const llvm::Type* JavaCommonClassType;
   const llvm::Type* JavaClassType;

Modified: vmkit/branches/multi-vm/include/mvm/JIT.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/include/mvm/JIT.h?rev=120561&r1=120560&r2=120561&view=diff
==============================================================================
--- vmkit/branches/multi-vm/include/mvm/JIT.h (original)
+++ vmkit/branches/multi-vm/include/mvm/JIT.h Wed Dec  1 01:22:08 2010
@@ -182,6 +182,8 @@
   llvm::Constant* OffsetVMInThreadConstant;
   llvm::Constant* OffsetCXXExceptionInThreadConstant;
   llvm::Constant* OffsetVMDataInThreadConstant;
+	llvm::Constant* OffsetPendingExceptionInThreadConstant;
+
 	llvm::Constant* OffsetThreadInMutatorThreadConstant;
 };
 

Modified: vmkit/branches/multi-vm/include/mvm/Threads/Thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/include/mvm/Threads/Thread.h?rev=120561&r1=120560&r2=120561&view=diff
==============================================================================
--- vmkit/branches/multi-vm/include/mvm/Threads/Thread.h (original)
+++ vmkit/branches/multi-vm/include/mvm/Threads/Thread.h Wed Dec  1 01:22:08 2010
@@ -34,6 +34,8 @@
   #define END_CATCH }
 #endif
 
+class gc;
+
 namespace mvm {
 
 class MethodInfo;
@@ -150,6 +152,8 @@
 		this->mut = m;
 	}
 
+  virtual void tracer(uintptr_t closure) = 0;
+
 	virtual ~VMThreadData() {} // force the construction of a VT
 };
 
@@ -160,11 +164,12 @@
 public:
   Thread() {
 #ifdef RUNTIME_DWARF_EXCEPTIONS
-  internalPendingException = 0;
+		internalPendingException = 0;
 #else
-  lastExceptionBuffer = 0;
+		lastExceptionBuffer = 0;
 #endif
-  lastKnownFrame = 0;
+		lastKnownFrame = 0;
+		pendingException = 0;
   }
 
   /// yield - Yield the processor to another thread.
@@ -240,10 +245,10 @@
 
 public:
  
-  /// tracer - Does nothing. Used for child classes which may defined
-  /// a tracer.
+  /// tracer - trace the pendingException and the vmData
   ///
-  virtual void tracer(uintptr_t closure) {}
+  virtual void tracer(uintptr_t closure);
+
   void scanStack(uintptr_t closure);
   
   void* getLastSP() { return lastSP; }
@@ -351,6 +356,10 @@
   /// vmData - vm specific data
   ///
 	VMThreadData* vmData;
+
+  /// pendingException - the pending exception
+  ///
+	gc* pendingException;
 };
 
 #ifndef RUNTIME_DWARF_EXCEPTIONS

Modified: vmkit/branches/multi-vm/lib/J3/Compiler/ExceptionsCheck.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/J3/Compiler/ExceptionsCheck.inc?rev=120561&r1=120560&r2=120561&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/J3/Compiler/ExceptionsCheck.inc (original)
+++ vmkit/branches/multi-vm/lib/J3/Compiler/ExceptionsCheck.inc Wed Dec  1 01:22:08 2010
@@ -8,7 +8,7 @@
   res->setDebugLoc(DL);
   
   if (TheCompiler->hasExceptionsEnabled()) {
-    Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr(getMutatorThreadPtr()));
+    Value* exceptionPtr = getPendingExceptionPtr(getMutatorThreadPtr());
     
     // Get the Java exception.
     Value* obj = 0;
@@ -28,13 +28,13 @@
       // Make the load volatile to force the instruction after the call.
       // Otherwise, LLVM will merge the load with a previous load because
       // the function is readnone.
-      obj = new LoadInst(javaExceptionPtr, "", TheCompiler->useCooperativeGC(), currentBlock);
+      obj = new LoadInst(exceptionPtr, "", TheCompiler->useCooperativeGC(), currentBlock);
       test = new BitCastInst(res, intrinsics->JavaObjectType, "", currentBlock);
       test = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, test, obj, "");
       Value* T = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE, obj, zero, "");
       test = BinaryOperator::CreateAnd(test, T, "", currentBlock);
     } else {
-      obj = new LoadInst(javaExceptionPtr, "", currentBlock);
+      obj = new LoadInst(exceptionPtr, "", currentBlock);
       test = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE, obj, zero, "");
     }
 
@@ -61,7 +61,7 @@
   res->setDebugLoc(DL);
   
   if (TheCompiler->hasExceptionsEnabled()) {
-    Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr(getMutatorThreadPtr()));
+    Value* exceptionPtr = getPendingExceptionPtr(getMutatorThreadPtr());
     
     // Get the Java exception.
     Value* obj = 0;
@@ -74,13 +74,13 @@
         F == intrinsics->GetConstantPoolAtFunction ||
         F == intrinsics->GetArrayClassFunction ||
         F == intrinsics->GetClassDelegateeFunction) {
-      obj = new LoadInst(javaExceptionPtr, "", TheCompiler->useCooperativeGC(), currentBlock);
+      obj = new LoadInst(exceptionPtr, "", TheCompiler->useCooperativeGC(), currentBlock);
       test = new BitCastInst(res, intrinsics->JavaObjectType, "", currentBlock);
       test = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, test, obj, "");
       Value* T = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE, obj, zero, "");
       test = BinaryOperator::CreateAnd(test, T, "", currentBlock);
     } else {
-      obj = new LoadInst(javaExceptionPtr, "", currentBlock);
+      obj = new LoadInst(exceptionPtr, "", currentBlock);
       test = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE, obj, zero, "");
     }
 
@@ -108,7 +108,7 @@
   res->setDebugLoc(DL);
   
   if (TheCompiler->hasExceptionsEnabled()) {
-    Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr(getMutatorThreadPtr()));
+    Value* exceptionPtr = getPendingExceptionPtr(getMutatorThreadPtr());
     
     // Get the Java exception.
     Value* obj = 0;
@@ -121,13 +121,13 @@
         F == intrinsics->GetConstantPoolAtFunction ||
         F == intrinsics->GetArrayClassFunction ||
         F == intrinsics->GetClassDelegateeFunction) {
-      obj = new LoadInst(javaExceptionPtr, "", TheCompiler->useCooperativeGC(), currentBlock);
+      obj = new LoadInst(exceptionPtr, "", TheCompiler->useCooperativeGC(), currentBlock);
       test = new BitCastInst(res, intrinsics->JavaObjectType, "", currentBlock);
       test = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, test, obj, "");
       Value* T = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE, obj, zero, "");
       test = BinaryOperator::CreateAnd(test, T, "", currentBlock);
     } else {
-      obj = new LoadInst(javaExceptionPtr, "", currentBlock);
+      obj = new LoadInst(exceptionPtr, "", currentBlock);
       test = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE, obj, zero, "");
     }
   
@@ -152,7 +152,7 @@
   res->setDebugLoc(DL);
   
   if (TheCompiler->hasExceptionsEnabled()) {
-    Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr(getMutatorThreadPtr()));
+    Value* exceptionPtr = getPendingExceptionPtr(getMutatorThreadPtr());
     
     // Get the Java exception.
     Value* obj = 0;
@@ -165,13 +165,13 @@
         F == intrinsics->GetConstantPoolAtFunction ||
         F == intrinsics->GetArrayClassFunction ||
         F == intrinsics->GetClassDelegateeFunction) {
-      obj = new LoadInst(javaExceptionPtr, "", TheCompiler->useCooperativeGC(), currentBlock);
+      obj = new LoadInst(exceptionPtr, "", TheCompiler->useCooperativeGC(), currentBlock);
       test = new BitCastInst(res, intrinsics->JavaObjectType, "", currentBlock);
       test = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, test, obj, "");
       Value* T = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE, obj, zero, "");
       test = BinaryOperator::CreateAnd(test, T, "", currentBlock);
     } else {
-      obj = new LoadInst(javaExceptionPtr, "", currentBlock);
+      obj = new LoadInst(exceptionPtr, "", currentBlock);
       test = new ICmpInst(*currentBlock, ICmpInst::ICMP_NE, obj, zero, "");
     }
 
@@ -210,9 +210,9 @@
 
 void JavaJIT::throwException(Value* obj) {
   JITVerifyNull(obj);
-	Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr(getMutatorThreadPtr()));
+	Value* exceptionPtr = getPendingExceptionPtr(getMutatorThreadPtr());
 
-  new StoreInst(obj, javaExceptionPtr, currentBlock);
+  new StoreInst(obj, exceptionPtr, currentBlock);
   if (currentExceptionBlock != endExceptionBlock) {
     Instruction* insn = currentExceptionBlock->begin();
     PHINode* node = dyn_cast<PHINode>(insn);
@@ -458,10 +458,10 @@
     currentBlock = cur->javaHandler;
 
     // First thing in the handler: clear the exception.
-    Value* javaExceptionPtr = getJavaExceptionPtr(getJavaThreadPtr(getMutatorThreadPtr()));
+    Value* exceptionPtr = getPendingExceptionPtr(getMutatorThreadPtr());
     
     // Clear exceptions.
-    new StoreInst(intrinsics->JavaObjectNullConstant, javaExceptionPtr,
+    new StoreInst(intrinsics->JavaObjectNullConstant, exceptionPtr,
                   currentBlock);
 
 #if defined(SERVICE)

Modified: vmkit/branches/multi-vm/lib/J3/Compiler/J3Intrinsics.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/J3/Compiler/J3Intrinsics.cpp?rev=120561&r1=120560&r2=120561&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/J3/Compiler/J3Intrinsics.cpp (original)
+++ vmkit/branches/multi-vm/lib/J3/Compiler/J3Intrinsics.cpp Wed Dec  1 01:22:08 2010
@@ -46,6 +46,8 @@
   JavaObjectType = 
     PointerType::getUnqual(module->getTypeByName("JavaObject"));
 
+  JavaObjectPtrType = PointerType::getUnqual(JavaObjectType);
+
   JavaArrayType =
     PointerType::getUnqual(module->getTypeByName("JavaArray"));
   
@@ -140,7 +142,6 @@
   OffsetInitializedInTaskClassMirrorConstant = constantOne;
   
   OffsetJNIInJavaThreadConstant =           ConstantInt::get(Type::getInt32Ty(Context), 1);
-  OffsetJavaExceptionInJavaThreadConstant = ConstantInt::get(Type::getInt32Ty(Context), 2);
   
   ClassReadyConstant = ConstantInt::get(Type::getInt8Ty(Context), ready);
   

Modified: vmkit/branches/multi-vm/lib/J3/Compiler/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/J3/Compiler/JavaJIT.cpp?rev=120561&r1=120560&r2=120561&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/J3/Compiler/JavaJIT.cpp (original)
+++ vmkit/branches/multi-vm/lib/J3/Compiler/JavaJIT.cpp Wed Dec  1 01:22:08 2010
@@ -305,6 +305,15 @@
 	return GetElementPtrInst::Create(mutatorThreadPtr, GEP, GEP + 3, "", currentBlock);
 }
 
+llvm::Value* JavaJIT::getPendingExceptionPtr(llvm::Value* mutatorThreadPtr) { 
+	Value* GEP[3] = { intrinsics->constantZero,
+										intrinsics->OffsetThreadInMutatorThreadConstant,
+										intrinsics->OffsetPendingExceptionInThreadConstant };
+    
+	Value* res = GetElementPtrInst::Create(mutatorThreadPtr, GEP, GEP + 3, "", currentBlock);
+  return new BitCastInst(res, intrinsics->JavaObjectPtrType, "", currentBlock);
+}
+
 llvm::Value* JavaJIT::getJavaThreadPtr(llvm::Value* mutatorThreadPtr) { 
 	Value* GEP[3] = { intrinsics->constantZero,
 										intrinsics->OffsetThreadInMutatorThreadConstant,
@@ -323,13 +332,6 @@
 	return new BitCastInst(res, intrinsics->ptrType, "", currentBlock);
 }
 
-llvm::Value* JavaJIT::getJavaExceptionPtr(llvm::Value* javaThreadPtr) { 
-	Value* GEP[2] = { intrinsics->constantZero,
-										intrinsics->OffsetJavaExceptionInJavaThreadConstant };
-    
-	return GetElementPtrInst::Create(javaThreadPtr, GEP, GEP + 2, "", currentBlock);
-}
-
 
 extern "C" void j3ThrowExceptionFromJIT();
 

Modified: vmkit/branches/multi-vm/lib/J3/Compiler/JavaJIT.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/J3/Compiler/JavaJIT.h?rev=120561&r1=120560&r2=120561&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/J3/Compiler/JavaJIT.h (original)
+++ vmkit/branches/multi-vm/lib/J3/Compiler/JavaJIT.h Wed Dec  1 01:22:08 2010
@@ -152,14 +152,14 @@
   /// getCXXExceptionPtr - Emit code to get a pointer to internalPendingException.
 	llvm::Value* getCXXExceptionPtr(llvm::Value* mutatorThreadPtr);
 
+  /// getPendingExceptionPtr - Emit code to get a pointer to the Java pending exception
+	llvm::Value* getPendingExceptionPtr(llvm::Value* mutatorThreadPtr);
+
   /// getJavaThreadPtr - Emit code to get a pointer to the current JavaThread.
 	llvm::Value* getJavaThreadPtr(llvm::Value* mutatorThreadPtr);
 
   /// getJNIEnvPtr - Emit code to get a pointer to JNIEnv
 	llvm::Value* getJNIEnvPtr(llvm::Value* javaThreadPtr);
-
-  /// getJavaExceptionPtr - Emit code to get a pointer to the Java pending exception
-	llvm::Value* getJavaExceptionPtr(llvm::Value* javaThreadPtr);
 	
 
 //===------------------------- Debugging support --------------------------===//

Modified: vmkit/branches/multi-vm/lib/J3/LLVMRuntime/runtime-default.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/J3/LLVMRuntime/runtime-default.ll?rev=120561&r1=120560&r2=120561&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/J3/LLVMRuntime/runtime-default.ll (original)
+++ vmkit/branches/multi-vm/lib/J3/LLVMRuntime/runtime-default.ll Wed Dec  1 01:22:08 2010
@@ -24,7 +24,10 @@
 ;;; Field 3: The static instance
 %TaskClassMirror = type { i8, i1, i8* }
 
-%JavaThread = type { %VMThreadData, i8*, %JavaObject* }
+;;; The Java Thread
+;;; Field 1: VMThreadData parent
+;;; Field 2: void*        jniEnv
+%JavaThread = type { %VMThreadData, i8* }
 
 %JavaConstantPool = type { %JavaClass*, i32, i8*, i32*, i8** }
 

Modified: vmkit/branches/multi-vm/lib/J3/VMCore/JavaThread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/J3/VMCore/JavaThread.cpp?rev=120561&r1=120560&r2=120561&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/J3/VMCore/JavaThread.cpp (original)
+++ vmkit/branches/multi-vm/lib/J3/VMCore/JavaThread.cpp Wed Dec  1 01:22:08 2010
@@ -21,7 +21,6 @@
 
 JavaThread::JavaThread(mvm::MutatorThread* mut, Jnjvm* isolate)
 	: mvm::VMThreadData(mut) {
-  pendingException = NULL;
   jniEnv = isolate->jniEnv;
   localJNIRefs = new JNILocalReferences();
   currentAddedReferences = NULL;
@@ -66,13 +65,12 @@
 
 JavaThread* JavaThread::setPendingException(JavaObject *obj) {
 	llvm_gcroot(obj, 0);
-  assert(JavaThread::get()->pendingException == 0 && "pending exception already there?");
-	mvm::Thread* mut = mvm::Thread::get();
-  j3Thread(mut)->pendingException = obj;	
+  assert(mvm::Thread::get()->pendingException == 0 && "pending exception already there?");
+	mvm::Thread::get()->pendingException = obj;
 }
 
 void JavaThread::throwIt() {
-  assert(JavaThread::get()->pendingException);
+  assert(mvm::Thread::get()->pendingException);
 	mvm::Thread::get()->internalThrowException();
 }
 

Modified: vmkit/branches/multi-vm/lib/J3/VMCore/JavaThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/J3/VMCore/JavaThread.h?rev=120561&r1=120560&r2=120561&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/J3/VMCore/JavaThread.h (original)
+++ vmkit/branches/multi-vm/lib/J3/VMCore/JavaThread.h Wed Dec  1 01:22:08 2010
@@ -71,10 +71,6 @@
   /// jniEnv - The JNI environment of the thread.
   ///
   void* jniEnv;
-  
-  /// pendingException - The Java exception currently pending.
-  ///
-  JavaObject* pendingException;
 
   /// javaThread - The Java representation of this thread.
   ///
@@ -171,12 +167,12 @@
 
   /// clearPendingException - Clear the pending exception.
 	//
-	void clearPendingException() { pendingException = 0; }
+	void clearPendingException() { mut->pendingException = 0; }
   
   /// getPendingException - Return the pending exception.
   ///
   JavaObject* getPendingException() {
-    return pendingException;
+    return (JavaObject*)mut->pendingException;
   }
 
   /// throwFromJNI - Throw an exception after executing JNI code.

Modified: vmkit/branches/multi-vm/lib/J3/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/J3/VMCore/Jnjvm.cpp?rev=120561&r1=120560&r2=120561&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/J3/VMCore/Jnjvm.cpp (original)
+++ vmkit/branches/multi-vm/lib/J3/VMCore/Jnjvm.cpp Wed Dec  1 01:22:08 2010
@@ -1209,7 +1209,7 @@
   } END_CATCH;
 
   exc = JavaThread::get()->getPendingException();
-	printf("Exception: %p\n", exc);
+
   if (exc != NULL) {
     JavaThread* th   = JavaThread::get();
     th->clearPendingException();

Modified: vmkit/branches/multi-vm/lib/J3/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/J3/VMCore/VirtualTables.cpp?rev=120561&r1=120560&r2=120561&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/J3/VMCore/VirtualTables.cpp (original)
+++ vmkit/branches/multi-vm/lib/J3/VMCore/VirtualTables.cpp Wed Dec  1 01:22:08 2010
@@ -254,8 +254,7 @@
 //
 // The threads must trace:
 // (1) Their stack (already done by the GC in the case of GCMmap2 or Boehm)
-// (2) Their pending exception if there is one.
-// (3) The java.lang.Thread delegate.
+// (2) The java.lang.Thread delegate.
 //===----------------------------------------------------------------------===//
 
 
@@ -328,7 +327,6 @@
 }
 
 void JavaThread::tracer(uintptr_t closure) {
-  mvm::Collector::markAndTraceRoot(&pendingException, closure);
   mvm::Collector::markAndTraceRoot(&javaThread, closure);
   mvm::Collector::markAndTraceRoot(&vmThread, closure);
 #ifdef SERVICE

Modified: vmkit/branches/multi-vm/lib/Mvm/CommonThread/ctthread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/Mvm/CommonThread/ctthread.cpp?rev=120561&r1=120560&r2=120561&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/Mvm/CommonThread/ctthread.cpp (original)
+++ vmkit/branches/multi-vm/lib/Mvm/CommonThread/ctthread.cpp Wed Dec  1 01:22:08 2010
@@ -30,6 +30,11 @@
 
 using namespace mvm;
 
+void Thread::tracer(uintptr_t closure) {
+	mvm::Collector::markAndTraceRoot(&pendingException, closure);
+	vmData->tracer(closure);
+}
+
 int Thread::kill(void* tid, int signo) {
   return pthread_kill((pthread_t)tid, signo);
 }

Modified: vmkit/branches/multi-vm/lib/Mvm/Compiler/JIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/Mvm/Compiler/JIT.cpp?rev=120561&r1=120560&r2=120561&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/Mvm/Compiler/JIT.cpp (original)
+++ vmkit/branches/multi-vm/lib/Mvm/Compiler/JIT.cpp Wed Dec  1 01:22:08 2010
@@ -331,6 +331,8 @@
   OffsetDoYieldInThreadConstant =           ConstantInt::get(Type::getInt32Ty(Context), 4);
   OffsetCXXExceptionInThreadConstant =      ConstantInt::get(Type::getInt32Ty(Context), 11);
   OffsetVMDataInThreadConstant =            ConstantInt::get(Type::getInt32Ty(Context), 12);
+  OffsetPendingExceptionInThreadConstant =  ConstantInt::get(Type::getInt32Ty(Context), 13);
+
 	OffsetThreadInMutatorThreadConstant =     ConstantInt::get(Type::getInt32Ty(Context), 0);
 }
 

Modified: vmkit/branches/multi-vm/lib/Mvm/Compiler/mvm-runtime.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/multi-vm/lib/Mvm/Compiler/mvm-runtime.ll?rev=120561&r1=120560&r2=120561&view=diff
==============================================================================
--- vmkit/branches/multi-vm/lib/Mvm/Compiler/mvm-runtime.ll (original)
+++ vmkit/branches/multi-vm/lib/Mvm/Compiler/mvm-runtime.ll Wed Dec  1 01:22:08 2010
@@ -20,7 +20,8 @@
 ;;; field 10: void*  lastKnownFrame
 ;;; field 11: void*  lastExceptionBuffer
 ;;; field 12: void*  vmData
-%Thread       = type { %CircularBase, i32, i8*, i8*, i1, i1, i1, i8*, i8*, i8*, i8*, i8*, i8* }
+;;; field 13: gc*    pendingException
+%Thread       = type { %CircularBase, i32, i8*, i8*, i1, i1, i1, i8*, i8*, i8*, i8*, i8*, i8*, i8* }
 %VMThreadData = type { %VT*, %Thread* }
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;





More information about the vmkit-commits mailing list