@@ -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