[vmkit-commits] [vmkit] r108960 - in /vmkit/trunk: include/j3/JavaAOTCompiler.h include/mvm/VirtualMachine.h lib/J3/Classpath/ClasspathReflect.h lib/J3/Classpath/JavaUpcalls.cpp lib/J3/Compiler/JavaAOTCompiler.cpp lib/J3/VMCore/JavaClass.cpp lib/J3/VMCore/VirtualTables.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue Jul 20 16:00:50 PDT 2010


Author: geoffray
Date: Tue Jul 20 18:00:50 2010
New Revision: 108960

URL: http://llvm.org/viewvc/llvm-project?rev=108960&view=rev
Log:
Fix long-standing bugs on java.lang.ref.References.


Modified:
    vmkit/trunk/include/j3/JavaAOTCompiler.h
    vmkit/trunk/include/mvm/VirtualMachine.h
    vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h
    vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp
    vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp
    vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
    vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp

Modified: vmkit/trunk/include/j3/JavaAOTCompiler.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/j3/JavaAOTCompiler.h?rev=108960&r1=108959&r2=108960&view=diff
==============================================================================
--- vmkit/trunk/include/j3/JavaAOTCompiler.h (original)
+++ vmkit/trunk/include/j3/JavaAOTCompiler.h Tue Jul 20 18:00:50 2010
@@ -172,6 +172,7 @@
   llvm::Function* ArrayObjectTracer;
   llvm::Function* RegularObjectTracer;
   llvm::Function* JavaObjectTracer;
+  llvm::Function* ReferenceObjectTracer;
   
   bool generateStubs;
   bool assumeCompiled;

Modified: vmkit/trunk/include/mvm/VirtualMachine.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/VirtualMachine.h?rev=108960&r1=108959&r2=108960&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/VirtualMachine.h (original)
+++ vmkit/trunk/include/mvm/VirtualMachine.h Tue Jul 20 18:00:50 2010
@@ -377,7 +377,9 @@
         fprintf(stderr, "I don't know how to handle reference overflow yet!\n");
         abort();
       }
-      for (uint32 i = 0; i < QueueLength; ++i) newQueue[i] = ToEnqueue[i];
+      for (uint32 i = 0; i < ToEnqueueLength; ++i) {
+        newQueue[i] = ToEnqueue[i];
+      }
       delete[] ToEnqueue;
       ToEnqueue = newQueue;
       ToEnqueueLength = newLength;

Modified: vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h?rev=108960&r1=108959&r2=108960&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathReflect.h Tue Jul 20 18:00:50 2010
@@ -1,6 +1,4 @@
-//===------ ClasspathReflect.h - GNU classpath definitions of ----------------//
-// java/lang/Class, java/lang/reflect/Field, java/lang/reflect/Method and ----//
-// java/lang/reflect/Constructor as compiled by JnJVM. -----------------------//
+//===-- ClasspathReflect.h - Internal representation of core system classes --//
 //
 //                            The VMKit project
 //
@@ -210,16 +208,12 @@
     llvm_gcroot(self, 0);
     return &(self->referent);
   }
+
   static void setReferent(JavaObjectReference* self, JavaObject* r) {
     llvm_gcroot(self, 0);
     llvm_gcroot(r, 0);
     self->referent = r;
   }
-  
-  static void staticTracer(JavaObjectReference* obj, uintptr_t closure) {
-    mvm::Collector::markAndTrace(obj, &obj->queue, closure);
-    mvm::Collector::markAndTrace(obj, &obj->nextOnQueue, closure);
-  }
 };
 
 }

Modified: vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp?rev=108960&r1=108959&r2=108960&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp Tue Jul 20 18:00:50 2010
@@ -490,7 +490,6 @@
 
 extern "C" void nativePropertiesPostInit(JavaObject* prop);
 
-
 extern "C" void nativeJavaObjectClassTracer(
     JavaObjectClass* obj, uintptr_t closure) {
   JavaObjectClass::staticTracer(obj, closure);
@@ -511,11 +510,6 @@
   JavaObjectConstructor::staticTracer(obj, closure);
 }
 
-extern "C" void nativeJavaObjectReferenceTracer(
-    JavaObjectReference* obj, uintptr_t closure) {
-  JavaObjectReference::staticTracer(obj, closure);
-}
-
 extern "C" void nativeJavaObjectVMThreadTracer(
     JavaObjectVMThread* obj, uintptr_t closure) {
   JavaObjectVMThread::staticTracer(obj, closure);
@@ -1042,10 +1036,6 @@
    
   newReference = UPCALL_CLASS(loader, "java/lang/ref/Reference");
     
-  newReference->getVirtualVT()->setNativeTracer(
-      (uintptr_t)nativeJavaObjectReferenceTracer,
-      "nativeJavaObjectReferenceTracer");
-  
   EnqueueReference = 
     UPCALL_METHOD(loader, "java/lang/ref/Reference",  "enqueue", "()Z",
                   ACC_VIRTUAL);

Modified: vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp?rev=108960&r1=108959&r2=108960&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp Tue Jul 20 18:00:50 2010
@@ -1403,7 +1403,12 @@
       Tracer = ArrayObjectTracer;
     }
   } else if (classDef->isClass()) {
-    Tracer = RegularObjectTracer;
+    if (classDef->isAssignableFrom(
+          classDef->classLoader->bootstrapLoader->upcalls->newReference)) {
+      Tracer = ReferenceObjectTracer;
+    } else {
+      Tracer = RegularObjectTracer;
+    }
   }
 
   Elemts.push_back(Tracer ? 
@@ -1641,6 +1646,11 @@
   
   JavaObjectTracer = Function::Create(FTy, GlobalValue::ExternalLinkage,
                                       "JavaObjectTracer", getLLVMModule());
+  
+  ReferenceObjectTracer = Function::Create(FTy,
+                                           GlobalValue::ExternalLinkage,
+                                           "ReferenceObjectTracer",
+                                           getLLVMModule());
 }
 
 void JavaAOTCompiler::printStats() {

Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.cpp?rev=108960&r1=108959&r2=108960&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.cpp Tue Jul 20 18:00:50 2010
@@ -43,6 +43,7 @@
 extern "C" void JavaObjectTracer(JavaObject*);
 extern "C" void ArrayObjectTracer(JavaObject*);
 extern "C" void RegularObjectTracer(JavaObject*);
+extern "C" void ReferenceObjectTracer(JavaObject*);
 
 Attribut::Attribut(const UTF8* name, uint32 length,
                    uint32 offset) {
@@ -50,7 +51,6 @@
   this->start    = offset;
   this->nbb      = length;
   this->name     = name;
-
 }
 
 Attribut* Class::lookupAttribut(const UTF8* key ) {
@@ -1472,23 +1472,28 @@
 JavaVirtualTable::JavaVirtualTable(Class* C) {
    
   if (C->super) {
-    
-    assert(C->super->virtualVT && "Super has no VT");
 
-    // Set the regular object tracer, destructor and delete.
-    tracer = (uintptr_t)RegularObjectTracer;
+    Class* referenceClass = 
+        C->classLoader->bootstrapLoader->upcalls->newReference;
+    if (referenceClass != NULL && C->super->isAssignableFrom(referenceClass)) {
+      tracer = (uintptr_t)ReferenceObjectTracer;
+    } else {
+      tracer = (uintptr_t)RegularObjectTracer;
+    }
     destructor = 0;
     operatorDelete = 0;
     
     // Set IMT.
-    if (!isAbstract(C->access))
+    if (!isAbstract(C->access)) {
       IMT = new (C->classLoader->allocator, "IMT") InterfaceMethodTable();
+    }
     
     // Set the class of this VT.
     cl = C;
     
     // Set depth and display for fast dynamic type checking.
-    JavaVirtualTable* superVT = C->super->virtualVT;
+    JavaVirtualTable* superVT = C->super->virtualVT; 
+    assert(superVT && "Super has no VT");
     depth = superVT->depth + 1;
     nbSecondaryTypes = superVT->nbSecondaryTypes + cl->nbInterfaces;
 

Modified: vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp?rev=108960&r1=108959&r2=108960&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/VirtualTables.cpp Tue Jul 20 18:00:50 2010
@@ -20,6 +20,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "ClasspathReflect.h"
 #include "JavaArray.h"
 #include "JavaClass.h"
 #include "JavaObject.h"
@@ -56,12 +57,14 @@
                                (uintptr_t)VMClassLoader::staticTracer);
 
 //===----------------------------------------------------------------------===//
-// Trace methods for Java objects. There are three types of objects:
+// Trace methods for Java objects. There are four types of objects:
 // (1) java.lang.Object and primitive arrays: no need to trace anything.
 // (2) Object whose class is not an array: needs to trace the classloader, and
 //     all the virtual fields.
 // (3) Object whose class is an array of objects: needs to trace the class
 //     loader and all elements in the array.
+// (4) Objects that extend java.lang.ref.Reference: must trace the class loader
+//     and all the fields except the referent.
 //===----------------------------------------------------------------------===//
 
 /// Scanning java.lang.Object and primitive arrays.
@@ -104,6 +107,32 @@
   } 
 }
 
+/// Method for scanning Java java.lang.ref.Reference objects.
+extern "C" void ReferenceObjectTracer(
+    JavaObjectReference* obj, uintptr_t closure) {
+  Class* cl = JavaObject::getClass(obj)->asClass();
+  assert(cl && "Not a class in reference tracer");
+  mvm::Collector::markAndTraceRoot(
+      cl->classLoader->getJavaClassLoaderPtr(), closure);
+
+  bool found = false;
+  while (cl->super != 0) {
+    for (uint32 i = 0; i < cl->nbVirtualFields; ++i) {
+      JavaField& field = cl->virtualFields[i];
+      if (field.isReference()) {
+        JavaObject** ptr = field.getInstanceObjectFieldPtr(obj);
+        if (ptr != JavaObjectReference::getReferentPtr(obj)) {
+          mvm::Collector::markAndTrace(obj, ptr, closure);
+        } else {
+          found = true;
+        }
+      }
+    }
+    cl = cl->super;
+  }
+  assert(found && "No referent in a reference");
+}
+
 //===----------------------------------------------------------------------===//
 // Support for scanning Java objects referenced by classes. All classes must
 // trace:
@@ -190,7 +219,7 @@
   }
   
   StringList* end = strings;
-  while (end) {
+  while (end != NULL) {
     for (uint32 i = 0; i < end->length; ++i) {
       JavaString** obj = end->strings + i;
       mvm::Collector::markAndTraceRoot(obj, closure);





More information about the vmkit-commits mailing list