Pass.cpp revision 249259
179968Sobrien//===- Pass.cpp - LLVM Pass Infrastructure Implementation -----------------===// 279968Sobrien// 379968Sobrien// The LLVM Compiler Infrastructure 479968Sobrien// 579968Sobrien// This file is distributed under the University of Illinois Open Source 679968Sobrien// License. See LICENSE.TXT for details. 779968Sobrien// 879968Sobrien//===----------------------------------------------------------------------===// 979968Sobrien// 1079968Sobrien// This file implements the LLVM Pass infrastructure. It is primarily 1179968Sobrien// responsible with ensuring that passes are executed and batched together 1279968Sobrien// optimally. 1379968Sobrien// 1479968Sobrien//===----------------------------------------------------------------------===// 1579968Sobrien 1679968Sobrien#include "llvm/Pass.h" 1779968Sobrien#include "llvm/Assembly/PrintModulePass.h" 1879968Sobrien#include "llvm/PassRegistry.h" 1979968Sobrien#include "llvm/Support/Debug.h" 2079968Sobrien#include "llvm/Support/PassNameParser.h" 2179968Sobrien#include "llvm/Support/raw_ostream.h" 2279968Sobrienusing namespace llvm; 2379968Sobrien 2479968Sobrien//===----------------------------------------------------------------------===// 2579968Sobrien// Pass Implementation 2679968Sobrien// 2779968Sobrien 2879968Sobrien// Force out-of-line virtual method. 2979968SobrienPass::~Pass() { 3079968Sobrien delete Resolver; 3179968Sobrien} 3279968Sobrien 3379968Sobrien// Force out-of-line virtual method. 3479968SobrienModulePass::~ModulePass() { } 3579968Sobrien 3679968SobrienPass *ModulePass::createPrinterPass(raw_ostream &O, 3779968Sobrien const std::string &Banner) const { 3879968Sobrien return createPrintModulePass(&O, false, Banner); 3979968Sobrien} 4079968Sobrien 4179968SobrienPassManagerType ModulePass::getPotentialPassManagerType() const { 4279968Sobrien return PMT_ModulePassManager; 4379968Sobrien} 4479968Sobrien 4579968Sobrienbool Pass::mustPreserveAnalysisID(char &AID) const { 4679968Sobrien return Resolver->getAnalysisIfAvailable(&AID, true) != 0; 4779968Sobrien} 4879968Sobrien 4979968Sobrien// dumpPassStructure - Implement the -debug-pass=Structure option 5079968Sobrienvoid Pass::dumpPassStructure(unsigned Offset) { 5179968Sobrien dbgs().indent(Offset*2) << getPassName() << "\n"; 5279968Sobrien} 5379968Sobrien 5479968Sobrien/// getPassName - Return a nice clean name for a pass. This usually 5579968Sobrien/// implemented in terms of the name that is registered by one of the 5679968Sobrien/// Registration templates, but can be overloaded directly. 5779968Sobrien/// 5879968Sobrienconst char *Pass::getPassName() const { 5979968Sobrien AnalysisID AID = getPassID(); 6079968Sobrien const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(AID); 6179968Sobrien if (PI) 6279968Sobrien return PI->getPassName(); 6379968Sobrien return "Unnamed pass: implement Pass::getPassName()"; 6479968Sobrien} 6579968Sobrien 6679968Sobrienvoid Pass::preparePassManager(PMStack &) { 6779968Sobrien // By default, don't do anything. 6879968Sobrien} 6979968Sobrien 7079968SobrienPassManagerType Pass::getPotentialPassManagerType() const { 7179968Sobrien // Default implementation. 7279968Sobrien return PMT_Unknown; 7379968Sobrien} 7479968Sobrien 7579968Sobrienvoid Pass::getAnalysisUsage(AnalysisUsage &) const { 7679968Sobrien // By default, no analysis results are used, all are invalidated. 7779968Sobrien} 7879968Sobrien 7979968Sobrienvoid Pass::releaseMemory() { 8079968Sobrien // By default, don't do anything. 8179968Sobrien} 8279968Sobrien 8379968Sobrienvoid Pass::verifyAnalysis() const { 8479968Sobrien // By default, don't do anything. 8579968Sobrien} 8679968Sobrien 8779968Sobrienvoid *Pass::getAdjustedAnalysisPointer(AnalysisID AID) { 8879968Sobrien return this; 8979968Sobrien} 9079968Sobrien 9179968SobrienImmutablePass *Pass::getAsImmutablePass() { 9279968Sobrien return 0; 9379968Sobrien} 9479968Sobrien 9579968SobrienPMDataManager *Pass::getAsPMDataManager() { 9679968Sobrien return 0; 9779968Sobrien} 9879968Sobrien 9979968Sobrienvoid Pass::setResolver(AnalysisResolver *AR) { 10079968Sobrien assert(!Resolver && "Resolver is already set"); 10179968Sobrien Resolver = AR; 10279968Sobrien} 10379968Sobrien 10479968Sobrien// print - Print out the internal state of the pass. This is called by Analyze 10579968Sobrien// to print out the contents of an analysis. Otherwise it is not necessary to 10679968Sobrien// implement this method. 10779968Sobrien// 10879968Sobrienvoid Pass::print(raw_ostream &O,const Module*) const { 10979968Sobrien O << "Pass::print not implemented for pass: '" << getPassName() << "'!\n"; 11079968Sobrien} 11179968Sobrien 11279968Sobrien// dump - call print(cerr); 11379968Sobrienvoid Pass::dump() const { 11479968Sobrien print(dbgs(), 0); 11579968Sobrien} 11679968Sobrien 11779968Sobrien//===----------------------------------------------------------------------===// 11879968Sobrien// ImmutablePass Implementation 11979968Sobrien// 12079968Sobrien// Force out-of-line virtual method. 12179968SobrienImmutablePass::~ImmutablePass() { } 12279968Sobrien 12379968Sobrienvoid ImmutablePass::initializePass() { 12479968Sobrien // By default, don't do anything. 12579968Sobrien} 12679968Sobrien 12779968Sobrien//===----------------------------------------------------------------------===// 12879968Sobrien// FunctionPass Implementation 12979968Sobrien// 13079968Sobrien 13179968SobrienPass *FunctionPass::createPrinterPass(raw_ostream &O, 13279968Sobrien const std::string &Banner) const { 13379968Sobrien return createPrintFunctionPass(Banner, &O); 13479968Sobrien} 13579968Sobrien 13679968SobrienPassManagerType FunctionPass::getPotentialPassManagerType() const { 13779968Sobrien return PMT_FunctionPassManager; 13879968Sobrien} 13979968Sobrien 14079968Sobrien//===----------------------------------------------------------------------===// 14179968Sobrien// BasicBlockPass Implementation 14279968Sobrien// 14379968Sobrien 14479968SobrienPass *BasicBlockPass::createPrinterPass(raw_ostream &O, 14579968Sobrien const std::string &Banner) const { 14679968Sobrien return createPrintBasicBlockPass(&O, false, Banner); 14779968Sobrien} 14879968Sobrien 14979968Sobrienbool BasicBlockPass::doInitialization(Function &) { 15079968Sobrien // By default, don't do anything. 15179968Sobrien return false; 15279968Sobrien} 15379968Sobrien 15479968Sobrienbool BasicBlockPass::doFinalization(Function &) { 15579968Sobrien // By default, don't do anything. 15679968Sobrien return false; 15779968Sobrien} 15879968Sobrien 15979968SobrienPassManagerType BasicBlockPass::getPotentialPassManagerType() const { 16079968Sobrien return PMT_BasicBlockPassManager; 16179968Sobrien} 16279968Sobrien 16379968Sobrienconst PassInfo *Pass::lookupPassInfo(const void *TI) { 16479968Sobrien return PassRegistry::getPassRegistry()->getPassInfo(TI); 16579968Sobrien} 16679968Sobrien 16779968Sobrienconst PassInfo *Pass::lookupPassInfo(StringRef Arg) { 16879968Sobrien return PassRegistry::getPassRegistry()->getPassInfo(Arg); 16979968Sobrien} 17079968Sobrien 17179968SobrienPass *Pass::createPass(AnalysisID ID) { 17279968Sobrien const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(ID); 17379968Sobrien if (!PI) 17479968Sobrien return NULL; 17579968Sobrien return PI->createPass(); 17679968Sobrien} 17779968Sobrien 17879968SobrienPass *PassInfo::createPass() const { 17979968Sobrien assert((!isAnalysisGroup() || NormalCtor) && 18079968Sobrien "No default implementation found for analysis group!"); 18179968Sobrien assert(NormalCtor && 18279968Sobrien "Cannot call createPass on PassInfo without default ctor!"); 18379968Sobrien return NormalCtor(); 18479968Sobrien} 18579968Sobrien 18679968Sobrien//===----------------------------------------------------------------------===// 18779968Sobrien// Analysis Group Implementation Code 18879968Sobrien//===----------------------------------------------------------------------===// 18979968Sobrien 19079968Sobrien// RegisterAGBase implementation 19179968Sobrien// 19279968SobrienRegisterAGBase::RegisterAGBase(const char *Name, const void *InterfaceID, 19379968Sobrien const void *PassID, bool isDefault) 19479968Sobrien : PassInfo(Name, InterfaceID) { 19579968Sobrien PassRegistry::getPassRegistry()->registerAnalysisGroup(InterfaceID, PassID, 19679968Sobrien *this, isDefault); 19779968Sobrien} 19879968Sobrien 19979968Sobrien//===----------------------------------------------------------------------===// 20079968Sobrien// PassRegistrationListener implementation 20179968Sobrien// 20279968Sobrien 20379968Sobrien// PassRegistrationListener ctor - Add the current object to the list of 20479968Sobrien// PassRegistrationListeners... 20579968SobrienPassRegistrationListener::PassRegistrationListener() { 20679968Sobrien PassRegistry::getPassRegistry()->addRegistrationListener(this); 20779968Sobrien} 20879968Sobrien 20979968Sobrien// dtor - Remove object from list of listeners... 21079968SobrienPassRegistrationListener::~PassRegistrationListener() { 21179968Sobrien PassRegistry::getPassRegistry()->removeRegistrationListener(this); 21279968Sobrien} 21379968Sobrien 21479968Sobrien// enumeratePasses - Iterate over the registered passes, calling the 21579968Sobrien// passEnumerate callback on each PassInfo object. 21679968Sobrien// 21779968Sobrienvoid PassRegistrationListener::enumeratePasses() { 21879968Sobrien PassRegistry::getPassRegistry()->enumerateWith(this); 21979968Sobrien} 22079968Sobrien 22179968SobrienPassNameParser::~PassNameParser() {} 22279968Sobrien 22379968Sobrien//===----------------------------------------------------------------------===// 22479968Sobrien// AnalysisUsage Class Implementation 22579968Sobrien// 22679968Sobrien 22779968Sobriennamespace { 22879968Sobrien struct GetCFGOnlyPasses : public PassRegistrationListener { 22979968Sobrien typedef AnalysisUsage::VectorType VectorType; 23079968Sobrien VectorType &CFGOnlyList; 23179968Sobrien GetCFGOnlyPasses(VectorType &L) : CFGOnlyList(L) {} 23279968Sobrien 23379968Sobrien void passEnumerate(const PassInfo *P) { 23479968Sobrien if (P->isCFGOnlyPass()) 23579968Sobrien CFGOnlyList.push_back(P->getTypeInfo()); 23679968Sobrien } 23779968Sobrien }; 23879968Sobrien} 23979968Sobrien 24079968Sobrien// setPreservesCFG - This function should be called to by the pass, iff they do 24179968Sobrien// not: 24279968Sobrien// 24379968Sobrien// 1. Add or remove basic blocks from the function 24479968Sobrien// 2. Modify terminator instructions in any way. 24579968Sobrien// 24679968Sobrien// This function annotates the AnalysisUsage info object to say that analyses 24779968Sobrien// that only depend on the CFG are preserved by this pass. 24879968Sobrien// 24979968Sobrienvoid AnalysisUsage::setPreservesCFG() { 25079968Sobrien // Since this transformation doesn't modify the CFG, it preserves all analyses 25179968Sobrien // that only depend on the CFG (like dominators, loop info, etc...) 252 GetCFGOnlyPasses(Preserved).enumeratePasses(); 253} 254 255AnalysisUsage &AnalysisUsage::addPreserved(StringRef Arg) { 256 const PassInfo *PI = Pass::lookupPassInfo(Arg); 257 // If the pass exists, preserve it. Otherwise silently do nothing. 258 if (PI) Preserved.push_back(PI->getTypeInfo()); 259 return *this; 260} 261 262AnalysisUsage &AnalysisUsage::addRequiredID(const void *ID) { 263 Required.push_back(ID); 264 return *this; 265} 266 267AnalysisUsage &AnalysisUsage::addRequiredID(char &ID) { 268 Required.push_back(&ID); 269 return *this; 270} 271 272AnalysisUsage &AnalysisUsage::addRequiredTransitiveID(char &ID) { 273 Required.push_back(&ID); 274 RequiredTransitive.push_back(&ID); 275 return *this; 276} 277