[vmkit-commits] [vmkit] r77316 - in /vmkit/trunk: include/jnjvm/JnjvmModule.h include/mvm/JIT.h lib/JnJVM/Compiler/JavaJIT.cpp lib/JnJVM/Compiler/JavaJIT.h lib/JnJVM/Compiler/JavaJITOpcodes.cpp lib/JnJVM/Compiler/JnjvmModule.cpp lib/JnJVM/LLVMRuntime/runtime-default.ll lib/Mvm/Compiler/JIT.cpp lib/Mvm/Compiler/LLVMRuntime.ll lib/Mvm/Runtime/Object.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue Jul 28 03:24:29 PDT 2009


Author: geoffray
Date: Tue Jul 28 05:24:07 2009
New Revision: 77316

URL: http://llvm.org/viewvc/llvm-project?rev=77316&view=rev
Log:
Add the first bits for cooperative GC.


Modified:
    vmkit/trunk/include/jnjvm/JnjvmModule.h
    vmkit/trunk/include/mvm/JIT.h
    vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp
    vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.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/Mvm/Compiler/JIT.cpp
    vmkit/trunk/lib/Mvm/Compiler/LLVMRuntime.ll
    vmkit/trunk/lib/Mvm/Runtime/Object.cpp

Modified: vmkit/trunk/include/jnjvm/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/jnjvm/JnjvmModule.h?rev=77316&r1=77315&r2=77316&view=diff

==============================================================================
--- vmkit/trunk/include/jnjvm/JnjvmModule.h (original)
+++ vmkit/trunk/include/jnjvm/JnjvmModule.h Tue Jul 28 05:24:07 2009
@@ -375,6 +375,7 @@
   
   
   bool enabledException;
+  bool cooperativeGC;
   
   virtual void makeVT(Class* cl) = 0;
   
@@ -398,11 +399,19 @@
   bool hasExceptionsEnabled() {
     return enabledException;
   }
+
+  bool useCooperativeGC() {
+    return cooperativeGC;
+  }
   
   void disableExceptions() {
     enabledException = false;
   }
   
+  void disableCooperativeGC() {
+    cooperativeGC = false;
+  }
+  
   virtual JavaCompiler* Create(const std::string& ModuleID) = 0;
   
   virtual ~JavaLLVMCompiler();

Modified: vmkit/trunk/include/mvm/JIT.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/JIT.h?rev=77316&r1=77315&r2=77316&view=diff

==============================================================================
--- vmkit/trunk/include/mvm/JIT.h (original)
+++ vmkit/trunk/include/mvm/JIT.h Tue Jul 28 05:24:07 2009
@@ -115,6 +115,8 @@
   llvm::Function* llvm_atomic_lcs_ptr;
   llvm::Function* llvm_gc_gcroot;
 
+  llvm::Function* conditionalSafePoint;
+  llvm::Function* unconditionalSafePoint;
 
    llvm::Constant* constantInt8Zero;
    llvm::Constant* constantZero;

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp Tue Jul 28 05:24:07 2009
@@ -368,8 +368,12 @@
         new BitCastInst(temp, module->ptrPtrType, "", currentBlock),
         module->constantPtrNull
       };
-      CallInst::Create(module->llvm_gc_gcroot, GCArgs, GCArgs + 2, "",
-                       currentBlock);
+      
+      if (TheCompiler->useCooperativeGC()) {
+        CallInst::Create(module->llvm_gc_gcroot, GCArgs, GCArgs + 2, "",
+                         currentBlock);
+      }
+      
       new StoreInst(i, temp, false, currentBlock);
       node->addIncoming(temp, currentBlock);
       BranchInst::Create(BB, currentBlock);
