Recommit r256952 "Filtering IR printing for print-after-all/print-before-all"
[oota-llvm.git] / lib / IR / IRPrintingPasses.cpp
index 242dcff795bd58c01e2a79a33f25d6830b5caa77..822dbeb08b3305d146d182a182ff4565a12dce12 100644 (file)
 #include "llvm/IR/IRPrintingPasses.h"
 #include "llvm/IR/Function.h"
 #include "llvm/IR/Module.h"
+#include "llvm/IR/PassManager.h"
 #include "llvm/Pass.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/raw_ostream.h"
 using namespace llvm;
 
+PrintModulePass::PrintModulePass() : OS(dbgs()) {}
+PrintModulePass::PrintModulePass(raw_ostream &OS, const std::string &Banner,
+                                 bool ShouldPreserveUseListOrder)
+    : OS(OS), Banner(Banner),
+      ShouldPreserveUseListOrder(ShouldPreserveUseListOrder) {}
+
+PreservedAnalyses PrintModulePass::run(Module &M) {
+  OS << Banner;
+  if (llvm::isFunctionInPrintList("*"))
+    M.print(OS, nullptr, ShouldPreserveUseListOrder);
+  else {
+    for(const auto &F : M.functions())
+      if (llvm::isFunctionInPrintList(F.getName()))
+        F.print(OS);
+  }
+  return PreservedAnalyses::all();
+}
+
+PrintFunctionPass::PrintFunctionPass() : OS(dbgs()) {}
+PrintFunctionPass::PrintFunctionPass(raw_ostream &OS, const std::string &Banner)
+    : OS(OS), Banner(Banner) {}
+
+PreservedAnalyses PrintFunctionPass::run(Function &F) {
+  if (isFunctionInPrintList(F.getName()))
+    OS << Banner << static_cast<Value &>(F);
+  return PreservedAnalyses::all();
+}
+
 namespace {
 
-class PrintModulePass : public ModulePass {
-  std::string Banner;
-  raw_ostream *Out;
-  bool DeleteStream;
+class PrintModulePassWrapper : public ModulePass {
+  PrintModulePass P;
 
 public:
   static char ID;
-  PrintModulePass() : ModulePass(ID), Out(&dbgs()), DeleteStream(false) {}
-  PrintModulePass(const std::string &B, raw_ostream *o, bool DS)
-      : ModulePass(ID), Banner(B), Out(o), DeleteStream(DS) {}
+  PrintModulePassWrapper() : ModulePass(ID) {}
+  PrintModulePassWrapper(raw_ostream &OS, const std::string &Banner,
+                         bool ShouldPreserveUseListOrder)
+      : ModulePass(ID), P(OS, Banner, ShouldPreserveUseListOrder) {}
 
-  ~PrintModulePass() {
-    if (DeleteStream)
-      delete Out;
-  }
-
-  bool runOnModule(Module &M) {
-    (*Out) << Banner << M;
+  bool runOnModule(Module &M) override {
+    P.run(M);
     return false;
   }
 
-  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+  void getAnalysisUsage(AnalysisUsage &AU) const override {
     AU.setPreservesAll();
   }
 };
 
-class PrintFunctionPass : public FunctionPass {
-  std::string Banner;
-  raw_ostream *Out;
-  bool DeleteStream;
+class PrintFunctionPassWrapper : public FunctionPass {
+  PrintFunctionPass P;
 
 public:
   static char ID;
-  PrintFunctionPass()
-      : FunctionPass(ID), Banner(""), Out(&dbgs()), DeleteStream(false) {}
-  PrintFunctionPass(const std::string &B, raw_ostream *o, bool DS)
-      : FunctionPass(ID), Banner(B), Out(o), DeleteStream(DS) {}
-
-  ~PrintFunctionPass() {
-    if (DeleteStream)
-      delete Out;
-  }
+  PrintFunctionPassWrapper() : FunctionPass(ID) {}
+  PrintFunctionPassWrapper(raw_ostream &OS, const std::string &Banner)
+      : FunctionPass(ID), P(OS, Banner) {}
 
   // This pass just prints a banner followed by the function as it's processed.
-  bool runOnFunction(Function &F) {
-    (*Out) << Banner << static_cast<Value &>(F);
+  bool runOnFunction(Function &F) override {
+    P.run(F);
     return false;
   }
 
-  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+  void getAnalysisUsage(AnalysisUsage &AU) const override {
     AU.setPreservesAll();
   }
 };
 
 class PrintBasicBlockPass : public BasicBlockPass {
+  raw_ostream &Out;
   std::string Banner;
-  raw_ostream *Out;
-  bool DeleteStream;
 
 public:
   static char ID;
-  PrintBasicBlockPass()
-      : BasicBlockPass(ID), Out(&dbgs()), DeleteStream(false) {}
-  PrintBasicBlockPass(const std::string &B, raw_ostream *o, bool DS)
-      : BasicBlockPass(ID), Banner(B), Out(o), DeleteStream(DS) {}
-
-  ~PrintBasicBlockPass() {
-    if (DeleteStream)
-      delete Out;
-  }
+  PrintBasicBlockPass() : BasicBlockPass(ID), Out(dbgs()) {}
+  PrintBasicBlockPass(raw_ostream &Out, const std::string &Banner)
+      : BasicBlockPass(ID), Out(Out), Banner(Banner) {}
 
-  bool runOnBasicBlock(BasicBlock &BB) {
-    (*Out) << Banner << BB;
+  bool runOnBasicBlock(BasicBlock &BB) override {
+    Out << Banner << BB;
     return false;
   }
 
-  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+  void getAnalysisUsage(AnalysisUsage &AU) const override {
     AU.setPreservesAll();
   }
 };
+
 }
 
-char PrintModulePass::ID = 0;
-INITIALIZE_PASS(PrintModulePass, "print-module", "Print module to stderr",
-                false, false)
-char PrintFunctionPass::ID = 0;
-INITIALIZE_PASS(PrintFunctionPass, "print-function", "Print function to stderr",
-                false, false)
+char PrintModulePassWrapper::ID = 0;
+INITIALIZE_PASS(PrintModulePassWrapper, "print-module",
+                "Print module to stderr", false, false)
+char PrintFunctionPassWrapper::ID = 0;
+INITIALIZE_PASS(PrintFunctionPassWrapper, "print-function",
+                "Print function to stderr", false, false)
 char PrintBasicBlockPass::ID = 0;
 INITIALIZE_PASS(PrintBasicBlockPass, "print-bb", "Print BB to stderr", false,
                 false)
 
 ModulePass *llvm::createPrintModulePass(llvm::raw_ostream &OS,
-                                        const std::string &Banner) {
-  return new PrintModulePass(Banner, &OS, false);
+                                        const std::string &Banner,
+                                        bool ShouldPreserveUseListOrder) {
+  return new PrintModulePassWrapper(OS, Banner, ShouldPreserveUseListOrder);
 }
 
 FunctionPass *llvm::createPrintFunctionPass(llvm::raw_ostream &OS,
                                             const std::string &Banner) {
-  return new PrintFunctionPass(Banner, &OS, false);
+  return new PrintFunctionPassWrapper(OS, Banner);
 }
 
 BasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream &OS,
                                                 const std::string &Banner) {
-  return new PrintBasicBlockPass(Banner, &OS, false);
+  return new PrintBasicBlockPass(OS, Banner);
 }