//===- CFGDiff.h - Define a CFG snapshot. -----------------------*- 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 specializations of GraphTraits that allows generic // algorithms to see a different snapshot of a CFG. // //===----------------------------------------------------------------------===// #ifndef LLVM_SUPPORT_CFGDIFF_H #define LLVM_SUPPORT_CFGDIFF_H #include "llvm/ADT/GraphTraits.h" #include "llvm/ADT/iterator.h" #include "llvm/ADT/iterator_range.h" #include "llvm/Support/CFGUpdate.h" #include "llvm/Support/type_traits.h" #include <cassert> #include <cstddef> #include <iterator> // Two booleans are used to define orders in graphs: // InverseGraph defines when we need to reverse the whole graph and is as such // also equivalent to applying updates in reverse. // InverseEdge defines whether we want to change the edges direction. E.g., for // a non-inversed graph, the children are naturally the successors when // InverseEdge is false and the predecessors when InverseEdge is true. namespace llvm { namespace detail { template <typename Range> auto reverse_if_helper(Range &&R, std::integral_constant<bool, false>) { … } template <typename Range> auto reverse_if_helper(Range &&R, std::integral_constant<bool, true>) { … } template <bool B, typename Range> auto reverse_if(Range &&R) { … } } // namespace detail // GraphDiff defines a CFG snapshot: given a set of Update<NodePtr>, provides // a getChildren method to get a Node's children based on the additional updates // in the snapshot. The current diff treats the CFG as a graph rather than a // multigraph. Added edges are pruned to be unique, and deleted edges will // remove all existing edges between two blocks. template <typename NodePtr, bool InverseGraph = false> class GraphDiff { … }; } // end namespace llvm #endif // LLVM_SUPPORT_CFGDIFF_H