From c290a5b9ffa6ade5a02e9d8c46fc521a5b71529e Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Tue, 22 Apr 2008 06:51:41 +0000 Subject: [PATCH] Added command line option -no-lazy to disable JIT lazy compilation. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50095 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/lli/lli.cpp | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/tools/lli/lli.cpp b/tools/lli/lli.cpp index 1013651ffa7..5d34d9f1dd7 100644 --- a/tools/lli/lli.cpp +++ b/tools/lli/lli.cpp @@ -52,6 +52,11 @@ namespace { cl::opt DisableCoreFiles("disable-core-files", cl::Hidden, cl::desc("Disable emission of core files if possible")); + + cl::opt + NoLazyCompilation("no-lazy", + cl::desc("Disable JIT lazy compilation"), + cl::init(false)); } static ExecutionEngine *EE = 0; @@ -76,8 +81,8 @@ int main(int argc, char **argv, char * const *envp) { // Load the bitcode... std::string ErrorMsg; - ModuleProvider *MP = 0; - if (MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFile,&ErrorMsg)){ + ModuleProvider *MP = NULL; + if (MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFile,&ErrorMsg)) { MP = getBitcodeModuleProvider(Buffer, &ErrorMsg); if (!MP) delete Buffer; } @@ -89,18 +94,27 @@ int main(int argc, char **argv, char * const *envp) { } // Get the module as the MP could go away once EE takes over. - Module *Mod = MP->getModule(); + Module *Mod = NoLazyCompilation + ? MP->materializeModule(&ErrorMsg) : MP->getModule(); + if (!Mod) { + std::cerr << argv[0] << ": bitcode didn't read correctly.\n"; + std::cerr << "Reason: " << ErrorMsg << "\n"; + exit(1); + } // If we are supposed to override the target triple, do so now. if (!TargetTriple.empty()) Mod->setTargetTriple(TargetTriple); - + EE = ExecutionEngine::create(MP, ForceInterpreter, &ErrorMsg); if (!EE && !ErrorMsg.empty()) { std::cerr << argv[0] << ":error creating EE: " << ErrorMsg << "\n"; exit(1); } + if (NoLazyCompilation) + EE->DisableLazyCompilation(); + // If the user specifically requested an argv[0] to pass into the program, // do it now. if (!FakeArgv0.empty()) { @@ -120,8 +134,8 @@ int main(int argc, char **argv, char * const *envp) { // using the contents of Args to determine argc & argv, and the contents of // EnvVars to determine envp. // - Function *Fn = Mod->getFunction("main"); - if (!Fn) { + Function *MainFn = Mod->getFunction("main"); + if (!MainFn) { std::cerr << "'main' function not found in module.\n"; return -1; } @@ -136,9 +150,17 @@ int main(int argc, char **argv, char * const *envp) { // Run static constructors. EE->runStaticConstructorsDestructors(false); - + + if (NoLazyCompilation) { + for (Module::iterator I = Mod->begin(), E = Mod->end(); I != E; ++I) { + Function *Fn = &*I; + if (Fn != MainFn && !Fn->isDeclaration()) + EE->getPointerToFunction(Fn); + } + } + // Run main. - int Result = EE->runFunctionAsMain(Fn, InputArgv, envp); + int Result = EE->runFunctionAsMain(MainFn, InputArgv, envp); // Run static destructors. EE->runStaticConstructorsDestructors(true);