[vmkit-commits] [vmkit] r72523 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathReflect.h Compiler/JavaJITCompiler.cpp Compiler/JnjvmModule.cpp VMCore/JavaArray.h VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JavaObject.h VMCore/JavaUpcalls.cpp VMCore/VirtualTables.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Thu May 28 08:39:21 PDT 2009


Author: geoffray
Date: Thu May 28 10:39:13 2009
New Revision: 72523

URL: http://llvm.org/viewvc/llvm-project?rev=72523&view=rev
Log:
Revert to r72413. The universal trace method requires too much stack space.


Modified:
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h
    vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp
    vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
    vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp

Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h?rev=72523&r1=72522&r2=72523&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h Thu May 28 10:39:13 2009
@@ -167,7 +167,11 @@
 
   JavaObject* getReferent() const { return referent; }
   void setReferent(JavaObject* r) { referent = r; }
-
+  
+  static void STATIC_TRACER(JavaObjectReference) {
+    obj->queue->MARK_AND_TRACE;
+    obj->nextOnQueue->MARK_AND_TRACE;
+  }
 };
 
 }

Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp?rev=72523&r1=72522&r2=72523&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp Thu May 28 10:39:13 2009
@@ -177,7 +177,7 @@
     }
   }
 
-#if 0//def WITH_TRACER
+#ifdef WITH_TRACER
   if (!LCI->virtualTracerFunction) {
     LCI->virtualTracerFunction = makeTracer(cl, false);
   }

Modified: vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp?rev=72523&r1=72522&r2=72523&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Thu May 28 10:39:13 2009
@@ -148,7 +148,7 @@
   
   for (uint32 i = 0; i < nbFields; ++i) {
     JavaField& cur = fields[i];
-    if (cur.isReference()) {
+    if (cur.getSignature()->trace()) {
       LLVMFieldInfo* LFI = getFieldInfo(&cur);
       std::vector<Value*> args; //size = 2
       args.push_back(zero);

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h?rev=72523&r1=72522&r2=72523&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaArray.h Thu May 28 10:39:13 2009
@@ -65,6 +65,11 @@
   static const unsigned int T_INT;
   static const unsigned int T_LONG;
   
+  /// tracer - The trace method of Java arrays of primitive types. Since their
+  /// class lives throughout the lifetime of the application, there is no need
+  /// to trace them. Therefore this trace function does nothing.
+  virtual void TRACER;
+  
 };
 
 /// Instantiation of the TJavaArray class for Java arrays of primitive types.
@@ -81,10 +86,20 @@
 ARRAYCLASS(ArrayLong,   sint64);
 ARRAYCLASS(ArrayFloat,  float);
 ARRAYCLASS(ArrayDouble, double);
-ARRAYCLASS(ArrayObject, JavaObject*);
 
 #undef ARRAYCLASS
 
+/// ArrayObject - Instantiation of the TJavaArray class for arrays of objects.
+/// Arrays of objects are different than arrays of primitive types because
+/// they have to trace all objects in the array.
+class ArrayObject : public TJavaArray<JavaObject*> {
+public:
+  /// tracer - The tracer method of Java arrays of objects. This method will
+  /// trace all objects in the array.
+  virtual void TRACER;
+};
+
+
 /// UTF8 - The UTF8 class is basically the ArrayUInt16 class (arrays of elements
 /// of type uint16) with helper functions for manipulating UTF8. Each JVM
 /// instance hashes UTF8. UTF8 are not allocated by the application's garbage

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=72523&r1=72522&r2=72523&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Thu May 28 10:39:13 2009
@@ -40,11 +40,9 @@
 Class* ClassArray::SuperArray;
 Class** ClassArray::InterfacesArray;
 
-extern "C" void ArrayObjectTracer(JavaObject*);
 extern "C" void JavaArrayTracer(JavaObject*);
 extern "C" void JavaObjectTracer(JavaObject*);
-extern "C" void ReferenceObjectTracer(JavaObject*);
-extern "C" void RegularObjectTracer(JavaObject*);
+extern "C" void ArrayObjectTracer(JavaObject*);
 
 Attribut::Attribut(const UTF8* name, uint32 length,
                    uint32 offset) {
@@ -1311,15 +1309,6 @@
              sizeof(JavaVirtualTable*) * cur->nbSecondaryTypes);
       lastIndex += cur->nbSecondaryTypes;
     }
-    
-    JnjvmClassLoader* JCL = cl->classLoader;
-    Classpath* upcalls = JCL->bootstrapLoader->upcalls;
-    Class* ref = upcalls->newReference;
-    if (ref && display[1] == ref->virtualVT) {
-      tracer = (uintptr_t)ReferenceObjectTracer;
-    } else {
-      tracer = (uintptr_t)RegularObjectTracer;
-    }
 
   } else {
     // Set the tracer, destructor and delete

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=72523&r1=72522&r2=72523&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Thu May 28 10:39:13 2009
@@ -1440,10 +1440,6 @@
     return static_cast<Ty*>(JInfo);
   }
 
