[vmkit-commits] [vmkit] r180373 - Added gcroot to some functions that need it.
Peter Senna Tschudin
peter.senna at gmail.com
Thu Apr 25 10:04:20 PDT 2013
Author: peter.senna
Date: Thu Apr 25 12:02:42 2013
New Revision: 180373
URL: http://llvm.org/viewvc/llvm-project?rev=180373&view=rev
Log:
Added gcroot to some functions that need it.
(cherry picked from commit 93af5ef4551d7563574f85715a6e72e0d366e9d8)
Modified:
vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
vmkit/trunk/lib/j3/VMCore/JavaClass.h
vmkit/trunk/lib/j3/VMCore/JavaMetaJIT.cpp
vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp
Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.cpp?rev=180373&r1=180372&r2=180373&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.cpp Thu Apr 25 12:02:42 2013
@@ -1984,4 +1984,43 @@ JavaField_IMPL_ASSESSORS(uint8, Int8)
JavaField_IMPL_ASSESSORS(uint16, Int16)
JavaField_IMPL_ASSESSORS(uint32, Int32)
JavaField_IMPL_ASSESSORS(sint64, Long)
-JavaField_IMPL_ASSESSORS(JavaObject*, Object)
+// JavaField_IMPL_ASSESSORS(JavaObject*, Object)
+
+JavaObject* JavaField::getStaticObjectField()
+{
+ return getStaticField<JavaObject*>();
+}
+
+void JavaField::setStaticObjectField(JavaObject* val)
+{
+ llvm_gcroot(val, 0);
+ return setStaticField<JavaObject*>(val);
+}
+
+JavaObject* JavaField::getInstanceObjectField(JavaObject* obj)
+{
+ llvm_gcroot(obj, 0);
+ return this->getInstanceField<JavaObject*>(obj);
+}
+
+void JavaField::setInstanceObjectField(JavaObject* obj, JavaObject* val)
+{
+ llvm_gcroot(obj, 0);
+ llvm_gcroot(val, 0);
+ return this->setInstanceField<JavaObject*>(obj, val);
+}
+
+template<>
+void JavaField::setInstanceField(JavaObject* obj, JavaObject* val)
+{
+ llvm_gcroot(obj, 0);
+ llvm_gcroot(val, 0);
+ FieldSetter<JavaObject*>::setInstanceField(this, obj, val);
+}
+
+template <>
+void JavaField::setStaticField(JavaObject* val)
+{
+ llvm_gcroot(val, 0);
+ FieldSetter<JavaObject*>::setStaticField(this, val);
+}
Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.h?rev=180373&r1=180372&r2=180373&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.h Thu Apr 25 12:02:42 2013
@@ -1013,7 +1013,7 @@ private:
jvalue* marshalArguments(vmkit::ThreadAllocator& allocator, va_list ap);
template<class TYPE, class FUNC_TYPE_VIRTUAL_BUF>
- TYPE invokeSpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {
+ TYPE invokeSpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) __attribute__((noinline)) {
llvm_gcroot(obj, 0);
verifyNull(obj);
@@ -1033,7 +1033,10 @@ private:
}
template<class TYPE, class FUNC_TYPE_VIRTUAL_BUF>
- TYPE invokeVirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {
+ TYPE invokeVirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) __attribute__((noinline)) {
+ llvm_gcroot(obj, 0);
+ verifyNull(obj);
+
UserCommonClass* theClass = JavaObject::getClass(obj);
UserClass* objCl = theClass->isArray() ? theClass->super : theClass->asClass();
@@ -1049,7 +1052,7 @@ private:
}
template<class TYPE, class FUNC_TYPE_STATIC_BUF>
- TYPE invokeStaticBuf(Jnjvm* vm, UserClass* cl, void* buf) {
+ TYPE invokeStaticBuf(Jnjvm* vm, UserClass* cl, void* buf) __attribute__((noinline)) {
if (!cl->isReady()) {
cl->resolveClass();
cl->initialiseClass(vm);
@@ -1071,27 +1074,23 @@ private:
}
template<class TYPE, class FUNC_TYPE_VIRTUAL_BUF>
- TYPE invokeVirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) {
+ TYPE invokeVirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) __attribute__((noinline)) {
llvm_gcroot(obj, 0);
- verifyNull(obj);
-
vmkit::ThreadAllocator allocator;
jvalue* buffer = marshalArguments(allocator, ap);
return invokeVirtualBuf<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, buffer);
}
template<class TYPE, class FUNC_TYPE_VIRTUAL_BUF>
- TYPE invokeSpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) {
+ TYPE invokeSpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) __attribute__((noinline)) {
llvm_gcroot(obj, 0);
- verifyNull(obj);
-
vmkit::ThreadAllocator allocator;
jvalue* buffer = marshalArguments(allocator, ap);
return invokeSpecialBuf<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, buffer);
}
template<class TYPE, class FUNC_TYPE_STATIC_BUF>
- TYPE invokeStaticAP(Jnjvm* vm, UserClass* cl, va_list ap) {
+ TYPE invokeStaticAP(Jnjvm* vm, UserClass* cl, va_list ap) __attribute__((noinline)) {
vmkit::ThreadAllocator allocator;
jvalue* buffer = marshalArguments(allocator, ap);
return invokeStaticBuf<TYPE, FUNC_TYPE_STATIC_BUF>(vm, cl, buffer);
@@ -1224,7 +1223,7 @@ private:
/// getStatic*Field - Get a static field.
///
template <class TYPE>
- TYPE getStaticField() {
+ TYPE getStaticField() __attribute__ ((noinline)) {
assert(classDef->isResolved());
void* ptr = (void*)((uint64)classDef->getStaticInstance() + ptrOffset);
return *static_cast<TYPE *>(ptr);
@@ -1239,7 +1238,7 @@ private:
struct FieldSetter {
/// setStatic*Field - Set a field of an object.
///
- static void setStaticField(const JavaField* field, TYPE val) {
+ static void setStaticField(const JavaField* field, TYPE val) __attribute__ ((noinline)) {
assert(field->classDef->isResolved());
void* ptr = (void*)((uint64)field->classDef->getStaticInstance() + field->ptrOffset);
*static_cast<TYPE *>(ptr) = val;
@@ -1247,7 +1246,7 @@ private:
/// setInstance*Field - Set an instance field.
///
- static void setInstanceField(const JavaField* field, JavaObject* obj, TYPE val) {
+ static void setInstanceField(const JavaField* field, JavaObject* obj, TYPE val) __attribute__ ((noinline)) {
llvm_gcroot(obj, 0);
assert(field->classDef->isResolved());
void* ptr = (void*)((uint64)obj + field->ptrOffset);
@@ -1258,14 +1257,14 @@ private:
/// setStatic*Field - Set a field of an object.
///
template <class TYPE>
- void setStaticField(TYPE val) {
+ void setStaticField(TYPE val) __attribute__ ((noinline)) {
FieldSetter<TYPE>::setStaticField(this, val);
}
/// getInstance*Field - Get an instance field.
///
template<class TYPE>
- TYPE getInstanceField(JavaObject* obj) {
+ TYPE getInstanceField(JavaObject* obj) __attribute__ ((noinline)) {
llvm_gcroot(obj, 0);
assert(classDef->isResolved());
void* ptr = (void*)((uint64)obj + ptrOffset);
@@ -1275,15 +1274,16 @@ private:
/// setInstance*Field - Set an instance field.
///
template<class TYPE>
- void setInstanceField(JavaObject* obj, TYPE val) {
+ void setInstanceField(JavaObject* obj, TYPE val) __attribute__ ((noinline)) {
+ llvm_gcroot(obj, 0);
FieldSetter<TYPE>::setInstanceField(this, obj, val);
}
#define JavaField_DECL_ASSESSORS(TYPE, TYPE_NAME) \
- TYPE getStatic##TYPE_NAME##Field(); \
- void setStatic##TYPE_NAME##Field(TYPE val); \
- TYPE getInstance##TYPE_NAME##Field(JavaObject* obj); \
- void setInstance##TYPE_NAME##Field(JavaObject* obj, TYPE val);
+ TYPE getStatic##TYPE_NAME##Field() __attribute__ ((noinline)); \
+ void setStatic##TYPE_NAME##Field(TYPE val) __attribute__ ((noinline)); \
+ TYPE getInstance##TYPE_NAME##Field(JavaObject* obj) __attribute__ ((noinline)); \
+ void setInstance##TYPE_NAME##Field(JavaObject* obj, TYPE val) __attribute__ ((noinline));
#define JavaField_IMPL_ASSESSORS(TYPE, TYPE_NAME) \
TYPE JavaField::getStatic##TYPE_NAME##Field() { \
@@ -1291,8 +1291,10 @@ private:
void JavaField::setStatic##TYPE_NAME##Field(TYPE val) { \
return setStaticField<TYPE>(val);} \
TYPE JavaField::getInstance##TYPE_NAME##Field(JavaObject* obj) { \
+ llvm_gcroot(obj, 0); \
return this->getInstanceField<TYPE>(obj);} \
void JavaField::setInstance##TYPE_NAME##Field(JavaObject* obj, TYPE val) { \
+ llvm_gcroot(obj, 0); \
return this->setInstanceField<TYPE>(obj, val);}
public:
@@ -1343,11 +1345,12 @@ public:
};
+
// Specialization for TYPE=JavaObject*
template<>
struct JavaField::FieldSetter<JavaObject*> {
- static void setStaticField(const JavaField* field, JavaObject* val) {
+ static void setStaticField(const JavaField* field, JavaObject* val) __attribute__ ((noinline)) {
llvm_gcroot(val, 0);
if (val != NULL) assert(val->getVirtualTable());
assert(field->classDef->isResolved());
@@ -1355,7 +1358,7 @@ struct JavaField::FieldSetter<JavaObject
vmkit::Collector::objectReferenceNonHeapWriteBarrier((gc**)ptr, (gc*)val);
}
- static void setInstanceField(const JavaField* field, JavaObject* obj, JavaObject* val) {
+ static void setInstanceField(const JavaField* field, JavaObject* obj, JavaObject* val) __attribute__ ((noinline)) {
llvm_gcroot(obj, 0);
llvm_gcroot(val, 0);
if (val != NULL) assert(val->getVirtualTable());
@@ -1365,6 +1368,12 @@ struct JavaField::FieldSetter<JavaObject
}
};
+template <>
+void JavaField::setStaticField(JavaObject* val) __attribute__ ((noinline));
+
+template<>
+void JavaField::setInstanceField(JavaObject* obj, JavaObject* val) __attribute__ ((noinline));
+
} // end namespace j3
Modified: vmkit/trunk/lib/j3/VMCore/JavaMetaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaMetaJIT.cpp?rev=180373&r1=180372&r2=180373&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaMetaJIT.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaMetaJIT.cpp Thu Apr 25 12:02:42 2013
@@ -85,14 +85,30 @@ jvalue* JavaMethod::marshalArguments(vmk
}
#define JavaMethod_INVOKE_AP(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \
- TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) {return invokeVirtualAP<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, ap);} \
- TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) {return invokeSpecialAP<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, ap);} \
- TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, UserClass* cl, va_list ap) {return invokeStaticAP<TYPE, FUNC_TYPE_STATIC_BUF>(vm, cl, ap);}
+ TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) { \
+ llvm_gcroot(obj, 0); \
+ return invokeVirtualAP<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, ap); \
+ } \
+ TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) { \
+ llvm_gcroot(obj, 0); \
+ return invokeSpecialAP<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, ap); \
+ } \
+ TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, UserClass* cl, va_list ap) { \
+ return invokeStaticAP<TYPE, FUNC_TYPE_STATIC_BUF>(vm, cl, ap); \
+ }
#define JavaMethod_INVOKE_BUF(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \
- TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {return invokeVirtualBuf<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, buf);} \
- TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {return invokeSpecialBuf<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, buf);} \
- TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, UserClass* cl, void* buf) {return invokeStaticBuf<TYPE, FUNC_TYPE_STATIC_BUF>(vm, cl, buf);}
+ TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) { \
+ llvm_gcroot(obj, 0); \
+ return invokeVirtualBuf<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, buf); \
+ } \
+ TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) { \
+ llvm_gcroot(obj, 0); \
+ return invokeSpecialBuf<TYPE, FUNC_TYPE_VIRTUAL_BUF>(vm, cl, obj, buf); \
+ } \
+ TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, UserClass* cl, void* buf) { \
+ return invokeStaticBuf<TYPE, FUNC_TYPE_STATIC_BUF>(vm, cl, buf); \
+ }
#define JavaMethod_INVOKE(TYPE, TYPE_NAME) \
typedef TYPE (* func_virtual_ap_##TYPE_NAME)(UserConstantPool*, void*, JavaObject*, va_list); \
Modified: vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp?rev=180373&r1=180372&r2=180373&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmStaleRef.cpp Thu Apr 25 12:02:42 2013
@@ -92,8 +92,6 @@ void Jnjvm::resetReferenceIfStale(const
if (!ccl->classLoader->isZombie()) return;
- return;
-
#if DEBUG_VERBOSE_STALE_REF
cerr << "Resetting ref=" << ref << " obj=" << **ref;
@@ -102,19 +100,16 @@ void Jnjvm::resetReferenceIfStale(const
#endif
-// return;
-
- Jnjvm* vm = JavaThread::get()->getJVM();
- if (JavaThread* ownerThread = (JavaThread*)vmkit::ThinLock::getOwner(*ref, vm->lockSystem)) {
- if (vmkit::FatLock* lock = vmkit::ThinLock::getFatLock(*ref, vm->lockSystem))
+ if (JavaThread* ownerThread = (JavaThread*)vmkit::ThinLock::getOwner(*ref, this->lockSystem)) {
+ if (vmkit::FatLock* lock = vmkit::ThinLock::getFatLock(*ref, this->lockSystem))
lock->markAssociatedObjectAsDead();
// Notify all threads waiting on this object
- ownerThread->lockingThread.notifyAll(*ref, vm->lockSystem, ownerThread);
+ ownerThread->lockingThread.notifyAll(*ref, this->lockSystem, ownerThread);
// Release this object
- while (vmkit::ThinLock::getOwner(*ref, vm->lockSystem) == ownerThread)
- vmkit::ThinLock::release(*ref, vm->lockSystem, ownerThread);
+ while (vmkit::ThinLock::getOwner(*ref, this->lockSystem) == ownerThread)
+ vmkit::ThinLock::release(*ref, this->lockSystem, ownerThread);
}
*ref = NULL; // Reset the reference
More information about the vmkit-commits
mailing list