[vmkit-commits] [vmkit] r114976 - in /vmkit/trunk/lib/J3: Compiler/JavaAOTCompiler.cpp VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JnjvmClassLoader.cpp VMCore/JnjvmClassLoader.h
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Tue Sep 28 12:17:12 PDT 2010
Author: geoffray
Date: Tue Sep 28 14:17:12 2010
New Revision: 114976
URL: http://llvm.org/viewvc/llvm-project?rev=114976&view=rev
Log:
- Change locking of a class by using the java.lang.Class instance
- Resolve eagerly classes
This should fix the AOT compilation of classes.
Modified:
vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp
vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
vmkit/trunk/lib/J3/VMCore/JavaClass.h
vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h
Modified: vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp?rev=114976&r1=114975&r2=114976&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp Tue Sep 28 14:17:12 2010
@@ -1916,16 +1916,11 @@
char* name = file->filename;
uint32 size = strlen(name);
if (size > 6 && !strcmp(&(name[size - 6]), ".class")) {
- UserClassArray* array = bootstrapLoader->upcalls->ArrayOfByte;
- ArrayUInt8* res =
- (ArrayUInt8*)array->doNew(file->ucsize, JavaThread::get()->getJVM());
- int ok = archive.readFile(res, file);
- if (!ok) return;
-
memcpy(realName, name, size);
realName[size - 6] = 0;
const UTF8* utf8 = bootstrapLoader->asciizConstructUTF8(realName);
- Class* cl = bootstrapLoader->constructClass(utf8, res);
+ Class* cl = bootstrapLoader->loadName(utf8, true, false, NULL);
+ assert(cl && "Class not created");
if (cl == ClassArray::SuperArray) M->compileRT = true;
classes.push_back(cl);
} else if (size > 4 && (!strcmp(&name[size - 4], ".jar") ||
@@ -1952,6 +1947,12 @@
JavaJITCompiler* Comp = 0;
mvm::ThreadAllocator allocator;
bootstrapLoader->analyseClasspathEnv(vm->bootstrapLoader->bootClasspathEnv);
+ uint32 size = strlen(name);
+ if (size > 4 &&
+ (!strcmp(&name[size - 4], ".jar") || !strcmp(&name[size - 4], ".zip"))) {
+ bootstrapLoader->analyseClasspathEnv(name);
+ }
+
if (!M->clinits->empty()) {
Comp = JavaJITCompiler::CreateCompiler("JIT");
Comp->EmitFunctionName = true;
@@ -1962,7 +1963,6 @@
bootstrapLoader->upcalls->initialiseClasspath(bootstrapLoader);
}
- uint32 size = strlen(name);
if (size > 4 &&
(!strcmp(&name[size - 4], ".jar") || !strcmp(&name[size - 4], ".zip"))) {
Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.cpp?rev=114976&r1=114975&r2=114976&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.cpp Tue Sep 28 14:17:12 2010
@@ -476,7 +476,8 @@
llvm_gcroot(res, 0);
assert(this && "No class when allocating.");
assert((this->isInitializing() ||
- classLoader->getCompiler()->isStaticCompiling())
+ classLoader->getCompiler()->isStaticCompiling() ||
+ this == classLoader->bootstrapLoader->upcalls->newClass)
&& "Uninitialized class when allocating.");
assert(getVirtualVT() && "No VT\n");
res = (JavaObject*)gc::operator new(getVirtualSize(), getVirtualVT());
@@ -952,78 +953,18 @@
#ifndef ISOLATE_SHARING
void Class::resolveClass() {
- JavaObject* exc = 0;
- llvm_gcroot(exc, 0);
- if (!isResolved() && !isErroneous()) {
- acquire();
- if (isResolved() || isErroneous()) {
- release();
- } else if (!isResolving()) {
- setOwnerClass(JavaThread::get());
- TRY {
- readClass();
- } CATCH {
- exc = JavaThread::get()->pendingException;
- JavaThread::get()->clearException();
- } END_CATCH;
-
- if (exc != NULL) {
- setErroneous();
- setOwnerClass(0);
- broadcastClass();
- release();
- JavaThread::get()->throwException(exc);
- }
-
- release();
-
- TRY {
- loadParents();
- } CATCH {
- setInitializationState(loaded);
- exc = JavaThread::get()->pendingException;
- JavaThread::get()->clearException();
- } END_CATCH;
-
- if (exc != NULL) {
- setErroneous();
- setOwnerClass(0);
- JavaThread::get()->throwException(exc);
- }
-
- makeVT();
- JavaCompiler *Comp = classLoader->getCompiler();
- Comp->resolveVirtualClass(this);
- Comp->resolveStaticClass(this);
- loadExceptions();
- setResolved();
- if (!needsInitialisationCheck()) {
- setInitializationState(ready);
- }
- if (!super) ClassArray::initialiseVT(this);
-
- bool needInit = needsInitialisationCheck();
-
- acquire();
- if (needInit) setResolved();
- setOwnerClass(0);
- broadcastClass();
- release();
- } else if (JavaThread::get() != getOwnerClass()) {
- while (!isResolved()) {
- waitClass();
- if (isErroneous()) break;
- }
- release();
-
- }
+ if (isResolved() || isErroneous()) return;
+ readClass();
+ loadParents();
+ makeVT();
+ JavaCompiler *Comp = classLoader->getCompiler();
+ Comp->resolveVirtualClass(this);
+ Comp->resolveStaticClass(this);
+ loadExceptions();
+ setResolved();
+ if (!needsInitialisationCheck()) {
+ setInitializationState(ready);
}
-
- if (isErroneous()) {
- JavaThread* th = JavaThread::get();
- th->getJVM()->noClassDefFoundError(name);
- }
-
assert(virtualVT && "No virtual VT after resolution");
}
#else
@@ -1854,3 +1795,31 @@
if (codeInfoLength) return codeInfo[codeInfoLength - 1].ctpIndex;
return 0;
}
+
+void Class::acquire() {
+ JavaObject* delegatee = NULL;
+ llvm_gcroot(delegatee, 0);
+ delegatee = getClassDelegatee(JavaThread::get()->getJVM());
+ JavaObject::acquire(delegatee);
+}
+
+void Class::release() {
+ JavaObject* delegatee = NULL;
+ llvm_gcroot(delegatee, 0);
+ delegatee = getClassDelegatee(JavaThread::get()->getJVM());
+ JavaObject::release(delegatee);
+}
+
+void Class::waitClass() {
+ JavaObject* delegatee = NULL;
+ llvm_gcroot(delegatee, 0);
+ delegatee = getClassDelegatee(JavaThread::get()->getJVM());
+ JavaObject::wait(delegatee);
+}
+
+void Class::broadcastClass() {
+ JavaObject* delegatee = NULL;
+ llvm_gcroot(delegatee, 0);
+ delegatee = getClassDelegatee(JavaThread::get()->getJVM());
+ JavaObject::notifyAll(delegatee);
+}
Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.h?rev=114976&r1=114975&r2=114976&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.h Tue Sep 28 14:17:12 2010
@@ -503,10 +503,6 @@
///
uint32 staticSize;
- /// lock - The lock of this class.
- mvm::LockRecursive lock;
- mvm::Cond condition;
-
/// getVirtualSize - Get the virtual size of instances of this class.
///
uint32 getVirtualSize() const { return virtualSize; }
@@ -688,28 +684,20 @@
/// acquire - Acquire this class lock.
///
- void acquire() {
- lock.lock();
- }
+ void acquire();
/// release - Release this class lock.
///
- void release() {
- lock.unlock();
- }
+ void release();
/// waitClass - Wait for the class to be loaded/initialized/resolved.
///
- void waitClass() {
- condition.wait(&lock);
- }
+ void waitClass();
/// broadcastClass - Unblock threads that were waiting on the class being
/// loaded/initialized/resolved.
///
- void broadcastClass() {
- condition.broadcast();
- }
+ void broadcastClass();
#ifndef ISOLATE
Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp?rev=114976&r1=114975&r2=114976&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp Tue Sep 28 14:17:12 2010
@@ -664,21 +664,40 @@
UserClass* JnjvmClassLoader::constructClass(const UTF8* name,
ArrayUInt8* bytes) {
- llvm_gcroot(bytes, 0);
- assert(bytes && "constructing a class without bytes");
+ JavaObject* excp = NULL;
+ llvm_gcroot(bytes, 0);
+ llvm_gcroot(excp, 0);
+ UserClass* res = NULL;
+ lock.lock();
classes->lock.lock();
ClassMap::iterator End = classes->map.end();
ClassMap::iterator I = classes->map.find(name);
- UserClass* res = 0;
- if (I == End) {
- const UTF8* internalName = readerConstructUTF8(name->elements, name->size);
- res = new(allocator, "Class") UserClass(this, internalName, bytes);
- bool success = classes->map.insert(std::make_pair(internalName, res)).second;
- assert(success && "Could not add class in map");
- } else {
+ classes->lock.unlock();
+ if (I != End) {
res = ((UserClass*)(I->second));
+ } else {
+ TRY {
+ const UTF8* internalName = readerConstructUTF8(name->elements, name->size);
+ res = new(allocator, "Class") UserClass(this, internalName, bytes);
+ res->resolveClass();
+ classes->lock.lock();
+ bool success = classes->map.insert(std::make_pair(internalName, res)).second;
+ classes->lock.unlock();
+ assert(success && "Could not add class in map");
+ } CATCH {
+ excp = JavaThread::get()->pendingException;
+ JavaThread::get()->clearException();
+ } END_CATCH;
+ }
+ if (excp != NULL) {
+ JavaThread::get()->throwException(excp);
+ }
+ lock.unlock();
+
+ if (res->super == NULL) {
+ // java.lang.Object just got created, initialise VTs of arrays.
+ ClassArray::initialiseVT(res);
}
- classes->lock.unlock();
return res;
}
Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h?rev=114976&r1=114975&r2=114976&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h Tue Sep 28 14:17:12 2010
@@ -105,6 +105,10 @@
///
SignMap* javaSignatures;
+ /// lock - Lock when loading classes.
+ ///
+ mvm::LockRecursive lock;
+
public:
/// allocator - Reference to the memory allocator, which will allocate UTF8s,
More information about the vmkit-commits
mailing list