-  bool isReference() {
-    uint16 val = type->elements[0];
-    return (val == 'L' || val == '[');
-  }
 
 };
 

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h?rev=72523&r1=72522&r2=72523&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaObject.h Thu May 28 10:39:13 2009
@@ -194,6 +194,9 @@
     if (obj == 0) JavaThread::get()->getJVM()->nullPointerException();
 #endif
   
+  virtual void TRACER;
+
+
   /// lockObj - Get the LockObj if the lock is a fat lock.
   LockObj* lockObj() {
     return lock.getFatLock();

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=72523&r1=72522&r2=72523&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Thu May 28 10:39:13 2009
@@ -404,6 +404,10 @@
   JavaObjectConstructor::staticTracer(obj);
 }
 
+extern "C" void nativeJavaObjectReferenceTracer(JavaObjectReference* obj) {
+  JavaObjectReference::staticTracer(obj);
+}
+
 extern "C" void nativeJavaObjectVMThreadDestructor(JavaObjectVMThread* obj) {
   JavaObjectVMThread::staticDestructor(obj);
 }
@@ -411,8 +415,6 @@
 // Defined in Classpath/ClasspathVMClassLoader.cpp
 extern "C" ArrayObject* nativeGetBootPackages();
 
-extern "C" void ReferenceObjectTracer(JavaObject*);
-
 void Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
 
   newClassLoader = 
@@ -883,11 +885,11 @@
 
    
   newReference = UPCALL_CLASS(loader, "java/lang/ref/Reference");
-  
+    
   newReference->getVirtualVT()->setNativeTracer(
-      (uintptr_t)ReferenceObjectTracer,
-      "ReferenceObjectTracer");
-
+      (uintptr_t)nativeJavaObjectReferenceTracer,
+      "nativeJavaObjectReferenceTracer");
+  
   EnqueueReference = 
     UPCALL_METHOD(loader, "java/lang/ref/Reference",  "enqueue", "()Z",
                   ACC_VIRTUAL);

Modified: vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp?rev=72523&r1=72522&r2=72523&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Thu May 28 10:39:13 2009
@@ -69,7 +69,6 @@
 // Empty tracer for static tracers of classes that do not declare static
 // variables.
 //===----------------------------------------------------------------------===//
-
 extern "C" void EmptyTracer(void*) {}
 
 //===----------------------------------------------------------------------===//
@@ -82,87 +81,44 @@
 //     classloader is the bootstrap loader and is traced by the JVM.
 //===----------------------------------------------------------------------===//
 
