[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