Home | History | Annotate | Download | only in VMCore
      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