summaryrefslogtreecommitdiff
path: root/lib/Support/ToolRunner.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-02-18 20:38:00 +0000
committerChris Lattner <sabre@nondot.org>2004-02-18 20:38:00 +0000
commit89bf9ea65e83333bf3ebbf140b6eb07b41ecae64 (patch)
tree8a51f4f3af4c7de4b681c32a4f3015f66ff89d91 /lib/Support/ToolRunner.cpp
parente9f66b9741207b0ebfeb587ce2d9ed6b3289ee9b (diff)
downloadllvm-89bf9ea65e83333bf3ebbf140b6eb07b41ecae64.tar.gz
llvm-89bf9ea65e83333bf3ebbf140b6eb07b41ecae64.tar.bz2
llvm-89bf9ea65e83333bf3ebbf140b6eb07b41ecae64.tar.xz
If there is an error running a tool, include the error message (e.g. assertion failure) in the exception
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11597 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support/ToolRunner.cpp')
-rw-r--r--lib/Support/ToolRunner.cpp62
1 files changed, 32 insertions, 30 deletions
diff --git a/lib/Support/ToolRunner.cpp b/lib/Support/ToolRunner.cpp
index a441b2caeb..6a33273806 100644
--- a/lib/Support/ToolRunner.cpp
+++ b/lib/Support/ToolRunner.cpp
@@ -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 @@ 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) {