| //===--- VMCore/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/Function.h" | |
| #include "llvm/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<Value&>(F); | |
| 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) | |
| /// 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); | |
| } | |