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