diff options
Diffstat (limited to 'llvm/tools/lli/lli.cpp')
-rw-r--r-- | llvm/tools/lli/lli.cpp | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/llvm/tools/lli/lli.cpp b/llvm/tools/lli/lli.cpp index d7b9368a327..36d7d98265e 100644 --- a/llvm/tools/lli/lli.cpp +++ b/llvm/tools/lli/lli.cpp @@ -595,8 +595,8 @@ int main(int argc, char **argv, char * const *envp) { if (!RemoteMCJIT) { // If the program doesn't explicitly call exit, we will need the Exit // function later on to make an explicit call, so get the function now. - Constant *Exit = Mod->getOrInsertFunction("exit", Type::getVoidTy(Context), - Type::getInt32Ty(Context)); + FunctionCallee Exit = Mod->getOrInsertFunction( + "exit", Type::getVoidTy(Context), Type::getInt32Ty(Context)); // Run static constructors. if (!ForceInterpreter) { @@ -620,19 +620,21 @@ int main(int argc, char **argv, char * const *envp) { // 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); - WithColor::error(errs(), argv[0]) << "exit(" << Result << ") returned!\n"; - abort(); - } else { - WithColor::error(errs(), argv[0]) - << "exit defined with wrong prototype!\n"; - abort(); + if (Function *ExitF = + dyn_cast<Function>(Exit.getCallee()->stripPointerCasts())) { + if (ExitF->getFunctionType() == Exit.getFunctionType()) { + std::vector<GenericValue> Args; + GenericValue ResultGV; + ResultGV.IntVal = APInt(32, Result); + Args.push_back(ResultGV); + EE->runFunction(ExitF, Args); + WithColor::error(errs(), argv[0]) + << "exit(" << Result << ") returned!\n"; + abort(); + } } + WithColor::error(errs(), argv[0]) << "exit defined with wrong prototype!\n"; + abort(); } else { // else == "if (RemoteMCJIT)" |