================ @@ -6831,43 +6832,60 @@ std::optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, return false; } -namespace { - - /// Visitor used to search for information about a header file. - class HeaderFileInfoVisitor { - FileEntryRef FE; - std::optional<HeaderFileInfo> HFI; - - public: - explicit HeaderFileInfoVisitor(FileEntryRef FE) : FE(FE) {} - - bool operator()(ModuleFile &M) { - HeaderFileInfoLookupTable *Table - = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); - if (!Table) - return false; +static void mergeHeaderFileInfoModuleBits(HeaderFileInfo &HFI, + bool isModuleHeader, + bool isTextualModuleHeader) { + HFI.isModuleHeader |= isModuleHeader; + if (HFI.isModuleHeader) + HFI.isTextualModuleHeader = false; + else + HFI.isTextualModuleHeader |= isTextualModuleHeader; +} - // Look in the on-disk hash table for an entry for this file name. - HeaderFileInfoLookupTable::iterator Pos = Table->find(FE); - if (Pos == Table->end()) - return false; +/// Merge the header file info provided by \p OtherHFI into the current +/// header file info (\p HFI) +static void mergeHeaderFileInfo(HeaderFileInfo &HFI, + const HeaderFileInfo &OtherHFI) { + assert(OtherHFI.External && "expected to merge external HFI"); - HFI = *Pos; - return true; - } + HFI.isImport |= OtherHFI.isImport; + HFI.isPragmaOnce |= OtherHFI.isPragmaOnce; + mergeHeaderFileInfoModuleBits(HFI, OtherHFI.isModuleHeader, + OtherHFI.isTextualModuleHeader); - std::optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } - }; + if (!HFI.LazyControllingMacro.isValid()) + HFI.LazyControllingMacro = OtherHFI.LazyControllingMacro; -} // namespace + HFI.DirInfo = OtherHFI.DirInfo; + HFI.External = (!HFI.IsValid || HFI.External); + HFI.IsValid = true; +} HeaderFileInfo ASTReader::GetHeaderFileInfo(FileEntryRef FE) { - HeaderFileInfoVisitor Visitor(FE); - ModuleMgr.visit(Visitor); - if (std::optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) - return *HFI; - - return HeaderFileInfo(); + for (auto Iter = ModuleMgr.begin() + HeaderFileInfoIdx, End = ModuleMgr.end(); + Iter != End; ++Iter) { + if (auto *Table = static_cast<HeaderFileInfoLookupTable *>( + Iter->HeaderFileInfoTable)) { + auto &Info = Table->getInfoObj(); + for (auto Iter = Table->data_begin(), End = Table->data_end(); + Iter != End; ++Iter) { + const auto *Item = Iter.getItem(); + // Determine the length of the key and the data. + const auto &[KeyLen, DataLen] = + HeaderFileInfoTrait::ReadKeyDataLength(Item); ---------------- ChuanqiXu9 wrote:
nit: maybe it is better to wrap such logics in ASTReaderInternals.h https://github.com/llvm/llvm-project/pull/140867 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits