33#ifndef GRAPHS_SLICEDGRAPHS_H
34#define GRAPHS_SLICEDGRAPHS_H
53#include <unordered_map>
54#include <unordered_set>
352 return tcgView->getKeptFunctions();
358 return tcgView->getIndirectSitesWithEmptyTargets();
364 return pagView->getKeptStmts();
370 std::vector<const CallGraphEdge*>&
out)
const;
392 std::unique_ptr<SlicedThreadCallGraphView>
tcgView;
405template <
class ViewT,
class RawNodeT>
416 return raw !=
nullptr;
443template <
bool Forward>
518 return a.view ==
b.view &&
a.src ==
b.src &&
a.realIt ==
b.realIt &&
a.brIt ==
b.brIt;
575template <
bool Forward>
682template <
bool Forward>
745 return a.view ==
b.view &&
a.src ==
b.src &&
a.realIt ==
b.realIt;
779template <
bool Forward>
882template <
bool Forward>
945 return a.view ==
b.view &&
a.src ==
b.src &&
a.realIt ==
b.realIt;
979template <
bool Forward>
1055 return a.it ==
b.it;
1082template <
bool Forward>
1097 const auto&
edges =
Forward ?
n->getOutEdges() :
n->getInEdges();
1107 const auto&
edges =
Forward ?
n->getOutEdges() :
n->getInEdges();
1145 return a.view ==
b.view &&
a.src ==
b.src &&
a.realIt ==
b.realIt;
1181template <
bool Forward>
1261 return a.it ==
b.it;
1308 return g->getFunEntry(fun);
1311 std::vector<const ICFGNode*>&
out)
1313 g->getFunICFGNodes(fun,
out);
1316 std::vector<const ICFGNode*>&
out)
1318 g->getSuccNodes(
n,
out);
1321 std::vector<const ICFGNode*>&
out)
1323 g->getPredNodes(
n,
out);
1327 return g->isKeptNode(
n);
1355 return child_begin(
n);
1359 return child_end(
n);
1364 return ChildEdgeIteratorType::begin(
n.view,
n.raw);
1368 return ChildEdgeIteratorType::end(
n.view,
n.raw);
1378 return static_cast<unsigned>(
v->getKeptNodes().size());
1382 return n.raw->getId();
1386 const ICFGNode*
raw =
v->getOriginalICFG()->getGNode(
id);
1416 return ChildEdgeIteratorType::begin(
n.view,
n.raw);
1420 return ChildEdgeIteratorType::end(
n.view,
n.raw);
1430 return n.raw->getId();
1452 std::vector<const CallGraphEdge*>&
out)
1454 g->getInEdgesOf(
n,
out);
1458 return g->getOriginalCallGraph();
1486 return child_begin(
n);
1490 return child_end(
n);
1495 return ChildEdgeIteratorType::begin(
n.view,
n.raw);
1499 return ChildEdgeIteratorType::end(
n.view,
n.raw);
1509 return static_cast<unsigned>(
v->getKeptNodes().size());
1513 return n.raw->getId();
1546 return ChildEdgeIteratorType::begin(
n.view,
n.raw);
1550 return ChildEdgeIteratorType::end(
n.view,
n.raw);
1559 return n.raw->getId();
1602 return child_begin(
n);
1606 return child_end(
n);
1611 return ChildEdgeIteratorType::begin(
n.view,
n.raw);
1615 return ChildEdgeIteratorType::end(
n.view,
n.raw);
1625 return static_cast<unsigned>(
v->getKeptNodeIds().size());
1629 return n.raw->getId();
1633 const bool kept =
v->getKeptNodeIds().count(
id) > 0;
1634 return NodeRef{
v,
kept ?
v->getSVFIR()->getGNode(
id) :
nullptr};
1662 return ChildEdgeIteratorType::begin(
n.view,
n.raw);
1666 return ChildEdgeIteratorType::end(
n.view,
n.raw);
1675 return n.raw->getId();
1697 return g->isKeptNode(
n);
1707 assert(
v->getSVFG() &&
"SlicedSVFGView: bind the SVFG before iterating nodes");
1712 assert(
v->getSVFG() &&
"SlicedSVFGView: bind the SVFG before iterating nodes");
1726 return child_begin(
n);
1730 return child_end(
n);
1735 return ChildEdgeIteratorType::begin(
n.view,
n.raw);
1739 return ChildEdgeIteratorType::end(
n.view,
n.raw);
1748 return n.raw->getId();
1753 (
v->getSVFG() !=
nullptr) ?
v->getSVFG()->getGNode(
id) :
nullptr;
1782 return ChildEdgeIteratorType::begin(
n.view,
n.raw);
1786 return ChildEdgeIteratorType::end(
n.view,
n.raw);
1795 return n.raw->getId();
const char *const const char *const raw
CallGraphEdge::CallGraphEdgeSet CallGraphEdgeSet
NodeType * getSrcNode() const
NodeType * getDstNode() const
IDToNodeMapTy::const_iterator const_iterator
NodeType * getGNode(NodeID id) const
Get a node.
GEdgeSetTy::const_iterator const_iterator
ICFGEdge::ICFGEdgeSetTy::const_iterator const_iterator
SlicedCGEdgeIterImpl< Forward > e
SlicedCGChildIterImpl()=default
reference operator*() const
SlicedCGChildIterImpl operator++(int)
std::forward_iterator_tag iterator_category
const SlicedCallGraphEdgeRef & currentEdge() const
friend bool operator!=(const SlicedCGChildIterImpl &a, const SlicedCGChildIterImpl &b)
SlicedCGChildIterImpl & operator++()
SlicedCGChildIterImpl(SlicedCGEdgeIterImpl< Forward > it)
std::ptrdiff_t difference_type
friend bool operator==(const SlicedCGChildIterImpl &a, const SlicedCGChildIterImpl &b)
SlicedCGEdgeIterImpl()=default
SlicedCGEdgeIterImpl(const SlicedThreadCallGraphView *v, const CallGraphNode *n)
reference operator*() const
pointer operator->() const
SlicedCallGraphEdgeRef cur
SlicedCallGraphNodeRef target() const
static SlicedCGEdgeIterImpl end(const SlicedThreadCallGraphView *v, const CallGraphNode *n)
const CallGraphNode * src
friend bool operator!=(const SlicedCGEdgeIterImpl &a, const SlicedCGEdgeIterImpl &b)
friend bool operator==(const SlicedCGEdgeIterImpl &a, const SlicedCGEdgeIterImpl &b)
const SlicedThreadCallGraphView * view
CallGraphNode::const_iterator EdgeIt
std::forward_iterator_tag iterator_category
SlicedCGEdgeIterImpl & operator++()
SlicedCGEdgeIterImpl operator++(int)
static SlicedCGEdgeIterImpl begin(const SlicedThreadCallGraphView *v, const CallGraphNode *n)
std::ptrdiff_t difference_type
SlicedCGNodeIter & operator++()
std::forward_iterator_tag iterator_category
OrderedSet< constCallGraphNode * >::const_iterator it
SlicedCGNodeIter()=default
reference operator*() const
const SlicedThreadCallGraphView * view
friend bool operator!=(const SlicedCGNodeIter &a, const SlicedCGNodeIter &b)
friend bool operator==(const SlicedCGNodeIter &a, const SlicedCGNodeIter &b)
SlicedCGNodeIter operator++(int)
std::ptrdiff_t difference_type
SlicedCGNodeIter(const SlicedThreadCallGraphView *v, OrderedSet< const CallGraphNode * >::const_iterator i)
SlicedICFGChildIterImpl operator++(int)
const SlicedICFGEdgeRef & currentEdge() const
friend bool operator==(const SlicedICFGChildIterImpl &a, const SlicedICFGChildIterImpl &b)
std::forward_iterator_tag iterator_category
SlicedICFGChildIterImpl & operator++()
SlicedICFGChildIterImpl()=default
reference operator*() const
std::ptrdiff_t difference_type
friend bool operator!=(const SlicedICFGChildIterImpl &a, const SlicedICFGChildIterImpl &b)
SlicedICFGEdgeIterImpl< Forward > e
SlicedICFGChildIterImpl(SlicedICFGEdgeIterImpl< Forward > it)
static SlicedICFGEdgeIterImpl begin(const SlicedICFGView *v, const ICFGNode *n)
static const OrderedSet< const ICFGNode * > & emptySet()
const OrderedSet< const ICFGNode * > * bridged
friend bool operator!=(const SlicedICFGEdgeIterImpl &a, const SlicedICFGEdgeIterImpl &b)
SlicedICFGEdgeIterImpl()=default
SlicedICFGNodeRef target() const
OrderedSet< const ICFGNode * >::const_iterator BrIt
pointer operator->() const
const SlicedICFGView * view
std::forward_iterator_tag iterator_category
ICFGNode::const_iterator EdgeIt
SlicedICFGEdgeIterImpl operator++(int)
static SlicedICFGEdgeIterImpl end(const SlicedICFGView *v, const ICFGNode *n)
std::ptrdiff_t difference_type
reference operator*() const
SlicedICFGEdgeIterImpl(const SlicedICFGView *v, const ICFGNode *n)
static const ICFGNode * other(const ICFGEdge *e)
SlicedICFGEdgeIterImpl & operator++()
friend bool operator==(const SlicedICFGEdgeIterImpl &a, const SlicedICFGEdgeIterImpl &b)
SlicedICFGNodeIter(const SlicedICFGView *v, OrderedSet< const ICFGNode * >::const_iterator i)
OrderedSet< constICFGNode * >::const_iterator it
std::ptrdiff_t difference_type
friend bool operator==(const SlicedICFGNodeIter &a, const SlicedICFGNodeIter &b)
SlicedICFGNodeIter & operator++()
const SlicedICFGView * view
std::forward_iterator_tag iterator_category
reference operator*() const
friend bool operator!=(const SlicedICFGNodeIter &a, const SlicedICFGNodeIter &b)
SlicedICFGNodeIter operator++(int)
SlicedICFGNodeIter()=default
const OrderedSet< const ICFGNode * > * bridgedPredsOf(const ICFGNode *n) const
const OrderedSet< const ICFGNode * > * bridgedSuccsOf(const ICFGNode *n) const
Set< const ICFGNode * > keptNodesSet
void getPredNodes(const ICFGNode *node, std::vector< const ICFGNode * > &out) const
Get predecessor nodes (including bridged edges)
Map< const ICFGNode *, OrderedSet< const ICFGNode * > > bridgedPreds
void dump(const std::string &filename) const
Dump sliced ICFG to dot file.
bool isKeptNode(const ICFGNode *node) const
Check if a node is in the sliced view.
void getSuccNodes(const ICFGNode *node, std::vector< const ICFGNode * > &out) const
Get successor nodes (including bridged edges)
Map< const ICFGNode *, OrderedSet< const ICFGNode * > > bridgedEdges
const OrderedSet< const ICFGNode * > & getKeptNodes() const
Get all kept nodes.
const ICFGNode * getFunEntry(const FunObjVar *fun) const
OrderedSet< const ICFGEdge * > keptEdges
void buildICFGSets(const OrderedSet< const ICFGNode * > &keepNodes, const OrderedSet< const FunObjVar * > &keptFunctions)
void getFunICFGNodes(const FunObjVar *fun, std::vector< const ICFGNode * > &out) const
Kept ICFG nodes of fun.
OrderedSet< const ICFGNode * > keptNodes
ICFG * getOriginalICFG() const
Get original ICFG.
SlicedPAGChildIterImpl()=default
reference operator*() const
SlicedPAGChildIterImpl operator++(int)
SlicedPAGEdgeIterImpl< Forward > e
std::forward_iterator_tag iterator_category
const SlicedPAGEdgeRef & currentEdge() const
friend bool operator!=(const SlicedPAGChildIterImpl &a, const SlicedPAGChildIterImpl &b)
SlicedPAGChildIterImpl(SlicedPAGEdgeIterImpl< Forward > it)
std::ptrdiff_t difference_type
friend bool operator==(const SlicedPAGChildIterImpl &a, const SlicedPAGChildIterImpl &b)
SlicedPAGChildIterImpl & operator++()
SVFVar::const_iterator EdgeIt
static SlicedPAGEdgeIterImpl end(const SlicedPAGView *v, const SVFVar *n)
SlicedPAGNodeRef target() const
friend bool operator==(const SlicedPAGEdgeIterImpl &a, const SlicedPAGEdgeIterImpl &b)
std::forward_iterator_tag iterator_category
SlicedPAGEdgeIterImpl()=default
friend bool operator!=(const SlicedPAGEdgeIterImpl &a, const SlicedPAGEdgeIterImpl &b)
SlicedPAGEdgeIterImpl & operator++()
static SlicedPAGEdgeIterImpl begin(const SlicedPAGView *v, const SVFVar *n)
const SlicedPAGView * view
reference operator*() const
std::ptrdiff_t difference_type
pointer operator->() const
SlicedPAGEdgeIterImpl operator++(int)
SlicedPAGEdgeIterImpl(const SlicedPAGView *v, const SVFVar *n)
friend bool operator!=(const SlicedPAGNodeIter &a, const SlicedPAGNodeIter &b)
SlicedPAGNodeIter operator++(int)
std::ptrdiff_t difference_type
reference operator*() const
SlicedPAGNodeIter()=default
const SlicedPAGView * view
friend bool operator==(const SlicedPAGNodeIter &a, const SlicedPAGNodeIter &b)
Set< NodeID >::const_iterator it
std::forward_iterator_tag iterator_category
SlicedPAGNodeIter & operator++()
SlicedPAGNodeIter(const SlicedPAGView *v, Set< NodeID >::const_iterator i)
bool isKeptStmt(const SVFStmt *s) const
Set< NodeID > keptNodeIds
const Set< NodeID > & getKeptNodeIds() const
Node IDs (SVFVars) touched by the kept statements – the sliced PAG's nodes.
void dump(const std::string &filename) const
Dump the sliced PAG to a dot file.
OrderedSet< const SVFStmt * > keptStmts
const OrderedSet< const SVFStmt * > & getKeptStmts() const
Get all kept statements.
SVFIR * getSVFIR() const
The underlying SVFIR (to resolve node ids to SVFVars).
std::ptrdiff_t difference_type
SlicedSVFGChildIterImpl(SlicedSVFGEdgeIterImpl< Forward > it)
const SlicedSVFGEdgeRef & currentEdge() const
SlicedSVFGChildIterImpl operator++(int)
SlicedSVFGEdgeIterImpl< Forward > e
SlicedSVFGChildIterImpl()=default
std::forward_iterator_tag iterator_category
reference operator*() const
SlicedSVFGChildIterImpl & operator++()
friend bool operator==(const SlicedSVFGChildIterImpl &a, const SlicedSVFGChildIterImpl &b)
friend bool operator!=(const SlicedSVFGChildIterImpl &a, const SlicedSVFGChildIterImpl &b)
pointer operator->() const
SVFGNode::const_iterator EdgeIt
SlicedSVFGEdgeIterImpl(const SlicedSVFGView *v, const SVFGNode *n)
SlicedSVFGEdgeIterImpl operator++(int)
SlicedSVFGEdgeIterImpl & operator++()
SlicedSVFGEdgeIterImpl()=default
std::forward_iterator_tag iterator_category
friend bool operator!=(const SlicedSVFGEdgeIterImpl &a, const SlicedSVFGEdgeIterImpl &b)
SlicedSVFGNodeRef target() const
const SlicedSVFGView * view
reference operator*() const
friend bool operator==(const SlicedSVFGEdgeIterImpl &a, const SlicedSVFGEdgeIterImpl &b)
static SlicedSVFGEdgeIterImpl end(const SlicedSVFGView *v, const SVFGNode *n)
std::ptrdiff_t difference_type
static SlicedSVFGEdgeIterImpl begin(const SlicedSVFGView *v, const SVFGNode *n)
SlicedSVFGNodeIter()=default
SlicedSVFGNodeIter & operator++()
friend bool operator==(const SlicedSVFGNodeIter &a, const SlicedSVFGNodeIter &b)
friend bool operator!=(const SlicedSVFGNodeIter &a, const SlicedSVFGNodeIter &b)
SlicedSVFGNodeIter operator++(int)
const SlicedSVFGView * view
std::forward_iterator_tag iterator_category
std::ptrdiff_t difference_type
SlicedSVFGNodeIter(const SlicedSVFGView *v, SVFG::const_iterator i, SVFG::const_iterator e)
reference operator*() const
SVFG::const_iterator endIt
const SVFG * getSVFG() const
bool isKeptNode(const SVFGNode *n) const
Whether the node is retained (see the class comment for the rule).
SlicedSVFGView(const SlicedICFGView *icfgView, const SVFG *svfg=nullptr)
const SlicedICFGView * icfgView
bool isKeptEdge(const SVFGEdge *e) const
Whether the edge is retained: both endpoints kept (no bridges).
const SlicedICFGView * getICFGView() const
void dump(const std::string &filename) const
Dump the sliced SVFG (retained nodes/edges only) via GraphWriter.
void setSVFG(const SVFG *g)
Bind the underlying SVFG (enables node iteration and dumping).
const CallGraph * getAnalysisCallGraph() const
const Set< const FunObjVar * > & getKeptFunctions() const
Get all kept functions.
const SlicedThreadCallGraphView * getThreadCallGraph() const
Get SlicedThreadCallGraphView.
std::unique_ptr< SlicedPAGView > pagView
std::unique_ptr< SlicedThreadCallGraphView > tcgView
SVFIR * getSVFIR() const
Get original SVFIR.
void dumpAll(const std::string &prefix) const
Dump all views to files.
SlicedThreadCallGraphView * getThreadCallGraph()
const SlicedICFGView * getICFG() const
Get SlicedICFGView.
SlicedICFGView * getICFG()
std::unique_ptr< SlicedICFGView > icfgView
const SlicedPAGView * getPAG() const
Get SlicedPAGView.
void getInEdgesOfCallGraphNode(const CallGraphNode *node, std::vector< const CallGraphEdge * > &out) const
void dumpStats(const std::string &prefix="") const
Output statistics.
const OrderedSet< const SVFStmt * > & getKeptStatements() const
Get all kept statements.
const Set< const CallICFGNode * > & getIndirectSitesWithEmptyTargets() const
Get indirect call sites that lost all targets after filtering.
const OrderedSet< const CallGraphNode * > & getKeptNodes() const
Get all kept nodes.
void buildCallGraphSets()
bool isKeptNode(const CallGraphNode *node) const
Check if a node is in the sliced view.
void dump(const std::string &filename) const
Dump sliced ThreadCallGraph to dot file.
OrderedSet< const CallGraphNode * > keptNodes
Set< const FunObjVar * > keptFunctionsSet
const Set< const CallICFGNode * > & getIndirectSitesWithEmptyTargets() const
Indirect call sites that lost all targets after filtering.
bool isKeptEdge(const CallGraphEdge *e) const
const Set< const FunObjVar * > & getKeptFunctions() const
const CallGraph::CallGraphEdgeSet & getKeptEdges() const
Get all kept edges.
CallGraph::CallGraphEdgeSet keptEdges
void getOutEdgesOf(const CallGraphNode *node, std::vector< const CallGraphEdge * > &out) const
Get out edges of a node (only returns kept edges and target nodes)
Set< const CallICFGNode * > indirectSitesWithEmptyTargets
void getInEdgesOf(const CallGraphNode *node, std::vector< const CallGraphEdge * > &out) const
Get in edges of a node (only returns kept edges and source nodes)
CallGraph * getOriginalCallGraph() const
Get original CallGraph (ThreadCallGraph inherits from CallGraph)
ThreadCallGraph * getOriginalThreadCallGraph() const
Get original ThreadCallGraph.
OrderedSet< const ICFGNode * > extendedKeptNodes
VFGEdge::VFGEdgeSetTy::const_iterator const_iterator
SlicedNodeRef< SlicedThreadCallGraphView, CallGraphNode > SlicedCallGraphNodeRef
SlicedNodeRef< SlicedSVFGView, SVFGNode > SlicedSVFGNodeRef
std::set< Key, Compare, Allocator > OrderedSet
llvm::IRBuilder IRBuilder
SlicedNodeRef< SlicedPAGView, SVFVar > SlicedPAGNodeRef
SlicedNodeRef< SlicedICFGView, ICFGNode > SlicedICFGNodeRef
std::unordered_set< Key, Hash, KeyEqual, Allocator > Set
static ChildEdgeIteratorType child_edge_begin(NodeRef n)
SlicedICFGChildIterImpl< false > ChildIteratorType
static NodeRef getEntryNode(Inverse< const SlicedICFGView * >)
static ChildIteratorType child_end(NodeRef n)
static NodeRef edge_dest(const EdgeRef &e)
static unsigned getNodeID(NodeRef n)
static ChildIteratorType child_begin(NodeRef n)
SlicedICFGEdgeIterImpl< false > ChildEdgeIteratorType
static ChildEdgeIteratorType child_edge_end(NodeRef n)
static ChildEdgeIteratorType child_edge_end(NodeRef n)
static ChildIteratorType child_begin(NodeRef n)
static NodeRef getEntryNode(Inverse< const SlicedPAGView * >)
SlicedPAGEdgeIterImpl< false > ChildEdgeIteratorType
static ChildIteratorType child_end(NodeRef n)
SlicedPAGChildIterImpl< false > ChildIteratorType
static NodeRef edge_dest(const EdgeRef &e)
static ChildEdgeIteratorType child_edge_begin(NodeRef n)
static unsigned getNodeID(NodeRef n)
static ChildEdgeIteratorType child_edge_end(NodeRef n)
static ChildIteratorType child_end(NodeRef n)
static NodeRef edge_dest(const EdgeRef &e)
static NodeRef getEntryNode(Inverse< const SlicedSVFGView * >)
SlicedSVFGEdgeIterImpl< false > ChildEdgeIteratorType
static ChildEdgeIteratorType child_edge_begin(NodeRef n)
SlicedSVFGChildIterImpl< false > ChildIteratorType
static unsigned getNodeID(NodeRef n)
static ChildIteratorType child_begin(NodeRef n)
static ChildEdgeIteratorType child_edge_begin(NodeRef n)
static NodeRef getEntryNode(Inverse< const SlicedThreadCallGraphView * >)
SlicedCGEdgeIterImpl< false > ChildEdgeIteratorType
static NodeRef edge_dest(const EdgeRef &e)
static unsigned getNodeID(NodeRef n)
static ChildIteratorType child_begin(NodeRef n)
static ChildIteratorType child_end(NodeRef n)
static ChildEdgeIteratorType child_edge_end(NodeRef n)
SlicedCGChildIterImpl< false > ChildIteratorType
static NodeRef getNode(const SlicedICFGView *v, NodeID id)
static void getSuccNodes(const SlicedICFGView *g, const ICFGNode *n, std::vector< const ICFGNode * > &out)
static ChildIteratorType direct_child_begin(NodeRef n)
static nodes_iterator nodes_end(const SlicedICFGView *v)
SlicedICFGChildIterImpl< true > ChildIteratorType
static unsigned getNodeID(NodeRef n)
SlicedICFGEdgeIterImpl< true > ChildEdgeIteratorType
static ChildIteratorType direct_child_end(NodeRef n)
static ChildIteratorType child_begin(NodeRef n)
static const ICFGNode * getRawNode(NodeRef n)
static void getPredNodes(const SlicedICFGView *g, const ICFGNode *n, std::vector< const ICFGNode * > &out)
static NodeRef getEntryNode(const SlicedICFGView *)
static ChildEdgeIteratorType child_edge_begin(NodeRef n)
static void getFunICFGNodes(const SlicedICFGView *g, const FunObjVar *fun, std::vector< const ICFGNode * > &out)
static NodeRef edge_dest(const EdgeRef &e)
static ChildIteratorType child_end(NodeRef n)
static const ICFGNode * getFunEntry(const SlicedICFGView *g, const FunObjVar *fun)
static nodes_iterator nodes_begin(const SlicedICFGView *v)
static bool containsNode(const SlicedICFGView *g, const ICFGNode *n)
static ChildEdgeIteratorType child_edge_end(NodeRef n)
static unsigned graphSize(const SlicedICFGView *v)
SlicedPAGEdgeIterImpl< true > ChildEdgeIteratorType
static ChildIteratorType direct_child_begin(NodeRef n)
static ChildEdgeIteratorType child_edge_begin(NodeRef n)
static unsigned getNodeID(NodeRef n)
static ChildIteratorType direct_child_end(NodeRef n)
static ChildEdgeIteratorType child_edge_end(NodeRef n)
static NodeRef getEntryNode(const SlicedPAGView *)
static const SVFVar * getRawNode(NodeRef n)
static unsigned graphSize(const SlicedPAGView *v)
static ChildIteratorType child_end(NodeRef n)
static NodeRef getNode(const SlicedPAGView *v, NodeID id)
static nodes_iterator nodes_end(const SlicedPAGView *v)
static NodeRef edge_dest(const EdgeRef &e)
SlicedPAGChildIterImpl< true > ChildIteratorType
static ChildIteratorType child_begin(NodeRef n)
static nodes_iterator nodes_begin(const SlicedPAGView *v)
static NodeRef getNode(const SlicedSVFGView *v, NodeID id)
static nodes_iterator nodes_end(const SlicedSVFGView *v)
static ChildIteratorType child_end(NodeRef n)
SlicedSVFGChildIterImpl< true > ChildIteratorType
static ChildIteratorType direct_child_end(NodeRef n)
static ChildIteratorType direct_child_begin(NodeRef n)
static const SVFGNode * getRawNode(NodeRef n)
static bool containsNode(const SlicedSVFGView *g, const SVFGNode *n)
Whether n is retained by this sliced SVFG (the solver's restriction test).
static unsigned getNodeID(NodeRef n)
static NodeRef getEntryNode(const SlicedSVFGView *)
static ChildIteratorType child_begin(NodeRef n)
static ChildEdgeIteratorType child_edge_end(NodeRef n)
SlicedSVFGEdgeIterImpl< true > ChildEdgeIteratorType
static nodes_iterator nodes_begin(const SlicedSVFGView *v)
static NodeRef edge_dest(const EdgeRef &e)
static ChildEdgeIteratorType child_edge_begin(NodeRef n)
static ChildIteratorType child_end(NodeRef n)
static nodes_iterator nodes_end(const SlicedThreadCallGraphView *v)
static ChildIteratorType direct_child_begin(NodeRef n)
static NodeRef edge_dest(const EdgeRef &e)
SlicedCGEdgeIterImpl< true > ChildEdgeIteratorType
static NodeRef getNode(const SlicedThreadCallGraphView *v, NodeID id)
static ChildEdgeIteratorType child_edge_begin(NodeRef n)
static const CallGraphNode * getRawNode(NodeRef n)
static ChildIteratorType direct_child_end(NodeRef n)
static nodes_iterator nodes_begin(const SlicedThreadCallGraphView *v)
static unsigned graphSize(const SlicedThreadCallGraphView *v)
static ChildIteratorType child_begin(NodeRef n)
static void getInEdges(const SlicedThreadCallGraphView *g, const CallGraphNode *n, std::vector< const CallGraphEdge * > &out)
SlicedCGChildIterImpl< true > ChildIteratorType
static const CallGraph * getCallGraph(const SlicedThreadCallGraphView *g)
static ChildEdgeIteratorType child_edge_end(NodeRef n)
static unsigned getNodeID(NodeRef n)
static NodeRef getEntryNode(const SlicedThreadCallGraphView *)
SlicedCallGraphNodeRef src
const CallGraphEdge * underlying
SlicedCallGraphNodeRef dst
const ICFGEdge * underlying
friend bool operator==(SlicedNodeRef lhs, SlicedNodeRef rhs)
SlicedNodeRef(const ViewT *v, const RawNodeT *r)
friend bool operator!=(SlicedNodeRef lhs, SlicedNodeRef rhs)
const SVFStmt * underlying
const SVFGEdge * underlying