//- Dominators.h - Implementation of dominators tree for Clang CFG -*- 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 implements the dominators tree functionality for Clang CFGs. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_ANALYSIS_ANALYSES_DOMINATORS_H #define LLVM_CLANG_ANALYSIS_ANALYSES_DOMINATORS_H #include "clang/Analysis/AnalysisDeclContext.h" #include "clang/Analysis/CFG.h" #include "llvm/ADT/DepthFirstIterator.h" #include "llvm/ADT/GraphTraits.h" #include "llvm/ADT/iterator.h" #include "llvm/Support/GenericIteratedDominanceFrontier.h" #include "llvm/Support/GenericDomTree.h" #include "llvm/Support/GenericDomTreeConstruction.h" #include "llvm/Support/raw_ostream.h" // FIXME: There is no good reason for the domtree to require a print method // which accepts an LLVM Module, so remove this (and the method's argument that // needs it) when that is fixed. namespace llvm { class Module; } // namespace llvm namespace clang { DomTreeNode; /// Dominator tree builder for Clang's CFG based on llvm::DominatorTreeBase. template <bool IsPostDom> class CFGDominatorTreeImpl : public ManagedAnalysis { … }; CFGDomTree; CFGPostDomTree; template<> void CFGDominatorTreeImpl<true>::anchor(); template<> void CFGDominatorTreeImpl<false>::anchor(); } // end of namespace clang namespace llvm { namespace IDFCalculatorDetail { /// Specialize ChildrenGetterTy to skip nullpointer successors. ChildrenGetterTy<clang::CFGBlock, IsPostDom>; } // end of namespace IDFCalculatorDetail } // end of namespace llvm namespace clang { class ControlDependencyCalculator : public ManagedAnalysis { … }; } // namespace clang namespace llvm { //===------------------------------------- /// DominatorTree GraphTraits specialization so the DominatorTree can be /// iterable by generic graph iterators. /// template <> struct GraphTraits<clang::DomTreeNode *> { … }; template <> struct GraphTraits<clang::CFGDomTree *> : public GraphTraits<clang::DomTreeNode *> { … }; } // namespace llvm #endif // LLVM_CLANG_ANALYSIS_ANALYSES_DOMINATORS_H