summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/opt/CMakeLists.txt1
-rw-r--r--tools/opt/PassPrinters.cpp260
-rw-r--r--tools/opt/PassPrinters.h47
-rw-r--r--tools/opt/opt.cpp213
4 files changed, 315 insertions, 206 deletions
diff --git a/tools/opt/CMakeLists.txt b/tools/opt/CMakeLists.txt
index c007e0fa2e..6e7bea78f1 100644
--- a/tools/opt/CMakeLists.txt
+++ b/tools/opt/CMakeLists.txt
@@ -25,6 +25,7 @@ add_llvm_tool(opt
GraphPrinters.cpp
NewPMDriver.cpp
Passes.cpp
+ PassPrinters.cpp
PrintSCC.cpp
opt.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 <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);
+}
diff --git a/tools/opt/PassPrinters.h b/tools/opt/PassPrinters.h
new file mode 100644
index 0000000000..cf46ef9e36
--- /dev/null
+++ b/tools/opt/PassPrinters.h
@@ -0,0 +1,47 @@
+//===- PassPrinters.h - 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.
+///
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_TOOLS_OPT_PASSPRINTERS_H
+#define LLVM_TOOLS_OPT_PASSPRINTERS_H
+
+namespace llvm {
+
+class BasicBlockPass;
+class CallGraphSCCPass;
+class FunctionPass;
+class ModulePass;
+class LoopPass;
+class PassInfo;
+class RegionPass;
+class raw_ostream;
+
+FunctionPass *createFunctionPassPrinter(const PassInfo *PI, raw_ostream &out,
+ bool Quiet);
+
+CallGraphSCCPass *createCallGraphPassPrinter(const PassInfo *PI,
+ raw_ostream &out, bool Quiet);
+
+ModulePass *createModulePassPrinter(const PassInfo *PI, raw_ostream &out,
+ bool Quiet);
+
+LoopPass *createLoopPassPrinter(const PassInfo *PI, raw_ostream &out,
+ bool Quiet);
+
+RegionPass *createRegionPassPrinter(const PassInfo *PI, raw_ostream &out,
+ bool Quiet);
+
+BasicBlockPass *createBasicBlockPassPrinter(const PassInfo *PI,
+ raw_ostream &out, bool Quiet);
+}
+
+#endif // LLVM_TOOLS_OPT_PASSPRINTERS_H
diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp
index 782cac213f..49bb3c3b19 100644
--- a/tools/opt/opt.cpp
+++ b/tools/opt/opt.cpp
@@ -13,6 +13,7 @@
//===----------------------------------------------------------------------===//
#include "NewPMDriver.h"
+#include "PassPrinters.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/ADT/Triple.h"
#include "llvm/Analysis/CallGraph.h"
@@ -183,208 +184,8 @@ DefaultDataLayout("default-data-layout",
cl::desc("data layout string to use if not specified by module"),
cl::value_desc("layout-string"), cl::init(""));
-// ---------- Define Printers for module and function passes ------------
namespace {
-struct CallGraphSCCPassPrinter : public CallGraphSCCPass {
- static char ID;
- const PassInfo *PassToPrint;
- raw_ostream &Out;
- std::string PassName;
-
- CallGraphSCCPassPrinter(const PassInfo *PI, raw_ostream &out) :
- CallGraphSCCPass(ID), PassToPrint(PI), Out(out) {
- std::string PassToPrintName = PassToPrint->getPassName();
- PassName = "CallGraphSCCPass Printer: " + PassToPrintName;
- }
-
- virtual bool runOnSCC(CallGraphSCC &SCC) {
- if (!Quiet)
- 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;
-
- ModulePassPrinter(const PassInfo *PI, raw_ostream &out)
- : ModulePass(ID), PassToPrint(PI), Out(out) {
- std::string PassToPrintName = PassToPrint->getPassName();
- PassName = "ModulePass Printer: " + PassToPrintName;
- }
-
- virtual bool runOnModule(Module &M) {
- if (!Quiet)
- 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 FunctionPassPrinter : public FunctionPass {
- const PassInfo *PassToPrint;
- raw_ostream &Out;
- static char ID;
- std::string PassName;
-
- FunctionPassPrinter(const PassInfo *PI, raw_ostream &out)
- : FunctionPass(ID), PassToPrint(PI), Out(out) {
- std::string PassToPrintName = PassToPrint->getPassName();
- PassName = "FunctionPass Printer: " + PassToPrintName;
- }
-
- virtual bool runOnFunction(Function &F) {
- if (!Quiet)
- 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 LoopPassPrinter : public LoopPass {
- static char ID;
- const PassInfo *PassToPrint;
- raw_ostream &Out;
- std::string PassName;
-
- LoopPassPrinter(const PassInfo *PI, raw_ostream &out) :
- LoopPass(ID), PassToPrint(PI), Out(out) {
- std::string PassToPrintName = PassToPrint->getPassName();
- PassName = "LoopPass Printer: " + PassToPrintName;
- }
-
-
- virtual bool runOnLoop(Loop *L, LPPassManager &LPM) {
- if (!Quiet)
- 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;
-
- RegionPassPrinter(const PassInfo *PI, raw_ostream &out) : RegionPass(ID),
- PassToPrint(PI), Out(out) {
- std::string PassToPrintName = PassToPrint->getPassName();
- PassName = "RegionPass Printer: " + PassToPrintName;
- }
-
- virtual bool runOnRegion(Region *R, RGPassManager &RGM) {
- if (!Quiet) {
- 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;
-
- BasicBlockPassPrinter(const PassInfo *PI, raw_ostream &out)
- : BasicBlockPass(ID), PassToPrint(PI), Out(out) {
- std::string PassToPrintName = PassToPrint->getPassName();
- PassName = "BasicBlockPass Printer: " + PassToPrintName;
- }
-
- virtual bool runOnBasicBlock(BasicBlock &BB) {
- if (!Quiet)
- 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;
-
struct BreakpointPrinter : public ModulePass {
raw_ostream &Out;
static char ID;
@@ -815,22 +616,22 @@ int main(int argc, char **argv) {
if (AnalyzeOnly) {
switch (Kind) {
case PT_BasicBlock:
- Passes.add(new BasicBlockPassPrinter(PassInf, Out->os()));
+ Passes.add(createBasicBlockPassPrinter(PassInf, Out->os(), Quiet));
break;
case PT_Region:
- Passes.add(new RegionPassPrinter(PassInf, Out->os()));
+ Passes.add(createRegionPassPrinter(PassInf, Out->os(), Quiet));
break;
case PT_Loop:
- Passes.add(new LoopPassPrinter(PassInf, Out->os()));
+ Passes.add(createLoopPassPrinter(PassInf, Out->os(), Quiet));
break;
case PT_Function:
- Passes.add(new FunctionPassPrinter(PassInf, Out->os()));
+ Passes.add(createFunctionPassPrinter(PassInf, Out->os(), Quiet));
break;
case PT_CallGraphSCC:
- Passes.add(new CallGraphSCCPassPrinter(PassInf, Out->os()));
+ Passes.add(createCallGraphPassPrinter(PassInf, Out->os(), Quiet));
break;
default:
- Passes.add(new ModulePassPrinter(PassInf, Out->os()));
+ Passes.add(createModulePassPrinter(PassInf, Out->os(), Quiet));
break;
}
}