diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2016-02-11 14:13:17 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2016-02-11 14:13:17 +0000 |
commit | 932b31982af298c1f3545d9a4dc8b57acf4080e9 (patch) | |
tree | 10c304bc0717e2956bedd1401a0bb4089c1d16dc /clang/lib/Driver/Compilation.cpp | |
parent | a1fa68ac9c0ddc0d5cba24b354af3c3ba0cd74f5 (diff) | |
download | llvm-932b31982af298c1f3545d9a4dc8b57acf4080e9.zip llvm-932b31982af298c1f3545d9a4dc8b57acf4080e9.tar.gz llvm-932b31982af298c1f3545d9a4dc8b57acf4080e9.tar.bz2 |
Revert "Bail on compilation as soon as a job fails."
This reverts commit r260448.
It was causing Driver/output-file-cleanup.c to fail.
llvm-svn: 260522
Diffstat (limited to 'clang/lib/Driver/Compilation.cpp')
-rw-r--r-- | clang/lib/Driver/Compilation.cpp | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/clang/lib/Driver/Compilation.cpp b/clang/lib/Driver/Compilation.cpp index b24d381..1c2eecd 100644 --- a/clang/lib/Driver/Compilation.cpp +++ b/clang/lib/Driver/Compilation.cpp @@ -163,17 +163,39 @@ int Compilation::ExecuteCommand(const Command &C, return ExecutionFailed ? 1 : Res; } -void Compilation::ExecuteJobs( - const JobList &Jobs, - SmallVectorImpl<std::pair<int, const Command *>> &FailingCommands) const { +typedef SmallVectorImpl< std::pair<int, const Command *> > FailingCommandList; + +static bool ActionFailed(const Action *A, + const FailingCommandList &FailingCommands) { + + if (FailingCommands.empty()) + return false; + + for (FailingCommandList::const_iterator CI = FailingCommands.begin(), + CE = FailingCommands.end(); CI != CE; ++CI) + if (A == &(CI->second->getSource())) + return true; + + for (Action::const_iterator AI = A->begin(), AE = A->end(); AI != AE; ++AI) + if (ActionFailed(*AI, FailingCommands)) + return true; + + return false; +} + +static bool InputsOk(const Command &C, + const FailingCommandList &FailingCommands) { + return !ActionFailed(&C.getSource(), FailingCommands); +} + +void Compilation::ExecuteJobs(const JobList &Jobs, + FailingCommandList &FailingCommands) const { for (const auto &Job : Jobs) { + if (!InputsOk(Job, FailingCommands)) + continue; const Command *FailingCommand = nullptr; - if (int Res = ExecuteCommand(Job, FailingCommand)) { + if (int Res = ExecuteCommand(Job, FailingCommand)) FailingCommands.push_back(std::make_pair(Res, FailingCommand)); - // Bail as soon as one command fails, so we don't output duplicate error - // messages if we die on e.g. the same file. - return; - } } } |