[vmkit-commits] [vmkit] r69317 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathVMClassLoader.cpp Compiler/JavaJITCompiler.cpp Compiler/JnjvmModule.cpp VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JavaConstantPool.cpp VMCore/JavaConstantPool.h VMCore/JnjvmClassLoader.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Thu Apr 16 15:01:26 PDT 2009


Author: geoffray
Date: Thu Apr 16 17:01:26 2009
New Revision: 69317

URL: http://llvm.org/viewvc/llvm-project?rev=69317&view=rev
Log:
Support initiating class loaders.


Modified:
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp
    vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp
    vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp

Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp?rev=69317&r1=69316&r2=69317&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp Thu Apr 16 17:01:26 2009
@@ -61,9 +61,10 @@
   Jnjvm* vm = JavaThread::get()->getJVM();
   JavaString* name = (JavaString*)_name;
   const UTF8* utf8 = name->strToUTF8(vm);
+  const UTF8* internalName = utf8->javaToInternal(vm, 0, utf8->size);
   JnjvmClassLoader* JCL = 
     JnjvmClassLoader::getJnjvmLoaderFromJavaObject((JavaObject*)loader, vm);
-  UserCommonClass* cl = JCL->lookupClass(utf8);
+  UserCommonClass* cl = JCL->lookupClass(internalName);
 
   if (cl) res = (jclass)(cl->getClassDelegatee(vm));
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp Thu Apr 16 17:01:26 2009
@@ -153,10 +153,7 @@
       if (!cl->super) {
         meth.canBeInlined = true;
       } else {
-          // LLVM does not allow recursive compilation. Create the code now.
-          // TODO: improve this when we have proper initialization.
-          Function* func = parseFunction(&meth);
-          VT->destructor = (uintptr_t)EE->getPointerToFunction(func);
+        VT->destructor = (uintptr_t)EE->getPointerToFunctionOrStub(func);
       }
 #endif
     } else {

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Thu Apr 16 17:01:26 2009
@@ -201,6 +201,14 @@
   }
 
   uint32 size = cl->virtualTableSize;
+  if (cl->super) {
+    if (!(cl->virtualTableSize >= cl->super->virtualTableSize)) {
+      fprintf(stderr, "cl = %s et super = %s\n", cl->printString(), cl->super->printString());
+    }
+    assert(cl->virtualTableSize >= cl->super->virtualTableSize &&
+           "Size of virtual table less than super!");
+  }
+
   mvm::BumpPtrAllocator& allocator = cl->classLoader->allocator;
   cl->virtualVT = new(allocator, size) JavaVirtualTable(cl);
 }

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Thu Apr 16 17:01:26 2009
@@ -727,6 +727,17 @@
   if (superEntry) {
     const UTF8* superUTF8 = ctpInfo->resolveClassName(superEntry);
     super = classLoader->loadName(superUTF8, false, true);
+    depth = super->depth + 1;
+    mvm::BumpPtrAllocator& allocator = classLoader->allocator;
+    display = (CommonClass**)
+      allocator.Allocate(sizeof(CommonClass*) * (depth + 1));
+    memcpy(display, super->display, depth * sizeof(UserCommonClass*));
+    display[depth] = this;
+  } else {
+    depth = 0;
+    display = (CommonClass**)
+      classLoader->allocator.Allocate(sizeof(CommonClass*));
+    display[0] = this;
   }
 
   uint16 nbI = reader.readU2();
@@ -745,25 +756,15 @@
 }
 
 void UserClass::loadParents() {
-  if (super == 0) {
-    depth = 0;
-    display = (CommonClass**)
-      classLoader->allocator.Allocate(sizeof(CommonClass*));
-    display[0] = this;
-    virtualTableSize = JavaVirtualTable::getFirstJavaMethodIndex();
-  } else {
+  if (super) {
     super->resolveClass();
-    depth = super->depth + 1;
-    mvm::BumpPtrAllocator& allocator = classLoader->allocator;
-    display = (CommonClass**)
-      allocator.Allocate(sizeof(CommonClass*) * (depth + 1));
-    memcpy(display, super->display, depth * sizeof(UserCommonClass*));
-    display[depth] = this;
     virtualTableSize = super->virtualTableSize;
+  } else {
+    virtualTableSize = JavaVirtualTable::getFirstJavaMethodIndex();
   }
 
   for (unsigned i = 0; i < nbInterfaces; i++)
-    interfaces[i]->resolveClass(); 
+    interfaces[i]->resolveClass();
 }
 
 
@@ -791,7 +792,9 @@
       reader.readU2();
 
       uint16 catche = reader.readU2();
-      if (catche) meth.classDef->ctpInfo->loadClass(catche);
+      if (catche) {
+        meth.classDef->ctpInfo->loadClass(catche, false);
+      }
     }
   }
 }
@@ -913,19 +916,24 @@
       release();
     } else if (!isResolving()) {
       setOwnerClass(JavaThread::get());
-      readClass();
+      setIsResolving();
       release();
+
       loadParents();
-      loadExceptions();
-      acquire();
       JavaCompiler *Comp = classLoader->getCompiler();
       Comp->resolveVirtualClass(this);
       Comp->resolveStaticClass(this);
-      setResolved();
-      if (!needsInitialisationCheck()) {
+      loadExceptions();
+      if (!super) ClassArray::initialiseVT(this);
+      
+      bool init = needsInitialisationCheck();
+      
+      acquire();
+      if (!init) {
         setInitializationState(ready);
+      } else {
+        setResolved();
       }
-      if (!super) ClassArray::initialiseVT(this);
       setOwnerClass(0);
       broadcastClass();
       release();
@@ -1213,7 +1221,7 @@
 
 bool UserClass::needsInitialisationCheck() {
   
-  if (!isClassRead()) return true;
+  if (!isResolved()) return true;
 
   if (isReady()) return false;
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Thu Apr 16 17:01:26 2009
@@ -50,11 +50,12 @@
 ///
 #define loaded 0       /// The .class file has been found.
 #define classRead 1    /// The .class file has been read.
-#define resolved 2     /// The class has been resolved.
-#define vmjc 3         /// The class is defined in a shared library.
-#define inClinit 4     /// The class is cliniting.
-#define ready 5        /// The class is ready to be used.
-#define erroneous 6    /// The class is in an erroneous state.
+#define resolving 2    /// The class file is being resolved.
+#define resolved 3     /// The class has been resolved.
+#define vmjc 4         /// The class is defined in a shared library.
+#define inClinit 5     /// The class is cliniting.
+#define ready 6        /// The class is ready to be used.
+#define erroneous 7    /// The class is in an erroneous state.
 
 
 /// Attribut - This class represents JVM attributes to Java class, methods and
@@ -789,6 +790,12 @@
     getCurrentTaskClassMirror().status = classRead;
   }
   
+  /// setIsResolving - The class file is being resolved.
+  ///
+  void setIsResolving() {
+    getCurrentTaskClassMirror().status = resolving;
+  }
+  
 
 #else
   
@@ -810,6 +817,12 @@
     }
   }
   
+  void setIsResolving() {
+    for (uint32 i = 0; i < NR_ISOLATES; ++i) {
+      IsolateInfo[i].status = resolving;
+    }
+  }
+  
   void setErroneous() {
     for (uint32 i = 0; i < NR_ISOLATES; ++i) {
       IsolateInfo[i].status = erroneous;
@@ -871,7 +884,7 @@
   /// isResolving - Is the class currently being resolved?
   ///
   bool isResolving() {
-    return getCurrentTaskClassMirror().status == classRead;
+    return getCurrentTaskClassMirror().status == resolving;
   }
 
   /// isClassRead - Has the .class file been read?

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Thu Apr 16 17:01:26 2009
@@ -278,7 +278,7 @@
   else return UTF8At(ctpDef[index]);
 }
 
-CommonClass* JavaConstantPool::loadClass(uint32 index) {
+CommonClass* JavaConstantPool::loadClass(uint32 index, bool resolve) {
   CommonClass* temp = isClassLoaded(index);
 #ifndef ISOLATE_SHARING
   if (!temp) {
@@ -288,7 +288,7 @@
       temp = loader->constructArray(name);
     } else {
       // Put into ctpRes because there is only one representation of the class
-      temp = loader->loadName(name, true, false);
+      temp = loader->loadName(name, resolve, false);
     }
     ctpRes[index] = temp;
   }

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.h Thu Apr 16 17:01:26 2009
@@ -248,7 +248,7 @@
   /// ie when the class will be used and not yet resolved, and also for
   /// loading exceptions when JITting catch clauses.
   ///
-  CommonClass* loadClass(uint32 index);
+  CommonClass* loadClass(uint32 index, bool resolve = true);
 
   /// JavaConstantPool - Reads the bytecode of the class to get
   /// the initial types and constants definitions.

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Thu Apr 16 17:01:26 2009
@@ -379,9 +379,9 @@
   if (cl && cl->classLoader != this) {
     classes->lock.lock();
     ClassMap::iterator End = classes->map.end();
-    ClassMap::iterator I = classes->map.find(name);
+    ClassMap::iterator I = classes->map.find(cl->name);
     if (I == End)
-      classes->map.insert(std::make_pair(name, cl));
+      classes->map.insert(std::make_pair(cl->name, cl));
     classes->lock.unlock();
   }
 
@@ -562,7 +562,19 @@
   UserCommonClass* cl = loadBaseClass(name, 1, name->size - 1);
   assert(cl && "no base class for an array");
   JnjvmClassLoader* ld = cl->classLoader;
-  return ld->constructArray(name, cl);
+  UserClassArray* res = ld->constructArray(name, cl);
+  
+  // We are an initiating clas loader.
+  if (res && res->classLoader != this) {
+    classes->lock.lock();
+    ClassMap::iterator End = classes->map.end();
+    ClassMap::iterator I = classes->map.find(res->name);
+    if (I == End)
+      classes->map.insert(std::make_pair(res->name, res));
+    classes->lock.unlock();
+  }
+
+  return res;
 }
 
 UserClass* JnjvmClassLoader::constructClass(const UTF8* name,
@@ -580,6 +592,12 @@
     res = ((UserClass*)(I->second));
   }
   classes->lock.unlock();
+    
+  res->acquire();
+  if (!res->isClassRead()) res->readClass();
+  res->release();
+  
+
   return res;
 }
 





More information about the vmkit-commits mailing list