[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