X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Flli%2Flli.cpp;h=fda55e4b575649706d8e5bd610fd7b5292566b0b;hb=aa5b9c0f6f3a99f955fe0ded13d61d7eb4e1a0b5;hp=13472214dfbd5303e5d6804e353b7975c27ec56f;hpb=9fbb01240448f580f0689fee455c8a19cb44ddde;p=oota-llvm.git diff --git a/tools/lli/lli.cpp b/tools/lli/lli.cpp index 13472214dfb..fda55e4b575 100644 --- a/tools/lli/lli.cpp +++ b/tools/lli/lli.cpp @@ -22,6 +22,7 @@ #include "llvm/CodeGen/LinkAllCodegenComponents.h" #include "llvm/ExecutionEngine/GenericValue.h" #include "llvm/ExecutionEngine/Interpreter.h" +#include "llvm/ExecutionEngine/JIT.h" #include "llvm/ExecutionEngine/JITEventListener.h" #include "llvm/ExecutionEngine/JITMemoryManager.h" #include "llvm/ExecutionEngine/MCJIT.h" @@ -75,6 +76,10 @@ namespace { cl::desc("Force interpretation: disable JIT"), cl::init(false)); + cl::opt UseMCJIT( + "use-mcjit", cl::desc("Enable use of the MC-based JIT (if available)"), + cl::init(false)); + cl::opt DebugIR( "debug-ir", cl::desc("Generate debug information to allow debugging IR."), cl::init(false)); @@ -400,9 +405,12 @@ int main(int argc, char **argv, char * const *envp) { } if (EnableCacheManager) { - std::string CacheName("file:"); - CacheName.append(InputFile); - Mod->setModuleIdentifier(CacheName); + if (UseMCJIT) { + std::string CacheName("file:"); + CacheName.append(InputFile); + Mod->setModuleIdentifier(CacheName); + } else + errs() << "warning: -enable-cache-manager can only be used with MCJIT."; } // If not jitting lazily, load the whole bitcode file eagerly too. @@ -415,6 +423,12 @@ int main(int argc, char **argv, char * const *envp) { } if (DebugIR) { + if (!UseMCJIT) { + errs() << "warning: -debug-ir used without -use-mcjit. Only partial debug" + << " information will be emitted by the non-MC JIT engine. To see full" + << " source debug information, enable the flag '-use-mcjit'.\n"; + + } ModulePass *DebugIRPass = createDebugIRPass(); DebugIRPass->runOnModule(*Mod); } @@ -437,7 +451,8 @@ int main(int argc, char **argv, char * const *envp) { // Enable MCJIT if desired. RTDyldMemoryManager *RTDyldMM = nullptr; - if (!ForceInterpreter) { + if (UseMCJIT && !ForceInterpreter) { + builder.setUseMCJIT(true); if (RemoteMCJIT) RTDyldMM = new RemoteMemoryManager(); else @@ -502,9 +517,12 @@ int main(int argc, char **argv, char * const *envp) { return 1; } if (EnableCacheManager) { - std::string CacheName("file:"); - CacheName.append(ExtraModules[i]); - XMod->setModuleIdentifier(CacheName); + if (UseMCJIT) { + std::string CacheName("file:"); + CacheName.append(ExtraModules[i]); + XMod->setModuleIdentifier(CacheName); + } + // else, we already printed a warning above. } EE->addModule(XMod); } @@ -593,12 +611,20 @@ int main(int argc, char **argv, char * const *envp) { NULL); // Run static constructors. - if (!ForceInterpreter) { + if (UseMCJIT && !ForceInterpreter) { // Give MCJIT a chance to apply relocations and set page permissions. EE->finalizeObject(); } EE->runStaticConstructorsDestructors(false); + if (!UseMCJIT && NoLazyCompilation) { + for (Module::iterator I = Mod->begin(), E = Mod->end(); I != E; ++I) { + Function *Fn = &*I; + if (Fn != EntryFn && !Fn->isDeclaration()) + EE->getPointerToFunction(Fn); + } + } + // Trigger compilation separately so code regions that need to be // invalidated will be known. (void)EE->getPointerToFunction(EntryFn);