<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Aug 13, 2015 at 10:57 AM, Richard Smith 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: rsmith<br>
Date: Thu Aug 13 12:57:10 2015<br>
New Revision: 244923<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=244923&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=244923&view=rev</a><br>
Log:<br>
[modules] Change the way we deal with .d output for explicitly-specified module<br>
files: include the .pcm file itself in the .d output, rather than including its<br>
own input files. Other forms of module file continue to be transparent for .d<br>
output.<br>
<br>
Arguably, the input files for the .pcm file are still inputs to the<br>
compilation, but that's unnecessary for make-like build systems (where the<br>
mtime of the .pcm file is sufficient) and harmful for smarter build systems<br>
that know about module files and want to track only the local dependencies.<br></blockquote><div><br></div><div>Nice!</div><div><br></div><div>-- Sean Silva</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Modified:<br>
    cfe/trunk/include/clang/Serialization/ASTReader.h<br>
    cfe/trunk/lib/Frontend/DependencyFile.cpp<br>
    cfe/trunk/lib/Frontend/ModuleDependencyCollector.cpp<br>
    cfe/trunk/lib/Serialization/ASTReader.cpp<br>
    cfe/trunk/test/Modules/dependency-gen.modulemap<br>
<br>
Modified: cfe/trunk/include/clang/Serialization/ASTReader.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=244923&r1=244922&r2=244923&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=244923&r1=244922&r2=244923&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Serialization/ASTReader.h (original)<br>
+++ cfe/trunk/include/clang/Serialization/ASTReader.h Thu Aug 13 12:57:10 2015<br>
@@ -179,7 +179,8 @@ public:<br>
                            unsigned Value) {}<br>
<br>
   /// This is called for each AST file loaded.<br>
-  virtual void visitModuleFile(StringRef Filename) {}<br>
+  virtual void visitModuleFile(StringRef Filename,<br>
+                               serialization::ModuleKind Kind) {}<br>
<br>
   /// \brief Returns true if this \c ASTReaderListener wants to receive the<br>
   /// input files of the AST file via \c visitInputFile, false otherwise.<br>
@@ -194,7 +195,7 @@ public:<br>
   ///<br>
   /// \returns true to continue receiving the next input file, false to stop.<br>
   virtual bool visitInputFile(StringRef Filename, bool isSystem,<br>
-                              bool isOverridden) {<br>
+                              bool isOverridden, bool isExplicitModule) {<br>
     return true;<br>
   }<br>
<br>
@@ -242,9 +243,10 @@ public:<br>
   void ReadCounter(const serialization::ModuleFile &M, unsigned Value) override;<br>
   bool needsInputFileVisitation() override;<br>
   bool needsSystemInputFileVisitation() override;<br>
-  void visitModuleFile(StringRef Filename) override;<br>
+  void visitModuleFile(StringRef Filename,<br>
+                       serialization::ModuleKind Kind) override;<br>
   bool visitInputFile(StringRef Filename, bool isSystem,<br>
-                      bool isOverridden) override;<br>
+                      bool isOverridden, bool isExplicitModule) override;<br>
 };<br>
<br>
 /// \brief ASTReaderListener implementation to validate the information of<br>
<br>
Modified: cfe/trunk/lib/Frontend/DependencyFile.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/DependencyFile.cpp?rev=244923&r1=244922&r2=244923&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/DependencyFile.cpp?rev=244923&r1=244922&r2=244923&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Frontend/DependencyFile.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/DependencyFile.cpp Thu Aug 13 12:57:10 2015<br>
@@ -104,14 +104,15 @@ struct DepCollectorASTListener : public<br>
   bool needsSystemInputFileVisitation() override {<br>
     return DepCollector.needSystemDependencies();<br>
   }<br>