@@ -668,17 +672,19 @@
 }
   
 static void removeUnusedObjects(std::vector<AllocaInst*>& objects,
-                                JnjvmModule* module) {
+                                JnjvmModule* module, bool coop) {
   for (std::vector<AllocaInst*>::iterator i = objects.begin(),
        e = objects.end(); i != e; ++i) {
     AllocaInst* temp = *i;
     if (temp->getNumUses()) {
-      Instruction* I = new BitCastInst(temp, module->ptrPtrType, "");
-      I->insertAfter(temp);
-      Value* GCArgs[2] = { I, module->constantPtrNull };
-      Instruction* C = CallInst::Create(module->llvm_gc_gcroot, GCArgs,
-                                        GCArgs + 2, "");
-      C->insertAfter(I);
+      if (coop) {
+        Instruction* I = new BitCastInst(temp, module->ptrPtrType, "");
+        I->insertAfter(temp);
+        Value* GCArgs[2] = { I, module->constantPtrNull };
+        Instruction* C = CallInst::Create(module->llvm_gc_gcroot, GCArgs,
+                                          GCArgs + 2, "");
+        C->insertAfter(I);
+      }
     } else {
       temp->eraseFromParent();
     }
@@ -845,8 +851,8 @@
   removeUnusedLocals(floatStack);
   removeUnusedLocals(longStack);
   
-  removeUnusedObjects(objectLocals, module);
-  removeUnusedObjects(objectStack, module);
+  removeUnusedObjects(objectLocals, module, TheCompiler->useCooperativeGC());
+  removeUnusedObjects(objectStack, module, TheCompiler->useCooperativeGC());
 
 
   return endNode;
@@ -1039,7 +1045,27 @@
   if (returnType != Type::VoidTy) {
     endNode = llvm::PHINode::Create(returnType, "", endBlock);
   }
-  
+ 
+  if (TheCompiler->useCooperativeGC()) {
+    Value* threadId = getCurrentThread();
+     
+    Value* YieldPtr = 
+      GetElementPtrInst::Create(threadId,
+                                module->OffsetDoYieldInThreadConstant,
+                                "", currentBlock);
+
+    Value* Yield = new LoadInst(YieldPtr, "", currentBlock);
+
+    BasicBlock* continueBlock = createBasicBlock("After safe point");
+    BasicBlock* yieldBlock = createBasicBlock("In safe point");
+    BranchInst::Create(yieldBlock, continueBlock, Yield, currentBlock);
+
+    currentBlock = yieldBlock;
+    CallInst::Create(module->conditionalSafePoint, "", currentBlock);
+    BranchInst::Create(continueBlock, currentBlock);
+
+    currentBlock = continueBlock;
+  }
 
   
   if (isSynchro(compilingMethod->access))
@@ -1148,8 +1174,8 @@
   removeUnusedLocals(floatStack);
   removeUnusedLocals(longStack);
   
-  removeUnusedObjects(objectLocals, module);
-  removeUnusedObjects(objectStack, module);
+  removeUnusedObjects(objectLocals, module, TheCompiler->useCooperativeGC());
+  removeUnusedObjects(objectStack, module, TheCompiler->useCooperativeGC());
   
   func->setLinkage(GlobalValue::ExternalLinkage);
   

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.h (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.h Tue Jul 28 05:24:07 2009
@@ -51,6 +51,11 @@
   /// handler.
   ///
   bool handler;
+
+  /// backEdge - If the instruction is the first instruction of a basic block
+  /// where a forward opcode branches to, consider the block as a back edge.
+  ///
+  bool backEdge;
 };
 
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJITOpcodes.cpp Tue Jul 28 05:24:07 2009
@@ -2423,6 +2423,9 @@
         uint16 index = tmp + readU2(bytecodes, i);
         if (!(opcodeInfos[index].newBlock))
           opcodeInfos[index].newBlock = createBasicBlock("GOTO or IF*");
+
+        if (index <= tmp) opcodeInfos[index].backEdge = true;
+
         break;
       }
       
@@ -2455,6 +2458,9 @@
           BasicBlock* block = createBasicBlock("tableswitch");
           opcodeInfos[index].newBlock = block;
         }
+        
+        if (index <= tmp) opcodeInfos[index].backEdge = true;
+        
         uint32 low = readU4(bytecodes, i);
         uint32 high = readU4(bytecodes, i) + 1;
         uint32 depl = high - low;
@@ -2464,6 +2470,7 @@
             BasicBlock* block = createBasicBlock("tableswitch");
             opcodeInfos[index2].newBlock = block;
           }
+          if (index2 <= tmp) opcodeInfos[index2].backEdge = true;
         }
         i = tmp + 12 + filled + (depl << 2);
         break;
