[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