136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===- PassPrinters.cpp - Utilities to print analysis info for passes -----===//
236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//                     The LLVM Compiler Infrastructure
436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source
636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details.
736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===//
936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines///
1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// \file
1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// \brief Utilities to print analysis info for various kinds of passes.
1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines///
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===//
1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "PassPrinters.h"
1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Analysis/CallGraphSCCPass.h"
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Analysis/LoopPass.h"
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Analysis/RegionPass.h"
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Function.h"
1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Pass.h"
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include <string>
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesusing namespace llvm;
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace {
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct FunctionPassPrinter : public FunctionPass {
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const PassInfo *PassToPrint;
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  raw_ostream &Out;
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static char ID;
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::string PassName;
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool QuietPass;
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  FunctionPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      : FunctionPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    std::string PassToPrintName = PassToPrint->getPassName();
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    PassName = "FunctionPass Printer: " + PassToPrintName;
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool runOnFunction(Function &F) override {
4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (!QuietPass)
4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Out << "Printing analysis '" << PassToPrint->getPassName()
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          << "' for function '" << F.getName() << "':\n";
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Get and print pass...
4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, F.getParent());
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return false;
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const char *getPassName() const override { return PassName.c_str(); }
5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void getAnalysisUsage(AnalysisUsage &AU) const override {
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    AU.addRequiredID(PassToPrint->getTypeInfo());
5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    AU.setPreservesAll();
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineschar FunctionPassPrinter::ID = 0;
5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct CallGraphSCCPassPrinter : public CallGraphSCCPass {
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static char ID;
6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const PassInfo *PassToPrint;
6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  raw_ostream &Out;
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::string PassName;
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool QuietPass;
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  CallGraphSCCPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      : CallGraphSCCPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    std::string PassToPrintName = PassToPrint->getPassName();
6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    PassName = "CallGraphSCCPass Printer: " + PassToPrintName;
7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool runOnSCC(CallGraphSCC &SCC) override {
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (!QuietPass)
7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Get and print pass...
7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Function *F = (*I)->getFunction();
7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      if (F)
8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        getAnalysisID<Pass>(PassToPrint->getTypeInfo())
8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            .print(Out, F->getParent());
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return false;
8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const char *getPassName() const override { return PassName.c_str(); }
8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void getAnalysisUsage(AnalysisUsage &AU) const override {
8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    AU.addRequiredID(PassToPrint->getTypeInfo());
9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    AU.setPreservesAll();
9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineschar CallGraphSCCPassPrinter::ID = 0;
9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct ModulePassPrinter : public ModulePass {
9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static char ID;
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const PassInfo *PassToPrint;
9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  raw_ostream &Out;
10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::string PassName;
10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool QuietPass;
10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  ModulePassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      : ModulePass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    std::string PassToPrintName = PassToPrint->getPassName();
10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    PassName = "ModulePass Printer: " + PassToPrintName;
10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool runOnModule(Module &M) override {
11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (!QuietPass)
11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Get and print pass...
11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, &M);
11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return false;
11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const char *getPassName() const override { return PassName.c_str(); }
11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void getAnalysisUsage(AnalysisUsage &AU) const override {
12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    AU.addRequiredID(PassToPrint->getTypeInfo());
12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    AU.setPreservesAll();
12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineschar ModulePassPrinter::ID = 0;
12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct LoopPassPrinter : public LoopPass {
12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static char ID;
13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const PassInfo *PassToPrint;
13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  raw_ostream &Out;
13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::string PassName;
13336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool QuietPass;
13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  LoopPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      : LoopPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    std::string PassToPrintName = PassToPrint->getPassName();
13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    PassName = "LoopPass Printer: " + PassToPrintName;
13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
14136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool runOnLoop(Loop *L, LPPassManager &LPM) override {
14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (!QuietPass)
14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
14536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Get and print pass...
14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    getAnalysisID<Pass>(PassToPrint->getTypeInfo())
14736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        .print(Out, L->getHeader()->getParent()->getParent());
14836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return false;
14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
15136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const char *getPassName() const override { return PassName.c_str(); }
15236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void getAnalysisUsage(AnalysisUsage &AU) const override {
15436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    AU.addRequiredID(PassToPrint->getTypeInfo());
15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    AU.setPreservesAll();
15636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineschar LoopPassPrinter::ID = 0;
16036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
16136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct RegionPassPrinter : public RegionPass {
16236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static char ID;
16336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const PassInfo *PassToPrint;
16436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  raw_ostream &Out;
16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::string PassName;
16636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool QuietPass;
16736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
16836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  RegionPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
16936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      : RegionPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
17036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    std::string PassToPrintName = PassToPrint->getPassName();
17136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    PassName = "RegionPass Printer: " + PassToPrintName;
17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
17336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool runOnRegion(Region *R, RGPassManager &RGM) override {
17536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (!QuietPass) {
17636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Out << "Printing analysis '" << PassToPrint->getPassName() << "' for "
17736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          << "region: '" << R->getNameStr() << "' in function '"
17836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          << R->getEntry()->getParent()->getName() << "':\n";
17936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    }
18036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Get and print pass...
18136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    getAnalysisID<Pass>(PassToPrint->getTypeInfo())
18236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        .print(Out, R->getEntry()->getParent()->getParent());
18336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return false;
18436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
18536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const char *getPassName() const override { return PassName.c_str(); }
18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
18836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void getAnalysisUsage(AnalysisUsage &AU) const override {
18936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    AU.addRequiredID(PassToPrint->getTypeInfo());
19036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    AU.setPreservesAll();
19136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
19336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
19436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineschar RegionPassPrinter::ID = 0;
19536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
19636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct BasicBlockPassPrinter : public BasicBlockPass {
19736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const PassInfo *PassToPrint;
19836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  raw_ostream &Out;
19936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static char ID;
20036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::string PassName;
20136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool QuietPass;
20236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
20336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  BasicBlockPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
20436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      : BasicBlockPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
20536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    std::string PassToPrintName = PassToPrint->getPassName();
20636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    PassName = "BasicBlockPass Printer: " + PassToPrintName;
20736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
20836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
20936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool runOnBasicBlock(BasicBlock &BB) override {
21036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (!QuietPass)
21136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Out << "Printing Analysis info for BasicBlock '" << BB.getName()
21236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines          << "': Pass " << PassToPrint->getPassName() << ":\n";
21336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
21436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    // Get and print pass...
21536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    getAnalysisID<Pass>(PassToPrint->getTypeInfo())
21636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        .print(Out, BB.getParent()->getParent());
21736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return false;
21836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
21936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const char *getPassName() const override { return PassName.c_str(); }
22136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
22236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void getAnalysisUsage(AnalysisUsage &AU) const override {
22336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    AU.addRequiredID(PassToPrint->getTypeInfo());
22436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    AU.setPreservesAll();
22536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
22736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
22836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineschar BasicBlockPassPrinter::ID = 0;
22936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
23136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesFunctionPass *llvm::createFunctionPassPrinter(const PassInfo *PI,
23236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                              raw_ostream &OS, bool Quiet) {
23336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return new FunctionPassPrinter(PI, OS, Quiet);
23436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
23536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
23636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesCallGraphSCCPass *llvm::createCallGraphPassPrinter(const PassInfo *PI,
23736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                   raw_ostream &OS,
23836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                   bool Quiet) {
23936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return new CallGraphSCCPassPrinter(PI, OS, Quiet);
24036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
24136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
24236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesModulePass *llvm::createModulePassPrinter(const PassInfo *PI, raw_ostream &OS,
24336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                          bool Quiet) {
24436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return new ModulePassPrinter(PI, OS, Quiet);
24536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
24636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
24736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesLoopPass *llvm::createLoopPassPrinter(const PassInfo *PI, raw_ostream &OS,
24836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                      bool Quiet) {
24936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return new LoopPassPrinter(PI, OS, Quiet);
25036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
25136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
25236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesRegionPass *llvm::createRegionPassPrinter(const PassInfo *PI, raw_ostream &OS,
25336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                          bool Quiet) {
25436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return new RegionPassPrinter(PI, OS, Quiet);
25536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
25636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
25736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesBasicBlockPass *llvm::createBasicBlockPassPrinter(const PassInfo *PI,
25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                                  raw_ostream &OS, bool Quiet) {
25936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  return new BasicBlockPassPrinter(PI, OS, Quiet);
26036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
261