PassManager.cpp revision 3f5d2b58b84cb12a9520dd33921ca556d539eb4d
1//===- PassManager.cpp - LLVM Pass Infrastructure Implementation ----------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by Devang Patel and is distributed under 6// the University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements the LLVM Pass Manager infrastructure. 11// 12//===----------------------------------------------------------------------===// 13 14 15#include "llvm/PassManager.h" 16#include "llvm/Module.h" 17#include "llvm/ModuleProvider.h" 18#include "llvm/Support/Streams.h" 19#include <vector> 20#include <map> 21using namespace llvm; 22 23//===----------------------------------------------------------------------===// 24// Overview: 25// The Pass Manager Infrastructure manages passes. It's responsibilities are: 26// 27// o Manage optimization pass execution order 28// o Make required Analysis information available before pass P is run 29// o Release memory occupied by dead passes 30// o If Analysis information is dirtied by a pass then regenerate Analysis 31// information before it is consumed by another pass. 32// 33// Pass Manager Infrastructure uses multipe pass managers. They are PassManager, 34// FunctionPassManager, ModulePassManager, BasicBlockPassManager. This class 35// hierarcy uses multiple inheritance but pass managers do not derive from 36// another pass manager. 37// 38// PassManager and FunctionPassManager are two top level pass manager that 39// represents the external interface of this entire pass manager infrastucture. 40// 41// Important classes : 42// 43// [o] class PMTopLevelManager; 44// 45// Two top level managers, PassManager and FunctionPassManager, derive from 46// PMTopLevelManager. PMTopLevelManager manages information used by top level 47// managers such as last user info. 48// 49// [o] class PMDataManager; 50// 51// PMDataManager manages information, e.g. list of available analysis info, 52// used by a pass manager to manage execution order of passes. It also provides 53// a place to implement common pass manager APIs. All pass managers derive from 54// PMDataManager. 55// 56// [o] class BasicBlockPassManager : public FunctionPass, public PMDataManager; 57// 58// BasicBlockPassManager manages BasicBlockPasses. 59// 60// [o] class FunctionPassManager; 61// 62// This is a external interface used by JIT to manage FunctionPasses. This 63// interface relies on FunctionPassManagerImpl to do all the tasks. 64// 65// [o] class FunctionPassManagerImpl : public ModulePass, PMDataManager, 66// public PMTopLevelManager; 67// 68// FunctionPassManagerImpl is a top level manager. It manages FunctionPasses 69// and BasicBlockPassManagers. 70// 71// [o] class ModulePassManager : public Pass, public PMDataManager; 72// 73// ModulePassManager manages ModulePasses and FunctionPassManagerImpls. 74// 75// [o] class PassManager; 76// 77// This is a external interface used by various tools to manages passes. It 78// relies on PassManagerImpl to do all the tasks. 79// 80// [o] class PassManagerImpl : public Pass, public PMDataManager, 81// public PMDTopLevelManager 82// 83// PassManagerImpl is a top level pass manager responsible for managing 84// ModulePassManagers. 85//===----------------------------------------------------------------------===// 86 87namespace llvm { 88 89//===----------------------------------------------------------------------===// 90// PMTopLevelManager 91// 92/// PMTopLevelManager manages LastUser info and collects common APIs used by 93/// top level pass managers. 94class PMTopLevelManager { 95 96public: 97 98 inline std::vector<Pass *>::iterator passManagersBegin() { 99 return PassManagers.begin(); 100 } 101 102 inline std::vector<Pass *>::iterator passManagersEnd() { 103 return PassManagers.end(); 104 } 105 106 /// Schedule pass P for execution. Make sure that passes required by 107 /// P are run before P is run. Update analysis info maintained by 108 /// the manager. Remove dead passes. This is a recursive function. 109 void schedulePass(Pass *P, Pass *PM); 110 111 /// This is implemented by top level pass manager and used by 112 /// schedulePass() to add analysis info passes that are not available. 113 virtual void addTopLevelPass(Pass *P) = 0; 114 115 /// Set pass P as the last user of the given analysis passes. 116 void setLastUser(std::vector<Pass *> &AnalysisPasses, Pass *P); 117 118 /// Collect passes whose last user is P 119 void collectLastUses(std::vector<Pass *> &LastUses, Pass *P); 120 121 virtual ~PMTopLevelManager() { 122 PassManagers.clear(); 123 } 124 125private: 126 127 /// Collection of pass managers 128 std::vector<Pass *> PassManagers; 129 130 // Map to keep track of last user of the analysis pass. 131 // LastUser->second is the last user of Lastuser->first. 132 std::map<Pass *, Pass *> LastUser; 133}; 134 135/// Set pass P as the last user of the given analysis passes. 136void PMTopLevelManager::setLastUser(std::vector<Pass *> &AnalysisPasses, 137 Pass *P) { 138 139 for (std::vector<Pass *>::iterator I = AnalysisPasses.begin(), 140 E = AnalysisPasses.end(); I != E; ++I) { 141 Pass *AP = *I; 142 LastUser[AP] = P; 143 // If AP is the last user of other passes then make P last user of 144 // such passes. 145 for (std::map<Pass *, Pass *>::iterator LUI = LastUser.begin(), 146 LUE = LastUser.end(); LUI != LUE; ++LUI) { 147 if (LUI->second == AP) 148 LastUser[LUI->first] = P; 149 } 150 } 151 152} 153 154/// Collect passes whose last user is P 155void PMTopLevelManager::collectLastUses(std::vector<Pass *> &LastUses, 156 Pass *P) { 157 for (std::map<Pass *, Pass *>::iterator LUI = LastUser.begin(), 158 LUE = LastUser.end(); LUI != LUE; ++LUI) 159 if (LUI->second == P) 160 LastUses.push_back(LUI->first); 161} 162 163 164 165/// PMDataManager provides the common place to manage the analysis data 166/// used by pass managers. 167class PMDataManager { 168 169public: 170 171 /// Return true IFF pass P's required analysis set does not required new 172 /// manager. 173 bool manageablePass(Pass *P); 174 175 Pass *getAnalysisPass(AnalysisID AID) const { 176 177 std::map<AnalysisID, Pass*>::const_iterator I = 178 AvailableAnalysis.find(AID); 179 180 if (I != AvailableAnalysis.end()) 181 return NULL; 182 else 183 return I->second; 184 } 185 186 /// Augment AvailableAnalysis by adding analysis made available by pass P. 187 void noteDownAvailableAnalysis(Pass *P); 188 189 /// Remove Analysis that is not preserved by the pass 190 void removeNotPreservedAnalysis(Pass *P); 191 192 /// Remove dead passes 193 void removeDeadPasses(Pass *P); 194 195 /// Add pass P into the PassVector. Update 196 /// AvailableAnalysis appropriately if ProcessAnalysis is true. 197 void addPassToManager (Pass *P, bool ProcessAnalysis = true); 198 199 // Initialize available analysis information. 200 void initializeAnalysisInfo() { 201 AvailableAnalysis.clear(); 202 LastUser.clear(); 203 } 204 205 // All Required analyses should be available to the pass as it runs! Here 206 // we fill in the AnalysisImpls member of the pass so that it can 207 // successfully use the getAnalysis() method to retrieve the 208 // implementations it needs. 209 // 210 void initializeAnalysisImpl(Pass *P); 211 212 inline std::vector<Pass *>::iterator passVectorBegin() { 213 return PassVector.begin(); 214 } 215 216 inline std::vector<Pass *>::iterator passVectorEnd() { 217 return PassVector.end(); 218 } 219 220 inline void setLastUser(Pass *P, Pass *LU) { 221 LastUser[P] = LU; 222 // TODO : Check if pass P is available. 223 } 224 225private: 226 // Set of available Analysis. This information is used while scheduling 227 // pass. If a pass requires an analysis which is not not available then 228 // equired analysis pass is scheduled to run before the pass itself is 229 // scheduled to run. 230 std::map<AnalysisID, Pass*> AvailableAnalysis; 231 232 // Map to keep track of last user of the analysis pass. 233 // LastUser->second is the last user of Lastuser->first. 234 std::map<Pass *, Pass *> LastUser; 235 236 // Collection of pass that are managed by this manager 237 std::vector<Pass *> PassVector; 238}; 239 240/// BasicBlockPassManager_New manages BasicBlockPass. It batches all the 241/// pass together and sequence them to process one basic block before 242/// processing next basic block. 243class BasicBlockPassManager_New : public PMDataManager, 244 public FunctionPass { 245 246public: 247 BasicBlockPassManager_New() { } 248 249 /// Add a pass into a passmanager queue. 250 bool addPass(Pass *p); 251 252 /// Execute all of the passes scheduled for execution. Keep track of 253 /// whether any of the passes modifies the function, and if so, return true. 254 bool runOnFunction(Function &F); 255 256 /// Return true IFF AnalysisID AID is currently available. 257 Pass *getAnalysisPassFromManager(AnalysisID AID); 258 259private: 260}; 261 262/// FunctionPassManagerImpl_New manages FunctionPasses and BasicBlockPassManagers. 263/// It batches all function passes and basic block pass managers together and 264/// sequence them to process one function at a time before processing next 265/// function. 266class FunctionPassManagerImpl_New : public PMDataManager, 267 public ModulePass { 268public: 269 FunctionPassManagerImpl_New(ModuleProvider *P) { /* TODO */ } 270 FunctionPassManagerImpl_New() { 271 activeBBPassManager = NULL; 272 } 273 ~FunctionPassManagerImpl_New() { /* TODO */ }; 274 275 /// add - Add a pass to the queue of passes to run. This passes 276 /// ownership of the Pass to the PassManager. When the 277 /// PassManager_X is destroyed, the pass will be destroyed as well, so 278 /// there is no need to delete the pass. (TODO delete passes.) 279 /// This implies that all passes MUST be allocated with 'new'. 280 void add(Pass *P) { /* TODO*/ } 281 282 /// Add pass into the pass manager queue. 283 bool addPass(Pass *P); 284 285 /// Execute all of the passes scheduled for execution. Keep 286 /// track of whether any of the passes modifies the function, and if 287 /// so, return true. 288 bool runOnModule(Module &M); 289 bool runOnFunction(Function &F); 290 291 /// Return true IFF AnalysisID AID is currently available. 292 Pass *getAnalysisPassFromManager(AnalysisID AID); 293 294 /// doInitialization - Run all of the initializers for the function passes. 295 /// 296 bool doInitialization(Module &M); 297 298 /// doFinalization - Run all of the initializers for the function passes. 299 /// 300 bool doFinalization(Module &M); 301private: 302 // Active Pass Managers 303 BasicBlockPassManager_New *activeBBPassManager; 304}; 305 306/// ModulePassManager_New manages ModulePasses and function pass managers. 307/// It batches all Module passes passes and function pass managers together and 308/// sequence them to process one module. 309class ModulePassManager_New : public PMDataManager { 310 311public: 312 ModulePassManager_New() { activeFunctionPassManager = NULL; } 313 314 /// Add a pass into a passmanager queue. 315 bool addPass(Pass *p); 316 317 /// run - Execute all of the passes scheduled for execution. Keep track of 318 /// whether any of the passes modifies the module, and if so, return true. 319 bool runOnModule(Module &M); 320 321 /// Return true IFF AnalysisID AID is currently available. 322 Pass *getAnalysisPassFromManager(AnalysisID AID); 323 324private: 325 // Active Pass Manager 326 FunctionPassManagerImpl_New *activeFunctionPassManager; 327}; 328 329/// PassManager_New manages ModulePassManagers 330class PassManagerImpl_New : public PMDataManager { 331 332public: 333 334 /// add - Add a pass to the queue of passes to run. This passes ownership of 335 /// the Pass to the PassManager. When the PassManager is destroyed, the pass 336 /// will be destroyed as well, so there is no need to delete the pass. This 337 /// implies that all passes MUST be allocated with 'new'. 338 void add(Pass *P); 339 340 /// run - Execute all of the passes scheduled for execution. Keep track of 341 /// whether any of the passes modifies the module, and if so, return true. 342 bool run(Module &M); 343 344 /// Return true IFF AnalysisID AID is currently available. 345 Pass *getAnalysisPassFromManager(AnalysisID AID); 346 347private: 348 349 /// Add a pass into a passmanager queue. This is used by schedulePasses 350 bool addPass(Pass *p); 351 352 /// Schedule pass P for execution. Make sure that passes required by 353 /// P are run before P is run. Update analysis info maintained by 354 /// the manager. Remove dead passes. This is a recursive function. 355 void schedulePass(Pass *P); 356 357 /// Schedule all passes collected in pass queue using add(). Add all the 358 /// schedule passes into various manager's queue using addPass(). 359 void schedulePasses(); 360 361 // Collection of pass managers 362 std::vector<ModulePassManager_New *> PassManagers; 363 364 // Active Pass Manager 365 ModulePassManager_New *activeManager; 366}; 367 368} // End of llvm namespace 369 370// PMDataManager implementation 371 372/// Return true IFF pass P's required analysis set does not required new 373/// manager. 374bool PMDataManager::manageablePass(Pass *P) { 375 376 // TODO 377 // If this pass is not preserving information that is required by a 378 // pass maintained by higher level pass manager then do not insert 379 // this pass into current manager. Use new manager. For example, 380 // For example, If FunctionPass F is not preserving ModulePass Info M1 381 // that is used by another ModulePass M2 then do not insert F in 382 // current function pass manager. 383 return true; 384} 385 386/// Augement AvailableAnalysis by adding analysis made available by pass P. 387void PMDataManager::noteDownAvailableAnalysis(Pass *P) { 388 389 if (const PassInfo *PI = P->getPassInfo()) { 390 AvailableAnalysis[PI] = P; 391 392 //TODO This pass is the current implementation of all of the interfaces it 393 //TODO implements as well. 394 //TODO 395 //TODO const std::vector<const PassInfo*> &II = PI->getInterfacesImplemented(); 396 //TODO for (unsigned i = 0, e = II.size(); i != e; ++i) 397 //TODO CurrentAnalyses[II[i]] = P; 398 } 399} 400 401/// Remove Analyss not preserved by Pass P 402void PMDataManager::removeNotPreservedAnalysis(Pass *P) { 403 AnalysisUsage AnUsage; 404 P->getAnalysisUsage(AnUsage); 405 const std::vector<AnalysisID> &PreservedSet = AnUsage.getPreservedSet(); 406 407 for (std::map<AnalysisID, Pass*>::iterator I = AvailableAnalysis.begin(), 408 E = AvailableAnalysis.end(); I != E; ++I ) { 409 if (std::find(PreservedSet.begin(), PreservedSet.end(), I->first) == 410 PreservedSet.end()) { 411 // Remove this analysis 412 std::map<AnalysisID, Pass*>::iterator J = I++; 413 AvailableAnalysis.erase(J); 414 } 415 } 416} 417 418/// Remove analysis passes that are not used any longer 419void PMDataManager::removeDeadPasses(Pass *P) { 420 421 for (std::map<Pass *, Pass *>::iterator I = LastUser.begin(), 422 E = LastUser.end(); I !=E; ++I) { 423 if (I->second == P) { 424 Pass *deadPass = I->first; 425 deadPass->releaseMemory(); 426 427 std::map<AnalysisID, Pass*>::iterator Pos = 428 AvailableAnalysis.find(deadPass->getPassInfo()); 429 430 assert (Pos != AvailableAnalysis.end() && 431 "Pass is not available"); 432 AvailableAnalysis.erase(Pos); 433 } 434 } 435} 436 437/// Add pass P into the PassVector. Update 438/// AvailableAnalysis appropriately if ProcessAnalysis is true. 439void PMDataManager::addPassToManager (Pass *P, 440 bool ProcessAnalysis) { 441 442 if (ProcessAnalysis) { 443 // Take a note of analysis required and made available by this pass 444 initializeAnalysisImpl(P); 445 noteDownAvailableAnalysis(P); 446 447 // Remove the analysis not preserved by this pass 448 removeNotPreservedAnalysis(P); 449 } 450 451 // Add pass 452 PassVector.push_back(P); 453} 454 455// All Required analyses should be available to the pass as it runs! Here 456// we fill in the AnalysisImpls member of the pass so that it can 457// successfully use the getAnalysis() method to retrieve the 458// implementations it needs. 459// 460void PMDataManager::initializeAnalysisImpl(Pass *P) { 461 AnalysisUsage AnUsage; 462 P->getAnalysisUsage(AnUsage); 463 464 for (std::vector<const PassInfo *>::const_iterator 465 I = AnUsage.getRequiredSet().begin(), 466 E = AnUsage.getRequiredSet().end(); I != E; ++I) { 467 Pass *Impl = getAnalysisPass(*I); 468 if (Impl == 0) 469 assert(0 && "Analysis used but not available!"); 470 // TODO: P->AnalysisImpls.push_back(std::make_pair(*I, Impl)); 471 } 472} 473 474/// BasicBlockPassManager implementation 475 476/// Add pass P into PassVector and return true. If this pass is not 477/// manageable by this manager then return false. 478bool 479BasicBlockPassManager_New::addPass(Pass *P) { 480 481 BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P); 482 if (!BP) 483 return false; 484 485 // If this pass does not preserve anlysis that is used by other passes 486 // managed by this manager than it is not a suiable pass for this manager. 487 if (!manageablePass(P)) 488 return false; 489 490 addPassToManager (BP); 491 492 return true; 493} 494 495/// Execute all of the passes scheduled for execution by invoking 496/// runOnBasicBlock method. Keep track of whether any of the passes modifies 497/// the function, and if so, return true. 498bool 499BasicBlockPassManager_New::runOnFunction(Function &F) { 500 501 bool Changed = false; 502 initializeAnalysisInfo(); 503 504 for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) 505 for (std::vector<Pass *>::iterator itr = passVectorBegin(), 506 e = passVectorEnd(); itr != e; ++itr) { 507 Pass *P = *itr; 508 509 noteDownAvailableAnalysis(P); 510 BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P); 511 Changed |= BP->runOnBasicBlock(*I); 512 removeNotPreservedAnalysis(P); 513 removeDeadPasses(P); 514 } 515 return Changed; 516} 517 518/// Return true IFF AnalysisID AID is currently available. 519Pass * BasicBlockPassManager_New::getAnalysisPassFromManager(AnalysisID AID) { 520 return getAnalysisPass(AID); 521} 522 523// FunctionPassManager_New implementation 524/// Create new Function pass manager 525FunctionPassManager_New::FunctionPassManager_New() { 526 FPM = new FunctionPassManagerImpl_New(); 527} 528 529/// add - Add a pass to the queue of passes to run. This passes 530/// ownership of the Pass to the PassManager. When the 531/// PassManager_X is destroyed, the pass will be destroyed as well, so 532/// there is no need to delete the pass. (TODO delete passes.) 533/// This implies that all passes MUST be allocated with 'new'. 534void FunctionPassManager_New::add(Pass *P) { 535 FPM->add(P); 536} 537 538/// Execute all of the passes scheduled for execution. Keep 539/// track of whether any of the passes modifies the function, and if 540/// so, return true. 541bool FunctionPassManager_New::runOnModule(Module &M) { 542 return FPM->runOnModule(M); 543} 544 545/// run - Execute all of the passes scheduled for execution. Keep 546/// track of whether any of the passes modifies the function, and if 547/// so, return true. 548/// 549bool FunctionPassManager_New::run(Function &F) { 550 std::string errstr; 551 if (MP->materializeFunction(&F, &errstr)) { 552 cerr << "Error reading bytecode file: " << errstr << "\n"; 553 abort(); 554 } 555 return FPM->runOnFunction(F); 556} 557 558 559/// doInitialization - Run all of the initializers for the function passes. 560/// 561bool FunctionPassManager_New::doInitialization() { 562 return FPM->doInitialization(*MP->getModule()); 563} 564 565/// doFinalization - Run all of the initializers for the function passes. 566/// 567bool FunctionPassManager_New::doFinalization() { 568 return FPM->doFinalization(*MP->getModule()); 569} 570 571// FunctionPassManagerImpl_New implementation 572 573// FunctionPassManager 574 575/// Add pass P into the pass manager queue. If P is a BasicBlockPass then 576/// either use it into active basic block pass manager or create new basic 577/// block pass manager to handle pass P. 578bool 579FunctionPassManagerImpl_New::addPass(Pass *P) { 580 581 // If P is a BasicBlockPass then use BasicBlockPassManager_New. 582 if (BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P)) { 583 584 if (!activeBBPassManager 585 || !activeBBPassManager->addPass(BP)) { 586 587 activeBBPassManager = new BasicBlockPassManager_New(); 588 addPassToManager(activeBBPassManager, false); 589 if (!activeBBPassManager->addPass(BP)) 590 assert(0 && "Unable to add Pass"); 591 } 592 return true; 593 } 594 595 FunctionPass *FP = dynamic_cast<FunctionPass *>(P); 596 if (!FP) 597 return false; 598 599 // If this pass does not preserve anlysis that is used by other passes 600 // managed by this manager than it is not a suiable pass for this manager. 601 if (!manageablePass(P)) 602 return false; 603 604 addPassToManager (FP); 605 activeBBPassManager = NULL; 606 return true; 607} 608 609/// Execute all of the passes scheduled for execution by invoking 610/// runOnFunction method. Keep track of whether any of the passes modifies 611/// the function, and if so, return true. 612bool FunctionPassManagerImpl_New::runOnModule(Module &M) { 613 614 bool Changed = false; 615 initializeAnalysisInfo(); 616 617 for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) 618 for (std::vector<Pass *>::iterator itr = passVectorBegin(), 619 e = passVectorEnd(); itr != e; ++itr) { 620 Pass *P = *itr; 621 622 noteDownAvailableAnalysis(P); 623 FunctionPass *FP = dynamic_cast<FunctionPass*>(P); 624 Changed |= FP->runOnFunction(*I); 625 removeNotPreservedAnalysis(P); 626 removeDeadPasses(P); 627 } 628 return Changed; 629} 630 631/// Execute all of the passes scheduled for execution by invoking 632/// runOnFunction method. Keep track of whether any of the passes modifies 633/// the function, and if so, return true. 634bool FunctionPassManagerImpl_New::runOnFunction(Function &F) { 635 636 bool Changed = false; 637 initializeAnalysisInfo(); 638 639 for (std::vector<Pass *>::iterator itr = passVectorBegin(), 640 e = passVectorEnd(); itr != e; ++itr) { 641 Pass *P = *itr; 642 643 noteDownAvailableAnalysis(P); 644 FunctionPass *FP = dynamic_cast<FunctionPass*>(P); 645 Changed |= FP->runOnFunction(F); 646 removeNotPreservedAnalysis(P); 647 removeDeadPasses(P); 648 } 649 return Changed; 650} 651 652 653/// Return true IFF AnalysisID AID is currently available. 654Pass *FunctionPassManagerImpl_New::getAnalysisPassFromManager(AnalysisID AID) { 655 656 Pass *P = getAnalysisPass(AID); 657 if (P) 658 return P; 659 660 if (activeBBPassManager && 661 activeBBPassManager->getAnalysisPass(AID) != 0) 662 return activeBBPassManager->getAnalysisPass(AID); 663 664 // TODO : Check inactive managers 665 return NULL; 666} 667 668inline bool FunctionPassManagerImpl_New::doInitialization(Module &M) { 669 bool Changed = false; 670 671 for (std::vector<Pass *>::iterator itr = passVectorBegin(), 672 e = passVectorEnd(); itr != e; ++itr) { 673 Pass *P = *itr; 674 675 FunctionPass *FP = dynamic_cast<FunctionPass*>(P); 676 Changed |= FP->doInitialization(M); 677 } 678 679 return Changed; 680} 681 682inline bool FunctionPassManagerImpl_New::doFinalization(Module &M) { 683 bool Changed = false; 684 685 for (std::vector<Pass *>::iterator itr = passVectorBegin(), 686 e = passVectorEnd(); itr != e; ++itr) { 687 Pass *P = *itr; 688 689 FunctionPass *FP = dynamic_cast<FunctionPass*>(P); 690 Changed |= FP->doFinalization(M); 691 } 692 693 694 return Changed; 695} 696 697 698// ModulePassManager implementation 699 700/// Add P into pass vector if it is manageble. If P is a FunctionPass 701/// then use FunctionPassManagerImpl_New to manage it. Return false if P 702/// is not manageable by this manager. 703bool 704ModulePassManager_New::addPass(Pass *P) { 705 706 // If P is FunctionPass then use function pass maanager. 707 if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P)) { 708 709 activeFunctionPassManager = NULL; 710 711 if (!activeFunctionPassManager 712 || !activeFunctionPassManager->addPass(P)) { 713 714 activeFunctionPassManager = new FunctionPassManagerImpl_New(); 715 addPassToManager(activeFunctionPassManager, false); 716 if (!activeFunctionPassManager->addPass(FP)) 717 assert(0 && "Unable to add pass"); 718 } 719 return true; 720 } 721 722 ModulePass *MP = dynamic_cast<ModulePass *>(P); 723 if (!MP) 724 return false; 725 726 // If this pass does not preserve anlysis that is used by other passes 727 // managed by this manager than it is not a suiable pass for this manager. 728 if (!manageablePass(P)) 729 return false; 730 731 addPassToManager(MP); 732 activeFunctionPassManager = NULL; 733 return true; 734} 735 736 737/// Execute all of the passes scheduled for execution by invoking 738/// runOnModule method. Keep track of whether any of the passes modifies 739/// the module, and if so, return true. 740bool 741ModulePassManager_New::runOnModule(Module &M) { 742 bool Changed = false; 743 initializeAnalysisInfo(); 744 745 for (std::vector<Pass *>::iterator itr = passVectorBegin(), 746 e = passVectorEnd(); itr != e; ++itr) { 747 Pass *P = *itr; 748 749 noteDownAvailableAnalysis(P); 750 ModulePass *MP = dynamic_cast<ModulePass*>(P); 751 Changed |= MP->runOnModule(M); 752 removeNotPreservedAnalysis(P); 753 removeDeadPasses(P); 754 } 755 return Changed; 756} 757 758/// Return true IFF AnalysisID AID is currently available. 759Pass *ModulePassManager_New::getAnalysisPassFromManager(AnalysisID AID) { 760 761 762 Pass *P = getAnalysisPass(AID); 763 if (P) 764 return P; 765 766 if (activeFunctionPassManager && 767 activeFunctionPassManager->getAnalysisPass(AID) != 0) 768 return activeFunctionPassManager->getAnalysisPass(AID); 769 770 // TODO : Check inactive managers 771 return NULL; 772} 773 774/// Return true IFF AnalysisID AID is currently available. 775Pass *PassManagerImpl_New::getAnalysisPassFromManager(AnalysisID AID) { 776 777 Pass *P = NULL; 778 for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(), 779 e = PassManagers.end(); !P && itr != e; ++itr) 780 P = (*itr)->getAnalysisPassFromManager(AID); 781 return P; 782} 783 784/// Schedule pass P for execution. Make sure that passes required by 785/// P are run before P is run. Update analysis info maintained by 786/// the manager. Remove dead passes. This is a recursive function. 787void PassManagerImpl_New::schedulePass(Pass *P) { 788 789 AnalysisUsage AnUsage; 790 P->getAnalysisUsage(AnUsage); 791 const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet(); 792 for (std::vector<AnalysisID>::const_iterator I = RequiredSet.begin(), 793 E = RequiredSet.end(); I != E; ++I) { 794 795 Pass *AnalysisPass = getAnalysisPassFromManager(*I); 796 if (!AnalysisPass) { 797 // Schedule this analysis run first. 798 AnalysisPass = (*I)->createPass(); 799 schedulePass(AnalysisPass); 800 } 801 setLastUser (AnalysisPass, P); 802 803 // Prolong live range of analyses that are needed after an analysis pass 804 // is destroyed, for querying by subsequent passes 805 const std::vector<AnalysisID> &IDs = AnUsage.getRequiredTransitiveSet(); 806 for (std::vector<AnalysisID>::const_iterator I = IDs.begin(), 807 E = IDs.end(); I != E; ++I) { 808 Pass *AP = getAnalysisPassFromManager(*I); 809 assert (AP && "Analysis pass is not available"); 810 setLastUser(AP, P); 811 } 812 } 813 addPass(P); 814} 815 816/// Schedule all passes from the queue by adding them in their 817/// respective manager's queue. 818void PassManagerImpl_New::schedulePasses() { 819 for (std::vector<Pass *>::iterator I = passVectorBegin(), 820 E = passVectorEnd(); I != E; ++I) 821 schedulePass (*I); 822} 823 824/// Add pass P to the queue of passes to run. 825void PassManagerImpl_New::add(Pass *P) { 826 // Do not process Analysis now. Analysis is process while scheduling 827 // the pass vector. 828 addPassToManager(P, false); 829} 830 831// PassManager_New implementation 832/// Add P into active pass manager or use new module pass manager to 833/// manage it. 834bool PassManagerImpl_New::addPass(Pass *P) { 835 836 if (!activeManager || !activeManager->addPass(P)) { 837 activeManager = new ModulePassManager_New(); 838 PassManagers.push_back(activeManager); 839 } 840 841 return activeManager->addPass(P); 842} 843 844/// run - Execute all of the passes scheduled for execution. Keep track of 845/// whether any of the passes modifies the module, and if so, return true. 846bool PassManagerImpl_New::run(Module &M) { 847 848 schedulePasses(); 849 bool Changed = false; 850 for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(), 851 e = PassManagers.end(); itr != e; ++itr) { 852 ModulePassManager_New *pm = *itr; 853 Changed |= pm->runOnModule(M); 854 } 855 return Changed; 856} 857 858/// Create new pass manager 859PassManager_New::PassManager_New() { 860 PM = new PassManagerImpl_New(); 861} 862 863/// add - Add a pass to the queue of passes to run. This passes ownership of 864/// the Pass to the PassManager. When the PassManager is destroyed, the pass 865/// will be destroyed as well, so there is no need to delete the pass. This 866/// implies that all passes MUST be allocated with 'new'. 867void 868PassManager_New::add(Pass *P) { 869 PM->add(P); 870} 871 872/// run - Execute all of the passes scheduled for execution. Keep track of 873/// whether any of the passes modifies the module, and if so, return true. 874bool 875PassManager_New::run(Module &M) { 876 return PM->run(M); 877} 878 879