Bigcheese created this revision. Bigcheese added reviewers: jansvoboda11, dexonsmith. Bigcheese added a project: clang. Bigcheese requested review of this revision. Herald added a subscriber: cfe-commits.
This patch makes 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. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D114206 Files: clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp clang/test/ClangScanDeps/modulemap-via-vfs.m Index: clang/test/ClangScanDeps/modulemap-via-vfs.m =================================================================== --- /dev/null +++ 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: FileCheck %s < %t.A.cc1.rsp + +// CHECK-NOT: build/module.modulemap +// CHECK: A/module.modulemap + +//--- build/compile-commands.json.in + +[ +{ + "directory": "DIR", + "command": "clang 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; Index: clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp =================================================================== --- clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp +++ clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp @@ -252,7 +252,13 @@ .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(
Index: clang/test/ClangScanDeps/modulemap-via-vfs.m =================================================================== --- /dev/null +++ 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: FileCheck %s < %t.A.cc1.rsp + +// CHECK-NOT: build/module.modulemap +// CHECK: A/module.modulemap + +//--- build/compile-commands.json.in + +[ +{ + "directory": "DIR", + "command": "clang 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; Index: clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp =================================================================== --- clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp +++ clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp @@ -252,7 +252,13 @@ .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(
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits