<div dir="ltr">Do you think something like the implicit inputs thing in <a href="http://reviews.llvm.org/D17695">http://reviews.llvm.org/D17695</a> could work for you as well, instead of this patch? Then we don't have to forever promise to compile all .cc input files serially.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Feb 24, 2016 at 4:49 PM, Justin Lebar via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: jlebar<br>
Date: Wed Feb 24 15:49:28 2016<br>
New Revision: 261774<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=261774&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=261774&view=rev</a><br>
Log:<br>
Bail on compilation as soon as a job fails.<br>
<br>
Summary:<br>
(Re-land of r260448, which was reverted in r260522 due to a test failure<br>
in Driver/output-file-cleanup.c that only showed up in fresh builds.)<br>
<br>
Previously we attempted to be smart; if one job failed, we'd run all<br>
jobs that didn't depend on the failing job.<br>
<br>
Problem is, this doesn't work well for e.g. CUDA compilation without<br>
-save-temps.  In this case, the device-side and host-side Assemble<br>
actions (which actually are responsible for preprocess, compile,<br>
backend, and assemble, since we're not saving temps) are necessarily<br>
distinct.  So our clever heuristic doesn't help us, and we repeat every<br>
error message once for host and once for each device arch.<br>
<br>
The main effect of this change, other than fixing CUDA, is that if you<br>
pass multiple cc files to one instance of clang and you get a compile<br>
error, we'll stop when the first cc1 job fails.<br>
<br>
Reviewers: echristo<br>
<br>
Subscribers: cfe-commits, jhen, echristo, tra, rafael<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D17217" rel="noreferrer" target="_blank">http://reviews.llvm.org/D17217</a><br>
<br>
Modified:<br>
    cfe/trunk/lib/Driver/Compilation.cpp<br>
    cfe/trunk/test/Driver/output-file-cleanup.c<br>
<br>
Modified: cfe/trunk/lib/Driver/Compilation.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Compilation.cpp?rev=261774&r1=261773&r2=261774&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Compilation.cpp?rev=261774&r1=261773&r2=261774&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Driver/Compilation.cpp (original)<br>
+++ cfe/trunk/lib/Driver/Compilation.cpp Wed Feb 24 15:49:28 2016<br>
@@ -163,39 +163,17 @@ int Compilation::ExecuteCommand(const Co<br>
   return ExecutionFailed ? 1 : Res;<br>
 }<br>
<br>
-typedef SmallVectorImpl< std::pair<int, const Command *> > FailingCommandList;<br>
-<br>
-static bool ActionFailed(const Action *A,<br>
-                         const FailingCommandList &FailingCommands) {<br>
-<br>
-  if (FailingCommands.empty())<br>
-    return false;<br>
-<br>
-  for (FailingCommandList::const_iterator CI = FailingCommands.begin(),<br>
-         CE = FailingCommands.end(); CI != CE; ++CI)<br>
-    if (A == &(CI->second->getSource()))<br>
-      return true;<br>
-<br>
-  for (const Action *AI : A->inputs())<br>
-    if (ActionFailed(AI, FailingCommands))<br>
-      return true;<br>
-<br>
-  return false;<br>
-}<br>
-<br>
-static bool InputsOk(const Command &C,<br>
-                     const FailingCommandList &FailingCommands) {<br>
-  return !ActionFailed(&C.getSource(), FailingCommands);<br>
-}<br>
-<br>
-void Compilation::ExecuteJobs(const JobList &Jobs,<br>
-                              FailingCommandList &FailingCommands) const {<br>
+void Compilation::ExecuteJobs(<br>
+    const JobList &Jobs,<br>
+    SmallVectorImpl<std::pair<int, const Command *>> &FailingCommands) const {<br>
   for (const auto &Job : Jobs) {<br>
-    if (!InputsOk(Job, FailingCommands))<br>
-      continue;<br>
     const Command *FailingCommand = nullptr;<br>
-    if (int Res = ExecuteCommand(Job, FailingCommand))<br>
+    if (int Res = ExecuteCommand(Job, FailingCommand)) {<br>
       FailingCommands.push_back(std::make_pair(Res, FailingCommand));<br>
+      // Bail as soon as one command fails, so we don't output duplicate error<br>
+      // messages if we die on e.g. the same file.<br>
+      return;<br>
+    }<br>
   }<br>
 }<br>
<br>
<br>
Modified: cfe/trunk/test/Driver/output-file-cleanup.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/output-file-cleanup.c?rev=261774&r1=261773&r2=261774&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/output-file-cleanup.c?rev=261774&r1=261773&r2=261774&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Driver/output-file-cleanup.c (original)<br>
+++ cfe/trunk/test/Driver/output-file-cleanup.c Wed Feb 24 15:49:28 2016<br>
@@ -38,6 +38,9 @@ invalid C code<br>
 // RUN: test -f %t1.s<br>
 // RUN: test ! -f %t2.s<br>
<br>
+// When given multiple .c files to compile, clang compiles them in order until<br>
+// it hits an error, at which point it stops.<br>
+//<br>
 // RUN: touch %t1.c<br>
 // RUN: echo "invalid C code" > %t2.c<br>
 // RUN: touch %t3.c<br>
@@ -46,6 +49,6 @@ invalid C code<br>
 // RUN: cd %T && not %clang -S %t1.c %t2.c %t3.c %t4.c %t5.c<br>
 // RUN: test -f %t1.s<br>
 // RUN: test ! -f %t2.s<br>
-// RUN: test -f %t3.s<br>
+// RUN: test ! -f %t3.s<br>
 // RUN: test ! -f %t4.s<br>
-// RUN: test -f %t5.s<br>
+// RUN: test ! -f %t5.s<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>