1 //===- LegacyPassManager.cpp - LLVM Pass Infrastructure Implementation ----===// 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 file implements the legacy LLVM Pass Manager infrastructure. 11 // 12 //===----------------------------------------------------------------------===// 13 14 15 #include "llvm/IR/LLVMContext.h" 16 #include "llvm/IR/IRPrintingPasses.h" 17 #include "llvm/IR/LegacyPassManager.h" 18 #include "llvm/IR/LegacyPassManagers.h" 19 #include "llvm/IR/LegacyPassNameParser.h" 20 #include "llvm/IR/Module.h" 21 #include "llvm/Support/CommandLine.h" 22 #include "llvm/Support/Debug.h" 23 #include "llvm/Support/ErrorHandling.h" 24 #include "llvm/Support/ManagedStatic.h" 25 #include "llvm/Support/Mutex.h" 26 #include "llvm/Support/TimeValue.h" 27 #include "llvm/Support/Timer.h" 28 #include "llvm/Support/raw_ostream.h" 29 #include <algorithm> 30 #include <map> 31 using namespace llvm; 32 using namespace llvm::legacy; 33 34 // See PassManagers.h for Pass Manager infrastructure overview. 35 36 //===----------------------------------------------------------------------===// 37 // Pass debugging information. Often it is useful to find out what pass is 38 // running when a crash occurs in a utility. When this library is compiled with 39 // debugging on, a command line option (--debug-pass) is enabled that causes the 40 // pass name to be printed before it executes. 41 // 42 43 namespace { 44 // Different debug levels that can be enabled... 45 enum PassDebugLevel { 46 Disabled, Arguments, Structure, Executions, Details 47 }; 48 } 49 50 static cl::opt<enum PassDebugLevel> 51 PassDebugging("debug-pass", cl::Hidden, 52 cl::desc("Print PassManager debugging information"), 53 cl::values( 54 clEnumVal(Disabled , "disable debug output"), 55 clEnumVal(Arguments , "print pass arguments to pass to 'opt'"), 56 clEnumVal(Structure , "print pass structure before run()"), 57 clEnumVal(Executions, "print pass name before it is executed"), 58 clEnumVal(Details , "print pass details when it is executed"), 59 clEnumValEnd)); 60 61 namespace { 62 typedef llvm::cl::list<const llvm::PassInfo *, bool, PassNameParser> 63 PassOptionList; 64 } 65 66 // Print IR out before/after specified passes. 67 static PassOptionList 68 PrintBefore("print-before", 69 llvm::cl::desc("Print IR before specified passes"), 70 cl::Hidden); 71 72 static PassOptionList 73 PrintAfter("print-after", 74 llvm::cl::desc("Print IR after specified passes"), 75 cl::Hidden); 76 77 static cl::opt<bool> 78 PrintBeforeAll("print-before-all", 79 llvm::cl::desc("Print IR before each pass"), 80 cl::init(false)); 81 static cl::opt<bool> 82 PrintAfterAll("print-after-all", 83 llvm::cl::desc("Print IR after each pass"), 84 cl::init(false)); 85 86 /// This is a helper to determine whether to print IR before or 87 /// after a pass. 88 89 static bool ShouldPrintBeforeOrAfterPass(const PassInfo *PI, 90 PassOptionList &PassesToPrint) { 91 for (unsigned i = 0, ie = PassesToPrint.size(); i < ie; ++i) { 92 const llvm::PassInfo *PassInf = PassesToPrint[i]; 93 if (PassInf) 94 if (PassInf->getPassArgument() == PI->getPassArgument()) { 95 return true; 96 } 97 } 98 return false; 99 } 100 101 /// This is a utility to check whether a pass should have IR dumped 102 /// before it. 103 static bool ShouldPrintBeforePass(const PassInfo *PI) { 104 return PrintBeforeAll || ShouldPrintBeforeOrAfterPass(PI, PrintBefore); 105 } 106 107 /// This is a utility to check whether a pass should have IR dumped 108 /// after it. 109 static bool ShouldPrintAfterPass(const PassInfo *PI) { 110 return PrintAfterAll || ShouldPrintBeforeOrAfterPass(PI, PrintAfter); 111 } 112 113 /// isPassDebuggingExecutionsOrMore - Return true if -debug-pass=Executions 114 /// or higher is specified. 115 bool PMDataManager::isPassDebuggingExecutionsOrMore() const { 116 return PassDebugging >= Executions; 117 } 118 119 120 121 122 void PassManagerPrettyStackEntry::print(raw_ostream &OS) const { 123 if (!V && !M) 124 OS << "Releasing pass '"; 125 else 126 OS << "Running pass '"; 127 128 OS << P->getPassName() << "'"; 129 130 if (M) { 131 OS << " on module '" << M->getModuleIdentifier() << "'.\n"; 132 return; 133 } 134 if (!V) { 135 OS << '\n'; 136 return; 137 } 138 139 OS << " on "; 140 if (isa<Function>(V)) 141 OS << "function"; 142 else if (isa<BasicBlock>(V)) 143 OS << "basic block"; 144 else 145 OS << "value"; 146 147 OS << " '"; 148 V->printAsOperand(OS, /*PrintTy=*/false, M); 149 OS << "'\n"; 150 } 151 152 153 namespace { 154 //===----------------------------------------------------------------------===// 155 // BBPassManager 156 // 157 /// BBPassManager manages BasicBlockPass. It batches all the 158 /// pass together and sequence them to process one basic block before 159 /// processing next basic block. 160 class BBPassManager : public PMDataManager, public FunctionPass { 161 162 public: 163 static char ID; 164 explicit BBPassManager() 165 : PMDataManager(), FunctionPass(ID) {} 166 167 /// Execute all of the passes scheduled for execution. Keep track of 168 /// whether any of the passes modifies the function, and if so, return true. 169 bool runOnFunction(Function &F) override; 170 171 /// Pass Manager itself does not invalidate any analysis info. 172 void getAnalysisUsage(AnalysisUsage &Info) const override { 173 Info.setPreservesAll(); 174 } 175 176 bool doInitialization(Module &M) override; 177 bool doInitialization(Function &F); 178 bool doFinalization(Module &M) override; 179 bool doFinalization(Function &F); 180 181 PMDataManager *getAsPMDataManager() override { return this; } 182 Pass *getAsPass() override { return this; } 183 184 const char *getPassName() const override { 185 return "BasicBlock Pass Manager"; 186 } 187 188 // Print passes managed by this manager 189 void dumpPassStructure(unsigned Offset) override { 190 dbgs().indent(Offset*2) << "BasicBlockPass Manager\n"; 191 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 192 BasicBlockPass *BP = getContainedPass(Index); 193 BP->dumpPassStructure(Offset + 1); 194 dumpLastUses(BP, Offset+1); 195 } 196 } 197 198 BasicBlockPass *getContainedPass(unsigned N) { 199 assert(N < PassVector.size() && "Pass number out of range!"); 200 BasicBlockPass *BP = static_cast<BasicBlockPass *>(PassVector[N]); 201 return BP; 202 } 203 204 PassManagerType getPassManagerType() const override { 205 return PMT_BasicBlockPassManager; 206 } 207 }; 208 209 char BBPassManager::ID = 0; 210 } // End anonymous namespace 211 212 namespace llvm { 213 namespace legacy { 214 //===----------------------------------------------------------------------===// 215 // FunctionPassManagerImpl 216 // 217 /// FunctionPassManagerImpl manages FPPassManagers 218 class FunctionPassManagerImpl : public Pass, 219 public PMDataManager, 220 public PMTopLevelManager { 221 virtual void anchor(); 222 private: 223 bool wasRun; 224 public: 225 static char ID; 226 explicit FunctionPassManagerImpl() : 227 Pass(PT_PassManager, ID), PMDataManager(), 228 PMTopLevelManager(new FPPassManager()), wasRun(false) {} 229 230 /// add - Add a pass to the queue of passes to run. This passes ownership of 231 /// the Pass to the PassManager. When the PassManager is destroyed, the pass 232 /// will be destroyed as well, so there is no need to delete the pass. This 233 /// implies that all passes MUST be allocated with 'new'. 234 void add(Pass *P) { 235 schedulePass(P); 236 } 237 238 /// createPrinterPass - Get a function printer pass. 239 Pass *createPrinterPass(raw_ostream &O, 240 const std::string &Banner) const override { 241 return createPrintFunctionPass(O, Banner); 242 } 243 244 // Prepare for running an on the fly pass, freeing memory if needed 245 // from a previous run. 246 void releaseMemoryOnTheFly(); 247 248 /// run - Execute all of the passes scheduled for execution. Keep track of 249 /// whether any of the passes modifies the module, and if so, return true. 250 bool run(Function &F); 251 252 /// doInitialization - Run all of the initializers for the function passes. 253 /// 254 bool doInitialization(Module &M) override; 255 256 /// doFinalization - Run all of the finalizers for the function passes. 257 /// 258 bool doFinalization(Module &M) override; 259 260 261 PMDataManager *getAsPMDataManager() override { return this; } 262 Pass *getAsPass() override { return this; } 263 PassManagerType getTopLevelPassManagerType() override { 264 return PMT_FunctionPassManager; 265 } 266 267 /// Pass Manager itself does not invalidate any analysis info. 268 void getAnalysisUsage(AnalysisUsage &Info) const override { 269 Info.setPreservesAll(); 270 } 271 272 FPPassManager *getContainedManager(unsigned N) { 273 assert(N < PassManagers.size() && "Pass number out of range!"); 274 FPPassManager *FP = static_cast<FPPassManager *>(PassManagers[N]); 275 return FP; 276 } 277 }; 278 279 void FunctionPassManagerImpl::anchor() {} 280 281 char FunctionPassManagerImpl::ID = 0; 282 } // End of legacy namespace 283 } // End of llvm namespace 284 285 namespace { 286 //===----------------------------------------------------------------------===// 287 // MPPassManager 288 // 289 /// MPPassManager manages ModulePasses and function pass managers. 290 /// It batches all Module passes and function pass managers together and 291 /// sequences them to process one module. 292 class MPPassManager : public Pass, public PMDataManager { 293 public: 294 static char ID; 295 explicit MPPassManager() : 296 Pass(PT_PassManager, ID), PMDataManager() { } 297 298 // Delete on the fly managers. 299 virtual ~MPPassManager() { 300 for (std::map<Pass *, FunctionPassManagerImpl *>::iterator 301 I = OnTheFlyManagers.begin(), E = OnTheFlyManagers.end(); 302 I != E; ++I) { 303 FunctionPassManagerImpl *FPP = I->second; 304 delete FPP; 305 } 306 } 307 308 /// createPrinterPass - Get a module printer pass. 309 Pass *createPrinterPass(raw_ostream &O, 310 const std::string &Banner) const override { 311 return createPrintModulePass(O, Banner); 312 } 313 314 /// run - Execute all of the passes scheduled for execution. Keep track of 315 /// whether any of the passes modifies the module, and if so, return true. 316 bool runOnModule(Module &M); 317 318 using llvm::Pass::doInitialization; 319 using llvm::Pass::doFinalization; 320 321 /// doInitialization - Run all of the initializers for the module passes. 322 /// 323 bool doInitialization(); 324 325 /// doFinalization - Run all of the finalizers for the module passes. 326 /// 327 bool doFinalization(); 328 329 /// Pass Manager itself does not invalidate any analysis info. 330 void getAnalysisUsage(AnalysisUsage &Info) const override { 331 Info.setPreservesAll(); 332 } 333 334 /// Add RequiredPass into list of lower level passes required by pass P. 335 /// RequiredPass is run on the fly by Pass Manager when P requests it 336 /// through getAnalysis interface. 337 void addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) override; 338 339 /// Return function pass corresponding to PassInfo PI, that is 340 /// required by module pass MP. Instantiate analysis pass, by using 341 /// its runOnFunction() for function F. 342 Pass* getOnTheFlyPass(Pass *MP, AnalysisID PI, Function &F) override; 343 344 const char *getPassName() const override { 345 return "Module Pass Manager"; 346 } 347 348 PMDataManager *getAsPMDataManager() override { return this; } 349 Pass *getAsPass() override { return this; } 350 351 // Print passes managed by this manager 352 void dumpPassStructure(unsigned Offset) override { 353 dbgs().indent(Offset*2) << "ModulePass Manager\n"; 354 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 355 ModulePass *MP = getContainedPass(Index); 356 MP->dumpPassStructure(Offset + 1); 357 std::map<Pass *, FunctionPassManagerImpl *>::const_iterator I = 358 OnTheFlyManagers.find(MP); 359 if (I != OnTheFlyManagers.end()) 360 I->second->dumpPassStructure(Offset + 2); 361 dumpLastUses(MP, Offset+1); 362 } 363 } 364 365 ModulePass *getContainedPass(unsigned N) { 366 assert(N < PassVector.size() && "Pass number out of range!"); 367 return static_cast<ModulePass *>(PassVector[N]); 368 } 369 370 PassManagerType getPassManagerType() const override { 371 return PMT_ModulePassManager; 372 } 373 374 private: 375 /// Collection of on the fly FPPassManagers. These managers manage 376 /// function passes that are required by module passes. 377 std::map<Pass *, FunctionPassManagerImpl *> OnTheFlyManagers; 378 }; 379 380 char MPPassManager::ID = 0; 381 } // End anonymous namespace 382 383 namespace llvm { 384 namespace legacy { 385 //===----------------------------------------------------------------------===// 386 // PassManagerImpl 387 // 388 389 /// PassManagerImpl manages MPPassManagers 390 class PassManagerImpl : public Pass, 391 public PMDataManager, 392 public PMTopLevelManager { 393 virtual void anchor(); 394 395 public: 396 static char ID; 397 explicit PassManagerImpl() : 398 Pass(PT_PassManager, ID), PMDataManager(), 399 PMTopLevelManager(new MPPassManager()) {} 400 401 /// add - Add a pass to the queue of passes to run. This passes ownership of 402 /// the Pass to the PassManager. When the PassManager is destroyed, the pass 403 /// will be destroyed as well, so there is no need to delete the pass. This 404 /// implies that all passes MUST be allocated with 'new'. 405 void add(Pass *P) { 406 schedulePass(P); 407 } 408 409 /// createPrinterPass - Get a module printer pass. 410 Pass *createPrinterPass(raw_ostream &O, 411 const std::string &Banner) const override { 412 return createPrintModulePass(O, Banner); 413 } 414 415 /// run - Execute all of the passes scheduled for execution. Keep track of 416 /// whether any of the passes modifies the module, and if so, return true. 417 bool run(Module &M); 418 419 using llvm::Pass::doInitialization; 420 using llvm::Pass::doFinalization; 421 422 /// doInitialization - Run all of the initializers for the module passes. 423 /// 424 bool doInitialization(); 425 426 /// doFinalization - Run all of the finalizers for the module passes. 427 /// 428 bool doFinalization(); 429 430 /// Pass Manager itself does not invalidate any analysis info. 431 void getAnalysisUsage(AnalysisUsage &Info) const override { 432 Info.setPreservesAll(); 433 } 434 435 PMDataManager *getAsPMDataManager() override { return this; } 436 Pass *getAsPass() override { return this; } 437 PassManagerType getTopLevelPassManagerType() override { 438 return PMT_ModulePassManager; 439 } 440 441 MPPassManager *getContainedManager(unsigned N) { 442 assert(N < PassManagers.size() && "Pass number out of range!"); 443 MPPassManager *MP = static_cast<MPPassManager *>(PassManagers[N]); 444 return MP; 445 } 446 }; 447 448 void PassManagerImpl::anchor() {} 449 450 char PassManagerImpl::ID = 0; 451 } // End of legacy namespace 452 } // End of llvm namespace 453 454 namespace { 455 456 //===----------------------------------------------------------------------===// 457 /// TimingInfo Class - This class is used to calculate information about the 458 /// amount of time each pass takes to execute. This only happens when 459 /// -time-passes is enabled on the command line. 460 /// 461 462 static ManagedStatic<sys::SmartMutex<true> > TimingInfoMutex; 463 464 class TimingInfo { 465 DenseMap<Pass*, Timer*> TimingData; 466 TimerGroup TG; 467 public: 468 // Use 'create' member to get this. 469 TimingInfo() : TG("... Pass execution timing report ...") {} 470 471 // TimingDtor - Print out information about timing information 472 ~TimingInfo() { 473 // Delete all of the timers, which accumulate their info into the 474 // TimerGroup. 475 for (DenseMap<Pass*, Timer*>::iterator I = TimingData.begin(), 476 E = TimingData.end(); I != E; ++I) 477 delete I->second; 478 // TimerGroup is deleted next, printing the report. 479 } 480 481 // createTheTimeInfo - This method either initializes the TheTimeInfo pointer 482 // to a non-null value (if the -time-passes option is enabled) or it leaves it 483 // null. It may be called multiple times. 484 static void createTheTimeInfo(); 485 486 /// getPassTimer - Return the timer for the specified pass if it exists. 487 Timer *getPassTimer(Pass *P) { 488 if (P->getAsPMDataManager()) 489 return nullptr; 490 491 sys::SmartScopedLock<true> Lock(*TimingInfoMutex); 492 Timer *&T = TimingData[P]; 493 if (!T) 494 T = new Timer(P->getPassName(), TG); 495 return T; 496 } 497 }; 498 499 } // End of anon namespace 500 501 static TimingInfo *TheTimeInfo; 502 503 //===----------------------------------------------------------------------===// 504 // PMTopLevelManager implementation 505 506 /// Initialize top level manager. Create first pass manager. 507 PMTopLevelManager::PMTopLevelManager(PMDataManager *PMDM) { 508 PMDM->setTopLevelManager(this); 509 addPassManager(PMDM); 510 activeStack.push(PMDM); 511 } 512 513 /// Set pass P as the last user of the given analysis passes. 514 void 515 PMTopLevelManager::setLastUser(ArrayRef<Pass*> AnalysisPasses, Pass *P) { 516 unsigned PDepth = 0; 517 if (P->getResolver()) 518 PDepth = P->getResolver()->getPMDataManager().getDepth(); 519 520 for (SmallVectorImpl<Pass *>::const_iterator I = AnalysisPasses.begin(), 521 E = AnalysisPasses.end(); I != E; ++I) { 522 Pass *AP = *I; 523 LastUser[AP] = P; 524 525 if (P == AP) 526 continue; 527 528 // Update the last users of passes that are required transitive by AP. 529 AnalysisUsage *AnUsage = findAnalysisUsage(AP); 530 const AnalysisUsage::VectorType &IDs = AnUsage->getRequiredTransitiveSet(); 531 SmallVector<Pass *, 12> LastUses; 532 SmallVector<Pass *, 12> LastPMUses; 533 for (AnalysisUsage::VectorType::const_iterator I = IDs.begin(), 534 E = IDs.end(); I != E; ++I) { 535 Pass *AnalysisPass = findAnalysisPass(*I); 536 assert(AnalysisPass && "Expected analysis pass to exist."); 537 AnalysisResolver *AR = AnalysisPass->getResolver(); 538 assert(AR && "Expected analysis resolver to exist."); 539 unsigned APDepth = AR->getPMDataManager().getDepth(); 540 541 if (PDepth == APDepth) 542 LastUses.push_back(AnalysisPass); 543 else if (PDepth > APDepth) 544 LastPMUses.push_back(AnalysisPass); 545 } 546 547 setLastUser(LastUses, P); 548 549 // If this pass has a corresponding pass manager, push higher level 550 // analysis to this pass manager. 551 if (P->getResolver()) 552 setLastUser(LastPMUses, P->getResolver()->getPMDataManager().getAsPass()); 553 554 555 // If AP is the last user of other passes then make P last user of 556 // such passes. 557 for (DenseMap<Pass *, Pass *>::iterator LUI = LastUser.begin(), 558 LUE = LastUser.end(); LUI != LUE; ++LUI) { 559 if (LUI->second == AP) 560 // DenseMap iterator is not invalidated here because 561 // this is just updating existing entries. 562 LastUser[LUI->first] = P; 563 } 564 } 565 } 566 567 /// Collect passes whose last user is P 568 void PMTopLevelManager::collectLastUses(SmallVectorImpl<Pass *> &LastUses, 569 Pass *P) { 570 DenseMap<Pass *, SmallPtrSet<Pass *, 8> >::iterator DMI = 571 InversedLastUser.find(P); 572 if (DMI == InversedLastUser.end()) 573 return; 574 575 SmallPtrSet<Pass *, 8> &LU = DMI->second; 576 for (Pass *LUP : LU) { 577 LastUses.push_back(LUP); 578 } 579 580 } 581 582 AnalysisUsage *PMTopLevelManager::findAnalysisUsage(Pass *P) { 583 AnalysisUsage *AnUsage = nullptr; 584 DenseMap<Pass *, AnalysisUsage *>::iterator DMI = AnUsageMap.find(P); 585 if (DMI != AnUsageMap.end()) 586 AnUsage = DMI->second; 587 else { 588 AnUsage = new AnalysisUsage(); 589 P->getAnalysisUsage(*AnUsage); 590 AnUsageMap[P] = AnUsage; 591 } 592 return AnUsage; 593 } 594 595 /// Schedule pass P for execution. Make sure that passes required by 596 /// P are run before P is run. Update analysis info maintained by 597 /// the manager. Remove dead passes. This is a recursive function. 598 void PMTopLevelManager::schedulePass(Pass *P) { 599 600 // TODO : Allocate function manager for this pass, other wise required set 601 // may be inserted into previous function manager 602 603 // Give pass a chance to prepare the stage. 604 P->preparePassManager(activeStack); 605 606 // If P is an analysis pass and it is available then do not 607 // generate the analysis again. Stale analysis info should not be 608 // available at this point. 609 const PassInfo *PI = 610 PassRegistry::getPassRegistry()->getPassInfo(P->getPassID()); 611 if (PI && PI->isAnalysis() && findAnalysisPass(P->getPassID())) { 612 delete P; 613 return; 614 } 615 616 AnalysisUsage *AnUsage = findAnalysisUsage(P); 617 618 bool checkAnalysis = true; 619 while (checkAnalysis) { 620 checkAnalysis = false; 621 622 const AnalysisUsage::VectorType &RequiredSet = AnUsage->getRequiredSet(); 623 for (AnalysisUsage::VectorType::const_iterator I = RequiredSet.begin(), 624 E = RequiredSet.end(); I != E; ++I) { 625 626 Pass *AnalysisPass = findAnalysisPass(*I); 627 if (!AnalysisPass) { 628 const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(*I); 629 630 if (!PI) { 631 // Pass P is not in the global PassRegistry 632 dbgs() << "Pass '" << P->getPassName() << "' is not initialized." << "\n"; 633 dbgs() << "Verify if there is a pass dependency cycle." << "\n"; 634 dbgs() << "Required Passes:" << "\n"; 635 for (AnalysisUsage::VectorType::const_iterator I2 = RequiredSet.begin(), 636 E = RequiredSet.end(); I2 != E && I2 != I; ++I2) { 637 Pass *AnalysisPass2 = findAnalysisPass(*I2); 638 if (AnalysisPass2) { 639 dbgs() << "\t" << AnalysisPass2->getPassName() << "\n"; 640 } else { 641 dbgs() << "\t" << "Error: Required pass not found! Possible causes:" << "\n"; 642 dbgs() << "\t\t" << "- Pass misconfiguration (e.g.: missing macros)" << "\n"; 643 dbgs() << "\t\t" << "- Corruption of the global PassRegistry" << "\n"; 644 } 645 } 646 } 647 648 assert(PI && "Expected required passes to be initialized"); 649 AnalysisPass = PI->createPass(); 650 if (P->getPotentialPassManagerType () == 651 AnalysisPass->getPotentialPassManagerType()) 652 // Schedule analysis pass that is managed by the same pass manager. 653 schedulePass(AnalysisPass); 654 else if (P->getPotentialPassManagerType () > 655 AnalysisPass->getPotentialPassManagerType()) { 656 // Schedule analysis pass that is managed by a new manager. 657 schedulePass(AnalysisPass); 658 // Recheck analysis passes to ensure that required analyses that 659 // are already checked are still available. 660 checkAnalysis = true; 661 } else 662 // Do not schedule this analysis. Lower level analsyis 663 // passes are run on the fly. 664 delete AnalysisPass; 665 } 666 } 667 } 668 669 // Now all required passes are available. 670 if (ImmutablePass *IP = P->getAsImmutablePass()) { 671 // P is a immutable pass and it will be managed by this 672 // top level manager. Set up analysis resolver to connect them. 673 PMDataManager *DM = getAsPMDataManager(); 674 AnalysisResolver *AR = new AnalysisResolver(*DM); 675 P->setResolver(AR); 676 DM->initializeAnalysisImpl(P); 677 addImmutablePass(IP); 678 DM->recordAvailableAnalysis(IP); 679 return; 680 } 681 682 if (PI && !PI->isAnalysis() && ShouldPrintBeforePass(PI)) { 683 Pass *PP = P->createPrinterPass( 684 dbgs(), std::string("*** IR Dump Before ") + P->getPassName() + " ***"); 685 PP->assignPassManager(activeStack, getTopLevelPassManagerType()); 686 } 687 688 // Add the requested pass to the best available pass manager. 689 P->assignPassManager(activeStack, getTopLevelPassManagerType()); 690 691 if (PI && !PI->isAnalysis() && ShouldPrintAfterPass(PI)) { 692 Pass *PP = P->createPrinterPass( 693 dbgs(), std::string("*** IR Dump After ") + P->getPassName() + " ***"); 694 PP->assignPassManager(activeStack, getTopLevelPassManagerType()); 695 } 696 } 697 698 /// Find the pass that implements Analysis AID. Search immutable 699 /// passes and all pass managers. If desired pass is not found 700 /// then return NULL. 701 Pass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) { 702 703 // Check pass managers 704 for (SmallVectorImpl<PMDataManager *>::iterator I = PassManagers.begin(), 705 E = PassManagers.end(); I != E; ++I) 706 if (Pass *P = (*I)->findAnalysisPass(AID, false)) 707 return P; 708 709 // Check other pass managers 710 for (SmallVectorImpl<PMDataManager *>::iterator 711 I = IndirectPassManagers.begin(), 712 E = IndirectPassManagers.end(); I != E; ++I) 713 if (Pass *P = (*I)->findAnalysisPass(AID, false)) 714 return P; 715 716 // Check the immutable passes. Iterate in reverse order so that we find 717 // the most recently registered passes first. 718 for (SmallVectorImpl<ImmutablePass *>::reverse_iterator I = 719 ImmutablePasses.rbegin(), E = ImmutablePasses.rend(); I != E; ++I) { 720 AnalysisID PI = (*I)->getPassID(); 721 if (PI == AID) 722 return *I; 723 724 // If Pass not found then check the interfaces implemented by Immutable Pass 725 const PassInfo *PassInf = 726 PassRegistry::getPassRegistry()->getPassInfo(PI); 727 assert(PassInf && "Expected all immutable passes to be initialized"); 728 const std::vector<const PassInfo*> &ImmPI = 729 PassInf->getInterfacesImplemented(); 730 for (std::vector<const PassInfo*>::const_iterator II = ImmPI.begin(), 731 EE = ImmPI.end(); II != EE; ++II) { 732 if ((*II)->getTypeInfo() == AID) 733 return *I; 734 } 735 } 736 737 return nullptr; 738 } 739 740 // Print passes managed by this top level manager. 741 void PMTopLevelManager::dumpPasses() const { 742 743 if (PassDebugging < Structure) 744 return; 745 746 // Print out the immutable passes 747 for (unsigned i = 0, e = ImmutablePasses.size(); i != e; ++i) { 748 ImmutablePasses[i]->dumpPassStructure(0); 749 } 750 751 // Every class that derives from PMDataManager also derives from Pass 752 // (sometimes indirectly), but there's no inheritance relationship 753 // between PMDataManager and Pass, so we have to getAsPass to get 754 // from a PMDataManager* to a Pass*. 755 for (SmallVectorImpl<PMDataManager *>::const_iterator I = 756 PassManagers.begin(), E = PassManagers.end(); I != E; ++I) 757 (*I)->getAsPass()->dumpPassStructure(1); 758 } 759 760 void PMTopLevelManager::dumpArguments() const { 761 762 if (PassDebugging < Arguments) 763 return; 764 765 dbgs() << "Pass Arguments: "; 766 for (SmallVectorImpl<ImmutablePass *>::const_iterator I = 767 ImmutablePasses.begin(), E = ImmutablePasses.end(); I != E; ++I) 768 if (const PassInfo *PI = 769 PassRegistry::getPassRegistry()->getPassInfo((*I)->getPassID())) { 770 assert(PI && "Expected all immutable passes to be initialized"); 771 if (!PI->isAnalysisGroup()) 772 dbgs() << " -" << PI->getPassArgument(); 773 } 774 for (SmallVectorImpl<PMDataManager *>::const_iterator I = 775 PassManagers.begin(), E = PassManagers.end(); I != E; ++I) 776 (*I)->dumpPassArguments(); 777 dbgs() << "\n"; 778 } 779 780 void PMTopLevelManager::initializeAllAnalysisInfo() { 781 for (SmallVectorImpl<PMDataManager *>::iterator I = PassManagers.begin(), 782 E = PassManagers.end(); I != E; ++I) 783 (*I)->initializeAnalysisInfo(); 784 785 // Initailize other pass managers 786 for (SmallVectorImpl<PMDataManager *>::iterator 787 I = IndirectPassManagers.begin(), E = IndirectPassManagers.end(); 788 I != E; ++I) 789 (*I)->initializeAnalysisInfo(); 790 791 for (DenseMap<Pass *, Pass *>::iterator DMI = LastUser.begin(), 792 DME = LastUser.end(); DMI != DME; ++DMI) { 793 DenseMap<Pass *, SmallPtrSet<Pass *, 8> >::iterator InvDMI = 794 InversedLastUser.find(DMI->second); 795 if (InvDMI != InversedLastUser.end()) { 796 SmallPtrSet<Pass *, 8> &L = InvDMI->second; 797 L.insert(DMI->first); 798 } else { 799 SmallPtrSet<Pass *, 8> L; L.insert(DMI->first); 800 InversedLastUser[DMI->second] = L; 801 } 802 } 803 } 804 805 /// Destructor 806 PMTopLevelManager::~PMTopLevelManager() { 807 for (SmallVectorImpl<PMDataManager *>::iterator I = PassManagers.begin(), 808 E = PassManagers.end(); I != E; ++I) 809 delete *I; 810 811 for (SmallVectorImpl<ImmutablePass *>::iterator 812 I = ImmutablePasses.begin(), E = ImmutablePasses.end(); I != E; ++I) 813 delete *I; 814 815 for (DenseMap<Pass *, AnalysisUsage *>::iterator DMI = AnUsageMap.begin(), 816 DME = AnUsageMap.end(); DMI != DME; ++DMI) 817 delete DMI->second; 818 } 819 820 //===----------------------------------------------------------------------===// 821 // PMDataManager implementation 822 823 /// Augement AvailableAnalysis by adding analysis made available by pass P. 824 void PMDataManager::recordAvailableAnalysis(Pass *P) { 825 AnalysisID PI = P->getPassID(); 826 827 AvailableAnalysis[PI] = P; 828 829 assert(!AvailableAnalysis.empty()); 830 831 // This pass is the current implementation of all of the interfaces it 832 // implements as well. 833 const PassInfo *PInf = PassRegistry::getPassRegistry()->getPassInfo(PI); 834 if (!PInf) return; 835 const std::vector<const PassInfo*> &II = PInf->getInterfacesImplemented(); 836 for (unsigned i = 0, e = II.size(); i != e; ++i) 837 AvailableAnalysis[II[i]->getTypeInfo()] = P; 838 } 839 840 // Return true if P preserves high level analysis used by other 841 // passes managed by this manager 842 bool PMDataManager::preserveHigherLevelAnalysis(Pass *P) { 843 AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P); 844 if (AnUsage->getPreservesAll()) 845 return true; 846 847 const AnalysisUsage::VectorType &PreservedSet = AnUsage->getPreservedSet(); 848 for (SmallVectorImpl<Pass *>::iterator I = HigherLevelAnalysis.begin(), 849 E = HigherLevelAnalysis.end(); I != E; ++I) { 850 Pass *P1 = *I; 851 if (P1->getAsImmutablePass() == nullptr && 852 std::find(PreservedSet.begin(), PreservedSet.end(), 853 P1->getPassID()) == 854 PreservedSet.end()) 855 return false; 856 } 857 858 return true; 859 } 860 861 /// verifyPreservedAnalysis -- Verify analysis preserved by pass P. 862 void PMDataManager::verifyPreservedAnalysis(Pass *P) { 863 // Don't do this unless assertions are enabled. 864 #ifdef NDEBUG 865 return; 866 #endif 867 AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P); 868 const AnalysisUsage::VectorType &PreservedSet = AnUsage->getPreservedSet(); 869 870 // Verify preserved analysis 871 for (AnalysisUsage::VectorType::const_iterator I = PreservedSet.begin(), 872 E = PreservedSet.end(); I != E; ++I) { 873 AnalysisID AID = *I; 874 if (Pass *AP = findAnalysisPass(AID, true)) { 875 TimeRegion PassTimer(getPassTimer(AP)); 876 AP->verifyAnalysis(); 877 } 878 } 879 } 880 881 /// Remove Analysis not preserved by Pass P 882 void PMDataManager::removeNotPreservedAnalysis(Pass *P) { 883 AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P); 884 if (AnUsage->getPreservesAll()) 885 return; 886 887 const AnalysisUsage::VectorType &PreservedSet = AnUsage->getPreservedSet(); 888 for (DenseMap<AnalysisID, Pass*>::iterator I = AvailableAnalysis.begin(), 889 E = AvailableAnalysis.end(); I != E; ) { 890 DenseMap<AnalysisID, Pass*>::iterator Info = I++; 891 if (Info->second->getAsImmutablePass() == nullptr && 892 std::find(PreservedSet.begin(), PreservedSet.end(), Info->first) == 893 PreservedSet.end()) { 894 // Remove this analysis 895 if (PassDebugging >= Details) { 896 Pass *S = Info->second; 897 dbgs() << " -- '" << P->getPassName() << "' is not preserving '"; 898 dbgs() << S->getPassName() << "'\n"; 899 } 900 AvailableAnalysis.erase(Info); 901 } 902 } 903 904 // Check inherited analysis also. If P is not preserving analysis 905 // provided by parent manager then remove it here. 906 for (unsigned Index = 0; Index < PMT_Last; ++Index) { 907 908 if (!InheritedAnalysis[Index]) 909 continue; 910 911 for (DenseMap<AnalysisID, Pass*>::iterator 912 I = InheritedAnalysis[Index]->begin(), 913 E = InheritedAnalysis[Index]->end(); I != E; ) { 914 DenseMap<AnalysisID, Pass *>::iterator Info = I++; 915 if (Info->second->getAsImmutablePass() == nullptr && 916 std::find(PreservedSet.begin(), PreservedSet.end(), Info->first) == 917 PreservedSet.end()) { 918 // Remove this analysis 919 if (PassDebugging >= Details) { 920 Pass *S = Info->second; 921 dbgs() << " -- '" << P->getPassName() << "' is not preserving '"; 922 dbgs() << S->getPassName() << "'\n"; 923 } 924 InheritedAnalysis[Index]->erase(Info); 925 } 926 } 927 } 928 } 929 930 /// Remove analysis passes that are not used any longer 931 void PMDataManager::removeDeadPasses(Pass *P, StringRef Msg, 932 enum PassDebuggingString DBG_STR) { 933 934 SmallVector<Pass *, 12> DeadPasses; 935 936 // If this is a on the fly manager then it does not have TPM. 937 if (!TPM) 938 return; 939 940 TPM->collectLastUses(DeadPasses, P); 941 942 if (PassDebugging >= Details && !DeadPasses.empty()) { 943 dbgs() << " -*- '" << P->getPassName(); 944 dbgs() << "' is the last user of following pass instances."; 945 dbgs() << " Free these instances\n"; 946 } 947 948 for (SmallVectorImpl<Pass *>::iterator I = DeadPasses.begin(), 949 E = DeadPasses.end(); I != E; ++I) 950 freePass(*I, Msg, DBG_STR); 951 } 952 953 void PMDataManager::freePass(Pass *P, StringRef Msg, 954 enum PassDebuggingString DBG_STR) { 955 dumpPassInfo(P, FREEING_MSG, DBG_STR, Msg); 956 957 { 958 // If the pass crashes releasing memory, remember this. 959 PassManagerPrettyStackEntry X(P); 960 TimeRegion PassTimer(getPassTimer(P)); 961 962 P->releaseMemory(); 963 } 964 965 AnalysisID PI = P->getPassID(); 966 if (const PassInfo *PInf = PassRegistry::getPassRegistry()->getPassInfo(PI)) { 967 // Remove the pass itself (if it is not already removed). 968 AvailableAnalysis.erase(PI); 969 970 // Remove all interfaces this pass implements, for which it is also 971 // listed as the available implementation. 972 const std::vector<const PassInfo*> &II = PInf->getInterfacesImplemented(); 973 for (unsigned i = 0, e = II.size(); i != e; ++i) { 974 DenseMap<AnalysisID, Pass*>::iterator Pos = 975 AvailableAnalysis.find(II[i]->getTypeInfo()); 976 if (Pos != AvailableAnalysis.end() && Pos->second == P) 977 AvailableAnalysis.erase(Pos); 978 } 979 } 980 } 981 982 /// Add pass P into the PassVector. Update 983 /// AvailableAnalysis appropriately if ProcessAnalysis is true. 984 void PMDataManager::add(Pass *P, bool ProcessAnalysis) { 985 // This manager is going to manage pass P. Set up analysis resolver 986 // to connect them. 987 AnalysisResolver *AR = new AnalysisResolver(*this); 988 P->setResolver(AR); 989 990 // If a FunctionPass F is the last user of ModulePass info M 991 // then the F's manager, not F, records itself as a last user of M. 992 SmallVector<Pass *, 12> TransferLastUses; 993 994 if (!ProcessAnalysis) { 995 // Add pass 996 PassVector.push_back(P); 997 return; 998 } 999 1000 // At the moment, this pass is the last user of all required passes. 1001 SmallVector<Pass *, 12> LastUses; 1002 SmallVector<Pass *, 8> RequiredPasses; 1003 SmallVector<AnalysisID, 8> ReqAnalysisNotAvailable; 1004 1005 unsigned PDepth = this->getDepth(); 1006 1007 collectRequiredAnalysis(RequiredPasses, 1008 ReqAnalysisNotAvailable, P); 1009 for (SmallVectorImpl<Pass *>::iterator I = RequiredPasses.begin(), 1010 E = RequiredPasses.end(); I != E; ++I) { 1011 Pass *PRequired = *I; 1012 unsigned RDepth = 0; 1013 1014 assert(PRequired->getResolver() && "Analysis Resolver is not set"); 1015 PMDataManager &DM = PRequired->getResolver()->getPMDataManager(); 1016 RDepth = DM.getDepth(); 1017 1018 if (PDepth == RDepth) 1019 LastUses.push_back(PRequired); 1020 else if (PDepth > RDepth) { 1021 // Let the parent claim responsibility of last use 1022 TransferLastUses.push_back(PRequired); 1023 // Keep track of higher level analysis used by this manager. 1024 HigherLevelAnalysis.push_back(PRequired); 1025 } else 1026 llvm_unreachable("Unable to accommodate Required Pass"); 1027 } 1028 1029 // Set P as P's last user until someone starts using P. 1030 // However, if P is a Pass Manager then it does not need 1031 // to record its last user. 1032 if (!P->getAsPMDataManager()) 1033 LastUses.push_back(P); 1034 TPM->setLastUser(LastUses, P); 1035 1036 if (!TransferLastUses.empty()) { 1037 Pass *My_PM = getAsPass(); 1038 TPM->setLastUser(TransferLastUses, My_PM); 1039 TransferLastUses.clear(); 1040 } 1041 1042 // Now, take care of required analyses that are not available. 1043 for (SmallVectorImpl<AnalysisID>::iterator 1044 I = ReqAnalysisNotAvailable.begin(), 1045 E = ReqAnalysisNotAvailable.end() ;I != E; ++I) { 1046 const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(*I); 1047 Pass *AnalysisPass = PI->createPass(); 1048 this->addLowerLevelRequiredPass(P, AnalysisPass); 1049 } 1050 1051 // Take a note of analysis required and made available by this pass. 1052 // Remove the analysis not preserved by this pass 1053 removeNotPreservedAnalysis(P); 1054 recordAvailableAnalysis(P); 1055 1056 // Add pass 1057 PassVector.push_back(P); 1058 } 1059 1060 1061 /// Populate RP with analysis pass that are required by 1062 /// pass P and are available. Populate RP_NotAvail with analysis 1063 /// pass that are required by pass P but are not available. 1064 void PMDataManager::collectRequiredAnalysis(SmallVectorImpl<Pass *> &RP, 1065 SmallVectorImpl<AnalysisID> &RP_NotAvail, 1066 Pass *P) { 1067 AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P); 1068 const AnalysisUsage::VectorType &RequiredSet = AnUsage->getRequiredSet(); 1069 for (AnalysisUsage::VectorType::const_iterator 1070 I = RequiredSet.begin(), E = RequiredSet.end(); I != E; ++I) { 1071 if (Pass *AnalysisPass = findAnalysisPass(*I, true)) 1072 RP.push_back(AnalysisPass); 1073 else 1074 RP_NotAvail.push_back(*I); 1075 } 1076 1077 const AnalysisUsage::VectorType &IDs = AnUsage->getRequiredTransitiveSet(); 1078 for (AnalysisUsage::VectorType::const_iterator I = IDs.begin(), 1079 E = IDs.end(); I != E; ++I) { 1080 if (Pass *AnalysisPass = findAnalysisPass(*I, true)) 1081 RP.push_back(AnalysisPass); 1082 else 1083 RP_NotAvail.push_back(*I); 1084 } 1085 } 1086 1087 // All Required analyses should be available to the pass as it runs! Here 1088 // we fill in the AnalysisImpls member of the pass so that it can 1089 // successfully use the getAnalysis() method to retrieve the 1090 // implementations it needs. 1091 // 1092 void PMDataManager::initializeAnalysisImpl(Pass *P) { 1093 AnalysisUsage *AnUsage = TPM->findAnalysisUsage(P); 1094 1095 for (AnalysisUsage::VectorType::const_iterator 1096 I = AnUsage->getRequiredSet().begin(), 1097 E = AnUsage->getRequiredSet().end(); I != E; ++I) { 1098 Pass *Impl = findAnalysisPass(*I, true); 1099 if (!Impl) 1100 // This may be analysis pass that is initialized on the fly. 1101 // If that is not the case then it will raise an assert when it is used. 1102 continue; 1103 AnalysisResolver *AR = P->getResolver(); 1104 assert(AR && "Analysis Resolver is not set"); 1105 AR->addAnalysisImplsPair(*I, Impl); 1106 } 1107 } 1108 1109 /// Find the pass that implements Analysis AID. If desired pass is not found 1110 /// then return NULL. 1111 Pass *PMDataManager::findAnalysisPass(AnalysisID AID, bool SearchParent) { 1112 1113 // Check if AvailableAnalysis map has one entry. 1114 DenseMap<AnalysisID, Pass*>::const_iterator I = AvailableAnalysis.find(AID); 1115 1116 if (I != AvailableAnalysis.end()) 1117 return I->second; 1118 1119 // Search Parents through TopLevelManager 1120 if (SearchParent) 1121 return TPM->findAnalysisPass(AID); 1122 1123 return nullptr; 1124 } 1125 1126 // Print list of passes that are last used by P. 1127 void PMDataManager::dumpLastUses(Pass *P, unsigned Offset) const{ 1128 1129 SmallVector<Pass *, 12> LUses; 1130 1131 // If this is a on the fly manager then it does not have TPM. 1132 if (!TPM) 1133 return; 1134 1135 TPM->collectLastUses(LUses, P); 1136 1137 for (SmallVectorImpl<Pass *>::iterator I = LUses.begin(), 1138 E = LUses.end(); I != E; ++I) { 1139 dbgs() << "--" << std::string(Offset*2, ' '); 1140 (*I)->dumpPassStructure(0); 1141 } 1142 } 1143 1144 void PMDataManager::dumpPassArguments() const { 1145 for (SmallVectorImpl<Pass *>::const_iterator I = PassVector.begin(), 1146 E = PassVector.end(); I != E; ++I) { 1147 if (PMDataManager *PMD = (*I)->getAsPMDataManager()) 1148 PMD->dumpPassArguments(); 1149 else 1150 if (const PassInfo *PI = 1151 PassRegistry::getPassRegistry()->getPassInfo((*I)->getPassID())) 1152 if (!PI->isAnalysisGroup()) 1153 dbgs() << " -" << PI->getPassArgument(); 1154 } 1155 } 1156 1157 void PMDataManager::dumpPassInfo(Pass *P, enum PassDebuggingString S1, 1158 enum PassDebuggingString S2, 1159 StringRef Msg) { 1160 if (PassDebugging < Executions) 1161 return; 1162 dbgs() << "[" << sys::TimeValue::now().str() << "] " << (void *)this 1163 << std::string(getDepth() * 2 + 1, ' '); 1164 switch (S1) { 1165 case EXECUTION_MSG: 1166 dbgs() << "Executing Pass '" << P->getPassName(); 1167 break; 1168 case MODIFICATION_MSG: 1169 dbgs() << "Made Modification '" << P->getPassName(); 1170 break; 1171 case FREEING_MSG: 1172 dbgs() << " Freeing Pass '" << P->getPassName(); 1173 break; 1174 default: 1175 break; 1176 } 1177 switch (S2) { 1178 case ON_BASICBLOCK_MSG: 1179 dbgs() << "' on BasicBlock '" << Msg << "'...\n"; 1180 break; 1181 case ON_FUNCTION_MSG: 1182 dbgs() << "' on Function '" << Msg << "'...\n"; 1183 break; 1184 case ON_MODULE_MSG: 1185 dbgs() << "' on Module '" << Msg << "'...\n"; 1186 break; 1187 case ON_REGION_MSG: 1188 dbgs() << "' on Region '" << Msg << "'...\n"; 1189 break; 1190 case ON_LOOP_MSG: 1191 dbgs() << "' on Loop '" << Msg << "'...\n"; 1192 break; 1193 case ON_CG_MSG: 1194 dbgs() << "' on Call Graph Nodes '" << Msg << "'...\n"; 1195 break; 1196 default: 1197 break; 1198 } 1199 } 1200 1201 void PMDataManager::dumpRequiredSet(const Pass *P) const { 1202 if (PassDebugging < Details) 1203 return; 1204 1205 AnalysisUsage analysisUsage; 1206 P->getAnalysisUsage(analysisUsage); 1207 dumpAnalysisUsage("Required", P, analysisUsage.getRequiredSet()); 1208 } 1209 1210 void PMDataManager::dumpPreservedSet(const Pass *P) const { 1211 if (PassDebugging < Details) 1212 return; 1213 1214 AnalysisUsage analysisUsage; 1215 P->getAnalysisUsage(analysisUsage); 1216 dumpAnalysisUsage("Preserved", P, analysisUsage.getPreservedSet()); 1217 } 1218 1219 void PMDataManager::dumpAnalysisUsage(StringRef Msg, const Pass *P, 1220 const AnalysisUsage::VectorType &Set) const { 1221 assert(PassDebugging >= Details); 1222 if (Set.empty()) 1223 return; 1224 dbgs() << (const void*)P << std::string(getDepth()*2+3, ' ') << Msg << " Analyses:"; 1225 for (unsigned i = 0; i != Set.size(); ++i) { 1226 if (i) dbgs() << ','; 1227 const PassInfo *PInf = PassRegistry::getPassRegistry()->getPassInfo(Set[i]); 1228 if (!PInf) { 1229 // Some preserved passes, such as AliasAnalysis, may not be initialized by 1230 // all drivers. 1231 dbgs() << " Uninitialized Pass"; 1232 continue; 1233 } 1234 dbgs() << ' ' << PInf->getPassName(); 1235 } 1236 dbgs() << '\n'; 1237 } 1238 1239 /// Add RequiredPass into list of lower level passes required by pass P. 1240 /// RequiredPass is run on the fly by Pass Manager when P requests it 1241 /// through getAnalysis interface. 1242 /// This should be handled by specific pass manager. 1243 void PMDataManager::addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) { 1244 if (TPM) { 1245 TPM->dumpArguments(); 1246 TPM->dumpPasses(); 1247 } 1248 1249 // Module Level pass may required Function Level analysis info 1250 // (e.g. dominator info). Pass manager uses on the fly function pass manager 1251 // to provide this on demand. In that case, in Pass manager terminology, 1252 // module level pass is requiring lower level analysis info managed by 1253 // lower level pass manager. 1254 1255 // When Pass manager is not able to order required analysis info, Pass manager 1256 // checks whether any lower level manager will be able to provide this 1257 // analysis info on demand or not. 1258 #ifndef NDEBUG 1259 dbgs() << "Unable to schedule '" << RequiredPass->getPassName(); 1260 dbgs() << "' required by '" << P->getPassName() << "'\n"; 1261 #endif 1262 llvm_unreachable("Unable to schedule pass"); 1263 } 1264 1265 Pass *PMDataManager::getOnTheFlyPass(Pass *P, AnalysisID PI, Function &F) { 1266 llvm_unreachable("Unable to find on the fly pass"); 1267 } 1268 1269 // Destructor 1270 PMDataManager::~PMDataManager() { 1271 for (SmallVectorImpl<Pass *>::iterator I = PassVector.begin(), 1272 E = PassVector.end(); I != E; ++I) 1273 delete *I; 1274 } 1275 1276 //===----------------------------------------------------------------------===// 1277 // NOTE: Is this the right place to define this method ? 1278 // getAnalysisIfAvailable - Return analysis result or null if it doesn't exist. 1279 Pass *AnalysisResolver::getAnalysisIfAvailable(AnalysisID ID, bool dir) const { 1280 return PM.findAnalysisPass(ID, dir); 1281 } 1282 1283 Pass *AnalysisResolver::findImplPass(Pass *P, AnalysisID AnalysisPI, 1284 Function &F) { 1285 return PM.getOnTheFlyPass(P, AnalysisPI, F); 1286 } 1287 1288 //===----------------------------------------------------------------------===// 1289 // BBPassManager implementation 1290 1291 /// Execute all of the passes scheduled for execution by invoking 1292 /// runOnBasicBlock method. Keep track of whether any of the passes modifies 1293 /// the function, and if so, return true. 1294 bool BBPassManager::runOnFunction(Function &F) { 1295 if (F.isDeclaration()) 1296 return false; 1297 1298 bool Changed = doInitialization(F); 1299 1300 for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) 1301 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 1302 BasicBlockPass *BP = getContainedPass(Index); 1303 bool LocalChanged = false; 1304 1305 dumpPassInfo(BP, EXECUTION_MSG, ON_BASICBLOCK_MSG, I->getName()); 1306 dumpRequiredSet(BP); 1307 1308 initializeAnalysisImpl(BP); 1309 1310 { 1311 // If the pass crashes, remember this. 1312 PassManagerPrettyStackEntry X(BP, *I); 1313 TimeRegion PassTimer(getPassTimer(BP)); 1314 1315 LocalChanged |= BP->runOnBasicBlock(*I); 1316 } 1317 1318 Changed |= LocalChanged; 1319 if (LocalChanged) 1320 dumpPassInfo(BP, MODIFICATION_MSG, ON_BASICBLOCK_MSG, 1321 I->getName()); 1322 dumpPreservedSet(BP); 1323 1324 verifyPreservedAnalysis(BP); 1325 removeNotPreservedAnalysis(BP); 1326 recordAvailableAnalysis(BP); 1327 removeDeadPasses(BP, I->getName(), ON_BASICBLOCK_MSG); 1328 } 1329 1330 return doFinalization(F) || Changed; 1331 } 1332 1333 // Implement doInitialization and doFinalization 1334 bool BBPassManager::doInitialization(Module &M) { 1335 bool Changed = false; 1336 1337 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) 1338 Changed |= getContainedPass(Index)->doInitialization(M); 1339 1340 return Changed; 1341 } 1342 1343 bool BBPassManager::doFinalization(Module &M) { 1344 bool Changed = false; 1345 1346 for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index) 1347 Changed |= getContainedPass(Index)->doFinalization(M); 1348 1349 return Changed; 1350 } 1351 1352 bool BBPassManager::doInitialization(Function &F) { 1353 bool Changed = false; 1354 1355 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 1356 BasicBlockPass *BP = getContainedPass(Index); 1357 Changed |= BP->doInitialization(F); 1358 } 1359 1360 return Changed; 1361 } 1362 1363 bool BBPassManager::doFinalization(Function &F) { 1364 bool Changed = false; 1365 1366 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 1367 BasicBlockPass *BP = getContainedPass(Index); 1368 Changed |= BP->doFinalization(F); 1369 } 1370 1371 return Changed; 1372 } 1373 1374 1375 //===----------------------------------------------------------------------===// 1376 // FunctionPassManager implementation 1377 1378 /// Create new Function pass manager 1379 FunctionPassManager::FunctionPassManager(Module *m) : M(m) { 1380 FPM = new FunctionPassManagerImpl(); 1381 // FPM is the top level manager. 1382 FPM->setTopLevelManager(FPM); 1383 1384 AnalysisResolver *AR = new AnalysisResolver(*FPM); 1385 FPM->setResolver(AR); 1386 } 1387 1388 FunctionPassManager::~FunctionPassManager() { 1389 delete FPM; 1390 } 1391 1392 /// add - Add a pass to the queue of passes to run. This passes 1393 /// ownership of the Pass to the PassManager. When the 1394 /// PassManager_X is destroyed, the pass will be destroyed as well, so 1395 /// there is no need to delete the pass. (TODO delete passes.) 1396 /// This implies that all passes MUST be allocated with 'new'. 1397 void FunctionPassManager::add(Pass *P) { 1398 FPM->add(P); 1399 } 1400 1401 /// run - Execute all of the passes scheduled for execution. Keep 1402 /// track of whether any of the passes modifies the function, and if 1403 /// so, return true. 1404 /// 1405 bool FunctionPassManager::run(Function &F) { 1406 if (F.isMaterializable()) { 1407 if (std::error_code EC = F.materialize()) 1408 report_fatal_error("Error reading bitcode file: " + EC.message()); 1409 } 1410 return FPM->run(F); 1411 } 1412 1413 1414 /// doInitialization - Run all of the initializers for the function passes. 1415 /// 1416 bool FunctionPassManager::doInitialization() { 1417 return FPM->doInitialization(*M); 1418 } 1419 1420 /// doFinalization - Run all of the finalizers for the function passes. 1421 /// 1422 bool FunctionPassManager::doFinalization() { 1423 return FPM->doFinalization(*M); 1424 } 1425 1426 //===----------------------------------------------------------------------===// 1427 // FunctionPassManagerImpl implementation 1428 // 1429 bool FunctionPassManagerImpl::doInitialization(Module &M) { 1430 bool Changed = false; 1431 1432 dumpArguments(); 1433 dumpPasses(); 1434 1435 SmallVectorImpl<ImmutablePass *>& IPV = getImmutablePasses(); 1436 for (SmallVectorImpl<ImmutablePass *>::const_iterator I = IPV.begin(), 1437 E = IPV.end(); I != E; ++I) { 1438 Changed |= (*I)->doInitialization(M); 1439 } 1440 1441 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) 1442 Changed |= getContainedManager(Index)->doInitialization(M); 1443 1444 return Changed; 1445 } 1446 1447 bool FunctionPassManagerImpl::doFinalization(Module &M) { 1448 bool Changed = false; 1449 1450 for (int Index = getNumContainedManagers() - 1; Index >= 0; --Index) 1451 Changed |= getContainedManager(Index)->doFinalization(M); 1452 1453 SmallVectorImpl<ImmutablePass *>& IPV = getImmutablePasses(); 1454 for (SmallVectorImpl<ImmutablePass *>::const_iterator I = IPV.begin(), 1455 E = IPV.end(); I != E; ++I) { 1456 Changed |= (*I)->doFinalization(M); 1457 } 1458 1459 return Changed; 1460 } 1461 1462 /// cleanup - After running all passes, clean up pass manager cache. 1463 void FPPassManager::cleanup() { 1464 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 1465 FunctionPass *FP = getContainedPass(Index); 1466 AnalysisResolver *AR = FP->getResolver(); 1467 assert(AR && "Analysis Resolver is not set"); 1468 AR->clearAnalysisImpls(); 1469 } 1470 } 1471 1472 void FunctionPassManagerImpl::releaseMemoryOnTheFly() { 1473 if (!wasRun) 1474 return; 1475 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) { 1476 FPPassManager *FPPM = getContainedManager(Index); 1477 for (unsigned Index = 0; Index < FPPM->getNumContainedPasses(); ++Index) { 1478 FPPM->getContainedPass(Index)->releaseMemory(); 1479 } 1480 } 1481 wasRun = false; 1482 } 1483 1484 // Execute all the passes managed by this top level manager. 1485 // Return true if any function is modified by a pass. 1486 bool FunctionPassManagerImpl::run(Function &F) { 1487 bool Changed = false; 1488 TimingInfo::createTheTimeInfo(); 1489 1490 initializeAllAnalysisInfo(); 1491 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) { 1492 Changed |= getContainedManager(Index)->runOnFunction(F); 1493 F.getContext().yield(); 1494 } 1495 1496 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) 1497 getContainedManager(Index)->cleanup(); 1498 1499 wasRun = true; 1500 return Changed; 1501 } 1502 1503 //===----------------------------------------------------------------------===// 1504 // FPPassManager implementation 1505 1506 char FPPassManager::ID = 0; 1507 /// Print passes managed by this manager 1508 void FPPassManager::dumpPassStructure(unsigned Offset) { 1509 dbgs().indent(Offset*2) << "FunctionPass Manager\n"; 1510 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 1511 FunctionPass *FP = getContainedPass(Index); 1512 FP->dumpPassStructure(Offset + 1); 1513 dumpLastUses(FP, Offset+1); 1514 } 1515 } 1516 1517 1518 /// Execute all of the passes scheduled for execution by invoking 1519 /// runOnFunction method. Keep track of whether any of the passes modifies 1520 /// the function, and if so, return true. 1521 bool FPPassManager::runOnFunction(Function &F) { 1522 if (F.isDeclaration()) 1523 return false; 1524 1525 bool Changed = false; 1526 1527 // Collect inherited analysis from Module level pass manager. 1528 populateInheritedAnalysis(TPM->activeStack); 1529 1530 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 1531 FunctionPass *FP = getContainedPass(Index); 1532 bool LocalChanged = false; 1533 1534 dumpPassInfo(FP, EXECUTION_MSG, ON_FUNCTION_MSG, F.getName()); 1535 dumpRequiredSet(FP); 1536 1537 initializeAnalysisImpl(FP); 1538 1539 { 1540 PassManagerPrettyStackEntry X(FP, F); 1541 TimeRegion PassTimer(getPassTimer(FP)); 1542 1543 LocalChanged |= FP->runOnFunction(F); 1544 } 1545 1546 Changed |= LocalChanged; 1547 if (LocalChanged) 1548 dumpPassInfo(FP, MODIFICATION_MSG, ON_FUNCTION_MSG, F.getName()); 1549 dumpPreservedSet(FP); 1550 1551 verifyPreservedAnalysis(FP); 1552 removeNotPreservedAnalysis(FP); 1553 recordAvailableAnalysis(FP); 1554 removeDeadPasses(FP, F.getName(), ON_FUNCTION_MSG); 1555 } 1556 return Changed; 1557 } 1558 1559 bool FPPassManager::runOnModule(Module &M) { 1560 bool Changed = false; 1561 1562 for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) 1563 Changed |= runOnFunction(*I); 1564 1565 return Changed; 1566 } 1567 1568 bool FPPassManager::doInitialization(Module &M) { 1569 bool Changed = false; 1570 1571 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) 1572 Changed |= getContainedPass(Index)->doInitialization(M); 1573 1574 return Changed; 1575 } 1576 1577 bool FPPassManager::doFinalization(Module &M) { 1578 bool Changed = false; 1579 1580 for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index) 1581 Changed |= getContainedPass(Index)->doFinalization(M); 1582 1583 return Changed; 1584 } 1585 1586 //===----------------------------------------------------------------------===// 1587 // MPPassManager implementation 1588 1589 /// Execute all of the passes scheduled for execution by invoking 1590 /// runOnModule method. Keep track of whether any of the passes modifies 1591 /// the module, and if so, return true. 1592 bool 1593 MPPassManager::runOnModule(Module &M) { 1594 bool Changed = false; 1595 1596 // Initialize on-the-fly passes 1597 for (std::map<Pass *, FunctionPassManagerImpl *>::iterator 1598 I = OnTheFlyManagers.begin(), E = OnTheFlyManagers.end(); 1599 I != E; ++I) { 1600 FunctionPassManagerImpl *FPP = I->second; 1601 Changed |= FPP->doInitialization(M); 1602 } 1603 1604 // Initialize module passes 1605 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) 1606 Changed |= getContainedPass(Index)->doInitialization(M); 1607 1608 for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 1609 ModulePass *MP = getContainedPass(Index); 1610 bool LocalChanged = false; 1611 1612 dumpPassInfo(MP, EXECUTION_MSG, ON_MODULE_MSG, M.getModuleIdentifier()); 1613 dumpRequiredSet(MP); 1614 1615 initializeAnalysisImpl(MP); 1616 1617 { 1618 PassManagerPrettyStackEntry X(MP, M); 1619 TimeRegion PassTimer(getPassTimer(MP)); 1620 1621 LocalChanged |= MP->runOnModule(M); 1622 } 1623 1624 Changed |= LocalChanged; 1625 if (LocalChanged) 1626 dumpPassInfo(MP, MODIFICATION_MSG, ON_MODULE_MSG, 1627 M.getModuleIdentifier()); 1628 dumpPreservedSet(MP); 1629 1630 verifyPreservedAnalysis(MP); 1631 removeNotPreservedAnalysis(MP); 1632 recordAvailableAnalysis(MP); 1633 removeDeadPasses(MP, M.getModuleIdentifier(), ON_MODULE_MSG); 1634 } 1635 1636 // Finalize module passes 1637 for (int Index = getNumContainedPasses() - 1; Index >= 0; --Index) 1638 Changed |= getContainedPass(Index)->doFinalization(M); 1639 1640 // Finalize on-the-fly passes 1641 for (std::map<Pass *, FunctionPassManagerImpl *>::iterator 1642 I = OnTheFlyManagers.begin(), E = OnTheFlyManagers.end(); 1643 I != E; ++I) { 1644 FunctionPassManagerImpl *FPP = I->second; 1645 // We don't know when is the last time an on-the-fly pass is run, 1646 // so we need to releaseMemory / finalize here 1647 FPP->releaseMemoryOnTheFly(); 1648 Changed |= FPP->doFinalization(M); 1649 } 1650 1651 return Changed; 1652 } 1653 1654 /// Add RequiredPass into list of lower level passes required by pass P. 1655 /// RequiredPass is run on the fly by Pass Manager when P requests it 1656 /// through getAnalysis interface. 1657 void MPPassManager::addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) { 1658 assert(P->getPotentialPassManagerType() == PMT_ModulePassManager && 1659 "Unable to handle Pass that requires lower level Analysis pass"); 1660 assert((P->getPotentialPassManagerType() < 1661 RequiredPass->getPotentialPassManagerType()) && 1662 "Unable to handle Pass that requires lower level Analysis pass"); 1663 if (!RequiredPass) 1664 return; 1665 1666 FunctionPassManagerImpl *FPP = OnTheFlyManagers[P]; 1667 if (!FPP) { 1668 FPP = new FunctionPassManagerImpl(); 1669 // FPP is the top level manager. 1670 FPP->setTopLevelManager(FPP); 1671 1672 OnTheFlyManagers[P] = FPP; 1673 } 1674 const PassInfo * RequiredPassPI = 1675 PassRegistry::getPassRegistry()->getPassInfo(RequiredPass->getPassID()); 1676 1677 Pass *FoundPass = nullptr; 1678 if (RequiredPassPI && RequiredPassPI->isAnalysis()) { 1679 FoundPass = 1680 ((PMTopLevelManager*)FPP)->findAnalysisPass(RequiredPass->getPassID()); 1681 } 1682 if (!FoundPass) { 1683 FoundPass = RequiredPass; 1684 // This should be guaranteed to add RequiredPass to the passmanager given 1685 // that we checked for an available analysis above. 1686 FPP->add(RequiredPass); 1687 } 1688 // Register P as the last user of FoundPass or RequiredPass. 1689 SmallVector<Pass *, 1> LU; 1690 LU.push_back(FoundPass); 1691 FPP->setLastUser(LU, P); 1692 } 1693 1694 /// Return function pass corresponding to PassInfo PI, that is 1695 /// required by module pass MP. Instantiate analysis pass, by using 1696 /// its runOnFunction() for function F. 1697 Pass* MPPassManager::getOnTheFlyPass(Pass *MP, AnalysisID PI, Function &F){ 1698 FunctionPassManagerImpl *FPP = OnTheFlyManagers[MP]; 1699 assert(FPP && "Unable to find on the fly pass"); 1700 1701 FPP->releaseMemoryOnTheFly(); 1702 FPP->run(F); 1703 return ((PMTopLevelManager*)FPP)->findAnalysisPass(PI); 1704 } 1705 1706 1707 //===----------------------------------------------------------------------===// 1708 // PassManagerImpl implementation 1709 1710 // 1711 /// run - Execute all of the passes scheduled for execution. Keep track of 1712 /// whether any of the passes modifies the module, and if so, return true. 1713 bool PassManagerImpl::run(Module &M) { 1714 bool Changed = false; 1715 TimingInfo::createTheTimeInfo(); 1716 1717 dumpArguments(); 1718 dumpPasses(); 1719 1720 SmallVectorImpl<ImmutablePass *>& IPV = getImmutablePasses(); 1721 for (SmallVectorImpl<ImmutablePass *>::const_iterator I = IPV.begin(), 1722 E = IPV.end(); I != E; ++I) { 1723 Changed |= (*I)->doInitialization(M); 1724 } 1725 1726 initializeAllAnalysisInfo(); 1727 for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) { 1728 Changed |= getContainedManager(Index)->runOnModule(M); 1729 M.getContext().yield(); 1730 } 1731 1732 for (SmallVectorImpl<ImmutablePass *>::const_iterator I = IPV.begin(), 1733 E = IPV.end(); I != E; ++I) { 1734 Changed |= (*I)->doFinalization(M); 1735 } 1736 1737 return Changed; 1738 } 1739 1740 //===----------------------------------------------------------------------===// 1741 // PassManager implementation 1742 1743 /// Create new pass manager 1744 PassManager::PassManager() { 1745 PM = new PassManagerImpl(); 1746 // PM is the top level manager 1747 PM->setTopLevelManager(PM); 1748 } 1749 1750 PassManager::~PassManager() { 1751 delete PM; 1752 } 1753 1754 /// add - Add a pass to the queue of passes to run. This passes ownership of 1755 /// the Pass to the PassManager. When the PassManager is destroyed, the pass 1756 /// will be destroyed as well, so there is no need to delete the pass. This 1757 /// implies that all passes MUST be allocated with 'new'. 1758 void PassManager::add(Pass *P) { 1759 PM->add(P); 1760 } 1761 1762 /// run - Execute all of the passes scheduled for execution. Keep track of 1763 /// whether any of the passes modifies the module, and if so, return true. 1764 bool PassManager::run(Module &M) { 1765 return PM->run(M); 1766 } 1767 1768 //===----------------------------------------------------------------------===// 1769 // TimingInfo implementation 1770 1771 bool llvm::TimePassesIsEnabled = false; 1772 static cl::opt<bool,true> 1773 EnableTiming("time-passes", cl::location(TimePassesIsEnabled), 1774 cl::desc("Time each pass, printing elapsed time for each on exit")); 1775 1776 // createTheTimeInfo - This method either initializes the TheTimeInfo pointer to 1777 // a non-null value (if the -time-passes option is enabled) or it leaves it 1778 // null. It may be called multiple times. 1779 void TimingInfo::createTheTimeInfo() { 1780 if (!TimePassesIsEnabled || TheTimeInfo) return; 1781 1782 // Constructed the first time this is called, iff -time-passes is enabled. 1783 // This guarantees that the object will be constructed before static globals, 1784 // thus it will be destroyed before them. 1785 static ManagedStatic<TimingInfo> TTI; 1786 TheTimeInfo = &*TTI; 1787 } 1788 1789 /// If TimingInfo is enabled then start pass timer. 1790 Timer *llvm::getPassTimer(Pass *P) { 1791 if (TheTimeInfo) 1792 return TheTimeInfo->getPassTimer(P); 1793 return nullptr; 1794 } 1795 1796 //===----------------------------------------------------------------------===// 1797 // PMStack implementation 1798 // 1799 1800 // Pop Pass Manager from the stack and clear its analysis info. 1801 void PMStack::pop() { 1802 1803 PMDataManager *Top = this->top(); 1804 Top->initializeAnalysisInfo(); 1805 1806 S.pop_back(); 1807 } 1808 1809 // Push PM on the stack and set its top level manager. 1810 void PMStack::push(PMDataManager *PM) { 1811 assert(PM && "Unable to push. Pass Manager expected"); 1812 assert(PM->getDepth()==0 && "Pass Manager depth set too early"); 1813 1814 if (!this->empty()) { 1815 assert(PM->getPassManagerType() > this->top()->getPassManagerType() 1816 && "pushing bad pass manager to PMStack"); 1817 PMTopLevelManager *TPM = this->top()->getTopLevelManager(); 1818 1819 assert(TPM && "Unable to find top level manager"); 1820 TPM->addIndirectPassManager(PM); 1821 PM->setTopLevelManager(TPM); 1822 PM->setDepth(this->top()->getDepth()+1); 1823 } else { 1824 assert((PM->getPassManagerType() == PMT_ModulePassManager 1825 || PM->getPassManagerType() == PMT_FunctionPassManager) 1826 && "pushing bad pass manager to PMStack"); 1827 PM->setDepth(1); 1828 } 1829 1830 S.push_back(PM); 1831 } 1832 1833 // Dump content of the pass manager stack. 1834 void PMStack::dump() const { 1835 for (std::vector<PMDataManager *>::const_iterator I = S.begin(), 1836 E = S.end(); I != E; ++I) 1837 dbgs() << (*I)->getAsPass()->getPassName() << ' '; 1838 1839 if (!S.empty()) 1840 dbgs() << '\n'; 1841 } 1842 1843 /// Find appropriate Module Pass Manager in the PM Stack and 1844 /// add self into that manager. 1845 void ModulePass::assignPassManager(PMStack &PMS, 1846 PassManagerType PreferredType) { 1847 // Find Module Pass Manager 1848 while (!PMS.empty()) { 1849 PassManagerType TopPMType = PMS.top()->getPassManagerType(); 1850 if (TopPMType == PreferredType) 1851 break; // We found desired pass manager 1852 else if (TopPMType > PMT_ModulePassManager) 1853 PMS.pop(); // Pop children pass managers 1854 else 1855 break; 1856 } 1857 assert(!PMS.empty() && "Unable to find appropriate Pass Manager"); 1858 PMS.top()->add(this); 1859 } 1860 1861 /// Find appropriate Function Pass Manager or Call Graph Pass Manager 1862 /// in the PM Stack and add self into that manager. 1863 void FunctionPass::assignPassManager(PMStack &PMS, 1864 PassManagerType PreferredType) { 1865 1866 // Find Function Pass Manager 1867 while (!PMS.empty()) { 1868 if (PMS.top()->getPassManagerType() > PMT_FunctionPassManager) 1869 PMS.pop(); 1870 else 1871 break; 1872 } 1873 1874 // Create new Function Pass Manager if needed. 1875 FPPassManager *FPP; 1876 if (PMS.top()->getPassManagerType() == PMT_FunctionPassManager) { 1877 FPP = (FPPassManager *)PMS.top(); 1878 } else { 1879 assert(!PMS.empty() && "Unable to create Function Pass Manager"); 1880 PMDataManager *PMD = PMS.top(); 1881 1882 // [1] Create new Function Pass Manager 1883 FPP = new FPPassManager(); 1884 FPP->populateInheritedAnalysis(PMS); 1885 1886 // [2] Set up new manager's top level manager 1887 PMTopLevelManager *TPM = PMD->getTopLevelManager(); 1888 TPM->addIndirectPassManager(FPP); 1889 1890 // [3] Assign manager to manage this new manager. This may create 1891 // and push new managers into PMS 1892 FPP->assignPassManager(PMS, PMD->getPassManagerType()); 1893 1894 // [4] Push new manager into PMS 1895 PMS.push(FPP); 1896 } 1897 1898 // Assign FPP as the manager of this pass. 1899 FPP->add(this); 1900 } 1901 1902 /// Find appropriate Basic Pass Manager or Call Graph Pass Manager 1903 /// in the PM Stack and add self into that manager. 1904 void BasicBlockPass::assignPassManager(PMStack &PMS, 1905 PassManagerType PreferredType) { 1906 BBPassManager *BBP; 1907 1908 // Basic Pass Manager is a leaf pass manager. It does not handle 1909 // any other pass manager. 1910 if (!PMS.empty() && 1911 PMS.top()->getPassManagerType() == PMT_BasicBlockPassManager) { 1912 BBP = (BBPassManager *)PMS.top(); 1913 } else { 1914 // If leaf manager is not Basic Block Pass manager then create new 1915 // basic Block Pass manager. 1916 assert(!PMS.empty() && "Unable to create BasicBlock Pass Manager"); 1917 PMDataManager *PMD = PMS.top(); 1918 1919 // [1] Create new Basic Block Manager 1920 BBP = new BBPassManager(); 1921 1922 // [2] Set up new manager's top level manager 1923 // Basic Block Pass Manager does not live by itself 1924 PMTopLevelManager *TPM = PMD->getTopLevelManager(); 1925 TPM->addIndirectPassManager(BBP); 1926 1927 // [3] Assign manager to manage this new manager. This may create 1928 // and push new managers into PMS 1929 BBP->assignPassManager(PMS, PreferredType); 1930 1931 // [4] Push new manager into PMS 1932 PMS.push(BBP); 1933 } 1934 1935 // Assign BBP as the manager of this pass. 1936 BBP->add(this); 1937 } 1938 1939 PassManagerBase::~PassManagerBase() {} 1940