]> granicus.if.org Git - clang/commitdiff
[Modules] Emit the module file paths as dependencies of the PCH when we are building...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 14 Mar 2014 03:07:38 +0000 (03:07 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 14 Mar 2014 03:07:38 +0000 (03:07 +0000)
This is because the PCH is tied to the module files, if one of the module files changes or gets removed
the build system should re-build the PCH file.

rdar://16321245

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203885 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Driver/CC1Options.td
include/clang/Frontend/DependencyOutputOptions.h
include/clang/Serialization/ASTReader.h
lib/Driver/Tools.cpp
lib/Frontend/CompilerInvocation.cpp
lib/Frontend/DependencyFile.cpp
lib/Serialization/ASTReader.cpp
test/Driver/pch-deps.c [new file with mode: 0644]
test/Modules/dependency-gen-pch.m [new file with mode: 0644]

index 66674ab442e57ba9f4ace50742d61bce01f5fae9..c6963816220a6b0e0cdf7ecfc723812d59320b38 100644 (file)
@@ -223,6 +223,8 @@ def dependent_lib : Joined<["--"], "dependent-lib=">,
 
 def sys_header_deps : Flag<["-"], "sys-header-deps">,
   HelpText<"Include system headers in dependency output">;
+def module_file_deps : Flag<["-"], "module-file-deps">,
+  HelpText<"Include module files in dependency output">;
 def header_include_file : Separate<["-"], "header-include-file">,
   HelpText<"Filename (or -) to write header include output to">;
 def show_includes : Flag<["--"], "show-includes">,
index fefb6f3eda8408d7bc262c22da6f1038157fbd50..d275249987f1a1b1c527cf5dad032284675b6d44 100644 (file)
@@ -26,6 +26,7 @@ public:
                                      /// problems.
   unsigned AddMissingHeaderDeps : 1; ///< Add missing headers to dependency list
   unsigned PrintShowIncludes : 1; ///< Print cl.exe style /showIncludes info.
+  unsigned IncludeModuleFiles : 1; ///< Include module file dependencies.
   
   /// The file to write dependency output to.
   std::string OutputFile;
@@ -50,6 +51,7 @@ public:
     UsePhonyTargets = 0;
     AddMissingHeaderDeps = 0;
     PrintShowIncludes = 0;
+    IncludeModuleFiles = 0;
   }
 };
 
index d636795a3975c333cc95e37c65da92ed54163286..07ab9e372e4a8c3041506f55a2cc55cac3c86624 100644 (file)
@@ -171,6 +171,9 @@ public:
   virtual void ReadCounter(const serialization::ModuleFile &M,
                            unsigned Value) {}
 
+  /// This is called for each AST file loaded.
+  virtual void visitModuleFile(StringRef Filename) {}
+
   /// \brief Returns true if this \c ASTReaderListener wants to receive the
   /// input files of the AST file via \c visitInputFile, false otherwise.
   virtual bool needsInputFileVisitation() { return false; }
@@ -217,6 +220,7 @@ public:
   void ReadCounter(const serialization::ModuleFile &M, unsigned Value) override;
   bool needsInputFileVisitation() override;
   bool needsSystemInputFileVisitation() override;
+  void visitModuleFile(StringRef Filename) override;
   bool visitInputFile(StringRef Filename, bool isSystem,
                       bool isOverridden) override;
 };