-  void visitModuleFile(StringRef Filename) override {<br>
+  void visitModuleFile(StringRef Filename,<br>
+                       serialization::ModuleKind Kind) override {<br>
     DepCollector.maybeAddDependency(Filename, /*FromModule*/true,<br>
                                    /*IsSystem*/false, /*IsModuleFile*/true,<br>
                                    /*IsMissing*/false);<br>
   }<br>
   bool visitInputFile(StringRef Filename, bool IsSystem,<br>
-                      bool IsOverridden) override {<br>
-    if (IsOverridden)<br>
+                      bool IsOverridden, bool IsExplicitModule) override {<br>
+    if (IsOverridden || IsExplicitModule)<br>
       return true;<br>
<br>
     DepCollector.maybeAddDependency(Filename, /*FromModule*/true, IsSystem,<br>
@@ -226,9 +227,10 @@ public:<br>
   bool needsSystemInputFileVisitation() override {<br>
     return Parent.includeSystemHeaders();<br>
   }<br>
-  void visitModuleFile(StringRef Filename) override;<br>
+  void visitModuleFile(StringRef Filename,<br>
+                       serialization::ModuleKind Kind) override;<br>
   bool visitInputFile(StringRef Filename, bool isSystem,<br>
-                      bool isOverridden) override;<br>
+                      bool isOverridden, bool isExplicitModule) override;<br>
 };<br>
 }<br>
<br>
@@ -472,16 +474,18 @@ void DFGImpl::OutputDependencyFile() {<br>
 }<br>
<br>
 bool DFGASTReaderListener::visitInputFile(llvm::StringRef Filename,<br>
-                                          bool IsSystem, bool IsOverridden) {<br>
+                                          bool IsSystem, bool IsOverridden,<br>
+                                          bool IsExplicitModule) {<br>
   assert(!IsSystem || needsSystemInputFileVisitation());<br>
-  if (IsOverridden)<br>
+  if (IsOverridden || IsExplicitModule)<br>
     return true;<br>
<br>
   Parent.AddFilename(Filename);<br>
   return true;<br>
 }<br>
<br>
-void DFGASTReaderListener::visitModuleFile(llvm::StringRef Filename) {<br>
-  if (Parent.includeModuleFiles())<br>
+void DFGASTReaderListener::visitModuleFile(llvm::StringRef Filename,<br>
+                                           serialization::ModuleKind Kind) {<br>
+  if (Parent.includeModuleFiles() || Kind == MK_ExplicitModule)<br>
     Parent.AddFilename(Filename);<br>
 }<br>
<br>
Modified: cfe/trunk/lib/Frontend/ModuleDependencyCollector.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ModuleDependencyCollector.cpp?rev=244923&r1=244922&r2=244923&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ModuleDependencyCollector.cpp?rev=244923&r1=244922&r2=244923&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Frontend/ModuleDependencyCollector.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/ModuleDependencyCollector.cpp Thu Aug 13 12:57:10 2015<br>
@@ -32,8 +32,8 @@ public:<br>
       : Collector(Collector) {}<br>
   bool needsInputFileVisitation() override { return true; }<br>
   bool needsSystemInputFileVisitation() override { return true; }<br>
-  bool visitInputFile(StringRef Filename, bool IsSystem,<br>
-                      bool IsOverridden) override;<br>
+  bool visitInputFile(StringRef Filename, bool IsSystem, bool IsOverridden,<br>
+                      bool IsExplicitModule) override;<br>
 };<br>
 }<br>
<br>
@@ -85,7 +85,8 @@ std::error_code ModuleDependencyListener<br>
 }<br>
