summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Spencer <bigcheesegs@gmail.com>2021-12-14 11:18:31 -0700
committerMichael Spencer <michael_spencer@apple.com>2021-12-14 11:21:42 -0700
commit04192422c4e3b730c580498b8e948088cb15580b (patch)
tree11e56a4f34fe0e0b00b2deeb23682b81584a37a9
parentaeea20eebef57c6885282a2032c63eac36d33469 (diff)
downloadllvm-04192422c4e3b730c580498b8e948088cb15580b.tar.gz
[Clang][ScanDeps] Use the virtual path for module maps
Make clang-scan-deps use the virtual path for module maps instead of the on disk path. This is needed so that modulemap relative lookups are done correctly in the actual module builds. The file dependencies still use the on disk path as that's what matters for build invalidation. Differential Revision: https://reviews.llvm.org/D114206
-rw-r--r--clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp8
-rw-r--r--clang/test/ClangScanDeps/modulemap-via-vfs.m56
2 files changed, 63 insertions, 1 deletions
diff --git a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
index 9229c67c4178..086215e7a573 100644
--- a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
+++ b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp
@@ -237,7 +237,13 @@ ModuleID ModuleDepCollectorPP::handleTopLevelModule(const Module *M) {
.getHeaderSearchInfo()
.getModuleMap()
.getModuleMapFileForUniquing(M);
- MD.ClangModuleMapFile = std::string(ModuleMap ? ModuleMap->getName() : "");
+
+ if (ModuleMap) {
+ StringRef Path = ModuleMap->tryGetRealPathName();
+ if (Path.empty())
+ Path = ModuleMap->getName();
+ MD.ClangModuleMapFile = std::string(Path);
+ }
serialization::ModuleFile *MF =
MDC.ScanInstance.getASTReader()->getModuleManager().lookup(
diff --git a/clang/test/ClangScanDeps/modulemap-via-vfs.m b/clang/test/ClangScanDeps/modulemap-via-vfs.m
new file mode 100644
index 000000000000..cc152b63f483
--- /dev/null
+++ b/clang/test/ClangScanDeps/modulemap-via-vfs.m
@@ -0,0 +1,56 @@
+// RUN: rm -rf %t.dir
+// RUN: split-file %s %t.dir
+// RUN: sed -e "s|DIR|%/t.dir|g" %t.dir/build/compile-commands.json.in > %t.dir/build/compile-commands.json
+// RUN: sed -e "s|DIR|%/t.dir|g" %t.dir/build/vfs.yaml.in > %t.dir/build/vfs.yaml
+// RUN: clang-scan-deps -compilation-database %t.dir/build/compile-commands.json -j 1 -format experimental-full \
+// RUN: -mode preprocess-minimized-sources -generate-modules-path-args > %t.db
+// RUN: %python %S/../../utils/module-deps-to-rsp.py %t.db --module-name=A > %t.A.cc1.rsp
+// RUN: cat %t.A.cc1.rsp | sed 's:\\\\\?:/:g' | FileCheck %s
+
+// CHECK-NOT: build/module.modulemap
+// CHECK: A/module.modulemap
+
+//--- build/compile-commands.json.in
+
+[
+{
+ "directory": "DIR",
+ "command": "clang DIR/main.m -Imodules/A -fmodules -fmodules-cache-path=module-cache -fimplicit-modules -fimplicit-module-maps -ivfsoverlay build/vfs.yaml",
+ "file": "DIR/main.m"
+}
+]
+
+//--- build/module.modulemap
+
+module A {
+ umbrella header "A.h"
+}
+
+//--- modules/A/A.h
+
+typedef int A_t;
+
+//--- build/vfs.yaml.in
+
+{
+ "version": 0,
+ "case-sensitive": "false",
+ "roots": [
+ {
+ "contents": [
+ {
+ "external-contents": "DIR/build/module.modulemap",
+ "name": "module.modulemap",
+ "type": "file"
+ }],
+ "name": "DIR/modules/A",
+ "type": "directory"
+ }
+ ]
+}
+
+//--- main.m
+
+@import A;
+
+A_t a = 0;