[PM] Simplify the IR printing passes significantly now that a narrower
[oota-llvm.git] / lib / IR / IRPrintingPasses.cpp
1 //===--- IRPrintingPasses.cpp - Module and Function printing passes -------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // PrintModulePass and PrintFunctionPass implementations.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "llvm/IR/IRPrintingPasses.h"
15 #include "llvm/IR/Function.h"
16 #include "llvm/IR/Module.h"
17 #include "llvm/Pass.h"
18 #include "llvm/Support/Debug.h"
19 #include "llvm/Support/raw_ostream.h"
20 using namespace llvm;
21
22 namespace {
23
24 class PrintModulePass : public ModulePass {
25   raw_ostream &Out;
26   std::string Banner;
27
28 public:
29   static char ID;
30   PrintModulePass() : ModulePass(ID), Out(dbgs()) {}
31   PrintModulePass(raw_ostream &Out, const std::string &Banner)
32       : ModulePass(ID), Out(Out), Banner(Banner) {}
33
34   bool runOnModule(Module &M) {
35     Out << Banner << M;
36     return false;
37   }
38
39   virtual void getAnalysisUsage(AnalysisUsage &AU) const {
40     AU.setPreservesAll();
41   }
42 };
43
44 class PrintFunctionPass : public FunctionPass {
45   raw_ostream &Out;
46   std::string Banner;
47
48 public:
49   static char ID;
50   PrintFunctionPass() : FunctionPass(ID), Out(dbgs()) {}
51   PrintFunctionPass(raw_ostream &Out, const std::string &Banner)
52       : FunctionPass(ID), Out(Out), Banner(Banner) {}
53
54   // This pass just prints a banner followed by the function as it's processed.
55   bool runOnFunction(Function &F) {
56     Out << Banner << static_cast<Value &>(F);
57     return false;
58   }
59
60   virtual void getAnalysisUsage(AnalysisUsage &AU) const {
61     AU.setPreservesAll();
62   }
63 };
64
65 class PrintBasicBlockPass : public BasicBlockPass {
66   raw_ostream &Out;
67   std::string Banner;
68
69 public:
70   static char ID;
71   PrintBasicBlockPass() : BasicBlockPass(ID), Out(dbgs()) {}
72   PrintBasicBlockPass(raw_ostream &Out, const std::string &Banner)
73       : BasicBlockPass(ID), Out(Out), Banner(Banner) {}
74
75   bool runOnBasicBlock(BasicBlock &BB) {
76     Out << Banner << BB;
77     return false;
78   }
79
80   virtual void getAnalysisUsage(AnalysisUsage &AU) const {
81     AU.setPreservesAll();
82   }
83 };
84
85 }
86
87 char PrintModulePass::ID = 0;
88 INITIALIZE_PASS(PrintModulePass, "print-module", "Print module to stderr",
89                 false, false)
90 char PrintFunctionPass::ID = 0;
91 INITIALIZE_PASS(PrintFunctionPass, "print-function", "Print function to stderr",
92                 false, false)
93 char PrintBasicBlockPass::ID = 0;
94 INITIALIZE_PASS(PrintBasicBlockPass, "print-bb", "Print BB to stderr", false,
95                 false)
96
97 ModulePass *llvm::createPrintModulePass(llvm::raw_ostream &OS,
98                                         const std::string &Banner) {
99   return new PrintModulePass(OS, Banner);
100 }
101
102 FunctionPass *llvm::createPrintFunctionPass(llvm::raw_ostream &OS,
103                                             const std::string &Banner) {
104   return new PrintFunctionPass(OS, Banner);
105 }
106
107 BasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream &OS,
108                                                 const std::string &Banner) {
109   return new PrintBasicBlockPass(OS, Banner);
110 }