[vmkit-commits] [vmkit] r76420 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathVMRuntime.inc Compiler/JavaJIT.cpp LLVMRuntime/runtime-default.ll VMCore/JavaRuntimeJIT.cpp VMCore/JavaThread.cpp VMCore/JavaThread.h
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Mon Jul 20 03:19:58 PDT 2009
Author: geoffray
Date: Mon Jul 20 05:19:51 2009
New Revision: 76420
URL: http://llvm.org/viewvc/llvm-project?rev=76420&view=rev
Log:
Use the thread stack to allocate jmp_buf buffers instead of a vector.
Modified:
vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.inc
vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp
vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll
vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h
Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.inc?rev=76420&r1=76419&r2=76420&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.inc Mon Jul 20 05:19:51 2009
@@ -76,8 +76,9 @@
#endif
typedef int (*onLoad_t)(const void**, void*);
-extern "C" void jnjvmJNIProceedPendingException(uint32** old);
-extern "C" void* jnjvmGetSJLJBuffer(uint32* num, uint32** old);
+extern "C" void jnjvmJNIProceedPendingException(uint32** old, void** oldBuf);
+extern "C" void jnjvmGetSJLJBuffer(uint32* num, uint32** old, void* newBuf,
+ void** newBuf);
// Calls the JNI_OnLoad function of a dynamic library.
void callOnLoad(void* res, JnjvmClassLoader* loader, Jnjvm* vm) {
@@ -87,13 +88,15 @@
if (onLoad) {
uint32 num = 0;
uint32* old = 0;
- void* buf = jnjvmGetSJLJBuffer(&num, &old);
+ void* oldBuf = 0;
+ jmp_buf buf;
+ jnjvmGetSJLJBuffer(&num, &old, (void*)buf, &oldBuf);
if (setjmp((jumpbuf_t)buf) == 0) {
onLoad(&vm->javavmEnv, res);
}
- jnjvmJNIProceedPendingException(&old);
+ jnjvmJNIProceedPendingException(&old, &oldBuf);
}
}
Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp?rev=76420&r1=76419&r2=76420&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp Mon Jul 20 05:19:51 2009
@@ -273,11 +273,16 @@
compilingMethod->setCompiledPtr((void*)natPtr, functionName);
return llvmFunction;
}
-
+
+
currentExceptionBlock = endExceptionBlock = 0;
currentBlock = createBasicBlock("start");
BasicBlock* executeBlock = createBasicBlock("execute");
endBlock = createBasicBlock("end block");
+
+ Constant* sizeB = llvmContext->getConstantInt(Type::Int32Ty, sizeof(jmp_buf));
+ Value* oldJB = new AllocaInst(module->ptrType, "", currentBlock);
+ Value* newJB = new AllocaInst(Type::Int8Ty, sizeB, "", currentBlock);
// Allocate currentLocalIndexNumber pointer
Value* temp = new AllocaInst(Type::Int32Ty, "",
@@ -288,11 +293,12 @@
Value* oldCLIN = new AllocaInst(PointerType::getUnqual(Type::Int32Ty), "",
currentBlock);
- Value* Args2[2] = { temp, oldCLIN };
+ Value* Args4[4] = { temp, oldCLIN, newJB, oldJB };
+
+ CallInst::Create(module->GetSJLJBufferFunction, Args4, Args4 + 4, "",
+ currentBlock);
- Value* buf = CallInst::Create(module->GetSJLJBufferFunction,
- Args2, Args2 + 2, "", currentBlock);
- Value* test = CallInst::Create(module->setjmpLLVM, buf, "",
+ Value* test = CallInst::Create(module->setjmpLLVM, newJB, "",
currentBlock);
test = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ, test,
@@ -436,9 +442,11 @@
currentBlock = endBlock;
if (isSynchro(compilingMethod->access))
endSynchronize();
-
- CallInst::Create(module->JniProceedPendingExceptionFunction, oldCLIN, "",
- currentBlock);
+
+ Value* Args2[2] = { oldCLIN, oldJB };
+
+ CallInst::Create(module->JniProceedPendingExceptionFunction, Args2, Args2 + 2,
+ "", currentBlock);
if (returnType != Type::VoidTy)
ReturnInst::Create(endNode, currentBlock);
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=76420&r1=76419&r2=76420&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original)
+++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Mon Jul 20 05:19:51 2009
@@ -221,8 +221,8 @@
declare void @jnjvmThrowException(%JavaObject*)
declare void @jnjvmThrowExceptionFromJIT()
-declare void @jnjvmJNIProceedPendingException(i32**)
-declare i8* @jnjvmGetSJLJBuffer(i32*, i32**)
+declare void @jnjvmJNIProceedPendingException(i32**, i8**)
+declare void @jnjvmGetSJLJBuffer(i32*, i32**, i8*, i8**)
declare %JavaObject* @gcmalloc(i32, %VT*)
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=76420&r1=76419&r2=76420&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Mon Jul 20 05:19:51 2009
@@ -369,20 +369,19 @@
}
// Does not call Java code.
-extern "C" void jnjvmJNIProceedPendingException(uint32** oldLRN) {
+extern "C" void jnjvmJNIProceedPendingException(uint32** oldLRN, void** oldBuffer) {
JavaThread* th = JavaThread::get();
- jmp_buf* buf = th->sjlj_buffers.back();
- // Remove the buffer.
- th->sjlj_buffers.pop_back();
- mvm::Allocator& allocator = th->getJVM()->gcAllocator;
- allocator.freeTemporaryMemory(buf);
-
// We're going back to Java
th->endJNI();
-
+
+ // Update the buffer.
+ th->currentSjljBuffer = *oldBuffer;
+
+ // Update the number of references.
th->currentAddedReferences = *oldLRN;
+
#ifdef DWARF_EXCEPTIONS
// If there's an exception, throw it now.
if (JavaThread::get()->pendingException) {
@@ -392,12 +391,16 @@
}
// Never throws.
-extern "C" void* jnjvmGetSJLJBuffer(uint32* localReferencesNumber,
- uint32** oldLocalReferencesNumber) {
+extern "C" void jnjvmGetSJLJBuffer(uint32* localReferencesNumber,
+ uint32** oldLocalReferencesNumber,
+ void* newBuffer, void** oldBuffer) {
JavaThread* th = JavaThread::get();
- mvm::Allocator& allocator = th->getJVM()->gcAllocator;
- void** buf = (void**)allocator.allocateTemporaryMemory(sizeof(jmp_buf));
- th->sjlj_buffers.push_back((jmp_buf*)buf);
+
+ *oldBuffer = th->currentSjljBuffer;
+ th->currentSjljBuffer = newBuffer;
+
+ memset(newBuffer, 0, sizeof(jmp_buf));
+
*oldLocalReferencesNumber = th->currentAddedReferences;
th->currentAddedReferences = localReferencesNumber;
@@ -405,8 +408,7 @@
// JNI function.
th->startJNI(2);
- // Finally, return the buffer that the Java code will use to do the setjmp.
- return (void*)buf;
+ return;
}
// Never throws.
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=76420&r1=76419&r2=76420&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Mon Jul 20 05:19:51 2009
@@ -33,6 +33,7 @@
jniEnv = isolate->jniEnv;
localJNIRefs = new JNILocalReferences();
currentAddedReferences = 0;
+ currentSjljBuffer = 0;
#ifdef SERVICE
eipIndex = 0;
@@ -298,6 +299,7 @@
JavaObject** JNILocalReferences::addJNIReference(JavaThread* th,
JavaObject* obj) {
if (length == MAXIMUM_REFERENCES) {
+ fprintf(stderr, "CREATE\n");
JNILocalReferences* next = new JNILocalReferences();
th->localJNIRefs = next;
next->prev = this;
@@ -317,9 +319,6 @@
if (num > length) {
fprintf(stderr, "num = %d et length = %d\n", num, length);
- if (!prev) {
- JavaThread::get()->printBacktrace();
- }
assert(prev && "No prev and deleting too much local references");
prev->removeJNIReferences(th, num - length);
} else {
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h?rev=76420&r1=76419&r2=76420&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Mon Jul 20 05:19:51 2009
@@ -108,11 +108,11 @@
/// state - The current state of this thread: Running, Waiting or Interrupted.
uint32 state;
- /// sjlj_buffers - Setjmp buffers pushed when entering a non-JVM native
+ /// currentSjljBuffers - Current buffer pushed when entering a non-JVM native
/// function and popped when leaving the function. The buffer is used when
/// the native function throws an exception through a JNI throwException call.
///
- std::vector<jmp_buf*> sjlj_buffers;
+ void* currentSjljBuffer;
/// addresses - The list of return addresses which represent native/Java cross
/// calls.
@@ -130,7 +130,7 @@
JavaObject** pushJNIRef(JavaObject* obj) {
if (!obj) return 0;
-
+
++(*currentAddedReferences);
return localJNIRefs->addJNIReference(this, obj);
@@ -191,12 +191,12 @@
/// throwFromJNI - Throw an exception after executing JNI code.
///
void throwFromJNI() {
- assert(sjlj_buffers.size());
+ assert(currentSjljBuffer);
internalPendingException = 0;
#if defined(__MACH__)
- longjmp((int*)sjlj_buffers.back(), 1);
+ longjmp((int*)currentSjljBuffer, 1);
#else
- longjmp((__jmp_buf_tag*)sjlj_buffers.back(), 1);
+ longjmp((__jmp_buf_tag*)currentSjljBuffer, 1);
#endif
}
More information about the vmkit-commits
mailing list