diff options
author | Andrew Kaylor <andrew.kaylor@intel.com> | 2013-10-02 18:04:40 +0000 |
---|---|---|
committer | Andrew Kaylor <andrew.kaylor@intel.com> | 2013-10-02 18:04:40 +0000 |
commit | f18815607a93f2b9d498aad4c8e13d1265e204ef (patch) | |
tree | 1348cc5474220edd8961847c77859c060b18395b /tools/lli | |
parent | 56849e7a9daaf1de00ab2b24c0a62a93add7eb4d (diff) | |
download | external_llvm-f18815607a93f2b9d498aad4c8e13d1265e204ef.zip external_llvm-f18815607a93f2b9d498aad4c8e13d1265e204ef.tar.gz external_llvm-f18815607a93f2b9d498aad4c8e13d1265e204ef.tar.bz2 |
Clean up lli execution code
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191845 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/lli')
-rw-r--r-- | tools/lli/lli.cpp | 80 |
1 files changed, 41 insertions, 39 deletions
diff --git a/tools/lli/lli.cpp b/tools/lli/lli.cpp index 17b8ea7..05bf4ec 100644 --- a/tools/lli/lli.cpp +++ b/tools/lli/lli.cpp @@ -467,12 +467,10 @@ int main(int argc, char **argv, char * const *envp) { // Reset errno to zero on entry to main. errno = 0; - // Remote target MCJIT doesn't (yet) support static constructors. No reason - // it couldn't. This is a limitation of the LLI implemantation, not the - // MCJIT itself. FIXME. - // - // Run static constructors. + int Result; + if (!RemoteMCJIT) { + // Run static constructors. if (UseMCJIT && !ForceInterpreter) { // Give MCJIT a chance to apply relocations and set page permissions. EE->finalizeObject(); @@ -486,10 +484,41 @@ int main(int argc, char **argv, char * const *envp) { EE->getPointerToFunction(Fn); } } - } - int Result; - if (RemoteMCJIT) { + // Trigger compilation separately so code regions that need to be + // invalidated will be known. + (void)EE->getPointerToFunction(EntryFn); + // Clear instruction cache before code will be executed. + if (RTDyldMM) + static_cast<SectionMemoryManager*>(RTDyldMM)->invalidateInstructionCache(); + + // Run main. + Result = EE->runFunctionAsMain(EntryFn, InputArgv, envp); + + // Run static destructors. + EE->runStaticConstructorsDestructors(true); + + // If the program didn't call exit explicitly, we should call it now. + // This ensures that any atexit handlers get called correctly. + if (Function *ExitF = dyn_cast<Function>(Exit)) { + std::vector<GenericValue> Args; + GenericValue ResultGV; + ResultGV.IntVal = APInt(32, Result); + Args.push_back(ResultGV); + EE->runFunction(ExitF, Args); + errs() << "ERROR: exit(" << Result << ") returned!\n"; + abort(); + } else { + errs() << "ERROR: exit defined with wrong prototype!\n"; + abort(); + } + } else { + // else == "if (RemoteMCJIT)" + + // Remote target MCJIT doesn't (yet) support static constructors. No reason + // it couldn't. This is a limitation of the LLI implemantation, not the + // MCJIT itself. FIXME. + // RecordingMemoryManager *MM = static_cast<RecordingMemoryManager*>(RTDyldMM); // Everything is prepared now, so lay out our program for the target // address space, assign the section addresses to resolve any relocations, @@ -536,39 +565,12 @@ int main(int argc, char **argv, char * const *envp) { if (Target->executeCode(Entry, Result)) errs() << "ERROR: " << Target->getErrorMsg() << "\n"; - Target->stop(); - } else { // !RemoteMCJIT - // Trigger compilation separately so code regions that need to be - // invalidated will be known. - (void)EE->getPointerToFunction(EntryFn); - // Clear instruction cache before code will be executed. - if (RTDyldMM) - static_cast<SectionMemoryManager*>(RTDyldMM)->invalidateInstructionCache(); + // Like static constructors, the remote target MCJIT support doesn't handle + // this yet. It could. FIXME. - // Run main. - Result = EE->runFunctionAsMain(EntryFn, InputArgv, envp); + // Stop the remote target + Target->stop(); } - // Like static constructors, the remote target MCJIT support doesn't handle - // this yet. It could. FIXME. - if (!RemoteMCJIT) { - // Run static destructors. - EE->runStaticConstructorsDestructors(true); - - // If the program didn't call exit explicitly, we should call it now. - // This ensures that any atexit handlers get called correctly. - if (Function *ExitF = dyn_cast<Function>(Exit)) { - std::vector<GenericValue> Args; - GenericValue ResultGV; - ResultGV.IntVal = APInt(32, Result); - Args.push_back(ResultGV); - EE->runFunction(ExitF, Args); - errs() << "ERROR: exit(" << Result << ") returned!\n"; - abort(); - } else { - errs() << "ERROR: exit defined with wrong prototype!\n"; - abort(); - } - } return Result; } |