[vmkit-commits] [vmkit] r137030 - in /vmkit/trunk: include/j3/JavaAOTCompiler.h lib/J3/Compiler/JavaAOTCompiler.cpp lib/J3/VMCore/JnjvmClassLoader.cpp tools/j3/Makefile tools/precompiler/Precompiler.cpp tools/precompiler/trainer/Makefile

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sun Aug 7 01:46:44 PDT 2011


Author: geoffray
Date: Sun Aug  7 03:46:43 2011
New Revision: 137030

URL: http://llvm.org/viewvc/llvm-project?rev=137030&view=rev
Log:
Create a different .o file for the class bytes.


Modified:
    vmkit/trunk/include/j3/JavaAOTCompiler.h
    vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp
    vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/tools/j3/Makefile
    vmkit/trunk/tools/precompiler/Precompiler.cpp
    vmkit/trunk/tools/precompiler/trainer/Makefile

Modified: vmkit/trunk/include/j3/JavaAOTCompiler.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/j3/JavaAOTCompiler.h?rev=137030&r1=137029&r2=137030&view=diff
==============================================================================
--- vmkit/trunk/include/j3/JavaAOTCompiler.h (original)
+++ vmkit/trunk/include/j3/JavaAOTCompiler.h Sun Aug  7 03:46:43 2011
@@ -183,6 +183,7 @@
   bool assumeCompiled;
   bool compileRT;
   bool precompile;
+  bool emitClassBytes;
 
   std::vector<std::string>* clinits;
   
@@ -196,6 +197,7 @@
   void compileFile(Jnjvm* vm, const char* name);
   void compileClass(Class* cl);
   void compileClassLoader(JnjvmBootstrapLoader* loader);
+  void generateClassBytes(JnjvmBootstrapLoader* loader);
   void generateMain(const char* name, bool jit);
 
 private:

Modified: vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp?rev=137030&r1=137029&r2=137030&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp Sun Aug  7 03:46:43 2011
@@ -273,10 +273,15 @@
     return CI->second;
   }
 
-  std::string name(UTF8Buffer(className).toCompileName()->cString());
-  name += "_bytes";
-  Constant* C = CreateConstantFromClassBytes(bytes);
-  GlobalVariable* varGV = new GlobalVariable(*getLLVMModule(), C->getType(), false,
+  std::vector<Type*> Elemts;
+  ArrayType* ATy = ArrayType::get(Type::getInt8Ty(getLLVMContext()), bytes->size);
+  Elemts.push_back(Type::getInt32Ty(getLLVMContext()));
+  Elemts.push_back(ATy);
+  StructType* STy = StructType::get(getLLVMContext(), Elemts);
+
+  std::string name(UTF8Buffer(className).toCompileName("_bytes")->cString());
+  Constant* C = emitClassBytes ? CreateConstantFromClassBytes(bytes) : NULL;
+  GlobalVariable* varGV = new GlobalVariable(*getLLVMModule(), STy, false,
                                              GlobalValue::ExternalLinkage,
                                              C, name);
   classBytes[bytes] = varGV;
@@ -1323,9 +1328,12 @@
   ClassElts.push_back(Constant::getNullValue(JavaIntrinsics.ptrType));
   
   // bytes 
-  Constant* bytes = ConstantExpr::getBitCast(getClassBytes(cl->name, cl->bytes),
-                                             JavaIntrinsics.ClassBytesType);
-  ClassElts.push_back(bytes);
+  if (precompile) {
+    ClassElts.push_back(ConstantExpr::getBitCast(getClassBytes(cl->name, cl->bytes),
+                                                 JavaIntrinsics.ClassBytesType));
+  } else {
+    ClassElts.push_back(Constant::getNullValue(JavaIntrinsics.ClassBytesType));
+  }
 
   // ctpInfo
   Constant* ctpInfo = CreateConstantFromJavaConstantPool(cl->ctpInfo);
@@ -1824,6 +1832,7 @@
   assumeCompiled = false;
   compileRT = false;
   precompile = false;
+  emitClassBytes = false;
 
   std::vector<llvm::Type*> llvmArgs;
   FunctionType* FTy = FunctionType::get(
@@ -2396,18 +2405,6 @@
     AddInitializerToClass(gv, i->second);
   }
 
-  // Add the bootstrap classes to the image.
-  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);
-    }
-  }
-
   // Finally add used stubs to the image.
   for (SignMap::iterator i = loader->javaSignatures->map.begin(),
        e = loader->javaSignatures->map.end(); i != e; i++) {
@@ -2448,6 +2445,24 @@
   CreateConstantFromUTF8Map(loader->hashUTF8->map);
 }
 
