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 | eb0971529d1bd1276c952e040dc8ad89539f2dae (patch) | |
tree | f7c046d022f53f58d0548676c4a45f796f84c023 /lib/CompilerDriver/Action.cpp | |
parent | 9da1bf4845e670096b9bf9e62c40960af1697ea0 (diff) |
llvmc: Make segfault detection work on Win32.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@104261 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CompilerDriver/Action.cpp')
-rw-r--r-- | lib/CompilerDriver/Action.cpp | 49 |
1 files changed, 28 insertions, 21 deletions
diff --git a/lib/CompilerDriver/Action.cpp b/lib/CompilerDriver/Action.cpp index 8c63a4da53..5917af6faa 100644 --- a/lib/CompilerDriver/Action.cpp +++ b/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(); |