[vmkit-commits] [vmkit] r82030 - /vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Wed Sep 16 01:54:17 PDT 2009
Author: geoffray
Date: Wed Sep 16 03:54:16 2009
New Revision: 82030
URL: http://llvm.org/viewvc/llvm-project?rev=82030&view=rev
Log:
Get the callback buffer before entering Java code: getting the buffer may
yield a GC, so the thread should be in native mode and not in Java mode.
Also, readArgs after any point that may lead to a GC: the arguments will be
in a buffer and we won't be able to copy them.
TODO: make sure that's GC-copying safe.
Modified:
vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=82030&r1=82029&r2=82030&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Wed Sep 16 03:54:16 2009
@@ -79,13 +79,14 @@
Signdef* sign = getSignature(); \
uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64)); \
void* _buf = (void*)buf; \
- readArgs(buf, sign, ap, jni); \
void* func = (((void***)obj)[0])[offset];\
+ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \
+ readArgs(buf, sign, ap, jni); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
try { \
- res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, _buf);\
+ res = call(cl->getConstantPool(), func, obj, _buf);\
} catch (...) { \
th->throwFromJava(); \
} \
@@ -98,13 +99,14 @@
Signdef* sign = getSignature(); \
uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64)); \
void* _buf = (void*)buf; \
- readArgs(buf, sign, ap, jni); \
void* func = this->compiledPtr();\
+ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \
+ readArgs(buf, sign, ap, jni); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
try { \
- res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, _buf);\
+ res = call(cl->getConstantPool(), func, obj, _buf);\
} catch (...) { \
th->throwFromJava(); \
} \
@@ -121,13 +123,14 @@
Signdef* sign = getSignature(); \
uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64)); \
void* _buf = (void*)buf; \
- readArgs(buf, sign, ap, jni); \
void* func = this->compiledPtr();\
+ FUNC_TYPE_STATIC_BUF call = (FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf(); \
+ readArgs(buf, sign, ap, jni); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
try { \
- res = ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(cl->getConstantPool(), func, _buf);\
+ res = call(cl->getConstantPool(), func, _buf);\
} catch (...) { \
th->throwFromJava(); \
} \
@@ -139,11 +142,12 @@
verifyNull(obj);\
Signdef* sign = getSignature(); \
void* func = (((void***)obj)[0])[offset];\
+ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
try { \
- res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\
+ res = call(cl->getConstantPool(), func, obj, buf);\
} catch (...) { \
th->throwFromJava(); \
} \
@@ -155,11 +159,12 @@
verifyNull(obj);\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
+ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
try { \
- res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\
+ res = call(cl->getConstantPool(), func, obj, buf);\
} catch (...) { \
th->throwFromJava(); \
} \
@@ -175,11 +180,12 @@
\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
+ FUNC_TYPE_STATIC_BUF call = (FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
try { \
- res = ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(cl->getConstantPool(), func, buf);\
+ res = call(cl->getConstantPool(), func, buf);\
} catch (...) { \
th->throwFromJava(); \
} \
@@ -219,11 +225,12 @@
verifyNull(obj); \
void* func = (((void***)obj)[0])[offset];\
Signdef* sign = getSignature(); \
+ FUNC_TYPE_VIRTUAL_AP call = (FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
try { \
- res = ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(cl->getConstantPool(), func, obj, ap);\
+ res = call(cl->getConstantPool(), func, obj, ap);\
} catch (...) { \
th->throwFromJava(); \
} \
@@ -235,11 +242,12 @@
verifyNull(obj);\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
+ FUNC_TYPE_VIRTUAL_AP call = (FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
try { \
- res = ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(cl->getConstantPool(), func, obj, ap);\
+ res = call(cl->getConstantPool(), func, obj, ap);\
} catch (...) { \
th->throwFromJava(); \
} \
@@ -255,11 +263,12 @@
\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
+ FUNC_TYPE_STATIC_AP call = (FUNC_TYPE_STATIC_AP)sign->getStaticCallAP(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
try { \
- res = ((FUNC_TYPE_STATIC_AP)sign->getStaticCallAP())(cl->getConstantPool(), func, ap);\
+ res = call(cl->getConstantPool(), func, ap);\
} catch (...) { \
th->throwFromJava(); \
} \
@@ -271,11 +280,12 @@
verifyNull(obj);\
void* func = (((void***)obj)[0])[offset];\
Signdef* sign = getSignature(); \
+ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
try { \
- res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\
+ res = call(cl->getConstantPool(), func, obj, buf);\
} catch (...) { \
th->throwFromJava(); \
} \
@@ -287,11 +297,12 @@
verifyNull(obj);\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
+ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
try { \
- res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\
+ res = call(cl->getConstantPool(), func, obj, buf);\
} catch (...) { \
th->throwFromJava(); \
} \
@@ -307,11 +318,12 @@
\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
+ FUNC_TYPE_STATIC_BUF call = (FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
try { \
- res = ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(cl->getConstantPool(), func, buf);\
+ res = call(cl->getConstantPool(), func, buf);\
} catch (...) { \
th->throwFromJava(); \
} \
@@ -355,12 +367,13 @@
Signdef* sign = getSignature(); \
uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64)); \
void* _buf = (void*)buf; \
- readArgs(buf, sign, ap, jni); \
void* func = (((void***)obj)[0])[offset];\
+ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \
+ readArgs(buf, sign, ap, jni); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
- res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, _buf);\
+ res = call(cl->getConstantPool(), func, obj, _buf);\
if (th->pendingException) { \
th->throwFromJava(); \
} \
@@ -373,12 +386,13 @@
Signdef* sign = getSignature(); \
uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64)); \
void* _buf = (void*)buf; \
- readArgs(buf, sign, ap, jni); \
void* func = this->compiledPtr();\
+ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \
+ readArgs(buf, sign, ap, jni); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
- res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, _buf);\
+ res = call(cl->getConstantPool(), func, obj, _buf);\
if (th->pendingException) { \
th->throwFromJava(); \
} \
@@ -395,12 +409,13 @@
Signdef* sign = getSignature(); \
uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64)); \
void* _buf = (void*)buf; \
- readArgs(buf, sign, ap, jni); \
void* func = this->compiledPtr();\
+ FUNC_TYPE_STATIC_BUF call = (FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf(); \
+ readArgs(buf, sign, ap, jni); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
- res = ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(cl->getConstantPool(), func, _buf);\
+ res = call(cl->getConstantPool(), func, _buf);\
if (th->pendingException) { \
th->throwFromJava(); \
} \
@@ -412,10 +427,11 @@
verifyNull(obj);\
Signdef* sign = getSignature(); \
void* func = (((void***)obj)[0])[offset];\
+ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
- res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\
+ res = call(cl->getConstantPool(), func, obj, buf);\
if (th->pendingException) { \
th->throwFromJava(); \
} \
@@ -427,10 +443,11 @@
verifyNull(obj);\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
+ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
- res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\
+ res = call(cl->getConstantPool(), func, obj, buf);\
if (th->pendingException) { \
th->throwFromJava(); \
} \
@@ -446,10 +463,11 @@
\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
+ FUNC_TYPE_STATIC_BUF call = (FUNC_TYPE_STATIC_BUF)sign->getVirtualCallBuf(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
- res = ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(cl->getConstantPool(), func, buf);\
+ res = call(cl->getConstantPool(), func, buf);\
if (th->pendingException) { \
th->throwFromJava(); \
} \
@@ -489,10 +507,11 @@
verifyNull(obj); \
void* func = (((void***)obj)[0])[offset];\
Signdef* sign = getSignature(); \
+ FUNC_TYPE_VIRTUAL_AP call = (FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
- res = ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(cl->getConstantPool(), func, obj, ap);\
+ res = call(cl->getConstantPool(), func, obj, ap);\
if (th->pendingException) { \
th->throwFromJava(); \
} \
@@ -504,10 +523,11 @@
verifyNull(obj);\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
+ FUNC_TYPE_VIRTUAL_AP call = (FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
- res = ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(cl->getConstantPool(), func, obj, ap);\
+ res = call(cl->getConstantPool(), func, obj, ap);\
if (th->pendingException) { \
th->throwFromJava(); \
} \
@@ -523,10 +543,11 @@
\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
+ FUNC_TYPE_STATIC_AP call = (FUNC_TYPE_STATIC_AP)sign->getStaticCallAP(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
- res = ((FUNC_TYPE_STATIC_AP)sign->getStaticCallAP())(cl->getConstantPool(), func, ap);\
+ res = call(cl->getConstantPool(), func, ap);\
if (th->pendingException) { \
th->throwFromJava(); \
} \
@@ -538,10 +559,11 @@
verifyNull(obj);\
void* func = (((void***)obj)[0])[offset];\
Signdef* sign = getSignature(); \
+ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
- res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\
+ res = call(cl->getConstantPool(), func, obj, buf);\
if (th->pendingException) { \
th->throwFromJava(); \
} \
@@ -553,10 +575,11 @@
verifyNull(obj);\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
+ FUNC_TYPE_VIRTUAL_BUF call = (FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
- res = ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(cl->getConstantPool(), func, obj, buf);\
+ res = call(cl->getConstantPool(), func, obj, buf);\
if (th->pendingException) { \
th->throwFromJava(); \
} \
@@ -572,10 +595,11 @@
\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
+ FUNC_TYPE_STATIC_BUF call = (FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf(); \
JavaThread* th = JavaThread::get(); \
th->startJava(); \
TYPE res = 0; \
- res = ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(cl->getConstantPool(), func, buf);\
+ res = call(cl->getConstantPool(), func, buf);\
if (th->pendingException) { \
th->throwFromJava(); \
} \
@@ -644,6 +668,7 @@
void Jnjvm::invokeFinalizer(gc* _obj) {
JavaObject* obj = (JavaObject*)_obj;
+ llvm_gcroot(obj, 0);
JavaMethod* meth = upcalls->FinalizeObject;
UserClass* cl = obj->getClass()->asClass();
meth->invokeIntVirtualBuf(this, cl, obj, 0);
@@ -651,6 +676,7 @@
bool Jnjvm::enqueueReference(gc* _obj) {
JavaObject* obj = (JavaObject*)_obj;
+ llvm_gcroot(obj, 0);
JavaMethod* meth = upcalls->EnqueueReference;
UserClass* cl = obj->getClass()->asClass();
return (bool)meth->invokeIntSpecialBuf(this, cl, obj, 0);
More information about the vmkit-commits
mailing list