<div dir="ltr">Ah, so we need a flag -fno-module-map-file-deps, I assume...</div><br><div class="gmail_quote"><div dir="ltr">On Tue, Aug 11, 2015 at 8:12 PM Richard Smith <<a href="mailto:richard@metafoo.co.uk">richard@metafoo.co.uk</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Aug 11, 2015 at 4:57 AM, Manuel Klimek <span dir="ltr"><<a href="mailto:klimek@google.com" target="_blank">klimek@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I believe this breaks -fno-module-file-deps.</div></blockquote><div><br></div></div></div></div><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>I don't think so; this affects which module map files end up in the .d file, not which .pcm files do.</div></div></div></div><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><div class="gmail_quote"><div dir="ltr">On Sun, Aug 9, 2015 at 6:47 AM Richard Smith via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rsmith<br>
Date: Sat Aug 8 23:46:57 2015<br>
New Revision: 244413<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=244413&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=244413&view=rev</a><br>
Log:<br>
[modules] When building a dependency file, include module maps parsed in the<br>
current compilation, not just those from imported modules.<br>
<br>
Modified:<br>
cfe/trunk/include/clang/Lex/ModuleMap.h<br>
cfe/trunk/lib/Frontend/DependencyFile.cpp<br>
cfe/trunk/lib/Lex/ModuleMap.cpp<br>
cfe/trunk/test/Modules/dependency-gen-pch.m<br>
cfe/trunk/test/Modules/dependency-gen.m<br>
cfe/trunk/test/Modules/dependency-gen.modulemap<br>
cfe/trunk/test/Modules/relative-dep-gen.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Lex/ModuleMap.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/ModuleMap.h?rev=244413&r1=244412&r2=244413&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/ModuleMap.h?rev=244413&r1=244412&r2=244413&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Lex/ModuleMap.h (original)<br>
+++ cfe/trunk/include/clang/Lex/ModuleMap.h Sat Aug 8 23:46:57 2015<br>
@@ -35,6 +35,22 @@ class DiagnosticConsumer;<br>
class DiagnosticsEngine;<br>
class HeaderSearch;<br>
class ModuleMapParser;<br>
+<br>
+/// \brief A mechanism to observe the actions of the module map parser as it<br>
+/// reads module map files.<br>
+class ModuleMapCallbacks {<br>
+public:<br>
+ virtual ~ModuleMapCallbacks() {}<br>
+<br>
+ /// \brief Called when a module map file has been read.<br>
+ ///<br>
+ /// \param FileStart A SourceLocation referring to the start of the file's<br>
+ /// contents.<br>
+ /// \param File The file itself.<br>
+ /// \param IsSystem Whether this is a module map from a system include path.<br>
+ virtual void moduleMapFileRead(SourceLocation FileStart,<br>
+ const FileEntry &File, bool IsSystem) {}<br>
+};<br>
<br>
class ModuleMap {<br>
SourceManager &SourceMgr;<br>
@@ -42,6 +58,8 @@ class ModuleMap {<br>
const LangOptions &LangOpts;<br>
const TargetInfo *Target;<br>
HeaderSearch &HeaderInfo;<br>
+<br>
+ llvm::SmallVector<std::unique_ptr<ModuleMapCallbacks>, 1> Callbacks;<br>
<br>
/// \brief The directory used for Clang-supplied, builtin include headers,<br>
/// such as "stdint.h".<br>
@@ -263,6 +281,11 @@ public:<br>
BuiltinIncludeDir = Dir;<br>
}<br>
<br>
+ /// \brief Add a module map callback.<br>
+ void addModuleMapCallbacks(std::unique_ptr<ModuleMapCallbacks> Callback) {<br>
+ Callbacks.push_back(std::move(Callback));<br>
+ }<br>
+<br>
/// \brief Retrieve the module that owns the given header file, if any.<br>
///<br>
/// \param File The header file that is likely to be included.<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=244413&r1=244412&r2=244413&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/DependencyFile.cpp?rev=244413&r1=244412&r2=244413&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Frontend/DependencyFile.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/DependencyFile.cpp Sat Aug 8 23:46:57 2015<br>
@@ -18,6 +18,7 @@<br>
#include "clang/Frontend/FrontendDiagnostic.h"<br>
#include "clang/Lex/DirectoryLookup.h"<br>
#include "clang/Lex/LexDiagnostic.h"<br>
+#include "clang/Lex/ModuleMap.h"<br>
#include "clang/Lex/PPCallbacks.h"<br>
#include "clang/Lex/Preprocessor.h"<br>
#include "clang/Serialization/ASTReader.h"<br>
@@ -82,6 +83,20 @@ struct DepCollectorPPCallbacks : public<br>
}<br>
};<br>
<br>
+struct DepCollectorMMCallbacks : public ModuleMapCallbacks {<br>
+ DependencyCollector &DepCollector;<br>
+ DepCollectorMMCallbacks(DependencyCollector &DC) : DepCollector(DC) {}<br>
+<br>
+ void moduleMapFileRead(SourceLocation Loc, const FileEntry &Entry,<br>
+ bool IsSystem) override {<br>
+ StringRef Filename = Entry.getName();<br>
+ DepCollector.maybeAddDependency(Filename, /*FromModule*/false,<br>
+ /*IsSystem*/IsSystem,<br>
+ /*IsModuleFile*/false,<br>
+ /*IsMissing*/false);<br>
+ }<br>
+};<br>
+<br>
struct DepCollectorASTListener : public ASTReaderListener {<br>
DependencyCollector &DepCollector;<br>
DepCollectorASTListener(DependencyCollector &L) : DepCollector(L) { }<br>
@@ -132,6 +147,8 @@ DependencyCollector::~DependencyCollecto<br>
void DependencyCollector::attachToPreprocessor(Preprocessor &PP) {<br>
PP.addPPCallbacks(<br>
llvm::make_unique<DepCollectorPPCallbacks>(*this, PP.getSourceManager()));<br>
+ PP.getHeaderSearchInfo().getModuleMap().addModuleMapCallbacks(<br>
+ llvm::make_unique<DepCollectorMMCallbacks>(*this));<br>
}<br>
void DependencyCollector::attachToASTReader(ASTReader &R) {<br>
R.addListener(llvm::make_unique<DepCollectorASTListener>(*this));<br>
@@ -185,6 +202,17 @@ public:<br>
bool includeModuleFiles() const { return IncludeModuleFiles; }<br>
};<br>
<br>
+class DFGMMCallback : public ModuleMapCallbacks {<br>
+ DFGImpl &Parent;<br>
+public:<br>
+ DFGMMCallback(DFGImpl &Parent) : Parent(Parent) {}<br>
+ void moduleMapFileRead(SourceLocation Loc, const FileEntry &Entry,<br>
+ bool IsSystem) override {<br>
+ if (!IsSystem || Parent.includeSystemHeaders())<br>
+ Parent.AddFilename(Entry.getName());<br>
+ }<br>
+};<br>
+<br>
class DFGASTReaderListener : public ASTReaderListener {<br>
DFGImpl &Parent;<br>
public:<br>
@@ -217,6 +245,8 @@ DependencyFileGenerator *DependencyFileG<br>
<br>
DFGImpl *Callback = new DFGImpl(&PP, Opts);<br>
PP.addPPCallbacks(std::unique_ptr<PPCallbacks>(Callback));<br>
+ PP.getHeaderSearchInfo().getModuleMap().addModuleMapCallbacks(<br>
+ llvm::make_unique<DFGMMCallback>(*Callback));<br>
return new DependencyFileGenerator(Callback);<br>
}<br>
<br>
<br>
Modified: cfe/trunk/lib/Lex/ModuleMap.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/ModuleMap.cpp?rev=244413&r1=244412&r2=244413&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/ModuleMap.cpp?rev=244413&r1=244412&r2=244413&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Lex/ModuleMap.cpp (original)<br>
+++ cfe/trunk/lib/Lex/ModuleMap.cpp Sat Aug 8 23:46:57 2015<br>
@@ -2335,9 +2335,14 @@ bool ModuleMap::parseModuleMapFile(const<br>
<br>
// Parse this module map file.<br>
Lexer L(ID, SourceMgr.getBuffer(ID), SourceMgr, MMapLangOpts);<br>
+ SourceLocation Start = L.getSourceLocation();<br>
ModuleMapParser Parser(L, SourceMgr, Target, Diags, *this, File, Dir,<br>
BuiltinIncludeDir, IsSystem);<br>
bool Result = Parser.parseModuleMapFile();<br>
ParsedModuleMap[File] = Result;<br>
+<br>
+ // Notify callbacks that we parsed it.<br>
+ for (const auto &Cb : Callbacks)<br>
+ Cb->moduleMapFileRead(Start, *File, IsSystem);<br>
return Result;<br>
}<br>
<br>
Modified: cfe/trunk/test/Modules/dependency-gen-pch.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/dependency-gen-pch.m?rev=244413&r1=244412&r2=244413&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/dependency-gen-pch.m?rev=244413&r1=244412&r2=244413&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/dependency-gen-pch.m (original)<br>
+++ cfe/trunk/test/Modules/dependency-gen-pch.m Sat Aug 8 23:46:57 2015<br>
@@ -6,8 +6,8 @@<br>
// RUN: FileCheck %s < %t.d<br>
// CHECK: dependency-gen-pch.m.o<br>
// CHECK-NEXT: dependency-gen-pch.m<br>
+// CHECK-NEXT: Inputs{{.}}module.map<br>
// CHECK-NEXT: diamond_top.pcm<br>
// CHECK-NEXT: Inputs{{.}}diamond_top.h<br>
-// CHECK-NEXT: Inputs{{.}}module.map<br>
<br>
#import "diamond_top.h"<br>
<br>
Modified: cfe/trunk/test/Modules/dependency-gen.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/dependency-gen.m?rev=244413&r1=244412&r2=244413&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/dependency-gen.m?rev=244413&r1=244412&r2=244413&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/dependency-gen.m (original)<br>
+++ cfe/trunk/test/Modules/dependency-gen.m Sat Aug 8 23:46:57 2015<br>
@@ -4,8 +4,8 @@<br>
// RUN: %clang_cc1 -x objective-c -isystem %S/Inputs/System/usr/include -dependency-file %t.d.1 -MT %s.o -I %S/Inputs -fsyntax-only -fmodules -fimplicit-module-maps -fmodules-cache-path=%t-mcp %s<br>
// RUN: FileCheck %s < %t.d.1<br>
// CHECK: dependency-gen.m<br>
-// CHECK: Inputs{{.}}diamond_top.h<br>
// CHECK: Inputs{{.}}module.map<br>
+// CHECK: Inputs{{.}}diamond_top.h<br>
// CHECK-NOT: usr{{.}}include{{.}}module.map<br>
// CHECK-NOT: stdint.h<br>
<br>
@@ -13,8 +13,8 @@<br>
// RUN: %clang_cc1 -x objective-c -isystem %S/Inputs/System/usr/include -dependency-file %t.d.2 -MT %s.o -I %S/Inputs -sys-header-deps -fsyntax-only -fmodules -fimplicit-module-maps -fmodules-cache-path=%t-mcp %s<br>
// RUN: FileCheck %s -check-prefix=CHECK-SYS < %t.d.2<br>
// CHECK-SYS: dependency-gen.m<br>
-// CHECK-SYS: Inputs{{.}}diamond_top.h<br>
// CHECK-SYS: Inputs{{.}}module.map<br>
+// CHECK-SYS: Inputs{{.}}diamond_top.h<br>
// CHECK-SYS: usr{{.}}include{{.}}module.map<br>
// CHECK-SYS: stdint.h<br>
<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=244413&r1=244412&r2=244413&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/dependency-gen.modulemap?rev=244413&r1=244412&r2=244413&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/dependency-gen.modulemap (original)<br>
+++ cfe/trunk/test/Modules/dependency-gen.modulemap Sat Aug 8 23:46:57 2015<br>
@@ -15,5 +15,10 @@ module "test" {<br>
extern module "test-base2" "Inputs/dependency-gen-base2.modulemap"<br>
extern module "test-base" "Inputs/dependency-gen-base.modulemap"<br>
<br>
-// CHECK: {{ |\.[/\\]}}Inputs{{[/\\]}}dependency-gen-included2.h<br>
-// CHECK: {{ |\.[/\\]}}Inputs{{[/\\]}}dependency-gen-base.modulemap<br>
+// CHECK-DAG: {{[/\\]}}dependency-gen.modulemap<br>
+// CHECK-DAG: {{ |\.[/\\]}}Inputs{{[/\\]}}dependency-gen-base.modulemap<br>
+// CHECK-DAG: {{ |\.[/\\]}}Inputs{{[/\\]}}dependency-gen-base2.modulemap<br>
+<br>
+// CHECK-DAG: {{ |\.[/\\]}}Inputs{{[/\\]}}dependency-gen.h<br>
+// CHECK-DAG: {{ |\.[/\\]}}Inputs{{[/\\]}}dependency-gen-included.h<br>
+// CHECK-DAG: {{ |\.[/\\]}}Inputs{{[/\\]}}dependency-gen-included2.h<br>
<br>
Modified: cfe/trunk/test/Modules/relative-dep-gen.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/relative-dep-gen.cpp?rev=244413&r1=244412&r2=244413&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/relative-dep-gen.cpp?rev=244413&r1=244412&r2=244413&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/relative-dep-gen.cpp (original)<br>
+++ cfe/trunk/test/Modules/relative-dep-gen.cpp Sat Aug 8 23:46:57 2015<br>
@@ -20,5 +20,11 @@<br>
<br>
#include "Inputs/relative-dep-gen-1.h"<br>
<br>
-// CHECK-BUILD: mod.pcm: Inputs/relative-dep-gen-1.h Inputs/relative-dep-gen-2.h<br>
-// CHECK-USE: use.o: relative-dep-gen.cpp Inputs/relative-dep-gen-1.h<br>
+// CHECK-BUILD: mod.pcm:<br>
+// CHECK-BUILD: Inputs/relative-dep-gen{{(-cwd)?}}.modulemap<br>
+// CHECK-BUILD: Inputs/relative-dep-gen-1.h<br>
+// CHECK-BUILD: Inputs/relative-dep-gen-2.h<br>
+// CHECK-USE: use.o:<br>
+// CHECK-USE: Inputs/relative-dep-gen{{(-cwd)?}}.modulemap<br>
+// CHECK-USE: relative-dep-gen.cpp<br>
+// CHECK-USE: Inputs/relative-dep-gen-1.h<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">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>
</div></div></blockquote></div></div></div></blockquote></div>