From 89bf9ea65e83333bf3ebbf140b6eb07b41ecae64 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 18 Feb 2004 20:38:00 +0000 Subject: [PATCH] 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 --- lib/Support/ToolRunner.cpp | 62 ++++++++++++++++++----------------- tools/bugpoint/ToolRunner.cpp | 62 ++++++++++++++++++----------------- 2 files changed, 64 insertions(+), 60 deletions(-) diff --git a/lib/Support/ToolRunner.cpp b/lib/Support/ToolRunner.cpp index a441b2caeb1..6a332738063 100644 --- a/lib/Support/ToolRunner.cpp +++ b/lib/Support/ToolRunner.cpp @@ -18,8 +18,34 @@ #include "Support/FileUtilities.h" #include #include +#include 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(ErrorFile), + std::istreambuf_iterator(), + std::ostreambuf_iterator(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 << "" << 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 << "" << 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 << "" << 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 << "" << 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(ErrorFile), - std::istreambuf_iterator(), - std::ostreambuf_iterator(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) { diff --git a/tools/bugpoint/ToolRunner.cpp b/tools/bugpoint/ToolRunner.cpp index a441b2caeb1..6a332738063 100644 --- a/tools/bugpoint/ToolRunner.cpp +++ b/tools/bugpoint/ToolRunner.cpp @@ -18,8 +18,34 @@ #include "Support/FileUtilities.h" #include #include +#include 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(ErrorFile), + std::istreambuf_iterator(), + std::ostreambuf_iterator(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 << "" << 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 << "" << 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 << "" << 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 << "" << 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(ErrorFile), - std::istreambuf_iterator(), - std::ostreambuf_iterator(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) { -- 2.34.1