summaryrefslogtreecommitdiffstats
path: root/clang/lib/Driver/Compilation.cpp
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@apple.com>2013-02-27 18:46:04 +0000
committerChad Rosier <mcrosier@apple.com>2013-02-27 18:46:04 +0000
commit6a1de5c6346a995fd61f390cd55f4c0896e5a6ff (patch)
treeb1e91f00bc6c0c2e19d91a62f25eb42e7db4adbc /clang/lib/Driver/Compilation.cpp
parenta2b75bcb526132c2af99ef9fc485e61e860311e3 (diff)
downloadbcm5719-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.cpp29
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));
OpenPOWER on IntegriCloud