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;
317569322765651f19eea0609fb082e6b267d5d2b5Owen Anderson    PrintModulePass() : ModulePass(ID), Out(&dbgs()),
321363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      DeleteStream(false) {}
3368a217169a546c904bb1dc8ac3f1afb36a29020cDavid Greene    PrintModulePass(const std::string &B, raw_ostream *o, bool DS)
347569322765651f19eea0609fb082e6b267d5d2b5Owen Anderson        : 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;
567569322765651f19eea0609fb082e6b267d5d2b5Owen Anderson    PrintFunctionPass() : FunctionPass(ID), Banner(""), Out(&dbgs()),
571363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar                          DeleteStream(false) {}
583b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar    PrintFunctionPass(const std::string &B, raw_ostream *o, bool DS)
597569322765651f19eea0609fb082e6b267d5d2b5Owen Anderson      : FunctionPass(ID), Banner(B), Out(o), DeleteStream(DS) {}
601363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
612c6d59c3c4e5b2e1e846f52c871d42dee19ac308Dan Gohman    ~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;
806374c3d4d7b1fece8ed9acb590f809a0e6fb17eeOwen AndersonINITIALIZE_PASS(PrintModulePass, "print-module",
811434dfa8cead98bd1e63411fcb9424e1d37f61acOwen Anderson                "Print module to stderr", false, false)
821363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarchar PrintFunctionPass::ID = 0;
836374c3d4d7b1fece8ed9acb590f809a0e6fb17eeOwen AndersonINITIALIZE_PASS(PrintFunctionPass, "print-function",
841434dfa8cead98bd1e63411fcb9424e1d37f61acOwen Anderson                "Print function to stderr", false, false)
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