[clang] [WIP][C++20][Modules] Lazily, but fully load 'HeaderFileInfo' table into memory. (PR #140867)
Chuanqi Xu via cfe-commits
cfe-commits at lists.llvm.org
Wed May 21 19:16:16 PDT 2025
================
@@ -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
More information about the cfe-commits
mailing list