29#ifndef GRAPHS_SLICEDGRAPHS_H
30#define GRAPHS_SLICEDGRAPHS_H
125 std::vector<const ICFGNode*>& successors);
191 std::vector<const CallICFGNode*>&
out)
const;
193 std::vector<const CallICFGNode*>&
out)
const;
206 std::vector<const CallGraphEdge*>&
out)
const;
208 std::vector<const CallGraphEdge*>&
out)
const;
343 return tcgView->getKeptFunctions();
349 return tcgView->getIndirectSitesWithEmptyTargets();
375 mutable std::unique_ptr<SlicedPAGView>
pagView;
376 std::unique_ptr<SlicedThreadCallGraphView>
tcgView;
389template <
class ViewT,
class RawNodeT>
400 return raw !=
nullptr;
427template <
bool Forward>
502 return a.view ==
b.view &&
a.src ==
b.src &&
a.realIt ==
b.realIt &&
a.brIt ==
b.brIt;
559template <
bool Forward>
638 return a.view ==
b.view &&
a.it ==
b.it;
666template <
bool Forward>
729 return a.view ==
b.view &&
a.src ==
b.src &&
a.realIt ==
b.realIt;
763template <
bool Forward>
838 return a.view ==
b.view &&
a.it ==
b.it;
866template <
bool Forward>
929 return a.view ==
b.view &&
a.src ==
b.src &&
a.realIt ==
b.realIt;
963template <
bool Forward>
1039 return a.view ==
b.view &&
a.it ==
b.it;
1066template <
bool Forward>
1081 const auto&
edges =
Forward ?
n->getOutEdges() :
n->getInEdges();
1091 const auto&
edges =
Forward ?
n->getOutEdges() :
n->getInEdges();
1129 return a.view ==
b.view &&
a.src ==
b.src &&
a.realIt ==
b.realIt;
1165template <
bool Forward>
1245 return a.view ==
b.view &&
a.it ==
b.it;
1292 return g->getFunEntry(fun);
1296 return g->getFunExit(fun);
1299 std::vector<const ICFGNode*>&
out)
1301 g->getFunICFGNodes(fun,
out);
1304 std::vector<const ICFGNode*>&
out)
1306 g->getSuccNodes(
n,
out);
1309 std::vector<const ICFGNode*>&
out)
1311 g->getPredNodes(
n,
out);
1315 return g->isKeptNode(
n);
1343 return child_begin(
n);
1347 return child_end(
n);
1352 return ChildEdgeIteratorType::begin(
n.view,
n.raw);
1356 return ChildEdgeIteratorType::end(
n.view,
n.raw);
1366 return static_cast<unsigned>(
v->getKeptNodes().size());
1370 return n.raw->getId();
1374 const ICFGNode*
raw =
v->getOriginalICFG()->getGNode(
id);
1404 return ChildEdgeIteratorType::begin(
n.view,
n.raw);
1408 return ChildEdgeIteratorType::end(
n.view,
n.raw);
1418 return n.raw->getId();
1440 std::vector<const CallGraphEdge*>&
out)
1442 g->getInEdgesOf(
n,
out);
1445 std::vector<const CallGraphEdge*>&
out)
1447 g->getOutEdgesOf(
n,
out);
1451 std::vector<const CallICFGNode*>&
out)
1453 g->getDirectCallsOf(e,
out);
1457 std::vector<const CallICFGNode*>&
out)
1459 g->getIndirectCallsOf(e,
out);
1465 return g->containsCallSite(e,
callSite);
1475 std::vector<const CallGraphEdge*>&
out)
1481 std::vector<const CallGraphEdge*>&
out)
1511 return child_begin(
n);
1515 return child_end(
n);
1520 return ChildEdgeIteratorType::begin(
n.view,
n.raw);
1524 return ChildEdgeIteratorType::end(
n.view,
n.raw);
1534 return static_cast<unsigned>(
v->getKeptNodes().size());
1538 return n.raw->getId();
1571 return ChildEdgeIteratorType::begin(
n.view,
n.raw);
1575 return ChildEdgeIteratorType::end(
n.view,
n.raw);
1584 return n.raw->getId();
1627 return child_begin(
n);
1631 return child_end(
n);
1636 return ChildEdgeIteratorType::begin(
n.view,
n.raw);
1640 return ChildEdgeIteratorType::end(
n.view,
n.raw);
1650 return static_cast<unsigned>(
v->getKeptNodeIds().size());
1654 return n.raw->getId();
1658 const bool kept =
v->getKeptNodeIds().count(
id) > 0;
1659 return NodeRef{
v,
kept ?
v->getSVFIR()->getGNode(
id) :
nullptr};
1687 return ChildEdgeIteratorType::begin(
n.view,
n.raw);
1691 return ChildEdgeIteratorType::end(
n.view,
n.raw);
1700 return n.raw->getId();
1713 static constexpr bool isFilteredGraph =
true;
1723 return g->isKeptNode(
n);
1728 return g->isKeptEdge(e);
1738 assert(
v->getSVFG() &&
"SlicedSVFGView: bind the SVFG before iterating nodes");
1743 assert(
v->getSVFG() &&
"SlicedSVFGView: bind the SVFG before iterating nodes");
1757 return child_begin(
n);
1761 return child_end(
n);
1766 return ChildEdgeIteratorType::begin(
n.view,
n.raw);
1770 return ChildEdgeIteratorType::end(
n.view,
n.raw);
1779 return n.raw->getId();
1783 return static_cast<unsigned>(
v->getKeptNodeCount());
1788 (
v->getSVFG() !=
nullptr) ?
v->getSVFG()->getGNode(
id) :
nullptr;
1817 return ChildEdgeIteratorType::begin(
n.view,
n.raw);
1821 return ChildEdgeIteratorType::end(
n.view,
n.raw);
1830 return n.raw->getId();
const char *const const char *const raw
Set< const FunObjVar * > FunctionSet
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
static void getLocalSuccessors(const ICFGNode *node, const Map< const ICFGNode *, const ICFGNode * > &callsiteReturnNodes, std::vector< const ICFGNode * > &successors)
const ICFGNode * getFunExit(const FunObjVar *fun) const
Kept synthetic exit node of fun, or null when fun is outside the view.
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
First kept node of fun's entry, or null when fun is outside the view.
void buildICFGSets(const OrderedSet< const ICFGNode * > &keepNodes)
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
size_t getKeptNodeCount() const
bool isKeptNode(const SVFGNode *n) const
Whether the node is retained (see the class comment for the rule).
SlicedSVFGView(const SVFG *svfg, const NodeBS &retainedNodeIds)
bool isKeptEdge(const SVFGEdge *e) const
Whether the edge is retained: both endpoints kept (no bridges).
void dump(const std::string &filename) const
Dump the sliced SVFG (retained nodes/edges only) via GraphWriter.
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 dumpStats(const std::string &prefix="") const
Output statistics.
const OrderedSet< const SVFStmt * > & getKeptStatements() const
Get all kept statements.
void ensurePAGView() const
const Set< const CallICFGNode * > & getIndirectSitesWithEmptyTargets() const
Get indirect call sites that lost all targets after filtering.
void getCalleesOf(const CallICFGNode *callSite, CallGraph::FunctionSet &callees) const
Retained callees of a callsite.
const OrderedSet< const CallGraphNode * > & getKeptNodes() const
Get all kept nodes.
void getDirectCallsOf(const CallGraphEdge *edge, std::vector< const CallICFGNode * > &out) const
Retained callsites carried by an aggregated call-graph edge.
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 CallGraphEdge * > keptEdges
bool containsCallSite(const CallGraphEdge *edge, const CallICFGNode *callSite) const
Whether this precise callsite-to-callee relation is retained.
void getIndirectCallsOf(const CallGraphEdge *edge, std::vector< const CallICFGNode * > &out) const
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
Map< const CallGraphEdge *, CallGraphEdge::CallInstSet > keptDirectCalls
void getForkEdgesOf(const CallICFGNode *callSite, std::vector< const CallGraphEdge * > &out) const
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)
void getJoinEdgesOf(const CallICFGNode *callSite, std::vector< const CallGraphEdge * > &out) const
CallGraph * getBackingCallGraph() const
Map< const CallGraphEdge *, CallGraphEdge::CallInstSet > keptIndirectCalls
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 const ICFGNode * getFunExit(const SlicedICFGView *g, const FunObjVar *fun)
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 unsigned graphSize(const SlicedSVFGView *v)
static NodeRef edge_dest(const EdgeRef &e)
static ChildEdgeIteratorType child_edge_begin(NodeRef n)
static bool containsEdge(const SlicedSVFGView *g, const SVFGEdge *e)
static ChildIteratorType child_end(NodeRef n)
static nodes_iterator nodes_end(const SlicedThreadCallGraphView *v)
static ChildIteratorType direct_child_begin(NodeRef n)
static void getForkEdges(const SlicedThreadCallGraphView *g, const CallICFGNode *callSite, std::vector< const CallGraphEdge * > &out)
static NodeRef edge_dest(const EdgeRef &e)
SlicedCGEdgeIterImpl< true > ChildEdgeIteratorType
static bool containsCallSite(const SlicedThreadCallGraphView *g, const CallGraphEdge *e, const CallICFGNode *callSite)
static void getIndirectCalls(const SlicedThreadCallGraphView *g, const CallGraphEdge *e, std::vector< const CallICFGNode * > &out)
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 void getDirectCalls(const SlicedThreadCallGraphView *g, const CallGraphEdge *e, std::vector< const CallICFGNode * > &out)
static void getJoinEdges(const SlicedThreadCallGraphView *g, const CallICFGNode *callSite, std::vector< const CallGraphEdge * > &out)
static void getCallees(const SlicedThreadCallGraphView *g, const CallICFGNode *callSite, CallGraph::FunctionSet &callees)
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)
static void getOutEdges(const SlicedThreadCallGraphView *g, const CallGraphNode *n, std::vector< const CallGraphEdge * > &out)
SlicedCGChildIterImpl< true > ChildIteratorType
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