fix atexit. This is an overcomplex way of calling exit, but it is required,
authorChris Lattner <sabre@nondot.org>
Mon, 8 Jan 2007 07:36:34 +0000 (07:36 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 8 Jan 2007 07:36:34 +0000 (07:36 +0000)
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

tools/lli/lli.cpp

index 998e7616813a94823a1eb637c2d705b0d02b64ea..9f1ecc2978b91dae16ced9b5b02e8fd3b8682e9f 100644 (file)
@@ -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 (...) {