llvmc: Make segfault detection work on Win32.
authorMikhail Glushenkov <foldr@codedgers.com>
Thu, 20 May 2010 19:23:47 +0000 (19:23 +0000)
committerMikhail Glushenkov <foldr@codedgers.com>
Thu, 20 May 2010 19:23:47 +0000 (19:23 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@104261 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CompilerDriver/Action.cpp

index 8c63a4da53ef08a8e8b2e478f40d6e681440bcaa..5917af6faae508cf6bb79d229d5a0402eaafe705 100644 (file)
@@ -33,8 +33,27 @@ extern const char* ProgramName;
 }
 
 namespace {
-  int ExecuteProgram(const std::string& name,
-                     const StrVector& args) {
+
+  void PrintString (const std::string& str) {
+    errs() << str << ' ';
+  }
+
+  void PrintCommand (const std::string& Cmd, const StrVector& Args) {
+    errs() << Cmd << " ";
+    std::for_each(Args.begin(), Args.end(), &PrintString);
+    errs() << '\n';
+  }
+
+  bool IsSegmentationFault (int returnCode) {
+#ifdef LLVM_ON_WIN32
+    return (returnCode >= 0xc0000000UL)
+#else
+    return (returnCode < 0);
+#endif
+  }
+
+  int ExecuteProgram (const std::string& name,
+                      const StrVector& args) {
     sys::Path prog = sys::Program::FindProgramByName(name);
 
     if (prog.isEmpty()) {
@@ -69,35 +88,23 @@ namespace {
     // Invoke the program.
     int ret = sys::Program::ExecuteAndWait(prog, &argv[0], 0, &redirects[0]);
 
-    if (ret < 0) {
-      const char** B = &argv[0];
-
+    if (IsSegmentationFault(ret)) {
       errs() << "Segmentation fault:";
-      while (*B)
-        errs() << ' ' << *(B++);
-      errs() << '\n';
-
-      return 1;
+      PrintCommand(name, args);
     }
 
     return ret;
   }
-
-  void print_string (const std::string& str) {
-    errs() << str << ' ';
-  }
 }
 
 namespace llvmc {
-  void AppendToGlobalTimeLog(const std::string& cmd, double time);
+  void AppendToGlobalTimeLog (const std::string& cmd, double time);
 }
 
-int llvmc::Action::Execute() const {
-  if (DryRun || VerboseMode) {
-    errs() << Command_ << " ";
-    std::for_each(Args_.begin(), Args_.end(), print_string);
-    errs() << '\n';
-  }
+int llvmc::Action::Execute () const {
+  if (DryRun || VerboseMode)
+    PrintCommand(Command_, Args_);
+
   if (!DryRun) {
     if (Time) {
       sys::TimeValue now = sys::TimeValue::now();