Skip to content

Commit 347028a

Browse files
committed
[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
1 parent 277a9f6 commit 347028a

File tree

3 files changed

+52
-5
lines changed

3 files changed

+52
-5
lines changed

clang/lib/Frontend/DependencyFile.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,9 @@ struct DepCollectorMMCallbacks : public ModuleMapCallbacks {
108108

109109
struct DepCollectorASTListener : public ASTReaderListener {
110110
DependencyCollector &DepCollector;
111-
DepCollectorASTListener(DependencyCollector &L) : DepCollector(L) { }
111+
FileManager &FileMgr;
112+
DepCollectorASTListener(DependencyCollector &L, FileManager &FileMgr)
113+
: DepCollector(L), FileMgr(FileMgr) {}
112114
bool needsInputFileVisitation() override { return true; }
113115
bool needsSystemInputFileVisitation() override {
114116
return DepCollector.needSystemDependencies();
@@ -124,6 +126,11 @@ struct DepCollectorASTListener : public ASTReaderListener {
124126
if (IsOverridden || IsExplicitModule)
125127
return true;
126128

129+
// Run this through the FileManager in order to respect 'use-external-name'
130+
// in case we have a VFS overlay.
131+
if (auto FE = FileMgr.getOptionalFileRef(Filename))
132+
Filename = FE->getName();
133+
127134
DepCollector.maybeAddDependency(Filename, /*FromModule*/true, IsSystem,
128135
/*IsModuleFile*/false, /*IsMissing*/false);
129136
return true;
@@ -176,7 +183,8 @@ void DependencyCollector::attachToPreprocessor(Preprocessor &PP) {
176183
std::make_unique<DepCollectorMMCallbacks>(*this));
177184
}
178185
void DependencyCollector::attachToASTReader(ASTReader &R) {
179-
R.addListener(std::make_unique<DepCollectorASTListener>(*this));
186+
R.addListener(
187+
std::make_unique<DepCollectorASTListener>(*this, R.getFileManager()));
180188
}
181189

182190
DependencyFileGenerator::DependencyFileGenerator(

clang/lib/Frontend/ModuleDependencyCollector.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,19 @@ namespace {
2626
/// Private implementations for ModuleDependencyCollector
2727
class ModuleDependencyListener : public ASTReaderListener {
2828
ModuleDependencyCollector &Collector;
29+
FileManager &FileMgr;
2930
public:
30-
ModuleDependencyListener(ModuleDependencyCollector &Collector)
31-
: Collector(Collector) {}
31+
ModuleDependencyListener(ModuleDependencyCollector &Collector,
32+
FileManager &FileMgr)
33+
: Collector(Collector), FileMgr(FileMgr) {}
3234
bool needsInputFileVisitation() override { return true; }
3335
bool needsSystemInputFileVisitation() override { return true; }
3436
bool visitInputFile(StringRef Filename, bool IsSystem, bool IsOverridden,
3537
bool IsExplicitModule) override {
38+
// Run this through the FileManager in order to respect 'use-external-name'
39+
// in case we have a VFS overlay.
40+
if (auto FE = FileMgr.getOptionalFileRef(Filename))
41+
Filename = FE->getName();
3642
Collector.addFile(Filename);
3743
return true;
3844
}
@@ -99,7 +105,8 @@ struct ModuleDependencyMMCallbacks : public ModuleMapCallbacks {
99105
}
100106

101107
void ModuleDependencyCollector::attachToASTReader(ASTReader &R) {
102-
R.addListener(std::make_unique<ModuleDependencyListener>(*this));
108+
R.addListener(
109+
std::make_unique<ModuleDependencyListener>(*this, R.getFileManager()));
103110
}
104111

105112
void ModuleDependencyCollector::attachToPreprocessor(Preprocessor &PP) {
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// RUN: rm -rf %t
2+
// RUN: split-file %s %t
3+
4+
//--- module.modulemap
5+
module M { header "m.h" }
6+
7+
//--- m-real.h
8+
9+
//--- overlay.json.template
10+
{
11+
"version": 0,
12+
"case-sensitive": "false",
13+
"roots": [
14+
{
15+
"external-contents": "DIR/m-real.h",
16+
"name": "DIR/m.h",
17+
"type": "file"
18+
}
19+
]
20+
}
21+
22+
//--- tu.c
23+
#include "m.h"
24+
25+
// RUN: sed -e "s|DIR|%/t|g" %t/overlay.json.template > %t/overlay.json
26+
// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache \
27+
// RUN: -ivfsoverlay %t/overlay.json -dependency-file %t/tu.d -MT %t/tu.o -fsyntax-only %t/tu.c
28+
// RUN: FileCheck %s --input-file=%t/tu.d
29+
// CHECK: {{.*}}tu.o: \
30+
// CHECK-NEXT: {{.*}}tu.c \
31+
// CHECK-NEXT: {{.*}}module.modulemap \
32+
// CHECK-NEXT: {{.*}}m-real.h

0 commit comments

Comments
 (0)