DOTGraphTraitsPass.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. //===-- DOTGraphTraitsPass.h - Print/View dotty graphs-----------*- C++ -*-===//
  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. // Templates to create dotty viewer and printer passes for GraphTraits graphs.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #ifndef LLVM_ANALYSIS_DOTGRAPHTRAITSPASS_H
  14. #define LLVM_ANALYSIS_DOTGRAPHTRAITSPASS_H
  15. #include "llvm/Analysis/CFGPrinter.h"
  16. #include "llvm/Pass.h"
  17. #include "llvm/Support/FileSystem.h"
  18. namespace llvm {
  19. /// \brief Default traits class for extracting a graph from an analysis pass.
  20. ///
  21. /// This assumes that 'GraphT' is 'AnalysisT *' and so just passes it through.
  22. template <typename AnalysisT, typename GraphT = AnalysisT *>
  23. struct DefaultAnalysisGraphTraits {
  24. static GraphT getGraph(AnalysisT *A) { return A; }
  25. };
  26. template <
  27. typename AnalysisT, bool IsSimple, typename GraphT = AnalysisT *,
  28. typename AnalysisGraphTraitsT = DefaultAnalysisGraphTraits<AnalysisT> >
  29. class DOTGraphTraitsViewer : public FunctionPass {
  30. public:
  31. DOTGraphTraitsViewer(StringRef GraphName, char &ID)
  32. : FunctionPass(ID), Name(GraphName) {}
  33. bool runOnFunction(Function &F) override {
  34. GraphT Graph = AnalysisGraphTraitsT::getGraph(&getAnalysis<AnalysisT>());
  35. std::string GraphName = DOTGraphTraits<GraphT>::getGraphName(Graph);
  36. std::string Title = GraphName + " for '" + F.getName().str() + "' function";
  37. // HLSL Change Starts
  38. if (OSOverride != nullptr) {
  39. *OSOverride << "\ngraph: " << GraphName << ".dot\n";
  40. llvm::WriteGraph(*OSOverride, Graph, false, Title);
  41. return false;
  42. }
  43. // HLSL Change Ends
  44. ViewGraph(Graph, Name, IsSimple, Title);
  45. return false;
  46. }
  47. void getAnalysisUsage(AnalysisUsage &AU) const override {
  48. AU.setPreservesAll();
  49. AU.addRequired<AnalysisT>();
  50. }
  51. private:
  52. std::string Name;
  53. };
  54. template <
  55. typename AnalysisT, bool IsSimple, typename GraphT = AnalysisT *,
  56. typename AnalysisGraphTraitsT = DefaultAnalysisGraphTraits<AnalysisT> >
  57. class DOTGraphTraitsPrinter : public FunctionPass {
  58. public:
  59. DOTGraphTraitsPrinter(StringRef GraphName, char &ID)
  60. : FunctionPass(ID), Name(GraphName) {}
  61. bool runOnFunction(Function &F) override {
  62. GraphT Graph = AnalysisGraphTraitsT::getGraph(&getAnalysis<AnalysisT>());
  63. // HLSL Change Starts
  64. if (OSOverride != nullptr) {
  65. *OSOverride << "\ngraph: " << Name + "." + F.getName().str() + ".dot\n";
  66. llvm::WriteGraph(*OSOverride, Graph, false, DOTGraphTraits<GraphT>::getGraphName(Graph));
  67. return false;
  68. }
  69. // HLSL Change Ends
  70. std::string Filename = Name + "." + F.getName().str() + ".dot";
  71. std::error_code EC;
  72. errs() << "Writing '" << Filename << "'...";
  73. raw_fd_ostream File(Filename, EC, sys::fs::F_Text);
  74. std::string GraphName = DOTGraphTraits<GraphT>::getGraphName(Graph);
  75. std::string Title = GraphName + " for '" + F.getName().str() + "' function";
  76. if (!EC)
  77. WriteGraph(File, Graph, IsSimple, Title);
  78. else
  79. errs() << " error opening file for writing!";
  80. errs() << "\n";
  81. return false;
  82. }
  83. void getAnalysisUsage(AnalysisUsage &AU) const override {
  84. AU.setPreservesAll();
  85. AU.addRequired<AnalysisT>();
  86. }
  87. private:
  88. std::string Name;
  89. };
  90. template <
  91. typename AnalysisT, bool IsSimple, typename GraphT = AnalysisT *,
  92. typename AnalysisGraphTraitsT = DefaultAnalysisGraphTraits<AnalysisT> >
  93. class DOTGraphTraitsModuleViewer : public ModulePass {
  94. public:
  95. DOTGraphTraitsModuleViewer(StringRef GraphName, char &ID)
  96. : ModulePass(ID), Name(GraphName) {}
  97. bool runOnModule(Module &M) override {
  98. GraphT Graph = AnalysisGraphTraitsT::getGraph(&getAnalysis<AnalysisT>());
  99. std::string Title = DOTGraphTraits<GraphT>::getGraphName(Graph);
  100. // HLSL Change Starts
  101. if (OSOverride != nullptr) {
  102. *OSOverride << "\ngraph: " << Title << ".dot\n";
  103. llvm::WriteGraph(*OSOverride, Graph, false, Title);
  104. return false;
  105. }
  106. // HLSL Change Ends
  107. ViewGraph(Graph, Name, IsSimple, Title);
  108. return false;
  109. }
  110. void getAnalysisUsage(AnalysisUsage &AU) const override {
  111. AU.setPreservesAll();
  112. AU.addRequired<AnalysisT>();
  113. }
  114. private:
  115. std::string Name;
  116. };
  117. template <
  118. typename AnalysisT, bool IsSimple, typename GraphT = AnalysisT *,
  119. typename AnalysisGraphTraitsT = DefaultAnalysisGraphTraits<AnalysisT> >
  120. class DOTGraphTraitsModulePrinter : public ModulePass {
  121. public:
  122. DOTGraphTraitsModulePrinter(StringRef GraphName, char &ID)
  123. : ModulePass(ID), Name(GraphName) {}
  124. bool runOnModule(Module &M) override {
  125. GraphT Graph = AnalysisGraphTraitsT::getGraph(&getAnalysis<AnalysisT>());
  126. // HLSL Change Starts
  127. if (OSOverride != nullptr) {
  128. *OSOverride << "\ngraph: " << Name << ".dot\n";
  129. llvm::WriteGraph(*OSOverride, Graph, false, DOTGraphTraits<GraphT>::getGraphName(Graph));
  130. return false;
  131. }
  132. // HLSL Change Ends
  133. std::string Filename = Name + ".dot";
  134. std::error_code EC;
  135. errs() << "Writing '" << Filename << "'...";
  136. raw_fd_ostream File(Filename, EC, sys::fs::F_Text);
  137. std::string Title = DOTGraphTraits<GraphT>::getGraphName(Graph);
  138. if (!EC)
  139. WriteGraph(File, Graph, IsSimple, Title);
  140. else
  141. errs() << " error opening file for writing!";
  142. errs() << "\n";
  143. return false;
  144. }
  145. void getAnalysisUsage(AnalysisUsage &AU) const override {
  146. AU.setPreservesAll();
  147. AU.addRequired<AnalysisT>();
  148. }
  149. private:
  150. std::string Name;
  151. };
  152. } // end namespace llvm
  153. #endif