X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Flli%2Flli.cpp;h=67b1424d839fa1a5315e0932dded192f84f0d2d4;hb=cb41e6bf52e51b2cbf6871f63785af1c12a5fe70;hp=1013651ffa75002811e09db9df38560dc7b58018;hpb=21c62da287237d39d0d95004881ea4baae3be6da;p=oota-llvm.git diff --git a/tools/lli/lli.cpp b/tools/lli/lli.cpp index 1013651ffa7..67b1424d839 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("disable-lazy-compilation", + 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);