@@ -296,8 +296,11 @@ Error LazyReexportsManager::handleRemoveResources(JITDylib &JD, ResourceKey K) {
296
296
JD.getExecutionSession ().runSessionLocked ([&]() {
297
297
auto I = KeyToReentryAddr.find (K);
298
298
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
+ }
301
304
KeyToReentryAddr.erase (I);
302
305
}
303
306
});
@@ -309,9 +312,18 @@ void LazyReexportsManager::handleTransferResources(JITDylib &JD,
309
312
ResourceKey SrcK) {
310
313
auto I = KeyToReentryAddr.find (SrcK);
311
314
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
+ }
315
327
}
316
328
}
317
329
@@ -378,7 +390,7 @@ void LazyReexportsManager::emitRedirectableSymbols(
378
390
const auto &ReentryPoint = (*ReentryPoints)[I++];
379
391
CallThroughs[ReentryPoint.getAddress ()] = {Name, AI.Aliasee ,
380
392
&MR->getTargetJITDylib ()};
381
- KeyToReentryAddr[K] = ReentryPoint.getAddress ();
393
+ KeyToReentryAddr[K]. push_back ( ReentryPoint.getAddress () );
382
394
}
383
395
})) {
384
396
MR->getExecutionSession ().reportError (std::move (Err));
0 commit comments