mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-08 06:32:24 +00:00
fix atexit. This is an overcomplex way of calling exit, but it is required,
as the jit intercepts exit calls to implement atexit handlers. This fixes SingleSource/UnitTests/2003-05-14-AtExit git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33008 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b801a27121
commit
c0974a1344
@ -118,9 +118,22 @@ int main(int argc, char **argv, char * const *envp) {
|
||||
// Run static destructors.
|
||||
EE->runStaticConstructorsDestructors(true);
|
||||
|
||||
exit(Result);
|
||||
std::cerr << "ERROR: exit(" << Result << ") returned!\n";
|
||||
abort();
|
||||
// If the program didn't explicitly call exit, call exit now, for the
|
||||
// program. This ensures that any atexit handlers get called correctly.
|
||||
Constant *Exit = MP->getModule()->getOrInsertFunction("exit", Type::VoidTy,
|
||||
Type::Int32Ty, NULL);
|
||||
if (Function *ExitF = dyn_cast<Function>(Exit)) {
|
||||
std::vector<GenericValue> Args;
|
||||
GenericValue ResultGV;
|
||||
ResultGV.Int32Val = Result;
|
||||
Args.push_back(ResultGV);
|
||||
EE->runFunction(ExitF, Args);
|
||||
std::cerr << "ERROR: exit(" << Result << ") returned!\n";
|
||||
abort();
|
||||
} else {
|
||||
std::cerr << "ERROR: exit defined with wrong prototype!\n";
|
||||
abort();
|
||||
}
|
||||
} catch (const std::string& msg) {
|
||||
std::cerr << argv[0] << ": " << msg << "\n";
|
||||
} catch (...) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user