<br>
 bool ModuleDependencyListener::visitInputFile(StringRef Filename, bool IsSystem,<br>
-                                              bool IsOverridden) {<br>
+                                              bool IsOverridden,<br>
+                                              bool IsExplicitModule) {<br>
   if (Collector.insertSeen(Filename))<br>
     if (copyToRoot(Filename))<br>
       Collector.setHasErrors();<br>
<br>
Modified: cfe/trunk/lib/Serialization/ASTReader.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=244923&r1=244922&r2=244923&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=244923&r1=244922&r2=244923&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Serialization/ASTReader.cpp (original)<br>
+++ cfe/trunk/lib/Serialization/ASTReader.cpp Thu Aug 13 12:57:10 2015<br>
@@ -138,20 +138,24 @@ bool ChainedASTReaderListener::needsSyst<br>
   return First->needsSystemInputFileVisitation() ||<br>
   Second->needsSystemInputFileVisitation();<br>
 }<br>
-void ChainedASTReaderListener::visitModuleFile(StringRef Filename) {<br>
-  First->visitModuleFile(Filename);<br>
-  Second->visitModuleFile(Filename);<br>
+void ChainedASTReaderListener::visitModuleFile(StringRef Filename,<br>
+                                               ModuleKind Kind) {<br>
+  First->visitModuleFile(Filename, Kind);<br>
+  Second->visitModuleFile(Filename, Kind);<br>
 }<br>
 bool ChainedASTReaderListener::visitInputFile(StringRef Filename,<br>
                                               bool isSystem,<br>
-                                              bool isOverridden) {<br>
+                                              bool isOverridden,<br>
+                                              bool isExplicitModule) {<br>
   bool Continue = false;<br>
   if (First->needsInputFileVisitation() &&<br>
       (!isSystem || First->needsSystemInputFileVisitation()))<br>
-    Continue |= First->visitInputFile(Filename, isSystem, isOverridden);<br>
+    Continue |= First->visitInputFile(Filename, isSystem, isOverridden,<br>
+                                      isExplicitModule);<br>
   if (Second->needsInputFileVisitation() &&<br>
       (!isSystem || Second->needsSystemInputFileVisitation()))<br>
-    Continue |= Second->visitInputFile(Filename, isSystem, isOverridden);<br>
+    Continue |= Second->visitInputFile(Filename, isSystem, isOverridden,<br>
+                                       isExplicitModule);<br>
   return Continue;<br>
 }<br>
<br>
@@ -2106,7 +2110,7 @@ ASTReader::ReadControlBlock(ModuleFile &<br>
       }<br>
<br>
       if (Listener)<br>
-        Listener->visitModuleFile(F.FileName);<br>
+        Listener->visitModuleFile(F.FileName, F.Kind);<br>
<br>
       if (Listener && Listener->needsInputFileVisitation()) {<br>
         unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs<br>
@@ -2114,7 +2118,8 @@ ASTReader::ReadControlBlock(ModuleFile &<br>
         for (unsigned I = 0; I < N; ++I) {<br>
           bool IsSystem = I >= NumUserInputs;<br>
           InputFileInfo FI = readInputFileInfo(F, I+1);<br>
-          Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden);<br>
+          Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden,<br>
+                                   F.Kind == MK_ExplicitModule);<br>
         }<br>
       }<br>
<br>
@@ -4194,8 +4199,8 @@ bool ASTReader::readASTFileControlBlock(<br>
           bool Overridden = static_cast<bool>(Record[3]);<br>
           std::string Filename = Blob;<br>
           ResolveImportedPath(Filename, ModuleDir);<br>
-          shouldContinue =<br>
-              Listener.visitInputFile(Filename, isSystemFile, Overridden);<br>
+          shouldContinue = Listener.visitInputFile(<br>
+              Filename, isSystemFile, Overridden, /*IsExplicitModule*/false);<br>
           break;<br>
         }<br>
         if (!shouldContinue)<br>
<br>
Modified: cfe/trunk/test/Modules/dependency-gen.modulemap<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/dependency-gen.modulemap?rev=244923&r1=244922&r2=244923&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/dependency-gen.modulemap?rev=244923&r1=244922&r2=244923&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/dependency-gen.modulemap (original)<br>
+++ cfe/trunk/test/Modules/dependency-gen.modulemap Thu Aug 13 12:57:10 2015<br>
@@ -1,9 +1,9 @@<br>
 // RUN: cd %S<br>
 // RUN: rm -rf %t<br>
 //<br>
