PrintModulePass.cpp revision 492d06efde44a4e38a6ed321ada4af5a75494df6
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"
191363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar#include "llvm/Support/Compiler.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 {
263b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar    raw_ostream *Out;       // raw_ostream to print on
271363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    bool DeleteStream;      // Delete the ostream in our dtor?
281363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar  public:
291363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    static char ID;
30c74a197153dae0577209a2e12b9bc984f9f4df45Dan Gohman    PrintModulePass() : ModulePass(&ID), Out(&errs()),
311363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      DeleteStream(false) {}
323b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar    PrintModulePass(raw_ostream *o, bool DS)
33c74a197153dae0577209a2e12b9bc984f9f4df45Dan Gohman      : ModulePass(&ID), Out(o), DeleteStream(DS) {}
341363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
351363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    ~PrintModulePass() {
361363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      if (DeleteStream) delete Out;
371363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    }
381363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
391363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    bool runOnModule(Module &M) {
403b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar      (*Out) << M;
411363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      return false;
421363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    }
431363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
441363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
451363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      AU.setPreservesAll();
461363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    }
471363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar  };
481363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
491363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar  class PrintFunctionPass : public FunctionPass {
501363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    std::string Banner;     // String to print before each function
513b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar    raw_ostream *Out;       // raw_ostream to print on
521363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    bool DeleteStream;      // Delete the ostream in our dtor?
531363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar  public:
541363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    static char ID;
55c74a197153dae0577209a2e12b9bc984f9f4df45Dan Gohman    PrintFunctionPass() : FunctionPass(&ID), Banner(""), Out(&errs()),
561363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar                          DeleteStream(false) {}
573b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar    PrintFunctionPass(const std::string &B, raw_ostream *o, bool DS)
58c74a197153dae0577209a2e12b9bc984f9f4df45Dan Gohman      : FunctionPass(&ID), Banner(B), Out(o), DeleteStream(DS) {}
591363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
601363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    inline ~PrintFunctionPass() {
611363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      if (DeleteStream) delete Out;
621363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    }
631363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
641363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    // runOnFunction - This pass just prints a banner followed by the
651363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    // function as it's processed.
661363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    //
671363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    bool runOnFunction(Function &F) {
681363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      (*Out) << Banner << static_cast<Value&>(F);
691363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      return false;
701363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    }
711363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
721363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
731363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      AU.setPreservesAll();
741363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    }
751363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar  };
761363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar}
771363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
781363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarchar PrintModulePass::ID = 0;
791363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarstatic RegisterPass<PrintModulePass>
801363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel DunbarX("print-module", "Print module to stderr");
811363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarchar PrintFunctionPass::ID = 0;
821363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarstatic RegisterPass<PrintFunctionPass>
831363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel DunbarY("print-function","Print function to stderr");
841363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
851363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar/// createPrintModulePass - Create and return a pass that writes the
863b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar/// module to the specified raw_ostream.
873b475e99db65dccb5b816af218f3335573e7f526Daniel DunbarModulePass *llvm::createPrintModulePass(llvm::raw_ostream *OS,
883b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar                                        bool DeleteStream) {
891363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar  return new PrintModulePass(OS, DeleteStream);
901363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar}
911363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
921363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar/// createPrintFunctionPass - Create and return a pass that prints
933b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar/// functions to the specified raw_ostream as they are processed.
941363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel DunbarFunctionPass *llvm::createPrintFunctionPass(const std::string &Banner,
953b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar                                            llvm::raw_ostream *OS,
963b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar                                            bool DeleteStream) {
971363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar  return new PrintFunctionPass(Banner, OS, DeleteStream);
981363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar}
991363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
100