PassPrinters.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. //===- PassPrinters.cpp - Utilities to print analysis info for 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. /// \file
  10. /// Utilities to print analysis info for various kinds of passes.
  11. ///
  12. //===----------------------------------------------------------------------===//
  13. #include "PassPrinters.h"
  14. #include "llvm/Analysis/CallGraph.h"
  15. #include "llvm/Analysis/CallGraphSCCPass.h"
  16. #include "llvm/Analysis/LoopInfo.h"
  17. #include "llvm/Analysis/LoopPass.h"
  18. #include "llvm/Analysis/RegionInfo.h"
  19. #include "llvm/Analysis/RegionPass.h"
  20. #include "llvm/IR/BasicBlock.h"
  21. #include "llvm/IR/Function.h"
  22. #include "llvm/Pass.h"
  23. #include "llvm/Support/raw_ostream.h"
  24. #include <string>
  25. using namespace llvm;
  26. namespace {
  27. struct FunctionPassPrinter : public FunctionPass {
  28. const PassInfo *PassToPrint;
  29. raw_ostream &Out;
  30. static char ID;
  31. std::string PassName;
  32. FunctionPassPrinter(const PassInfo *PI, raw_ostream &out)
  33. : FunctionPass(ID), PassToPrint(PI), Out(out) {
  34. std::string PassToPrintName = std::string(PassToPrint->getPassName());
  35. PassName = "FunctionPass Printer: " + PassToPrintName;
  36. }
  37. bool runOnFunction(Function &F) override {
  38. Out << "Printing analysis '" << PassToPrint->getPassName()
  39. << "' for function '" << F.getName() << "':\n";
  40. // Get and print pass...
  41. getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, F.getParent());
  42. return false;
  43. }
  44. StringRef getPassName() const override { return PassName; }
  45. void getAnalysisUsage(AnalysisUsage &AU) const override {
  46. AU.addRequiredID(PassToPrint->getTypeInfo());
  47. AU.setPreservesAll();
  48. }
  49. };
  50. char FunctionPassPrinter::ID = 0;
  51. struct CallGraphSCCPassPrinter : public CallGraphSCCPass {
  52. static char ID;
  53. const PassInfo *PassToPrint;
  54. raw_ostream &Out;
  55. std::string PassName;
  56. CallGraphSCCPassPrinter(const PassInfo *PI, raw_ostream &out)
  57. : CallGraphSCCPass(ID), PassToPrint(PI), Out(out) {
  58. std::string PassToPrintName = std::string(PassToPrint->getPassName());
  59. PassName = "CallGraphSCCPass Printer: " + PassToPrintName;
  60. }
  61. bool runOnSCC(CallGraphSCC &SCC) override {
  62. Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
  63. // Get and print pass...
  64. for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
  65. Function *F = (*I)->getFunction();
  66. if (F)
  67. getAnalysisID<Pass>(PassToPrint->getTypeInfo())
  68. .print(Out, F->getParent());
  69. }
  70. return false;
  71. }
  72. StringRef getPassName() const override { return PassName; }
  73. void getAnalysisUsage(AnalysisUsage &AU) const override {
  74. AU.addRequiredID(PassToPrint->getTypeInfo());
  75. AU.setPreservesAll();
  76. }
  77. };
  78. char CallGraphSCCPassPrinter::ID = 0;
  79. struct ModulePassPrinter : public ModulePass {
  80. static char ID;
  81. const PassInfo *PassToPrint;
  82. raw_ostream &Out;
  83. std::string PassName;
  84. ModulePassPrinter(const PassInfo *PI, raw_ostream &out)
  85. : ModulePass(ID), PassToPrint(PI), Out(out) {
  86. std::string PassToPrintName = std::string(PassToPrint->getPassName());
  87. PassName = "ModulePass Printer: " + PassToPrintName;
  88. }
  89. bool runOnModule(Module &M) override {
  90. Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
  91. // Get and print pass...
  92. getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, &M);
  93. return false;
  94. }
  95. StringRef getPassName() const override { return PassName; }
  96. void getAnalysisUsage(AnalysisUsage &AU) const override {
  97. AU.addRequiredID(PassToPrint->getTypeInfo());
  98. AU.setPreservesAll();
  99. }
  100. };
  101. char ModulePassPrinter::ID = 0;
  102. struct LoopPassPrinter : public LoopPass {
  103. static char ID;
  104. const PassInfo *PassToPrint;
  105. raw_ostream &Out;
  106. std::string PassName;
  107. LoopPassPrinter(const PassInfo *PI, raw_ostream &out)
  108. : LoopPass(ID), PassToPrint(PI), Out(out) {
  109. std::string PassToPrintName = std::string(PassToPrint->getPassName());
  110. PassName = "LoopPass Printer: " + PassToPrintName;
  111. }
  112. bool runOnLoop(Loop *L, LPPassManager &LPM) override {
  113. Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
  114. // Get and print pass...
  115. getAnalysisID<Pass>(PassToPrint->getTypeInfo())
  116. .print(Out, L->getHeader()->getParent()->getParent());
  117. return false;
  118. }
  119. StringRef getPassName() const override { return PassName; }
  120. void getAnalysisUsage(AnalysisUsage &AU) const override {
  121. AU.addRequiredID(PassToPrint->getTypeInfo());
  122. AU.setPreservesAll();
  123. }
  124. };
  125. char LoopPassPrinter::ID = 0;
  126. struct RegionPassPrinter : public RegionPass {
  127. static char ID;
  128. const PassInfo *PassToPrint;
  129. raw_ostream &Out;
  130. std::string PassName;
  131. RegionPassPrinter(const PassInfo *PI, raw_ostream &out)
  132. : RegionPass(ID), PassToPrint(PI), Out(out) {
  133. std::string PassToPrintName = std::string(PassToPrint->getPassName());
  134. PassName = "RegionPass Printer: " + PassToPrintName;
  135. }
  136. bool runOnRegion(Region *R, RGPassManager &RGM) override {
  137. Out << "Printing analysis '" << PassToPrint->getPassName() << "' for "
  138. << "region: '" << R->getNameStr() << "' in function '"
  139. << R->getEntry()->getParent()->getName() << "':\n";
  140. // Get and print pass...
  141. getAnalysisID<Pass>(PassToPrint->getTypeInfo())
  142. .print(Out, R->getEntry()->getParent()->getParent());
  143. return false;
  144. }
  145. StringRef getPassName() const override { return PassName; }
  146. void getAnalysisUsage(AnalysisUsage &AU) const override {
  147. AU.addRequiredID(PassToPrint->getTypeInfo());
  148. AU.setPreservesAll();
  149. }
  150. };
  151. char RegionPassPrinter::ID = 0;
  152. } // end anonymous namespace
  153. FunctionPass *llvm::createFunctionPassPrinter(const PassInfo *PI,
  154. raw_ostream &OS) {
  155. return new FunctionPassPrinter(PI, OS);
  156. }
  157. CallGraphSCCPass *llvm::createCallGraphPassPrinter(const PassInfo *PI,
  158. raw_ostream &OS) {
  159. return new CallGraphSCCPassPrinter(PI, OS);
  160. }
  161. ModulePass *llvm::createModulePassPrinter(const PassInfo *PI, raw_ostream &OS) {
  162. return new ModulePassPrinter(PI, OS);
  163. }
  164. LoopPass *llvm::createLoopPassPrinter(const PassInfo *PI, raw_ostream &OS) {
  165. return new LoopPassPrinter(PI, OS);
  166. }
  167. RegionPass *llvm::createRegionPassPrinter(const PassInfo *PI, raw_ostream &OS) {
  168. return new RegionPassPrinter(PI, OS);
  169. }