[llvm] [CGData] Lazy loading support for stable function map (PR #151660)
Ellis Hoag via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 14 07:44:45 PDT 2025
================
@@ -114,25 +117,63 @@ size_t StableFunctionMap::size(SizeType Type) const {
case UniqueHashCount:
return HashToFuncs.size();
case TotalFunctionCount: {
+ deserializeLazyLoadingEntries();
size_t Count = 0;
for (auto &Funcs : HashToFuncs)
- Count += Funcs.second.size();
+ Count += Funcs.second.Entries.size();
return Count;
}
case MergeableFunctionCount: {
+ deserializeLazyLoadingEntries();
size_t Count = 0;
for (auto &[Hash, Funcs] : HashToFuncs)
- if (Funcs.size() >= 2)
- Count += Funcs.size();
+ if (Funcs.Entries.size() >= 2)
+ Count += Funcs.Entries.size();
return Count;
}
}
llvm_unreachable("Unhandled size type");
}
+const StableFunctionMap::StableFunctionEntries &
+StableFunctionMap::at(HashFuncsMapType::key_type FunctionHash) const {
+ auto It = HashToFuncs.find(FunctionHash);
+ if (isLazilyLoaded())
+ deserializeLazyLoadingEntry(It);
+ return It->second.Entries;
+}
+
+void StableFunctionMap::deserializeLazyLoadingEntry(
+ HashFuncsMapType::iterator It) const {
+ assert(isLazilyLoaded() && "Cannot deserialize non-lazily-loaded map");
+ auto &[Hash, Storage] = *It;
+ std::call_once(Storage.LazyLoadFlag,
+ [this, HashArg = Hash, &StorageArg = Storage]() {
+ for (auto Offset : StorageArg.Offsets)
+ StableFunctionMapRecord::deserializeEntry(
+ reinterpret_cast<const unsigned char *>(Offset),
+ HashArg, const_cast<StableFunctionMap *>(this));
----------------
ellishg wrote:
Yeah I agree that would be weird
https://github.com/llvm/llvm-project/pull/151660
More information about the llvm-commits
mailing list