-/// Method for scanning the root of an object.
-extern "C" void JavaObjectTracer(JavaObject* obj) {
-  if (obj->getClass())
-    obj->getClass()->classLoader->getJavaClassLoader()->markAndTrace();
-  LockObj* l = obj->lockObj();
+
+/// Method for scanning the root of an object. This method is called by all
+/// JavObjects except native Java arrays.
+void JavaObject::tracer() {
+  if (getClass()) getClass()->classLoader->getJavaClassLoader()->markAndTrace();
+  LockObj* l = lockObj();
   if (l) l->markAndTrace();
 }
 
+extern "C" void JavaObjectTracer(JavaObject* obj) {
+  obj->JavaObject::tracer();
+}
+
 /// Method for scanning an array whose elements are JavaObjects. This method is
 /// called by all non-native Java arrays.
-extern "C" void ArrayObjectTracer(ArrayObject* obj) {
-  if (obj->getClass())
-    obj->getClass()->classLoader->getJavaClassLoader()->markAndTrace();
-  LockObj* l = obj->lockObj();
-  if (l) l->markAndTrace();
-  for (sint32 i = 0; i < obj->size; i++) {
-    if (obj->elements[i]) obj->elements[i]->MARK_AND_TRACE;
+void ArrayObject::tracer() {
+  JavaObject::tracer();
+  for (sint32 i = 0; i < size; i++) {
+    if (elements[i]) elements[i]->MARK_AND_TRACE;
   } 
 }
 
+extern "C" void ArrayObjectTracer(ArrayObject* obj) {
+  obj->ArrayObject::tracer();
+}
+
 /// Method for scanning a native array. Only scan the lock. The classloader of
 /// the class is the bootstrap loader and therefore does not need to be
 /// scanned here.
-extern "C" void JavaArrayTracer(JavaArray* obj) {
-  LockObj* l = obj->lockObj();
+void JavaArray::tracer() {
+  LockObj* l = lockObj();
   if (l) l->markAndTrace();
 }
 
-//===----------------------------------------------------------------------===//
-// Tracer for regular Java objects.
-//===----------------------------------------------------------------------===//
-
-extern "C" void RegularObjectTracer(JavaObject* obj) {
-  LockObj* l = obj->lockObj();
-  if (l) l->markAndTrace();
-  
-  Class* cl = obj->getClass()->asClass();
-  assert(cl && "Not a class in regular tracer");
-  cl->classLoader->getJavaClassLoader()->markAndTrace();
-
-  while (cl->super != 0) {
-    for (uint32 i = 0; i < cl->nbVirtualFields; ++i) {
-      JavaField& field = cl->virtualFields[i];
-      if (field.isReference()) {
-        JavaObject* ptr = field.getObjectField(obj);
-        ptr->markAndTrace();
-      }
-    }
-    cl = cl->super;
-  }
+extern "C" void JavaArrayTracer(JavaArray* obj) {
+  obj->JavaArray::tracer();
 }
 
-extern "C" void ReferenceObjectTracer(JavaObject* obj) {
-  LockObj* l = obj->lockObj();
-  if (l) l->markAndTrace();
-  
-  Class* cl = obj->getClass()->asClass();
-  assert(cl && "Not a class in reference tracer");
-  cl->classLoader->getJavaClassLoader()->markAndTrace();
-  Classpath* upcalls = cl->classLoader->bootstrapLoader->upcalls;
-  
-
-  while (cl != upcalls->newReference) {
-    for (uint32 i = 0; i < cl->nbVirtualFields; ++i) {
-      JavaField& field = cl->virtualFields[i];
-      if (field.isReference()) {
-        JavaObject* ptr = field.getObjectField(obj);
-        ptr->markAndTrace();
-      }
-    }
-    cl = cl->super;
-  }
-
-  for (uint32 i = 1; i < cl->nbVirtualFields; ++i) {
-    JavaField& field = cl->virtualFields[i];
-    if (field.isReference()) {
-      JavaObject* ptr = field.getObjectField(obj);
-      ptr->markAndTrace();
-    }
-  }
-}
 
 //===----------------------------------------------------------------------===//
 // Support for scanning Java objects referenced by classes. All classes must
@@ -207,15 +163,8 @@
   
   for (uint32 i =0; i < NR_ISOLATES; ++i) {
     TaskClassMirror &M = IsolateInfo[i];
-    void* Stat = M.staticInstance;
-    if (Stat) {
-      for (uint32 i = 0; i < nbStaticFields; ++i) {
-        JavaField& field = staticFields[i];
-        if (field.isReference()) {
-          JavaObject* ptr = field.getObjectField(Stat);
-          if (ptr) ptr->markAndTrace();
-        }
-      }
+    if (M.staticInstance && staticTracer != EmptyTracer) {
+      staticTracer(M.staticInstance);
     }
   }
 }





More information about the vmkit-commits mailing list