1249259Sdim//===- Pass.cpp - LLVM Pass Infrastructure Implementation -----------------===// 2249259Sdim// 3249259Sdim// The LLVM Compiler Infrastructure 4249259Sdim// 5249259Sdim// This file is distributed under the University of Illinois Open Source 6249259Sdim// License. See LICENSE.TXT for details. 7249259Sdim// 8249259Sdim//===----------------------------------------------------------------------===// 9249259Sdim// 10249259Sdim// This file implements the LLVM Pass infrastructure. It is primarily 11249259Sdim// responsible with ensuring that passes are executed and batched together 12249259Sdim// optimally. 13249259Sdim// 14249259Sdim//===----------------------------------------------------------------------===// 15249259Sdim 16249259Sdim#include "llvm/Pass.h" 17249259Sdim#include "llvm/Assembly/PrintModulePass.h" 18249259Sdim#include "llvm/PassRegistry.h" 19249259Sdim#include "llvm/Support/Debug.h" 20249259Sdim#include "llvm/Support/PassNameParser.h" 21249259Sdim#include "llvm/Support/raw_ostream.h" 22249259Sdimusing namespace llvm; 23249259Sdim 24249259Sdim//===----------------------------------------------------------------------===// 25249259Sdim// Pass Implementation 26249259Sdim// 27249259Sdim 28249259Sdim// Force out-of-line virtual method. 29249259SdimPass::~Pass() { 30249259Sdim delete Resolver; 31249259Sdim} 32249259Sdim 33249259Sdim// Force out-of-line virtual method. 34249259SdimModulePass::~ModulePass() { } 35249259Sdim 36249259SdimPass *ModulePass::createPrinterPass(raw_ostream &O, 37249259Sdim const std::string &Banner) const { 38249259Sdim return createPrintModulePass(&O, false, Banner); 39249259Sdim} 40249259Sdim 41249259SdimPassManagerType ModulePass::getPotentialPassManagerType() const { 42249259Sdim return PMT_ModulePassManager; 43249259Sdim} 44249259Sdim 45249259Sdimbool Pass::mustPreserveAnalysisID(char &AID) const { 46249259Sdim return Resolver->getAnalysisIfAvailable(&AID, true) != 0; 47249259Sdim} 48249259Sdim 49249259Sdim// dumpPassStructure - Implement the -debug-pass=Structure option 50249259Sdimvoid Pass::dumpPassStructure(unsigned Offset) { 51249259Sdim dbgs().indent(Offset*2) << getPassName() << "\n"; 52249259Sdim} 53249259Sdim 54249259Sdim/// getPassName - Return a nice clean name for a pass. This usually 55249259Sdim/// implemented in terms of the name that is registered by one of the 56249259Sdim/// Registration templates, but can be overloaded directly. 57249259Sdim/// 58249259Sdimconst char *Pass::getPassName() const { 59249259Sdim AnalysisID AID = getPassID(); 60249259Sdim const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(AID); 61249259Sdim if (PI) 62249259Sdim return PI->getPassName(); 63249259Sdim return "Unnamed pass: implement Pass::getPassName()"; 64249259Sdim} 65249259Sdim 66249259Sdimvoid Pass::preparePassManager(PMStack &) { 67249259Sdim // By default, don't do anything. 68249259Sdim} 69249259Sdim 70249259SdimPassManagerType Pass::getPotentialPassManagerType() const { 71249259Sdim // Default implementation. 72249259Sdim return PMT_Unknown; 73249259Sdim} 74249259Sdim 75249259Sdimvoid Pass::getAnalysisUsage(AnalysisUsage &) const { 76249259Sdim // By default, no analysis results are used, all are invalidated. 77249259Sdim} 78249259Sdim 79249259Sdimvoid Pass::releaseMemory() { 80249259Sdim // By default, don't do anything. 81249259Sdim} 82249259Sdim 83249259Sdimvoid Pass::verifyAnalysis() const { 84249259Sdim // By default, don't do anything. 85249259Sdim} 86249259Sdim 87249259Sdimvoid *Pass::getAdjustedAnalysisPointer(AnalysisID AID) { 88249259Sdim return this; 89249259Sdim} 90249259Sdim 91249259SdimImmutablePass *Pass::getAsImmutablePass() { 92249259Sdim return 0; 93249259Sdim} 94249259Sdim 95249259SdimPMDataManager *Pass::getAsPMDataManager() { 96249259Sdim return 0; 97249259Sdim} 98249259Sdim 99249259Sdimvoid Pass::setResolver(AnalysisResolver *AR) { 100249259Sdim assert(!Resolver && "Resolver is already set"); 101249259Sdim Resolver = AR; 102249259Sdim} 103249259Sdim 104249259Sdim// print - Print out the internal state of the pass. This is called by Analyze 105249259Sdim// to print out the contents of an analysis. Otherwise it is not necessary to 106249259Sdim// implement this method. 107249259Sdim// 108249259Sdimvoid Pass::print(raw_ostream &O,const Module*) const { 109249259Sdim O << "Pass::print not implemented for pass: '" << getPassName() << "'!\n"; 110249259Sdim} 111249259Sdim 112249259Sdim// dump - call print(cerr); 113249259Sdimvoid Pass::dump() const { 114249259Sdim print(dbgs(), 0); 115249259Sdim} 116249259Sdim 117249259Sdim//===----------------------------------------------------------------------===// 118249259Sdim// ImmutablePass Implementation 119249259Sdim// 120249259Sdim// Force out-of-line virtual method. 121249259SdimImmutablePass::~ImmutablePass() { } 122249259Sdim 123249259Sdimvoid ImmutablePass::initializePass() { 124249259Sdim // By default, don't do anything. 125249259Sdim} 126249259Sdim 127249259Sdim//===----------------------------------------------------------------------===// 128249259Sdim// FunctionPass Implementation 129249259Sdim// 130249259Sdim 131249259SdimPass *FunctionPass::createPrinterPass(raw_ostream &O, 132249259Sdim const std::string &Banner) const { 133249259Sdim return createPrintFunctionPass(Banner, &O); 134249259Sdim} 135249259Sdim 136249259SdimPassManagerType FunctionPass::getPotentialPassManagerType() const { 137249259Sdim return PMT_FunctionPassManager; 138249259Sdim} 139249259Sdim 140249259Sdim//===----------------------------------------------------------------------===// 141249259Sdim// BasicBlockPass Implementation 142249259Sdim// 143249259Sdim 144249259SdimPass *BasicBlockPass::createPrinterPass(raw_ostream &O, 145249259Sdim const std::string &Banner) const { 146249259Sdim return createPrintBasicBlockPass(&O, false, Banner); 147249259Sdim} 148249259Sdim 149249259Sdimbool BasicBlockPass::doInitialization(Function &) { 150249259Sdim // By default, don't do anything. 151249259Sdim return false; 152249259Sdim} 153249259Sdim 154249259Sdimbool BasicBlockPass::doFinalization(Function &) { 155249259Sdim // By default, don't do anything. 156249259Sdim return false; 157249259Sdim} 158249259Sdim 159249259SdimPassManagerType BasicBlockPass::getPotentialPassManagerType() const { 160249259Sdim return PMT_BasicBlockPassManager; 161249259Sdim} 162249259Sdim 163249259Sdimconst PassInfo *Pass::lookupPassInfo(const void *TI) { 164249259Sdim return PassRegistry::getPassRegistry()->getPassInfo(TI); 165249259Sdim} 166249259Sdim 167249259Sdimconst PassInfo *Pass::lookupPassInfo(StringRef Arg) { 168249259Sdim return PassRegistry::getPassRegistry()->getPassInfo(Arg); 169249259Sdim} 170249259Sdim 171249259SdimPass *Pass::createPass(AnalysisID ID) { 172249259Sdim const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(ID); 173249259Sdim if (!PI) 174249259Sdim return NULL; 175249259Sdim return PI->createPass(); 176249259Sdim} 177249259Sdim 178249259SdimPass *PassInfo::createPass() const { 179249259Sdim assert((!isAnalysisGroup() || NormalCtor) && 180249259Sdim "No default implementation found for analysis group!"); 181249259Sdim assert(NormalCtor && 182249259Sdim "Cannot call createPass on PassInfo without default ctor!"); 183249259Sdim return NormalCtor(); 184249259Sdim} 185249259Sdim 186249259Sdim//===----------------------------------------------------------------------===// 187249259Sdim// Analysis Group Implementation Code 188249259Sdim//===----------------------------------------------------------------------===// 189249259Sdim 190249259Sdim// RegisterAGBase implementation 191249259Sdim// 192249259SdimRegisterAGBase::RegisterAGBase(const char *Name, const void *InterfaceID, 193249259Sdim const void *PassID, bool isDefault) 194249259Sdim : PassInfo(Name, InterfaceID) { 195249259Sdim PassRegistry::getPassRegistry()->registerAnalysisGroup(InterfaceID, PassID, 196249259Sdim *this, isDefault); 197249259Sdim} 198249259Sdim 199249259Sdim//===----------------------------------------------------------------------===// 200249259Sdim// PassRegistrationListener implementation 201249259Sdim// 202249259Sdim 203249259Sdim// PassRegistrationListener ctor - Add the current object to the list of 204249259Sdim// PassRegistrationListeners... 205249259SdimPassRegistrationListener::PassRegistrationListener() { 206249259Sdim PassRegistry::getPassRegistry()->addRegistrationListener(this); 207249259Sdim} 208249259Sdim 209249259Sdim// dtor - Remove object from list of listeners... 210249259SdimPassRegistrationListener::~PassRegistrationListener() { 211249259Sdim PassRegistry::getPassRegistry()->removeRegistrationListener(this); 212249259Sdim} 213249259Sdim 214249259Sdim// enumeratePasses - Iterate over the registered passes, calling the 215249259Sdim// passEnumerate callback on each PassInfo object. 216249259Sdim// 217249259Sdimvoid PassRegistrationListener::enumeratePasses() { 218249259Sdim PassRegistry::getPassRegistry()->enumerateWith(this); 219249259Sdim} 220249259Sdim 221249259SdimPassNameParser::~PassNameParser() {} 222249259Sdim 223249259Sdim//===----------------------------------------------------------------------===// 224249259Sdim// AnalysisUsage Class Implementation 225249259Sdim// 226249259Sdim 227249259Sdimnamespace { 228249259Sdim struct GetCFGOnlyPasses : public PassRegistrationListener { 229249259Sdim typedef AnalysisUsage::VectorType VectorType; 230249259Sdim VectorType &CFGOnlyList; 231249259Sdim GetCFGOnlyPasses(VectorType &L) : CFGOnlyList(L) {} 232249259Sdim 233249259Sdim void passEnumerate(const PassInfo *P) { 234249259Sdim if (P->isCFGOnlyPass()) 235249259Sdim CFGOnlyList.push_back(P->getTypeInfo()); 236249259Sdim } 237249259Sdim }; 238249259Sdim} 239249259Sdim 240249259Sdim// setPreservesCFG - This function should be called to by the pass, iff they do 241249259Sdim// not: 242249259Sdim// 243249259Sdim// 1. Add or remove basic blocks from the function 244249259Sdim// 2. Modify terminator instructions in any way. 245249259Sdim// 246249259Sdim// This function annotates the AnalysisUsage info object to say that analyses 247249259Sdim// that only depend on the CFG are preserved by this pass. 248249259Sdim// 249249259Sdimvoid AnalysisUsage::setPreservesCFG() { 250249259Sdim // Since this transformation doesn't modify the CFG, it preserves all analyses 251249259Sdim // that only depend on the CFG (like dominators, loop info, etc...) 252249259Sdim GetCFGOnlyPasses(Preserved).enumeratePasses(); 253249259Sdim} 254249259Sdim 255249259SdimAnalysisUsage &AnalysisUsage::addPreserved(StringRef Arg) { 256249259Sdim const PassInfo *PI = Pass::lookupPassInfo(Arg); 257249259Sdim // If the pass exists, preserve it. Otherwise silently do nothing. 258249259Sdim if (PI) Preserved.push_back(PI->getTypeInfo()); 259249259Sdim return *this; 260249259Sdim} 261249259Sdim 262249259SdimAnalysisUsage &AnalysisUsage::addRequiredID(const void *ID) { 263249259Sdim Required.push_back(ID); 264249259Sdim return *this; 265249259Sdim} 266249259Sdim 267249259SdimAnalysisUsage &AnalysisUsage::addRequiredID(char &ID) { 268249259Sdim Required.push_back(&ID); 269249259Sdim return *this; 270249259Sdim} 271249259Sdim 272249259SdimAnalysisUsage &AnalysisUsage::addRequiredTransitiveID(char &ID) { 273249259Sdim Required.push_back(&ID); 274249259Sdim RequiredTransitive.push_back(&ID); 275249259Sdim return *this; 276249259Sdim} 277