PrintModulePass.cpp revision 3b475e99db65dccb5b816af218f3335573e7f526
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
251363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar  class VISIBILITY_HIDDEN 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;
303b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar    PrintModulePass() : ModulePass(intptr_t(&ID)), Out(&errs()),
311363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      DeleteStream(false) {}
323b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar    PrintModulePass(raw_ostream *o, bool DS)
331363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      : ModulePass(intptr_t(&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;
413b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar      Out->flush();
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;
563b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar    PrintFunctionPass() : FunctionPass(intptr_t(&ID)), Banner(""), Out(&errs()),
571363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar                          DeleteStream(false) {}
583b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar    PrintFunctionPass(const std::string &B, raw_ostream *o, bool DS)
591363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      : FunctionPass(intptr_t(&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);
703b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar      Out->flush();
711363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      return false;
721363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    }
731363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
741363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
751363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar      AU.setPreservesAll();
761363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar    }
771363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar  };
781363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar}
791363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
801363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarchar PrintModulePass::ID = 0;
811363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarstatic RegisterPass<PrintModulePass>
821363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel DunbarX("print-module", "Print module to stderr");
831363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarchar PrintFunctionPass::ID = 0;
841363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarstatic RegisterPass<PrintFunctionPass>
851363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel DunbarY("print-function","Print function to stderr");
861363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar
871363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar/// createPrintModulePass - Create and return a pass that writes the
883b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar/// module to the specified raw_ostream.
893b475e99db65dccb5b816af218f3335573e7f526Daniel DunbarModulePass *llvm::createPrintModulePass(llvm::raw_ostream *OS,
903b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar                                        bool DeleteStream) {
911363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar  return new PrintModulePass(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