[llvm-commits] CVS: llvm/lib/Support/ToolRunner.cpp

Chris Lattner lattner at cs.uiuc.edu
Wed Feb 18 14:57:51 PST 2004


Changes in directory llvm/lib/Support:

ToolRunner.cpp updated: 1.16 -> 1.17

---
Log message:

If there is an error running a tool, include the error message (e.g. assertion failure) in the exception


---
Diffs of the changes:  (+32 -30)

Index: llvm/lib/Support/ToolRunner.cpp
diff -u llvm/lib/Support/ToolRunner.cpp:1.16 llvm/lib/Support/ToolRunner.cpp:1.17
--- llvm/lib/Support/ToolRunner.cpp:1.16	Wed Feb 18 14:21:57 2004
+++ llvm/lib/Support/ToolRunner.cpp	Wed Feb 18 14:38:00 2004
@@ -18,8 +18,34 @@
 #include "Support/FileUtilities.h"
 #include <iostream>
 #include <fstream>
+#include <sstream>
 using namespace llvm;
 
+static void ProcessFailure(std::string ProgPath, const char** Args) {
+  std::ostringstream OS;
+  OS << "\n*** Error running tool:\n";
+  for (const char **Arg = Args; *Arg; ++Arg)
+    OS << " " << *Arg;
+  OS << "\n";
+
+  // Rerun the compiler, capturing any error messages to print them.
+  std::string ErrorFilename = getUniqueFilename("error_messages");
+  RunProgramWithTimeout(ProgPath, Args, "/dev/null", ErrorFilename.c_str(),
+                        ErrorFilename.c_str());
+
+  // Print out the error messages generated by GCC if possible...
+  std::ifstream ErrorFile(ErrorFilename.c_str());
+  if (ErrorFile) {
+    std::copy(std::istreambuf_iterator<char>(ErrorFile),
+              std::istreambuf_iterator<char>(),
+              std::ostreambuf_iterator<char>(OS));
+    ErrorFile.close();
+  }
+
+  removeFile(ErrorFilename);
+  throw ToolExecutionError(OS.str());
+}
+
 //===---------------------------------------------------------------------===//
 // LLI Implementation of AbstractIntepreter interface
 //
@@ -97,7 +123,7 @@
   std::cout << "<llc>" << std::flush;
   if (RunProgramWithTimeout(LLCPath, LLCArgs, "/dev/null", "/dev/null",
                             "/dev/null"))
-    throw ToolExecutionError("LLC failed to compile the program.");
+    ProcessFailure(LLCPath, LLCArgs);
 }
 
 int LLC::ExecuteProgram(const std::string &Bytecode,
@@ -202,7 +228,7 @@
 void CBE::OutputC(const std::string &Bytecode,
                  std::string &OutputCFile) {
   OutputCFile = getUniqueFilename(Bytecode+".cbe.c");
-  const char *DisArgs[] = {
+  const char *LLCArgs[] = {
     LLCPath.c_str(),
     "-o", OutputCFile.c_str(),   // Output to the C file
     "-march=c",                  // Output to C
@@ -212,9 +238,9 @@
   };
 
   std::cout << "<cbe>" << std::flush;
-  if (RunProgramWithTimeout(LLCPath, DisArgs, "/dev/null", "/dev/null",
+  if (RunProgramWithTimeout(LLCPath, LLCArgs, "/dev/null", "/dev/null",
                             "/dev/null"))
-    throw ToolExecutionError("llc -march=c failed!");
+    ProcessFailure(LLCPath, LLCArgs);
 }
 
 int CBE::ExecuteProgram(const std::string &Bytecode,
@@ -290,7 +316,7 @@
   std::cout << "<gcc>" << std::flush;
   if (RunProgramWithTimeout(GCCPath, &GCCArgs[0], "/dev/null", "/dev/null",
                             "/dev/null")) {
-    ProcessFailure(&GCCArgs[0]);
+    ProcessFailure(GCCPath, &GCCArgs[0]);
     exit(1);
   }
 
@@ -336,34 +362,10 @@
   std::cout << "<gcc>" << std::flush;
   if (RunProgramWithTimeout(GCCPath, GCCArgs, "/dev/null", "/dev/null",
                             "/dev/null")) {
-    ProcessFailure(GCCArgs);
+    ProcessFailure(GCCPath, GCCArgs);
     return 1;
   }
   return 0;
-}
-
-void GCC::ProcessFailure(const char** GCCArgs) {
-  std::cerr << "\n*** Error: program invocation!\n";
-  for (const char **Arg = GCCArgs; *Arg; ++Arg)
-    std::cerr << " " << *Arg;
-  std::cerr << "\n";
-
-  // Rerun the compiler, capturing any error messages to print them.
-  std::string ErrorFilename = getUniqueFilename("gcc.errors");
-  RunProgramWithTimeout(GCCPath, GCCArgs, "/dev/null", ErrorFilename.c_str(),
-                        ErrorFilename.c_str());
-
-  // Print out the error messages generated by GCC if possible...
-  std::ifstream ErrorFile(ErrorFilename.c_str());
-  if (ErrorFile) {
-    std::copy(std::istreambuf_iterator<char>(ErrorFile),
-              std::istreambuf_iterator<char>(),
-              std::ostreambuf_iterator<char>(std::cerr));
-    ErrorFile.close();
-    std::cerr << "\n";      
-  }
-
-  removeFile(ErrorFilename);
 }
 
 /// create - Try to find the `gcc' executable





More information about the llvm-commits mailing list