[vmkit-commits] [vmkit] r76731 - in /vmkit/trunk: include/mvm/JIT.h lib/JnJVM/Compiler/JavaJIT.cpp lib/JnJVM/Compiler/JavaJIT.h lib/Mvm/Compiler/JIT.cpp lib/Mvm/Compiler/LLVMRuntime.ll

Nicolas Geoffray nicolas.geoffray at lip6.fr
Wed Jul 22 02:14:18 PDT 2009


Author: geoffray
Date: Wed Jul 22 04:14:00 2009
New Revision: 76731

URL: http://llvm.org/viewvc/llvm-project?rev=76731&view=rev
Log:
Add llvm_gcroot's in Java code.


Modified:
    vmkit/trunk/include/mvm/JIT.h
    vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp
    vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.h
    vmkit/trunk/lib/Mvm/Compiler/JIT.cpp
    vmkit/trunk/lib/Mvm/Compiler/LLVMRuntime.ll

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

==============================================================================
--- vmkit/trunk/include/mvm/JIT.h (original)
+++ vmkit/trunk/include/mvm/JIT.h Wed Jul 22 04:14:00 2009
@@ -113,6 +113,7 @@
   llvm::Function* llvm_atomic_lcs_i32;
   llvm::Function* llvm_atomic_lcs_i64;
   llvm::Function* llvm_atomic_lcs_ptr;
+  llvm::Function* llvm_gc_gcroot;
 
 
    llvm::Constant* constantInt8Zero;

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp Wed Jul 22 04:14:00 2009
@@ -364,6 +364,12 @@
 
       Value* temp = new AllocaInst(module->JavaObjectType, "",
                                    currentBlock);
+      Value* GCArgs[2] = { 
+        new BitCastInst(temp, module->ptrPtrType, "", currentBlock),
+        module->constantPtrNull
+      };
+      CallInst::Create(module->llvm_gc_gcroot, GCArgs, GCArgs + 2, "",
+                       currentBlock);
       new StoreInst(i, temp, false, currentBlock);
       node->addIncoming(temp, currentBlock);
       BranchInst::Create(BB, currentBlock);
@@ -651,6 +657,16 @@
 }
 
 
+static void removeUnusedLocals(std::vector<AllocaInst*>& locals) {
+  for (std::vector<AllocaInst*>::iterator i = locals.begin(),
+       e = locals.end(); i != e; ++i) {
+    AllocaInst* temp = *i;
+    if (!temp->getNumUses()) {
+      temp->eraseFromParent();
+    }
+  }
+}
+
 Instruction* JavaJIT::inlineCompile(BasicBlock*& curBB,
                                     BasicBlock* endExBlock,
                                     std::vector<Value*>& args) {
@@ -706,6 +722,7 @@
       objectLocals.push_back(new AllocaInst(module->JavaObjectType, "",
                                           firstInstruction));
     }
+
   } else {
     for (int i = 0; i < maxLocals; i++) {
       intLocals.push_back(new AllocaInst(Type::Int32Ty, "", firstBB));
@@ -716,6 +733,7 @@
                                             firstBB));
     }
   }
+      
   
   uint32 index = 0;
   uint32 count = 0;
@@ -780,6 +798,28 @@
               UTF8Buffer(compilingMethod->name).cString());
 
   curBB = endBlock;
+
+
+  for (std::vector<AllocaInst*>::iterator i = objectLocals.begin(),
+       e = objectLocals.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);
+    } else {
+      temp->eraseFromParent();
+    }
+  }
+  removeUnusedLocals(intLocals);
+  removeUnusedLocals(doubleLocals);
+  removeUnusedLocals(floatLocals);
+  removeUnusedLocals(longLocals);
+
+
   return endNode;
     
 }
@@ -843,7 +883,6 @@
     objectLocals.push_back(new AllocaInst(module->JavaObjectType, "",
                                           currentBlock));
   }
-
   
   uint32 index = 0;
   uint32 count = 0;
@@ -1062,6 +1101,26 @@
 
   finishExceptions();
   
+  for (std::vector<AllocaInst*>::iterator i = objectLocals.begin(),
+       e = objectLocals.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);
+    } else {
+      temp->eraseFromParent();
+    }
+  }
+  
+  removeUnusedLocals(intLocals);
+  removeUnusedLocals(doubleLocals);
+  removeUnusedLocals(floatLocals);
+  removeUnusedLocals(longLocals);
+  
   func->setLinkage(GlobalValue::ExternalLinkage);
   
   PRINT_DEBUG(JNJVM_COMPILE, 1, COLOR_NORMAL, "--> end compiling %s.%s\n",

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.h (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.h Wed Jul 22 04:14:00 2009
@@ -97,11 +97,11 @@
   JavaLLVMCompiler* TheCompiler;
   
   /// locals - The locals of the method.
-  std::vector<llvm::Value*> intLocals;
-  std::vector<llvm::Value*> longLocals;
-  std::vector<llvm::Value*> floatLocals;
-  std::vector<llvm::Value*> doubleLocals;
-  std::vector<llvm::Value*> objectLocals;
+  std::vector<llvm::AllocaInst*> intLocals;
+  std::vector<llvm::AllocaInst*> longLocals;
+  std::vector<llvm::AllocaInst*> floatLocals;
+  std::vector<llvm::AllocaInst*> doubleLocals;
+  std::vector<llvm::AllocaInst*> objectLocals;
 
   /// endBlock - The block that returns.
   llvm::BasicBlock* endBlock;

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

==============================================================================
--- vmkit/trunk/lib/Mvm/Compiler/JIT.cpp (original)
+++ vmkit/trunk/lib/Mvm/Compiler/JIT.cpp Wed Jul 22 04:14:00 2009
@@ -202,6 +202,7 @@
   llvm_memcpy_i32 = module->getFunction("llvm.memcpy.i32");
   llvm_memset_i32 = module->getFunction("llvm.memset.i32");
   llvm_frameaddress = module->getFunction("llvm.frameaddress");
+  llvm_gc_gcroot = module->getFunction("llvm.gcroot");
 
   llvm_atomic_lcs_i8 = module->getFunction("llvm.atomic.cmp.swap.i8.p0i8");
   llvm_atomic_lcs_i16 = module->getFunction("llvm.atomic.cmp.swap.i16.p0i16");

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

==============================================================================
--- vmkit/trunk/lib/Mvm/Compiler/LLVMRuntime.ll (original)
+++ vmkit/trunk/lib/Mvm/Compiler/LLVMRuntime.ll Wed Jul 22 04:14:00 2009
@@ -73,3 +73,9 @@
 declare i16 @llvm.atomic.cmp.swap.i16.p0i16(i16*, i16, i16) nounwind
 declare i32 @llvm.atomic.cmp.swap.i32.p0i32(i32*, i32, i32) nounwind
 declare i64 @llvm.atomic.cmp.swap.i64.p0i64(i64*, i64, i64) nounwind
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+declare void @llvm.gcroot(i8**, i8*)





More information about the vmkit-commits mailing list