[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