| //===-- DomPrinter.h - Dom printer external interface ------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines external functions that can be called to explicitly |
| // instantiate the dominance tree printer. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_ANALYSIS_DOMPRINTER_H |
| #define LLVM_ANALYSIS_DOMPRINTER_H |
| |
| #include "llvm/Analysis/DOTGraphTraitsPass.h" |
| #include "llvm/Analysis/PostDominators.h" |
| #include "llvm/IR/Dominators.h" |
| #include "llvm/IR/PassManager.h" |
| |
| namespace llvm { |
| |
| template <> |
| struct DOTGraphTraits<DomTreeNode *> : public DefaultDOTGraphTraits { |
| |
| DOTGraphTraits(bool isSimple = false) : DefaultDOTGraphTraits(isSimple) {} |
| |
| std::string getNodeLabel(DomTreeNode *Node, DomTreeNode *Graph) { |
| |
| BasicBlock *BB = Node->getBlock(); |
| |
| if (!BB) |
| return "Post dominance root node"; |
| |
| if (isSimple()) |
| return DOTGraphTraits<DOTFuncInfo *>::getSimpleNodeLabel(BB, nullptr); |
| |
| return DOTGraphTraits<DOTFuncInfo *>::getCompleteNodeLabel(BB, nullptr); |
| } |
| }; |
| |
| template <> |
| struct DOTGraphTraits<DominatorTree *> |
| : public DOTGraphTraits<DomTreeNode *> { |
| |
| DOTGraphTraits(bool isSimple = false) |
| : DOTGraphTraits<DomTreeNode *>(isSimple) {} |
| |
| static std::string getGraphName(DominatorTree *DT) { |
| return "Dominator tree"; |
| } |
| |
| std::string getNodeLabel(DomTreeNode *Node, DominatorTree *G) { |
| return DOTGraphTraits<DomTreeNode *>::getNodeLabel(Node, |
| G->getRootNode()); |
| } |
| }; |
| |
| template<> |
| struct DOTGraphTraits<PostDominatorTree *> |
| : public DOTGraphTraits<DomTreeNode*> { |
| |
| DOTGraphTraits (bool isSimple=false) |
| : DOTGraphTraits<DomTreeNode*>(isSimple) {} |
| |
| static std::string getGraphName(PostDominatorTree *DT) { |
| return "Post dominator tree"; |
| } |
| |
| std::string getNodeLabel(DomTreeNode *Node, |
| PostDominatorTree *G) { |
| return DOTGraphTraits<DomTreeNode*>::getNodeLabel(Node, G->getRootNode()); |
| } |
| }; |
| |
| struct DomViewer final : DOTGraphTraitsViewer<DominatorTreeAnalysis, false> { |
| DomViewer() : DOTGraphTraitsViewer<DominatorTreeAnalysis, false>("dom") {} |
| }; |
| |
| struct DomOnlyViewer final : DOTGraphTraitsViewer<DominatorTreeAnalysis, true> { |
| DomOnlyViewer() |
| : DOTGraphTraitsViewer<DominatorTreeAnalysis, true>("domonly") {} |
| }; |
| |
| struct PostDomViewer final |
| : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, false> { |
| PostDomViewer() |
| : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, false>("postdom") {} |
| }; |
| |
| struct PostDomOnlyViewer final |
| : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, true> { |
| PostDomOnlyViewer() |
| : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, true>("postdomonly") {} |
| }; |
| |
| struct DomPrinter final : DOTGraphTraitsPrinter<DominatorTreeAnalysis, false> { |
| DomPrinter() : DOTGraphTraitsPrinter<DominatorTreeAnalysis, false>("dom") {} |
| }; |
| |
| struct DomOnlyPrinter final |
| : DOTGraphTraitsPrinter<DominatorTreeAnalysis, true> { |
| DomOnlyPrinter() |
| : DOTGraphTraitsPrinter<DominatorTreeAnalysis, true>("domonly") {} |
| }; |
| |
| struct PostDomPrinter final |
| : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, false> { |
| PostDomPrinter() |
| : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, false>("postdom") {} |
| }; |
| |
| struct PostDomOnlyPrinter final |
| : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, true> { |
| PostDomOnlyPrinter() |
| : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, true>("postdomonly") {} |
| }; |
| } // namespace llvm |
| |
| namespace llvm { |
| class FunctionPass; |
| FunctionPass *createDomPrinterWrapperPassPass(); |
| FunctionPass *createDomOnlyPrinterWrapperPassPass(); |
| FunctionPass *createDomViewerWrapperPassPass(); |
| FunctionPass *createDomOnlyViewerWrapperPassPass(); |
| FunctionPass *createPostDomPrinterWrapperPassPass(); |
| FunctionPass *createPostDomOnlyPrinterWrapperPassPass(); |
| FunctionPass *createPostDomViewerWrapperPassPass(); |
| FunctionPass *createPostDomOnlyViewerWrapperPassPass(); |
| } // End llvm namespace |
| |
| #endif |