Author: Volodymyr Sapsai Date: 2025-11-19T20:17:43-08:00 New Revision: b39a9db3abc7abfa033a728ef29b5e5d3beb1cb5
URL: https://github.com/llvm/llvm-project/commit/b39a9db3abc7abfa033a728ef29b5e5d3beb1cb5 DIFF: https://github.com/llvm/llvm-project/commit/b39a9db3abc7abfa033a728ef29b5e5d3beb1cb5.diff LOG: [clang][deps] Add module map describing compiled module to file dependencies. (#160226) When we add the module map describing the compiled module to the command line, add it to the file dependencies as well. Discovered while working on reproducers where a command line input was missing in the captured files as it wasn't considered a dependency. Added: clang/test/ClangScanDeps/modules-current-modulemap-file-dep.c Modified: clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp clang/test/ClangScanDeps/modules-fmodule-name-no-module-built.m clang/test/ClangScanDeps/modules-header-sharing.m clang/test/ClangScanDeps/modules-implementation-module-map.c clang/test/ClangScanDeps/modules-implementation-private.m Removed: ################################################################################ diff --git a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp index 80d242a477a3a..3a99f8c882b8f 100644 --- a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp +++ b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp @@ -619,6 +619,13 @@ void ModuleDepCollectorPP::EndOfMainFile() { for (StringRef VFS : MDC.ScanInstance.getHeaderSearchOpts().VFSOverlayFiles) MDC.addFileDep(VFS); + if (Module *CurrentModule = PP.getCurrentModuleImplementation()) { + if (OptionalFileEntryRef CurrentModuleMap = + PP.getHeaderSearchInfo().getModuleMap().getModuleMapFileForUniquing( + CurrentModule)) + MDC.addFileDep(CurrentModuleMap->getName()); + } + for (const Module *M : MDC.ScanInstance.getPreprocessor().getAffectingClangModules()) if (!MDC.isPrebuiltModule(M)) diff --git a/clang/test/ClangScanDeps/modules-current-modulemap-file-dep.c b/clang/test/ClangScanDeps/modules-current-modulemap-file-dep.c new file mode 100644 index 0000000000000..e34bc876057d5 --- /dev/null +++ b/clang/test/ClangScanDeps/modules-current-modulemap-file-dep.c @@ -0,0 +1,57 @@ +// RUN: rm -rf %t +// RUN: split-file %s %t + +// RUN: sed -e "s|DIR|%/t|g" %t/vfs.yaml.in > %t/vfs.yaml + +// RUN: clang-scan-deps -format experimental-full -j 1 -- \ +// RUN: %clang -ivfsoverlay %t/vfs.yaml -fmodules -fimplicit-module-maps \ +// RUN: -fmodules-cache-path=%t/cache -fmodule-name=ModuleName \ +// RUN: -I %/t/remapped -c %t/header-impl.c -o %t/header-impl.o \ +// RUN: | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t + +// CHECK: "command-line": [ +// CHECK: "-fmodule-map-file=[[PREFIX]]/remapped/module.modulemap" +// CHECK: "file-deps": [ +// CHECK: "[[PREFIX]]/original/module.modulemap" + +// Verify that "file-deps" references actual on-disk module map and not using the virtual path. + +//--- vfs.yaml.in +{ + "version": 0, + "case-sensitive": "false", + "roots": [ + { + "name": "DIR/remapped", + "type": "directory", + "contents": [ + { + "name": "module.modulemap", + "type": "file", + "external-contents": "DIR/original/module.modulemap" + }, + { + "name": "header.h", + "type": "file", + "external-contents": "DIR/original/header.h" + } + ] + } + ] +} + +//--- original/module.modulemap +module ModuleName { + header "header.h" + export * +} + +//--- original/header.h +int foo_function(void); + +//--- header-impl.c +#include <header.h> + +int foo_function(void) { + return 0; +} diff --git a/clang/test/ClangScanDeps/modules-fmodule-name-no-module-built.m b/clang/test/ClangScanDeps/modules-fmodule-name-no-module-built.m index cfe29c2bf7cdb..f7edb011ad32a 100644 --- a/clang/test/ClangScanDeps/modules-fmodule-name-no-module-built.m +++ b/clang/test/ClangScanDeps/modules-fmodule-name-no-module-built.m @@ -46,7 +46,8 @@ // CHECK: "file-deps": [ // CHECK-NEXT: "[[PREFIX]]/modules-fmodule-name-no-module-built.m", // CHECK-NEXT: "[[PREFIX]]/Inputs/header3.h", -// CHECK-NEXT: "[[PREFIX]]/Inputs/header.h" +// CHECK-NEXT: "[[PREFIX]]/Inputs/header.h", +// CHECK-NEXT: "[[PREFIX]]/Inputs/module.modulemap" // CHECK-NEXT: ], // CHECK-NEXT: "input-file": "[[PREFIX]]/modules-fmodule-name-no-module-built.m" // CHECK-NEXT: } diff --git a/clang/test/ClangScanDeps/modules-header-sharing.m b/clang/test/ClangScanDeps/modules-header-sharing.m index 9bba435188721..c40c2891786cb 100644 --- a/clang/test/ClangScanDeps/modules-header-sharing.m +++ b/clang/test/ClangScanDeps/modules-header-sharing.m @@ -80,7 +80,8 @@ // CHECK: "file-deps": [ // CHECK-NEXT: "[[PREFIX]]/tu.m", // CHECK-NEXT: "[[PREFIX]]/shared/H.h", -// CHECK-NEXT: "[[PREFIX]]/overlay.json" +// CHECK-NEXT: "[[PREFIX]]/overlay.json", +// CHECK-NEXT: "[[PREFIX]]/frameworks/A.framework/Modules/module.modulemap" // CHECK-NEXT: ], // CHECK-NEXT: "input-file": "[[PREFIX]]/tu.m" // CHECK-NEXT: } diff --git a/clang/test/ClangScanDeps/modules-implementation-module-map.c b/clang/test/ClangScanDeps/modules-implementation-module-map.c index b7637d0c9143a..a7170aab2448c 100644 --- a/clang/test/ClangScanDeps/modules-implementation-module-map.c +++ b/clang/test/ClangScanDeps/modules-implementation-module-map.c @@ -28,7 +28,8 @@ framework module FWPrivate { header "private.h" } // CHECK: "-fmodule-name=FWPrivate", // CHECK: ], // CHECK: "file-deps": [ -// CHECK-NEXT: "[[PREFIX]]/tu.m" +// CHECK-NEXT: "[[PREFIX]]/tu.m", +// CHECK-NEXT: "[[PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap" // CHECK-NEXT: ], // CHECK-NEXT: "input-file": "[[PREFIX]]/tu.m" // CHECK-NEXT: } diff --git a/clang/test/ClangScanDeps/modules-implementation-private.m b/clang/test/ClangScanDeps/modules-implementation-private.m index b376073f4b9ee..210fbfb424aca 100644 --- a/clang/test/ClangScanDeps/modules-implementation-private.m +++ b/clang/test/ClangScanDeps/modules-implementation-private.m @@ -65,7 +65,8 @@ // CHECK: "file-deps": [ // CHECK-NEXT: "[[PREFIX]]/tu.m", // CHECK-NEXT: "[[PREFIX]]/frameworks/FW.framework/PrivateHeaders/Missed.h", -// CHECK-NEXT: "[[PREFIX]]/frameworks/FW.framework/Headers/FW.h" +// CHECK-NEXT: "[[PREFIX]]/frameworks/FW.framework/Headers/FW.h", +// CHECK-NEXT: "[[PREFIX]]/frameworks/FW.framework/Modules/module.modulemap" // CHECK-NEXT: ], // CHECK-NEXT: "input-file": "[[PREFIX]]/tu.m" // CHECK-NEXT: } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