index 72f781d3cff1030209447925c7cd7ef26b7532dc..73f8aa8aafe38c8c98946ff34bcd478a9f24ba9c 100644 (file)
@@ -295,6 +295,9 @@ void Clang::AddPreprocessingOptions(Compilation &C,
     if (A->getOption().matches(options::OPT_M) ||
         A->getOption().matches(options::OPT_MD))
       CmdArgs.push_back("-sys-header-deps");
+
+    if (isa<PrecompileJobAction>(JA))
+      CmdArgs.push_back("-module-file-deps");
   }
 
   if (Args.hasArg(options::OPT_MG)) {
index f368837a5f092add0f28d45763da0c4be08b57bb..7cc0b1bee30b897de608bc53f67c98c92245810a 100644 (file)
@@ -528,6 +528,7 @@ static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts,
   Opts.OutputFile = Args.getLastArgValue(OPT_dependency_file);
   Opts.Targets = Args.getAllArgValues(OPT_MT);
   Opts.IncludeSystemHeaders = Args.hasArg(OPT_sys_header_deps);
+  Opts.IncludeModuleFiles = Args.hasArg(OPT_module_file_deps);
   Opts.UsePhonyTargets = Args.hasArg(OPT_MP);
   Opts.ShowHeaderIncludes = Args.hasArg(OPT_H);
   Opts.HeaderIncludeOutputFile = Args.getLastArgValue(OPT_header_include_file);
index 8457770abb9f0df465a8f2f8dab4ed20e00f6bd7..b472eaaae0542f86fa55b9c4431350355fd0e758 100644 (file)
@@ -40,6 +40,7 @@ class DFGImpl : public PPCallbacks {
   bool PhonyTarget;
   bool AddMissingHeaderDeps;
   bool SeenMissingHeader;
+  bool IncludeModuleFiles;
 private:
   bool FileMatchesDepCriteria(const char *Filename,
                               SrcMgr::CharacteristicKind FileType);
@@ -51,7 +52,8 @@ public:
       IncludeSystemHeaders(Opts.IncludeSystemHeaders),
       PhonyTarget(Opts.UsePhonyTargets),
       AddMissingHeaderDeps(Opts.AddMissingHeaderDeps),
-      SeenMissingHeader(false) {}
+      SeenMissingHeader(false),
+      IncludeModuleFiles(Opts.IncludeModuleFiles) {}
 
   void FileChanged(SourceLocation Loc, FileChangeReason Reason,
                    SrcMgr::CharacteristicKind FileType,
@@ -68,6 +70,7 @@ public:
 
   void AddFilename(StringRef Filename);
   bool includeSystemHeaders() const { return IncludeSystemHeaders; }
+  bool includeModuleFiles() const { return IncludeModuleFiles; }
 };
 
 class DFGASTReaderListener : public ASTReaderListener {
@@ -79,6 +82,7 @@ public:
   bool needsSystemInputFileVisitation() override {
     return Parent.includeSystemHeaders();
   }
+  void visitModuleFile(StringRef Filename) override;
   bool visitInputFile(StringRef Filename, bool isSystem,
                       bool isOverridden) override;
 };
@@ -268,3 +272,7 @@ bool DFGASTReaderListener::visitInputFile(llvm::StringRef Filename,
   return true;
 }
 
+void DFGASTReaderListener::visitModuleFile(llvm::StringRef Filename) {
+  if (Parent.includeModuleFiles())
+    Parent.AddFilename(Filename);
+}
index cc425c5695a99852c476e6938779048052cce0a8..766fe27bc6c5f3ce2467e64b9e7fa62ea768d63b 100644 (file)
@@ -118,6 +118,10 @@ bool ChainedASTReaderListener::needsSystemInputFileVisitation() {
   return First->needsSystemInputFileVisitation() ||
   Second->needsSystemInputFileVisitation();
 }
+void ChainedASTReaderListener::visitModuleFile(StringRef Filename) {
+  First->visitModuleFile(Filename);
+  Second->visitModuleFile(Filename);
+}
 bool ChainedASTReaderListener::visitInputFile(StringRef Filename,
                                               bool isSystem,
                                               bool isOverridden) {
@@ -2118,6 +2122,9 @@ ASTReader::ReadControlBlock(ModuleFile &F,
         }
       }
 
+      if (Listener)
+        Listener->visitModuleFile(F.FileName);
+
       if (Listener && Listener->needsInputFileVisitation()) {
         unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs
                                                                 : NumUserInputs;
diff --git a/test/Driver/pch-deps.c b/test/Driver/pch-deps.c
new file mode 100644 (file)
index 0000000..3048636
--- /dev/null
@@ -0,0 +1,10 @@
+// RUN: %clang -x c-header %s -o %t.pch -MMD -MT dependencies -MF %t.d -### 2> %t
+// RUN: FileCheck %s -input-file=%t
+// CHECK: -emit-pch
+// CHECK: -dependency-file
+// CHECK: -module-file-deps
+
+// RUN: %clang -c %s -o %t -MMD -MT dependencies -MF %t.d -### 2> %t
+// RUN: FileCheck %s -check-prefix=CHECK-NOPCH -input-file=%t
+// CHECK-NOPCH: -dependency-file
+// CHECK-NOPCH-NOT: -module-file-deps
diff --git a/test/Modules/dependency-gen-pch.m b/test/Modules/dependency-gen-pch.m
new file mode 100644 (file)
index 0000000..b0c7551
--- /dev/null
@@ -0,0 +1,12 @@
+// RUN: rm -rf %t-mcp
+// RUN: mkdir -p %t-mcp
+
+// RUN: %clang_cc1 -isysroot %S/Inputs/System -triple x86_64-apple-darwin10 -module-file-deps -dependency-file %t.d -MT %s.o -I %S/Inputs -fmodules -fmodules-cache-path=%t-mcp -emit-pch -o %t.pch %s
+// RUN: FileCheck %s < %t.d
+// CHECK: dependency-gen-pch.m.o
+// CHECK-NEXT: dependency-gen-pch.m
+// CHECK-NEXT: diamond_top.pcm
+// CHECK-NEXT: Inputs{{.}}diamond_top.h
+// CHECK-NEXT: Inputs{{.}}module.map
+
+#import "diamond_top.h"