30#ifndef INCLUDE_UTIL_ICFG_H_
31#define INCLUDE_UTIL_ICFG_H_
58 typedef ICFGNodeIDToNodeMapTy::iterator
iterator;
104 void dump(
const std::string& file,
bool simple =
false);
149 edge->getDstNode()->removeIncomingEdge(
edge);
150 edge->getSrcNode()->removeOutgoingEdge(
edge);
167 assert((
srcfun ==
dstfun) &&
"src and dst nodes of an intra edge should in the same function!" );
void setRetICFGNode(const RetICFGNode *r)
Return callsite.
void addGNode(NodeID id, NodeType *node)
Add a Node.
void removeGNode(NodeType *node)
Delete a node.
bool hasGNode(NodeID id) const
Has a node.
NodeType * getGNode(NodeID id) const
Get a node.
GenericNode< ICFGNode, ICFGEdge >::GEdgeSetTy ICFGEdgeSetTy
virtual FunEntryICFGNode * addFunEntryICFGNode(const FunObjVar *svfFunc)
virtual CallICFGNode * addCallICFGNode(const SVFBasicBlock *bb, const SVFType *ty, const FunObjVar *calledFunc, bool isVararg, bool isvcall, s32_t vcallIdx, const std::string &funNameOfVcall)
void view()
View graph from the debugger.
virtual void addICFGNode(ICFGNode *node)
Add a ICFG node.
bool hasICFGNode(NodeID id) const
Whether has the ICFGNode.
ICFGEdge::ICFGEdgeSetTy ICFGEdgeSetTy
ICFGEdge * hasThreadICFGEdge(ICFGNode *src, ICFGNode *dst, ICFGEdge::ICFGEdgeK kind)
const ICFGNodeToSVFLoopVec & getIcfgNodeToSVFLoopVec() const
void removeICFGNode(ICFGNode *node)
Remove a ICFGNode.
Map< const FunObjVar *, FunExitICFGNode * > FunToFunExitNodeMapTy
Map< const ICFGNode *, SVFLoopVec > ICFGNodeToSVFLoopVec
bool addICFGEdge(ICFGEdge *edge)
Add ICFG edge, only used by addIntraEdge, addCallEdge, addRetEdge etc.
friend class ICFGSimplification
ICFGNodeIDToNodeMapTy::iterator iterator
virtual RetICFGNode * addRetICFGNode(CallICFGNode *call)
void removeICFGEdge(ICFGEdge *edge)
Remove a ICFG edge.
ICFGEdge * getICFGEdge(const ICFGNode *src, const ICFGNode *dst, ICFGEdge::ICFGEdgeK kind)
Get a SVFG edge according to src and dst.
Map< const FunObjVar *, FunEntryICFGNode * > FunToFunEntryNodeMapTy
ICFGNode * getICFGNode(NodeID id) const
Get a ICFG node.
FunToFunEntryNodeMapTy FunToFunEntryNodeMap
map a function to its FunExitICFGNode
virtual IntraICFGNode * addIntraICFGNode(const SVFBasicBlock *bb, bool isRet)
void checkIntraEdgeParents(const ICFGNode *srcNode, const ICFGNode *dstNode)
sanitize Intra edges, verify that both nodes belong to the same function.
ICFGEdge * addCallEdge(ICFGNode *srcNode, ICFGNode *dstNode)
ICFGNodeToSVFLoopVec icfgNodeToSVFLoopVec
map ICFG node to the SVF loops where it resides
FunExitICFGNode * getFunExitICFGNode(const FunObjVar *fun)
Add a function exit node.
ICFGEdge * hasInterICFGEdge(ICFGNode *src, ICFGNode *dst, ICFGEdge::ICFGEdgeK kind)
void addNodeToSVFLoop(const ICFGNode *node, const SVFLoop *loop)
Insert (node, loop) to icfgNodeToSVFLoopVec.
GlobalICFGNode * globalBlockNode
unique basic block for all globals
ICFGNodeIDToNodeMapTy::const_iterator const_iterator
void dump(const std::string &file, bool simple=false)
Dump graph into dot file.
virtual FunExitICFGNode * addFunExitICFGNode(const FunObjVar *svfFunc)
ICFGEdge * addRetEdge(ICFGNode *srcNode, ICFGNode *dstNode)
void updateCallGraph(CallGraph *callgraph)
update ICFG for indirect calls
ICFGEdge * hasIntraICFGEdge(ICFGNode *src, ICFGNode *dst, ICFGEdge::ICFGEdgeK kind)
Whether we has a SVFG edge.
FunToFunExitNodeMapTy FunToFunExitNodeMap
map a function to its FunEntryICFGNode
ICFGEdge * addConditionalIntraEdge(ICFGNode *srcNode, ICFGNode *dstNode, s64_t branchCondVal)
OrderedMap< NodeID, ICFGNode * > ICFGNodeIDToNodeMapTy
FunExitICFGNode * getFunExitBlock(const FunObjVar *fun)
Get/Add a function exit node.
std::vector< const SVFLoop * > SVFLoopVec
ICFGEdge * addIntraEdge(ICFGNode *srcNode, ICFGNode *dstNode)
Add intraprocedural and interprocedural control-flow edges.
FunEntryICFGNode * getFunEntryICFGNode(const FunObjVar *fun)
Add a function entry node.
bool isInLoop(const ICFGNode *node)
Whether node is in a loop.
~ICFG() override
Destructor.
GlobalICFGNode * getGlobalICFGNode() const
FunEntryICFGNode * getFunEntryBlock(const FunObjVar *fun)
Get/Add a function entry node.
SVFLoopVec & getSVFLoops(const ICFGNode *node)
Get loops where a node resides.
NodeID getId() const
Get ID.
llvm::IRBuilder IRBuilder
GenericGraph< ICFGNode, ICFGEdge > GenericICFGTy