[vmkit-commits] [vmkit] r135931 - in /vmkit/trunk: include/j3/JavaAOTCompiler.h lib/J3/Compiler/JavaAOTCompiler.cpp lib/J3/VMCore/Jnjvm.cpp lib/J3/VMCore/JnjvmClassLoader.cpp lib/J3/VMCore/JnjvmClassLoader.h lib/J3/VMCore/UTF8.h
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Mon Jul 25 11:53:31 PDT 2011
Author: geoffray
Date: Mon Jul 25 13:53:31 2011
New Revision: 135931
URL: http://llvm.org/viewvc/llvm-project?rev=135931&view=rev
Log:
Include all bytes of the bootstrap classpath after precompiling.
Modified:
vmkit/trunk/include/j3/JavaAOTCompiler.h
vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp
vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp
vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h
vmkit/trunk/lib/J3/VMCore/UTF8.h
Modified: vmkit/trunk/include/j3/JavaAOTCompiler.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/j3/JavaAOTCompiler.h?rev=135931&r1=135930&r2=135931&view=diff
==============================================================================
--- vmkit/trunk/include/j3/JavaAOTCompiler.h (original)
+++ vmkit/trunk/include/j3/JavaAOTCompiler.h Mon Jul 25 13:53:31 2011
@@ -59,6 +59,7 @@
virtual llvm::Constant* getFinalObject(JavaObject* obj, CommonClass* cl);
virtual JavaObject* getFinalObject(llvm::Value* C);
virtual llvm::Constant* getNativeClass(CommonClass* cl);
+ virtual llvm::Constant* getClassBytes(const UTF8* name, ClassBytes* bytes);
virtual llvm::Constant* getJavaClass(CommonClass* cl);
virtual llvm::Constant* getJavaClassPtr(CommonClass* cl);
virtual llvm::Constant* getStaticInstance(Class* cl);
@@ -110,6 +111,7 @@
llvm::Constant* CreateConstantFromObjectArray(const ArrayObject* val);
std::map<CommonClass*, llvm::GlobalVariable*> nativeClasses;
+ std::map<ClassBytes*, llvm::GlobalVariable*> classBytes;
std::map<const ClassArray*, llvm::GlobalVariable*> arrayClasses;
std::map<const CommonClass*, llvm::Constant*> javaClasses;
std::map<const JavaVirtualTable*, llvm::Constant*> virtualTables;
@@ -135,6 +137,9 @@
typedef std::map<CommonClass*, llvm::GlobalVariable*>::iterator
native_class_iterator;
+ typedef std::map<ClassBytes*, llvm::GlobalVariable*>::iterator
+ class_bytes_iterator;
+
typedef std::map<const ClassArray*, llvm::GlobalVariable*>::iterator
array_class_iterator;
Modified: vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp?rev=135931&r1=135930&r2=135931&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp Mon Jul 25 13:53:31 2011
@@ -256,6 +256,22 @@
}
}
+Constant* JavaAOTCompiler::getClassBytes(const UTF8* className, ClassBytes* bytes) {
+ class_bytes_iterator CI = classBytes.find(bytes);
+ if (CI != classBytes.end()) {
+ return CI->second;
+ }
+
+ std::string name(UTF8Buffer(className).toCompileName()->cString());
+ name += "_bytes";
+ Constant* C = CreateConstantFromClassBytes(bytes);
+ GlobalVariable* varGV = new GlobalVariable(*getLLVMModule(), C->getType(), false,
+ GlobalValue::ExternalLinkage,
+ C, name);
+ classBytes[bytes] = varGV;
+ return varGV;
+}
+
Constant* JavaAOTCompiler::getStringPtr(JavaString** str) {
fprintf(stderr, "Implement me");
abort();
@@ -1234,20 +1250,16 @@
// ownerClass
ClassElts.push_back(Constant::getNullValue(JavaIntrinsics.ptrType));
- // bytes
- Constant* bytes = CreateConstantFromClassBytes(cl->bytes);
- GlobalVariable* varGV = new GlobalVariable(*getLLVMModule(), bytes->getType(), false,
- GlobalValue::InternalLinkage,
- bytes, "");
-
- bytes = ConstantExpr::getBitCast(varGV, JavaIntrinsics.ClassBytesType);
+ // bytes
+ Constant* bytes = ConstantExpr::getBitCast(getClassBytes(cl->name, cl->bytes),
+ JavaIntrinsics.ClassBytesType);
ClassElts.push_back(bytes);
// ctpInfo
Constant* ctpInfo = CreateConstantFromJavaConstantPool(cl->ctpInfo);
- varGV = new GlobalVariable(*getLLVMModule(), ctpInfo->getType(), false,
- GlobalValue::InternalLinkage,
- ctpInfo, "");
+ Constant* varGV = new GlobalVariable(*getLLVMModule(), ctpInfo->getType(), false,
+ GlobalValue::InternalLinkage,
+ ctpInfo, "");
ClassElts.push_back(varGV);
// attributs
@@ -2263,6 +2275,18 @@
}
} while (changed);
+ for (std::vector<ZipArchive*>::iterator i = loader->bootArchives.begin(),
+ e = loader->bootArchives.end(); i != e; ++i) {
+ ZipArchive* archive = *i;
+ for (ZipArchive::table_iterator zi = archive->filetable.begin(),
+ ze = archive->filetable.end(); zi != ze; zi++) {
+ const char* name = zi->first;
+ ClassBytes* bytes = Reader::openZip(loader, archive, name);
+ getClassBytes(loader->asciizConstructUTF8(name), bytes);
+ }
+ }
+
+
CreateStaticInitializer();
}
Modified: vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp?rev=135931&r1=135930&r2=135931&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp Mon Jul 25 13:53:31 2011
@@ -1246,7 +1246,6 @@
llvm_gcroot(exc, 0);
Jnjvm* vm = thread->getJVM();
- vm->bootstrapLoader->analyseClasspathEnv(vm->bootstrapLoader->bootClasspathEnv);
vm->argumentsInfo.readArgs(vm);
if (vm->argumentsInfo.className == NULL) {
vm->threadSystem.leave();
Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp?rev=135931&r1=135930&r2=135931&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp Mon Jul 25 13:53:31 2011
@@ -71,17 +71,9 @@
javaSignatures = new(allocator, "SignMap") SignMap();
strings = new(allocator, "StringList") StringList();
- bootClasspathEnv = getenv("JNJVM_BOOTCLASSPATH");
- if (!bootClasspathEnv) {
- bootClasspathEnv = GNUClasspathGlibj;
- }
-
- libClasspathEnv = getenv("JNJVM_LIBCLASSPATH");
- if (!libClasspathEnv) {
- libClasspathEnv = GNUClasspathLibs;
- }
-
-
+ bootClasspathEnv = GNUClasspathGlibj;
+ libClasspathEnv = GNUClasspathLibs;
+
upcalls = new(allocator, "Classpath") Classpath();
bootstrapLoader = this;
@@ -92,6 +84,10 @@
}
if (!bootLoaded) {
+ // Analyze the boot classpath, we know bootstrap classes are not in the
+ // executable.
+ analyseClasspathEnv(bootClasspathEnv);
+
// Allocate the interfaces array for array classes, so that VT construction
// can use it right away.
ClassArray::InterfacesArray =
@@ -243,7 +239,10 @@
}
ClassBytes* JnjvmBootstrapLoader::openName(const UTF8* utf8) {
- ClassBytes* res = 0;
+ ClassBytes* res = reinterpret_cast<ClassBytes*>(dlsym(SELF_HANDLE,
+ UTF8Buffer(utf8).toCompileName(".class_bytes")->cString()));
+ if (res != NULL) return res;
+
mvm::ThreadAllocator threadAllocator;
char* asciiz = (char*)threadAllocator.Allocate(utf8->size + 1);
@@ -261,7 +260,7 @@
sprintf(buf, "%s%s.class", str, asciiz);
res = Reader::openFile(this, buf);
- if (res) return res;
+ if (res != NULL) return res;
}
for (std::vector<ZipArchive*>::iterator i = bootArchives.begin(),
@@ -271,10 +270,10 @@
char* buf = (char*)threadAllocator.Allocate(alen + 7);
sprintf(buf, "%s.class", asciiz);
res = Reader::openZip(this, archive, buf);
- if (res) return res;
+ if (res != NULL) return res;
}
- return 0;
+ return NULL;
}
Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h?rev=135931&r1=135930&r2=135931&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h Mon Jul 25 13:53:31 2011
@@ -416,6 +416,7 @@
virtual ~JnjvmBootstrapLoader();
friend class ClArgumentsInfo;
+ friend class JavaAOTCompiler;
};
Modified: vmkit/trunk/lib/J3/VMCore/UTF8.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/UTF8.h?rev=135931&r1=135930&r2=135931&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/UTF8.h (original)
+++ vmkit/trunk/lib/J3/VMCore/UTF8.h Mon Jul 25 13:53:31 2011
@@ -29,10 +29,11 @@
/// toCompileName - Change the utf8 following JNI conventions.
///
- UTF8Buffer* toCompileName() {
+ UTF8Buffer* toCompileName(const char* suffix = "") {
const char *buffer = cString();
uint32 len = strlen(buffer);
- char* newBuffer = new char[(len << 1) + 1];
+ uint32 suffixLen = strlen(suffix);
+ char* newBuffer = new char[(len << 1) + suffixLen + 1];
uint32 j = 0;
for (uint32 i = 0; i < len; ++i) {
if (buffer[i] == '/') {
@@ -53,6 +54,9 @@
newBuffer[j++] = buffer[i];
}
}
+ for (uint32 i = 0; i < suffixLen; i++) {
+ newBuffer[j++] = suffix[i];
+ }
newBuffer[j] = 0;
replaceWith(newBuffer);
return this;
More information about the vmkit-commits
mailing list