@@ -2478,6 +2485,8 @@
           BasicBlock* block = createBasicBlock("tableswitch");
           opcodeInfos[index].newBlock = block;
         }
+        if (index <= tmp) opcodeInfos[index].backEdge = true;
+        
         uint32 nbs = readU4(bytecodes, i);
         for (uint32 cur = 0; cur < nbs; ++cur) {
           i += 4;
@@ -2486,6 +2495,7 @@
             BasicBlock* block = createBasicBlock("tableswitch");
             opcodeInfos[index2].newBlock = block;
           }
+          if (index2 <= tmp) opcodeInfos[index2].backEdge = true;
         }
         
         i = tmp + 8 + filled + (nbs << 3);
@@ -2557,6 +2567,7 @@
         uint16 index = tmp + readU2(bytecodes, i);
         if (!(opcodeInfos[index].newBlock))
           opcodeInfos[index].newBlock = createBasicBlock("true IF*NULL");
+        if (index <= tmp) opcodeInfos[index].backEdge = true;
         break;
       }
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Tue Jul 28 05:24:07 2009
@@ -66,6 +66,7 @@
   JavaIntrinsics(TheModule) {
 
   enabledException = true;
+  cooperativeGC = false;
 }
   
 void JavaLLVMCompiler::resolveVirtualClass(Class* cl) {

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=77316&r1=77315&r2=77316&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original)
+++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Tue Jul 28 05:24:07 2009
@@ -229,7 +229,6 @@
 declare void @jnjvmJNIProceedPendingException(i32**, i8**)
 declare void @jnjvmGetSJLJBuffer(i32*, i32**, i8*, i8**)
 
-declare %JavaObject* @gcmalloc(i32, %VT*)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Debugging methods ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -238,3 +237,11 @@
 declare void @jnjvmPrintExecution(i32, i32, %JavaMethod*)
 declare void @jnjvmPrintMethodStart(%JavaMethod*)
 declare void @jnjvmPrintMethodEnd(%JavaMethod*)
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GC methods ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+
+declare %JavaObject* @gcmalloc(i32, %VT*)

Modified: vmkit/trunk/lib/Mvm/Compiler/JIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Compiler/JIT.cpp?rev=77316&r1=77315&r2=77316&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/Compiler/JIT.cpp (original)
+++ vmkit/trunk/lib/Mvm/Compiler/JIT.cpp Tue Jul 28 05:24:07 2009
@@ -211,6 +211,9 @@
 
   llvm_atomic_lcs_ptr = pointerSizeType == Type::Int32Ty ? llvm_atomic_lcs_i32 :
                                                            llvm_atomic_lcs_i64;
+
+  unconditionalSafePoint = module->getFunction("unconditionalSafePoint");
+  conditionalSafePoint = module->getFunction("conditionalSafePoint");
 }
 
 

Modified: vmkit/trunk/lib/Mvm/Compiler/LLVMRuntime.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Compiler/LLVMRuntime.ll?rev=77316&r1=77315&r2=77316&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/Compiler/LLVMRuntime.ll (original)
+++ vmkit/trunk/lib/Mvm/Compiler/LLVMRuntime.ll Tue Jul 28 05:24:07 2009
@@ -74,6 +74,9 @@
 declare i32 @llvm.atomic.cmp.swap.i32.p0i32(i32*, i32, i32) nounwind
 declare i64 @llvm.atomic.cmp.swap.i64.p0i64(i64*, i64, i64) nounwind
 
+declare void @unconditionalSafePoint() nounwind
+declare void @conditionalSafePoint() nounwind
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Modified: vmkit/trunk/lib/Mvm/Runtime/Object.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/Object.cpp?rev=77316&r1=77315&r2=77316&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/Runtime/Object.cpp (original)
+++ vmkit/trunk/lib/Mvm/Runtime/Object.cpp Tue Jul 28 05:24:07 2009
@@ -307,3 +307,9 @@
 void Allocator::freeTemporaryMemory(void* obj) {
   return free(obj); 
 }
+
+
+
+extern "C" void conditionalSafePoint() {
+  abort();
+}





More information about the vmkit-commits mailing list