1 //===-- WinEHPrepare - Prepare exception handling for code generation ---===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This pass lowers LLVM IR exception handling into something closer to what the 11 // backend wants for functions using a personality function from a runtime 12 // provided by MSVC. Functions with other personality functions are left alone 13 // and may be prepared by other passes. In particular, all supported MSVC 14 // personality functions require cleanup code to be outlined, and the C++ 15 // personality requires catch handler code to be outlined. 16 // 17 //===----------------------------------------------------------------------===// 18 19 #include "llvm/CodeGen/Passes.h" 20 #include "llvm/ADT/SetVector.h" 21 #include "llvm/Analysis/CFG.h" 22 #include "llvm/Analysis/EHPersonalities.h" 23 #include "llvm/CodeGen/WinEHFuncInfo.h" 24 #include "llvm/Pass.h" 25 #include "llvm/Support/Debug.h" 26 #include "llvm/Support/raw_ostream.h" 27 #include "llvm/Transforms/Utils/BasicBlockUtils.h" 28 #include "llvm/Transforms/Utils/Cloning.h" 29 #include "llvm/Transforms/Utils/Local.h" 30 #include "llvm/Transforms/Utils/SSAUpdater.h" 31 32 using namespace llvm; 33 34 #define DEBUG_TYPE "winehprepare" 35 36 static cl::opt<bool> DisableDemotion( 37 "disable-demotion", cl::Hidden, 38 cl::desc( 39 "Clone multicolor basic blocks but do not demote cross funclet values"), 40 cl::init(false)); 41 42 static cl::opt<bool> DisableCleanups( 43 "disable-cleanups", cl::Hidden, 44 cl::desc("Do not remove implausible terminators or other similar cleanups"), 45 cl::init(false)); 46 47 namespace { 48 49 class WinEHPrepare : public FunctionPass { 50 public: 51 static char ID; // Pass identification, replacement for typeid. 52 WinEHPrepare(const TargetMachine *TM = nullptr) : FunctionPass(ID) {} 53 54 bool runOnFunction(Function &Fn) override; 55 56 bool doFinalization(Module &M) override; 57 58 void getAnalysisUsage(AnalysisUsage &AU) const override; 59 60 const char *getPassName() const override { 61 return "Windows exception handling preparation"; 62 } 63 64 private: 65 void insertPHIStores(PHINode *OriginalPHI, AllocaInst *SpillSlot); 66 void 67 insertPHIStore(BasicBlock *PredBlock, Value *PredVal, AllocaInst *SpillSlot, 68 SmallVectorImpl<std::pair<BasicBlock *, Value *>> &Worklist); 69 AllocaInst *insertPHILoads(PHINode *PN, Function &F); 70 void replaceUseWithLoad(Value *V, Use &U, AllocaInst *&SpillSlot, 71 DenseMap<BasicBlock *, Value *> &Loads, Function &F); 72 bool prepareExplicitEH(Function &F, 73 SmallVectorImpl<BasicBlock *> &EntryBlocks); 74 void replaceTerminatePadWithCleanup(Function &F); 75 void colorFunclets(Function &F, SmallVectorImpl<BasicBlock *> &EntryBlocks); 76 void resolveFuncletAncestry(Function &F, 77 SmallVectorImpl<BasicBlock *> &EntryBlocks); 78 void resolveFuncletAncestryForPath( 79 Function &F, SmallVectorImpl<BasicBlock *> &FuncletPath, 80 std::map<BasicBlock *, BasicBlock *> &IdentityMap); 81 void makeFuncletEdgeUnreachable(BasicBlock *Parent, BasicBlock *Child); 82 BasicBlock *cloneFuncletForParent(Function &F, BasicBlock *FuncletEntry, 83 BasicBlock *Parent); 84 void updateTerminatorsAfterFuncletClone( 85 Function &F, BasicBlock *OrigFunclet, BasicBlock *CloneFunclet, 86 BasicBlock *OrigBlock, BasicBlock *CloneBlock, BasicBlock *CloneParent, 87 ValueToValueMapTy &VMap, 88 std::map<BasicBlock *, BasicBlock *> &Orig2Clone); 89 90 void demotePHIsOnFunclets(Function &F); 91 void cloneCommonBlocks(Function &F, 92 SmallVectorImpl<BasicBlock *> &EntryBlocks); 93 void removeImplausibleTerminators(Function &F); 94 void cleanupPreparedFunclets(Function &F); 95 void verifyPreparedFunclets(Function &F); 96 97 // All fields are reset by runOnFunction. 98 EHPersonality Personality = EHPersonality::Unknown; 99 100 std::map<BasicBlock *, SetVector<BasicBlock *>> BlockColors; 101 std::map<BasicBlock *, std::set<BasicBlock *>> FuncletBlocks; 102 std::map<BasicBlock *, std::vector<BasicBlock *>> FuncletChildren; 103 std::map<BasicBlock *, std::vector<BasicBlock *>> FuncletParents; 104 105 // This is a flag that indicates an uncommon situation where we need to 106 // clone funclets has been detected. 107 bool FuncletCloningRequired = false; 108 // When a funclet with multiple parents contains a catchret, the block to 109 // which it returns will be cloned so that there is a copy in each parent 110 // but one of the copies will not be properly linked to the catchret and 111 // in most cases will have no predecessors. This double map allows us 112 // to find these cloned blocks when we clone the child funclet. 113 std::map<BasicBlock *, std::map<BasicBlock *, BasicBlock*>> EstrangedBlocks; 114 }; 115 116 } // end anonymous namespace 117 118 char WinEHPrepare::ID = 0; 119 INITIALIZE_TM_PASS(WinEHPrepare, "winehprepare", "Prepare Windows exceptions", 120 false, false) 121 122 FunctionPass *llvm::createWinEHPass(const TargetMachine *TM) { 123 return new WinEHPrepare(TM); 124 } 125 126 static void findFuncletEntryPoints(Function &Fn, 127 SmallVectorImpl<BasicBlock *> &EntryBlocks) { 128 EntryBlocks.push_back(&Fn.getEntryBlock()); 129 for (BasicBlock &BB : Fn) { 130 Instruction *First = BB.getFirstNonPHI(); 131 if (!First->isEHPad()) 132 continue; 133 assert(!isa<LandingPadInst>(First) && 134 "landingpad cannot be used with funclet EH personality"); 135 // Find EH pad blocks that represent funclet start points. 136 if (!isa<CatchEndPadInst>(First) && !isa<CleanupEndPadInst>(First)) 137 EntryBlocks.push_back(&BB); 138 } 139 } 140 141 bool WinEHPrepare::runOnFunction(Function &Fn) { 142 if (!Fn.hasPersonalityFn()) 143 return false; 144 145 // Classify the personality to see what kind of preparation we need. 146 Personality = classifyEHPersonality(Fn.getPersonalityFn()); 147 148 // Do nothing if this is not a funclet-based personality. 149 if (!isFuncletEHPersonality(Personality)) 150 return false; 151 152 // Remove unreachable blocks. It is not valuable to assign them a color and 153 // their existence can trick us into thinking values are alive when they are 154 // not. 155 removeUnreachableBlocks(Fn); 156 157 SmallVector<BasicBlock *, 4> EntryBlocks; 158 findFuncletEntryPoints(Fn, EntryBlocks); 159 return prepareExplicitEH(Fn, EntryBlocks); 160 } 161 162 bool WinEHPrepare::doFinalization(Module &M) { return false; } 163 164 void WinEHPrepare::getAnalysisUsage(AnalysisUsage &AU) const {} 165 166 static int addUnwindMapEntry(WinEHFuncInfo &FuncInfo, int ToState, 167 const BasicBlock *BB) { 168 CxxUnwindMapEntry UME; 169 UME.ToState = ToState; 170 UME.Cleanup = BB; 171 FuncInfo.CxxUnwindMap.push_back(UME); 172 return FuncInfo.getLastStateNumber(); 173 } 174 175 static void addTryBlockMapEntry(WinEHFuncInfo &FuncInfo, int TryLow, 176 int TryHigh, int CatchHigh, 177 ArrayRef<const CatchPadInst *> Handlers) { 178 WinEHTryBlockMapEntry TBME; 179 TBME.TryLow = TryLow; 180 TBME.TryHigh = TryHigh; 181 TBME.CatchHigh = CatchHigh; 182 assert(TBME.TryLow <= TBME.TryHigh); 183 for (const CatchPadInst *CPI : Handlers) { 184 WinEHHandlerType HT; 185 Constant *TypeInfo = cast<Constant>(CPI->getArgOperand(0)); 186 if (TypeInfo->isNullValue()) 187 HT.TypeDescriptor = nullptr; 188 else 189 HT.TypeDescriptor = cast<GlobalVariable>(TypeInfo->stripPointerCasts()); 190 HT.Adjectives = cast<ConstantInt>(CPI->getArgOperand(1))->getZExtValue(); 191 HT.Handler = CPI->getParent(); 192 if (isa<ConstantPointerNull>(CPI->getArgOperand(2))) 193 HT.CatchObj.Alloca = nullptr; 194 else 195 HT.CatchObj.Alloca = cast<AllocaInst>(CPI->getArgOperand(2)); 196 TBME.HandlerArray.push_back(HT); 197 } 198 FuncInfo.TryBlockMap.push_back(TBME); 199 } 200 201 static const CatchPadInst *getSingleCatchPadPredecessor(const BasicBlock *BB) { 202 for (const BasicBlock *PredBlock : predecessors(BB)) 203 if (auto *CPI = dyn_cast<CatchPadInst>(PredBlock->getFirstNonPHI())) 204 return CPI; 205 return nullptr; 206 } 207 208 /// Find all the catchpads that feed directly into the catchendpad. Frontends 209 /// using this personality should ensure that each catchendpad and catchpad has 210 /// one or zero catchpad predecessors. 211 /// 212 /// The following C++ generates the IR after it: 213 /// try { 214 /// } catch (A) { 215 /// } catch (B) { 216 /// } 217 /// 218 /// IR: 219 /// %catchpad.A 220 /// catchpad [i8* A typeinfo] 221 /// to label %catch.A unwind label %catchpad.B 222 /// %catchpad.B 223 /// catchpad [i8* B typeinfo] 224 /// to label %catch.B unwind label %endcatches 225 /// %endcatches 226 /// catchendblock unwind to caller 227 static void 228 findCatchPadsForCatchEndPad(const BasicBlock *CatchEndBB, 229 SmallVectorImpl<const CatchPadInst *> &Handlers) { 230 const CatchPadInst *CPI = getSingleCatchPadPredecessor(CatchEndBB); 231 while (CPI) { 232 Handlers.push_back(CPI); 233 CPI = getSingleCatchPadPredecessor(CPI->getParent()); 234 } 235 // We've pushed these back into reverse source order. Reverse them to get 236 // the list back into source order. 237 std::reverse(Handlers.begin(), Handlers.end()); 238 } 239 240 // Given BB which ends in an unwind edge, return the EHPad that this BB belongs 241 // to. If the unwind edge came from an invoke, return null. 242 static const BasicBlock *getEHPadFromPredecessor(const BasicBlock *BB) { 243 const TerminatorInst *TI = BB->getTerminator(); 244 if (isa<InvokeInst>(TI)) 245 return nullptr; 246 if (TI->isEHPad()) 247 return BB; 248 return cast<CleanupReturnInst>(TI)->getCleanupPad()->getParent(); 249 } 250 251 static void calculateExplicitCXXStateNumbers(WinEHFuncInfo &FuncInfo, 252 const BasicBlock &BB, 253 int ParentState) { 254 assert(BB.isEHPad()); 255 const Instruction *FirstNonPHI = BB.getFirstNonPHI(); 256 // All catchpad instructions will be handled when we process their 257 // respective catchendpad instruction. 258 if (isa<CatchPadInst>(FirstNonPHI)) 259 return; 260 261 if (isa<CatchEndPadInst>(FirstNonPHI)) { 262 SmallVector<const CatchPadInst *, 2> Handlers; 263 findCatchPadsForCatchEndPad(&BB, Handlers); 264 const BasicBlock *FirstTryPad = Handlers.front()->getParent(); 265 int TryLow = addUnwindMapEntry(FuncInfo, ParentState, nullptr); 266 FuncInfo.EHPadStateMap[Handlers.front()] = TryLow; 267 for (const BasicBlock *PredBlock : predecessors(FirstTryPad)) 268 if ((PredBlock = getEHPadFromPredecessor(PredBlock))) 269 calculateExplicitCXXStateNumbers(FuncInfo, *PredBlock, TryLow); 270 int CatchLow = addUnwindMapEntry(FuncInfo, ParentState, nullptr); 271 272 // catchpads are separate funclets in C++ EH due to the way rethrow works. 273 // In SEH, they aren't, so no invokes will unwind to the catchendpad. 274 FuncInfo.EHPadStateMap[FirstNonPHI] = CatchLow; 275 int TryHigh = CatchLow - 1; 276 for (const BasicBlock *PredBlock : predecessors(&BB)) 277 if ((PredBlock = getEHPadFromPredecessor(PredBlock))) 278 calculateExplicitCXXStateNumbers(FuncInfo, *PredBlock, CatchLow); 279 int CatchHigh = FuncInfo.getLastStateNumber(); 280 addTryBlockMapEntry(FuncInfo, TryLow, TryHigh, CatchHigh, Handlers); 281 DEBUG(dbgs() << "TryLow[" << FirstTryPad->getName() << "]: " << TryLow 282 << '\n'); 283 DEBUG(dbgs() << "TryHigh[" << FirstTryPad->getName() << "]: " << TryHigh 284 << '\n'); 285 DEBUG(dbgs() << "CatchHigh[" << FirstTryPad->getName() << "]: " << CatchHigh 286 << '\n'); 287 } else if (isa<CleanupPadInst>(FirstNonPHI)) { 288 // A cleanup can have multiple exits; don't re-process after the first. 289 if (FuncInfo.EHPadStateMap.count(FirstNonPHI)) 290 return; 291 int CleanupState = addUnwindMapEntry(FuncInfo, ParentState, &BB); 292 FuncInfo.EHPadStateMap[FirstNonPHI] = CleanupState; 293 DEBUG(dbgs() << "Assigning state #" << CleanupState << " to BB " 294 << BB.getName() << '\n'); 295 for (const BasicBlock *PredBlock : predecessors(&BB)) 296 if ((PredBlock = getEHPadFromPredecessor(PredBlock))) 297 calculateExplicitCXXStateNumbers(FuncInfo, *PredBlock, CleanupState); 298 } else if (auto *CEPI = dyn_cast<CleanupEndPadInst>(FirstNonPHI)) { 299 // Propagate ParentState to the cleanuppad in case it doesn't have 300 // any cleanuprets. 301 BasicBlock *CleanupBlock = CEPI->getCleanupPad()->getParent(); 302 calculateExplicitCXXStateNumbers(FuncInfo, *CleanupBlock, ParentState); 303 // Anything unwinding through CleanupEndPadInst is in ParentState. 304 FuncInfo.EHPadStateMap[FirstNonPHI] = ParentState; 305 for (const BasicBlock *PredBlock : predecessors(&BB)) 306 if ((PredBlock = getEHPadFromPredecessor(PredBlock))) 307 calculateExplicitCXXStateNumbers(FuncInfo, *PredBlock, ParentState); 308 } else if (isa<TerminatePadInst>(FirstNonPHI)) { 309 report_fatal_error("Not yet implemented!"); 310 } else { 311 llvm_unreachable("unexpected EH Pad!"); 312 } 313 } 314 315 static int addSEHExcept(WinEHFuncInfo &FuncInfo, int ParentState, 316 const Function *Filter, const BasicBlock *Handler) { 317 SEHUnwindMapEntry Entry; 318 Entry.ToState = ParentState; 319 Entry.IsFinally = false; 320 Entry.Filter = Filter; 321 Entry.Handler = Handler; 322 FuncInfo.SEHUnwindMap.push_back(Entry); 323 return FuncInfo.SEHUnwindMap.size() - 1; 324 } 325 326 static int addSEHFinally(WinEHFuncInfo &FuncInfo, int ParentState, 327 const BasicBlock *Handler) { 328 SEHUnwindMapEntry Entry; 329 Entry.ToState = ParentState; 330 Entry.IsFinally = true; 331 Entry.Filter = nullptr; 332 Entry.Handler = Handler; 333 FuncInfo.SEHUnwindMap.push_back(Entry); 334 return FuncInfo.SEHUnwindMap.size() - 1; 335 } 336 337 static void calculateExplicitSEHStateNumbers(WinEHFuncInfo &FuncInfo, 338 const BasicBlock &BB, 339 int ParentState) { 340 assert(BB.isEHPad()); 341 const Instruction *FirstNonPHI = BB.getFirstNonPHI(); 342 // All catchpad instructions will be handled when we process their 343 // respective catchendpad instruction. 344 if (isa<CatchPadInst>(FirstNonPHI)) 345 return; 346 347 if (isa<CatchEndPadInst>(FirstNonPHI)) { 348 // Extract the filter function and the __except basic block and create a 349 // state for them. 350 SmallVector<const CatchPadInst *, 1> Handlers; 351 findCatchPadsForCatchEndPad(&BB, Handlers); 352 assert(Handlers.size() == 1 && 353 "SEH doesn't have multiple handlers per __try"); 354 const CatchPadInst *CPI = Handlers.front(); 355 const BasicBlock *CatchPadBB = CPI->getParent(); 356 const Constant *FilterOrNull = 357 cast<Constant>(CPI->getArgOperand(0)->stripPointerCasts()); 358 const Function *Filter = dyn_cast<Function>(FilterOrNull); 359 assert((Filter || FilterOrNull->isNullValue()) && 360 "unexpected filter value"); 361 int TryState = addSEHExcept(FuncInfo, ParentState, Filter, CatchPadBB); 362 363 // Everything in the __try block uses TryState as its parent state. 364 FuncInfo.EHPadStateMap[CPI] = TryState; 365 DEBUG(dbgs() << "Assigning state #" << TryState << " to BB " 366 << CatchPadBB->getName() << '\n'); 367 for (const BasicBlock *PredBlock : predecessors(CatchPadBB)) 368 if ((PredBlock = getEHPadFromPredecessor(PredBlock))) 369 calculateExplicitSEHStateNumbers(FuncInfo, *PredBlock, TryState); 370 371 // Everything in the __except block unwinds to ParentState, just like code 372 // outside the __try. 373 FuncInfo.EHPadStateMap[FirstNonPHI] = ParentState; 374 DEBUG(dbgs() << "Assigning state #" << ParentState << " to BB " 375 << BB.getName() << '\n'); 376 for (const BasicBlock *PredBlock : predecessors(&BB)) 377 if ((PredBlock = getEHPadFromPredecessor(PredBlock))) 378 calculateExplicitSEHStateNumbers(FuncInfo, *PredBlock, ParentState); 379 } else if (isa<CleanupPadInst>(FirstNonPHI)) { 380 // A cleanup can have multiple exits; don't re-process after the first. 381 if (FuncInfo.EHPadStateMap.count(FirstNonPHI)) 382 return; 383 int CleanupState = addSEHFinally(FuncInfo, ParentState, &BB); 384 FuncInfo.EHPadStateMap[FirstNonPHI] = CleanupState; 385 DEBUG(dbgs() << "Assigning state #" << CleanupState << " to BB " 386 << BB.getName() << '\n'); 387 for (const BasicBlock *PredBlock : predecessors(&BB)) 388 if ((PredBlock = getEHPadFromPredecessor(PredBlock))) 389 calculateExplicitSEHStateNumbers(FuncInfo, *PredBlock, CleanupState); 390 } else if (auto *CEPI = dyn_cast<CleanupEndPadInst>(FirstNonPHI)) { 391 // Propagate ParentState to the cleanuppad in case it doesn't have 392 // any cleanuprets. 393 BasicBlock *CleanupBlock = CEPI->getCleanupPad()->getParent(); 394 calculateExplicitSEHStateNumbers(FuncInfo, *CleanupBlock, ParentState); 395 // Anything unwinding through CleanupEndPadInst is in ParentState. 396 FuncInfo.EHPadStateMap[FirstNonPHI] = ParentState; 397 DEBUG(dbgs() << "Assigning state #" << ParentState << " to BB " 398 << BB.getName() << '\n'); 399 for (const BasicBlock *PredBlock : predecessors(&BB)) 400 if ((PredBlock = getEHPadFromPredecessor(PredBlock))) 401 calculateExplicitSEHStateNumbers(FuncInfo, *PredBlock, ParentState); 402 } else if (isa<TerminatePadInst>(FirstNonPHI)) { 403 report_fatal_error("Not yet implemented!"); 404 } else { 405 llvm_unreachable("unexpected EH Pad!"); 406 } 407 } 408 409 /// Check if the EH Pad unwinds to caller. Cleanups are a little bit of a 410 /// special case because we have to look at the cleanupret instruction that uses 411 /// the cleanuppad. 412 static bool doesEHPadUnwindToCaller(const Instruction *EHPad) { 413 auto *CPI = dyn_cast<CleanupPadInst>(EHPad); 414 if (!CPI) 415 return EHPad->mayThrow(); 416 417 // This cleanup does not return or unwind, so we say it unwinds to caller. 418 if (CPI->use_empty()) 419 return true; 420 421 const Instruction *User = CPI->user_back(); 422 if (auto *CRI = dyn_cast<CleanupReturnInst>(User)) 423 return CRI->unwindsToCaller(); 424 return cast<CleanupEndPadInst>(User)->unwindsToCaller(); 425 } 426 427 void llvm::calculateSEHStateNumbers(const Function *Fn, 428 WinEHFuncInfo &FuncInfo) { 429 // Don't compute state numbers twice. 430 if (!FuncInfo.SEHUnwindMap.empty()) 431 return; 432 433 for (const BasicBlock &BB : *Fn) { 434 if (!BB.isEHPad() || !doesEHPadUnwindToCaller(BB.getFirstNonPHI())) 435 continue; 436 calculateExplicitSEHStateNumbers(FuncInfo, BB, -1); 437 } 438 } 439 440 void llvm::calculateWinCXXEHStateNumbers(const Function *Fn, 441 WinEHFuncInfo &FuncInfo) { 442 // Return if it's already been done. 443 if (!FuncInfo.EHPadStateMap.empty()) 444 return; 445 446 for (const BasicBlock &BB : *Fn) { 447 if (!BB.isEHPad()) 448 continue; 449 if (BB.isLandingPad()) 450 report_fatal_error("MSVC C++ EH cannot use landingpads"); 451 const Instruction *FirstNonPHI = BB.getFirstNonPHI(); 452 if (!doesEHPadUnwindToCaller(FirstNonPHI)) 453 continue; 454 calculateExplicitCXXStateNumbers(FuncInfo, BB, -1); 455 } 456 } 457 458 static int addClrEHHandler(WinEHFuncInfo &FuncInfo, int ParentState, 459 ClrHandlerType HandlerType, uint32_t TypeToken, 460 const BasicBlock *Handler) { 461 ClrEHUnwindMapEntry Entry; 462 Entry.Parent = ParentState; 463 Entry.Handler = Handler; 464 Entry.HandlerType = HandlerType; 465 Entry.TypeToken = TypeToken; 466 FuncInfo.ClrEHUnwindMap.push_back(Entry); 467 return FuncInfo.ClrEHUnwindMap.size() - 1; 468 } 469 470 void llvm::calculateClrEHStateNumbers(const Function *Fn, 471 WinEHFuncInfo &FuncInfo) { 472 // Return if it's already been done. 473 if (!FuncInfo.EHPadStateMap.empty()) 474 return; 475 476 SmallVector<std::pair<const Instruction *, int>, 8> Worklist; 477 478 // Each pad needs to be able to refer to its parent, so scan the function 479 // looking for top-level handlers and seed the worklist with them. 480 for (const BasicBlock &BB : *Fn) { 481 if (!BB.isEHPad()) 482 continue; 483 if (BB.isLandingPad()) 484 report_fatal_error("CoreCLR EH cannot use landingpads"); 485 const Instruction *FirstNonPHI = BB.getFirstNonPHI(); 486 if (!doesEHPadUnwindToCaller(FirstNonPHI)) 487 continue; 488 // queue this with sentinel parent state -1 to mean unwind to caller. 489 Worklist.emplace_back(FirstNonPHI, -1); 490 } 491 492 while (!Worklist.empty()) { 493 const Instruction *Pad; 494 int ParentState; 495 std::tie(Pad, ParentState) = Worklist.pop_back_val(); 496 497 int PredState; 498 if (const CleanupEndPadInst *EndPad = dyn_cast<CleanupEndPadInst>(Pad)) { 499 FuncInfo.EHPadStateMap[EndPad] = ParentState; 500 // Queue the cleanuppad, in case it doesn't have a cleanupret. 501 Worklist.emplace_back(EndPad->getCleanupPad(), ParentState); 502 // Preds of the endpad should get the parent state. 503 PredState = ParentState; 504 } else if (const CleanupPadInst *Cleanup = dyn_cast<CleanupPadInst>(Pad)) { 505 // A cleanup can have multiple exits; don't re-process after the first. 506 if (FuncInfo.EHPadStateMap.count(Pad)) 507 continue; 508 // CoreCLR personality uses arity to distinguish faults from finallies. 509 const BasicBlock *PadBlock = Cleanup->getParent(); 510 ClrHandlerType HandlerType = 511 (Cleanup->getNumOperands() ? ClrHandlerType::Fault 512 : ClrHandlerType::Finally); 513 int NewState = 514 addClrEHHandler(FuncInfo, ParentState, HandlerType, 0, PadBlock); 515 FuncInfo.EHPadStateMap[Cleanup] = NewState; 516 // Propagate the new state to all preds of the cleanup 517 PredState = NewState; 518 } else if (const CatchEndPadInst *EndPad = dyn_cast<CatchEndPadInst>(Pad)) { 519 FuncInfo.EHPadStateMap[EndPad] = ParentState; 520 // Preds of the endpad should get the parent state. 521 PredState = ParentState; 522 } else if (const CatchPadInst *Catch = dyn_cast<CatchPadInst>(Pad)) { 523 const BasicBlock *PadBlock = Catch->getParent(); 524 uint32_t TypeToken = static_cast<uint32_t>( 525 cast<ConstantInt>(Catch->getArgOperand(0))->getZExtValue()); 526 int NewState = addClrEHHandler(FuncInfo, ParentState, 527 ClrHandlerType::Catch, TypeToken, PadBlock); 528 FuncInfo.EHPadStateMap[Catch] = NewState; 529 // Preds of the catch get its state 530 PredState = NewState; 531 } else { 532 llvm_unreachable("Unexpected EH pad"); 533 } 534 535 // Queue all predecessors with the given state 536 for (const BasicBlock *Pred : predecessors(Pad->getParent())) { 537 if ((Pred = getEHPadFromPredecessor(Pred))) 538 Worklist.emplace_back(Pred->getFirstNonPHI(), PredState); 539 } 540 } 541 } 542 543 void WinEHPrepare::replaceTerminatePadWithCleanup(Function &F) { 544 if (Personality != EHPersonality::MSVC_CXX) 545 return; 546 for (BasicBlock &BB : F) { 547 Instruction *First = BB.getFirstNonPHI(); 548 auto *TPI = dyn_cast<TerminatePadInst>(First); 549 if (!TPI) 550 continue; 551 552 if (TPI->getNumArgOperands() != 1) 553 report_fatal_error( 554 "Expected a unary terminatepad for MSVC C++ personalities!"); 555 556 auto *TerminateFn = dyn_cast<Function>(TPI->getArgOperand(0)); 557 if (!TerminateFn) 558 report_fatal_error("Function operand expected in terminatepad for MSVC " 559 "C++ personalities!"); 560 561 // Insert the cleanuppad instruction. 562 auto *CPI = CleanupPadInst::Create( 563 BB.getContext(), {}, Twine("terminatepad.for.", BB.getName()), &BB); 564 565 // Insert the call to the terminate instruction. 566 auto *CallTerminate = CallInst::Create(TerminateFn, {}, &BB); 567 CallTerminate->setDoesNotThrow(); 568 CallTerminate->setDoesNotReturn(); 569 CallTerminate->setCallingConv(TerminateFn->getCallingConv()); 570 571 // Insert a new terminator for the cleanuppad using the same successor as 572 // the terminatepad. 573 CleanupReturnInst::Create(CPI, TPI->getUnwindDest(), &BB); 574 575 // Let's remove the terminatepad now that we've inserted the new 576 // instructions. 577 TPI->eraseFromParent(); 578 } 579 } 580 581 static void 582 colorFunclets(Function &F, SmallVectorImpl<BasicBlock *> &EntryBlocks, 583 std::map<BasicBlock *, SetVector<BasicBlock *>> &BlockColors, 584 std::map<BasicBlock *, std::set<BasicBlock *>> &FuncletBlocks) { 585 SmallVector<std::pair<BasicBlock *, BasicBlock *>, 16> Worklist; 586 BasicBlock *EntryBlock = &F.getEntryBlock(); 587 588 // Build up the color map, which maps each block to its set of 'colors'. 589 // For any block B, the "colors" of B are the set of funclets F (possibly 590 // including a root "funclet" representing the main function), such that 591 // F will need to directly contain B or a copy of B (where the term "directly 592 // contain" is used to distinguish from being "transitively contained" in 593 // a nested funclet). 594 // Use a CFG walk driven by a worklist of (block, color) pairs. The "color" 595 // sets attached during this processing to a block which is the entry of some 596 // funclet F is actually the set of F's parents -- i.e. the union of colors 597 // of all predecessors of F's entry. For all other blocks, the color sets 598 // are as defined above. A post-pass fixes up the block color map to reflect 599 // the same sense of "color" for funclet entries as for other blocks. 600 601 DEBUG_WITH_TYPE("winehprepare-coloring", dbgs() << "\nColoring funclets for " 602 << F.getName() << "\n"); 603 604 Worklist.push_back({EntryBlock, EntryBlock}); 605 606 while (!Worklist.empty()) { 607 BasicBlock *Visiting; 608 BasicBlock *Color; 609 std::tie(Visiting, Color) = Worklist.pop_back_val(); 610 DEBUG_WITH_TYPE("winehprepare-coloring", 611 dbgs() << "Visiting " << Visiting->getName() << ", " 612 << Color->getName() << "\n"); 613 Instruction *VisitingHead = Visiting->getFirstNonPHI(); 614 if (VisitingHead->isEHPad() && !isa<CatchEndPadInst>(VisitingHead) && 615 !isa<CleanupEndPadInst>(VisitingHead)) { 616 // Mark this as a funclet head as a member of itself. 617 FuncletBlocks[Visiting].insert(Visiting); 618 // Queue exits (i.e. successors of rets/endpads) with the parent color. 619 // Skip any exits that are catchendpads, since the parent color must then 620 // represent one of the catches chained to that catchendpad, but the 621 // catchendpad should get the color of the common parent of all its 622 // chained catches (i.e. the grandparent color of the current pad). 623 // We don't need to worry abou catchendpads going unvisited, since the 624 // catches chained to them must have unwind edges to them by which we will 625 // visit them. 626 for (User *U : VisitingHead->users()) { 627 if (auto *Exit = dyn_cast<TerminatorInst>(U)) { 628 for (BasicBlock *Succ : successors(Exit->getParent())) 629 if (!isa<CatchEndPadInst>(*Succ->getFirstNonPHI())) 630 if (BlockColors[Succ].insert(Color)) { 631 DEBUG_WITH_TYPE("winehprepare-coloring", 632 dbgs() << " Assigned color \'" 633 << Color->getName() << "\' to block \'" 634 << Succ->getName() << "\'.\n"); 635 Worklist.push_back({Succ, Color}); 636 } 637 } 638 } 639 // Handle CatchPad specially since its successors need different colors. 640 if (CatchPadInst *CatchPad = dyn_cast<CatchPadInst>(VisitingHead)) { 641 // Visit the normal successor with the color of the new EH pad, and 642 // visit the unwind successor with the color of the parent. 643 BasicBlock *NormalSucc = CatchPad->getNormalDest(); 644 if (BlockColors[NormalSucc].insert(Visiting)) { 645 DEBUG_WITH_TYPE("winehprepare-coloring", 646 dbgs() << " Assigned color \'" << Visiting->getName() 647 << "\' to block \'" << NormalSucc->getName() 648 << "\'.\n"); 649 Worklist.push_back({NormalSucc, Visiting}); 650 } 651 BasicBlock *UnwindSucc = CatchPad->getUnwindDest(); 652 if (BlockColors[UnwindSucc].insert(Color)) { 653 DEBUG_WITH_TYPE("winehprepare-coloring", 654 dbgs() << " Assigned color \'" << Color->getName() 655 << "\' to block \'" << UnwindSucc->getName() 656 << "\'.\n"); 657 Worklist.push_back({UnwindSucc, Color}); 658 } 659 continue; 660 } 661 // Switch color to the current node, except for terminate pads which 662 // have no bodies and only unwind successors and so need their successors 663 // visited with the color of the parent. 664 if (!isa<TerminatePadInst>(VisitingHead)) 665 Color = Visiting; 666 } else { 667 // Note that this is a member of the given color. 668 FuncletBlocks[Color].insert(Visiting); 669 } 670 671 TerminatorInst *Terminator = Visiting->getTerminator(); 672 if (isa<CleanupReturnInst>(Terminator) || 673 isa<CatchReturnInst>(Terminator) || 674 isa<CleanupEndPadInst>(Terminator)) { 675 // These blocks' successors have already been queued with the parent 676 // color. 677 continue; 678 } 679 for (BasicBlock *Succ : successors(Visiting)) { 680 if (isa<CatchEndPadInst>(Succ->getFirstNonPHI())) { 681 // The catchendpad needs to be visited with the parent's color, not 682 // the current color. This will happen in the code above that visits 683 // any catchpad unwind successor with the parent color, so we can 684 // safely skip this successor here. 685 continue; 686 } 687 if (BlockColors[Succ].insert(Color)) { 688 DEBUG_WITH_TYPE("winehprepare-coloring", 689 dbgs() << " Assigned color \'" << Color->getName() 690 << "\' to block \'" << Succ->getName() 691 << "\'.\n"); 692 Worklist.push_back({Succ, Color}); 693 } 694 } 695 } 696 } 697 698 static BasicBlock *getEndPadForCatch(CatchPadInst *Catch) { 699 // The catch may have sibling catches. Follow the unwind chain until we get 700 // to the catchendpad. 701 BasicBlock *NextUnwindDest = Catch->getUnwindDest(); 702 auto *UnwindTerminator = NextUnwindDest->getTerminator(); 703 while (auto *NextCatch = dyn_cast<CatchPadInst>(UnwindTerminator)) { 704 NextUnwindDest = NextCatch->getUnwindDest(); 705 UnwindTerminator = NextUnwindDest->getTerminator(); 706 } 707 // The last catch in the chain must unwind to a catchendpad. 708 assert(isa<CatchEndPadInst>(UnwindTerminator)); 709 return NextUnwindDest; 710 } 711 712 static void updateClonedEHPadUnwindToParent( 713 BasicBlock *UnwindDest, BasicBlock *OrigBlock, BasicBlock *CloneBlock, 714 std::vector<BasicBlock *> &OrigParents, BasicBlock *CloneParent) { 715 auto updateUnwindTerminator = [](BasicBlock *BB) { 716 auto *Terminator = BB->getTerminator(); 717 if (isa<CatchEndPadInst>(Terminator) || 718 isa<CleanupEndPadInst>(Terminator)) { 719 removeUnwindEdge(BB); 720 } else { 721 // If the block we're updating has a cleanupendpad or cleanupret 722 // terminator, we just want to replace that terminator with an 723 // unreachable instruction. 724 assert(isa<CleanupEndPadInst>(Terminator) || 725 isa<CleanupReturnInst>(Terminator)); 726 // Loop over all of the successors, removing the block's entry from any 727 // PHI nodes. 728 for (succ_iterator SI = succ_begin(BB), SE = succ_end(BB); SI != SE; ++SI) 729 (*SI)->removePredecessor(BB); 730 // Remove the terminator and replace it with an unreachable instruction. 731 BB->getTerminator()->eraseFromParent(); 732 new UnreachableInst(BB->getContext(), BB); 733 } 734 }; 735 736 assert(UnwindDest->isEHPad()); 737 // There are many places to which this EH terminator can unwind and each has 738 // slightly different rules for whether or not it fits with the given 739 // location. 740 auto *EHPadInst = UnwindDest->getFirstNonPHI(); 741 if (isa<CatchEndPadInst>(EHPadInst)) { 742 auto *CloneParentCatch = 743 dyn_cast<CatchPadInst>(CloneParent->getFirstNonPHI()); 744 if (!CloneParentCatch || 745 getEndPadForCatch(CloneParentCatch) != UnwindDest) { 746 DEBUG_WITH_TYPE( 747 "winehprepare-coloring", 748 dbgs() << " removing unwind destination of clone block \'" 749 << CloneBlock->getName() << "\'.\n"); 750 updateUnwindTerminator(CloneBlock); 751 } 752 // It's possible that the catch end pad is a legal match for both the clone 753 // and the original, so they must be checked separately. If the original 754 // funclet will still have multiple parents after the current clone parent 755 // is removed, we'll leave its unwind terminator until later. 756 assert(OrigParents.size() >= 2); 757 if (OrigParents.size() != 2) 758 return; 759 760 // If the original funclet will have a single parent after the clone parent 761 // is removed, check that parent's unwind destination. 762 assert(OrigParents.front() == CloneParent || 763 OrigParents.back() == CloneParent); 764 BasicBlock *OrigParent; 765 if (OrigParents.front() == CloneParent) 766 OrigParent = OrigParents.back(); 767 else 768 OrigParent = OrigParents.front(); 769 770 auto *OrigParentCatch = 771 dyn_cast<CatchPadInst>(OrigParent->getFirstNonPHI()); 772 if (!OrigParentCatch || getEndPadForCatch(OrigParentCatch) != UnwindDest) { 773 DEBUG_WITH_TYPE( 774 "winehprepare-coloring", 775 dbgs() << " removing unwind destination of original block \'" 776 << OrigBlock << "\'.\n"); 777 updateUnwindTerminator(OrigBlock); 778 } 779 } else if (auto *CleanupEnd = dyn_cast<CleanupEndPadInst>(EHPadInst)) { 780 // If the EH terminator unwinds to a cleanupendpad, that cleanupendpad 781 // must be ending a cleanuppad of either our clone parent or one 782 // one of the parents of the original funclet. 783 auto *CloneParentCP = 784 dyn_cast<CleanupPadInst>(CloneParent->getFirstNonPHI()); 785 auto *EndedCP = CleanupEnd->getCleanupPad(); 786 if (EndedCP == CloneParentCP) { 787 // If it is ending the cleanuppad of our cloned parent, then we 788 // want to remove the unwind destination of the EH terminator that 789 // we associated with the original funclet. 790 assert(isa<CatchEndPadInst>(OrigBlock->getFirstNonPHI())); 791 DEBUG_WITH_TYPE( 792 "winehprepare-coloring", 793 dbgs() << " removing unwind destination of original block \'" 794 << OrigBlock->getName() << "\'.\n"); 795 updateUnwindTerminator(OrigBlock); 796 } else { 797 // If it isn't ending the cleanuppad of our clone parent, then we 798 // want to remove the unwind destination of the EH terminator that 799 // associated with our cloned funclet. 800 assert(isa<CatchEndPadInst>(CloneBlock->getFirstNonPHI())); 801 DEBUG_WITH_TYPE( 802 "winehprepare-coloring", 803 dbgs() << " removing unwind destination of clone block \'" 804 << CloneBlock->getName() << "\'.\n"); 805 updateUnwindTerminator(CloneBlock); 806 } 807 } else { 808 // If the EH terminator unwinds to a catchpad, cleanuppad or 809 // terminatepad that EH pad must be a sibling of the funclet we're 810 // cloning. We'll clone it later and update one of the catchendpad 811 // instrunctions that unwinds to it at that time. 812 assert(isa<CatchPadInst>(EHPadInst) || isa<CleanupPadInst>(EHPadInst) || 813 isa<TerminatePadInst>(EHPadInst)); 814 } 815 } 816 817 // If the terminator is a catchpad, we must also clone the catchendpad to which 818 // it unwinds and add this to the clone parent's block list. The catchendpad 819 // unwinds to either its caller, a sibling EH pad, a cleanup end pad in its 820 // parent funclet or a catch end pad in its grandparent funclet (which must be 821 // coupled with the parent funclet). If it has no unwind destination 822 // (i.e. unwind to caller), there is nothing to be done. If the unwind 823 // destination is a sibling EH pad, we will update the terminators later (in 824 // resolveFuncletAncestryForPath). If it unwinds to a cleanup end pad or a 825 // catch end pad and this end pad corresponds to the clone parent, we will 826 // remove the unwind destination in the original catchendpad. If it unwinds to 827 // a cleanup end pad or a catch end pad that does not correspond to the clone 828 // parent, we will remove the unwind destination in the cloned catchendpad. 829 static void updateCatchTerminators( 830 Function &F, CatchPadInst *OrigCatch, CatchPadInst *CloneCatch, 831 std::vector<BasicBlock *> &OrigParents, BasicBlock *CloneParent, 832 ValueToValueMapTy &VMap, 833 std::map<BasicBlock *, SetVector<BasicBlock *>> &BlockColors, 834 std::map<BasicBlock *, std::set<BasicBlock *>> &FuncletBlocks) { 835 // If we're cloning a catch pad that unwinds to a catchendpad, we also 836 // need to clone the catchendpad. The coloring algorithm associates 837 // the catchendpad block with the funclet's parent, so we have some work 838 // to do here to figure out whether the original belongs to the clone 839 // parent or one of the original funclets other parents (it might have 840 // more than one at this point). In either case, we might also need to 841 // remove the unwind edge if the catchendpad doesn't unwind to a block 842 // in the right grandparent funclet. 843 Instruction *I = CloneCatch->getUnwindDest()->getFirstNonPHI(); 844 if (auto *CEP = dyn_cast<CatchEndPadInst>(I)) { 845 assert(BlockColors[CEP->getParent()].size() == 1); 846 BasicBlock *CEPFunclet = *(BlockColors[CEP->getParent()].begin()); 847 BasicBlock *CEPCloneParent = nullptr; 848 CatchPadInst *PredCatch = nullptr; 849 if (CEPFunclet == CloneParent) { 850 // The catchendpad is in the clone parent, so we need to clone it 851 // and associate the clone with the original funclet's parent. If 852 // the original funclet had multiple parents, we'll add it to the 853 // first parent that isn't the clone parent. The logic in 854 // updateClonedEHPadUnwindToParent() will only remove the unwind edge 855 // if there is only one parent other than the clone parent, so we don't 856 // need to verify the ancestry. The catchendpad will eventually be 857 // cloned into the correct parent and all invalid unwind edges will be 858 // removed. 859 for (auto *Parent : OrigParents) { 860 if (Parent != CloneParent) { 861 CEPCloneParent = Parent; 862 break; 863 } 864 } 865 PredCatch = OrigCatch; 866 } else { 867 CEPCloneParent = CloneParent; 868 PredCatch = CloneCatch; 869 } 870 assert(CEPCloneParent && PredCatch); 871 DEBUG_WITH_TYPE("winehprepare-coloring", 872 dbgs() << " Cloning catchendpad \'" 873 << CEP->getParent()->getName() << "\' for funclet \'" 874 << CEPCloneParent->getName() << "\'.\n"); 875 BasicBlock *ClonedCEP = CloneBasicBlock( 876 CEP->getParent(), VMap, Twine(".from.", CEPCloneParent->getName())); 877 // Insert the clone immediately after the original to ensure determinism 878 // and to keep the same relative ordering of any funclet's blocks. 879 ClonedCEP->insertInto(&F, CEP->getParent()->getNextNode()); 880 PredCatch->setUnwindDest(ClonedCEP); 881 FuncletBlocks[CEPCloneParent].insert(ClonedCEP); 882 BlockColors[ClonedCEP].insert(CEPCloneParent); 883 DEBUG_WITH_TYPE("winehprepare-coloring", 884 dbgs() << " Assigning color \'" 885 << CEPCloneParent->getName() << "\' to block \'" 886 << ClonedCEP->getName() << "\'.\n"); 887 auto *ClonedCEPInst = cast<CatchEndPadInst>(ClonedCEP->getTerminator()); 888 if (auto *Dest = ClonedCEPInst->getUnwindDest()) 889 updateClonedEHPadUnwindToParent(Dest, OrigCatch->getUnwindDest(), 890 CloneCatch->getUnwindDest(), OrigParents, 891 CloneParent); 892 } 893 } 894 895 // While we are cloning a funclet because it has multiple parents, we will call 896 // this routine to update the terminators for the original and cloned copies 897 // of each basic block. All blocks in the funclet have been clone by this time. 898 // OrigBlock and CloneBlock will be identical except for their block label. 899 // 900 // If the terminator is a catchpad, we must also clone the catchendpad to which 901 // it unwinds and in most cases update either the original catchendpad or the 902 // clone. See the updateCatchTerminators() helper routine for details. 903 // 904 // If the terminator is a catchret its successor is a block in its parent 905 // funclet. If the instruction returns to a block in the parent for which the 906 // cloned funclet was created, the terminator in the original block must be 907 // replaced by an unreachable instruction. Otherwise the terminator in the 908 // clone block must be replaced by an unreachable instruction. 909 // 910 // If the terminator is a cleanupret or cleanupendpad it either unwinds to 911 // caller or unwinds to a sibling EH pad, a cleanup end pad in its parent 912 // funclet or a catch end pad in its grandparent funclet (which must be 913 // coupled with the parent funclet). If it unwinds to caller there is 914 // nothing to be done. If the unwind destination is a sibling EH pad, we will 915 // update the terminators later (in resolveFuncletAncestryForPath). If it 916 // unwinds to a cleanup end pad or a catch end pad and this end pad corresponds 917 // to the clone parent, we will replace the terminator in the original block 918 // with an unreachable instruction. If it unwinds to a cleanup end pad or a 919 // catch end pad that does not correspond to the clone parent, we will replace 920 // the terminator in the clone block with an unreachable instruction. 921 // 922 // If the terminator is an invoke instruction, we will handle it after all 923 // siblings of the current funclet have been cloned. 924 void WinEHPrepare::updateTerminatorsAfterFuncletClone( 925 Function &F, BasicBlock *OrigFunclet, BasicBlock *CloneFunclet, 926 BasicBlock *OrigBlock, BasicBlock *CloneBlock, BasicBlock *CloneParent, 927 ValueToValueMapTy &VMap, std::map<BasicBlock *, BasicBlock *> &Orig2Clone) { 928 // If the cloned block doesn't have an exceptional terminator, there is 929 // nothing to be done here. 930 TerminatorInst *CloneTerminator = CloneBlock->getTerminator(); 931 if (!CloneTerminator->isExceptional()) 932 return; 933 934 if (auto *CloneCatch = dyn_cast<CatchPadInst>(CloneTerminator)) { 935 // A cloned catch pad has a lot of wrinkles, so we'll call a helper function 936 // to update this case. 937 auto *OrigCatch = cast<CatchPadInst>(OrigBlock->getTerminator()); 938 updateCatchTerminators(F, OrigCatch, CloneCatch, 939 FuncletParents[OrigFunclet], CloneParent, VMap, 940 BlockColors, FuncletBlocks); 941 } else if (auto *CRI = dyn_cast<CatchReturnInst>(CloneTerminator)) { 942 if (FuncletBlocks[CloneParent].count(CRI->getSuccessor())) { 943 BasicBlock *OrigParent; 944 // The original funclet may have more than two parents, but that's OK. 945 // We just need to remap the original catchret to any of the parents. 946 // All of the parents should have an entry in the EstrangedBlocks map 947 // if any of them do. 948 if (FuncletParents[OrigFunclet].front() == CloneParent) 949 OrigParent = FuncletParents[OrigFunclet].back(); 950 else 951 OrigParent = FuncletParents[OrigFunclet].front(); 952 for (succ_iterator SI = succ_begin(OrigBlock), SE = succ_end(OrigBlock); 953 SI != SE; ++SI) 954 (*SI)->removePredecessor(OrigBlock); 955 BasicBlock *LostBlock = EstrangedBlocks[OrigParent][CRI->getSuccessor()]; 956 auto *OrigCatchRet = cast<CatchReturnInst>(OrigBlock->getTerminator()); 957 if (LostBlock) { 958 OrigCatchRet->setSuccessor(LostBlock); 959 } else { 960 OrigCatchRet->eraseFromParent(); 961 new UnreachableInst(OrigBlock->getContext(), OrigBlock); 962 } 963 } else { 964 for (succ_iterator SI = succ_begin(CloneBlock), SE = succ_end(CloneBlock); 965 SI != SE; ++SI) 966 (*SI)->removePredecessor(CloneBlock); 967 BasicBlock *LostBlock = EstrangedBlocks[CloneParent][CRI->getSuccessor()]; 968 if (LostBlock) { 969 CRI->setSuccessor(LostBlock); 970 } else { 971 CRI->eraseFromParent(); 972 new UnreachableInst(CloneBlock->getContext(), CloneBlock); 973 } 974 } 975 } else if (isa<CleanupReturnInst>(CloneTerminator) || 976 isa<CleanupEndPadInst>(CloneTerminator)) { 977 BasicBlock *UnwindDest = nullptr; 978 979 // A cleanup pad can unwind through either a cleanupret or a cleanupendpad 980 // but both are handled the same way. 981 if (auto *CRI = dyn_cast<CleanupReturnInst>(CloneTerminator)) 982 UnwindDest = CRI->getUnwindDest(); 983 else if (auto *CEI = dyn_cast<CleanupEndPadInst>(CloneTerminator)) 984 UnwindDest = CEI->getUnwindDest(); 985 986 // If the instruction has no local unwind destination, there is nothing 987 // to be done. 988 if (!UnwindDest) 989 return; 990 991 // The unwind destination may be a sibling EH pad, a catchendpad in 992 // a grandparent funclet (ending a catchpad in the parent) or a cleanup 993 // cleanupendpad in the parent. Call a helper routine to diagnose this 994 // and remove either the clone or original terminator as needed. 995 updateClonedEHPadUnwindToParent(UnwindDest, OrigBlock, CloneBlock, 996 FuncletParents[OrigFunclet], CloneParent); 997 } 998 } 999 1000 // Clones all blocks used by the specified funclet to avoid the funclet having 1001 // multiple parent funclets. All terminators in the parent that unwind to the 1002 // original funclet are remapped to unwind to the clone. Any terminator in the 1003 // original funclet which returned to this parent is converted to an unreachable 1004 // instruction. Likewise, any terminator in the cloned funclet which returns to 1005 // a parent funclet other than the specified parent is converted to an 1006 // unreachable instruction. 1007 BasicBlock *WinEHPrepare::cloneFuncletForParent(Function &F, 1008 BasicBlock *FuncletEntry, 1009 BasicBlock *Parent) { 1010 std::set<BasicBlock *> &BlocksInFunclet = FuncletBlocks[FuncletEntry]; 1011 1012 DEBUG_WITH_TYPE("winehprepare-coloring", 1013 dbgs() << "Cloning funclet \'" << FuncletEntry->getName() 1014 << "\' for parent \'" << Parent->getName() << "\'.\n"); 1015 1016 std::map<BasicBlock *, BasicBlock *> Orig2Clone; 1017 ValueToValueMapTy VMap; 1018 for (BasicBlock *BB : BlocksInFunclet) { 1019 // Create a new basic block and copy instructions into it. 1020 BasicBlock *CBB = 1021 CloneBasicBlock(BB, VMap, Twine(".from.", Parent->getName())); 1022 1023 // Insert the clone immediately after the original to ensure determinism 1024 // and to keep the same relative ordering of any funclet's blocks. 1025 CBB->insertInto(&F, BB->getNextNode()); 1026 1027 // Add basic block mapping. 1028 VMap[BB] = CBB; 1029 1030 // Record delta operations that we need to perform to our color mappings. 1031 Orig2Clone[BB] = CBB; 1032 } // end for (BasicBlock *BB : BlocksInFunclet) 1033 1034 BasicBlock *ClonedFunclet = Orig2Clone[FuncletEntry]; 1035 assert(ClonedFunclet); 1036 1037 // Set the coloring for the blocks we just cloned. 1038 std::set<BasicBlock *> &ClonedBlocks = FuncletBlocks[ClonedFunclet]; 1039 for (auto &BBMapping : Orig2Clone) { 1040 BasicBlock *NewBlock = BBMapping.second; 1041 ClonedBlocks.insert(NewBlock); 1042 BlockColors[NewBlock].insert(ClonedFunclet); 1043 1044 DEBUG_WITH_TYPE("winehprepare-coloring", 1045 dbgs() << " Assigning color \'" << ClonedFunclet->getName() 1046 << "\' to block \'" << NewBlock->getName() 1047 << "\'.\n"); 1048 1049 // Use the VMap to remap the instructions in this cloned block. 1050 for (Instruction &I : *NewBlock) 1051 RemapInstruction(&I, VMap, RF_IgnoreMissingEntries); 1052 } 1053 1054 // All the cloned blocks have to be colored in the loop above before we can 1055 // update the terminators because doing so can require checking the color of 1056 // other blocks in the cloned funclet. 1057 for (auto &BBMapping : Orig2Clone) { 1058 BasicBlock *OldBlock = BBMapping.first; 1059 BasicBlock *NewBlock = BBMapping.second; 1060 1061 // Update the terminator, if necessary, in both the original block and the 1062 // cloned so that the original funclet never returns to a block in the 1063 // clone parent and the clone funclet never returns to a block in any other 1064 // of the original funclet's parents. 1065 updateTerminatorsAfterFuncletClone(F, FuncletEntry, ClonedFunclet, OldBlock, 1066 NewBlock, Parent, VMap, Orig2Clone); 1067 1068 // Check to see if the cloned block successor has PHI nodes. If so, we need 1069 // to add entries to the PHI nodes for the cloned block now. 1070 for (BasicBlock *SuccBB : successors(NewBlock)) { 1071 for (Instruction &SuccI : *SuccBB) { 1072 auto *SuccPN = dyn_cast<PHINode>(&SuccI); 1073 if (!SuccPN) 1074 break; 1075 1076 // Ok, we have a PHI node. Figure out what the incoming value was for 1077 // the OldBlock. 1078 int OldBlockIdx = SuccPN->getBasicBlockIndex(OldBlock); 1079 if (OldBlockIdx == -1) 1080 break; 1081 Value *IV = SuccPN->getIncomingValue(OldBlockIdx); 1082 1083 // Remap the value if necessary. 1084 if (auto *Inst = dyn_cast<Instruction>(IV)) { 1085 ValueToValueMapTy::iterator I = VMap.find(Inst); 1086 if (I != VMap.end()) 1087 IV = I->second; 1088 } 1089 1090 SuccPN->addIncoming(IV, NewBlock); 1091 } 1092 } 1093 } 1094 1095 // Erase the clone's parent from the original funclet's parent list. 1096 std::vector<BasicBlock *> &Parents = FuncletParents[FuncletEntry]; 1097 Parents.erase(std::remove(Parents.begin(), Parents.end(), Parent), 1098 Parents.end()); 1099 1100 // Store the cloned funclet's parent. 1101 assert(std::find(FuncletParents[ClonedFunclet].begin(), 1102 FuncletParents[ClonedFunclet].end(), 1103 Parent) == std::end(FuncletParents[ClonedFunclet])); 1104 FuncletParents[ClonedFunclet].push_back(Parent); 1105 1106 // Copy any children of the original funclet to the clone. We'll either 1107 // clone them too or make that path unreachable when we take the next step 1108 // in resolveFuncletAncestryForPath(). 1109 for (auto *Child : FuncletChildren[FuncletEntry]) { 1110 assert(std::find(FuncletChildren[ClonedFunclet].begin(), 1111 FuncletChildren[ClonedFunclet].end(), 1112 Child) == std::end(FuncletChildren[ClonedFunclet])); 1113 FuncletChildren[ClonedFunclet].push_back(Child); 1114 assert(std::find(FuncletParents[Child].begin(), FuncletParents[Child].end(), 1115 ClonedFunclet) == std::end(FuncletParents[Child])); 1116 FuncletParents[Child].push_back(ClonedFunclet); 1117 } 1118 1119 // Find any blocks that unwound to the original funclet entry from the 1120 // clone parent block and remap them to the clone. 1121 for (auto *U : FuncletEntry->users()) { 1122 auto *UT = dyn_cast<TerminatorInst>(U); 1123 if (!UT) 1124 continue; 1125 BasicBlock *UBB = UT->getParent(); 1126 assert(BlockColors[UBB].size() == 1); 1127 BasicBlock *UFunclet = *(BlockColors[UBB].begin()); 1128 // Funclets shouldn't be able to loop back on themselves. 1129 assert(UFunclet != FuncletEntry); 1130 // If this instruction unwinds to the original funclet from the clone 1131 // parent, remap the terminator so that it unwinds to the clone instead. 1132 // We will perform a similar transformation for siblings after all 1133 // the siblings have been cloned. 1134 if (UFunclet == Parent) { 1135 // We're about to break the path from this block to the uncloned funclet 1136 // entry, so remove it as a predeccessor to clean up the PHIs. 1137 FuncletEntry->removePredecessor(UBB); 1138 TerminatorInst *Terminator = UBB->getTerminator(); 1139 RemapInstruction(Terminator, VMap, RF_IgnoreMissingEntries); 1140 } 1141 } 1142 1143 // This asserts a condition that is relied upon inside the loop below, 1144 // namely that no predecessors of the original funclet entry block 1145 // are also predecessors of the cloned funclet entry block. 1146 assert(std::all_of(pred_begin(FuncletEntry), pred_end(FuncletEntry), 1147 [&ClonedFunclet](BasicBlock *Pred) { 1148 return std::find(pred_begin(ClonedFunclet), 1149 pred_end(ClonedFunclet), 1150 Pred) == pred_end(ClonedFunclet); 1151 })); 1152 1153 // Remove any invalid PHI node entries in the cloned funclet.cl 1154 std::vector<PHINode *> PHIsToErase; 1155 for (Instruction &I : *ClonedFunclet) { 1156 auto *PN = dyn_cast<PHINode>(&I); 1157 if (!PN) 1158 break; 1159 1160 // Predecessors of the original funclet do not reach the cloned funclet, 1161 // but the cloning process assumes they will. Remove them now. 1162 for (auto *Pred : predecessors(FuncletEntry)) 1163 PN->removeIncomingValue(Pred, false); 1164 } 1165 for (auto *PN : PHIsToErase) 1166 PN->eraseFromParent(); 1167 1168 // Replace the original funclet in the parent's children vector with the 1169 // cloned funclet. 1170 for (auto &It : FuncletChildren[Parent]) { 1171 if (It == FuncletEntry) { 1172 It = ClonedFunclet; 1173 break; 1174 } 1175 } 1176 1177 return ClonedFunclet; 1178 } 1179 1180 // Removes the unwind edge for any exceptional terminators within the specified 1181 // parent funclet that previously unwound to the specified child funclet. 1182 void WinEHPrepare::makeFuncletEdgeUnreachable(BasicBlock *Parent, 1183 BasicBlock *Child) { 1184 for (BasicBlock *BB : FuncletBlocks[Parent]) { 1185 TerminatorInst *Terminator = BB->getTerminator(); 1186 if (!Terminator->isExceptional()) 1187 continue; 1188 1189 // Look for terninators that unwind to the child funclet. 1190 BasicBlock *UnwindDest = nullptr; 1191 if (auto *I = dyn_cast<InvokeInst>(Terminator)) 1192 UnwindDest = I->getUnwindDest(); 1193 else if (auto *I = dyn_cast<CatchEndPadInst>(Terminator)) 1194 UnwindDest = I->getUnwindDest(); 1195 else if (auto *I = dyn_cast<TerminatePadInst>(Terminator)) 1196 UnwindDest = I->getUnwindDest(); 1197 // cleanupendpad, catchret and cleanupret don't represent a parent-to-child 1198 // funclet transition, so we don't need to consider them here. 1199 1200 // If the child funclet is the unwind destination, replace the terminator 1201 // with an unreachable instruction. 1202 if (UnwindDest == Child) 1203 removeUnwindEdge(BB); 1204 } 1205 // The specified parent is no longer a parent of the specified child. 1206 std::vector<BasicBlock *> &Children = FuncletChildren[Parent]; 1207 Children.erase(std::remove(Children.begin(), Children.end(), Child), 1208 Children.end()); 1209 } 1210 1211 // This routine is called after funclets with multiple parents are cloned for 1212 // a specific parent. Here we look for children of the specified funclet that 1213 // unwind to other children of that funclet and update the unwind destinations 1214 // to ensure that each sibling is connected to the correct clone of the sibling 1215 // to which it unwinds. 1216 // 1217 // If the terminator is an invoke instruction, it unwinds either to a child 1218 // EH pad, a cleanup end pad in the current funclet, or a catch end pad in a 1219 // parent funclet (which ends either the current catch pad or a sibling 1220 // catch pad). If it unwinds to a child EH pad, the child will have multiple 1221 // parents after this funclet is cloned and this case will be handled later in 1222 // the resolveFuncletAncestryForPath processing. If it unwinds to a 1223 // cleanup end pad in the current funclet, the instruction remapping during 1224 // the cloning process should have already mapped the unwind destination to 1225 // the cloned copy of the cleanup end pad. If it unwinds to a catch end pad 1226 // there are two possibilities: either the catch end pad is the unwind 1227 // destination for the catch pad we are currently cloning or it is the unwind 1228 // destination for a sibling catch pad. If it it the unwind destination of the 1229 // catch pad we are cloning, we need to update the cloned invoke instruction 1230 // to unwind to the cloned catch end pad. Otherwise, we will handle this 1231 // later (in resolveFuncletAncestryForPath). 1232 static void updateSiblingToSiblingUnwind( 1233 BasicBlock *CurFunclet, 1234 std::map<BasicBlock *, SetVector<BasicBlock *>> &BlockColors, 1235 std::map<BasicBlock *, std::set<BasicBlock *>> &FuncletBlocks, 1236 std::map<BasicBlock *, std::vector<BasicBlock *>> &FuncletParents, 1237 std::map<BasicBlock *, std::vector<BasicBlock *>> &FuncletChildren, 1238 std::map<BasicBlock *, BasicBlock *> &Funclet2Orig) { 1239 // Remap any bad sibling-to-sibling transitions for funclets that 1240 // we just cloned. 1241 for (BasicBlock *ChildFunclet : FuncletChildren[CurFunclet]) { 1242 for (auto *BB : FuncletBlocks[ChildFunclet]) { 1243 TerminatorInst *Terminator = BB->getTerminator(); 1244 if (!Terminator->isExceptional()) 1245 continue; 1246 1247 // See if this terminator has an unwind destination. 1248 // Note that catchendpads are handled when the associated catchpad 1249 // is cloned. They don't fit the pattern we're looking for here. 1250 BasicBlock *UnwindDest = nullptr; 1251 if (auto *I = dyn_cast<CatchPadInst>(Terminator)) { 1252 UnwindDest = I->getUnwindDest(); 1253 // The catchendpad is not a sibling destination. This case should 1254 // have been handled in cloneFuncletForParent(). 1255 if (isa<CatchEndPadInst>(Terminator)) { 1256 assert(BlockColors[UnwindDest].size() == 1 && 1257 "Cloned catchpad unwinds to an pad with multiple parents."); 1258 assert(FuncletParents[UnwindDest].front() == CurFunclet && 1259 "Cloned catchpad unwinds to the wrong parent."); 1260 continue; 1261 } 1262 } else { 1263 if (auto *I = dyn_cast<CleanupReturnInst>(Terminator)) 1264 UnwindDest = I->getUnwindDest(); 1265 else if (auto *I = dyn_cast<CleanupEndPadInst>(Terminator)) 1266 UnwindDest = I->getUnwindDest(); 1267 1268 // If the cleanup unwinds to caller, there is nothing to be done. 1269 if (!UnwindDest) 1270 continue; 1271 } 1272 1273 // If the destination is not a cleanup pad, catch pad or terminate pad 1274 // we don't need to handle it here. 1275 Instruction *EHPad = UnwindDest->getFirstNonPHI(); 1276 if (!isa<CleanupPadInst>(EHPad) && !isa<CatchPadInst>(EHPad) && 1277 !isa<TerminatePadInst>(EHPad)) 1278 continue; 1279 1280 // If it is one of these, then it is either a sibling of the current 1281 // child funclet or a clone of one of those siblings. 1282 // If it is a sibling, no action is needed. 1283 if (FuncletParents[UnwindDest].size() == 1 && 1284 FuncletParents[UnwindDest].front() == CurFunclet) 1285 continue; 1286 1287 // If the unwind destination is a clone of a sibling, we need to figure 1288 // out which sibling it is a clone of and use that sibling as the 1289 // unwind destination. 1290 BasicBlock *DestOrig = Funclet2Orig[UnwindDest]; 1291 BasicBlock *TargetSibling = nullptr; 1292 for (auto &Mapping : Funclet2Orig) { 1293 if (Mapping.second != DestOrig) 1294 continue; 1295 BasicBlock *MappedFunclet = Mapping.first; 1296 if (FuncletParents[MappedFunclet].size() == 1 && 1297 FuncletParents[MappedFunclet].front() == CurFunclet) { 1298 TargetSibling = MappedFunclet; 1299 } 1300 } 1301 // If we didn't find the sibling we were looking for then the 1302 // unwind destination is not a clone of one of child's siblings. 1303 // That's unexpected. 1304 assert(TargetSibling && "Funclet unwinds to unexpected destination."); 1305 1306 // Update the terminator instruction to unwind to the correct sibling. 1307 if (auto *I = dyn_cast<CatchPadInst>(Terminator)) 1308 I->setUnwindDest(TargetSibling); 1309 else if (auto *I = dyn_cast<CleanupReturnInst>(Terminator)) 1310 I->setUnwindDest(TargetSibling); 1311 else if (auto *I = dyn_cast<CleanupEndPadInst>(Terminator)) 1312 I->setUnwindDest(TargetSibling); 1313 } 1314 } 1315 1316 // Invoke remapping can't be done correctly until after all of their 1317 // other sibling-to-sibling unwinds have been remapped. 1318 for (BasicBlock *ChildFunclet : FuncletChildren[CurFunclet]) { 1319 bool NeedOrigInvokeRemapping = false; 1320 for (auto *BB : FuncletBlocks[ChildFunclet]) { 1321 TerminatorInst *Terminator = BB->getTerminator(); 1322 auto *II = dyn_cast<InvokeInst>(Terminator); 1323 if (!II) 1324 continue; 1325 1326 BasicBlock *UnwindDest = II->getUnwindDest(); 1327 assert(UnwindDest && "Invoke unwinds to a null destination."); 1328 assert(UnwindDest->isEHPad() && "Invoke does not unwind to an EH pad."); 1329 auto *EHPadInst = UnwindDest->getFirstNonPHI(); 1330 if (isa<CleanupEndPadInst>(EHPadInst)) { 1331 // An invoke that unwinds to a cleanup end pad must be in a cleanup pad. 1332 assert(isa<CleanupPadInst>(ChildFunclet->getFirstNonPHI()) && 1333 "Unwinding to cleanup end pad from a non cleanup pad funclet."); 1334 // The funclet cloning should have remapped the destination to the cloned 1335 // cleanup end pad. 1336 assert(FuncletBlocks[ChildFunclet].count(UnwindDest) && 1337 "Unwind destination for invoke was not updated during cloning."); 1338 } else if (isa<CatchEndPadInst>(EHPadInst)) { 1339 // If the invoke unwind destination is the unwind destination for 1340 // the current child catch pad funclet, there is nothing to be done. 1341 BasicBlock *OrigFunclet = Funclet2Orig[ChildFunclet]; 1342 auto *CurCatch = cast<CatchPadInst>(ChildFunclet->getFirstNonPHI()); 1343 auto *OrigCatch = cast<CatchPadInst>(OrigFunclet->getFirstNonPHI()); 1344 if (OrigCatch->getUnwindDest() == UnwindDest) { 1345 // If the invoke unwinds to a catch end pad that is the unwind 1346 // destination for the original catch pad, the cloned invoke should 1347 // unwind to the cloned catch end pad. 1348 II->setUnwindDest(CurCatch->getUnwindDest()); 1349 } else if (CurCatch->getUnwindDest() == UnwindDest) { 1350 // If the invoke unwinds to a catch end pad that is the unwind 1351 // destination for the clone catch pad, the original invoke should 1352 // unwind to the unwind destination of the original catch pad. 1353 // This happens when the catch end pad is matched to the clone 1354 // parent when the catchpad instruction is cloned and the original 1355 // invoke instruction unwinds to the original catch end pad (which 1356 // is now the unwind destination of the cloned catch pad). 1357 NeedOrigInvokeRemapping = true; 1358 } else { 1359 // Otherwise, the invoke unwinds to a catch end pad that is the unwind 1360 // destination another catch pad in the unwind chain from either the 1361 // current catch pad or one of its clones. If it is already the 1362 // catch end pad at the end unwind chain from the current catch pad, 1363 // we'll need to check the invoke instructions in the original funclet 1364 // later. Otherwise, we need to remap this invoke now. 1365 assert((getEndPadForCatch(OrigCatch) == UnwindDest || 1366 getEndPadForCatch(CurCatch) == UnwindDest) && 1367 "Invoke within catch pad unwinds to an invalid catch end pad."); 1368 BasicBlock *CurCatchEnd = getEndPadForCatch(CurCatch); 1369 if (CurCatchEnd == UnwindDest) 1370 NeedOrigInvokeRemapping = true; 1371 else 1372 II->setUnwindDest(CurCatchEnd); 1373 } 1374 } 1375 } 1376 if (NeedOrigInvokeRemapping) { 1377 // To properly remap invoke instructions that unwind to catch end pads 1378 // that are not the unwind destination of the catch pad funclet in which 1379 // the invoke appears, we must also look at the uncloned invoke in the 1380 // original funclet. If we saw an invoke that was already properly 1381 // unwinding to a sibling's catch end pad, we need to check the invokes 1382 // in the original funclet. 1383 BasicBlock *OrigFunclet = Funclet2Orig[ChildFunclet]; 1384 for (auto *BB : FuncletBlocks[OrigFunclet]) { 1385 auto *II = dyn_cast<InvokeInst>(BB->getTerminator()); 1386 if (!II) 1387 continue; 1388 1389 BasicBlock *UnwindDest = II->getUnwindDest(); 1390 assert(UnwindDest && "Invoke unwinds to a null destination."); 1391 assert(UnwindDest->isEHPad() && "Invoke does not unwind to an EH pad."); 1392 auto *CEP = dyn_cast<CatchEndPadInst>(UnwindDest->getFirstNonPHI()); 1393 if (!CEP) 1394 continue; 1395 1396 // If the invoke unwind destination is the unwind destination for 1397 // the original catch pad funclet, there is nothing to be done. 1398 auto *OrigCatch = cast<CatchPadInst>(OrigFunclet->getFirstNonPHI()); 1399 1400 // If the invoke unwinds to a catch end pad that is neither the unwind 1401 // destination of OrigCatch or the destination another catch pad in the 1402 // unwind chain from current catch pad, we need to remap the invoke. 1403 BasicBlock *OrigCatchEnd = getEndPadForCatch(OrigCatch); 1404 if (OrigCatchEnd != UnwindDest) 1405 II->setUnwindDest(OrigCatchEnd); 1406 } 1407 } 1408 } 1409 } 1410 1411 void WinEHPrepare::resolveFuncletAncestry( 1412 Function &F, SmallVectorImpl<BasicBlock *> &EntryBlocks) { 1413 // Most of the time this will be unnecessary. If the conditions arise that 1414 // require this work, this flag will be set. 1415 if (!FuncletCloningRequired) 1416 return; 1417 1418 // Funclet2Orig is used to map any cloned funclets back to the original 1419 // funclet from which they were cloned. The map is seeded with the 1420 // original funclets mapping to themselves. 1421 std::map<BasicBlock *, BasicBlock *> Funclet2Orig; 1422 for (auto *Funclet : EntryBlocks) 1423 Funclet2Orig[Funclet] = Funclet; 1424 1425 // Start with the entry funclet and walk the funclet parent-child tree. 1426 SmallVector<BasicBlock *, 4> FuncletPath; 1427 FuncletPath.push_back(&(F.getEntryBlock())); 1428 resolveFuncletAncestryForPath(F, FuncletPath, Funclet2Orig); 1429 } 1430 1431 // Walks the funclet control flow, cloning any funclets that have more than one 1432 // parent funclet and breaking any cyclic unwind chains so that the path becomes 1433 // unreachable at the point where a funclet would have unwound to a funclet that 1434 // was already in the chain. 1435 void WinEHPrepare::resolveFuncletAncestryForPath( 1436 Function &F, SmallVectorImpl<BasicBlock *> &FuncletPath, 1437 std::map<BasicBlock *, BasicBlock *> &Funclet2Orig) { 1438 bool ClonedAnyChildren = false; 1439 BasicBlock *CurFunclet = FuncletPath.back(); 1440 // Copy the children vector because we might changing it. 1441 std::vector<BasicBlock *> Children(FuncletChildren[CurFunclet]); 1442 for (BasicBlock *ChildFunclet : Children) { 1443 // Don't allow the funclet chain to unwind back on itself. 1444 // If this funclet is already in the current funclet chain, make the 1445 // path to it through the current funclet unreachable. 1446 bool IsCyclic = false; 1447 BasicBlock *ChildIdentity = Funclet2Orig[ChildFunclet]; 1448 for (BasicBlock *Ancestor : FuncletPath) { 1449 BasicBlock *AncestorIdentity = Funclet2Orig[Ancestor]; 1450 if (AncestorIdentity == ChildIdentity) { 1451 IsCyclic = true; 1452 break; 1453 } 1454 } 1455 // If the unwind chain wraps back on itself, break the chain. 1456 if (IsCyclic) { 1457 makeFuncletEdgeUnreachable(CurFunclet, ChildFunclet); 1458 continue; 1459 } 1460 // If this child funclet has other parents, clone the entire funclet. 1461 if (FuncletParents[ChildFunclet].size() > 1) { 1462 ChildFunclet = cloneFuncletForParent(F, ChildFunclet, CurFunclet); 1463 Funclet2Orig[ChildFunclet] = ChildIdentity; 1464 ClonedAnyChildren = true; 1465 } 1466 FuncletPath.push_back(ChildFunclet); 1467 resolveFuncletAncestryForPath(F, FuncletPath, Funclet2Orig); 1468 FuncletPath.pop_back(); 1469 } 1470 // If we didn't clone any children, we can return now. 1471 if (!ClonedAnyChildren) 1472 return; 1473 1474 updateSiblingToSiblingUnwind(CurFunclet, BlockColors, FuncletBlocks, 1475 FuncletParents, FuncletChildren, Funclet2Orig); 1476 } 1477 1478 void WinEHPrepare::colorFunclets(Function &F, 1479 SmallVectorImpl<BasicBlock *> &EntryBlocks) { 1480 ::colorFunclets(F, EntryBlocks, BlockColors, FuncletBlocks); 1481 1482 // The processing above actually accumulated the parent set for this 1483 // funclet into the color set for its entry; use the parent set to 1484 // populate the children map, and reset the color set to include just 1485 // the funclet itself (no instruction can target a funclet entry except on 1486 // that transitions to the child funclet). 1487 for (BasicBlock *FuncletEntry : EntryBlocks) { 1488 SetVector<BasicBlock *> &ColorMapItem = BlockColors[FuncletEntry]; 1489 // It will be rare for funclets to have multiple parents, but if any 1490 // do we need to clone the funclet later to address that. Here we 1491 // set a flag indicating that this case has arisen so that we don't 1492 // have to do a lot of checking later to handle the more common case. 1493 if (ColorMapItem.size() > 1) 1494 FuncletCloningRequired = true; 1495 for (BasicBlock *Parent : ColorMapItem) { 1496 assert(std::find(FuncletChildren[Parent].begin(), 1497 FuncletChildren[Parent].end(), 1498 FuncletEntry) == std::end(FuncletChildren[Parent])); 1499 FuncletChildren[Parent].push_back(FuncletEntry); 1500 assert(std::find(FuncletParents[FuncletEntry].begin(), 1501 FuncletParents[FuncletEntry].end(), 1502 Parent) == std::end(FuncletParents[FuncletEntry])); 1503 FuncletParents[FuncletEntry].push_back(Parent); 1504 } 1505 ColorMapItem.clear(); 1506 ColorMapItem.insert(FuncletEntry); 1507 } 1508 } 1509 1510 void llvm::calculateCatchReturnSuccessorColors(const Function *Fn, 1511 WinEHFuncInfo &FuncInfo) { 1512 SmallVector<BasicBlock *, 4> EntryBlocks; 1513 // colorFunclets needs the set of EntryBlocks, get them using 1514 // findFuncletEntryPoints. 1515 findFuncletEntryPoints(const_cast<Function &>(*Fn), EntryBlocks); 1516 1517 std::map<BasicBlock *, SetVector<BasicBlock *>> BlockColors; 1518 std::map<BasicBlock *, std::set<BasicBlock *>> FuncletBlocks; 1519 // Figure out which basic blocks belong to which funclets. 1520 colorFunclets(const_cast<Function &>(*Fn), EntryBlocks, BlockColors, 1521 FuncletBlocks); 1522 1523 // The static colorFunclets routine assigns multiple colors to funclet entries 1524 // because that information is needed to calculate funclets' parent-child 1525 // relationship, but we don't need those relationship here and ultimately the 1526 // entry blocks should have the color of the funclet they begin. 1527 for (BasicBlock *FuncletEntry : EntryBlocks) { 1528 BlockColors[FuncletEntry].clear(); 1529 BlockColors[FuncletEntry].insert(FuncletEntry); 1530 } 1531 1532 // We need to find the catchret successors. To do this, we must first find 1533 // all the catchpad funclets. 1534 for (auto &Funclet : FuncletBlocks) { 1535 // Figure out what kind of funclet we are looking at; We only care about 1536 // catchpads. 1537 BasicBlock *FuncletPadBB = Funclet.first; 1538 Instruction *FirstNonPHI = FuncletPadBB->getFirstNonPHI(); 1539 auto *CatchPad = dyn_cast<CatchPadInst>(FirstNonPHI); 1540 if (!CatchPad) 1541 continue; 1542 1543 // The users of a catchpad are always catchrets. 1544 for (User *Exit : CatchPad->users()) { 1545 auto *CatchReturn = dyn_cast<CatchReturnInst>(Exit); 1546 if (!CatchReturn) 1547 continue; 1548 BasicBlock *CatchRetSuccessor = CatchReturn->getSuccessor(); 1549 SetVector<BasicBlock *> &SuccessorColors = BlockColors[CatchRetSuccessor]; 1550 assert(SuccessorColors.size() == 1 && "Expected BB to be monochrome!"); 1551 BasicBlock *Color = *SuccessorColors.begin(); 1552 // Record the catchret successor's funclet membership. 1553 FuncInfo.CatchRetSuccessorColorMap[CatchReturn] = Color; 1554 } 1555 } 1556 } 1557 1558 void WinEHPrepare::demotePHIsOnFunclets(Function &F) { 1559 // Strip PHI nodes off of EH pads. 1560 SmallVector<PHINode *, 16> PHINodes; 1561 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE;) { 1562 BasicBlock *BB = &*FI++; 1563 if (!BB->isEHPad()) 1564 continue; 1565 for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE;) { 1566 Instruction *I = &*BI++; 1567 auto *PN = dyn_cast<PHINode>(I); 1568 // Stop at the first non-PHI. 1569 if (!PN) 1570 break; 1571 1572 AllocaInst *SpillSlot = insertPHILoads(PN, F); 1573 if (SpillSlot) 1574 insertPHIStores(PN, SpillSlot); 1575 1576 PHINodes.push_back(PN); 1577 } 1578 } 1579 1580 for (auto *PN : PHINodes) { 1581 // There may be lingering uses on other EH PHIs being removed 1582 PN->replaceAllUsesWith(UndefValue::get(PN->getType())); 1583 PN->eraseFromParent(); 1584 } 1585 } 1586 1587 void WinEHPrepare::cloneCommonBlocks( 1588 Function &F, SmallVectorImpl<BasicBlock *> &EntryBlocks) { 1589 // We need to clone all blocks which belong to multiple funclets. Values are 1590 // remapped throughout the funclet to propogate both the new instructions 1591 // *and* the new basic blocks themselves. 1592 for (BasicBlock *FuncletPadBB : EntryBlocks) { 1593 std::set<BasicBlock *> &BlocksInFunclet = FuncletBlocks[FuncletPadBB]; 1594 1595 std::map<BasicBlock *, BasicBlock *> Orig2Clone; 1596 ValueToValueMapTy VMap; 1597 for (auto BlockIt = BlocksInFunclet.begin(), 1598 BlockEnd = BlocksInFunclet.end(); 1599 BlockIt != BlockEnd;) { 1600 // Increment the iterator inside the loop because we might be removing 1601 // blocks from the set. 1602 BasicBlock *BB = *BlockIt++; 1603 SetVector<BasicBlock *> &ColorsForBB = BlockColors[BB]; 1604 // We don't need to do anything if the block is monochromatic. 1605 size_t NumColorsForBB = ColorsForBB.size(); 1606 if (NumColorsForBB == 1) 1607 continue; 1608 1609 // If this block is a catchendpad, it shouldn't be cloned. 1610 // We will only see a catchendpad with multiple colors in the case where 1611 // some funclet has multiple parents. In that case, the color will be 1612 // resolved during the resolveFuncletAncestry processing. 1613 // For now, find the catchpad that unwinds to this block and assign 1614 // that catchpad's first parent to be the color for this block. 1615 if (isa<CatchEndPadInst>(BB->getFirstNonPHI())) { 1616 assert( 1617 FuncletCloningRequired && 1618 "Found multi-colored catchendpad with no multi-parent funclets."); 1619 BasicBlock *CatchParent = nullptr; 1620 // There can only be one catchpad predecessor for a catchendpad. 1621 for (BasicBlock *PredBB : predecessors(BB)) { 1622 if (isa<CatchPadInst>(PredBB->getTerminator())) { 1623 CatchParent = PredBB; 1624 break; 1625 } 1626 } 1627 // There must be one catchpad predecessor for a catchendpad. 1628 assert(CatchParent && "No catchpad found for catchendpad."); 1629 1630 // If the catchpad has multiple parents, we'll clone the catchendpad 1631 // when we clone the catchpad funclet and insert it into the correct 1632 // funclet. For now, we just select the first parent of the catchpad 1633 // and give the catchendpad that color. 1634 BasicBlock *CorrectColor = FuncletParents[CatchParent].front(); 1635 assert(FuncletBlocks[CorrectColor].count(BB)); 1636 assert(BlockColors[BB].count(CorrectColor)); 1637 1638 // Remove this block from the FuncletBlocks set of any funclet that 1639 // isn't the funclet whose color we just selected. 1640 for (BasicBlock *ContainingFunclet : BlockColors[BB]) 1641 if (ContainingFunclet != CorrectColor) 1642 FuncletBlocks[ContainingFunclet].erase(BB); 1643 BlockColors[BB].remove_if([&](BasicBlock *ContainingFunclet) { 1644 return ContainingFunclet != CorrectColor; 1645 }); 1646 // This should leave just one color for BB. 1647 assert(BlockColors[BB].size() == 1); 1648 continue; 1649 } 1650 1651 DEBUG_WITH_TYPE("winehprepare-coloring", 1652 dbgs() << " Cloning block \'" << BB->getName() 1653 << "\' for funclet \'" << FuncletPadBB->getName() 1654 << "\'.\n"); 1655 1656 // Create a new basic block and copy instructions into it! 1657 BasicBlock *CBB = 1658 CloneBasicBlock(BB, VMap, Twine(".for.", FuncletPadBB->getName())); 1659 // Insert the clone immediately after the original to ensure determinism 1660 // and to keep the same relative ordering of any funclet's blocks. 1661 CBB->insertInto(&F, BB->getNextNode()); 1662 1663 // Add basic block mapping. 1664 VMap[BB] = CBB; 1665 1666 // Record delta operations that we need to perform to our color mappings. 1667 Orig2Clone[BB] = CBB; 1668 } 1669 1670 // If nothing was cloned, we're done cloning in this funclet. 1671 if (Orig2Clone.empty()) 1672 continue; 1673 1674 // Update our color mappings to reflect that one block has lost a color and 1675 // another has gained a color. 1676 for (auto &BBMapping : Orig2Clone) { 1677 BasicBlock *OldBlock = BBMapping.first; 1678 BasicBlock *NewBlock = BBMapping.second; 1679 1680 BlocksInFunclet.insert(NewBlock); 1681 BlockColors[NewBlock].insert(FuncletPadBB); 1682 1683 DEBUG_WITH_TYPE("winehprepare-coloring", 1684 dbgs() << " Assigned color \'" << FuncletPadBB->getName() 1685 << "\' to block \'" << NewBlock->getName() 1686 << "\'.\n"); 1687 1688 BlocksInFunclet.erase(OldBlock); 1689 BlockColors[OldBlock].remove(FuncletPadBB); 1690 1691 DEBUG_WITH_TYPE("winehprepare-coloring", 1692 dbgs() << " Removed color \'" << FuncletPadBB->getName() 1693 << "\' from block \'" << OldBlock->getName() 1694 << "\'.\n"); 1695 1696 // If we are cloning a funclet that might share a child funclet with 1697 // another funclet, look to see if the cloned block is reached from a 1698 // catchret instruction. If so, save this association so we can retrieve 1699 // the possibly orphaned clone when we clone the child funclet. 1700 if (FuncletCloningRequired) { 1701 for (auto *Pred : predecessors(OldBlock)) { 1702 auto *Terminator = Pred->getTerminator(); 1703 if (!isa<CatchReturnInst>(Terminator)) 1704 continue; 1705 // If this block is reached from a catchret instruction in a funclet 1706 // that has multiple parents, it will have a color for each of those 1707 // parents. We just removed the color of one of the parents, but 1708 // the cloned block will be unreachable until we clone the child 1709 // funclet that contains the catchret instruction. In that case we 1710 // need to create a mapping that will let us find the cloned block 1711 // later and associate it with the cloned child funclet. 1712 bool BlockWillBeEstranged = false; 1713 for (auto *Color : BlockColors[Pred]) { 1714 if (FuncletParents[Color].size() > 1) { 1715 BlockWillBeEstranged = true; 1716 break; // Breaks out of the color loop 1717 } 1718 } 1719 if (BlockWillBeEstranged) { 1720 EstrangedBlocks[FuncletPadBB][OldBlock] = NewBlock; 1721 DEBUG_WITH_TYPE("winehprepare-coloring", 1722 dbgs() << " Saved mapping of estranged block \'" 1723 << NewBlock->getName() << "\' for \'" 1724 << FuncletPadBB->getName() << "\'.\n"); 1725 break; // Breaks out of the predecessor loop 1726 } 1727 } 1728 } 1729 } 1730 1731 // Loop over all of the instructions in this funclet, fixing up operand 1732 // references as we go. This uses VMap to do all the hard work. 1733 for (BasicBlock *BB : BlocksInFunclet) 1734 // Loop over all instructions, fixing each one as we find it... 1735 for (Instruction &I : *BB) 1736 RemapInstruction(&I, VMap, 1737 RF_IgnoreMissingEntries | RF_NoModuleLevelChanges); 1738 1739 // Check to see if SuccBB has PHI nodes. If so, we need to add entries to 1740 // the PHI nodes for NewBB now. 1741 for (auto &BBMapping : Orig2Clone) { 1742 BasicBlock *OldBlock = BBMapping.first; 1743 BasicBlock *NewBlock = BBMapping.second; 1744 for (BasicBlock *SuccBB : successors(NewBlock)) { 1745 for (Instruction &SuccI : *SuccBB) { 1746 auto *SuccPN = dyn_cast<PHINode>(&SuccI); 1747 if (!SuccPN) 1748 break; 1749 1750 // Ok, we have a PHI node. Figure out what the incoming value was for 1751 // the OldBlock. 1752 int OldBlockIdx = SuccPN->getBasicBlockIndex(OldBlock); 1753 if (OldBlockIdx == -1) 1754 break; 1755 Value *IV = SuccPN->getIncomingValue(OldBlockIdx); 1756 1757 // Remap the value if necessary. 1758 if (auto *Inst = dyn_cast<Instruction>(IV)) { 1759 ValueToValueMapTy::iterator I = VMap.find(Inst); 1760 if (I != VMap.end()) 1761 IV = I->second; 1762 } 1763 1764 SuccPN->addIncoming(IV, NewBlock); 1765 } 1766 } 1767 } 1768 1769 for (ValueToValueMapTy::value_type VT : VMap) { 1770 // If there were values defined in BB that are used outside the funclet, 1771 // then we now have to update all uses of the value to use either the 1772 // original value, the cloned value, or some PHI derived value. This can 1773 // require arbitrary PHI insertion, of which we are prepared to do, clean 1774 // these up now. 1775 SmallVector<Use *, 16> UsesToRename; 1776 1777 auto *OldI = dyn_cast<Instruction>(const_cast<Value *>(VT.first)); 1778 if (!OldI) 1779 continue; 1780 auto *NewI = cast<Instruction>(VT.second); 1781 // Scan all uses of this instruction to see if it is used outside of its 1782 // funclet, and if so, record them in UsesToRename. 1783 for (Use &U : OldI->uses()) { 1784 Instruction *UserI = cast<Instruction>(U.getUser()); 1785 BasicBlock *UserBB = UserI->getParent(); 1786 SetVector<BasicBlock *> &ColorsForUserBB = BlockColors[UserBB]; 1787 assert(!ColorsForUserBB.empty()); 1788 if (ColorsForUserBB.size() > 1 || 1789 *ColorsForUserBB.begin() != FuncletPadBB) 1790 UsesToRename.push_back(&U); 1791 } 1792 1793 // If there are no uses outside the block, we're done with this 1794 // instruction. 1795 if (UsesToRename.empty()) 1796 continue; 1797 1798 // We found a use of OldI outside of the funclet. Rename all uses of OldI 1799 // that are outside its funclet to be uses of the appropriate PHI node 1800 // etc. 1801 SSAUpdater SSAUpdate; 1802 SSAUpdate.Initialize(OldI->getType(), OldI->getName()); 1803 SSAUpdate.AddAvailableValue(OldI->getParent(), OldI); 1804 SSAUpdate.AddAvailableValue(NewI->getParent(), NewI); 1805 1806 while (!UsesToRename.empty()) 1807 SSAUpdate.RewriteUseAfterInsertions(*UsesToRename.pop_back_val()); 1808 } 1809 } 1810 } 1811 1812 void WinEHPrepare::removeImplausibleTerminators(Function &F) { 1813 // Remove implausible terminators and replace them with UnreachableInst. 1814 for (auto &Funclet : FuncletBlocks) { 1815 BasicBlock *FuncletPadBB = Funclet.first; 1816 std::set<BasicBlock *> &BlocksInFunclet = Funclet.second; 1817 Instruction *FirstNonPHI = FuncletPadBB->getFirstNonPHI(); 1818 auto *CatchPad = dyn_cast<CatchPadInst>(FirstNonPHI); 1819 auto *CleanupPad = dyn_cast<CleanupPadInst>(FirstNonPHI); 1820 1821 for (BasicBlock *BB : BlocksInFunclet) { 1822 TerminatorInst *TI = BB->getTerminator(); 1823 // CatchPadInst and CleanupPadInst can't transfer control to a ReturnInst. 1824 bool IsUnreachableRet = isa<ReturnInst>(TI) && (CatchPad || CleanupPad); 1825 // The token consumed by a CatchReturnInst must match the funclet token. 1826 bool IsUnreachableCatchret = false; 1827 if (auto *CRI = dyn_cast<CatchReturnInst>(TI)) 1828 IsUnreachableCatchret = CRI->getCatchPad() != CatchPad; 1829 // The token consumed by a CleanupReturnInst must match the funclet token. 1830 bool IsUnreachableCleanupret = false; 1831 if (auto *CRI = dyn_cast<CleanupReturnInst>(TI)) 1832 IsUnreachableCleanupret = CRI->getCleanupPad() != CleanupPad; 1833 // The token consumed by a CleanupEndPadInst must match the funclet token. 1834 bool IsUnreachableCleanupendpad = false; 1835 if (auto *CEPI = dyn_cast<CleanupEndPadInst>(TI)) 1836 IsUnreachableCleanupendpad = CEPI->getCleanupPad() != CleanupPad; 1837 if (IsUnreachableRet || IsUnreachableCatchret || 1838 IsUnreachableCleanupret || IsUnreachableCleanupendpad) { 1839 // Loop through all of our successors and make sure they know that one 1840 // of their predecessors is going away. 1841 for (BasicBlock *SuccBB : TI->successors()) 1842 SuccBB->removePredecessor(BB); 1843 1844 if (IsUnreachableCleanupendpad) { 1845 // We can't simply replace a cleanupendpad with unreachable, because 1846 // its predecessor edges are EH edges and unreachable is not an EH 1847 // pad. Change all predecessors to the "unwind to caller" form. 1848 for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); 1849 PI != PE;) { 1850 BasicBlock *Pred = *PI++; 1851 removeUnwindEdge(Pred); 1852 } 1853 } 1854 1855 new UnreachableInst(BB->getContext(), TI); 1856 TI->eraseFromParent(); 1857 } 1858 // FIXME: Check for invokes/cleanuprets/cleanupendpads which unwind to 1859 // implausible catchendpads (i.e. catchendpad not in immediate parent 1860 // funclet). 1861 } 1862 } 1863 } 1864 1865 void WinEHPrepare::cleanupPreparedFunclets(Function &F) { 1866 // Clean-up some of the mess we made by removing useles PHI nodes, trivial 1867 // branches, etc. 1868 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE;) { 1869 BasicBlock *BB = &*FI++; 1870 SimplifyInstructionsInBlock(BB); 1871 ConstantFoldTerminator(BB, /*DeleteDeadConditions=*/true); 1872 MergeBlockIntoPredecessor(BB); 1873 } 1874 1875 // We might have some unreachable blocks after cleaning up some impossible 1876 // control flow. 1877 removeUnreachableBlocks(F); 1878 } 1879 1880 void WinEHPrepare::verifyPreparedFunclets(Function &F) { 1881 // Recolor the CFG to verify that all is well. 1882 for (BasicBlock &BB : F) { 1883 size_t NumColors = BlockColors[&BB].size(); 1884 assert(NumColors == 1 && "Expected monochromatic BB!"); 1885 if (NumColors == 0) 1886 report_fatal_error("Uncolored BB!"); 1887 if (NumColors > 1) 1888 report_fatal_error("Multicolor BB!"); 1889 bool EHPadHasPHI = BB.isEHPad() && isa<PHINode>(BB.begin()); 1890 assert(!EHPadHasPHI && "EH Pad still has a PHI!"); 1891 if (EHPadHasPHI) 1892 report_fatal_error("EH Pad still has a PHI!"); 1893 } 1894 } 1895 1896 bool WinEHPrepare::prepareExplicitEH( 1897 Function &F, SmallVectorImpl<BasicBlock *> &EntryBlocks) { 1898 replaceTerminatePadWithCleanup(F); 1899 1900 // Determine which blocks are reachable from which funclet entries. 1901 colorFunclets(F, EntryBlocks); 1902 1903 if (!DisableDemotion) 1904 demotePHIsOnFunclets(F); 1905 1906 cloneCommonBlocks(F, EntryBlocks); 1907 1908 resolveFuncletAncestry(F, EntryBlocks); 1909 1910 if (!DisableCleanups) { 1911 removeImplausibleTerminators(F); 1912 1913 cleanupPreparedFunclets(F); 1914 } 1915 1916 verifyPreparedFunclets(F); 1917 1918 BlockColors.clear(); 1919 FuncletBlocks.clear(); 1920 FuncletChildren.clear(); 1921 FuncletParents.clear(); 1922 EstrangedBlocks.clear(); 1923 FuncletCloningRequired = false; 1924 1925 return true; 1926 } 1927 1928 // TODO: Share loads when one use dominates another, or when a catchpad exit 1929 // dominates uses (needs dominators). 1930 AllocaInst *WinEHPrepare::insertPHILoads(PHINode *PN, Function &F) { 1931 BasicBlock *PHIBlock = PN->getParent(); 1932 AllocaInst *SpillSlot = nullptr; 1933 1934 if (isa<CleanupPadInst>(PHIBlock->getFirstNonPHI())) { 1935 // Insert a load in place of the PHI and replace all uses. 1936 SpillSlot = new AllocaInst(PN->getType(), nullptr, 1937 Twine(PN->getName(), ".wineh.spillslot"), 1938 &F.getEntryBlock().front()); 1939 Value *V = new LoadInst(SpillSlot, Twine(PN->getName(), ".wineh.reload"), 1940 &*PHIBlock->getFirstInsertionPt()); 1941 PN->replaceAllUsesWith(V); 1942 return SpillSlot; 1943 } 1944 1945 DenseMap<BasicBlock *, Value *> Loads; 1946 for (Value::use_iterator UI = PN->use_begin(), UE = PN->use_end(); 1947 UI != UE;) { 1948 Use &U = *UI++; 1949 auto *UsingInst = cast<Instruction>(U.getUser()); 1950 BasicBlock *UsingBB = UsingInst->getParent(); 1951 if (UsingBB->isEHPad()) { 1952 // Use is on an EH pad phi. Leave it alone; we'll insert loads and 1953 // stores for it separately. 1954 assert(isa<PHINode>(UsingInst)); 1955 continue; 1956 } 1957 replaceUseWithLoad(PN, U, SpillSlot, Loads, F); 1958 } 1959 return SpillSlot; 1960 } 1961 1962 // TODO: improve store placement. Inserting at def is probably good, but need 1963 // to be careful not to introduce interfering stores (needs liveness analysis). 1964 // TODO: identify related phi nodes that can share spill slots, and share them 1965 // (also needs liveness). 1966 void WinEHPrepare::insertPHIStores(PHINode *OriginalPHI, 1967 AllocaInst *SpillSlot) { 1968 // Use a worklist of (Block, Value) pairs -- the given Value needs to be 1969 // stored to the spill slot by the end of the given Block. 1970 SmallVector<std::pair<BasicBlock *, Value *>, 4> Worklist; 1971 1972 Worklist.push_back({OriginalPHI->getParent(), OriginalPHI}); 1973 1974 while (!Worklist.empty()) { 1975 BasicBlock *EHBlock; 1976 Value *InVal; 1977 std::tie(EHBlock, InVal) = Worklist.pop_back_val(); 1978 1979 PHINode *PN = dyn_cast<PHINode>(InVal); 1980 if (PN && PN->getParent() == EHBlock) { 1981 // The value is defined by another PHI we need to remove, with no room to 1982 // insert a store after the PHI, so each predecessor needs to store its 1983 // incoming value. 1984 for (unsigned i = 0, e = PN->getNumIncomingValues(); i < e; ++i) { 1985 Value *PredVal = PN->getIncomingValue(i); 1986 1987 // Undef can safely be skipped. 1988 if (isa<UndefValue>(PredVal)) 1989 continue; 1990 1991 insertPHIStore(PN->getIncomingBlock(i), PredVal, SpillSlot, Worklist); 1992 } 1993 } else { 1994 // We need to store InVal, which dominates EHBlock, but can't put a store 1995 // in EHBlock, so need to put stores in each predecessor. 1996 for (BasicBlock *PredBlock : predecessors(EHBlock)) { 1997 insertPHIStore(PredBlock, InVal, SpillSlot, Worklist); 1998 } 1999 } 2000 } 2001 } 2002 2003 void WinEHPrepare::insertPHIStore( 2004 BasicBlock *PredBlock, Value *PredVal, AllocaInst *SpillSlot, 2005 SmallVectorImpl<std::pair<BasicBlock *, Value *>> &Worklist) { 2006 2007 if (PredBlock->isEHPad() && 2008 !isa<CleanupPadInst>(PredBlock->getFirstNonPHI())) { 2009 // Pred is unsplittable, so we need to queue it on the worklist. 2010 Worklist.push_back({PredBlock, PredVal}); 2011 return; 2012 } 2013 2014 // Otherwise, insert the store at the end of the basic block. 2015 new StoreInst(PredVal, SpillSlot, PredBlock->getTerminator()); 2016 } 2017 2018 void WinEHPrepare::replaceUseWithLoad(Value *V, Use &U, AllocaInst *&SpillSlot, 2019 DenseMap<BasicBlock *, Value *> &Loads, 2020 Function &F) { 2021 // Lazilly create the spill slot. 2022 if (!SpillSlot) 2023 SpillSlot = new AllocaInst(V->getType(), nullptr, 2024 Twine(V->getName(), ".wineh.spillslot"), 2025 &F.getEntryBlock().front()); 2026 2027 auto *UsingInst = cast<Instruction>(U.getUser()); 2028 if (auto *UsingPHI = dyn_cast<PHINode>(UsingInst)) { 2029 // If this is a PHI node, we can't insert a load of the value before 2030 // the use. Instead insert the load in the predecessor block 2031 // corresponding to the incoming value. 2032 // 2033 // Note that if there are multiple edges from a basic block to this 2034 // PHI node that we cannot have multiple loads. The problem is that 2035 // the resulting PHI node will have multiple values (from each load) 2036 // coming in from the same block, which is illegal SSA form. 2037 // For this reason, we keep track of and reuse loads we insert. 2038 BasicBlock *IncomingBlock = UsingPHI->getIncomingBlock(U); 2039 if (auto *CatchRet = 2040 dyn_cast<CatchReturnInst>(IncomingBlock->getTerminator())) { 2041 // Putting a load above a catchret and use on the phi would still leave 2042 // a cross-funclet def/use. We need to split the edge, change the 2043 // catchret to target the new block, and put the load there. 2044 BasicBlock *PHIBlock = UsingInst->getParent(); 2045 BasicBlock *NewBlock = SplitEdge(IncomingBlock, PHIBlock); 2046 // SplitEdge gives us: 2047 // IncomingBlock: 2048 // ... 2049 // br label %NewBlock 2050 // NewBlock: 2051 // catchret label %PHIBlock 2052 // But we need: 2053 // IncomingBlock: 2054 // ... 2055 // catchret label %NewBlock 2056 // NewBlock: 2057 // br label %PHIBlock 2058 // So move the terminators to each others' blocks and swap their 2059 // successors. 2060 BranchInst *Goto = cast<BranchInst>(IncomingBlock->getTerminator()); 2061 Goto->removeFromParent(); 2062 CatchRet->removeFromParent(); 2063 IncomingBlock->getInstList().push_back(CatchRet); 2064 NewBlock->getInstList().push_back(Goto); 2065 Goto->setSuccessor(0, PHIBlock); 2066 CatchRet->setSuccessor(NewBlock); 2067 // Update the color mapping for the newly split edge. 2068 SetVector<BasicBlock *> &ColorsForPHIBlock = BlockColors[PHIBlock]; 2069 BlockColors[NewBlock] = ColorsForPHIBlock; 2070 for (BasicBlock *FuncletPad : ColorsForPHIBlock) 2071 FuncletBlocks[FuncletPad].insert(NewBlock); 2072 // Treat the new block as incoming for load insertion. 2073 IncomingBlock = NewBlock; 2074 } 2075 Value *&Load = Loads[IncomingBlock]; 2076 // Insert the load into the predecessor block 2077 if (!Load) 2078 Load = new LoadInst(SpillSlot, Twine(V->getName(), ".wineh.reload"), 2079 /*Volatile=*/false, IncomingBlock->getTerminator()); 2080 2081 U.set(Load); 2082 } else { 2083 // Reload right before the old use. 2084 auto *Load = new LoadInst(SpillSlot, Twine(V->getName(), ".wineh.reload"), 2085 /*Volatile=*/false, UsingInst); 2086 U.set(Load); 2087 } 2088 } 2089 2090 void WinEHFuncInfo::addIPToStateRange(const BasicBlock *PadBB, 2091 MCSymbol *InvokeBegin, 2092 MCSymbol *InvokeEnd) { 2093 assert(PadBB->isEHPad() && EHPadStateMap.count(PadBB->getFirstNonPHI()) && 2094 "should get EH pad BB with precomputed state"); 2095 InvokeToStateMap[InvokeBegin] = 2096 std::make_pair(EHPadStateMap[PadBB->getFirstNonPHI()], InvokeEnd); 2097 } 2098