[llvm-commits] [llvm] r104261 - /llvm/trunk/lib/CompilerDriver/Action.cpp

Mikhail Glushenkov foldr at codedgers.com
Thu May 20 12:23:48 PDT 2010


Author: foldr
Date: Thu May 20 14:23:47 2010
New Revision: 104261

URL: http://llvm.org/viewvc/llvm-project?rev=104261&view=rev
Log:
llvmc: Make segfault detection work on Win32.

Modified:
    llvm/trunk/lib/CompilerDriver/Action.cpp

Modified: llvm/trunk/lib/CompilerDriver/Action.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CompilerDriver/Action.cpp?rev=104261&r1=104260&r2=104261&view=diff
==============================================================================
--- llvm/trunk/lib/CompilerDriver/Action.cpp (original)
+++ llvm/trunk/lib/CompilerDriver/Action.cpp Thu May 20 14:23:47 2010
@@ -33,8 +33,27 @@
 }
 
 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 @@
     // 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();





More information about the llvm-commits mailing list