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 22namespace llvm { 23 24template <> 25struct 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 43template <> 44struct 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 60template<> 61struct 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 77struct DomViewer final : DOTGraphTraitsViewer<DominatorTreeAnalysis, false> { 78 DomViewer() : DOTGraphTraitsViewer<DominatorTreeAnalysis, false>("dom") {} 79}; 80 81struct DomOnlyViewer final : DOTGraphTraitsViewer<DominatorTreeAnalysis, true> { 82 DomOnlyViewer() 83 : DOTGraphTraitsViewer<DominatorTreeAnalysis, true>("domonly") {} 84}; 85 86struct PostDomViewer final 87 : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, false> { 88 PostDomViewer() 89 : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, false>("postdom") {} 90}; 91 92struct PostDomOnlyViewer final 93 : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, true> { 94 PostDomOnlyViewer() 95 : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, true>("postdomonly") {} 96}; 97 98struct DomPrinter final : DOTGraphTraitsPrinter<DominatorTreeAnalysis, false> { 99 DomPrinter() : DOTGraphTraitsPrinter<DominatorTreeAnalysis, false>("dom") {} 100}; 101 102struct DomOnlyPrinter final 103 : DOTGraphTraitsPrinter<DominatorTreeAnalysis, true> { 104 DomOnlyPrinter() 105 : DOTGraphTraitsPrinter<DominatorTreeAnalysis, true>("domonly") {} 106}; 107 108struct PostDomPrinter final 109 : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, false> { 110 PostDomPrinter() 111 : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, false>("postdom") {} 112}; 113 114struct PostDomOnlyPrinter final 115 : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, true> { 116 PostDomOnlyPrinter() 117 : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, true>("postdomonly") {} 118}; 119} // namespace llvm 120 121namespace 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