diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-11-07 17:46:15 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-11-07 17:46:15 +0000 |
commit | 188dbef26df3901195869ff19273323d657e995f (patch) | |
tree | bd511d7f3af88db0e1ada6ef900c9e72815459d3 /clang/lib/Serialization/ModuleManager.cpp | |
parent | b9db60fbce070a0eef80de620ac59b2a1b8869ec (diff) | |
download | bcm5719-llvm-188dbef26df3901195869ff19273323d657e995f.tar.gz bcm5719-llvm-188dbef26df3901195869ff19273323d657e995f.zip |
When loading a module fails because it is out of date, rebuild that
module in place. <rdar://problem/10138913>
llvm-svn: 167539
Diffstat (limited to 'clang/lib/Serialization/ModuleManager.cpp')
-rw-r--r-- | clang/lib/Serialization/ModuleManager.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/clang/lib/Serialization/ModuleManager.cpp b/clang/lib/Serialization/ModuleManager.cpp index c46e9f06083..efe442101bb 100644 --- a/clang/lib/Serialization/ModuleManager.cpp +++ b/clang/lib/Serialization/ModuleManager.cpp @@ -88,6 +88,45 @@ ModuleManager::addModule(StringRef FileName, ModuleKind Type, return std::make_pair(ModuleEntry, NewModule); } +namespace { + /// \brief Predicate that checks whether a module file occurs within + /// the given set. + class IsInModuleFileSet : public std::unary_function<ModuleFile *, bool> { + llvm::SmallPtrSet<ModuleFile *, 4> &Removed; + + public: + IsInModuleFileSet(llvm::SmallPtrSet<ModuleFile *, 4> &Removed) + : Removed(Removed) { } + + bool operator()(ModuleFile *MF) const { + return Removed.count(MF); + } + }; +} + +void ModuleManager::removeModules(ModuleIterator first, ModuleIterator last) { + if (first == last) + return; + + // Collect the set of module file pointers that we'll be removing. + llvm::SmallPtrSet<ModuleFile *, 4> victimSet(first, last); + + // Remove any references to the now-destroyed modules. + IsInModuleFileSet checkInSet(victimSet); + for (unsigned i = 0, n = Chain.size(); i != n; ++i) { + Chain[i]->ImportedBy.remove_if(checkInSet); + } + + // Delete the modules and erase them from the various structures. + for (ModuleIterator victim = first; victim != last; ++victim) { + Modules.erase((*victim)->File); + delete *victim; + } + + // Remove the modules from the chain. + Chain.erase(first, last); +} + void ModuleManager::addInMemoryBuffer(StringRef FileName, llvm::MemoryBuffer *Buffer) { |