diff options
author | Mikhail Glushenkov <foldr@codedgers.com> | 2010-05-20 19:23:47 +0000 |
---|---|---|
committer | Mikhail Glushenkov <foldr@codedgers.com> | 2010-05-20 19:23:47 +0000 |
commit | 3e69aa03993d6b282331e1810f9f63ef345676bb (patch) | |
tree | bf60868f29ccaf67d01ce3f43e126a2b1004bb39 /llvm/lib/CompilerDriver | |
parent | fdf9874ba7beafddbb063b488514d9ba0874bf5d (diff) | |
download | bcm5719-llvm-3e69aa03993d6b282331e1810f9f63ef345676bb.tar.gz bcm5719-llvm-3e69aa03993d6b282331e1810f9f63ef345676bb.zip |
llvmc: Make segfault detection work on Win32.
llvm-svn: 104261
Diffstat (limited to 'llvm/lib/CompilerDriver')
-rw-r--r-- | llvm/lib/CompilerDriver/Action.cpp | 49 |
1 files changed, 28 insertions, 21 deletions
diff --git a/llvm/lib/CompilerDriver/Action.cpp b/llvm/lib/CompilerDriver/Action.cpp index 8c63a4da53e..5917af6faae 100644 --- a/llvm/lib/CompilerDriver/Action.cpp +++ b/llvm/lib/CompilerDriver/Action.cpp @@ -33,8 +33,27 @@ extern const char* ProgramName; } namespace { - int ExecuteProgram(const std::string& name, - const StrVector& args) { + + 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); if (prog.isEmpty()) { @@ -69,35 +88,23 @@ 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 { - void AppendToGlobalTimeLog(const std::string& cmd, double time); + void AppendToGlobalTimeLog (const std::string& cmd, double time); } -int llvmc::Action::Execute() const { - if (DryRun || VerboseMode) { - errs() << Command_ << " "; - std::for_each(Args_.begin(), Args_.end(), print_string); - errs() << '\n'; - } +int llvmc::Action::Execute () const { + if (DryRun || VerboseMode) + PrintCommand(Command_, Args_); + if (!DryRun) { if (Time) { sys::TimeValue now = sys::TimeValue::now(); |