[vmkit-commits] [vmkit] r120823 - in /vmkit/trunk: lib/J3/Classpath/Classpath.inc lib/J3/Classpath/ClasspathReflect.h lib/J3/Classpath/ClasspathVMObject.inc lib/J3/Classpath/ClasspathVMSystem.inc lib/J3/VMCore/JavaArray.h lib/J3/VMCore/JavaClass.h lib/J3/VMCore/JavaString.h lib/Mvm/GCMmap2/MvmGC.h lib/Mvm/MMTk/MvmGC.cpp lib/Mvm/MMTk/MvmGC.h mmtk/mmtk-alloc/Selected.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Fri Dec 3 10:34:46 PST 2010
Author: geoffray
Date: Fri Dec 3 12:34:46 2010
New Revision: 120823
URL: http://llvm.org/viewvc/llvm-project?rev=120823&view=rev
Log:
Put write barriers in the GC and start calling them in J3 code.
Modified:
vmkit/trunk/lib/J3/Classpath/Classpath.inc
vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h
vmkit/trunk/lib/J3/Classpath/ClasspathVMObject.inc
vmkit/trunk/lib/J3/Classpath/ClasspathVMSystem.inc
vmkit/trunk/lib/J3/VMCore/JavaArray.h
vmkit/trunk/lib/J3/VMCore/JavaClass.h
vmkit/trunk/lib/J3/VMCore/JavaString.h
vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h
vmkit/trunk/lib/Mvm/MMTk/MvmGC.cpp
vmkit/trunk/lib/Mvm/MMTk/MvmGC.h
vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp
Modified: vmkit/trunk/lib/J3/Classpath/Classpath.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/Classpath.inc?rev=120823&r1=120822&r2=120823&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/Classpath.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/Classpath.inc Fri Dec 3 12:34:46 2010
@@ -334,11 +334,9 @@
llvm_gcroot(expect, 0);
llvm_gcroot(update, 0);
- jobject *ptr;
+ JavaObject** ptr = (JavaObject**) (((uint8 *) obj) + offset);
- ptr = (jobject *) (((uint8 *) obj) + offset);
-
- return __sync_bool_compare_and_swap(ptr, expect, update);
+ return mvm::Collector::objectReferenceTryCASBarrier((gc*)obj, (gc**)ptr, (gc*)expect, (gc*)update);
}
// Never throws.
@@ -351,11 +349,8 @@
llvm_gcroot(obj, 0);
llvm_gcroot(value, 0);
- JavaObject** ptr;
-
- ptr = (JavaObject**) (((uint8 *) obj) + offset);
-
- *ptr = value;
-
+ JavaObject** ptr = (JavaObject**) (((uint8 *) obj) + offset);
+ mvm::Collector::objectReferenceWriteBarrier((gc*)obj, (gc**)ptr, (gc*)value);
}
+
}
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h?rev=120823&r1=120822&r2=120823&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h Fri Dec 3 12:34:46 2010
@@ -14,7 +14,7 @@
#include "JavaClass.h"
#include "JavaObject.h"
-#include <JavaThread.h>
+#include "JavaThread.h"
extern "C" j3::JavaObject* internalFillInStackTrace(j3::JavaObject*);
@@ -42,7 +42,8 @@
static void setProtectionDomain(JavaObjectClass* cl, JavaObject* pd) {
llvm_gcroot(cl, 0);
llvm_gcroot(pd, 0);
- cl->pd = pd;
+ mvm::Collector::objectReferenceWriteBarrier(
+ (gc*)cl, (gc**)&(cl->pd), (gc*)pd);
}
static JavaObject* getProtectionDomain(JavaObjectClass* cl) {
@@ -179,13 +180,22 @@
static void setDetailedMessage(JavaObjectThrowable* self, JavaObject* obj) {
llvm_gcroot(self, 0);
llvm_gcroot(obj, 0);
- self->detailedMessage = obj;
+ mvm::Collector::objectReferenceWriteBarrier(
+ (gc*)self, (gc**)&(self->detailedMessage), (gc*)obj);
}
static void fillInStackTrace(JavaObjectThrowable* self) {
+ JavaObject* stackTrace = NULL;
llvm_gcroot(self, 0);
- self->cause = self;
- self->vmState = internalFillInStackTrace(self);
+ llvm_gcroot(stackTrace, 0);
+
+ stackTrace = internalFillInStackTrace(self);
+ mvm::Collector::objectReferenceWriteBarrier(
+ (gc*)self, (gc**)&(self->vmState), (gc*)stackTrace);
+
+ mvm::Collector::objectReferenceWriteBarrier(
+ (gc*)self, (gc**)&(self->cause), (gc*)self);
+
self->stackTrace = NULL;
}
};
@@ -201,8 +211,10 @@
llvm_gcroot(self, 0);
llvm_gcroot(r, 0);
llvm_gcroot(q, 0);
- self->referent = r;
- self->queue = q;
+ mvm::Collector::objectReferenceWriteBarrier(
+ (gc*)self, (gc**)&(self->referent), (gc*)r);
+ mvm::Collector::objectReferenceWriteBarrier(
+ (gc*)self, (gc**)&(self->queue), (gc*)q);
}
static JavaObject** getReferentPtr(JavaObjectReference* self) {
@@ -213,6 +225,7 @@
static void setReferent(JavaObjectReference* self, JavaObject* r) {
llvm_gcroot(self, 0);
llvm_gcroot(r, 0);
+ // No write barrier: this is only called by the GC.
self->referent = r;
}
};
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMObject.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMObject.inc?rev=120823&r1=120822&r2=120823&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMObject.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMObject.inc Fri Dec 3 12:34:46 2010
@@ -27,30 +27,60 @@
#endif
JavaObject* src) {
- JavaObject* res = 0;
+ JavaObject* res = NULL;
+ JavaObject* tmp = NULL;
llvm_gcroot(res, 0);
llvm_gcroot(src, 0);
BEGIN_NATIVE_EXCEPTION(0)
UserCommonClass* cl = JavaObject::getClass(src);
- size_t size = 0;
+ Jnjvm* vm = JavaThread::get()->getJVM();
if (cl->isArray()) {
UserClassArray* array = cl->asArrayClass();
+ int length = JavaArray::getSize(src);
+ res = array->doNew(length, vm);
UserCommonClass* base = array->baseClass();
- uint32 logSize = base->isPrimitive() ?
- base->asPrimitiveClass()->logSize : (sizeof(JavaObject*) == 8 ? 3 : 2);
-
- size = sizeof(JavaObject) + sizeof(ssize_t) +
- (JavaArray::getSize(src) << logSize);
+ if (base->isPrimitive()) {
+ int size = length << base->asPrimitiveClass()->logSize;
+ memcpy((void*)((uintptr_t)res + sizeof(JavaObject) + sizeof(size_t)),
+ (void*)((uintptr_t)src + sizeof(JavaObject) + sizeof(size_t)),
+ size);
+ } else {
+ for (int i = 0; i < length; i++) {
+ tmp = ArrayObject::getElement((ArrayObject*)src, i);
+ ArrayObject::setElement((ArrayObject*)res, tmp, i);
+ }
+ }
} else {
assert(cl->isClass() && "Not a class!");
- size = cl->asClass()->getVirtualSize();
+ res = cl->asClass()->doNew(vm);
+ while (cl != NULL) {
+ for (uint32 i = 0; i < cl->asClass()->nbVirtualFields; ++i) {
+ JavaField& field = cl->asClass()->virtualFields[i];
+ if (field.isReference()) {
+ tmp = field.getInstanceObjectField(src);
+ JavaObject** ptr = field.getInstanceObjectFieldPtr(res);
+ mvm::Collector::objectReferenceWriteBarrier((gc*)res, (gc**)ptr, (gc*)tmp);
+ } else if (field.isLong()) {
+ field.setInstanceLongField(res, field.getInstanceLongField(src));
+ } else if (field.isDouble()) {
+ field.setInstanceDoubleField(res, field.getInstanceDoubleField(src));
+ } else if (field.isInt()) {
+ field.setInstanceInt32Field(res, field.getInstanceInt32Field(src));
+ } else if (field.isFloat()) {
+ field.setInstanceFloatField(res, field.getInstanceFloatField(src));
+ } else if (field.isShort() || field.isChar()) {
+ field.setInstanceInt16Field(res, field.getInstanceInt16Field(src));
+ } else if (field.isByte() || field.isBoolean()) {
+ field.setInstanceInt8Field(res, field.getInstanceInt8Field(src));
+ } else {
+ UNREACHABLE();
+ }
+ }
+ cl = cl->super;
+ }
}
- res = (JavaObject*)gc::operator new(size, src->getVirtualTable());
- memcpy((void*)((uintptr_t)res + 2 * sizeof(void*)),
- (void*)((uintptr_t)src + 2 * sizeof(void*)),
- size - 2 * sizeof(void*));
END_NATIVE_EXCEPTION
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMSystem.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMSystem.inc?rev=120823&r1=120822&r2=120823&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMSystem.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMSystem.inc Fri Dec 3 12:34:46 2010
@@ -82,33 +82,26 @@
}
if (th->pendingException != NULL) return;
- jint i = sstart;
- jint length = len;
- bool doThrow = false;
if (!(dstType->isPrimitive())) {
- while (i < sstart + len && !doThrow) {
- cur = ArrayObject::getElement((ArrayObject*)src, i);
+ for (int i = 0; i < len; i++) {
+ cur = ArrayObject::getElement((ArrayObject*)src, i + sstart);
if (cur) {
if (!(JavaObject::getClass(cur)->isAssignableFrom(dstType))) {
- doThrow = true;
- length = i;
+ th->pendingException = vm->CreateArrayStoreException(
+ (JavaVirtualTable*)dst->getVirtualTable());
+ break;
+ } else {
+ ArrayObject::setElement((ArrayObject*)dst, cur, i + dstart);
}
}
- ++i;
}
+ } else {
+ uint32 logSize = dstType->asPrimitiveClass()->logSize;
+ void* ptrDst = (void*)((int64_t)JavaArray::getElements(dst) + (dstart << logSize));
+ void* ptrSrc = (void*)((int64_t)JavaArray::getElements(src) + (sstart << logSize));
+ memmove(ptrDst, ptrSrc, len << logSize);
}
-
- uint32 logSize = dstType->isPrimitive() ?
- dstType->asPrimitiveClass()->logSize : (sizeof(JavaObject*) == 8 ? 3 : 2);
-
- void* ptrDst = (void*)((int64_t)JavaArray::getElements(dst) + (dstart << logSize));
- void* ptrSrc = (void*)((int64_t)JavaArray::getElements(src) + (sstart << logSize));
- memmove(ptrDst, ptrSrc, length << logSize);
- if (doThrow) {
- th->pendingException = vm->CreateArrayStoreException(
- (JavaVirtualTable*)dst->getVirtualTable());
- }
}
JNIEXPORT jint JNICALL Java_java_lang_VMSystem_identityHashCode(
Modified: vmkit/trunk/lib/J3/VMCore/JavaArray.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaArray.h?rev=120823&r1=120822&r2=120823&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaArray.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaArray.h Fri Dec 3 12:34:46 2010
@@ -99,7 +99,8 @@
llvm_gcroot(self, 0);
llvm_gcroot(value, 0);
if (value != NULL) assert(value->getVirtualTable());
- self->elements[i] = value;
+ mvm::Collector::objectReferenceWriteBarrier(
+ (gc*)self, (gc**)&(self->elements[i]), (gc*)value);
}
static JavaObject** getElements(ArrayObject* self) {
Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.h?rev=120823&r1=120822&r2=120823&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.h Fri Dec 3 12:34:46 2010
@@ -1264,7 +1264,7 @@
assert(classDef->isResolved()); \
void* ptr = (void*)((uint64)obj + ptrOffset); \
return ((TYPE*)ptr)[0]; \
- }
+ } \
/// setInstance*Field - Set an instance field.
///
@@ -1299,8 +1299,8 @@
llvm_gcroot(val, 0);
if (val != NULL) assert(val->getVirtualTable());
assert(classDef->isResolved());
- void* ptr = (void*)((uint64)classDef->getStaticInstance() + ptrOffset);
- ((JavaObject**)ptr)[0] = val;
+ JavaObject** ptr = (JavaObject**)((uint64)classDef->getStaticInstance() + ptrOffset);
+ mvm::Collector::objectReferenceNonHeapWriteBarrier((gc**)ptr, (gc*)val);
}
JavaObject* getInstanceObjectField(JavaObject* obj) {
@@ -1315,14 +1315,46 @@
llvm_gcroot(val, 0);
if (val != NULL) assert(val->getVirtualTable());
assert(classDef->isResolved());
- void* ptr = (void*)((uint64)obj + ptrOffset);
- ((JavaObject**)ptr)[0] = val;
+ JavaObject** ptr = (JavaObject**)((uint64)obj + ptrOffset);
+ mvm::Collector::objectReferenceWriteBarrier((gc*)obj, (gc**)ptr, (gc*)val);
}
bool isReference() {
uint16 val = type->elements[0];
return (val == '[' || val == 'L');
}
+
+ bool isDouble() {
+ return (type->elements[0] == 'D');
+ }
+
+ bool isLong() {
+ return (type->elements[0] == 'J');
+ }
+
+ bool isInt() {
+ return (type->elements[0] == 'I');
+ }
+
+ bool isFloat() {
+ return (type->elements[0] == 'F');
+ }
+
+ bool isShort() {
+ return (type->elements[0] == 'S');
+ }
+
+ bool isChar() {
+ return (type->elements[0] == 'C');
+ }
+
+ bool isByte() {
+ return (type->elements[0] == 'B');
+ }
+
+ bool isBoolean() {
+ return (type->elements[0] == 'Z');
+ }
};
Modified: vmkit/trunk/lib/J3/VMCore/JavaString.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaString.h?rev=120823&r1=120822&r2=120823&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaString.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaString.h Fri Dec 3 12:34:46 2010
@@ -21,9 +21,10 @@
class Jnjvm;
class JavaString : public JavaObject {
-public:
+ private:
// CLASSPATH FIELDS!!
const ArrayUInt16* value;
+ public:
sint32 count;
sint32 cachedHashCode;
sint32 offset;
@@ -31,7 +32,8 @@
static void setValue(JavaString* self, const ArrayUInt16* array) {
llvm_gcroot(self, 0);
llvm_gcroot(array, 0);
- self->value = array;
+ mvm::Collector::objectReferenceWriteBarrier(
+ (gc*)self, (gc**)&(self->value), (gc*)array);
}
static const ArrayUInt16* getValue(const JavaString* self) {
llvm_gcroot(self, 0);
Modified: vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h?rev=120823&r1=120822&r2=120823&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h (original)
+++ vmkit/trunk/lib/Mvm/GCMmap2/MvmGC.h Fri Dec 3 12:34:46 2010
@@ -359,6 +359,18 @@
return val;
}
+ static void objectReferenceWriteBarrier(gc* ref, gc** slot, gc* value) {
+ *slot = value;
+ }
+
+ static void objectReferenceNonHeapWriteBarrier(gc** slot, gc* value) {
+ *slot = value;
+ }
+
+ static bool objectReferenceTryCASBarrier(gc*ref, gc** slot, gc* old, gc* value) {
+ gc* res = __sync_val_compare_and_swap(slot, old, value);
+ return (res == old);
+ }
};
}
Modified: vmkit/trunk/lib/Mvm/MMTk/MvmGC.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/MMTk/MvmGC.cpp?rev=120823&r1=120822&r2=120823&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/MMTk/MvmGC.cpp (original)
+++ vmkit/trunk/lib/Mvm/MMTk/MvmGC.cpp Fri Dec 3 12:34:46 2010
@@ -109,6 +109,19 @@
return NULL;
}
+void Collector::objectReferenceWriteBarrier(gc* ref, gc** slot, gc* value) {
+ *slot = value;
+}
+
+void Collector::objectReferenceNonHeapWriteBarrier(gc** slot, gc* value) {
+ *slot = value;
+}
+
+bool Collector::objectReferenceTryCASBarrier(gc*ref, gc** slot, gc* old, gc* value) {
+ gc* res = __sync_val_compare_and_swap(slot, old, value);
+ return (old == res);
+}
+
void Collector::collect() {
// Do nothing.
}
Modified: vmkit/trunk/lib/Mvm/MMTk/MvmGC.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/MMTk/MvmGC.h?rev=120823&r1=120822&r2=120823&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/MMTk/MvmGC.h (original)
+++ vmkit/trunk/lib/Mvm/MMTk/MvmGC.h Fri Dec 3 12:34:46 2010
@@ -71,11 +71,14 @@
static void scanObject(void** ptr, uintptr_t closure) __attribute__ ((always_inline));
static void markAndTrace(void* source, void* ptr, uintptr_t closure) __attribute__ ((always_inline));
static void markAndTraceRoot(void* ptr, uintptr_t closure) __attribute__ ((always_inline));
- static gc* retainForFinalize(gc* val, uintptr_t closure) __attribute__ ((always_inline));
- static gc* retainReferent(gc* val, uintptr_t closure) __attribute__ ((always_inline));
- static gc* getForwardedFinalizable(gc* val, uintptr_t closure) __attribute__ ((always_inline));
- static gc* getForwardedReference(gc* val, uintptr_t closure) __attribute__ ((always_inline));
- static gc* getForwardedReferent(gc* val, uintptr_t closure) __attribute__ ((always_inline));
+ static gc* retainForFinalize(gc* val, uintptr_t closure) __attribute__ ((always_inline));
+ static gc* retainReferent(gc* val, uintptr_t closure) __attribute__ ((always_inline));
+ static gc* getForwardedFinalizable(gc* val, uintptr_t closure) __attribute__ ((always_inline));
+ static gc* getForwardedReference(gc* val, uintptr_t closure) __attribute__ ((always_inline));
+ static gc* getForwardedReferent(gc* val, uintptr_t closure) __attribute__ ((always_inline));
+ static void objectReferenceWriteBarrier(gc* ref, gc** slot, gc* value) __attribute__ ((always_inline));
+ static void objectReferenceNonHeapWriteBarrier(gc** slot, gc* value) __attribute__ ((always_inline));
+ static bool objectReferenceTryCASBarrier(gc* ref, gc** slot, gc* old, gc* value) __attribute__ ((always_inline));
static void collect();
Modified: vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp?rev=120823&r1=120822&r2=120823&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp Fri Dec 3 12:34:46 2010
@@ -155,6 +155,19 @@
return val;
}
+void Collector::objectReferenceWriteBarrier(gc* ref, gc** slot, gc* value) {
+ *slot = value;
+}
+
+void Collector::objectReferenceNonHeapWriteBarrier(gc** slot, gc* value) {
+ *slot = value;
+}
+
+bool Collector::objectReferenceTryCASBarrier(gc*ref, gc** slot, gc* old, gc* value) {
+ gc* res = __sync_val_compare_and_swap(slot, old, value);
+ return (old == res);
+}
+
//TODO: Remove these.
std::set<gc*> __InternalSet__;
void* Collector::begOf(gc* obj) {
More information about the vmkit-commits
mailing list