[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