From f18815607a93f2b9d498aad4c8e13d1265e204ef Mon Sep 17 00:00:00 2001 From: Andrew Kaylor Date: Wed, 2 Oct 2013 18:04:40 +0000 Subject: [PATCH] Clean up lli execution code git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191845 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/lli/lli.cpp | 80 ++++++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/tools/lli/lli.cpp b/tools/lli/lli.cpp index 17b8ea79930..05bf4ec1913 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(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(Exit)) { + std::vector 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(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"; + // Like static constructors, the remote target MCJIT support doesn't handle + // this yet. It could. FIXME. + + // Stop the remote target 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(RTDyldMM)->invalidateInstructionCache(); - - // Run main. - Result = EE->runFunctionAsMain(EntryFn, InputArgv, envp); } - // 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(Exit)) { - std::vector 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; }