[vmkit-commits] [vmkit] r59811 - in /vmkit/trunk: include/mvm/CompilationUnit.h lib/JnJVM/VMCore/JavaClass.cpp lib/JnJVM/VMCore/JavaConstantPool.cpp lib/JnJVM/VMCore/Jnjvm.cpp lib/JnJVM/VMCore/JnjvmClassLoader.cpp lib/JnJVM/VMCore/JnjvmClassLoader.h lib/JnJVM/VMCore/JnjvmModule.cpp lib/JnJVM/VMCore/JnjvmModuleProvider.cpp lib/JnJVM/VMCore/JnjvmModuleProvider.h lib/Mvm/Runtime/JIT.cpp tools/jnjvm/Main.cpp tools/vmkit/Launcher.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Fri Nov 21 03:09:33 PST 2008
Author: geoffray
Date: Fri Nov 21 05:09:26 2008
New Revision: 59811
URL: http://llvm.org/viewvc/llvm-project?rev=59811&view=rev
Log:
Let the tool decide which optimization level it wants:
o jnjvm always uses the std-compile-opts.
o vmkit takes the passes as command line arguments.
Modified:
vmkit/trunk/include/mvm/CompilationUnit.h
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h
vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h
vmkit/trunk/lib/Mvm/Runtime/JIT.cpp
vmkit/trunk/tools/jnjvm/Main.cpp
vmkit/trunk/tools/vmkit/Launcher.cpp
Modified: vmkit/trunk/include/mvm/CompilationUnit.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/CompilationUnit.h?rev=59811&r1=59810&r2=59811&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/CompilationUnit.h (original)
+++ vmkit/trunk/include/mvm/CompilationUnit.h Fri Nov 21 05:09:26 2008
@@ -18,6 +18,7 @@
#include "mvm/Object.h"
namespace llvm {
+ class FunctionPassManager;
class Module;
class ModuleProvider;
}
@@ -27,6 +28,10 @@
class CompilationUnit : public mvm::Object {
public:
llvm::Module* TheModule;
+ llvm::ModuleProvider* TheModuleProvider;
+ llvm::FunctionPassManager* FunctionPasses;
+
+ void AddStandardCompilePasses();
};
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=59811&r1=59810&r2=59811&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Fri Nov 21 05:09:26 2008
@@ -387,7 +387,7 @@
classDef->acquire();
if (code == 0) {
code =
- classDef->classLoader->TheModuleProvider->materializeFunction(this);
+ classDef->classLoader->getModuleProvider()->materializeFunction(this);
}
classDef->release();
return code;
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp?rev=59811&r1=59810&r2=59811&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Fri Nov 21 05:09:26 2008
@@ -427,8 +427,9 @@
if (isStatic(access) && ctpRes[index]) return ctpRes[index];
void* val =
- classDef->classLoader->TheModuleProvider->addCallback(classDef, index, sign,
- isStatic(access));
+ classDef->classLoader->getModuleProvider()->addCallback(classDef, index,
+ sign,
+ isStatic(access));
if (isStatic(access)) ctpRes[index] = val;
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=59811&r1=59810&r2=59811&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Fri Nov 21 05:09:26 2008
@@ -997,13 +997,13 @@
for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) {
JavaMethod& meth = cl->virtualMethods[i];
if (!isAbstract(meth.access))
- cl->classLoader->TheModuleProvider->parseFunction(&meth);
+ cl->classLoader->getModuleProvider()->parseFunction(&meth);
}
for (uint32 i = 0; i < cl->nbStaticMethods; ++i) {
JavaMethod& meth = cl->staticMethods[i];
if (!isAbstract(meth.access))
- cl->classLoader->TheModuleProvider->parseFunction(&meth);
+ cl->classLoader->getModuleProvider()->parseFunction(&meth);
}
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=59811&r1=59810&r2=59811&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Fri Nov 21 05:09:26 2008
@@ -7,10 +7,18 @@
//
//===----------------------------------------------------------------------===//
-#include <dlfcn.h>
-#include <limits.h>
-#include <unistd.h>
+#include <climits>
+#include <cstdlib>
+#include <cstring>
+
+// for dlopen and dlsym
+#include <dlfcn.h>
+
+// for stat, S_IFMT and S_IFDIR
+#include <sys/types.h>
#include <sys/stat.h>
+#include <unistd.h>
+
#if defined(__MACH__)
@@ -45,7 +53,9 @@
TheModule = new JnjvmModule("Bootstrap JnJVM");
getModule()->setIsStaticCompiling(staticCompilation);
TheModuleProvider = new JnjvmModuleProvider(getModule());
-
+ FunctionPasses = new FunctionPassManager(TheModuleProvider);
+ FunctionPasses->add(new TargetData(TheModule));
+
hashUTF8 = new(allocator) UTF8Map(allocator, 0);
classes = new(allocator) ClassMap();
javaTypes = new(allocator) TypeMap();
@@ -226,6 +236,7 @@
TheModule = new JnjvmModule("Applicative loader");
TheModuleProvider = new JnjvmModuleProvider(getModule());
bootstrapLoader = JCL.bootstrapLoader;
+ FunctionPasses = bootstrapLoader->FunctionPasses;
hashUTF8 = new(allocator) UTF8Map(allocator,
bootstrapLoader->upcalls->ArrayOfChar);
@@ -593,6 +604,11 @@
delete TheModuleProvider;
}
+
+JnjvmBootstrapLoader::~JnjvmBootstrapLoader() {
+ delete FunctionPasses;
+}
+
JavaString* JnjvmClassLoader::UTF8ToStr(const UTF8* val) {
JavaString* res = isolate->internalUTF8ToStr(val);
strings.push_back(res);
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=59811&r1=59810&r2=59811&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Fri Nov 21 05:09:26 2008
@@ -118,7 +118,9 @@
/// TheModuleProvider - JIT module provider for dynamic class loading and
/// lazy compilation.
///
- JnjvmModuleProvider* TheModuleProvider;
+ JnjvmModuleProvider* getModuleProvider() {
+ return (JnjvmModuleProvider*)TheModuleProvider;
+ }
/// tracer - Traces a JnjvmClassLoader for GC.
///
@@ -211,6 +213,7 @@
TheModuleProvider = 0;
isolate = 0;
classes = 0;
+ FunctionPasses = 0;
}
/// loadClass - The user class that defines the loadClass method.
@@ -368,6 +371,8 @@
UserClassArray* getArrayClass(unsigned id) {
return arrayTable[id - 4];
}
+
+ ~JnjvmBootstrapLoader();
};
} // end namespace jnjvm
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=59811&r1=59810&r2=59811&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Fri Nov 21 05:09:26 2008
@@ -404,7 +404,8 @@
#ifdef ISOLATE_SHARING
((void**)VT)[0] = 0;
#else
- Function* func = cl->classLoader->TheModuleProvider->parseFunction(&meth);
+ JnjvmClassLoader* loader = cl->classLoader;
+ Function* func = loader->getModuleProvider()->parseFunction(&meth);
if (!cl->super) meth.canBeInlined = true;
Function::iterator BB = func->begin();
BasicBlock::iterator I = BB->begin();
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp?rev=59811&r1=59810&r2=59811&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Fri Nov 21 05:09:26 2008
@@ -8,8 +8,6 @@
//===----------------------------------------------------------------------===//
#include "llvm/LinkAllPasses.h"
-#include "llvm/Analysis/LoopPass.h"
-#include "llvm/Analysis/Verifier.h"
#include "llvm/Support/MutexGuard.h"
#include "mvm/JIT.h"
@@ -127,10 +125,12 @@
JavaJIT jit(meth, func);
if (isNative(meth->access)) {
jit.nativeCompile();
- mvm::MvmModule::runPasses(func, perNativeFunctionPasses);
+ mvm::MvmModule::runPasses(func, JavaNativeFunctionPasses);
} else {
jit.javaCompile();
- mvm::MvmModule::runPasses(func, perFunctionPasses);
+ JnjvmClassLoader* loader = meth->classDef->classLoader;
+ mvm::MvmModule::runPasses(func, loader->FunctionPasses);
+ mvm::MvmModule::runPasses(func, JavaFunctionPasses);
}
}
return func;
@@ -170,87 +170,28 @@
llvm::FunctionPass* createLowerForcedCallsPass();
}
-static void addPass(FunctionPassManager *PM, Pass *P) {
- // Add the pass to the pass manager...
- PM->add(P);
-}
-
-// This is equivalent to:
-// opt -simplifycfg -mem2reg -instcombine -jump-threading -scalarrepl -instcombine
-// -condprop -simplifycfg -reassociate -licm essai.bc -loop-unswitch
-// -indvars -loop-unroll -instcombine -gvn -sccp -simplifycfg
-// -instcombine -condprop -dse -adce -simplifycfg
-//
-static void AddStandardCompilePasses(JnjvmModule* mod, FunctionPassManager *PM) {
- llvm::MutexGuard locked(mvm::MvmModule::executionEngine->lock);
-
- // TODO: enable this when
- // - we can call multiple times the makeLLVMModuleContents function generated
- // by llc -march=cpp -cppgen=contents
- // - intrinsics won't be in the .ll files
- // - each module will have its declaration of external functions
- //
- //PM->add(llvm::createVerifierPass()); // Verify that input is correct
-
- addPass(PM, llvm::createCFGSimplificationPass()); // Clean up disgusting code
- addPass(PM, llvm::createPromoteMemoryToRegisterPass());// Kill useless allocas
-
- addPass(PM, createInstructionCombiningPass()); // Cleanup for scalarrepl.
- addPass(PM, createJumpThreadingPass()); // Thread jumps.
- addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs
- addPass(PM, createScalarReplAggregatesPass()); // Break up aggregate allocas
- addPass(PM, createInstructionCombiningPass()); // Combine silly seq's
- addPass(PM, createCondPropagationPass()); // Propagate conditionals
-
- addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs
- addPass(PM, createPredicateSimplifierPass());
- addPass(PM, createReassociatePass()); // Reassociate expressions
- addPass(PM, createLICMPass()); // Hoist loop invariants
-
- addPass(PM, createLoopUnswitchPass()); // Unswitch loops.
- addPass(PM, createIndVarSimplifyPass()); // Canonicalize indvars
- addPass(PM, createLoopDeletionPass()); // Delete dead loops
- addPass(PM, createLoopUnrollPass()); // Unroll small loops*/
- addPass(PM, createInstructionCombiningPass()); // Clean up after the unroller
- addPass(PM, createGVNPass()); // Remove redundancies
- addPass(PM, createSCCPPass()); // Constant prop with SCCP
- addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs
-
- Function* func = mod->JavaObjectAllocateFunction;
- addPass(PM, mvm::createEscapeAnalysisPass(func));
-
- // Do not do GVN after this pass: initialization checks could be removed.
- addPass(PM, mvm::createLowerConstantCallsPass());
-
- // Run instcombine after redundancy elimination to exploit opportunities
- // opened up by them.
- addPass(PM, createInstructionCombiningPass());
- addPass(PM, createCondPropagationPass()); // Propagate conditionals
-
- addPass(PM, createDeadStoreEliminationPass()); // Delete dead stores
- addPass(PM, createAggressiveDCEPass()); // Delete dead instructions
- addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs
-
-#ifndef ISOLATE
- if (mod->isStaticCompiling())
-#endif
- addPass(PM, mvm::createLowerForcedCallsPass()); // Remove forced initialization
-
-}
-
JnjvmModuleProvider::JnjvmModuleProvider(JnjvmModule *m) {
TheModule = (Module*)m;
mvm::MvmModule::protectEngine.lock();
mvm::MvmModule::executionEngine->addModuleProvider(this);
mvm::MvmModule::protectEngine.unlock();
- perFunctionPasses = new llvm::FunctionPassManager(this);
- perFunctionPasses->add(new llvm::TargetData(m));
- AddStandardCompilePasses(m, perFunctionPasses);
-
- perNativeFunctionPasses = new llvm::FunctionPassManager(this);
- perNativeFunctionPasses->add(new llvm::TargetData(m));
- addPass(perNativeFunctionPasses, createInstructionCombiningPass()); // Cleanup for scalarrepl.
- addPass(perNativeFunctionPasses, mvm::createLowerConstantCallsPass());
+
+ JavaNativeFunctionPasses = new llvm::FunctionPassManager(this);
+ JavaNativeFunctionPasses->add(new llvm::TargetData(m));
+ // Inst-combine for folding constant pointer classes.
+ JavaNativeFunctionPasses->add(llvm::createInstructionCombiningPass());
+ // Lower constant calls to lower things like getClass used
+ // on synchronized methods.
+ JavaNativeFunctionPasses->add(mvm::createLowerConstantCallsPass());
+
+ JavaFunctionPasses = new llvm::FunctionPassManager(this);
+ JavaFunctionPasses->add(new llvm::TargetData(m));
+ Function* func = m->JavaObjectAllocateFunction;
+ // Inst-combine for folding constant pointer classes.
+ JavaFunctionPasses->add(llvm::createInstructionCombiningPass());
+ JavaFunctionPasses->add(mvm::createEscapeAnalysisPass(func));
+ JavaFunctionPasses->add(mvm::createLowerConstantCallsPass());
+ JavaFunctionPasses->add(mvm::createLowerForcedCallsPass());
}
JnjvmModuleProvider::~JnjvmModuleProvider() {
@@ -258,6 +199,6 @@
mvm::MvmModule::executionEngine->removeModuleProvider(this);
mvm::MvmModule::protectEngine.unlock();
delete TheModule;
- delete perFunctionPasses;
- delete perNativeFunctionPasses;
+ delete JavaNativeFunctionPasses;
+ delete JavaFunctionPasses;
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h?rev=59811&r1=59810&r2=59811&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h Fri Nov 21 05:09:26 2008
@@ -26,8 +26,8 @@
private:
JavaMethod* staticLookup(Class* caller, uint32 index);
- llvm::FunctionPassManager* perFunctionPasses;
- llvm::FunctionPassManager* perNativeFunctionPasses;
+ llvm::FunctionPassManager* JavaFunctionPasses;
+ llvm::FunctionPassManager* JavaNativeFunctionPasses;
public:
Modified: vmkit/trunk/lib/Mvm/Runtime/JIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/JIT.cpp?rev=59811&r1=59810&r2=59811&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/Runtime/JIT.cpp (original)
+++ vmkit/trunk/lib/Mvm/Runtime/JIT.cpp Fri Nov 21 05:09:26 2008
@@ -11,12 +11,17 @@
#include <llvm/Constants.h>
#include <llvm/DerivedTypes.h>
#include <llvm/Instructions.h>
+#include "llvm/LinkAllPasses.h"
#include <llvm/Type.h>
+#include "llvm/Analysis/LoopPass.h"
+#include "llvm/Analysis/Verifier.h"
#include "llvm/Support/MutexGuard.h"
#include "llvm/Target/TargetOptions.h"
+
#include <cstdio>
+#include "mvm/CompilationUnit.h"
#include "mvm/JIT.h"
#include "mvm/MvmMemoryManager.h"
#include "mvm/Object.h"
@@ -324,3 +329,61 @@
pointerMap.insert(std::make_pair(Addr, F));
lock.unlock();
}
+
+
+
+static void addPass(FunctionPassManager *PM, Pass *P) {
+ // Add the pass to the pass manager...
+ PM->add(P);
+}
+
+// This is equivalent to:
+// opt -simplifycfg -mem2reg -instcombine -jump-threading -scalarrepl -instcombine
+// -condprop -simplifycfg -reassociate -licm essai.bc -loop-unswitch
+// -indvars -loop-unroll -instcombine -gvn -sccp -simplifycfg
+// -instcombine -condprop -dse -adce -simplifycfg
+//
+void CompilationUnit::AddStandardCompilePasses() {
+ // TODO: enable this when
+ // - we can call multiple times the makeLLVMModuleContents function generated
+ // by llc -march=cpp -cppgen=contents
+ // - intrinsics won't be in the .ll files
+ // - each module will have its declaration of external functions
+ //
+ //PM->add(llvm::createVerifierPass()); // Verify that input is correct
+
+ FunctionPassManager* PM = FunctionPasses;
+ addPass(PM, createCFGSimplificationPass()); // Clean up disgusting code
+ addPass(PM, createPromoteMemoryToRegisterPass());// Kill useless allocas
+
+ addPass(PM, createInstructionCombiningPass()); // Cleanup for scalarrepl.
+ addPass(PM, createJumpThreadingPass()); // Thread jumps.
+ addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs
+ addPass(PM, createScalarReplAggregatesPass()); // Break up aggregate allocas
+ addPass(PM, createInstructionCombiningPass()); // Combine silly seq's
+ addPass(PM, createCondPropagationPass()); // Propagate conditionals
+
+ addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs
+ addPass(PM, createPredicateSimplifierPass());
+ addPass(PM, createReassociatePass()); // Reassociate expressions
+ addPass(PM, createLICMPass()); // Hoist loop invariants
+
+ addPass(PM, createLoopUnswitchPass()); // Unswitch loops.
+ addPass(PM, createIndVarSimplifyPass()); // Canonicalize indvars
+ addPass(PM, createLoopDeletionPass()); // Delete dead loops
+ addPass(PM, createLoopUnrollPass()); // Unroll small loops*/
+ addPass(PM, createInstructionCombiningPass()); // Clean up after the unroller
+ addPass(PM, createGVNPass()); // Remove redundancies
+ addPass(PM, createSCCPPass()); // Constant prop with SCCP
+ addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs
+
+ // Run instcombine after redundancy elimination to exploit opportunities
+ // opened up by them.
+ addPass(PM, createInstructionCombiningPass());
+ addPass(PM, createCondPropagationPass()); // Propagate conditionals
+
+ addPass(PM, createDeadStoreEliminationPass()); // Delete dead stores
+ addPass(PM, createAggressiveDCEPass()); // Delete dead instructions
+ addPass(PM, createCFGSimplificationPass()); // Merge & remove BBs
+
+}
Modified: vmkit/trunk/tools/jnjvm/Main.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/jnjvm/Main.cpp?rev=59811&r1=59810&r2=59811&view=diff
==============================================================================
--- vmkit/trunk/tools/jnjvm/Main.cpp (original)
+++ vmkit/trunk/tools/jnjvm/Main.cpp Fri Nov 21 05:09:26 2008
@@ -15,6 +15,8 @@
#include "llvm/Support/ManagedStatic.h"
+
+using namespace llvm;
using namespace mvm;
int main(int argc, char **argv, char **envp) {
@@ -23,8 +25,9 @@
MvmModule::initialise();
Object::initialise();
Collector::initialise(0);
-
+
CompilationUnit* CU = VirtualMachine::initialiseJVM();
+ CU->AddStandardCompilePasses();
VirtualMachine* vm = VirtualMachine::createJVM(CU);
vm->runApplication(argc, argv);
vm->waitForExit();
Modified: vmkit/trunk/tools/vmkit/Launcher.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmkit/Launcher.cpp?rev=59811&r1=59810&r2=59811&view=diff
==============================================================================
--- vmkit/trunk/tools/vmkit/Launcher.cpp (original)
+++ vmkit/trunk/tools/vmkit/Launcher.cpp Fri Nov 21 05:09:26 2008
@@ -7,11 +7,12 @@
//
//===----------------------------------------------------------------------===//
-#include <dlfcn.h>
-
+#include "llvm/LinkAllPasses.h"
+#include "llvm/LinkAllVMCore.h"
#include "llvm/CodeGen/LinkAllCodegenComponents.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ManagedStatic.h"
+#include "llvm/Support/PassNameParser.h"
#include "MvmGC.h"
@@ -27,6 +28,14 @@
Interactive, RunJava, RunNet
};
+// The OptimizationList is automatically populated with registered Passes by the
+// PassNameParser.
+//
+static llvm::cl::list<const llvm::PassInfo*, bool, llvm::PassNameParser>
+PassList(llvm::cl::desc("Optimizations available:"));
+
+
+
static llvm::cl::opt<VMType> VMToRun(llvm::cl::desc("Choose VM to run:"),
llvm::cl::values(
clEnumValN(Interactive , "i", "Run in interactive mode"),
@@ -39,6 +48,58 @@
"potentially sacrificing code quality"),
cl::init(false));
+
+static cl::opt<bool>
+DisableOptimizations("disable-opt",
+ cl::desc("Do not run any optimization passes"));
+
+static cl::opt<bool>
+StandardCompileOpts("std-compile-opts",
+ cl::desc("Include the standard compile time optimizations"));
+
+inline void addPass(FunctionPassManager *PM, Pass *P) {
+ // Add the pass to the pass manager...
+ PM->add(P);
+}
+
+
+void addCommandLinePass(mvm::CompilationUnit* CU, char** argv) {
+ FunctionPassManager* Passes = CU->FunctionPasses;
+
+ // Create a new optimization pass for each one specified on the command line
+ for (unsigned i = 0; i < PassList.size(); ++i) {
+ // Check to see if -std-compile-opts was specified before this option. If
+ // so, handle it.
+ if (StandardCompileOpts &&
+ StandardCompileOpts.getPosition() < PassList.getPosition(i)) {
+ if (!DisableOptimizations) CU->AddStandardCompilePasses();
+ StandardCompileOpts = false;
+ }
+
+ const PassInfo *PassInf = PassList[i];
+ Pass *P = 0;
+ if (PassInf->getNormalCtor())
+ P = PassInf->getNormalCtor()();
+ else
+ cerr << argv[0] << ": cannot create pass: "
+ << PassInf->getPassName() << "\n";
+ if (P) {
+ bool isModulePass = dynamic_cast<ModulePass*>(P) != 0;
+ if (isModulePass)
+ cerr << argv[0] << ": vmkit does not support module pass: "
+ << PassInf->getPassName() << "\n";
+ else addPass(Passes, P);
+
+ }
+ }
+
+ // If -std-compile-opts was specified at the end of the pass list, add them.
+ if (StandardCompileOpts) {
+ CU->AddStandardCompilePasses();
+ }
+
+}
+
int found(char** argv, int argc, const char* name) {
int i = 1;
for (; i < argc; i++) {
@@ -65,10 +126,11 @@
mvm::MvmModule::initialise(Fast);
mvm::Object::initialise();
Collector::initialise(0);
-
+
if (VMToRun == RunJava) {
#if WITH_JNJVM
mvm::CompilationUnit* CU = mvm::VirtualMachine::initialiseJVM();
+ addCommandLinePass(CU, argv);
mvm::VirtualMachine* vm = mvm::VirtualMachine::createJVM(CU);
vm->runApplication(argc, argv);
vm->waitForExit();
@@ -85,6 +147,7 @@
#if WITH_JNJVM
mvm::CompilationUnit* JVMCompiler =
mvm::VirtualMachine::initialiseJVM();
+ addCommandLinePass(JVMCompiler, argv);
MyCl.vmlets["java"] = (mvm::VirtualMachine::createJVM);
MyCl.compilers["java"] = JVMCompiler;
#endif
More information about the vmkit-commits
mailing list