[vmkit-commits] [vmkit] r68202 - in /vmkit/trunk: include/jnjvm/JnjvmModule.h lib/JnJVM/Compiler/JavaAOTCompiler.cpp lib/JnJVM/Compiler/JavaJITCompiler.cpp lib/JnJVM/VMCore/Jnjvm.cpp tools/vmjc/vmjc.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Wed Apr 1 05:30:50 PDT 2009


Author: geoffray
Date: Wed Apr  1 07:30:47 2009
New Revision: 68202

URL: http://llvm.org/viewvc/llvm-project?rev=68202&view=rev
Log:
Add support for a --main option in vmjc that will generate
a "main" function in the resulting .ll file.


Modified:
    vmkit/trunk/include/jnjvm/JnjvmModule.h
    vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp
    vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
    vmkit/trunk/tools/vmjc/vmjc.cpp

Modified: vmkit/trunk/include/jnjvm/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/jnjvm/JnjvmModule.h?rev=68202&r1=68201&r2=68202&view=diff

==============================================================================
--- vmkit/trunk/include/jnjvm/JnjvmModule.h (original)
+++ vmkit/trunk/include/jnjvm/JnjvmModule.h Wed Apr  1 07:30:47 2009
@@ -654,6 +654,7 @@
   
   void compileFile(JnjvmClassLoader* JCL, const char* name);
   void compileClass(Class* cl);
+  void generateMain(const char* name, bool jit);
 
 private:
   void compileAllStubs(Signdef* sign);

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp Wed Apr  1 07:30:47 2009
@@ -1532,7 +1532,7 @@
           realName[size - 6] = 0;
           const UTF8* utf8 = bootstrapLoader->asciizConstructUTF8(realName);
           Class* cl = bootstrapLoader->constructClass(utf8, res);
-          classes.push_back(cl);
+          classes.push_back(cl);  
         }
       }
 
@@ -1563,8 +1563,15 @@
       }
 
     } else {
+      char* realName = (char*)alloca(size + 1);
+      if (size > 6 && !strcmp(&name[size - 6], ".class")) {
+        memcpy(realName, name, size - 6);
+        realName[size - 6] = 0;
+      } else {
+        memcpy(realName, name, size + 1);
+      }
 
-      const UTF8* utf8 = bootstrapLoader->asciizConstructUTF8(name);
+      const UTF8* utf8 = bootstrapLoader->asciizConstructUTF8(realName);
       UserClass* cl = bootstrapLoader->loadName(utf8, true, true);
       cl->setOwnerClass(JavaThread::get());
       M->compileClass(cl);
@@ -1623,3 +1630,34 @@
   sign->getVirtualCallBuf();
   // getVirtualCallAP();
 }
+
+void JavaAOTCompiler::generateMain(const char* name, bool jit) {
+
+  // Type Definitions
+  std::vector<const Type*> FuncArgs;
+  FuncArgs.push_back(Type::Int32Ty);
+  FuncArgs.push_back(PointerType::getUnqual(JavaIntrinsics.ptrType));
+  
+  FunctionType* FuncTy = FunctionType::get(Type::Int32Ty, FuncArgs, false);
+
+  Function* MainFunc = Function::Create(FuncTy, GlobalValue::ExternalLinkage,
+                                        "main", TheModule);
+  BasicBlock* currentBlock = BasicBlock::Create("enter", MainFunc);
+  
+  Function::arg_iterator FuncVals = MainFunc->arg_begin();
+  Value* Argc = FuncVals++;
+  Value* Argv = FuncVals++;
+  Value* Args[3] = { Argc, Argv, ConstantArray::get(name, true) };
+
+  FuncArgs.push_back(Args[2]->getType());
+
+  FuncTy = FunctionType::get(Type::Int32Ty, FuncArgs, false);
+
+  Function* CalledFunc = 
+    Function::Create(FuncTy, GlobalValue::ExternalLinkage,
+                     jit ? "StartWithJIT" : "StartWithoutJIT", TheModule);
+
+  Value* res = CallInst::Create(CalledFunc, Args, Args + 3, "", currentBlock);
+  ReturnInst::Create(res, currentBlock);
+
+}

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp Wed Apr  1 07:30:47 2009
@@ -13,6 +13,10 @@
 #include "llvm/Instructions.h"
 #include "llvm/Module.h"
 #include "llvm/ExecutionEngine/ExecutionEngine.h"
