Skip to content

Commit 24c2744

Browse files
committed
[ORC] Fix LazyReexports resource key management.
Multiple reentry points may be associated with a single key.
1 parent b07e7b7 commit 24c2744

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

llvm/include/llvm/ExecutionEngine/Orc/LazyReexports.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ class LazyReexportsManager : public ResourceManager {
230230
EmitTrampolinesFn EmitTrampolines;
231231
RedirectableSymbolManager &RSMgr;
232232

233-
DenseMap<ResourceKey, ExecutorAddr> KeyToReentryAddr;
233+
DenseMap<ResourceKey, std::vector<ExecutorAddr>> KeyToReentryAddr;
234234
DenseMap<ExecutorAddr, CallThroughInfo> CallThroughs;
235235
};
236236

llvm/lib/ExecutionEngine/Orc/LazyReexports.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -296,8 +296,11 @@ Error LazyReexportsManager::handleRemoveResources(JITDylib &JD, ResourceKey K) {
296296
JD.getExecutionSession().runSessionLocked([&]() {
297297
auto I = KeyToReentryAddr.find(K);
298298
if (I != KeyToReentryAddr.end()) {
299-
auto ReentryAddr = I->second;
300-
CallThroughs.erase(ReentryAddr);
299+
auto &ReentryAddrs = I->second;
300+
for (auto &ReentryAddr : ReentryAddrs) {
301+
assert(CallThroughs.count(ReentryAddr) && "CallTrhough missing");
302+
CallThroughs.erase(ReentryAddr);
303+
}
301304
KeyToReentryAddr.erase(I);
302305
}
303306
});
@@ -309,9 +312,18 @@ void LazyReexportsManager::handleTransferResources(JITDylib &JD,
309312
ResourceKey SrcK) {
310313
auto I = KeyToReentryAddr.find(SrcK);
311314
if (I != KeyToReentryAddr.end()) {
312-
auto ReentryAddr = I->second;
313-
KeyToReentryAddr.erase(I);
314-
KeyToReentryAddr[DstK] = ReentryAddr;
315+
auto J = KeyToReentryAddr.find(DstK);
316+
if (J == KeyToReentryAddr.end()) {
317+
auto Tmp = std::move(I->second);
318+
KeyToReentryAddr.erase(I);
319+
KeyToReentryAddr[DstK] = std::move(Tmp);
320+
} else {
321+
auto &SrcReentryAddrs = I->second;
322+
auto &DstReentryAddrs = J->second;
323+
for (auto &ReentryAddr : SrcReentryAddrs)
324+
DstReentryAddrs.push_back(std::move(ReentryAddr));
325+
KeyToReentryAddr.erase(I);
326+
}
315327
}
316328
}
317329

@@ -378,7 +390,7 @@ void LazyReexportsManager::emitRedirectableSymbols(
378390
const auto &ReentryPoint = (*ReentryPoints)[I++];
379391
CallThroughs[ReentryPoint.getAddress()] = {Name, AI.Aliasee,
380392
&MR->getTargetJITDylib()};
381-
KeyToReentryAddr[K] = ReentryPoint.getAddress();
393+
KeyToReentryAddr[K].push_back(ReentryPoint.getAddress());
382394
}
383395
})) {
384396
MR->getExecutionSession().reportError(std::move(Err));

0 commit comments

Comments
 (0)