From 85d036ca19ea85ac195c347bb65f20693ed5000a Mon Sep 17 00:00:00 2001 From: RomainROCH Date: Sun, 4 Oct 2026 05:37:13 +0200 Subject: [PATCH] perf(relinker): reuse each segment scan across import records --- .../src/pipeline/RelinkerPipeline.cpp | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/core/relinker/relinker/src/pipeline/RelinkerPipeline.cpp b/core/relinker/relinker/src/pipeline/RelinkerPipeline.cpp index 295a798ec..aaa65bd21 100644 --- a/core/relinker/relinker/src/pipeline/RelinkerPipeline.cpp +++ b/core/relinker/relinker/src/pipeline/RelinkerPipeline.cpp @@ -296,15 +296,6 @@ RelinkResult RelinkerPipeline::Relink(const std::vector& sourceElf std::vector entries; entries.reserve(nidRefs.size()); for (const auto& ref : nidRefs) { - std::vector callSites; - bool callSitesResolved = false; - if (!executableSegments.empty()) { - for (const auto& [segment, segmentVAddr] : executableSegments) { - auto segmentSites = _callSiteResolver->ResolveCallSites(segment, segmentVAddr, ref.RelocationAddress, 8); - callSites.insert(callSites.end(), segmentSites.begin(), segmentSites.end()); - } - callSitesResolved = !callSites.empty(); - } CallRegistryEntry entry; entry.Nid = ref.Nid; entry.Library = ref.Library; @@ -312,11 +303,18 @@ RelinkResult RelinkerPipeline::Relink(const std::vector& sourceElf entry.RelocationOffset = ref.RelocationTableOffset; entry.TargetSection = ".got"; entry.TargetOffset = ref.RelocationAddress; - entry.CallSites = callSites; - entry.CallSitesResolved = callSitesResolved; + entry.CallSitesResolved = false; entries.push_back(std::move(entry)); } + for (const auto& [segment, segmentVAddr] : executableSegments) { + for (auto& entry : entries) { + auto segmentSites = _callSiteResolver->ResolveCallSites(segment, segmentVAddr, entry.TargetOffset, 8); + entry.CallSites.insert(entry.CallSites.end(), segmentSites.begin(), segmentSites.end()); + entry.CallSitesResolved = !entry.CallSites.empty(); + } + } + return RelinkResult{std::move(entries), std::move(programHeaders), std::move(dynSection), gotVAddr, std::move(patches)}; }