If there is an error running a tool, include the error message (e.g. assertion failur...
authorChris Lattner <sabre@nondot.org>
Wed, 18 Feb 2004 20:38:00 +0000 (20:38 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 18 Feb 2004 20:38:00 +0000 (20:38 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11597 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/ToolRunner.cpp
tools/bugpoint/ToolRunner.cpp

index a441b2caeb1794915bf5e37628654dba4ade706f..6a332738063596ceb30842c713b6c2139397e71a 100644 (file)
 #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 @@ void LLC::OutputAsm(const std::string &Bytecode, std::string &OutputAsmFile) {
   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 @@ AbstractInterpreter *AbstractInterpreter::createJIT(const std::string &ProgPath,
 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 @@ void CBE::OutputC(const std::string &Bytecode,
   };
 
   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 @@ int GCC::ExecuteProgram(const std::string &ProgramFile,
   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,36 +362,12 @@ int GCC::MakeSharedObject(const std::string &InputFile, FileType fileType,
   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
 ///
 GCC *GCC::create(const std::string &ProgramPath, std::string &Message) {
index a441b2caeb1794915bf5e37628654dba4ade706f..6a332738063596ceb30842c713b6c2139397e71a 100644 (file)
 #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 @@ void LLC::OutputAsm(const std::string &Bytecode, std::string &OutputAsmFile) {
   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 @@ AbstractInterpreter *AbstractInterpreter::createJIT(const std::string &ProgPath,
 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 @@ void CBE::OutputC(const std::string &Bytecode,
   };
 
   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 @@ int GCC::ExecuteProgram(const std::string &ProgramFile,
   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,36 +362,12 @@ int GCC::MakeSharedObject(const std::string &InputFile, FileType fileType,
   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
 ///
 GCC *GCC::create(const std::string &ProgramPath, std::string &Message) {