Privatize PrintModulePass and PrintFunctionPass and add
createPrintModulePass and createPrintFunctionPass.
 - So clients who compile w/o RTTI can use them.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@57933 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/llvm/Assembly/PrintModulePass.h b/include/llvm/Assembly/PrintModulePass.h
index ee5cff5..7f5acf4 100644
--- a/include/llvm/Assembly/PrintModulePass.h
+++ b/include/llvm/Assembly/PrintModulePass.h
@@ -18,64 +18,22 @@
 #ifndef LLVM_ASSEMBLY_PRINTMODULEPASS_H
 #define LLVM_ASSEMBLY_PRINTMODULEPASS_H
 
-#include "llvm/Pass.h"
-#include "llvm/Module.h"
 #include "llvm/Support/Streams.h"
+#include <string>
 
 namespace llvm {
-
-class PrintModulePass : public ModulePass {
-  OStream *Out;           // ostream to print on
-  bool DeleteStream;      // Delete the ostream in our dtor?
-public:
-  static char ID;
-  PrintModulePass() : ModulePass(intptr_t(&ID)), Out(&cerr), 
-                      DeleteStream(false) {}
-  PrintModulePass(OStream *o, bool DS = false)
-    : ModulePass(intptr_t(&ID)), Out(o), DeleteStream(DS) {}
-
-  ~PrintModulePass() {
-    if (DeleteStream) delete Out;
-  }
-
-  bool runOnModule(Module &M) {
-    (*Out) << M << std::flush;
-    return false;
-  }
-
-  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
-    AU.setPreservesAll();
-  }
-};
-
-class PrintFunctionPass : public FunctionPass {
-  std::string Banner;     // String to print before each function
-  OStream *Out;           // ostream to print on
-  bool DeleteStream;      // Delete the ostream in our dtor?
-public:
-  static char ID;
-  PrintFunctionPass() : FunctionPass(intptr_t(&ID)), Banner(""), Out(&cerr), 
-                        DeleteStream(false) {}
-  PrintFunctionPass(const std::string &B, OStream *o = &cout,
-                    bool DS = false)
-    : FunctionPass(intptr_t(&ID)), Banner(B), Out(o), DeleteStream(DS) {}
-
-  inline ~PrintFunctionPass() {
-    if (DeleteStream) delete Out;
-  }
-
-  // runOnFunction - This pass just prints a banner followed by the function as
-  // it's processed.
-  //
-  bool runOnFunction(Function &F) {
-    (*Out) << Banner << static_cast<Value&>(F);
-    return false;
-  }
-
-  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
-    AU.setPreservesAll();
-  }
-};
+  class FunctionPass;
+  class ModulePass;
+  
+  /// createPrintModulePass - Create and return a pass that writes the
+  /// module to the specified OStream.
+  ModulePass *createPrintModulePass(llvm::OStream *OS, bool DeleteStream=false);
+  
+  /// createPrintFunctionPass - Create and return a pass that prints
+  /// functions to the specified OStream as they are processed.
+  FunctionPass *createPrintFunctionPass(const std::string &Banner,
+                                        llvm::OStream *OS, 
+                                        bool DeleteStream=false);  
 
 } // End llvm namespace
 
diff --git a/include/llvm/LinkAllPasses.h b/include/llvm/LinkAllPasses.h
index f94bc33..e23108c 100644
--- a/include/llvm/LinkAllPasses.h
+++ b/include/llvm/LinkAllPasses.h
@@ -23,6 +23,7 @@
 #include "llvm/Analysis/Passes.h"
 #include "llvm/Analysis/PostDominators.h"
 #include "llvm/Analysis/ScalarEvolution.h"
+#include "llvm/Assembly/PrintModulePass.h"
 #include "llvm/CodeGen/Passes.h"
 #include "llvm/Function.h"
 #include "llvm/Transforms/Instrumentation.h"
@@ -120,6 +121,8 @@
       (void) llvm::createInstructionNamerPass();
       (void) llvm::createPartialSpecializationPass();
       (void) llvm::createAddReadAttrsPass();
+      (void) llvm::createPrintModulePass(0);
+      (void) llvm::createPrintFunctionPass("", 0);
 
       (void)new llvm::IntervalPartition();
       (void)new llvm::FindUsedTypes();
diff --git a/lib/CodeGen/LLVMTargetMachine.cpp b/lib/CodeGen/LLVMTargetMachine.cpp
index 333b8ab..bc3c991 100644
--- a/lib/CodeGen/LLVMTargetMachine.cpp
+++ b/lib/CodeGen/LLVMTargetMachine.cpp
@@ -151,7 +151,7 @@
   if (!Fast) {
     PM.add(createLoopStrengthReducePass(getTargetLowering()));
     if (PrintLSR)
-      PM.add(new PrintFunctionPass("\n\n*** Code after LSR ***\n", &cerr));
+      PM.add(createPrintFunctionPass("\n\n*** Code after LSR ***\n", &cerr));
   }
 
   PM.add(createGCLoweringPass());
@@ -166,8 +166,9 @@
     PM.add(createCodeGenPreparePass(getTargetLowering()));
 
   if (PrintISelInput)
