jansvoboda11 created this revision.
jansvoboda11 added reviewers: benlangmuir, bnbarham.
Herald added a subscriber: ributzka.
Herald added a project: All.
jansvoboda11 requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Since D135636 <https://reviews.llvm.org/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.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D141644
Files:
clang/lib/Frontend/DependencyFile.cpp
clang/lib/Frontend/ModuleDependencyCollector.cpp
clang/test/Modules/dependency-gen-vfs.c
Index: clang/test/Modules/dependency-gen-vfs.c
===================================================================
--- /dev/null
+++ 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
Index: clang/lib/Frontend/ModuleDependencyCollector.cpp
===================================================================
--- clang/lib/Frontend/ModuleDependencyCollector.cpp
+++ 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<ModuleDependencyListener>(*this));
+ R.addListener(
+ std::make_unique<ModuleDependencyListener>(*this, R.getFileManager()));
}
void ModuleDependencyCollector::attachToPreprocessor(Preprocessor &PP) {
Index: clang/lib/Frontend/DependencyFile.cpp
===================================================================
--- clang/lib/Frontend/DependencyFile.cpp
+++ 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<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(
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits