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