For PR351:
authorReid Spencer <rspencer@reidspencer.com>
Thu, 22 Dec 2005 20:00:16 +0000 (20:00 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Thu, 22 Dec 2005 20:00:16 +0000 (20:00 +0000)
* Allow the ExecuteAndWait to return negative values if a signal is
  detected as the reason for the child termination. This is needed to
  support bugpoint detecting bad things in its child processes.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24960 91177308-0d34-0410-b5e6-96231b3b80d8

lib/System/Unix/Program.inc

index 8aa0705726ba6eb5379ba9e44e9ed531796878a4..47810bdbeba72eba13eb0774000600eb385d36c1 100644 (file)
@@ -209,17 +209,22 @@ Program::ExecuteAndWait(const Path& path,
     sigaction(SIGALRM, &Old, 0);
   }
 
-  // If the program exited normally with a zero exit status, return success!
+  // Return the proper exit status. 0=success, >0 is programs' exit status,
+  // <0 means a signal was returned, -9999999 means the program dumped core.
+  int result = 0;
   if (WIFEXITED (status))
-    return WEXITSTATUS(status);
+    result = WEXITSTATUS(status);
   else if (WIFSIGNALED(status))
-    return 1;
-    
+    result = 0 - WTERMSIG(status);
+#ifdef WCOREDUMP
+  if (WCOREDUMP(status))
+    result |= 0x01000000;
+#endif
+  return result;
 #else
-  throw std::string(
-    "Program::ExecuteAndWait not implemented on this platform!\n");
+  return -99;
 #endif
-  return 0;
+    
 }
 
 }