[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