Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===-- DomPrinter.h - Dom printer external interface ------------*- C++ -*-===//
  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. // This file defines external functions that can be called to explicitly
  10. // instantiate the dominance tree printer.
  11. //
  12. //===----------------------------------------------------------------------===//
  13.  
  14. #ifndef LLVM_ANALYSIS_DOMPRINTER_H
  15. #define LLVM_ANALYSIS_DOMPRINTER_H
  16.  
  17. #include "llvm/Analysis/DOTGraphTraitsPass.h"
  18. #include "llvm/Analysis/PostDominators.h"
  19. #include "llvm/IR/Dominators.h"
  20. #include "llvm/IR/PassManager.h"
  21.  
  22. namespace llvm {
  23.  
  24. template <>
  25. struct DOTGraphTraits<DomTreeNode *> : public DefaultDOTGraphTraits {
  26.  
  27.   DOTGraphTraits(bool isSimple = false) : DefaultDOTGraphTraits(isSimple) {}
  28.  
  29.   std::string getNodeLabel(DomTreeNode *Node, DomTreeNode *Graph) {
  30.  
  31.     BasicBlock *BB = Node->getBlock();
  32.  
  33.     if (!BB)
  34.       return "Post dominance root node";
  35.  
  36.     if (isSimple())
  37.       return DOTGraphTraits<DOTFuncInfo *>::getSimpleNodeLabel(BB, nullptr);
  38.  
  39.     return DOTGraphTraits<DOTFuncInfo *>::getCompleteNodeLabel(BB, nullptr);
  40.   }
  41. };
  42.  
  43. template <>
  44. struct DOTGraphTraits<DominatorTree *>
  45.     : public DOTGraphTraits<DomTreeNode *> {
  46.  
  47.   DOTGraphTraits(bool isSimple = false)
  48.       : DOTGraphTraits<DomTreeNode *>(isSimple) {}
  49.  
  50.   static std::string getGraphName(DominatorTree *DT) {
  51.     return "Dominator tree";
  52.   }
  53.  
  54.   std::string getNodeLabel(DomTreeNode *Node, DominatorTree *G) {
  55.     return DOTGraphTraits<DomTreeNode *>::getNodeLabel(Node,
  56.                                                              G->getRootNode());
  57.   }
  58. };
  59.  
  60. template<>
  61. struct DOTGraphTraits<PostDominatorTree *>
  62.   : public DOTGraphTraits<DomTreeNode*> {
  63.  
  64.   DOTGraphTraits (bool isSimple=false)
  65.     : DOTGraphTraits<DomTreeNode*>(isSimple) {}
  66.  
  67.   static std::string getGraphName(PostDominatorTree *DT) {
  68.     return "Post dominator tree";
  69.   }
  70.  
  71.   std::string getNodeLabel(DomTreeNode *Node,
  72.                            PostDominatorTree *G) {
  73.     return DOTGraphTraits<DomTreeNode*>::getNodeLabel(Node, G->getRootNode());
  74.   }
  75. };
  76.  
  77. struct DomViewer final : DOTGraphTraitsViewer<DominatorTreeAnalysis, false> {
  78.   DomViewer() : DOTGraphTraitsViewer<DominatorTreeAnalysis, false>("dom") {}
  79. };
  80.  
  81. struct DomOnlyViewer final : DOTGraphTraitsViewer<DominatorTreeAnalysis, true> {
  82.   DomOnlyViewer()
  83.       : DOTGraphTraitsViewer<DominatorTreeAnalysis, true>("domonly") {}
  84. };
  85.  
  86. struct PostDomViewer final
  87.     : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, false> {
  88.   PostDomViewer()
  89.       : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, false>("postdom") {}
  90. };
  91.  
  92. struct PostDomOnlyViewer final
  93.     : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, true> {
  94.   PostDomOnlyViewer()
  95.       : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, true>("postdomonly") {}
  96. };
  97.  
  98. struct DomPrinter final : DOTGraphTraitsPrinter<DominatorTreeAnalysis, false> {
  99.   DomPrinter() : DOTGraphTraitsPrinter<DominatorTreeAnalysis, false>("dom") {}
  100. };
  101.  
  102. struct DomOnlyPrinter final
  103.     : DOTGraphTraitsPrinter<DominatorTreeAnalysis, true> {
  104.   DomOnlyPrinter()
  105.       : DOTGraphTraitsPrinter<DominatorTreeAnalysis, true>("domonly") {}
  106. };
  107.  
  108. struct PostDomPrinter final
  109.     : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, false> {
  110.   PostDomPrinter()
  111.       : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, false>("postdom") {}
  112. };
  113.  
  114. struct PostDomOnlyPrinter final
  115.     : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, true> {
  116.   PostDomOnlyPrinter()
  117.       : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, true>("postdomonly") {}
  118. };
  119. } // namespace llvm
  120.  
  121. namespace llvm {
  122.   class FunctionPass;
  123.   FunctionPass *createDomPrinterWrapperPassPass();
  124.   FunctionPass *createDomOnlyPrinterWrapperPassPass();
  125.   FunctionPass *createDomViewerWrapperPassPass();
  126.   FunctionPass *createDomOnlyViewerWrapperPassPass();
  127.   FunctionPass *createPostDomPrinterWrapperPassPass();
  128.   FunctionPass *createPostDomOnlyPrinterWrapperPassPass();
  129.   FunctionPass *createPostDomViewerWrapperPassPass();
  130.   FunctionPass *createPostDomOnlyViewerWrapperPassPass();
  131. } // End llvm namespace
  132.  
  133. #endif
  134.