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

llvm-svn: 11597
This commit is contained in:
Chris Lattner 2004-02-18 20:38:00 +00:00
parent f4551dc773
commit a52c617fd7

View File

@ -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) {