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

Reply via email to