[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