-    PM.add(new PrintFunctionPass("\n\n*** Final LLVM Code input to ISel ***\n",
-                                 &cerr));
+    PM.add(createPrintFunctionPass("\n\n"
+                                   "*** Final LLVM Code input to ISel ***\n",
+                                   &cerr));
 
   // Standard Lower-Level Passes.
 
diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp
index 273fe30..55ba300 100644
--- a/lib/VMCore/AsmWriter.cpp
+++ b/lib/VMCore/AsmWriter.cpp
@@ -39,14 +39,6 @@
 // Make virtual table appear in this compilation unit.
 AssemblyAnnotationWriter::~AssemblyAnnotationWriter() {}
 
-char PrintModulePass::ID = 0;
-static RegisterPass<PrintModulePass>
-X("print-module", "Print module to stderr");
-char PrintFunctionPass::ID = 0;
-static RegisterPass<PrintFunctionPass>
-Y("print-function","Print function to stderr");
-
-
 //===----------------------------------------------------------------------===//
 // Helper Functions
 //===----------------------------------------------------------------------===//
diff --git a/lib/VMCore/PrintModulePass.cpp b/lib/VMCore/PrintModulePass.cpp
new file mode 100644
index 0000000..6740af7
--- /dev/null
+++ b/lib/VMCore/PrintModulePass.cpp
@@ -0,0 +1,96 @@
+//===--- VMCore/PrintModulePass.cpp - Module/Function Printer -------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// PrintModulePass and PrintFunctionPass implementations.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Assembly/PrintModulePass.h"
+
+#include "llvm/Function.h"
+#include "llvm/Module.h"
+#include "llvm/Pass.h"
+#include "llvm/Support/Compiler.h"
+using namespace llvm;
+
+namespace {
+
+  class VISIBILITY_HIDDEN PrintModulePass : public ModulePass {
+    OStream *Out;           // ostream to print on
+    bool DeleteStream;      // Delete the ostream in our dtor?
+  public:
+    static char ID;
+    PrintModulePass() : ModulePass(intptr_t(&ID)), Out(&cerr), 
+      DeleteStream(false) {}
+    PrintModulePass(OStream *o, bool DS)
+      : ModulePass(intptr_t(&ID)), Out(o), DeleteStream(DS) {}
+    
+    ~PrintModulePass() {
+      if (DeleteStream) delete Out;
+    }
+    
+    bool runOnModule(Module &M) {
+      (*Out) << M << std::flush;
+      return false;
+    }
+    
+    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+      AU.setPreservesAll();
+    }
+  };
+  
+  class PrintFunctionPass : public FunctionPass {
+    std::string Banner;     // String to print before each function
+    OStream *Out;           // ostream to print on
+    bool DeleteStream;      // Delete the ostream in our dtor?
+  public:
+    static char ID;
+    PrintFunctionPass() : FunctionPass(intptr_t(&ID)), Banner(""), Out(&cerr), 
+                          DeleteStream(false) {}
+    PrintFunctionPass(const std::string &B, OStream *o, bool DS)
+      : FunctionPass(intptr_t(&ID)), Banner(B), Out(o), DeleteStream(DS) {}
+    
+    inline ~PrintFunctionPass() {
+      if (DeleteStream) delete Out;
+    }
+    
+    // runOnFunction - This pass just prints a banner followed by the
+    // function as it's processed.
+    //
+    bool runOnFunction(Function &F) {
+      (*Out) << Banner << static_cast<Value&>(F);
+      return false;
+    }
+    
+    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+      AU.setPreservesAll();
+    }
+  };
+}
+
+char PrintModulePass::ID = 0;
+static RegisterPass<PrintModulePass>
+X("print-module", "Print module to stderr");
+char PrintFunctionPass::ID = 0;
+static RegisterPass<PrintFunctionPass>
+Y("print-function","Print function to stderr");
+
+/// createPrintModulePass - Create and return a pass that writes the
+/// module to the specified OStream.
+ModulePass *llvm::createPrintModulePass(llvm::OStream *OS, bool DeleteStream) {
+  return new PrintModulePass(OS, DeleteStream);
+}
+
+/// createPrintFunctionPass - Create and return a pass that prints
+/// functions to the specified OStream as they are processed.
+FunctionPass *llvm::createPrintFunctionPass(const std::string &Banner,
+                                      OStream *OS, bool DeleteStream) {
+  return new PrintFunctionPass(Banner, OS, DeleteStream);
+}
+
diff --git a/tools/llvm-dis/llvm-dis.cpp b/tools/llvm-dis/llvm-dis.cpp
index 9802541..276b1e4 100644
--- a/tools/llvm-dis/llvm-dis.cpp
+++ b/tools/llvm-dis/llvm-dis.cpp
@@ -118,7 +118,7 @@
     if (!DontPrint) {
       PassManager Passes;
       OStream L(*Out);
-      Passes.add(new PrintModulePass(&L));
+      Passes.add(createPrintModulePass(&L));
       Passes.run(*M.get());
     }
 
diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp
index ea6ed33..358cbda 100644
--- a/tools/opt/opt.cpp
+++ b/tools/opt/opt.cpp
@@ -543,7 +543,7 @@
       }
       
       if (PrintEachXForm)
-        Passes.add(new PrintModulePass(&cerr));
+        Passes.add(createPrintModulePass(&cerr));
     }
     
     // If -std-compile-opts was specified at the end of the pass list, add them.