[clang] 347028a - [clang] Report the on-disk paths for inputs to module compiles

Jan Svoboda via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 13 18:38:37 PST 2023


Author: Jan Svoboda
Date: 2023-01-13T18:38:11-08:00
New Revision: 347028a4d8da8aa1ae311c95424999fcd31d98cb

URL: https://github.com/llvm/llvm-project/commit/347028a4d8da8aa1ae311c95424999fcd31d98cb
DIFF: https://github.com/llvm/llvm-project/commit/347028a4d8da8aa1ae311c95424999fcd31d98cb.diff

LOG: [clang] Report the on-disk paths for inputs to module compiles

Since D135636, PCM files contain the "as requested" path of input files. The machinery for generating dependency files reports those paths as they appeared in the PCM file, which may confuse consumers that are not aware of VFS overlays that might've been in place at compile-time.

This patch makes sure the "use-external-name" setting is being respected when generating dependency files in modular builds by piping the paths serialized in PCMs through `FileEntryRef::getName()` before putting them into dependency files.

rdar://103459532

Reviewed By: benlangmuir

Differential Revision: https://reviews.llvm.org/D141644

Added: 
    clang/test/Modules/dependency-gen-vfs.c

Modified: 
    clang/lib/Frontend/DependencyFile.cpp
    clang/lib/Frontend/ModuleDependencyCollector.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Frontend/DependencyFile.cpp b/clang/lib/Frontend/DependencyFile.cpp
index 6a0a7185acc1..e19ccdf78e42 100644
--- a/clang/lib/Frontend/DependencyFile.cpp
+++ b/clang/lib/Frontend/DependencyFile.cpp
@@ -108,7 +108,9 @@ struct DepCollectorMMCallbacks : public ModuleMapCallbacks {
 
 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,11 @@ struct DepCollectorASTListener : public ASTReaderListener {
     if (IsOverridden || IsExplicitModule)
       return true;
 
+    // Run this through the FileManager in order to respect 'use-external-name'
+    // in case we have a VFS overlay.
+    if (auto FE = FileMgr.getOptionalFileRef(Filename))
+      Filename = FE->getName();
+
     DepCollector.maybeAddDependency(Filename, /*FromModule*/true, IsSystem,
                                    /*IsModuleFile*/false, /*IsMissing*/false);
     return true;
@@ -176,7 +183,8 @@ void DependencyCollector::attachToPreprocessor(Preprocessor &PP) {
       std::make_unique<DepCollectorMMCallbacks>(*this));
 }
 void DependencyCollector::attachToASTReader(ASTReader &R) {
-  R.addListener(std::make_unique<DepCollectorASTListener>(*this));
+  R.addListener(
+      std::make_unique<DepCollectorASTListener>(*this, R.getFileManager()));
 }
 
 DependencyFileGenerator::DependencyFileGenerator(

diff  --git a/clang/lib/Frontend/ModuleDependencyCollector.cpp b/clang/lib/Frontend/ModuleDependencyCollector.cpp
index 99a2875d9533..b4b312bc93b9 100644
--- a/clang/lib/Frontend/ModuleDependencyCollector.cpp
+++ b/clang/lib/Frontend/ModuleDependencyCollector.cpp
@@ -26,13 +26,19 @@ namespace {
 /// 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 {
+    // Run this through the FileManager in order to respect 'use-external-name'
+    // in case we have a VFS overlay.
+    if (auto FE = FileMgr.getOptionalFileRef(Filename))
+      Filename = FE->getName();
     Collector.addFile(Filename);
     return true;
   }
@@ -99,7 +105,8 @@ struct ModuleDependencyMMCallbacks : public ModuleMapCallbacks {
 }
 
 void ModuleDependencyCollector::attachToASTReader(ASTReader &R) {
-  R.addListener(std::make_unique<ModuleDependencyListener>(*this));
+  R.addListener(
+      std::make_unique<ModuleDependencyListener>(*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
index 000000000000..83faa34fb18f
--- /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: FileCheck %s --input-file=%t/tu.d
+// CHECK:      {{.*}}tu.o: \
+// CHECK-NEXT: {{.*}}tu.c \
+// CHECK-NEXT: {{.*}}module.modulemap \
+// CHECK-NEXT: {{.*}}m-real.h


        


More information about the cfe-commits mailing list