[llvm] [llvm-symbolizer] Make symbolizer parse section relative syntax (PR #168524)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 6 22:30:00 PDT 2026
================
@@ -53,44 +53,39 @@ LLVMSymbolizer::LLVMSymbolizer(const Options &Opts)
LLVMSymbolizer::~LLVMSymbolizer() = default;
Expected<uint64_t>
-LLVMSymbolizer::getXCOFFSectionAddress(StringRef ModuleName,
+LLVMSymbolizer::getXCOFFSectionAddress(StringRef ModulePath,
XCOFF::SectionTypeFlags SectionTypeFlag,
StringRef SectionTypeName) {
// Check the cache first.
- auto CacheKey = std::make_pair(ModuleName.str(), SectionTypeFlag);
- auto It = XCOFFSectionBaseCache.find(CacheKey);
- if (It != XCOFFSectionBaseCache.end())
- return It->second;
-
- Expected<object::OwningBinary<object::Binary>> BinaryOrErr =
- object::createBinary(ModuleName);
- if (!BinaryOrErr)
- return BinaryOrErr.takeError();
-
- const auto *XCOFFObj =
- dyn_cast<object::XCOFFObjectFile>(BinaryOrErr->getBinary());
+ auto &FlagMap = XCOFFSectionBaseCache[ModulePath];
+ auto CachedIt = FlagMap.find(SectionTypeFlag);
+ if (CachedIt != FlagMap.end())
+ return CachedIt->second;
+
+ Expected<ObjectFile *> ObjOrErr =
+ getOrCreateObject(ModulePath.str(), Opts.DefaultArch);
+ if (!ObjOrErr)
+ return ObjOrErr.takeError();
+
+ const auto *XCOFFObj = dyn_cast<object::XCOFFObjectFile>(*ObjOrErr);
if (!XCOFFObj)
return createStringError(
"section type syntax is only supported for XCOFF objects");
- std::optional<uint64_t> SectionBase;
- for (const object::SectionRef &Section : XCOFFObj->sections()) {
- DataRefImpl SecRef = Section.getRawDataRefImpl();
- int32_t Flags = XCOFFObj->getSectionFlags(SecRef);
- if ((Flags & 0xFFFF) != SectionTypeFlag)
- continue;
- if (SectionBase)
- return createStringError("multiple '" + SectionTypeName +
- "' sections found in XCOFF object");
- SectionBase = Section.getAddress();
+ Expected<DataRefImpl> DRIOrErr = XCOFFObj->getSectionByType(SectionTypeFlag);
+ if (!DRIOrErr) {
+ consumeError(DRIOrErr.takeError());
+ return createStringError("multiple '" + SectionTypeName +
+ "' sections found in XCOFF object");
}
-
- if (!SectionBase)
+ DataRefImpl DRI = *DRIOrErr;
+ if (DRI.p == 0)
return createStringError("no '" + SectionTypeName +
"' section found in XCOFF object");
- XCOFFSectionBaseCache.emplace(CacheKey, *SectionBase);
- return *SectionBase;
+ uint64_t SectionBase = SectionRef(DRI, XCOFFObj).getAddress();
+ FlagMap[SectionTypeFlag] = SectionBase;
----------------
midhuncodes7 wrote:
used `operator[]` which does a single lookup
https://github.com/llvm/llvm-project/pull/168524
More information about the llvm-commits
mailing list