[llvm] big archive recognition by the llvm-symbolizer (PR #150401)
James Henderson via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 20 00:10:04 PDT 2025
================
@@ -570,35 +569,69 @@ LLVMSymbolizer::getOrCreateObjectPair(const std::string &Path,
return Res;
}
-Expected<ObjectFile *> LLVMSymbolizer::getOrCreateObjectFromArchive(
- StringRef ArchivePath, StringRef MemberName, StringRef ArchName) {
- Binary *Bin = nullptr;
- auto Pair = BinaryForPath.emplace(ArchivePath.str(), OwningBinary<Binary>());
+Expected<object::Binary *>
+LLVMSymbolizer::loadOrGetBinary(const std::string &Path) {
+ auto Pair = BinaryForPath.emplace(Path, OwningBinary<Binary>());
if (!Pair.second) {
- Bin = Pair.first->second->getBinary();
recordAccess(Pair.first->second);
- } else {
- Expected<OwningBinary<Binary>> ArchiveOrErr = createBinary(ArchivePath);
- if (!ArchiveOrErr)
- return ArchiveOrErr.takeError();
+ return Pair.first->second->getBinary();
+ }
+
+ Expected<OwningBinary<Binary>> BinOrErr = createBinary(Path);
+ if (!BinOrErr) {
+ BinaryForPath.erase(Pair.first);
+ return BinOrErr.takeError();
+ }
+
+ CachedBinary &CachedBin = Pair.first->second;
+ CachedBin = std::move(*BinOrErr);
+ CachedBin.pushEvictor([this, I = Pair.first]() { BinaryForPath.erase(I); });
+ LRUBinaries.push_back(CachedBin);
+ CacheSize += CachedBin.size();
+ return CachedBin->getBinary();
+}
+
+Expected<ObjectFile *> LLVMSymbolizer::findOrCacheObject(
+ const ArchiveCacheKey &Key,
+ llvm::function_ref<Expected<std::unique_ptr<ObjectFile>>()> Loader,
+ const std::string &PathForBinaryCache) {
- CachedBinary &CachedBin = Pair.first->second;
- CachedBin = std::move(ArchiveOrErr.get());
- CachedBin.pushEvictor([this, I = Pair.first]() { BinaryForPath.erase(I); });
- LRUBinaries.push_back(CachedBin);
- CacheSize += CachedBin.size();
- Bin = CachedBin->getBinary();
+ auto It = ObjectFileCache.find(Key);
+ if (It != ObjectFileCache.end())
+ return It->second.get();
+
+ Expected<std::unique_ptr<ObjectFile>> ObjOrErr = Loader();
+ if (!ObjOrErr) {
+ ObjectFileCache.emplace(Key, std::unique_ptr<ObjectFile>());
+ return ObjOrErr.takeError();
}
+ ObjectFile *Res = ObjOrErr->get();
+ auto NewEntry = ObjectFileCache.emplace(Key, std::move(*ObjOrErr));
+ auto CacheIter = BinaryForPath.find(PathForBinaryCache);
+ if (CacheIter != BinaryForPath.end())
+ CacheIter->second.pushEvictor(
+ [this, Iter = NewEntry.first]() { ObjectFileCache.erase(Iter); });
+ return Res;
+}
+
+Expected<ObjectFile *> LLVMSymbolizer::getOrCreateObjectFromArchive(
+ StringRef ArchivePath, StringRef MemberName, StringRef ArchName) {
+ Expected<object::Binary *> BinOrErr = loadOrGetBinary(ArchivePath.str());
+ if (!BinOrErr)
+ return BinOrErr.takeError();
+ object::Binary *Bin = *BinOrErr;
+
object::Archive *Archive = dyn_cast_if_present<object::Archive>(Bin);
if (!Archive)
- return errorCodeToError(object_error::invalid_file_type);
+ return createStringError(std::errc::invalid_argument,
----------------
jh7370 wrote:
Test case?
https://github.com/llvm/llvm-project/pull/150401
More information about the llvm-commits
mailing list