Author: Cyndy Ishida
Date: 2025-12-19T16:54:57-08:00
New Revision: 36c27c63afb0b02c9b521e4eb975a789411c999b

URL: 
https://github.com/llvm/llvm-project/commit/36c27c63afb0b02c9b521e4eb975a789411c999b
DIFF: 
https://github.com/llvm/llvm-project/commit/36c27c63afb0b02c9b521e4eb975a789411c999b.diff

LOG: [clang][modules] print mtime of input files when recorded in 
"module-file-info" (#173120)

When debugging issues related to invalidation for implicit module
compilations, it can be helpful to consult the PCM to see what the saved
mtime was.

Added: 
    clang/test/Modules/module-file-info-mtime.m

Modified: 
    clang/include/clang/Serialization/ASTReader.h
    clang/lib/DependencyScanning/DependencyScannerImpl.cpp
    clang/lib/Frontend/FrontendActions.cpp
    clang/lib/Serialization/ASTReader.cpp
    clang/test/Modules/module_file_info.m

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Serialization/ASTReader.h 
b/clang/include/clang/Serialization/ASTReader.h
index 63f0fde60bb16..a720e5aca444b 100644
--- a/clang/include/clang/Serialization/ASTReader.h
+++ b/clang/include/clang/Serialization/ASTReader.h
@@ -254,7 +254,7 @@ class ASTReaderListener {
   /// \returns true to continue receiving the next input file, false to stop.
   virtual bool visitInputFileAsRequested(StringRef FilenameAsRequested,
                                          StringRef Filename, bool isSystem,
-                                         bool isOverridden,
+                                         bool isOverridden, time_t StoredTime,
                                          bool isExplicitModule) {
     return true;
   }

diff  --git a/clang/lib/DependencyScanning/DependencyScannerImpl.cpp 
b/clang/lib/DependencyScanning/DependencyScannerImpl.cpp
index f8226c0e6f6a7..d1369b26fda8b 100644
--- a/clang/lib/DependencyScanning/DependencyScannerImpl.cpp
+++ b/clang/lib/DependencyScanning/DependencyScannerImpl.cpp
@@ -111,7 +111,7 @@ class PrebuiltModuleListener : public ASTReaderListener {
   /// considered stable.
   bool visitInputFileAsRequested(StringRef FilenameAsRequested,
                                  StringRef Filename, bool isSystem,
-                                 bool isOverridden,
+                                 bool isOverridden, time_t StoredTime,
                                  bool isExplicitModule) override {
     if (StableDirs.empty())
       return false;

diff  --git a/clang/lib/Frontend/FrontendActions.cpp 
b/clang/lib/Frontend/FrontendActions.cpp
index e0c1d304e8290..f03b14058db40 100644
--- a/clang/lib/Frontend/FrontendActions.cpp
+++ b/clang/lib/Frontend/FrontendActions.cpp
@@ -798,7 +798,7 @@ namespace {
     /// \returns true to continue receiving the next input file, false to stop.
     bool visitInputFileAsRequested(StringRef FilenameAsRequested,
                                    StringRef Filename, bool isSystem,
-                                   bool isOverridden,
+                                   bool isOverridden, time_t StoredTime,
                                    bool isExplicitModule) override {
 
       Out.indent(2) << "Input file: " << FilenameAsRequested;
@@ -823,6 +823,9 @@ namespace {
 
       Out << "\n";
 
+      if (StoredTime > 0)
+        Out.indent(4) << "MTime: " << llvm::itostr(StoredTime) << "\n";
+
       return true;
     }
 

diff  --git a/clang/lib/Serialization/ASTReader.cpp 
b/clang/lib/Serialization/ASTReader.cpp
index cf60118d78aa1..57771aad0c317 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -6014,6 +6014,7 @@ bool ASTReader::readASTFileControlBlock(
         case INPUT_FILE_HASH:
           break;
         case INPUT_FILE:
+          time_t StoredTime = static_cast<time_t>(Record[2]);
           bool Overridden = static_cast<bool>(Record[3]);
           auto [UnresolvedFilenameAsRequested, UnresolvedFilename] =
               getUnresolvedInputFilenames(Record, Blob);
@@ -6029,7 +6030,7 @@ bool ASTReader::readASTFileControlBlock(
           }
           shouldContinue = Listener.visitInputFileAsRequested(
               *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden,
-              /*IsExplicitModule=*/false);
+              StoredTime, /*IsExplicitModule=*/false);
           break;
         }
         if (!shouldContinue)

diff  --git a/clang/test/Modules/module-file-info-mtime.m 
b/clang/test/Modules/module-file-info-mtime.m
new file mode 100644
index 0000000000000..5a7e6fabfc6a3
--- /dev/null
+++ b/clang/test/Modules/module-file-info-mtime.m
@@ -0,0 +1,23 @@
+// Check that mtime from a input file of a pcm is emitted, when it was built 
from an implicit module invocation.
+
+// RUN: rm -fr %t
+// RUN: split-file %s %t
+// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t/cache 
-fdisable-module-hash -fimplicit-module-maps %t/client.m -fsyntax-only 
-I%t/BuildDir
+// RUN: %clang_cc1 -module-file-info %t/cache/A.pcm | FileCheck %s
+
+// CHECK: Module name: A
+// CHECK: Module map file: {{.*}}module.modulemap
+// CHECK: Input file: {{.*}}A.h
+// CHECK-NEXT: MTime: {{[0-9]+}} 
+
+
+//--- BuildDir/A/module.modulemap
+module A [system] {
+  umbrella "."
+}
+
+//--- BuildDir/A/A.h
+typedef int local_t;
+
+//--- client.m
+#import <A/A.h>

diff  --git a/clang/test/Modules/module_file_info.m 
b/clang/test/Modules/module_file_info.m
index f5ba25d54b97c..2aa6c3feb3c6b 100644
--- a/clang/test/Modules/module_file_info.m
+++ b/clang/test/Modules/module_file_info.m
@@ -48,15 +48,15 @@
 // MACROS-NEXT: -DBLARG
 // MACROS-NEXT: -DWIBBLE=WOBBLE
 // CHECK: Input file: {{.*}}module.modulemap
-// CHECK-NEXT: Input file: {{.*}}module.private.modulemap
-// CHECK-NEXT: Input file: {{.*}}DependsOnModule.h
-// CHECK-NEXT: Input file: {{.*}}module.modulemap
-// CHECK-NEXT: Input file: {{.*}}other.h
-// CHECK-NEXT: Input file: {{.*}}not_cxx.h
-// CHECK-NEXT: Input file: {{.*}}not_coroutines.h
-// CHECK-NEXT: Input file: {{.*}}SubFramework.h
-// CHECK-NEXT: Input file: {{.*}}Other.h
-// CHECK-NEXT: Input file: {{.*}}DependsOnModulePrivate.h
+// CHECK: Input file: {{.*}}module.private.modulemap
+// CHECK: Input file: {{.*}}DependsOnModule.h
+// CHECK: Input file: {{.*}}module.modulemap
+// CHECK: Input file: {{.*}}other.h
+// CHECK: Input file: {{.*}}not_cxx.h
+// CHECK: Input file: {{.*}}not_coroutines.h
+// CHECK: Input file: {{.*}}SubFramework.h
+// CHECK: Input file: {{.*}}Other.h
+// CHECK: Input file: {{.*}}DependsOnModulePrivate.h
 
 // CHECK: Diagnostic options:
 // CHECK:   IgnoreWarnings: Yes


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to