From 8ed971b988512f059ac2cdf11f469b04d54f4f11 Mon Sep 17 00:00:00 2001 From: Eli Bendersky Date: Mon, 10 Feb 2014 23:34:23 +0000 Subject: Move the *PassPrinter into their own module. These are self-contained in functionality so it makes sense to separate them, as opt.cpp has grown quite big already. Following Eric's suggestions, if this code is ever deemed useful outside of tools/opt, it will make sense to move it to one of the LLVM libraries like IR. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201116 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/opt/PassPrinters.cpp | 260 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 260 insertions(+) create mode 100644 tools/opt/PassPrinters.cpp (limited to 'tools/opt/PassPrinters.cpp') diff --git a/tools/opt/PassPrinters.cpp b/tools/opt/PassPrinters.cpp new file mode 100644 index 0000000000..c91d6c837c --- /dev/null +++ b/tools/opt/PassPrinters.cpp @@ -0,0 +1,260 @@ +//===- 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 +/// \brief Utilities to print analysis info for various kinds of passes. +/// +//===----------------------------------------------------------------------===// +#include "PassPrinters.h" +#include "llvm/Analysis/CallGraphSCCPass.h" +#include "llvm/Analysis/LoopPass.h" +#include "llvm/Analysis/RegionPass.h" +#include "llvm/Pass.h" +#include "llvm/IR/Function.h" +#include + +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; + } + + virtual bool runOnFunction(Function &F) { + if (!QuietPass) + Out << "Printing analysis '" << PassToPrint->getPassName() + << "' for function '" << F.getName() << "':\n"; + + // Get and print pass... + getAnalysisID(PassToPrint->getTypeInfo()).print(Out, F.getParent()); + return false; + } + + virtual const char *getPassName() const { return PassName.c_str(); } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + 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; + } + + virtual bool runOnSCC(CallGraphSCC &SCC) { + 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(PassToPrint->getTypeInfo()) + .print(Out, F->getParent()); + } + return false; + } + + virtual const char *getPassName() const { return PassName.c_str(); } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + 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; + } + + virtual bool runOnModule(Module &M) { + if (!QuietPass) + Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n"; + + // Get and print pass... + getAnalysisID(PassToPrint->getTypeInfo()).print(Out, &M); + return false; + } + + virtual const char *getPassName() const { return PassName.c_str(); } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + 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; + } + + virtual bool runOnLoop(Loop *L, LPPassManager &LPM) { + if (!QuietPass) + Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n"; + + // Get and print pass... + getAnalysisID(PassToPrint->getTypeInfo()) + .print(Out, L->getHeader()->getParent()->getParent()); + return false; + } + + virtual const char *getPassName() const { return PassName.c_str(); } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + 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; + } + + virtual bool runOnRegion(Region *R, RGPassManager &RGM) { + if (!QuietPass) { + Out << "Printing analysis '" << PassToPrint->getPassName() << "' for " + << "region: '" << R->getNameStr() << "' in function '" + << R->getEntry()->getParent()->getName() << "':\n"; + } + // Get and print pass... + getAnalysisID(PassToPrint->getTypeInfo()) + .print(Out, R->getEntry()->getParent()->getParent()); + return false; + } + + virtual const char *getPassName() const { return PassName.c_str(); } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + 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; + } + + virtual bool runOnBasicBlock(BasicBlock &BB) { + if (!QuietPass) + Out << "Printing Analysis info for BasicBlock '" << BB.getName() + << "': Pass " << PassToPrint->getPassName() << ":\n"; + + // Get and print pass... + getAnalysisID(PassToPrint->getTypeInfo()) + .print(Out, BB.getParent()->getParent()); + return false; + } + + virtual const char *getPassName() const { return PassName.c_str(); } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequiredID(PassToPrint->getTypeInfo()); + AU.setPreservesAll(); + } +}; + +char BasicBlockPassPrinter::ID = 0; +} + +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); +} -- cgit v1.2.3