[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