+#include "llvm/Support/ManagedStatic.h"
+
+#include "MvmGC.h"
+#include "mvm/VirtualMachine.h"
 
 #include "JavaConstantPool.h"
 #include "JavaThread.h"
@@ -210,3 +214,26 @@
 
   return res;
 }
+
+// Helper function to run an executable with a JIT
+extern "C" int StartJnjvmWithJIT(int argc, char** argv, char* mainClass) {
+  llvm::llvm_shutdown_obj X;  
+   
+  mvm::MvmModule::initialise();
+  mvm::Object::initialise();
+  Collector::initialise(0);
+ 
+  char** newArgv = new char*[argc + 1];
+  memcpy(newArgv, argv, argc * sizeof(void*));
+  newArgv[argc] = mainClass;
+
+  JavaJITCompiler* Comp = new JavaJITCompiler("JITModule");
+  mvm::MvmModule::AddStandardCompilePasses();
+  JnjvmClassLoader* JCL = mvm::VirtualMachine::initialiseJVM(Comp);
+  mvm::VirtualMachine* vm = mvm::VirtualMachine::createJVM(JCL);
+  vm->runApplication(argc + 1, newArgv);
+  vm->waitForExit();
+  
+  delete newArgv;
+  return 0; 
+}

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Wed Apr  1 07:30:47 2009
@@ -19,6 +19,7 @@
 #include "debug.h"
 
 #include "mvm/Threads/Thread.h"
+#include "MvmGC.h"
 
 #include "ClasspathReflect.h"
 #include "JavaArray.h"
@@ -1121,3 +1122,23 @@
   }
   FunctionMapLock.release();
 }
+
+// Helper function to run Jnjvm without JIT.
+extern "C" int StartJnjvmWithoutJIT(int argc, char** argv, char* mainClass) {
+  mvm::Object::initialise();
+  Collector::initialise(0);
+  
+  char** newArgv = new char*[argc + 1];
+  memcpy(newArgv, argv, argc * sizeof(void*));
+  newArgv[argc] = mainClass;
+ 
+  JavaCompiler* Comp = new JavaCompiler();
+  JnjvmClassLoader* JCL = mvm::VirtualMachine::initialiseJVM(Comp);
+  mvm::VirtualMachine* vm = mvm::VirtualMachine::createJVM(JCL);
+  vm->runApplication(argc + 1, newArgv);
+  vm->waitForExit();
+
+  delete newArgv;
+  
+  return 0; 
+}

Modified: vmkit/trunk/tools/vmjc/vmjc.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmjc/vmjc.cpp?rev=68202&r1=68201&r2=68202&view=diff

==============================================================================
--- vmkit/trunk/tools/vmjc/vmjc.cpp (original)
+++ vmkit/trunk/tools/vmjc/vmjc.cpp Wed Apr  1 07:30:47 2009
@@ -64,6 +64,12 @@
 static cl::opt<bool>
 Force("f", cl::desc("Overwrite output files"));
 
+static cl::opt<std::string>
+MainClass("main", cl::desc("Specify main class"));
+
+static cl::opt<bool>
+WithJIT("with-jit", cl::desc("Generate main function with JIT support"));
+
 static cl::opt<bool>
 DontPrint("disable-output", cl::desc("Don't output the .ll file"), cl::Hidden);
 
@@ -219,6 +225,11 @@
     if (AssumeCompiled) MAOT->assumeCompiled = true;
     MAOT->compileFile(JCL, InputFilename.c_str());
 
+    if (!MainClass.empty()) {
+      MAOT->generateMain(MainClass.c_str(), WithJIT);
+    }
+
+
     if (DontPrint) {
       // Just use stdout.  We won't actually print anything on it.
     } else if (OutputFilename != "") {   // Specified an output filename?





More information about the vmkit-commits mailing list