1 //===--- VMCore/PrintModulePass.cpp - Module/Function Printer -------------===// 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/Assembly/PrintModulePass.h" 15 16 #include "llvm/Function.h" 17 #include "llvm/Module.h" 18 #include "llvm/Pass.h" 19 #include "llvm/Support/Debug.h" 20 #include "llvm/Support/raw_ostream.h" 21 using namespace llvm; 22 23 namespace { 24 25 class PrintModulePass : public ModulePass { 26 std::string Banner; 27 raw_ostream *Out; // raw_ostream to print on 28 bool DeleteStream; // Delete the ostream in our dtor? 29 public: 30 static char ID; 31 PrintModulePass() : ModulePass(ID), Out(&dbgs()), 32 DeleteStream(false) {} 33 PrintModulePass(const std::string &B, raw_ostream *o, bool DS) 34 : ModulePass(ID), Banner(B), Out(o), DeleteStream(DS) {} 35 36 ~PrintModulePass() { 37 if (DeleteStream) delete Out; 38 } 39 40 bool runOnModule(Module &M) { 41 (*Out) << Banner << M; 42 return false; 43 } 44 45 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 46 AU.setPreservesAll(); 47 } 48 }; 49 50 class PrintFunctionPass : public FunctionPass { 51 std::string Banner; // String to print before each function 52 raw_ostream *Out; // raw_ostream to print on 53 bool DeleteStream; // Delete the ostream in our dtor? 54 public: 55 static char ID; 56 PrintFunctionPass() : FunctionPass(ID), Banner(""), Out(&dbgs()), 57 DeleteStream(false) {} 58 PrintFunctionPass(const std::string &B, raw_ostream *o, bool DS) 59 : FunctionPass(ID), Banner(B), Out(o), DeleteStream(DS) {} 60 61 ~PrintFunctionPass() { 62 if (DeleteStream) delete Out; 63 } 64 65 // runOnFunction - This pass just prints a banner followed by the 66 // function as it's processed. 67 // 68 bool runOnFunction(Function &F) { 69 (*Out) << Banner << static_cast<Value&>(F); 70 return false; 71 } 72 73 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 74 AU.setPreservesAll(); 75 } 76 }; 77 } 78 79 char PrintModulePass::ID = 0; 80 INITIALIZE_PASS(PrintModulePass, "print-module", 81 "Print module to stderr", false, false) 82 char PrintFunctionPass::ID = 0; 83 INITIALIZE_PASS(PrintFunctionPass, "print-function", 84 "Print function to stderr", false, false) 85 86 /// createPrintModulePass - Create and return a pass that writes the 87 /// module to the specified raw_ostream. 88 ModulePass *llvm::createPrintModulePass(llvm::raw_ostream *OS, 89 bool DeleteStream, 90 const std::string &Banner) { 91 return new PrintModulePass(Banner, OS, DeleteStream); 92 } 93 94 /// createPrintFunctionPass - Create and return a pass that prints 95 /// functions to the specified raw_ostream as they are processed. 96 FunctionPass *llvm::createPrintFunctionPass(const std::string &Banner, 97 llvm::raw_ostream *OS, 98 bool DeleteStream) { 99 return new PrintFunctionPass(Banner, OS, DeleteStream); 100 } 101 102