diff --git a/clang/lib/Frontend/DependencyFile.cpp b/clang/lib/Frontend/DependencyFile.cpp --- a/clang/lib/Frontend/DependencyFile.cpp +++ b/clang/lib/Frontend/DependencyFile.cpp @@ -108,7 +108,9 @@ struct DepCollectorASTListener : public ASTReaderListener { DependencyCollector &DepCollector; - DepCollectorASTListener(DependencyCollector &L) : DepCollector(L) { } + FileManager &FileMgr; + DepCollectorASTListener(DependencyCollector &L, FileManager &FileMgr) + : DepCollector(L), FileMgr(FileMgr) {} bool needsInputFileVisitation() override { return true; } bool needsSystemInputFileVisitation() override { return DepCollector.needSystemDependencies(); @@ -124,6 +126,9 @@ if (IsOverridden || IsExplicitModule) return true; + if (auto FE = FileMgr.getOptionalFileRef(Filename)) + Filename = FE->getName(); + DepCollector.maybeAddDependency(Filename, /*FromModule*/true, IsSystem, /*IsModuleFile*/false, /*IsMissing*/false); return true; @@ -176,7 +181,8 @@ std::make_unique(*this)); } void DependencyCollector::attachToASTReader(ASTReader &R) { - R.addListener(std::make_unique(*this)); + R.addListener( + std::make_unique(*this, R.getFileManager())); } DependencyFileGenerator::DependencyFileGenerator( diff --git a/clang/lib/Frontend/ModuleDependencyCollector.cpp b/clang/lib/Frontend/ModuleDependencyCollector.cpp --- a/clang/lib/Frontend/ModuleDependencyCollector.cpp +++ b/clang/lib/Frontend/ModuleDependencyCollector.cpp @@ -26,13 +26,17 @@ /// Private implementations for ModuleDependencyCollector class ModuleDependencyListener : public ASTReaderListener { ModuleDependencyCollector &Collector; + FileManager &FileMgr; public: - ModuleDependencyListener(ModuleDependencyCollector &Collector) - : Collector(Collector) {} + ModuleDependencyListener(ModuleDependencyCollector &Collector, + FileManager &FileMgr) + : Collector(Collector), FileMgr(FileMgr) {} bool needsInputFileVisitation() override { return true; } bool needsSystemInputFileVisitation() override { return true; } bool visitInputFile(StringRef Filename, bool IsSystem, bool IsOverridden, bool IsExplicitModule) override { + if (auto FE = FileMgr.getOptionalFileRef(Filename)) + Filename = FE->getName(); Collector.addFile(Filename); return true; } @@ -99,7 +103,8 @@ } void ModuleDependencyCollector::attachToASTReader(ASTReader &R) { - R.addListener(std::make_unique(*this)); + R.addListener( + std::make_unique(*this, R.getFileManager())); } void ModuleDependencyCollector::attachToPreprocessor(Preprocessor &PP) { diff --git a/clang/test/Modules/dependency-gen-vfs.c b/clang/test/Modules/dependency-gen-vfs.c new file mode 100644 --- /dev/null +++ b/clang/test/Modules/dependency-gen-vfs.c @@ -0,0 +1,32 @@ +// RUN: rm -rf %t +// RUN: split-file %s %t + +//--- module.modulemap +module M { header "m.h" } + +//--- m-real.h + +//--- overlay.json.template +{ + "version": 0, + "case-sensitive": "false", + "roots": [ + { + "external-contents": "DIR/m-real.h", + "name": "DIR/m.h", + "type": "file" + } + ] +} + +//--- tu.c +#include "m.h" + +// RUN: sed -e "s|DIR|%/t|g" %t/overlay.json.template > %t/overlay.json +// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache \ +// RUN: -ivfsoverlay %t/overlay.json -dependency-file %t/tu.d -MT %t/tu.o -fsyntax-only %t/tu.c +// RUN: cat %t/tu.d | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t +// CHECK: [[PREFIX]]/tu.o: \ +// CHECK-NEXT: [[PREFIX]]/tu.c \ +// CHECK-NEXT: [[PREFIX]]/module.modulemap \ +// CHECK-NEXT: [[PREFIX]]/m-real.h