PassManager.cpp revision b30803bc17a5be655b7c4ef356e75ae5524b0931
155fd43f90913676682487f89f27c756adb827f66Devang Patel//===- PassManager.cpp - LLVM Pass Infrastructure Implementation ----------===// 255fd43f90913676682487f89f27c756adb827f66Devang Patel// 355fd43f90913676682487f89f27c756adb827f66Devang Patel// The LLVM Compiler Infrastructure 455fd43f90913676682487f89f27c756adb827f66Devang Patel// 555fd43f90913676682487f89f27c756adb827f66Devang Patel// This file was developed by the LLVM research group and is distributed under 655fd43f90913676682487f89f27c756adb827f66Devang Patel// the University of Illinois Open Source License. See LICENSE.TXT for details. 755fd43f90913676682487f89f27c756adb827f66Devang Patel// 855fd43f90913676682487f89f27c756adb827f66Devang Patel//===----------------------------------------------------------------------===// 955fd43f90913676682487f89f27c756adb827f66Devang Patel// 1055fd43f90913676682487f89f27c756adb827f66Devang Patel// This file implements the LLVM Pass Manager infrastructure. 1155fd43f90913676682487f89f27c756adb827f66Devang Patel// 1255fd43f90913676682487f89f27c756adb827f66Devang Patel//===----------------------------------------------------------------------===// 1355fd43f90913676682487f89f27c756adb827f66Devang Patel 1455fd43f90913676682487f89f27c756adb827f66Devang Patel 1555fd43f90913676682487f89f27c756adb827f66Devang Patel#include "llvm/PassManager.h" 1655fd43f90913676682487f89f27c756adb827f66Devang Patel#include "llvm/Function.h" 1755fd43f90913676682487f89f27c756adb827f66Devang Patel#include "llvm/Module.h" 1855fd43f90913676682487f89f27c756adb827f66Devang Patel 1955fd43f90913676682487f89f27c756adb827f66Devang Patelusing namespace llvm; 2055fd43f90913676682487f89f27c756adb827f66Devang Patel 2155fd43f90913676682487f89f27c756adb827f66Devang Patel/// BasicBlockPassManager implementation 2255fd43f90913676682487f89f27c756adb827f66Devang Patel 2355fd43f90913676682487f89f27c756adb827f66Devang Patel/// Add pass P into PassVector and return TRUE. If this pass is not 2455fd43f90913676682487f89f27c756adb827f66Devang Patel/// manageable by this manager then return FALSE. 2555fd43f90913676682487f89f27c756adb827f66Devang Patelbool 2655fd43f90913676682487f89f27c756adb827f66Devang PatelBasicBlockPassManager_New::addPass (Pass *P) { 2755fd43f90913676682487f89f27c756adb827f66Devang Patel 2855fd43f90913676682487f89f27c756adb827f66Devang Patel BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P); 2955fd43f90913676682487f89f27c756adb827f66Devang Patel if (!BP) 3055fd43f90913676682487f89f27c756adb827f66Devang Patel return false; 3155fd43f90913676682487f89f27c756adb827f66Devang Patel 3255fd43f90913676682487f89f27c756adb827f66Devang Patel // TODO: Check if it suitable to manage P using this BasicBlockPassManager 3355fd43f90913676682487f89f27c756adb827f66Devang Patel // or we need another instance of BasicBlockPassManager 3455fd43f90913676682487f89f27c756adb827f66Devang Patel 3555fd43f90913676682487f89f27c756adb827f66Devang Patel // Add pass 3655fd43f90913676682487f89f27c756adb827f66Devang Patel PassVector.push_back(BP); 3755fd43f90913676682487f89f27c756adb827f66Devang Patel return true; 3855fd43f90913676682487f89f27c756adb827f66Devang Patel} 3955fd43f90913676682487f89f27c756adb827f66Devang Patel 4055fd43f90913676682487f89f27c756adb827f66Devang Patel/// Execute all of the passes scheduled for execution by invoking 4155fd43f90913676682487f89f27c756adb827f66Devang Patel/// runOnBasicBlock method. Keep track of whether any of the passes modifies 4255fd43f90913676682487f89f27c756adb827f66Devang Patel/// the function, and if so, return true. 4355fd43f90913676682487f89f27c756adb827f66Devang Patelbool 4455fd43f90913676682487f89f27c756adb827f66Devang PatelBasicBlockPassManager_New::runOnFunction(Function &F) { 4555fd43f90913676682487f89f27c756adb827f66Devang Patel 4655fd43f90913676682487f89f27c756adb827f66Devang Patel bool Changed = false; 4755fd43f90913676682487f89f27c756adb827f66Devang Patel for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) 4855fd43f90913676682487f89f27c756adb827f66Devang Patel for (std::vector<Pass *>::iterator itr = PassVector.begin(), 4955fd43f90913676682487f89f27c756adb827f66Devang Patel e = PassVector.end(); itr != e; ++itr) { 5055fd43f90913676682487f89f27c756adb827f66Devang Patel Pass *P = *itr; 5155fd43f90913676682487f89f27c756adb827f66Devang Patel BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P); 5255fd43f90913676682487f89f27c756adb827f66Devang Patel Changed |= BP->runOnBasicBlock(*I); 5355fd43f90913676682487f89f27c756adb827f66Devang Patel } 5455fd43f90913676682487f89f27c756adb827f66Devang Patel return Changed; 5555fd43f90913676682487f89f27c756adb827f66Devang Patel} 5655fd43f90913676682487f89f27c756adb827f66Devang Patel 57448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager_New implementation 58448d27cd795dc273249f123444509403f4fa4facDevang Patel 59448d27cd795dc273249f123444509403f4fa4facDevang Patel/////////////////////////////////////////////////////////////////////////////// 60448d27cd795dc273249f123444509403f4fa4facDevang Patel// FunctionPassManager 61448d27cd795dc273249f123444509403f4fa4facDevang Patel 62448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Add pass P into the pass manager queue. If P is a BasicBlockPass then 63448d27cd795dc273249f123444509403f4fa4facDevang Patel/// either use it into active basic block pass manager or create new basic 64448d27cd795dc273249f123444509403f4fa4facDevang Patel/// block pass manager to handle pass P. 65448d27cd795dc273249f123444509403f4fa4facDevang Patelbool 66448d27cd795dc273249f123444509403f4fa4facDevang PatelFunctionPassManager_New::addPass (Pass *P) { 67448d27cd795dc273249f123444509403f4fa4facDevang Patel 68448d27cd795dc273249f123444509403f4fa4facDevang Patel // If P is a BasicBlockPass then use BasicBlockPassManager_New. 69448d27cd795dc273249f123444509403f4fa4facDevang Patel if (BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P)) { 70448d27cd795dc273249f123444509403f4fa4facDevang Patel 71448d27cd795dc273249f123444509403f4fa4facDevang Patel if (!activeBBPassManager 72448d27cd795dc273249f123444509403f4fa4facDevang Patel || !activeBBPassManager->addPass(BP)) { 73448d27cd795dc273249f123444509403f4fa4facDevang Patel 74448d27cd795dc273249f123444509403f4fa4facDevang Patel activeBBPassManager = new BasicBlockPassManager_New(); 75448d27cd795dc273249f123444509403f4fa4facDevang Patel 76448d27cd795dc273249f123444509403f4fa4facDevang Patel PassVector.push_back(activeBBPassManager); 77448d27cd795dc273249f123444509403f4fa4facDevang Patel assert (!activeBBPassManager->addPass(BP) && 78448d27cd795dc273249f123444509403f4fa4facDevang Patel "Unable to add Pass"); 79448d27cd795dc273249f123444509403f4fa4facDevang Patel } 80448d27cd795dc273249f123444509403f4fa4facDevang Patel return true; 81448d27cd795dc273249f123444509403f4fa4facDevang Patel } 82448d27cd795dc273249f123444509403f4fa4facDevang Patel 83448d27cd795dc273249f123444509403f4fa4facDevang Patel FunctionPass *FP = dynamic_cast<FunctionPass *>(P); 84448d27cd795dc273249f123444509403f4fa4facDevang Patel if (!FP) 85448d27cd795dc273249f123444509403f4fa4facDevang Patel return false; 86448d27cd795dc273249f123444509403f4fa4facDevang Patel 87448d27cd795dc273249f123444509403f4fa4facDevang Patel // TODO: Check if it suitable to manage P using this FunctionPassManager 8892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel // or we need another instance of FunctionPassManager 89448d27cd795dc273249f123444509403f4fa4facDevang Patel 90448d27cd795dc273249f123444509403f4fa4facDevang Patel PassVector.push_back(FP); 91448d27cd795dc273249f123444509403f4fa4facDevang Patel activeBBPassManager = NULL; 92448d27cd795dc273249f123444509403f4fa4facDevang Patel return true; 93448d27cd795dc273249f123444509403f4fa4facDevang Patel} 94448d27cd795dc273249f123444509403f4fa4facDevang Patel 95448d27cd795dc273249f123444509403f4fa4facDevang Patel/// Execute all of the passes scheduled for execution by invoking 96448d27cd795dc273249f123444509403f4fa4facDevang Patel/// runOnFunction method. Keep track of whether any of the passes modifies 97448d27cd795dc273249f123444509403f4fa4facDevang Patel/// the function, and if so, return true. 98448d27cd795dc273249f123444509403f4fa4facDevang Patelbool 99448d27cd795dc273249f123444509403f4fa4facDevang PatelFunctionPassManager_New::runOnModule(Module &M) { 100448d27cd795dc273249f123444509403f4fa4facDevang Patel 101448d27cd795dc273249f123444509403f4fa4facDevang Patel bool Changed = false; 102448d27cd795dc273249f123444509403f4fa4facDevang Patel for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) 103448d27cd795dc273249f123444509403f4fa4facDevang Patel for (std::vector<Pass *>::iterator itr = PassVector.begin(), 104448d27cd795dc273249f123444509403f4fa4facDevang Patel e = PassVector.end(); itr != e; ++itr) { 105448d27cd795dc273249f123444509403f4fa4facDevang Patel Pass *P = *itr; 106448d27cd795dc273249f123444509403f4fa4facDevang Patel FunctionPass *FP = dynamic_cast<FunctionPass*>(P); 107448d27cd795dc273249f123444509403f4fa4facDevang Patel Changed |= FP->runOnFunction(*I); 108448d27cd795dc273249f123444509403f4fa4facDevang Patel } 109448d27cd795dc273249f123444509403f4fa4facDevang Patel return Changed; 110448d27cd795dc273249f123444509403f4fa4facDevang Patel} 111448d27cd795dc273249f123444509403f4fa4facDevang Patel 112448d27cd795dc273249f123444509403f4fa4facDevang Patel 11392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel// ModulePassManager implementation 11492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 11592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Add P into pass vector if it is manageble. If P is a FunctionPass 11692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// then use FunctionPassManager_New to manage it. Return FALSE if P 11792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// is not manageable by this manager. 11892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool 11992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang PatelModulePassManager_New::addPass (Pass *P) { 12092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 12192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel // If P is FunctionPass then use function pass maanager. 12292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel if (FunctionPass *FP = dynamic_cast<FunctionPass*>(P)) { 12392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 12492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel activeFunctionPassManager = NULL; 12592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 12692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel if (!activeFunctionPassManager 12792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel || !activeFunctionPassManager->addPass(P)) { 12892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 12992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel activeFunctionPassManager = new FunctionPassManager_New(); 13092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 13192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel PassVector.push_back(activeFunctionPassManager); 13292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel assert (!activeFunctionPassManager->addPass(FP) && 13392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel "Unable to add Pass"); 13492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel } 13592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel return true; 13692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel } 13792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 13892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel ModulePass *MP = dynamic_cast<ModulePass *>(P); 13992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel if (!MP) 14092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel return false; 14192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 14292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel // TODO: Check if it suitable to manage P using this ModulePassManager 14392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel // or we need another instance of ModulePassManager 14492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 14592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel PassVector.push_back(MP); 14692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel activeFunctionPassManager = NULL; 14792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel return true; 14892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel} 14992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 15092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 15192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// Execute all of the passes scheduled for execution by invoking 15292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// runOnModule method. Keep track of whether any of the passes modifies 15392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel/// the module, and if so, return true. 15492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patelbool 15592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang PatelModulePassManager_New::runOnModule(Module &M) { 15692c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel bool Changed = false; 15792c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel for (std::vector<Pass *>::iterator itr = PassVector.begin(), 15892c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel e = PassVector.end(); itr != e; ++itr) { 15992c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel Pass *P = *itr; 16092c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel ModulePass *MP = dynamic_cast<ModulePass*>(P); 16192c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel Changed |= MP->runOnModule(M); 16292c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel } 16392c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel return Changed; 16492c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel} 16592c45eebf77de5d6ee84a3f18f560b83cb68e720Devang Patel 166b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Schedule all passes from the queue by adding them in their 167b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// respective manager's queue. 168b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelvoid 169b30803bc17a5be655b7c4ef356e75ae5524b0931Devang PatelPassManager_New::schedulePasses() { 170b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel /* TODO */ 171b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel} 172b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 173b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add pass P to the queue of passes to run. 174b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelvoid 175b30803bc17a5be655b7c4ef356e75ae5524b0931Devang PatelPassManager_New::add(Pass *P) { 176b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel /* TODO */ 177b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel} 178b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 179b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel// PassManager_New implementation 180b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// Add P into active pass manager or use new module pass manager to 181b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// manage it. 182b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelbool 183b30803bc17a5be655b7c4ef356e75ae5524b0931Devang PatelPassManager_New::addPass (Pass *P) { 184b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 185b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel if (!activeManager) { 186b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel activeManager = new ModulePassManager_New(); 187b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel PassManagers.push_back(activeManager); 188b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel } 189b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 190b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel return activeManager->addPass(P); 191b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel} 192b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 193b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// run - Execute all of the passes scheduled for execution. Keep track of 194b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel/// whether any of the passes modifies the module, and if so, return true. 195b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patelbool 196b30803bc17a5be655b7c4ef356e75ae5524b0931Devang PatelPassManager_New::run(Module &M) { 197b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel 198b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel schedulePasses(); 199b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel bool Changed = false; 200b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(), 201b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel e = PassManagers.end(); itr != e; ++itr) { 202b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel ModulePassManager_New *pm = *itr; 203b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel Changed |= pm->runOnModule(M); 204b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel } 205b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel return Changed; 206b30803bc17a5be655b7c4ef356e75ae5524b0931Devang Patel} 207