+void JavaAOTCompiler::generateClassBytes(JnjvmBootstrapLoader* loader) {
+  emitClassBytes = true;
+  // Add the bootstrap classes to the image.
+  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++) {
+      // Remove the '.class'.
+      const char* name = zi->first;
+      std::string str(name, strlen(name) - strlen(".class"));
+      ClassBytes* bytes = Reader::openZip(loader, archive, name);
+      getClassBytes(loader->asciizConstructUTF8(str.c_str()), bytes);
+    }
+  }
+}
+
+
 /// compileAllStubs - Compile all the native -> Java stubs. 
 /// TODO: Once LLVM supports va_arg, enable AP.
 ///

Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp?rev=137030&r1=137029&r2=137030&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp Sun Aug  7 03:46:43 2011
@@ -240,7 +240,7 @@
 
 ClassBytes* JnjvmBootstrapLoader::openName(const UTF8* utf8) {
   ClassBytes* res = reinterpret_cast<ClassBytes*>(dlsym(SELF_HANDLE,
-      UTF8Buffer(utf8).toCompileName(".class_bytes")->cString()));
+      UTF8Buffer(utf8).toCompileName("_bytes")->cString()));
   if (res != NULL) return res;
 
   mvm::ThreadAllocator threadAllocator;

Modified: vmkit/trunk/tools/j3/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/j3/Makefile?rev=137030&r1=137029&r2=137030&view=diff
==============================================================================
--- vmkit/trunk/tools/j3/Makefile (original)
+++ vmkit/trunk/tools/j3/Makefile Sun Aug  7 03:46:43 2011
@@ -11,7 +11,7 @@
 include $(LEVEL)/Makefile.config
 
 TOOLNAME = j3
-USEDLIBS = Classpath.a J3.a J3Compiler.a Mvm.a MvmCompiler.a CommonThread.a FinalMMTk.a InlineMMTk.a Precompiled.a
+USEDLIBS = Classpath.a J3.a J3Compiler.a Mvm.a MvmCompiler.a CommonThread.a FinalMMTk.a InlineMMTk.a Precompiled.a BootstrapClasses.a
 BUILD_FRAMETABLE = 1
 LINK_COMPONENTS = jit nativecodegen scalaropts instrumentation ipa ipo
 

Modified: vmkit/trunk/tools/precompiler/Precompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/precompiler/Precompiler.cpp?rev=137030&r1=137029&r2=137030&view=diff
==============================================================================
--- vmkit/trunk/tools/precompiler/Precompiler.cpp (original)
+++ vmkit/trunk/tools/precompiler/Precompiler.cpp Sun Aug  7 03:46:43 2011
@@ -50,9 +50,18 @@
   vm->exit(); 
 }
 
