[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