[vmkit-commits] [vmkit] r59910 - /vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Sun Nov 23 06:34:43 PST 2008
Author: geoffray
Date: Sun Nov 23 08:34:36 2008
New Revision: 59910
URL: http://llvm.org/viewvc/llvm-project?rev=59910&view=rev
Log:
Also change the current JnJVM when returning from an exception.
Modified:
vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=59910&r1=59909&r2=59910&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Sun Nov 23 08:34:36 2008
@@ -1045,6 +1045,7 @@
llvm::CallInst::Create(module->exceptionEndCatch,
void_28_params.begin(), void_28_params.end(), "",
cur->nativeHandler);
+
BranchInst::Create(cur->javaHandler, cur->nativeHandler);
if (cur->javaHandler->empty()) {
@@ -1059,6 +1060,64 @@
assert(node && "malformed exceptions");
node->addIncoming(exc, cur->nativeHandler);
}
+#if defined(SERVICE)
+ currentBlock = cur->javaHandler;
+ JnjvmClassLoader* loader = compilingClass->classLoader;;
+ Value* Cmp = 0;
+ Value* threadId = 0;
+ Value* OldIsolateID = 0;
+ Value* IsolateIDPtr = 0;
+ Value* OldIsolate = 0;
+ Value* NewIsolate = 0;
+ Value* IsolatePtr = 0;
+ if (loader != loader->bootstrapLoader) {
+ threadId = CallInst::Create(module->llvm_frameaddress, module->constantZero,
+ "", currentBlock);
+ threadId = new PtrToIntInst(threadId, module->pointerSizeType, "",
+ currentBlock);
+ threadId = BinaryOperator::CreateAnd(threadId, module->constantThreadIDMask,
+ "", currentBlock);
+
+ threadId = new IntToPtrInst(threadId, module->ptrPtrType, "", currentBlock);
+
+ std::vector<Value*> GEP;
+ GEP.push_back(module->constantThree);
+ IsolateIDPtr = GetElementPtrInst::Create(threadId, GEP.begin(), GEP.end(),
+ "", currentBlock);
+ const Type* realType = PointerType::getUnqual(module->pointerSizeType);
+ IsolateIDPtr = new BitCastInst(IsolateIDPtr, realType, "",
+ currentBlock);
+ OldIsolateID = new LoadInst(IsolateIDPtr, "", currentBlock);
+
+ Value* MyID = ConstantInt::get(module->pointerSizeType,
+ loader->isolate->IsolateID);
+ Cmp = new ICmpInst(ICmpInst::ICMP_EQ, OldIsolateID, MyID, "", currentBlock);
+
+ BasicBlock* EndBB = createBasicBlock("After service check");
+ BasicBlock* ServiceBB = createBasicBlock("Begin service call");
+
+ BranchInst::Create(EndBB, ServiceBB, Cmp, currentBlock);
+
+ currentBlock = ServiceBB;
+
+ new StoreInst(MyID, IsolateIDPtr, currentBlock);
+ GEP.clear();
+ GEP.push_back(module->constantFour);
+ IsolatePtr = GetElementPtrInst::Create(threadId, GEP.begin(), GEP.end(), "",
+ currentBlock);
+
+ OldIsolate = new LoadInst(IsolatePtr, "", currentBlock);
+ NewIsolate = module->getIsolate(loader->isolate);
+ NewIsolate = new LoadInst(NewIsolate, "", currentBlock);
+ new StoreInst(NewIsolate, IsolatePtr, currentBlock);
+
+ GEP.clear();
+ GEP.push_back(OldIsolate);
+ GEP.push_back(NewIsolate);
+ BranchInst::Create(EndBB, currentBlock);
+ currentBlock = EndBB;
+ }
+#endif
}
More information about the vmkit-commits
mailing list