mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-25 21:11:25 +00:00
[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
This commit is contained in:
parent
277a9f6e5f
commit
347028a4d8
@ -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(
|
||||
|
@ -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) {
|
||||
|
32
clang/test/Modules/dependency-gen-vfs.c
Normal file
32
clang/test/Modules/dependency-gen-vfs.c
Normal file
@ -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
|
Loading…
x
Reference in New Issue
Block a user