aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Serialization/ModuleCache.cpp
diff options
context:
space:
mode:
authorJan Svoboda <jan_svoboda@apple.com>2025-05-19 10:01:43 -0700
committerJan Svoboda <jan_svoboda@apple.com>2025-05-19 10:40:55 -0700
commit7a242387c950c7060143da6da0e6fb91f36bb458 (patch)
tree8eb52a0390ea57a2ac909d72d66f5da493b7f3f4 /clang/lib/Serialization/ModuleCache.cpp
parent1b44eb2f6b862fb171629321bf2f5ec231899c71 (diff)
downloadllvm-7a242387c950c7060143da6da0e6fb91f36bb458.zip
llvm-7a242387c950c7060143da6da0e6fb91f36bb458.tar.gz
llvm-7a242387c950c7060143da6da0e6fb91f36bb458.tar.bz2
Reland "[clang][modules] Timestamp-less validation API (#139987)"
This reverts commit 18b885f66babff3a10451bc811ffc077d61ed8ee, effectively reapplying #139987. This commit fixes unit tests (for example ASTUnitTest.SaveLoadPreservesLangOptionsInPrintingPolicy) where the `ASTUnit::ModCache` pointer dereferenced within `ASTUnit::serialize()` was null. This commit makes sure each factory function does initialize `ASTUnit::ModCache`.
Diffstat (limited to 'clang/lib/Serialization/ModuleCache.cpp')
-rw-r--r--clang/lib/Serialization/ModuleCache.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/clang/lib/Serialization/ModuleCache.cpp b/clang/lib/Serialization/ModuleCache.cpp
index 4ae49c4..43f8ff8 100644
--- a/clang/lib/Serialization/ModuleCache.cpp
+++ b/clang/lib/Serialization/ModuleCache.cpp
@@ -20,7 +20,12 @@ namespace {
class CrossProcessModuleCache : public ModuleCache {
InMemoryModuleCache InMemory;
+ std::time_t BuildSessionTimestamp;
+
public:
+ explicit CrossProcessModuleCache(std::time_t BuildSessionTimestamp)
+ : BuildSessionTimestamp(BuildSessionTimestamp) {}
+
void prepareForGetLock(StringRef ModuleFilename) override {
// FIXME: Do this in LockFileManager and only if the directory doesn't
// exist.
@@ -33,16 +38,17 @@ public:
return std::make_unique<llvm::LockFileManager>(ModuleFilename);
}
- std::time_t getModuleTimestamp(StringRef ModuleFilename) override {
+ bool isMarkedUpToDate(StringRef ModuleFilename) override {
std::string TimestampFilename =
serialization::ModuleFile::getTimestampFilename(ModuleFilename);
llvm::sys::fs::file_status Status;
if (llvm::sys::fs::status(ModuleFilename, Status) != std::error_code{})
- return 0;
- return llvm::sys::toTimeT(Status.getLastModificationTime());
+ return false;
+ return llvm::sys::toTimeT(Status.getLastModificationTime()) >
+ BuildSessionTimestamp;
}
- void updateModuleTimestamp(StringRef ModuleFilename) override {
+ void markUpToDate(StringRef ModuleFilename) override {
// Overwrite the timestamp file contents so that file's mtime changes.
std::error_code EC;
llvm::raw_fd_ostream OS(
@@ -62,6 +68,8 @@ public:
};
} // namespace
-IntrusiveRefCntPtr<ModuleCache> clang::createCrossProcessModuleCache() {
- return llvm::makeIntrusiveRefCnt<CrossProcessModuleCache>();
+IntrusiveRefCntPtr<ModuleCache>
+clang::createCrossProcessModuleCache(std::time_t BuildSessionTimestamp) {
+ return llvm::makeIntrusiveRefCnt<CrossProcessModuleCache>(
+ BuildSessionTimestamp);
}