summaryrefslogtreecommitdiff
path: root/tools/opt/PassPrinters.cpp
diff options
context:
space:
mode:
authorEli Bendersky <eliben@google.com>2014-02-10 23:34:23 +0000
committerEli Bendersky <eliben@google.com>2014-02-10 23:34:23 +0000
commit8ed971b988512f059ac2cdf11f469b04d54f4f11 (patch)
tree4029227454fed88421e3cd92879408c606cd888f /tools/opt/PassPrinters.cpp
parent1a66b635780c22de07bc2ce12e2ff832d6698668 (diff)
downloadllvm-8ed971b988512f059ac2cdf11f469b04d54f4f11.tar.gz
llvm-8ed971b988512f059ac2cdf11f469b04d54f4f11.tar.bz2
llvm-8ed971b988512f059ac2cdf11f469b04d54f4f11.tar.xz
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
Diffstat (limited to 'tools/opt/PassPrinters.cpp')
-rw-r--r--tools/opt/PassPrinters.cpp260
1 files changed, 260 insertions, 0 deletions
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 <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;
+ }
+
+ virtual bool runOnFunction(Function &F) {
+ 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;
+ }
+
+ 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<Pass>(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<Pass>(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<Pass>(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<Pass>(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<Pass>(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);
+}