diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/clang/include/clang/Basic/DiagnosticFrontendKinds.td index fac9d81ee542a..064c81b72ee21 100644 --- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td +++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td @@ -110,8 +110,7 @@ def err_fe_expected_clang_command : Error< "expected a clang compiler command">; def err_fe_remap_missing_to_file : Error< "could not remap file '%0' to the contents of file '%1'">, DefaultFatal; -def err_fe_unable_to_load_pch : Error< - "unable to load PCH file">; +def err_fe_unable_to_load_ast_file : Error<"unable to load precompiled file">; def err_fe_unable_to_load_plugin : Error< "unable to load plugin '%0': '%1'">; def err_fe_unable_to_create_target : Error< diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index d1036a183b3a8..797acf5a8d931 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -244,7 +244,7 @@ class ASTReaderListener { /// \returns true to continue receiving the next input file, false to stop. virtual bool visitInputFile(StringRef FilenameAsRequested, StringRef Filename, bool isSystem, bool isOverridden, - bool isExplicitModule) { + time_t StoredTime, bool isExplicitModule) { return true; } diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index 06ab9930a5861..5e1aadb10ffb3 100644 --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -888,7 +888,7 @@ std::unique_ptr ASTUnit::LoadFromASTFile( case ASTReader::VersionMismatch: case ASTReader::ConfigurationMismatch: case ASTReader::HadErrors: - AST->getDiagnostics().Report(diag::err_fe_unable_to_load_pch); + AST->getDiagnostics().Report(diag::err_fe_unable_to_load_ast_file); return nullptr; } diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp index 1b3d707240b41..adfeee9963750 100644 --- a/clang/lib/Frontend/FrontendActions.cpp +++ b/clang/lib/Frontend/FrontendActions.cpp @@ -795,7 +795,7 @@ namespace { /// /// \returns true to continue receiving the next input file, false to stop. bool visitInputFile(StringRef FilenameAsRequested, StringRef Filename, - bool isSystem, bool isOverridden, + bool isSystem, bool isOverridden, time_t StoredTime, bool isExplicitModule) override { Out.indent(2) << "Input file: " << FilenameAsRequested; @@ -820,6 +820,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 b719396cc60eb..e948eb3a13488 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -6015,6 +6015,7 @@ bool ASTReader::readASTFileControlBlock( case INPUT_FILE_HASH: break; case INPUT_FILE: + time_t StoredTime = static_cast(Record[2]); bool Overridden = static_cast(Record[3]); auto [UnresolvedFilenameAsRequested, UnresolvedFilename] = getUnresolvedInputFilenames(Record, Blob); @@ -6030,7 +6031,7 @@ bool ASTReader::readASTFileControlBlock( } shouldContinue = Listener.visitInputFile( *FilenameAsRequestedBuf, Filename, isSystemFile, Overridden, - /*IsExplicitModule=*/false); + StoredTime, /*IsExplicitModule=*/false); break; } if (!shouldContinue) diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScannerImpl.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScannerImpl.cpp index 7c12e3f82df6b..c99cd0c19fbae 100644 --- a/clang/lib/Tooling/DependencyScanning/DependencyScannerImpl.cpp +++ b/clang/lib/Tooling/DependencyScanning/DependencyScannerImpl.cpp @@ -120,7 +120,7 @@ class PrebuiltModuleListener : public ASTReaderListener { /// stable directory. Traversal is stopped if the current module is not /// considered stable. bool visitInputFile(StringRef FilenameAsRequested, StringRef Filename, - bool isSystem, bool isOverridden, + bool isSystem, bool isOverridden, time_t StoredTime, bool isExplicitModule) override { if (StableDirs.empty()) return false; 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 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