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