[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