//===--- IR/PrintModulePass.cpp - Module/Function Printer -----------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // PrintModulePass and PrintFunctionPass implementations. // //===----------------------------------------------------------------------===// #include "llvm/Assembly/PrintModulePass.h" #include "llvm/IR/Function.h" #include "llvm/IR/Module.h" #include "llvm/Pass.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; namespace { class PrintModulePass : public ModulePass { std::string Banner; raw_ostream *Out; // raw_ostream to print on bool DeleteStream; // Delete the ostream in our dtor? public: static char ID; PrintModulePass() : ModulePass(ID), Out(&dbgs()), DeleteStream(false) {} PrintModulePass(const std::string &B, raw_ostream *o, bool DS) : ModulePass(ID), Banner(B), Out(o), DeleteStream(DS) {} ~PrintModulePass() { if (DeleteStream) delete Out; } bool runOnModule(Module &M) { (*Out) << Banner << M; return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); } }; class PrintFunctionPass : public FunctionPass { std::string Banner; // String to print before each function raw_ostream *Out; // raw_ostream to print on bool DeleteStream; // Delete the ostream in our dtor? public: static char ID; PrintFunctionPass() : FunctionPass(ID), Banner(""), Out(&dbgs()), DeleteStream(false) {} PrintFunctionPass(const std::string &B, raw_ostream *o, bool DS) : FunctionPass(ID), Banner(B), Out(o), DeleteStream(DS) {} ~PrintFunctionPass() { if (DeleteStream) delete Out; } // runOnFunction - This pass just prints a banner followed by the // function as it's processed. // bool runOnFunction(Function &F) { (*Out) << Banner << static_cast(F); return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); } }; class PrintBasicBlockPass : public BasicBlockPass { std::string Banner; raw_ostream *Out; // raw_ostream to print on bool DeleteStream; // Delete the ostream in our dtor? public: static char ID; PrintBasicBlockPass() : BasicBlockPass(ID), Out(&dbgs()), DeleteStream(false) {} PrintBasicBlockPass(const std::string &B, raw_ostream *o, bool DS) : BasicBlockPass(ID), Banner(B), Out(o), DeleteStream(DS) {} ~PrintBasicBlockPass() { if (DeleteStream) delete Out; } bool runOnBasicBlock(BasicBlock &BB) { (*Out) << Banner << BB; return false; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); } }; } char PrintModulePass::ID = 0; INITIALIZE_PASS(PrintModulePass, "print-module", "Print module to stderr", false, false) char PrintFunctionPass::ID = 0; INITIALIZE_PASS(PrintFunctionPass, "print-function", "Print function to stderr", false, false) char PrintBasicBlockPass::ID = 0; INITIALIZE_PASS(PrintBasicBlockPass, "print-bb", "Print BB to stderr", false, false) /// createPrintModulePass - Create and return a pass that writes the /// module to the specified raw_ostream. ModulePass *llvm::createPrintModulePass(llvm::raw_ostream *OS, bool DeleteStream, const std::string &Banner) { return new PrintModulePass(Banner, OS, DeleteStream); } /// createPrintFunctionPass - Create and return a pass that prints /// functions to the specified raw_ostream as they are processed. FunctionPass *llvm::createPrintFunctionPass(const std::string &Banner, llvm::raw_ostream *OS, bool DeleteStream) { return new PrintFunctionPass(Banner, OS, DeleteStream); } /// createPrintBasicBlockPass - Create and return a pass that writes the /// BB to the specified raw_ostream. BasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream *OS, bool DeleteStream, const std::string &Banner) { return new PrintBasicBlockPass(Banner, OS, DeleteStream); }