IRPrintingPasses.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. //===--- IRPrintingPasses.cpp - Module and Function printing passes -------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // PrintModulePass and PrintFunctionPass implementations.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include "llvm/IR/IRPrintingPasses.h"
  14. #include "llvm/IR/Function.h"
  15. #include "llvm/IR/Module.h"
  16. #include "llvm/IR/PassManager.h"
  17. #include "llvm/Pass.h"
  18. #include "llvm/Support/Debug.h"
  19. #include "llvm/Support/raw_ostream.h"
  20. using namespace llvm;
  21. PrintModulePass::PrintModulePass() : OS(dbgs()) {}
  22. PrintModulePass::PrintModulePass(raw_ostream &OS, const std::string &Banner,
  23. bool ShouldPreserveUseListOrder)
  24. : OS(OS), Banner(Banner),
  25. ShouldPreserveUseListOrder(ShouldPreserveUseListOrder) {}
  26. PreservedAnalyses PrintModulePass::run(Module &M) {
  27. OS << Banner;
  28. M.print(OS, nullptr, ShouldPreserveUseListOrder);
  29. return PreservedAnalyses::all();
  30. }
  31. PrintFunctionPass::PrintFunctionPass() : OS(dbgs()) {}
  32. PrintFunctionPass::PrintFunctionPass(raw_ostream &OS, const std::string &Banner)
  33. : OS(OS), Banner(Banner) {}
  34. PreservedAnalyses PrintFunctionPass::run(Function &F) {
  35. OS << Banner << static_cast<Value &>(F);
  36. return PreservedAnalyses::all();
  37. }
  38. namespace {
  39. class PrintModulePassWrapper : public ModulePass {
  40. PrintModulePass P;
  41. public:
  42. static char ID;
  43. PrintModulePassWrapper() : ModulePass(ID) {}
  44. PrintModulePassWrapper(raw_ostream &OS, const std::string &Banner,
  45. bool ShouldPreserveUseListOrder)
  46. : ModulePass(ID), P(OS, Banner, ShouldPreserveUseListOrder) {}
  47. bool runOnModule(Module &M) override {
  48. P.run(M);
  49. return false;
  50. }
  51. void getAnalysisUsage(AnalysisUsage &AU) const override {
  52. AU.setPreservesAll();
  53. }
  54. };
  55. class PrintFunctionPassWrapper : public FunctionPass {
  56. PrintFunctionPass P;
  57. public:
  58. static char ID;
  59. PrintFunctionPassWrapper() : FunctionPass(ID) {}
  60. PrintFunctionPassWrapper(raw_ostream &OS, const std::string &Banner)
  61. : FunctionPass(ID), P(OS, Banner) {}
  62. // This pass just prints a banner followed by the function as it's processed.
  63. bool runOnFunction(Function &F) override {
  64. P.run(F);
  65. return false;
  66. }
  67. void getAnalysisUsage(AnalysisUsage &AU) const override {
  68. AU.setPreservesAll();
  69. }
  70. };
  71. class PrintBasicBlockPass : public BasicBlockPass {
  72. raw_ostream &Out;
  73. std::string Banner;
  74. public:
  75. static char ID;
  76. PrintBasicBlockPass() : BasicBlockPass(ID), Out(dbgs()) {}
  77. PrintBasicBlockPass(raw_ostream &Out, const std::string &Banner)
  78. : BasicBlockPass(ID), Out(Out), Banner(Banner) {}
  79. bool runOnBasicBlock(BasicBlock &BB) override {
  80. Out << Banner << BB;
  81. return false;
  82. }
  83. void getAnalysisUsage(AnalysisUsage &AU) const override {
  84. AU.setPreservesAll();
  85. }
  86. };
  87. }
  88. char PrintModulePassWrapper::ID = 0;
  89. INITIALIZE_PASS(PrintModulePassWrapper, "print-module",
  90. "Print module to stderr", false, false)
  91. char PrintFunctionPassWrapper::ID = 0;
  92. INITIALIZE_PASS(PrintFunctionPassWrapper, "print-function",
  93. "Print function to stderr", false, false)
  94. char PrintBasicBlockPass::ID = 0;
  95. INITIALIZE_PASS(PrintBasicBlockPass, "print-bb", "Print BB to stderr", false,
  96. false)
  97. ModulePass *llvm::createPrintModulePass(llvm::raw_ostream &OS,
  98. const std::string &Banner,
  99. bool ShouldPreserveUseListOrder) {
  100. return new PrintModulePassWrapper(OS, Banner, ShouldPreserveUseListOrder);
  101. }
  102. FunctionPass *llvm::createPrintFunctionPass(llvm::raw_ostream &OS,
  103. const std::string &Banner) {
  104. return new PrintFunctionPassWrapper(OS, Banner);
  105. }
  106. BasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream &OS,
  107. const std::string &Banner) {
  108. return new PrintBasicBlockPass(OS, Banner);
  109. }