[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