1249259Sdim//===--- IR/PrintModulePass.cpp - Module/Function Printer -----------------===//
2249259Sdim//
3249259Sdim//                     The LLVM Compiler Infrastructure
4249259Sdim//
5249259Sdim// This file is distributed under the University of Illinois Open Source
6249259Sdim// License. See LICENSE.TXT for details.
7249259Sdim//
8249259Sdim//===----------------------------------------------------------------------===//
9249259Sdim//
10249259Sdim// PrintModulePass and PrintFunctionPass implementations.
11249259Sdim//
12249259Sdim//===----------------------------------------------------------------------===//
13249259Sdim
14249259Sdim#include "llvm/Assembly/PrintModulePass.h"
15249259Sdim#include "llvm/IR/Function.h"
16249259Sdim#include "llvm/IR/Module.h"
17249259Sdim#include "llvm/Pass.h"
18249259Sdim#include "llvm/Support/Debug.h"
19249259Sdim#include "llvm/Support/raw_ostream.h"
20249259Sdimusing namespace llvm;
21249259Sdim
22249259Sdimnamespace {
23249259Sdim
24249259Sdim  class PrintModulePass : public ModulePass {
25249259Sdim    std::string Banner;
26249259Sdim    raw_ostream *Out;       // raw_ostream to print on
27249259Sdim    bool DeleteStream;      // Delete the ostream in our dtor?
28249259Sdim  public:
29249259Sdim    static char ID;
30249259Sdim    PrintModulePass() : ModulePass(ID), Out(&dbgs()),
31249259Sdim      DeleteStream(false) {}
32249259Sdim    PrintModulePass(const std::string &B, raw_ostream *o, bool DS)
33249259Sdim        : ModulePass(ID), Banner(B), Out(o), DeleteStream(DS) {}
34249259Sdim
35249259Sdim    ~PrintModulePass() {
36249259Sdim      if (DeleteStream) delete Out;
37249259Sdim    }
38249259Sdim
39249259Sdim    bool runOnModule(Module &M) {
40249259Sdim      (*Out) << Banner << M;
41249259Sdim      return false;
42249259Sdim    }
43249259Sdim
44249259Sdim    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
45249259Sdim      AU.setPreservesAll();
46249259Sdim    }
47249259Sdim  };
48249259Sdim
49249259Sdim  class PrintFunctionPass : public FunctionPass {
50249259Sdim    std::string Banner;     // String to print before each function
51249259Sdim    raw_ostream *Out;       // raw_ostream to print on
52249259Sdim    bool DeleteStream;      // Delete the ostream in our dtor?
53249259Sdim  public:
54249259Sdim    static char ID;
55249259Sdim    PrintFunctionPass() : FunctionPass(ID), Banner(""), Out(&dbgs()),
56249259Sdim                          DeleteStream(false) {}
57249259Sdim    PrintFunctionPass(const std::string &B, raw_ostream *o, bool DS)
58249259Sdim      : FunctionPass(ID), Banner(B), Out(o), DeleteStream(DS) {}
59249259Sdim
60249259Sdim    ~PrintFunctionPass() {
61249259Sdim      if (DeleteStream) delete Out;
62249259Sdim    }
63249259Sdim
64249259Sdim    // runOnFunction - This pass just prints a banner followed by the
65249259Sdim    // function as it's processed.
66249259Sdim    //
67249259Sdim    bool runOnFunction(Function &F) {
68249259Sdim      (*Out) << Banner << static_cast<Value&>(F);
69249259Sdim      return false;
70249259Sdim    }
71249259Sdim
72249259Sdim    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
73249259Sdim      AU.setPreservesAll();
74249259Sdim    }
75249259Sdim  };
76249259Sdim
77249259Sdim  class PrintBasicBlockPass : public BasicBlockPass {
78249259Sdim    std::string Banner;
79249259Sdim    raw_ostream *Out;       // raw_ostream to print on
80249259Sdim    bool DeleteStream;      // Delete the ostream in our dtor?
81249259Sdim  public:
82249259Sdim    static char ID;
83249259Sdim    PrintBasicBlockPass() : BasicBlockPass(ID), Out(&dbgs()),
84249259Sdim      DeleteStream(false) {}
85249259Sdim    PrintBasicBlockPass(const std::string &B, raw_ostream *o, bool DS)
86249259Sdim        : BasicBlockPass(ID), Banner(B), Out(o), DeleteStream(DS) {}
87249259Sdim
88249259Sdim    ~PrintBasicBlockPass() {
89249259Sdim      if (DeleteStream) delete Out;
90249259Sdim    }
91249259Sdim
92249259Sdim    bool runOnBasicBlock(BasicBlock &BB) {
93249259Sdim      (*Out) << Banner << BB;
94249259Sdim      return false;
95249259Sdim    }
96249259Sdim
97249259Sdim    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
98249259Sdim      AU.setPreservesAll();
99249259Sdim    }
100249259Sdim  };
101249259Sdim}
102249259Sdim
103249259Sdimchar PrintModulePass::ID = 0;
104249259SdimINITIALIZE_PASS(PrintModulePass, "print-module",
105249259Sdim                "Print module to stderr", false, false)
106249259Sdimchar PrintFunctionPass::ID = 0;
107249259SdimINITIALIZE_PASS(PrintFunctionPass, "print-function",
108249259Sdim                "Print function to stderr", false, false)
109249259Sdimchar PrintBasicBlockPass::ID = 0;
110249259SdimINITIALIZE_PASS(PrintBasicBlockPass, "print-bb",
111249259Sdim                "Print BB to stderr", false, false)
112249259Sdim
113249259Sdim/// createPrintModulePass - Create and return a pass that writes the
114249259Sdim/// module to the specified raw_ostream.
115249259SdimModulePass *llvm::createPrintModulePass(llvm::raw_ostream *OS,
116249259Sdim                                        bool DeleteStream,
117249259Sdim                                        const std::string &Banner) {
118249259Sdim  return new PrintModulePass(Banner, OS, DeleteStream);
119249259Sdim}
120249259Sdim
121249259Sdim/// createPrintFunctionPass - Create and return a pass that prints
122249259Sdim/// functions to the specified raw_ostream as they are processed.
123249259SdimFunctionPass *llvm::createPrintFunctionPass(const std::string &Banner,
124249259Sdim                                            llvm::raw_ostream *OS,
125249259Sdim                                            bool DeleteStream) {
126249259Sdim  return new PrintFunctionPass(Banner, OS, DeleteStream);
127249259Sdim}
128249259Sdim
129249259Sdim/// createPrintBasicBlockPass - Create and return a pass that writes the
130249259Sdim/// BB to the specified raw_ostream.
131249259SdimBasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream *OS,
132249259Sdim                                        bool DeleteStream,
133249259Sdim                                        const std::string &Banner) {
134249259Sdim  return new PrintBasicBlockPass(Banner, OS, DeleteStream);
135249259Sdim}
136249259Sdim
137