diff options
Diffstat (limited to 'clang/lib/Lex/ModuleMap.cpp')
-rw-r--r-- | clang/lib/Lex/ModuleMap.cpp | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp index 0b136ae..824b2bb 100644 --- a/clang/lib/Lex/ModuleMap.cpp +++ b/clang/lib/Lex/ModuleMap.cpp @@ -482,7 +482,7 @@ void ModuleMap::diagnoseHeaderInclusion(Module *RequestingModule, if (RequestingModule) { resolveUses(RequestingModule, /*Complain=*/false); - resolveHeaderDirectives(RequestingModule); + resolveHeaderDirectives(RequestingModule, /*File=*/llvm::None); } bool Excluded = false; @@ -1191,25 +1191,35 @@ void ModuleMap::resolveHeaderDirectives(const FileEntry *File) const { auto BySize = LazyHeadersBySize.find(File->getSize()); if (BySize != LazyHeadersBySize.end()) { for (auto *M : BySize->second) - resolveHeaderDirectives(M); + resolveHeaderDirectives(M, File); LazyHeadersBySize.erase(BySize); } auto ByModTime = LazyHeadersByModTime.find(File->getModificationTime()); if (ByModTime != LazyHeadersByModTime.end()) { for (auto *M : ByModTime->second) - resolveHeaderDirectives(M); + resolveHeaderDirectives(M, File); LazyHeadersByModTime.erase(ByModTime); } } -void ModuleMap::resolveHeaderDirectives(Module *Mod) const { +void ModuleMap::resolveHeaderDirectives( + Module *Mod, llvm::Optional<const FileEntry *> File) const { bool NeedsFramework = false; - for (auto &Header : Mod->UnresolvedHeaders) - // This operation is logically const; we're just changing how we represent - // the header information for this file. - const_cast<ModuleMap*>(this)->resolveHeader(Mod, Header, NeedsFramework); - Mod->UnresolvedHeaders.clear(); + SmallVector<Module::UnresolvedHeaderDirective, 1> NewHeaders; + const auto Size = File ? File.getValue()->getSize() : 0; + const auto ModTime = File ? File.getValue()->getModificationTime() : 0; + + for (auto &Header : Mod->UnresolvedHeaders) { + if (File && ((Header.ModTime && Header.ModTime != ModTime) || + (Header.Size && Header.Size != Size))) + NewHeaders.push_back(Header); + else + // This operation is logically const; we're just changing how we represent + // the header information for this file. + const_cast<ModuleMap *>(this)->resolveHeader(Mod, Header, NeedsFramework); + } + Mod->UnresolvedHeaders.swap(NewHeaders); } void ModuleMap::addHeader(Module *Mod, Module::Header Header, |