PrintModulePass.cpp revision 68a217169a546c904bb1dc8ac3f1afb36a29020c
11363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar//===--- VMCore/PrintModulePass.cpp - Module/Function Printer -------------===//
21363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar//
31363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar//                     The LLVM Compiler Infrastructure
41363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar//
51363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar// This file is distributed under the University of Illinois Open Source
61363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar// License. See LICENSE.TXT for details.
71363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar//
81363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar//===----------------------------------------------------------------------===//
91363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar//
101363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar// PrintModulePass and PrintFunctionPass implementations.
111363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar//
121363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar//===----------------------------------------------------------------------===//
131363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
141363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar#include "llvm/Assembly/PrintModulePass.h"
151363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
161363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar#include "llvm/Function.h"
171363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar#include "llvm/Module.h"
181363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar#include "llvm/Pass.h"
190316fc7b26a0055a503d6c438e4aa5180e527643David Greene#include "llvm/Support/Debug.h"
203b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar#include "llvm/Support/raw_ostream.h"
211363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarusing namespace llvm;
221363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
231363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarnamespace {
241363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
25492d06efde44a4e38a6ed321ada4af5a75494df6Nick Lewycky  class PrintModulePass : public ModulePass {
2668a217169a546c904bb1dc8ac3f1afb36a29020cDavid Greene    std::string Banner;
273b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar    raw_ostream *Out;       // raw_ostream to print on
281363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    bool DeleteStream;      // Delete the ostream in our dtor?
291363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar  public:
301363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    static char ID;
310316fc7b26a0055a503d6c438e4aa5180e527643David Greene    PrintModulePass() : ModulePass(&ID), Out(&dbgs()),
321363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      DeleteStream(false) {}
3368a217169a546c904bb1dc8ac3f1afb36a29020cDavid Greene    PrintModulePass(const std::string &B, raw_ostream *o, bool DS)
3468a217169a546c904bb1dc8ac3f1afb36a29020cDavid Greene        : ModulePass(&ID), Banner(B), Out(o), DeleteStream(DS) {}
351363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
361363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    ~PrintModulePass() {
371363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      if (DeleteStream) delete Out;
381363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    }
391363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
401363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    bool runOnModule(Module &M) {
4168a217169a546c904bb1dc8ac3f1afb36a29020cDavid Greene      (*Out) << Banner << M;
421363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      return false;
431363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    }
441363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
451363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
461363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      AU.setPreservesAll();
471363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    }
481363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar  };
491363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
501363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar  class PrintFunctionPass : public FunctionPass {
511363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    std::string Banner;     // String to print before each function
523b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar    raw_ostream *Out;       // raw_ostream to print on
531363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    bool DeleteStream;      // Delete the ostream in our dtor?
541363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar  public:
551363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    static char ID;
560316fc7b26a0055a503d6c438e4aa5180e527643David Greene    PrintFunctionPass() : FunctionPass(&ID), Banner(""), Out(&dbgs()),
571363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar                          DeleteStream(false) {}
583b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar    PrintFunctionPass(const std::string &B, raw_ostream *o, bool DS)
59c74a197153dae0577209a2e12b9bc984f9f4df45Dan Gohman      : FunctionPass(&ID), Banner(B), Out(o), DeleteStream(DS) {}
601363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
611363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    inline ~PrintFunctionPass() {
621363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      if (DeleteStream) delete Out;
631363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    }
641363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
651363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    // runOnFunction - This pass just prints a banner followed by the
661363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    // function as it's processed.
671363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    //
681363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    bool runOnFunction(Function &F) {
691363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      (*Out) << Banner << static_cast<Value&>(F);
701363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      return false;
711363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    }
721363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
731363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
741363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      AU.setPreservesAll();
751363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    }
761363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar  };
771363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar}
781363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
791363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarchar PrintModulePass::ID = 0;
801363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarstatic RegisterPass<PrintModulePass>
811363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel DunbarX("print-module", "Print module to stderr");
821363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarchar PrintFunctionPass::ID = 0;
831363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarstatic RegisterPass<PrintFunctionPass>
841363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel DunbarY("print-function","Print function to stderr");
851363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
861363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar/// createPrintModulePass - Create and return a pass that writes the
873b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar/// module to the specified raw_ostream.
883b475e99db65dccb5b816af218f3335573e7f526Daniel DunbarModulePass *llvm::createPrintModulePass(llvm::raw_ostream *OS,
8968a217169a546c904bb1dc8ac3f1afb36a29020cDavid Greene                                        bool DeleteStream,
9068a217169a546c904bb1dc8ac3f1afb36a29020cDavid Greene                                        const std::string &Banner) {
9168a217169a546c904bb1dc8ac3f1afb36a29020cDavid Greene  return new PrintModulePass(Banner, OS, DeleteStream);
921363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar}
931363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
941363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar/// createPrintFunctionPass - Create and return a pass that prints
953b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar/// functions to the specified raw_ostream as they are processed.
961363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel DunbarFunctionPass *llvm::createPrintFunctionPass(const std::string &Banner,
973b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar                                            llvm::raw_ostream *OS,
983b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar                                            bool DeleteStream) {
991363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar  return new PrintFunctionPass(Banner, OS, DeleteStream);
1001363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar}
1011363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
102