-// RUN: %clang_cc1 -I. -x c++ -fmodule-name=test -fmodules -emit-module -fno-validate-pch -fmodules-strict-decluse %s -dependency-file - -MT implicit.pcm -o %t/implicit.pcm -fmodules-cache-path=%t -fmodule-map-file-home-is-cwd | FileCheck %s --check-prefix=IMPLICIT<br>
+// RUN: %clang_cc1 -I. -x c++ -fmodule-name=test -fmodules -emit-module -fno-validate-pch -fmodules-strict-decluse %s -dependency-file - -MT implicit.pcm -o %t/implicit.pcm -fmodules-cache-path=%t -fmodule-map-file-home-is-cwd -fmodule-map-file=%S/Inputs/dependency-gen-base.modulemap | FileCheck %s --check-prefix=IMPLICIT<br>
 //<br>
-// RUN: %clang_cc1 -I. -x c++ -fmodule-name=test-base -fmodules -emit-module -fno-validate-pch -fmodules-strict-decluse Inputs/dependency-gen-base.modulemap -o %t/base.pcm -fmodule-map-file-home-is-cwd<br>
+// RUN: %clang_cc1 -I. -x c++ -fmodule-name=test-base -fmodules -emit-module -fno-validate-pch -fmodules-strict-decluse Inputs/dependency-gen-base.modulemap -o %t/base.pcm -fmodule-map-file-home-is-cwd -fmodule-map-file=%S/Inputs/dependency-gen-base.modulemap<br>
 // RUN: %clang_cc1 -I. -x c++ -fmodule-name=test -fmodules -emit-module -fno-validate-pch -fmodules-strict-decluse -fmodule-file=%t/base.pcm %s -dependency-file - -MT explicit.pcm -o %t/explicit.pcm -fmodules-cache-path=%t -fmodule-map-file-home-is-cwd | FileCheck %s --check-prefix=EXPLICIT<br>
 module "test" {<br>
   export *<br>
@@ -11,8 +11,6 @@ module "test" {<br>
   use "test-base"<br>
   use "test-base2"<br>
 }<br>
-extern module "test-base2" "Inputs/dependency-gen-base2.modulemap"<br>
-extern module "test-base" "Inputs/dependency-gen-base.modulemap"<br>
<br>
 // For implicit use of a module via the module cache, the input files<br>
 // referenced by the .pcm are also dependencies of this build.<br>
@@ -28,16 +26,11 @@ extern module "test-base" "Inputs/depend<br>
 // and included headers are not dependencies of this target (they are instead<br>
 // dependencies of the explicitly-specified .pcm input).<br>
 //<br>
-// FIXME: We should avoid loading the other referenced module maps (we already<br>
-// have a parsed copy of their contents from the .pcm file) and thus not list<br>
-// them here.<br>
-//<br>
-// FIXME: We should list a dependency on the explicitly specified .pcm files<br>
-// (whether or not -module-file-deps is specified on the command line).<br>
-//<br>
-// EXPLICIT-FIXME-NOT: dependency-gen-<br>
-// EXPLICIT-FIXME: {{.*}}/base.pcm<br>
-//<br>
 // EXPLICIT: {{^}}explicit.pcm:<br>
+// EXPLICIT-NOT: dependency-gen-<br>
+// EXPLICIT: base.pcm<br>
+// EXPLICIT-NOT: dependency-gen-<br>
 // EXPLICIT: {{.*[/\\]}}dependency-gen.modulemap<br>
+// EXPLICIT-NOT: dependency-gen-<br>
 // EXPLICIT: {{ |\.[/\\]}}Inputs{{[/\\]}}dependency-gen.h<br>
+// EXPLICIT-NOT: dependency-gen-<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></div>