summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization/ModuleManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Serialization/ModuleManager.cpp')
-rw-r--r--clang/lib/Serialization/ModuleManager.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/clang/lib/Serialization/ModuleManager.cpp b/clang/lib/Serialization/ModuleManager.cpp
index 66f18158a69..c3152c0b021 100644
--- a/clang/lib/Serialization/ModuleManager.cpp
+++ b/clang/lib/Serialization/ModuleManager.cpp
@@ -152,9 +152,20 @@ void ModuleManager::removeModules(ModuleIterator first, ModuleIterator last,
// Delete the modules and erase them from the various structures.
for (ModuleIterator victim = first; victim != last; ++victim) {
- Modules.erase((*victim)->File);
+ const FileEntry *F = (*victim)->File;
+ Modules.erase(F);
+
+ // Refresh the stat() information for the module file so stale information
+ // doesn't get stored accidentally.
+ vfs::Status UpdatedStat;
+ if (FileMgr.getNoncachedStatValue(F->getName(), UpdatedStat)) {
+ llvm::report_fatal_error(Twine("module file '") + F->getName() +
+ "' removed after it has been used");
+ } else {
+ FileMgr.modifyFileEntry(const_cast<FileEntry *>(F), UpdatedStat.getSize(),
+ UpdatedStat.getLastModificationTime().toEpochTime());
+ }
- FileMgr.invalidateCache((*victim)->File);
if (modMap) {
StringRef ModuleName = (*victim)->ModuleName;
if (Module *mod = modMap->findModule(ModuleName)) {
OpenPOWER on IntegriCloud