52 std::stringstream rawstr(str);
53 rawstr <<
"MRSVFGNode ID: " <<
getId();
60 std::stringstream rawstr(str);
61 rawstr <<
"FormalINSVFGNode ID: " <<
getId() <<
" {fun: " <<
getFun()->
getName() <<
"}";
71 std::stringstream rawstr(str);
72 rawstr <<
"FormalOUTSVFGNode ID: " <<
getId() <<
" {fun: " <<
getFun()->
getName() <<
"}";
81 std::stringstream rawstr(str);
92 std::stringstream rawstr(str);
104 std::stringstream rawstr(str);
105 rawstr <<
"MSSAPHISVFGNode ID: " <<
getId() <<
" {fun: " <<
getFun()->
getName() <<
"}";
110 rawstr <<
"MR_" << it->second->getMR()->getMRID() <<
"V_" << it->second->getSSAVersion() <<
", ";
117 rawstr << intraNode->getSourceLoc();
125 std::stringstream rawstr(str);
126 rawstr <<
"IntraMSSAPHISVFGNode ID: " <<
getId() <<
" {fun: " <<
getFun()->
getName() <<
"}";
141 std::stringstream rawstr(str);
143 rawstr <<
"FormalINPHISVFGNode ID: " <<
getId() <<
" {fun: " <<
getFun()->
getName() <<
"}";
153 std::stringstream rawstr(str);
154 rawstr <<
"IndirectSVFGEdge: " <<
getDstID() <<
"<--" <<
getSrcID() <<
"\n";
161 std::stringstream rawstr(str);
162 rawstr <<
"IntraIndSVFGEdge: " <<
getDstID() <<
"<--" <<
getSrcID() <<
"\n";
169 std::stringstream rawstr(str);
170 rawstr <<
"CallIndSVFGEdge CallSite ID: " <<
getCallSiteId() <<
" ";
178 std::stringstream rawstr(str);
179 rawstr <<
"RetIndSVFGEdge CallSite ID: " <<
getCallSiteId() <<
" ";
188 std::stringstream rawstr(str);
189 rawstr <<
"ThreadMHPIndSVFGEdge: " <<
getDstID() <<
"<--" <<
getSrcID() <<
"\n";
240 stat->ATVFNodeStart();
244 stat->indVFEdgeStart();
246 stat->indVFEdgeEnd();
260 for (SVFStmt::SVFStmtSetTy::iterator iter = stores.begin(), eiter =
261 stores.end(); iter != eiter; ++iter)
265 for(CHISet::iterator pi =
mssa->getCHISet(store).begin(), epi =
mssa->getCHISet(store).end(); pi!=epi; ++pi)
266 setDef((*pi)->getResVer(),sNode);
272 for(MemSSA::BBToPhiSetMap::iterator it =
mssa->getBBToPhiSetMap().begin(),
273 eit =
mssa->getBBToPhiSetMap().end(); it!=eit; ++it)
275 for(PHISet::iterator pi = it->second.begin(), epi = it->second.end(); pi!=epi; ++pi)
283 for(MemSSA::FunToEntryChiSetMap::iterator it =
mssa->getFunToEntryChiSetMap().begin(),
284 eit =
mssa->getFunToEntryChiSetMap().end(); it!=eit; ++it)
286 for(CHISet::iterator pi = it->second.begin(), epi = it->second.end(); pi!=epi; ++pi)
293 for(MemSSA::FunToReturnMuSetMap::iterator it =
mssa->getFunToRetMuSetMap().begin(),
294 eit =
mssa->getFunToRetMuSetMap().end(); it!=eit; ++it)
296 for(MUSet::iterator pi = it->second.begin(), epi = it->second.end(); pi!=epi; ++pi)
303 for(MemSSA::CallSiteToMUSetMap::iterator it =
mssa->getCallSiteToMuSetMap().begin(),
304 eit =
mssa->getCallSiteToMuSetMap().end();
307 for(MUSet::iterator pi = it->second.begin(), epi = it->second.end(); pi!=epi; ++pi)
314 for(MemSSA::CallSiteToCHISetMap::iterator it =
mssa->getCallSiteToChiSetMap().begin(),
315 eit =
mssa->getCallSiteToChiSetMap().end();
318 for(CHISet::iterator pi = it->second.begin(), epi = it->second.end(); pi!=epi; ++pi)
335 NodeID nodeId = it->first;
340 for(MUSet::iterator it = muSet.begin(), eit = muSet.end(); it!=eit; ++it)
352 for(CHISet::iterator it = chiSet.begin(), eit = chiSet.end(); it!=eit; ++it)
364 mssa->getPTA()->getCallGraph()->getDirCallSitesInvokingCallee(formalIn->getFun(),callInstSet);
365 for(CallGraphEdge::CallInstSet::iterator it = callInstSet.begin(), eit = callInstSet.end(); it!=eit; ++it)
382 mssa->getPTA()->getCallGraph()->getDirCallSitesInvokingCallee(formalOut->getFun(),callInstSet);
383 for(CallGraphEdge::CallInstSet::iterator it = callInstSet.begin(), eit = callInstSet.end(); it!=eit; ++it)
386 if(!
mssa->hasCHI(cs))
400 const MRVer* ver = actualIn->getMRVer();
410 for (MemSSA::PHI::OPVers::const_iterator it = phiNode->opVerBegin(), eit = phiNode->opVerEnd();
413 const MRVer* op = it->second;
432 if (formalIns.
empty())
436 storeIt != storeEit; ++storeIt)
441 const NodeBS& storePts =
mssa->getPTA()->getPts(store->getDstNodeID()).toNodeBS();
444 formalIns.
end(); fiIt != fiEit; ++fiIt)
446 NodeID formalInID = *fiIt;
449 formalInPts &= storePts;
450 if (formalInPts.
empty())
477 return (
addSVFGEdge(indirectEdge) ? indirectEdge :
nullptr);
498 return (
addSVFGEdge(indirectEdge) ? indirectEdge :
nullptr);
518 return (
addSVFGEdge(callEdge) ? callEdge :
nullptr);
590 if (
pag->hasCallSiteArgsMap(callICFGNode) &&
pag->hasFunArgsList(callee))
594 SVFIR::ValVarList::const_iterator csArgIt = csArgList.begin(), csArgEit = csArgList.end();
595 SVFIR::ValVarList::const_iterator funArgIt = funArgList.begin(), funArgEit = funArgList.end();
596 for (; funArgIt != funArgEit && csArgIt != csArgEit; funArgIt++, csArgIt++)
598 const ValVar *cs_arg = *csArgIt;
599 const ValVar *fun_arg = *funArgIt;
603 assert(funArgIt == funArgEit &&
"function has more arguments than call site");
606 NodeID varFunArg =
pag->getVarargNode(callee);
607 const ValVar* varFunArgNode =
pag->getValVar(varFunArg);
610 for (; csArgIt != csArgEit; csArgIt++)
612 const ValVar *cs_arg = *csArgIt;
621 if (
pag->funHasRet(callee) &&
pag->callsiteHasRet(retICFGNode))
623 const ValVar* cs_return =
pag->getCallSiteRet(retICFGNode);
624 const ValVar* fun_return =
pag->getFunRet(callee);
634 ai_eit = actualInNodes.
end(); ai_it!=ai_eit; ++ai_it)
646 ao_eit = actualOutNodes.
end(); ao_it!=ao_eit; ++ao_it)
670 ai_eit = actualInNodes.
end(); ai_it!=ai_eit; ++ai_it)
674 fi_eit = formalInNodes.
end(); fi_it!=fi_eit; ++fi_it)
689 fo_eit = formalOutNodes.
end(); fo_it!=fo_eit; ++fo_it)
693 ao_eit = actualOutNodes.
end(); ao_it!=ao_eit; ++ao_it)
714 if(phi->isFormalParmPHI())
715 return phi->getFun();
723 if(mphi->isFormalINPHI())
724 return mphi->getFun();
736 return ar->getCallSite();
740 if(phi->isActualRetPHI())
741 return phi->getCallSite();
745 return ao->getCallSite();
749 if(mphi->isActualOUTPHI())
750 return mphi->getCallSite();
779 if (indEdge->getPointsTo().test(obj->
getId()))
781 defSites.insert(indEdge->getSrcNode());
814 if (indEdge->getPointsTo().test(obj->
getId()))
816 useSites.insert(indEdge->getDstNode());
865 std::stringstream rawstr(str);
868 rawstr << stmtNode->toString();
872 rawstr << tphi->toString();
876 rawstr << fp->toString();
880 rawstr << ap->toString();
884 rawstr << ar->toString();
888 rawstr << fr->toString();
892 rawstr << fi->toString();
896 rawstr << fo->toString();
900 rawstr << ai->toString();
904 rawstr << ao->toString();
908 rawstr << mphi->toString();
916 rawstr << bop->toString();
920 rawstr << uop->toString();
924 rawstr << cmp->toString();
927 assert(
false &&
"what else kinds of nodes do we have??");
937 std::stringstream rawstr(str);
940 rawstr << stmtNode->toString();
944 rawstr << bop->toString();
948 rawstr << uop->toString();
952 rawstr << cmp->toString();
956 rawstr << mphi->toString();
960 rawstr << tphi->toString();
964 rawstr << fi->toString();
968 rawstr << fo->toString();
972 rawstr << fp->toString();
976 rawstr << ai->toString();
980 rawstr << ao->toString();
984 rawstr << ap->toString();
988 rawstr << nptr->toString();
992 rawstr << ar->toString();
996 rawstr << fr->toString();
1000 rawstr << br->toString();
1003 assert(
false &&
"what else kinds of nodes do we have??");
1005 return rawstr.str();
1011 std::stringstream rawstr(str);
1013 rawstr <<
"shape=record";
1017 const SVFStmt* edge = stmtNode->getSVFStmt();
1020 rawstr <<
",color=green";
1024 rawstr <<
",color=black";
1028 rawstr <<
",color=black,style=dotted";
1032 rawstr <<
",color=\"purple:purple\"";
1036 rawstr <<
",color=blue";
1040 rawstr <<
",color=red";
1044 assert(0 &&
"No such kind edge!!");
1049 rawstr <<
",color=black";
1053 rawstr <<
",color=black";
1057 rawstr <<
",color=grey";
1061 rawstr <<
",color=yellow,penwidth=2";
1065 rawstr <<
",color=yellow,penwidth=2";
1069 rawstr <<
",color=yellow,penwidth=2";
1073 rawstr <<
",color=yellow,penwidth=2";
1077 rawstr <<
",color=yellow,penwidth=2";
1081 rawstr <<
",color=yellow,penwidth=2";
1085 rawstr <<
",color=yellow,penwidth=2";
1089 rawstr <<
",color=yellow,penwidth=2";
1093 rawstr <<
",color=black,penwidth=2";
1097 rawstr <<
",color=black,penwidth=2";
1101 rawstr <<
",color=black,penwidth=2";
1105 rawstr <<
",color=gold,penwidth=2";
1108 assert(
false &&
"no such kind of node!!");
1113 rawstr <<
",style=filled, fillcolor=red";
1117 rawstr <<
",style=filled, fillcolor=blue";
1121 rawstr <<
",style=filled, fillcolor=yellow";
1124 rawstr <<
",style=filled, fillcolor=gray";
1126 return rawstr.str();
1129 template<
class EdgeIter>
1132 SVFGEdge* edge = *(EI.getCurrent());
1133 assert(edge &&
"No edge found!!");
1137 return "style=solid,color=red";
1139 return "style=solid,color=blue";
1141 return "style=solid";
1146 return "style=dashed,color=red";
1148 return "style=dashed,color=blue";
1150 return "style=dashed";
1155 template<
class EdgeIter>
1158 SVFGEdge* edge = *(EI.getCurrent());
1159 assert(edge &&
"No edge found!!");
1162 std::stringstream rawstr(str);
1164 rawstr << dirCall->getCallSiteId();
1166 rawstr << dirRet->getCallSiteId();
1168 rawstr << indCall->getCallSiteId();
1170 rawstr << indRet->getCallSiteId();
1172 return rawstr.str();
#define DBOUT(TYPE, X)
LLVM debug macros, define type of your DBUG model of each pass.
const MRVer * getMRVer() const
Ver.
virtual const std::string toString() const
const CallICFGNode * getCallSite() const
Callsite.
const CallICFGNode * getCallSite() const
Callsite.
virtual const std::string toString() const
const MRVer * getMRVer() const
Ver.
const CallICFGNode * getCallSite() const
Return callsite.
Set< const CallICFGNode * > CallInstSet
const RetICFGNode * getRetICFGNode() const
Return callsite.
const std::string getSourceLoc() const override
virtual const std::string toString() const
CallSiteID getCallSiteId() const
const CallICFGNode * getCallSite() const
Return callsite.
const NodeBS getDefSVFVars() const override
Return the left hand side SVF Vars.
const FunObjVar * getFunction() const
Return function.
NodeType * getDstNode() const
const GEdgeSetTy & getOutEdges() const
const GEdgeSetTy & getInEdges() const
iterator OutEdgeBegin()
iterators
static void WriteGraphToFile(SVF::OutStream &O, const std::string &GraphName, const GraphType >, bool simple=false)
virtual const FunObjVar * getFun() const
Return the function of this ICFGNode.
virtual const std::string toString() const
bool addPointsTo(const NodeBS &c)
Handle memory region.
virtual const std::string toString() const
bool isFormalINPHI() const
const FunObjVar * getFun() const
Get the function of this SVFGNode.
const CallICFGNode * getCallSite() const
virtual const std::string toString() const
virtual const std::string toString() const
virtual const std::string toString() const override
MRSVFGNode(NodeID id, VFGNodeK k)
const NodeBS & getPointsTo() const
Return points-to of the MR.
const NodeBS getDefSVFVars() const override
Return the left hand side SVF Vars.
MRVERSION getSSAVersion() const
Return SSA version.
const MemRegion * getMR() const
Return the memory region.
MRVer * getResVer() const
Set operand vers.
MRVer * getMRVer() const
Get Ver.
virtual const std::string toString() const
OPVers::const_iterator opVerEnd() const
const MRVer * getResVer() const
Ver.
OPVers::const_iterator opVerBegin() const
OPVers::const_iterator opVerEnd() const
OPVers::const_iterator opVerBegin() const
Operand ver iterators.
const SVFBasicBlock * getBasicBlock() const
Return the basic block.
MRID getMRID() const
Return memory region ID.
const NodeBS & getPointsTo() const
Return points-to.
std::string dumpStr() const
Dump string.
CallCHI< Condition > CALLCHI
EntryCHI< Condition > ENTRYCHI
CallMU< Condition > CALLMU
static const Option< std::string > ReadSVFG
static const Option< std::string > WriteSVFG
static const Option< bool > ShowHiddenNode
CallSiteID getCallSiteId() const
virtual const std::string toString() const
const FunObjVar * getFunction() const
Return function.
const ICFGNode * front() const
bool inBackwardSlice(const SVFGNode *node) const
bool isSource(const SVFGNode *node) const
bool inForwardSlice(const SVFGNode *node) const
bool isSink(const SVFGNode *node) const
virtual void getInterVFEdgeAtIndCSFromFOutToAOut(ActualOUTSVFGNode *actualOut, const FunObjVar *callee, SVFGEdgeSetTy &edges)
SVFG(std::unique_ptr< MemSSA > mssa, VFGK k)
Constructor.
virtual void buildSVFG()
Start building SVFG.
void connectIndirectSVFGEdges()
Connect direct SVFG edges between two SVFG nodes (value-flow of top address-taken variables).
SVFGEdge * addThreadMHPIndirectVFEdge(NodeID srcId, NodeID dstId, const NodeBS &cpts)
ActualOUTSVFGNodeSet & getActualOUTSVFGNodes(const CallICFGNode *cs)
FormalOUTSVFGNodeSet & getFormalOUTSVFGNodes(const FunObjVar *fun)
NodeBS ActualOUTSVFGNodeSet
FormalINSVFGNodeSet & getFormalINSVFGNodes(const FunObjVar *fun)
SVFGStat * getStat() const
Return statistics.
virtual void connectFOutAndAOut(const FormalOUTSVFGNode *formalOut, const ActualOUTSVFGNode *actualOut, CallSiteID csId, SVFGEdgeSetTy &edges)
Connect formal-out and actual-out.
virtual void getInterVFEdgeAtIndCSFromAPToFP(const ValVar *cs_arg, const ValVar *fun_arg, const CallICFGNode *, CallSiteID csId, SVFGEdgeSetTy &edges)
Get inter value flow edges between indirect call site and callee.
SVFGEdge * addInterIndirectVFCallEdge(const ActualINSVFGNode *src, const FormalINSVFGNode *dst, CallSiteID csId)
Add inter VF edge from callsite mu to function entry chi.
virtual void getInterVFEdgeAtIndCSFromAInToFIn(ActualINSVFGNode *actualIn, const FunObjVar *callee, SVFGEdgeSetTy &edges)
void connectFromGlobalToProgEntry()
Connect indirect SVFG edges from global initializers (store) to main function entry.
SVFGNode * getSVFGNode(NodeID id) const
Get a SVFG node.
void getInterVFEdgesForIndirectCallSite(const CallICFGNode *cs, const FunObjVar *callee, SVFGEdgeSetTy &edges)
Get all inter value flow edges of a indirect call site.
void dump(const std::string &file, bool simple=false)
Dump graph into dot file.
void addIntraMSSAPHISVFGNode(ICFGNode *BlockICFGNode, const Map< u32_t, const MRVer * >::const_iterator opVerBegin, const Map< u32_t, const MRVer * >::const_iterator opVerEnd, const MRVer *resVer, const NodeID nodeId)
Add memory SSA PHI SVFG node.
ActualINSVFGNodeSet & getActualINSVFGNodes(const CallICFGNode *cs)
Get SVFGNode set.
bool addSVFGEdge(SVFGEdge *edge)
Add SVFG edge.
void addActualOUTSVFGNode(const CallICFGNode *callsite, const MRVer *resVer, const NodeID nodeId)
Add memory callsite chi SVFG node.
virtual void writeToFile(const std::string &filename)
void addFormalOUTSVFGNode(const FunExitICFGNode *funExit, const MRVer *ver, const NodeID nodeId)
Add memory Function return mu SVFG node.
void destroy()
Clean up memory.
virtual void connectCallerAndCallee(const CallICFGNode *cs, const FunObjVar *callee, SVFGEdgeSetTy &edges)
Connect SVFG nodes between caller and callee for indirect call site.
bool hasCallSiteMu(const CallICFGNode *cs) const
NodeBS FormalINSVFGNodeSet
void setDef(const ValVar *valVar, const SVFGNode *node)
Given a ValVar, set/get its def SVFG node (definition of top level pointers).
SVFGEdge * addRetIndirectVFEdge(NodeID srcId, NodeID dstId, const NodeBS &cpts, CallSiteID csId)
void addActualINSVFGNode(const CallICFGNode *callsite, const MRVer *ver, const NodeID nodeId)
Add memory callsite mu SVFG node.
bool hasFuncRetMu(const FunObjVar *func) const
NodeID getDef(const ValVar *valVar) const
const Set< const SVFGNode * > getDefSiteOfObjVar(const ObjVar *obj, const SVFGNode *node) const
virtual void readFile(const std::string &filename)
std::unique_ptr< MemSSA > mssa
NodeBS ActualINSVFGNodeSet
void addFormalINSVFGNode(const FunEntryICFGNode *funEntry, const MRVer *resVer, const NodeID nodeId)
Add memory Function entry chi SVFG node.
const Set< const SVFGNode * > getUseSitesOfObjVar(const ObjVar *obj, const SVFGNode *node) const
void addSVFGNodesForAddrTakenVars()
Create SVFG nodes for address-taken variables.
const Set< const SVFGNode * > getUseSitesOfValVar(const ValVar *var) const
virtual void getInterVFEdgeAtIndCSFromFRToAR(const ValVar *fun_ret, const ValVar *cs_ret, CallSiteID csId, SVFGEdgeSetTy &edges)
SVFGEdge * addInterIndirectVFRetEdge(const FormalOUTSVFGNode *src, const ActualOUTSVFGNode *dst, CallSiteID csId)
Add inter VF edge from function exit mu to callsite chi.
virtual void connectAInAndFIn(const ActualINSVFGNode *actualIn, const FormalINSVFGNode *formalIn, CallSiteID csId, SVFGEdgeSetTy &edges)
Connect SVFG nodes between caller and callee for indirect call site.
NodeBS FormalOUTSVFGNodeSet
SVFGEdge * addIntraIndirectVFEdge(NodeID srcId, NodeID dstId, const NodeBS &cpts)
Add indirect def-use edges of a memory region between two statements,.
MemSSA::STORECHI STORECHI
const CallICFGNode * isCallSiteRetSVFGNode(const SVFGNode *node) const
Whether a node is callsite return SVFGNode.
const SVFGNode * getDefSiteOfValVar(const ValVar *var) const
bool hasCallSiteChi(const CallICFGNode *cs) const
bool hasFuncEntryChi(const FunObjVar *func) const
Has function for EntryCHI/RetMU/CallCHI/CallMU.
void performStat()
Perform statistics.
const FunObjVar * isFunEntrySVFGNode(const SVFGNode *node) const
Whether a node is function entry SVFGNode.
void clearMSSA()
Clear MSSA.
const SVFGNode * getDefSVFGNode(const ValVar *valVar) const
Given a valVar, return its definition site.
SVFGEdge * addCallIndirectVFEdge(NodeID srcId, NodeID dstId, const NodeBS &cpts, CallSiteID csId)
PointerAnalysis * getPTA() const
Get Pointer Analysis.
std::vector< const ValVar * > ValVarList
GenericNode< SVFVar, SVFStmt >::GEdgeSetTy SVFStmtSetTy
NodeID getId() const
Get ID.
virtual const std::string & getName() const
const std::string valueOnlyToString() const
SparseBitVectorIterator iterator
bool intersects(const SparseBitVector< ElementSize > *RHS) const
virtual const std::string toString() const
bool isDirectVFGEdge() const
Get methods of the components.
virtual const FunObjVar * getFun() const
Get the function of this SVFGNode.
virtual const ICFGNode * getICFGNode() const
Return corresponding ICFG node.
CallGraph * getCallGraph() const
Return PTACallGraph.
VFGNodeIDToNodeMapTy::iterator iterator
CallSiteID getCallSiteID(const CallICFGNode *cs, const FunObjVar *func) const
Get callsite given a callsiteID.
void checkIntraEdgeParents(const VFGNode *srcNode, const VFGNode *dstNode)
sanitize Intra edges, verify that both nodes belong to the same function.
GlobalVFGNodeSet globalVFGNodes
set of global store VFG nodes
VFG(CallGraph *callgraph, VFGK k=FULLSVFG)
Constructor.
StmtVFGNode * getStmtVFGNode(const SVFStmt *svfStmt) const
Get an VFGNode.
virtual SVFStmt::SVFStmtSetTy & getSVFStmtSet(SVFStmt::PEDGEK kind)
Get SVFStmt set.
VFGEdge * hasIntraVFGEdge(VFGNode *src, VFGNode *dst, VFGEdge::VFGEdgeK kind)
Whether we has a SVFG edge.
VFGEdge::SVFGEdgeSetTy SVFGEdgeSetTy
VFGEdge * hasInterVFGEdge(VFGNode *src, VFGNode *dst, VFGEdge::VFGEdgeK kind, CallSiteID csId)
virtual bool isInterestedSVFVar(const SVFVar *node) const
VFGEdge * hasThreadVFGEdge(VFGNode *src, VFGNode *dst, VFGEdge::VFGEdgeK kind)
virtual void connectCallerAndCallee(const CallICFGNode *cs, const FunObjVar *callee, VFGEdgeSetTy &edges)
Connect VFG nodes between caller and callee for indirect call site.
const FunObjVar * getProgEntryFunction()
Get program entry function.
std::string pasMsg(const std::string &msg)
Print each pass/phase message by converting a string into blue string output.
std::enable_if_t<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type > cast(const Y &Val)
LLVM_NODISCARD bool isa(const Y &Val)
std::ostream & outs()
Overwrite llvm::outs().
constexpr std::remove_reference< T >::type && move(T &&t) noexcept
LLVM_NODISCARD std::enable_if_t<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type > dyn_cast(const Y &Val)
InterPHIVFGNode InterPHISVFGNode
ActualParmVFGNode ActualParmSVFGNode
std::unordered_set< Key, Hash, KeyEqual, Allocator > Set
StoreVFGNode StoreSVFGNode
ActualRetVFGNode ActualRetSVFGNode
FormalParmVFGNode FormalParmSVFGNode
FormalRetVFGNode FormalRetSVFGNode
NullPtrVFGNode NullPtrSVFGNode
static std::string getGraphName(SVFG *)
Return name of the graph.
std::string getNodeLabel(NodeType *node, SVFG *graph)
static std::string getEdgeSourceLabel(NodeType *, EdgeIter EI)
static std::string getSimpleNodeLabel(NodeType *node, SVFG *)
Return label of a VFG node without MemSSA information.
static bool isNodeHidden(SVFGNode *node, SVFG *)
DOTGraphTraits(bool isSimple=false)
static std::string getNodeAttributes(NodeType *node, SVFG *graph)
static std::string getCompleteNodeLabel(NodeType *node, SVFG *)
Return label of a VFG node with MemSSA information.
static std::string getEdgeAttributes(NodeType *, EdgeIter EI, SVFG *)