diff options
author | Chad Rosier <mcrosier@apple.com> | 2013-02-27 18:46:04 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2013-02-27 18:46:04 +0000 |
commit | 6a1de5c6346a995fd61f390cd55f4c0896e5a6ff (patch) | |
tree | b1e91f00bc6c0c2e19d91a62f25eb42e7db4adbc /clang/lib/Driver/Compilation.cpp | |
parent | a2b75bcb526132c2af99ef9fc485e61e860311e3 (diff) | |
download | bcm5719-llvm-6a1de5c6346a995fd61f390cd55f4c0896e5a6ff.tar.gz bcm5719-llvm-6a1de5c6346a995fd61f390cd55f4c0896e5a6ff.zip |
[driver] The failure of any phase (e.g., preprocess, compile, assemble) for a
single translation unit should prevent later phases from executing. Otherwise,
this generates lots of noise in build systems. This a fallout from r173825.
Patch by Matthew Curtis <mcurtis@codeaurora.org>.
rdar://13298009
llvm-svn: 176198
Diffstat (limited to 'clang/lib/Driver/Compilation.cpp')
-rw-r--r-- | clang/lib/Driver/Compilation.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/clang/lib/Driver/Compilation.cpp b/clang/lib/Driver/Compilation.cpp index df904f06b7d..db948a5bfe9 100644 --- a/clang/lib/Driver/Compilation.cpp +++ b/clang/lib/Driver/Compilation.cpp @@ -307,9 +307,36 @@ int Compilation::ExecuteCommand(const Command &C, return Res; } +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::ExecuteJob(const Job &J, - SmallVectorImpl< std::pair<int, const Command *> > &FailingCommands) const { + FailingCommandList &FailingCommands) const { if (const Command *C = dyn_cast<Command>(&J)) { + if (!InputsOk(*C, FailingCommands)) + return; const Command *FailingCommand = 0; if (int Res = ExecuteCommand(*C, FailingCommand)) FailingCommands.push_back(std::make_pair(Res, FailingCommand)); |