IRPrintingPasses.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. //===--- IRPrintingPasses.cpp - Module and Function printing passes -------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // PrintModulePass and PrintFunctionPass implementations.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #include "llvm/IR/IRPrintingPasses.h"
  13. #include "llvm/IR/Function.h"
  14. #include "llvm/IR/Module.h"
  15. #include "llvm/IR/PassManager.h"
  16. #include "llvm/Pass.h"
  17. #include "llvm/Support/Debug.h"
  18. #include "llvm/Support/raw_ostream.h"
  19. using namespace llvm;
  20. PrintModulePass::PrintModulePass() : OS(dbgs()) {}
  21. PrintModulePass::PrintModulePass(raw_ostream &OS, const std::string &Banner,
  22. bool ShouldPreserveUseListOrder)
  23. : OS(OS), Banner(Banner),
  24. ShouldPreserveUseListOrder(ShouldPreserveUseListOrder) {}
  25. PreservedAnalyses PrintModulePass::run(Module &M, ModuleAnalysisManager &) {
  26. if (llvm::isFunctionInPrintList("*")) {
  27. if (!Banner.empty())
  28. OS << Banner << "\n";
  29. M.print(OS, nullptr, ShouldPreserveUseListOrder);
  30. }
  31. else {
  32. bool BannerPrinted = false;
  33. for(const auto &F : M.functions()) {
  34. if (llvm::isFunctionInPrintList(F.getName())) {
  35. if (!BannerPrinted && !Banner.empty()) {
  36. OS << Banner << "\n";
  37. BannerPrinted = true;
  38. }
  39. F.print(OS);
  40. }
  41. }
  42. }
  43. return PreservedAnalyses::all();
  44. }
  45. PrintFunctionPass::PrintFunctionPass() : OS(dbgs()) {}
  46. PrintFunctionPass::PrintFunctionPass(raw_ostream &OS, const std::string &Banner)
  47. : OS(OS), Banner(Banner) {}
  48. PreservedAnalyses PrintFunctionPass::run(Function &F,
  49. FunctionAnalysisManager &) {
  50. if (isFunctionInPrintList(F.getName())) {
  51. if (forcePrintModuleIR())
  52. OS << Banner << " (function: " << F.getName() << ")\n" << *F.getParent();
  53. else
  54. OS << Banner << static_cast<Value &>(F);
  55. }
  56. return PreservedAnalyses::all();
  57. }
  58. namespace {
  59. class PrintModulePassWrapper : public ModulePass {
  60. PrintModulePass P;
  61. public:
  62. static char ID;
  63. PrintModulePassWrapper() : ModulePass(ID) {}
  64. PrintModulePassWrapper(raw_ostream &OS, const std::string &Banner,
  65. bool ShouldPreserveUseListOrder)
  66. : ModulePass(ID), P(OS, Banner, ShouldPreserveUseListOrder) {}
  67. bool runOnModule(Module &M) override {
  68. ModuleAnalysisManager DummyMAM;
  69. P.run(M, DummyMAM);
  70. return false;
  71. }
  72. void getAnalysisUsage(AnalysisUsage &AU) const override {
  73. AU.setPreservesAll();
  74. }
  75. StringRef getPassName() const override { return "Print Module IR"; }
  76. };
  77. class PrintFunctionPassWrapper : public FunctionPass {
  78. PrintFunctionPass P;
  79. public:
  80. static char ID;
  81. PrintFunctionPassWrapper() : FunctionPass(ID) {}
  82. PrintFunctionPassWrapper(raw_ostream &OS, const std::string &Banner)
  83. : FunctionPass(ID), P(OS, Banner) {}
  84. // This pass just prints a banner followed by the function as it's processed.
  85. bool runOnFunction(Function &F) override {
  86. FunctionAnalysisManager DummyFAM;
  87. P.run(F, DummyFAM);
  88. return false;
  89. }
  90. void getAnalysisUsage(AnalysisUsage &AU) const override {
  91. AU.setPreservesAll();
  92. }
  93. StringRef getPassName() const override { return "Print Function IR"; }
  94. };
  95. class PrintBasicBlockPass : public BasicBlockPass {
  96. raw_ostream &Out;
  97. std::string Banner;
  98. public:
  99. static char ID;
  100. PrintBasicBlockPass() : BasicBlockPass(ID), Out(dbgs()) {}
  101. PrintBasicBlockPass(raw_ostream &Out, const std::string &Banner)
  102. : BasicBlockPass(ID), Out(Out), Banner(Banner) {}
  103. bool runOnBasicBlock(BasicBlock &BB) override {
  104. Out << Banner << BB;
  105. return false;
  106. }
  107. void getAnalysisUsage(AnalysisUsage &AU) const override {
  108. AU.setPreservesAll();
  109. }
  110. StringRef getPassName() const override { return "Print BasicBlock IR"; }
  111. };
  112. }
  113. char PrintModulePassWrapper::ID = 0;
  114. INITIALIZE_PASS(PrintModulePassWrapper, "print-module",
  115. "Print module to stderr", false, true)
  116. char PrintFunctionPassWrapper::ID = 0;
  117. INITIALIZE_PASS(PrintFunctionPassWrapper, "print-function",
  118. "Print function to stderr", false, true)
  119. char PrintBasicBlockPass::ID = 0;
  120. INITIALIZE_PASS(PrintBasicBlockPass, "print-bb", "Print BB to stderr", false,
  121. true)
  122. ModulePass *llvm::createPrintModulePass(llvm::raw_ostream &OS,
  123. const std::string &Banner,
  124. bool ShouldPreserveUseListOrder) {
  125. return new PrintModulePassWrapper(OS, Banner, ShouldPreserveUseListOrder);
  126. }
  127. FunctionPass *llvm::createPrintFunctionPass(llvm::raw_ostream &OS,
  128. const std::string &Banner) {
  129. return new PrintFunctionPassWrapper(OS, Banner);
  130. }
  131. BasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream &OS,
  132. const std::string &Banner) {
  133. return new PrintBasicBlockPass(OS, Banner);
  134. }
  135. bool llvm::isIRPrintingPass(Pass *P) {
  136. const char *PID = (const char*)P->getPassID();
  137. return (PID == &PrintModulePassWrapper::ID)
  138. || (PID == &PrintFunctionPassWrapper::ID)
  139. || (PID == &PrintBasicBlockPass::ID);
  140. }