X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Flli%2Flli.cpp;h=67b1424d839fa1a5315e0932dded192f84f0d2d4;hb=cb41e6bf52e51b2cbf6871f63785af1c12a5fe70;hp=3ce28077aee2659ae9d68df438906dda58cf86f5;hpb=a99be51bf5cdac1438069d4b01766c47704961c8;p=oota-llvm.git diff --git a/tools/lli/lli.cpp b/tools/lli/lli.cpp index 3ce28077aee..67b1424d839 100644 --- a/tools/lli/lli.cpp +++ b/tools/lli/lli.cpp @@ -2,8 +2,8 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // @@ -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("disable-lazy-compilation", + cl::desc("Disable JIT lazy compilation"), + cl::init(false)); } static ExecutionEngine *EE = 0; @@ -67,7 +72,7 @@ static void do_shutdown() { int main(int argc, char **argv, char * const *envp) { atexit(do_shutdown); // Call llvm_shutdown() on exit. cl::ParseCommandLineOptions(argc, argv, - " llvm interpreter & dynamic compiler\n"); + "llvm interpreter & dynamic compiler\n"); sys::PrintStackTraceOnErrorSignal(); // If the user doesn't want core files, disable them. @@ -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);