-
 int main(int argc, char **argv, char **envp) {
   llvm::llvm_shutdown_obj X;
+  bool EmitClassBytes = false;
+  static const char* EmitClassBytesStr = "-emit-class-bytes";
+  for (int i = 0; i < argc; i++) {
+    if (!strncmp(argv[i], EmitClassBytesStr, strlen(EmitClassBytesStr))) {
+      EmitClassBytes = true;
+      break;
+    }
+  }
+
+  std::string OutputFilename;
 
   // Initialize base components.  
   MvmModule::initialise();
@@ -60,32 +69,39 @@
   
   // Tell the compiler to run all optimizations.
   StandardCompileOpts = true;
- 
+
   // Create the allocator that will allocate the bootstrap loader and the JVM.
   mvm::BumpPtrAllocator Allocator;
-  JavaJITCompiler* JIT = JavaJITCompiler::CreateCompiler("JIT");
-  JnjvmBootstrapLoader* loader = new(Allocator, "Bootstrap loader")
-    JnjvmBootstrapLoader(Allocator, JIT, true);
-  Jnjvm* vm = new(Allocator, "VM") Jnjvm(Allocator, frametables, loader);
- 
-  // Run the application. 
-  vm->runApplication(argc, argv);
-  vm->waitForExit();
-
-  // Now AOT Compile all compiled methods.
   JavaAOTCompiler* AOT = new JavaAOTCompiler("AOT");
-  loader->setCompiler(AOT);
-
-  vm->doExit = false;
-  JavaThread* th = new JavaThread(vm);
-  vm->setMainThread(th);
-  th->start((void (*)(mvm::Thread*))mainCompilerLoaderStart);
-  vm->waitForExit();
+  if (EmitClassBytes) {
+    OutputFilename = "classes.bc";
+    JnjvmBootstrapLoader* loader = new(Allocator, "Bootstrap loader")
+      JnjvmBootstrapLoader(Allocator, AOT, true);
+    AOT->generateClassBytes(loader);
+  } else {
+    OutputFilename = "generated.bc";
+    JavaJITCompiler* JIT = JavaJITCompiler::CreateCompiler("JIT");
+    JnjvmBootstrapLoader* loader = new(Allocator, "Bootstrap loader")
+      JnjvmBootstrapLoader(Allocator, JIT, true);
+    Jnjvm* vm = new(Allocator, "VM") Jnjvm(Allocator, frametables, loader);
+ 
+    // Run the application. 
+    vm->runApplication(argc, argv);
+    vm->waitForExit();
+
+    // Now AOT Compile all compiled methods.
+    loader->setCompiler(AOT);
+
+    vm->doExit = false;
+    JavaThread* th = new JavaThread(vm);
+    vm->setMainThread(th);
+    th->start((void (*)(mvm::Thread*))mainCompilerLoaderStart);
+    vm->waitForExit();
+  }
 
   AOT->printStats();
 
   // Emit the bytecode in file.
-  std::string OutputFilename = "generated.bc";
   std::string ErrorInfo;
   std::auto_ptr<llvm::raw_ostream> Out 
     (new llvm::raw_fd_ostream(OutputFilename.c_str(), ErrorInfo,

Modified: vmkit/trunk/tools/precompiler/trainer/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/precompiler/trainer/Makefile?rev=137030&r1=137029&r2=137030&view=diff
==============================================================================
--- vmkit/trunk/tools/precompiler/trainer/Makefile (original)
+++ vmkit/trunk/tools/precompiler/trainer/Makefile Sun Aug  7 03:46:43 2011
@@ -10,7 +10,7 @@
 
 include $(LEVEL)/Makefile.config
 
-BUILT_SOURCES = Precompiled.bc
+BUILT_SOURCES = Precompiled.bc BootstrapClasses.bc
 
 include $(LEVEL)/Makefile.common
 
@@ -20,17 +20,35 @@
   J3.Flags := > /dev/null
 endif
 
-Precompiled.bc: $(PRECOMPILER) HelloWorld.java $(LibDir)/StaticGCPass$(SHLIBEXT) $(LibDir)/StaticGCPrinter$(SHLIBEXT)
-	$(Echo) "Building precompiled bootstrap code"
+HelloWorld.class: HelloWorld.java
+	$(Echo) "Compiling trainer"
 	$(Verb) javac HelloWorld.java
+
+generated.bc: $(PRECOMPILER) HelloWorld.class
+	$(Echo) "Pre-compiling bootstrap code"
 	$(Verb) $(PRECOMPILER) -cp $$PWD HelloWorld $(J3.Flags)
+
+Precompiled.bc: HelloWorld.class $(LibDir)/StaticGCPass$(SHLIBEXT) $(LibDir)/StaticGCPrinter$(SHLIBEXT) generated.bc
+	$(Echo) "Building precompiled bootstrap code"
 	$(Verb) $(MKDIR) $(ObjDir)
-	$(Verb) $(LOPT) generated.bc -load=$(LibDir)/StaticGCPass$(SHLIBEXT) -StaticGCPass -o $(LibDir)/Precompiled.bc
-	$(Verb) $(LLC) -disable-cfi -O0 -fast-isel=false -load=$(LibDir)/StaticGCPrinter$(SHLIBEXT) -disable-fp-elim $(LibDir)/Precompiled.bc -o $(ObjDir)/Precompiled.s
+	$(Verb) $(LLC) -disable-branch-fold -disable-cfi -O0 -fast-isel=false -load=$(LibDir)/StaticGCPrinter$(SHLIBEXT) -disable-fp-elim generated.bc -o $(ObjDir)/Precompiled.s
 	$(Verb) $(CC) -c $(ObjDir)/Precompiled.s -o $(ObjDir)/Precompiled.o
 	$(Verb) $(Archive) $(LibDir)/libPrecompiled.a $(ObjDir)/Precompiled.o
 	$(Verb) $(Ranlib) $(LibDir)/libPrecompiled.a
 	$(Verb) $(MV) generated.bc Precompiled.bc
 
+classes.bc: $(PRECOMPILER)
+	$(Echo) "Pre-compiling classes"
+	$(Verb) $(PRECOMPILER) -emit-class-bytes $(J3.Flags)
+
+BootstrapClasses.bc: classes.bc
+	$(Echo) "Building precompiled classes"
+	$(Verb) $(MKDIR) $(ObjDir)
+	$(Verb) $(LLC) classes.bc -o $(ObjDir)/BootstrapClasses.s
+	$(Verb) $(CC) -c $(ObjDir)/BootstrapClasses.s -o $(ObjDir)/BootstrapClasses.o
+	$(Verb) $(Archive) $(LibDir)/libBootstrapClasses.a $(ObjDir)/BootstrapClasses.o
+	$(Verb) $(Ranlib) $(LibDir)/libBootstrapClasses.a
+	$(Verb) $(MV) classes.bc BootstrapClasses.bc
+
 clean-local::
-	$(Verb) $(RM) -f HelloWorld.class Precompiled.bc
+	$(Verb) $(RM) -f HelloWorld.class Precompiled.bc BootstrapClasses.bc





More information about the vmkit-commits mailing list