aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorAndrew Kaylor <andrew.kaylor@intel.com>2013-10-02 18:04:40 +0000
committerAndrew Kaylor <andrew.kaylor@intel.com>2013-10-02 18:04:40 +0000
commitf18815607a93f2b9d498aad4c8e13d1265e204ef (patch)
tree1348cc5474220edd8961847c77859c060b18395b /tools
parent56849e7a9daaf1de00ab2b24c0a62a93add7eb4d (diff)
downloadexternal_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')
-rw-r--r--tools/lli/lli.cpp80
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;
}