llvmc: Make segfault detection work on Win32.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@104261 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Mikhail Glushenkov 2010-05-20 19:23:47 +00:00
parent 9da1bf4845
commit eb0971529d

View File

@ -33,6 +33,25 @@ extern const char* ProgramName;
}
namespace {
void PrintString (const std::string& str) {
errs() << str << ' ';
}
void PrintCommand (const std::string& Cmd, const StrVector& Args) {
errs() << Cmd << " ";
std::for_each(Args.begin(), Args.end(), &PrintString);
errs() << '\n';
}
bool IsSegmentationFault (int returnCode) {
#ifdef LLVM_ON_WIN32
return (returnCode >= 0xc0000000UL)
#else
return (returnCode < 0);
#endif
}
int ExecuteProgram (const std::string& name,
const StrVector& args) {
sys::Path prog = sys::Program::FindProgramByName(name);
@ -69,23 +88,13 @@ namespace {
// Invoke the program.
int ret = sys::Program::ExecuteAndWait(prog, &argv[0], 0, &redirects[0]);
if (ret < 0) {
const char** B = &argv[0];
if (IsSegmentationFault(ret)) {
errs() << "Segmentation fault:";
while (*B)
errs() << ' ' << *(B++);
errs() << '\n';
return 1;
PrintCommand(name, args);
}
return ret;
}
void print_string (const std::string& str) {
errs() << str << ' ';
}
}
namespace llvmc {
@ -93,11 +102,9 @@ namespace llvmc {
}
int llvmc::Action::Execute () const {
if (DryRun || VerboseMode) {
errs() << Command_ << " ";
std::for_each(Args_.begin(), Args_.end(), print_string);
errs() << '\n';
}
if (DryRun || VerboseMode)
PrintCommand(Command_, Args_);
if (!DryRun) {
if (Time) {
sys::TimeValue now = sys::TimeValue::now();