[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