| //===- PassPrinters.cpp - Utilities to print analysis info for passes -----===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| /// |
| /// \file |
| /// Utilities to print analysis info for various kinds of passes. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #include "PassPrinters.h" |
| #include "llvm/Analysis/CallGraph.h" |
| #include "llvm/Analysis/CallGraphSCCPass.h" |
| #include "llvm/Analysis/LoopInfo.h" |
| #include "llvm/Analysis/LoopPass.h" |
| #include "llvm/Analysis/RegionInfo.h" |
| #include "llvm/Analysis/RegionPass.h" |
| #include "llvm/IR/BasicBlock.h" |
| #include "llvm/IR/Function.h" |
| #include "llvm/Pass.h" |
| #include "llvm/Support/raw_ostream.h" |
| #include <string> |
| |
| using namespace llvm; |
| |
| namespace { |
| |
| struct FunctionPassPrinter : public FunctionPass { |
| const PassInfo *PassToPrint; |
| raw_ostream &Out; |
| static char ID; |
| std::string PassName; |
| bool QuietPass; |
| |
| FunctionPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet) |
| : FunctionPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) { |
| std::string PassToPrintName = PassToPrint->getPassName(); |
| PassName = "FunctionPass Printer: " + PassToPrintName; |
| } |
| |
| bool runOnFunction(Function &F) override { |
| if (!QuietPass) |
| Out << "Printing analysis '" << PassToPrint->getPassName() |
| << "' for function '" << F.getName() << "':\n"; |
| |
| // Get and print pass... |
| getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, F.getParent()); |
| return false; |
| } |
| |
| StringRef getPassName() const override { return PassName; } |
| |
| void getAnalysisUsage(AnalysisUsage &AU) const override { |
| AU.addRequiredID(PassToPrint->getTypeInfo()); |
| AU.setPreservesAll(); |
| } |
| }; |
| |
| char FunctionPassPrinter::ID = 0; |
| |
| struct CallGraphSCCPassPrinter : public CallGraphSCCPass { |
| static char ID; |
| const PassInfo *PassToPrint; |
| raw_ostream &Out; |
| std::string PassName; |
| bool QuietPass; |
| |
| CallGraphSCCPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet) |
| : CallGraphSCCPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) { |
| std::string PassToPrintName = PassToPrint->getPassName(); |
| PassName = "CallGraphSCCPass Printer: " + PassToPrintName; |
| } |
| |
| bool runOnSCC(CallGraphSCC &SCC) override { |
| if (!QuietPass) |
| Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n"; |
| |
| // Get and print pass... |
| for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) { |
| Function *F = (*I)->getFunction(); |
| if (F) |
| getAnalysisID<Pass>(PassToPrint->getTypeInfo()) |
| .print(Out, F->getParent()); |
| } |
| return false; |
| } |
| |
| StringRef getPassName() const override { return PassName; } |
| |
| void getAnalysisUsage(AnalysisUsage &AU) const override { |
| AU.addRequiredID(PassToPrint->getTypeInfo()); |
| AU.setPreservesAll(); |
| } |
| }; |
| |
| char CallGraphSCCPassPrinter::ID = 0; |
| |
| struct ModulePassPrinter : public ModulePass { |
| static char ID; |
| const PassInfo *PassToPrint; |
| raw_ostream &Out; |
| std::string PassName; |
| bool QuietPass; |
| |
| ModulePassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet) |
| : ModulePass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) { |
| std::string PassToPrintName = PassToPrint->getPassName(); |
| PassName = "ModulePass Printer: " + PassToPrintName; |
| } |
| |
| bool runOnModule(Module &M) override { |
| if (!QuietPass) |
| Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n"; |
| |
| // Get and print pass... |
| getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, &M); |
| return false; |
| } |
| |
| StringRef getPassName() const override { return PassName; } |
| |
| void getAnalysisUsage(AnalysisUsage &AU) const override { |
| AU.addRequiredID(PassToPrint->getTypeInfo()); |
| AU.setPreservesAll(); |
| } |
| }; |
| |
| char ModulePassPrinter::ID = 0; |
| |
| struct LoopPassPrinter : public LoopPass { |
| static char ID; |
| const PassInfo *PassToPrint; |
| raw_ostream &Out; |
| std::string PassName; |
| bool QuietPass; |
| |
| LoopPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet) |
| : LoopPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) { |
| std::string PassToPrintName = PassToPrint->getPassName(); |
| PassName = "LoopPass Printer: " + PassToPrintName; |
| } |
| |
| bool runOnLoop(Loop *L, LPPassManager &LPM) override { |
| if (!QuietPass) |
| Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n"; |
| |
| // Get and print pass... |
| getAnalysisID<Pass>(PassToPrint->getTypeInfo()) |
| .print(Out, L->getHeader()->getParent()->getParent()); |
| return false; |
| } |
| |
| StringRef getPassName() const override { return PassName; } |
| |
| void getAnalysisUsage(AnalysisUsage &AU) const override { |
| AU.addRequiredID(PassToPrint->getTypeInfo()); |
| AU.setPreservesAll(); |
| } |
| }; |
| |
| char LoopPassPrinter::ID = 0; |
| |
| struct RegionPassPrinter : public RegionPass { |
| static char ID; |
| const PassInfo *PassToPrint; |
| raw_ostream &Out; |
| std::string PassName; |
| bool QuietPass; |
| |
| RegionPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet) |
| : RegionPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) { |
| std::string PassToPrintName = PassToPrint->getPassName(); |
| PassName = "RegionPass Printer: " + PassToPrintName; |
| } |
| |
| bool runOnRegion(Region *R, RGPassManager &RGM) override { |
| if (!QuietPass) { |
| Out << "Printing analysis '" << PassToPrint->getPassName() << "' for " |
| << "region: '" << R->getNameStr() << "' in function '" |
| << R->getEntry()->getParent()->getName() << "':\n"; |
| } |
| // Get and print pass... |
| getAnalysisID<Pass>(PassToPrint->getTypeInfo()) |
| .print(Out, R->getEntry()->getParent()->getParent()); |
| return false; |
| } |
| |
| StringRef getPassName() const override { return PassName; } |
| |
| void getAnalysisUsage(AnalysisUsage &AU) const override { |
| AU.addRequiredID(PassToPrint->getTypeInfo()); |
| AU.setPreservesAll(); |
| } |
| }; |
| |
| char RegionPassPrinter::ID = 0; |
| |
| struct BasicBlockPassPrinter : public BasicBlockPass { |
| const PassInfo *PassToPrint; |
| raw_ostream &Out; |
| static char ID; |
| std::string PassName; |
| bool QuietPass; |
| |
| BasicBlockPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet) |
| : BasicBlockPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) { |
| std::string PassToPrintName = PassToPrint->getPassName(); |
| PassName = "BasicBlockPass Printer: " + PassToPrintName; |
| } |
| |
| bool runOnBasicBlock(BasicBlock &BB) override { |
| if (!QuietPass) |
| Out << "Printing Analysis info for BasicBlock '" << BB.getName() |
| << "': Pass " << PassToPrint->getPassName() << ":\n"; |
| |
| // Get and print pass... |
| getAnalysisID<Pass>(PassToPrint->getTypeInfo()) |
| .print(Out, BB.getParent()->getParent()); |
| return false; |
| } |
| |
| StringRef getPassName() const override { return PassName; } |
| |
| void getAnalysisUsage(AnalysisUsage &AU) const override { |
| AU.addRequiredID(PassToPrint->getTypeInfo()); |
| AU.setPreservesAll(); |
| } |
| }; |
| |
| char BasicBlockPassPrinter::ID = 0; |
| |
| } // end anonymous namespace |
| |
| FunctionPass *llvm::createFunctionPassPrinter(const PassInfo *PI, |
| raw_ostream &OS, bool Quiet) { |
| return new FunctionPassPrinter(PI, OS, Quiet); |
| } |
| |
| CallGraphSCCPass *llvm::createCallGraphPassPrinter(const PassInfo *PI, |
| raw_ostream &OS, |
| bool Quiet) { |
| return new CallGraphSCCPassPrinter(PI, OS, Quiet); |
| } |
| |
| ModulePass *llvm::createModulePassPrinter(const PassInfo *PI, raw_ostream &OS, |
| bool Quiet) { |
| return new ModulePassPrinter(PI, OS, Quiet); |
| } |
| |
| LoopPass *llvm::createLoopPassPrinter(const PassInfo *PI, raw_ostream &OS, |
| bool Quiet) { |
| return new LoopPassPrinter(PI, OS, Quiet); |
| } |
| |
| RegionPass *llvm::createRegionPassPrinter(const PassInfo *PI, raw_ostream &OS, |
| bool Quiet) { |
| return new RegionPassPrinter(PI, OS, Quiet); |
| } |
| |
| BasicBlockPass *llvm::createBasicBlockPassPrinter(const PassInfo *PI, |
| raw_ostream &OS, bool Quiet) { |
| return new BasicBlockPassPrinter(PI, OS, Quiet); |
| } |