Static Value-Flow Analysis
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes | List of all members
SVF::MRGenerator Class Reference

#include <MemRegion.h>

Inheritance diagram for SVF::MRGenerator:
SVF::DistinctMRG SVF::IntraDisjointMRG SVF::InterDisjointMRG

Public Types

typedef FIFOWorkList< NodeIDWorkList
 
typedef OrderedSet< const MemRegion *, MemRegion::equalMemRegionMRSet
 Get typedef from Pointer Analysis.
 
typedef Map< const PAGEdge *, const SVFFunction * > PAGEdgeToFunMap
 
typedef OrderedSet< NodeBS, SVFUtil::equalNodeBSPointsToList
 
typedef Map< const SVFFunction *, NodeBSFunToPointsToMap
 
typedef Map< const SVFFunction *, PointsToListFunToPointsTosMap
 
typedef OrderedMap< NodeBS, NodeBS, SVFUtil::equalNodeBSPtsToRepPtsSetMap
 
typedef Map< const SVFFunction *, MRSetFunToMRsMap
 Map a function to its region set.
 
typedef Map< const LoadStmt *, MRSetLoadsToMRsMap
 
typedef Map< const StoreStmt *, MRSetStoresToMRsMap
 
typedef Map< const CallICFGNode *, MRSetCallSiteToMRsMap
 
typedef Map< const LoadStmt *, NodeBSLoadsToPointsToMap
 Map loads/stores/callsites to their cpts set.
 
typedef Map< const StoreStmt *, NodeBSStoresToPointsToMap
 
typedef Map< const CallICFGNode *, NodeBSCallSiteToPointsToMap
 
typedef Map< const SVFFunction *, NodeBSFunToNodeBSMap
 Maps Mod-Ref analysis.
 
typedef Map< const CallICFGNode *, NodeBSCallSiteToNodeBSMap
 Map a callsite to its indirect refs/mods of memory objects.
 
typedef Map< NodeID, NodeBSNodeToPTSSMap
 
typedef SVFIR::SVFStmtList SVFStmtList
 SVFIR edge list.
 
typedef SCCDetection< PTACallGraph * > SCC
 Call Graph SCC.
 

Public Member Functions

MRSetgetMRSet ()
 
const NodeBSgetRepPointsTo (const NodeBS &cpts) const
 Get superset cpts set.
 
const MemRegiongetMR (const NodeBS &cpts) const
 Get a memory region according to cpts.
 
u32_t getMRNum () const
 
virtual ~MRGenerator ()
 Destructor.
 
virtual void generateMRs ()
 Start generating memory regions.
 
const SVFFunctiongetFunction (const PAGEdge *pagEdge) const
 Get the function which SVFIR Edge located.
 
MRSetgetFunMRSet (const SVFFunction *fun)
 Get Memory Region set.
 
MRSetgetLoadMRSet (const LoadStmt *load)
 
MRSetgetStoreMRSet (const StoreStmt *store)
 
bool hasRefMRSet (const CallICFGNode *cs)
 
bool hasModMRSet (const CallICFGNode *cs)
 
MRSetgetCallSiteRefMRSet (const CallICFGNode *cs)
 
MRSetgetCallSiteModMRSet (const CallICFGNode *cs)
 
bool hasSVFStmtList (const ICFGNode *icfgNode)
 Whether this instruction has SVFIR Edge.
 
SVFStmtListgetPAGEdgesFromInst (const ICFGNode *node)
 Given an instruction, get all its the PAGEdge (statement) in sequence.
 
NodeBS getModInfoForCall (const CallICFGNode *cs)
 getModRefInfo APIs
 
NodeBS getRefInfoForCall (const CallICFGNode *cs)
 
ModRefInfo getModRefInfo (const CallICFGNode *cs)
 
ModRefInfo getModRefInfo (const CallICFGNode *cs, const SVFValue *V)
 
ModRefInfo getModRefInfo (const CallICFGNode *cs1, const CallICFGNode *cs2)
 

Protected Member Functions

 MRGenerator (BVDataPTAImpl *p, bool ptrOnly)
 
void createMR (const SVFFunction *fun, const NodeBS &cpts)
 Generate a memory region and put in into functions which use it.
 
void collectGlobals ()
 Collect all global variables for later escape analysis.
 
virtual void collectModRefForLoadStore ()
 Generate regions for loads/stores.
 
virtual void collectModRefForCall ()
 Generate regions for calls/rets.
 
virtual void partitionMRs ()
 Partition regions.
 
virtual void updateAliasMRs ()
 Update aliased regions for loads/stores/callsites.
 
virtual void sortPointsTo (const NodeBS &cpts)
 Given a condition pts, insert into cptsToRepCPtsMap for region generation.
 
virtual bool isAliasedMR (const NodeBS &cpts, const MemRegion *mr)
 Whether a region is aliased with a conditional points-to.
 
virtual void getAliasMemRegions (MRSet &aliasMRs, const NodeBS &cpts, const SVFFunction *fun)
 Get all aliased mem regions from function fun according to cpts.
 
virtual void getMRsForLoad (MRSet &aliasMRs, const NodeBS &cpts, const SVFFunction *)
 Get memory regions for a load statement according to cpts.
 
virtual void getMRsForCallSiteRef (MRSet &aliasMRs, const NodeBS &cpts, const SVFFunction *)
 Get memory regions for call site ref according to cpts.
 
virtual void modRefAnalysis (PTACallGraphNode *callGraphNode, WorkList &worklist)
 Mod-Ref analysis for callsite invoking this callGraphNode.
 
virtual bool handleCallsiteModRef (NodeBS &mod, NodeBS &ref, const CallICFGNode *cs, const SVFFunction *fun)
 Get Mod-Ref of a callee function.
 
void addCPtsToStore (NodeBS &cpts, const StoreStmt *st, const SVFFunction *fun)
 Add cpts to store/load.
 
void addCPtsToLoad (NodeBS &cpts, const LoadStmt *ld, const SVFFunction *fun)
 
void addCPtsToCallSiteRefs (NodeBS &cpts, const CallICFGNode *cs)
 
void addCPtsToCallSiteMods (NodeBS &cpts, const CallICFGNode *cs)
 
bool hasCPtsList (const SVFFunction *fun) const
 
PointsToListgetPointsToList (const SVFFunction *fun)
 
FunToPointsTosMapgetFunToPointsToList ()
 
void addRefSideEffectOfFunction (const SVFFunction *fun, const NodeBS &refs)
 Add/Get methods for side-effect of functions and callsites.
 
void addModSideEffectOfFunction (const SVFFunction *fun, const NodeBS &mods)
 Add indirect def an memory object in the function.
 
bool addRefSideEffectOfCallSite (const CallICFGNode *cs, const NodeBS &refs)
 Add indirect uses an memory object in the function.
 
bool addModSideEffectOfCallSite (const CallICFGNode *cs, const NodeBS &mods)
 Add indirect def an memory object in the function.
 
const NodeBSgetRefSideEffectOfFunction (const SVFFunction *fun)
 Get indirect refs of a function.
 
const NodeBSgetModSideEffectOfFunction (const SVFFunction *fun)
 Get indirect mods of a function.
 
const NodeBSgetRefSideEffectOfCallSite (const CallICFGNode *cs)
 Get indirect refs of a callsite.
 
const NodeBSgetModSideEffectOfCallSite (const CallICFGNode *cs)
 Get indirect mods of a callsite.
 
bool hasRefSideEffectOfCallSite (const CallICFGNode *cs)
 Has indirect refs of a callsite.
 
bool hasModSideEffectOfCallSite (const CallICFGNode *cs)
 Has indirect mods of a callsite.
 

Protected Attributes

MRSet memRegSet
 A set of All memory regions.
 
PtsToRepPtsSetMap cptsToRepCPtsMap
 Map a condition pts to its rep conditional pts (super set points-to)
 

Private Member Functions

void destroy ()
 Clean up memory.
 
void collectCallSitePts (const CallICFGNode *cs)
 
NodeBSCollectPtsChain (NodeID id)
 
NodeBSgetCallSiteArgsPts (const CallICFGNode *cs)
 Return the pts chain of all callsite arguments.
 
NodeBSgetCallSiteRetPts (const CallICFGNode *cs)
 Return the pts chain of the return parameter of the callsite.
 
bool isNonLocalObject (NodeID id, const SVFFunction *curFun) const
 
void getEscapObjviaGlobals (NodeBS &globs, const NodeBS &pts)
 Get all the objects in callee's modref escaped via global objects (the chain pts of globals)
 
void getCallGraphSCCRevTopoOrder (WorkList &worklist)
 Get reverse topo call graph scc.
 

Private Attributes

BVDataPTAImplpta
 
SCCcallGraphSCC
 
PTACallGraphcallGraph
 
bool ptrOnlyMSSA
 
FunToMRsMap funToMRsMap
 Map a function to all its memory regions.
 
LoadsToMRsMap loadsToMRsMap
 Map a load SVFIR Edge to its memory regions sets in order for inserting mus in Memory SSA.
 
StoresToMRsMap storesToMRsMap
 Map a store SVFIR Edge to its memory regions sets in order for inserting chis in Memory SSA.
 
CallSiteToMRsMap callsiteToRefMRsMap
 Map a callsite to its refs regions.
 
CallSiteToMRsMap callsiteToModMRsMap
 Map a callsite to its mods regions.
 
LoadsToPointsToMap loadsToPointsToMap
 Map a load SVFIR Edge to its CPts set map.
 
StoresToPointsToMap storesToPointsToMap
 Map a store SVFIR Edge to its CPts set map.
 
CallSiteToPointsToMap callsiteToRefPointsToMap
 Map a callsite to it refs cpts set.
 
CallSiteToPointsToMap callsiteToModPointsToMap
 Map a callsite to it mods cpts set.
 
FunToPointsTosMap funToPointsToMap
 Map a function to all of its conditional points-to sets.
 
PAGEdgeToFunMap pagEdgeToFunMap
 Map a PAGEdge to its fun.
 
FunToPointsToMap funToRefsMap
 Map a function to its indirect uses of memory objects.
 
FunToPointsToMap funToModsMap
 Map a function to its indirect defs of memory objects.
 
CallSiteToPointsToMap csToRefsMap
 Map a callsite to its indirect uses of memory objects.
 
CallSiteToPointsToMap csToModsMap
 Map a callsite to its indirect defs of memory objects.
 
CallSiteToPointsToMap csToCallSiteArgsPtsMap
 Map a callsite to all its object might pass into its callees.
 
CallSiteToPointsToMap csToCallSiteRetPtsMap
 Map a callsite to all its object might return from its callees.
 
NodeToPTSSMap cachedPtsChainMap
 Map a pointer to its cached points-to chain;.
 
NodeBS allGlobals
 All global variable SVFIR node ids.
 

Detailed Description

Memory Region Partitioning

Definition at line 131 of file MemRegion.h.

Member Typedef Documentation

◆ CallSiteToMRsMap

Definition at line 155 of file MemRegion.h.

◆ CallSiteToNodeBSMap

Map a callsite to its indirect refs/mods of memory objects.

Definition at line 170 of file MemRegion.h.

◆ CallSiteToPointsToMap

Definition at line 162 of file MemRegion.h.

◆ FunToMRsMap

Map a function to its region set.

Definition at line 149 of file MemRegion.h.

◆ FunToNodeBSMap

Maps Mod-Ref analysis.

Map a function to its indirect refs/mods of memory objects

Definition at line 168 of file MemRegion.h.

◆ FunToPointsToMap

Definition at line 144 of file MemRegion.h.

◆ FunToPointsTosMap

Definition at line 145 of file MemRegion.h.

◆ LoadsToMRsMap

Map loads/stores to its mem regions, TODO:visitAtomicCmpXchgInst, visitAtomicRMWInst??

Definition at line 153 of file MemRegion.h.

◆ LoadsToPointsToMap

Map loads/stores/callsites to their cpts set.

Definition at line 160 of file MemRegion.h.

◆ MRSet

Get typedef from Pointer Analysis.

Define mem region set

Definition at line 141 of file MemRegion.h.

◆ NodeToPTSSMap

Definition at line 173 of file MemRegion.h.

◆ PAGEdgeToFunMap

Definition at line 142 of file MemRegion.h.

◆ PointsToList

Definition at line 143 of file MemRegion.h.

◆ PtsToRepPtsSetMap

Definition at line 146 of file MemRegion.h.

◆ SCC

Call Graph SCC.

Definition at line 178 of file MemRegion.h.

◆ StoresToMRsMap

Definition at line 154 of file MemRegion.h.

◆ StoresToPointsToMap

Definition at line 161 of file MemRegion.h.

◆ SVFStmtList

SVFIR edge list.

Definition at line 176 of file MemRegion.h.

◆ WorkList

Definition at line 135 of file MemRegion.h.

Constructor & Destructor Documentation

◆ MRGenerator()

MRGenerator::MRGenerator ( BVDataPTAImpl p,
bool  ptrOnly 
)
protected

Definition at line 42 of file MemRegion.cpp.

42 :
44{
47}
cJSON * p
Definition cJSON.cpp:2559
PTACallGraph * callGraph
Definition MemRegion.h:199
SCCDetection< PTACallGraph * > SCC
Call Graph SCC.
Definition MemRegion.h:178
BVDataPTAImpl * pta
Definition MemRegion.h:197
PTACallGraph * getCallGraph() const
Return call graph.
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:74

◆ ~MRGenerator()

virtual SVF::MRGenerator::~MRGenerator ( )
inlinevirtual

Destructor.

Definition at line 426 of file MemRegion.h.

427 {
428 destroy();
429 }
void destroy()
Clean up memory.
Definition MemRegion.cpp:52

Member Function Documentation

◆ addCPtsToCallSiteMods()

void SVF::MRGenerator::addCPtsToCallSiteMods ( NodeBS cpts,
const CallICFGNode cs 
)
inlineprotected

Definition at line 358 of file MemRegion.h.

359 {
360 callsiteToModPointsToMap[cs] |= cpts;
361 funToPointsToMap[cs->getCaller()].insert(cpts);
362 }
FunToPointsTosMap funToPointsToMap
Map a function to all of its conditional points-to sets.
Definition MemRegion.h:222
CallSiteToPointsToMap callsiteToModPointsToMap
Map a callsite to it mods cpts set.
Definition MemRegion.h:219

◆ addCPtsToCallSiteRefs()

void SVF::MRGenerator::addCPtsToCallSiteRefs ( NodeBS cpts,
const CallICFGNode cs 
)
inlineprotected

Definition at line 353 of file MemRegion.h.

354 {
355 callsiteToRefPointsToMap[cs] |= cpts;
356 funToPointsToMap[cs->getCaller()].insert(cpts);
357 }
CallSiteToPointsToMap callsiteToRefPointsToMap
Map a callsite to it refs cpts set.
Definition MemRegion.h:217

◆ addCPtsToLoad()

void SVF::MRGenerator::addCPtsToLoad ( NodeBS cpts,
const LoadStmt ld,
const SVFFunction fun 
)
inlineprotected

Definition at line 347 of file MemRegion.h.

348 {
349 loadsToPointsToMap[ld] = cpts;
350 funToPointsToMap[fun].insert(cpts);
352 }
void addRefSideEffectOfFunction(const SVFFunction *fun, const NodeBS &refs)
Add/Get methods for side-effect of functions and callsites.
LoadsToPointsToMap loadsToPointsToMap
Map a load SVFIR Edge to its CPts set map.
Definition MemRegion.h:213

◆ addCPtsToStore()

void SVF::MRGenerator::addCPtsToStore ( NodeBS cpts,
const StoreStmt st,
const SVFFunction fun 
)
inlineprotected

Add cpts to store/load.

Definition at line 341 of file MemRegion.h.

342 {
343 storesToPointsToMap[st] = cpts;
344 funToPointsToMap[fun].insert(cpts);
346 }
void addModSideEffectOfFunction(const SVFFunction *fun, const NodeBS &mods)
Add indirect def an memory object in the function.
StoresToPointsToMap storesToPointsToMap
Map a store SVFIR Edge to its CPts set map.
Definition MemRegion.h:215

◆ addModSideEffectOfCallSite()

bool MRGenerator::addModSideEffectOfCallSite ( const CallICFGNode cs,
const NodeBS mods 
)
protected

Add indirect def an memory object in the function.

Add indirect def an memory object in the function

Definition at line 445 of file MemRegion.cpp.

446{
447 if(!mods.empty())
448 {
453 return csToModsMap[cs] |= modset;
454 }
455 return false;
456}
const SVFFunction * getCaller() const
Return callsite.
Definition ICFGNode.h:470
CallSiteToPointsToMap csToModsMap
Map a callsite to its indirect defs of memory objects.
Definition MemRegion.h:233
NodeBS & getCallSiteArgsPts(const CallICFGNode *cs)
Return the pts chain of all callsite arguments.
Definition MemRegion.h:255
void getEscapObjviaGlobals(NodeBS &globs, const NodeBS &pts)
Get all the objects in callee's modref escaped via global objects (the chain pts of globals)
NodeBS & getCallSiteRetPts(const CallICFGNode *cs)
Return the pts chain of the return parameter of the callsite.
Definition MemRegion.h:260

◆ addModSideEffectOfFunction()

void MRGenerator::addModSideEffectOfFunction ( const SVFFunction fun,
const NodeBS mods 
)
protected

Add indirect def an memory object in the function.

Add indirect def an memory object in the function

Definition at line 417 of file MemRegion.cpp.

418{
419 for(NodeBS::iterator it = mods.begin(), eit = mods.end(); it!=eit; ++it)
420 {
421 if(isNonLocalObject(*it,fun))
422 funToModsMap[fun].set(*it);
423 }
424}
set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) add_llvm_executable(wpa wpa.cpp) target_link_libraries(wpa PUBLIC $
Definition CMakeLists.txt:1
FunToPointsToMap funToModsMap
Map a function to its indirect defs of memory objects.
Definition MemRegion.h:229
bool isNonLocalObject(NodeID id, const SVFFunction *curFun) const

◆ addRefSideEffectOfCallSite()

bool MRGenerator::addRefSideEffectOfCallSite ( const CallICFGNode cs,
const NodeBS refs 
)
protected

Add indirect uses an memory object in the function.

Add indirect uses an memory object in the function

Definition at line 429 of file MemRegion.cpp.

430{
431 if(!refs.empty())
432 {
437 return csToRefsMap[cs] |= refset;
438 }
439 return false;
440}
CallSiteToPointsToMap csToRefsMap
Map a callsite to its indirect uses of memory objects.
Definition MemRegion.h:231

◆ addRefSideEffectOfFunction()

void MRGenerator::addRefSideEffectOfFunction ( const SVFFunction fun,
const NodeBS refs 
)
protected

Add/Get methods for side-effect of functions and callsites.

Add indirect uses an memory object in the function

Definition at line 405 of file MemRegion.cpp.

406{
407 for(NodeBS::iterator it = refs.begin(), eit = refs.end(); it!=eit; ++it)
408 {
409 if(isNonLocalObject(*it,fun))
410 funToRefsMap[fun].set(*it);
411 }
412}
FunToPointsToMap funToRefsMap
Map a function to its indirect uses of memory objects.
Definition MemRegion.h:227

◆ collectCallSitePts()

void MRGenerator::collectCallSitePts ( const CallICFGNode cs)
private

Get all objects might pass into and pass out of callee(s) from a callsite

collect the pts chain of the callsite arguments

collect the pts chain of the return argument

Definition at line 477 of file MemRegion.cpp.

478{
481 SVFIR* pag = pta->getPAG();
482 CallICFGNode* callBlockNode = const_cast<CallICFGNode*>(cs);
484
485 WorkList worklist;
486 if (pag->hasCallSiteArgsMap(callBlockNode))
487 {
488 const SVFIR::SVFVarList& args = pta->getPAG()->getCallSiteArgsList(callBlockNode);
489 for(SVFIR::SVFVarList::const_iterator itA = args.begin(), ieA = args.end(); itA!=ieA; ++itA)
490 {
491 const PAGNode* node = *itA;
492 if(node->isPointer())
493 worklist.push(node->getId());
494 }
495 }
496
497 while(!worklist.empty())
498 {
499 NodeID nodeId = worklist.pop();
500 const NodeBS& tmp = pta->getPts(nodeId).toNodeBS();
501 for(NodeBS::iterator it = tmp.begin(), eit = tmp.end(); it!=eit; ++it)
503 }
504
507
509 {
510 const PAGNode* node = pta->getPAG()->getCallSiteRet(retBlockNode);
511 if(node->isPointer())
512 {
513 const NodeBS& tmp = pta->getPts(node->getId()).toNodeBS();
514 for(NodeBS::iterator it = tmp.begin(), eit = tmp.end(); it!=eit; ++it)
516 }
517 }
518
519}
const PointsTo & getPts(NodeID id) override
const RetICFGNode * getRetICFGNode() const
Return callsite.
Definition ICFGNode.h:457
CallSiteToPointsToMap csToCallSiteRetPtsMap
Map a callsite to all its object might return from its callees.
Definition MemRegion.h:237
FIFOWorkList< NodeID > WorkList
Definition MemRegion.h:135
NodeBS & CollectPtsChain(NodeID id)
CallSiteToPointsToMap csToCallSiteArgsPtsMap
Map a callsite to all its object might pass into its callees.
Definition MemRegion.h:235
SVFIR * getPAG() const
NodeBS toNodeBS() const
Returns this points-to set as a NodeBS.
Definition PointsTo.cpp:313
NodeID getId() const
Get ID.
std::vector< const SVFVar * > SVFVarList
Definition SVFIR.h:60
bool hasCallSiteArgsMap(const CallICFGNode *cs) const
Callsite has argument list.
Definition SVFIR.h:283
bool callsiteHasRet(const RetICFGNode *cs) const
Definition SVFIR.h:311
const SVFVarList & getCallSiteArgsList(const CallICFGNode *cs) const
Get callsite argument list.
Definition SVFIR.h:293
const SVFVar * getCallSiteRet(const RetICFGNode *cs) const
Get callsite return.
Definition SVFIR.h:305
virtual bool isPointer() const
Whether it is a pointer.
u32_t NodeID
Definition GeneralType.h:55

◆ collectGlobals()

void MRGenerator::collectGlobals ( )
protected

Collect all global variables for later escape analysis.

Collect globals for escape analysis

Definition at line 105 of file MemRegion.cpp.

106{
107 SVFIR* pag = pta->getPAG();
108 for (SVFIR::iterator nIter = pag->begin(); nIter != pag->end(); ++nIter)
109 {
110 if(ObjVar* obj = SVFUtil::dyn_cast<ObjVar>(nIter->second))
111 {
112 if (obj->getMemObj()->isGlobalObj())
113 {
114 allGlobals.set(nIter->first);
116 }
117 }
118 }
119}
iterator begin()
Iterators.
IDToNodeMapTy::iterator iterator
Node Iterators.
NodeBS allGlobals
All global variable SVFIR node ids.
Definition MemRegion.h:243
void set(unsigned Idx)

◆ collectModRefForCall()

void MRGenerator::collectModRefForCall ( )
protectedvirtual

Generate regions for calls/rets.

Generate memory regions for calls

collect points-to information for callsites

handle all sub scc nodes of this rep node

Get mod-ref of all callsites calling callGraphNode

mods are treated as both def and use of memory objects

Definition at line 227 of file MemRegion.cpp.

228{
229
230 DBOUT(DGENERAL, outs() << pasMsg("\t\tCollect Callsite PointsTo \n"));
231
233 for(SVFIR::CallSiteSet::const_iterator it = pta->getPAG()->getCallSiteSet().begin(),
234 eit = pta->getPAG()->getCallSiteSet().end(); it!=eit; ++it)
235 {
237 }
238
239 DBOUT(DGENERAL, outs() << pasMsg("\t\tPerform Callsite Mod-Ref \n"));
240
241 WorkList worklist;
243
244 while(!worklist.empty())
245 {
246 NodeID callGraphNodeID = worklist.pop();
248 const NodeBS& subNodes = callGraphSCC->subNodes(callGraphNodeID);
249 for(NodeBS::iterator it = subNodes.begin(), eit = subNodes.end(); it!=eit; ++it)
250 {
254 }
255 }
256
257 DBOUT(DGENERAL, outs() << pasMsg("\t\tAdd PointsTo to Callsites \n"));
258
259 for (const CallICFGNode* callBlockNode : pta->getPAG()->getCallSiteSet())
260 {
261 if(hasRefSideEffectOfCallSite(callBlockNode))
262 {
263 NodeBS refs = getRefSideEffectOfCallSite(callBlockNode);
264 addCPtsToCallSiteRefs(refs,callBlockNode);
265 }
266 if(hasModSideEffectOfCallSite(callBlockNode))
267 {
268 NodeBS mods = getModSideEffectOfCallSite(callBlockNode);
270 addCPtsToCallSiteMods(mods,callBlockNode);
271 addCPtsToCallSiteRefs(mods,callBlockNode);
272 }
273 }
274}
#define DBOUT(TYPE, X)
LLVM debug macros, define type of your DBUG model of each pass.
Definition SVFType.h:484
#define DGENERAL
Definition SVFType.h:490
bool hasModSideEffectOfCallSite(const CallICFGNode *cs)
Has indirect mods of a callsite.
Definition MemRegion.h:413
void addCPtsToCallSiteRefs(NodeBS &cpts, const CallICFGNode *cs)
Definition MemRegion.h:353
bool hasRefSideEffectOfCallSite(const CallICFGNode *cs)
Has indirect refs of a callsite.
Definition MemRegion.h:408
void collectCallSitePts(const CallICFGNode *cs)
void getCallGraphSCCRevTopoOrder(WorkList &worklist)
Get reverse topo call graph scc.
void addCPtsToCallSiteMods(NodeBS &cpts, const CallICFGNode *cs)
Definition MemRegion.h:358
const NodeBS & getRefSideEffectOfCallSite(const CallICFGNode *cs)
Get indirect refs of a callsite.
Definition MemRegion.h:398
virtual void modRefAnalysis(PTACallGraphNode *callGraphNode, WorkList &worklist)
Mod-Ref analysis for callsite invoking this callGraphNode.
const NodeBS & getModSideEffectOfCallSite(const CallICFGNode *cs)
Get indirect mods of a callsite.
Definition MemRegion.h:403
PTACallGraphNode * getCallGraphNode(NodeID id) const
Get call graph node.
const CallSiteSet & getCallSiteSet() const
Get all callsites.
Definition SVFIR.h:255
iterator begin() const
std::string pasMsg(const std::string &msg)
Print each pass/phase message by converting a string into blue string output.
Definition SVFUtil.cpp:100
std::ostream & outs()
Overwrite llvm::outs()
Definition SVFUtil.h:50

◆ collectModRefForLoadStore()

void MRGenerator::collectModRefForLoadStore ( )
protectedvirtual

Generate regions for loads/stores.

Generate memory regions for loads/stores

if this function does not have any caller, then we do not care its MSSA

Definition at line 174 of file MemRegion.cpp.

175{
176
178 for (const auto& item: *svfirCallGraph)
179 {
180 const SVFFunction& fun = *item.second->getFunction();
181
184 continue;
185
186 for (SVFFunction::const_iterator iter = fun.begin(), eiter = fun.end();
187 iter != eiter; ++iter)
188 {
189 const SVFBasicBlock* bb = *iter;
190 for (const auto& inst: bb->getICFGNodeList())
191 {
193 for (SVFStmtList::iterator bit = pagEdgeList.begin(), ebit =
194 pagEdgeList.end(); bit != ebit; ++bit)
195 {
196 const PAGEdge* inst = *bit;
197 pagEdgeToFunMap[inst] = &fun;
198 if (const StoreStmt *st = SVFUtil::dyn_cast<StoreStmt>(inst))
199 {
200 NodeBS cpts(pta->getPts(st->getLHSVarID()).toNodeBS());
201 // TODO: change this assertion check later when we have conditional points-to set
202 if (cpts.empty())
203 continue;
204 assert(!cpts.empty() && "null pointer!!");
205 addCPtsToStore(cpts, st, &fun);
206 }
207
208 else if (const LoadStmt *ld = SVFUtil::dyn_cast<LoadStmt>(inst))
209 {
210 NodeBS cpts(pta->getPts(ld->getRHSVarID()).toNodeBS());
211 // TODO: change this assertion check later when we have conditional points-to set
212 if (cpts.empty())
213 continue;
214 assert(!cpts.empty() && "null pointer!!");
215 addCPtsToLoad(cpts, ld, &fun);
216 }
217 }
218 }
219 }
220 }
221}
cJSON * item
Definition cJSON.h:222
SVFStmtList & getPAGEdgesFromInst(const ICFGNode *node)
Given an instruction, get all its the PAGEdge (statement) in sequence.
void addCPtsToLoad(NodeBS &cpts, const LoadStmt *ld, const SVFFunction *fun)
Definition MemRegion.h:347
SVFIR::SVFStmtList SVFStmtList
SVFIR edge list.
Definition MemRegion.h:176
PAGEdgeToFunMap pagEdgeToFunMap
Map a PAGEdge to its fun.
Definition MemRegion.h:224
void addCPtsToStore(NodeBS &cpts, const StoreStmt *st, const SVFFunction *fun)
Add cpts to store/load.
Definition MemRegion.h:341
static const Option< bool > IgnoreDeadFun
Definition Options.h:139
const_iterator end() const
Definition SVFValue.h:451
const_iterator begin() const
Definition SVFValue.h:446
std::vector< constSVFBasicBlock * >::const_iterator const_iterator
Definition SVFValue.h:305
bool isUncalledFunction() const
Definition SVFValue.h:466
CallGraph * getCallGraph()
Definition SVFIR.h:193
static SVFIR * getPAG(bool buildFromFile=false)
Singleton design here to make sure we only have one instance during any analysis.
Definition SVFIR.h:116

◆ CollectPtsChain()

NodeBS & MRGenerator::CollectPtsChain ( NodeID  id)
private

Recursively collect all points-to of the whole struct fields

Definition at line 525 of file MemRegion.cpp.

526{
528 NodeToPTSSMap::iterator it = cachedPtsChainMap.find(baseId);
529 if(it!=cachedPtsChainMap.end())
530 return it->second;
531 else
532 {
535
536 WorkList worklist;
537 for(NodeBS::iterator it = pts.begin(), eit = pts.end(); it!=eit; ++it)
538 worklist.push(*it);
539
540 while(!worklist.empty())
541 {
542 NodeID nodeId = worklist.pop();
543 const NodeBS& tmp = pta->getPts(nodeId).toNodeBS();
544 for(NodeBS::iterator it = tmp.begin(), eit = tmp.end(); it!=eit; ++it)
545 {
547 }
548 }
549 return pts;
550 }
551
552}
bool push(const Data &data)
Definition WorkList.h:165
NodeToPTSSMap cachedPtsChainMap
Map a pointer to its cached points-to chain;.
Definition MemRegion.h:240
NodeBS getFieldsAfterCollapse(NodeID id)
Definition SVFIR.cpp:511
NodeID getBaseObjVar(NodeID id) const
Base and Offset methods for Value and Object node.
Definition SVFIR.h:477

◆ createMR()

void MRGenerator::createMR ( const SVFFunction fun,
const NodeBS cpts 
)
protected

Generate a memory region and put in into functions which use it.

Generate a memory region and put in into functions which use it

Definition at line 70 of file MemRegion.cpp.

71{
72 const NodeBS& repCPts = getRepPointsTo(cpts);
74 MRSet::const_iterator mit = memRegSet.find(&mr);
75 if(mit!=memRegSet.end())
76 {
77 const MemRegion* mr = *mit;
78 MRSet& mrs = funToMRsMap[fun];
79 if(mrs.find(mr)==mrs.end())
80 mrs.insert(mr);
81 }
82 else
83 {
85 memRegSet.insert(m);
86 funToMRsMap[fun].insert(m);
87 }
88}
FunToMRsMap funToMRsMap
Map a function to all its memory regions.
Definition MemRegion.h:203
OrderedSet< const MemRegion *, MemRegion::equalMemRegion > MRSet
Get typedef from Pointer Analysis.
Definition MemRegion.h:141
const NodeBS & getRepPointsTo(const NodeBS &cpts) const
Get superset cpts set.
Definition MemRegion.h:186
MRSet memRegSet
A set of All memory regions.
Definition MemRegion.h:278
Memory Region class.
Definition MemRegion.h:56

◆ destroy()

void MRGenerator::destroy ( )
private

Clean up memory.

Clean up memory

Definition at line 52 of file MemRegion.cpp.

53{
54
55 for (MRSet::iterator it = memRegSet.begin(), eit = memRegSet.end();
56 it != eit; ++it)
57 {
58 delete *it;
59 }
60
61 delete callGraphSCC;
62 callGraphSCC = nullptr;
63 callGraph = nullptr;
64 pta = nullptr;
65}

◆ generateMRs()

void MRGenerator::generateMRs ( )
virtual

Start generating memory regions.

Generate memory regions according to pointer analysis results Attach regions on loads/stores

collect mod-ref for loads/stores

collect mod-ref for calls

Partition memory regions

attach memory regions for loads/stores/calls

Definition at line 125 of file MemRegion.cpp.

126{
127
128 DBOUT(DGENERAL, outs() << pasMsg("Generate Memory Regions \n"));
129
131
132 callGraphSCC->find();
133
134 DBOUT(DGENERAL, outs() << pasMsg("\tCollect ModRef For Load/Store \n"));
135
138
139 DBOUT(DGENERAL, outs() << pasMsg("\tCollect ModRef For const CallICFGNode*\n"));
140
143
144 DBOUT(DGENERAL, outs() << pasMsg("\tPartition Memory Regions \n"));
146 partitionMRs();
149}
virtual void collectModRefForLoadStore()
Generate regions for loads/stores.
virtual void collectModRefForCall()
Generate regions for calls/rets.
virtual void updateAliasMRs()
Update aliased regions for loads/stores/callsites.
virtual void partitionMRs()
Partition regions.
void collectGlobals()
Collect all global variables for later escape analysis.

◆ getAliasMemRegions()

virtual void SVF::MRGenerator::getAliasMemRegions ( MRSet aliasMRs,
const NodeBS cpts,
const SVFFunction fun 
)
inlineprotectedvirtual

Get all aliased mem regions from function fun according to cpts.

Definition at line 309 of file MemRegion.h.

310 {
311 for(MRSet::const_iterator it = funToMRsMap[fun].begin(), eit = funToMRsMap[fun].end(); it!=eit; ++it)
312 {
313 if(isAliasedMR(cpts,*it))
314 aliasMRs.insert(*it);
315 }
316 }
virtual bool isAliasedMR(const NodeBS &cpts, const MemRegion *mr)
Whether a region is aliased with a conditional points-to.
Definition MemRegion.h:304

◆ getCallGraphSCCRevTopoOrder()

void MRGenerator::getCallGraphSCCRevTopoOrder ( WorkList worklist)
private

Get reverse topo call graph scc.

Get the reverse topo order of scc call graph

Definition at line 462 of file MemRegion.cpp.

463{
464
465 NodeStack& topoOrder = callGraphSCC->topoNodeStack();
466 while(!topoOrder.empty())
467 {
469 topoOrder.pop();
470 worklist.push(callgraphNodeID);
471 }
472}
std::stack< NodeID > NodeStack

◆ getCallSiteArgsPts()

NodeBS & SVF::MRGenerator::getCallSiteArgsPts ( const CallICFGNode cs)
inlineprivate

Return the pts chain of all callsite arguments.

Definition at line 255 of file MemRegion.h.

256 {
257 return csToCallSiteArgsPtsMap[cs];
258 }

◆ getCallSiteModMRSet()

MRSet & SVF::MRGenerator::getCallSiteModMRSet ( const CallICFGNode cs)
inline

Definition at line 467 of file MemRegion.h.

468 {
469 return callsiteToModMRsMap[cs];
470 }
CallSiteToMRsMap callsiteToModMRsMap
Map a callsite to its mods regions.
Definition MemRegion.h:211

◆ getCallSiteRefMRSet()

MRSet & SVF::MRGenerator::getCallSiteRefMRSet ( const CallICFGNode cs)
inline

Definition at line 463 of file MemRegion.h.

464 {
465 return callsiteToRefMRsMap[cs];
466 }
CallSiteToMRsMap callsiteToRefMRsMap
Map a callsite to its refs regions.
Definition MemRegion.h:209

◆ getCallSiteRetPts()

NodeBS & SVF::MRGenerator::getCallSiteRetPts ( const CallICFGNode cs)
inlineprivate

Return the pts chain of the return parameter of the callsite.

Definition at line 260 of file MemRegion.h.

261 {
262 return csToCallSiteRetPtsMap[cs];
263 }

◆ getEscapObjviaGlobals()

void MRGenerator::getEscapObjviaGlobals ( NodeBS globs,
const NodeBS calleeModRef 
)
private

Get all the objects in callee's modref escaped via global objects (the chain pts of globals)

Get all the objects in callee's modref escaped via global objects (the chain pts of globals) Otherwise, the object in callee's modref would not escape through globals

Definition at line 559 of file MemRegion.cpp.

560{
561 for(NodeBS::iterator it = calleeModRef.begin(), eit = calleeModRef.end(); it!=eit; ++it)
562 {
563 const MemObj* obj = pta->getPAG()->getObject(*it);
564 (void)obj; // Suppress warning of unused variable under release build
565 assert(obj && "object not found!!");
566 if(allGlobals.test(*it))
567 globs.set(*it);
568 }
569}
const MemObj * getObject(NodeID id) const
Definition SVFIR.h:396
bool test(unsigned Idx) const

◆ getFunction()

const SVFFunction * SVF::MRGenerator::getFunction ( const PAGEdge pagEdge) const
inline

Get the function which SVFIR Edge located.

Definition at line 435 of file MemRegion.h.

436 {
437 PAGEdgeToFunMap::const_iterator it = pagEdgeToFunMap.find(pagEdge);
438 assert(it!=pagEdgeToFunMap.end() && "can not find its function, it is a global SVFIR edge");
439 return it->second;
440 }

◆ getFunMRSet()

MRSet & SVF::MRGenerator::getFunMRSet ( const SVFFunction fun)
inline

Get Memory Region set.

Definition at line 443 of file MemRegion.h.

444 {
445 return funToMRsMap[fun];
446 }

◆ getFunToPointsToList()

FunToPointsTosMap & SVF::MRGenerator::getFunToPointsToList ( )
inlineprotected

Definition at line 371 of file MemRegion.h.

372 {
373 return funToPointsToMap;
374 }

◆ getLoadMRSet()

MRSet & SVF::MRGenerator::getLoadMRSet ( const LoadStmt load)
inline

Definition at line 447 of file MemRegion.h.

448 {
449 return loadsToMRsMap[load];
450 }
LoadsToMRsMap loadsToMRsMap
Map a load SVFIR Edge to its memory regions sets in order for inserting mus in Memory SSA.
Definition MemRegion.h:205

◆ getModInfoForCall()

NodeBS MRGenerator::getModInfoForCall ( const CallICFGNode cs)

getModRefInfo APIs

Collect mod ref for external callsite other than heap alloc external call

Obtain the mod sets for a call, used for external ModRefInfo queries

Definition at line 670 of file MemRegion.cpp.

671{
672 if (isExtCall(cs) && !isHeapAllocExtCall(cs))
673 {
675 NodeBS mods;
676 for (SVFStmtList::const_iterator bit = pagEdgeList.begin(), ebit =
677 pagEdgeList.end(); bit != ebit; ++bit)
678 {
679 const PAGEdge* edge = *bit;
680 if (const StoreStmt* st = SVFUtil::dyn_cast<StoreStmt>(edge))
681 mods |= pta->getPts(st->getLHSVarID()).toNodeBS();
682 }
683 return mods;
684 }
685 else
686 {
688 }
689}
bool isExtCall(const SVFFunction *fun)
Definition SVFUtil.h:278
bool isHeapAllocExtCall(const ICFGNode *cs)
Definition SVFUtil.cpp:370

◆ getModRefInfo() [1/3]

ModRefInfo MRGenerator::getModRefInfo ( const CallICFGNode cs)

Determine whether a CallSite instruction can mod or ref any memory location

Definition at line 719 of file MemRegion.cpp.

720{
721 bool ref = !getRefInfoForCall(cs).empty();
722 bool mod = !getModInfoForCall(cs).empty();
723
724 if (mod && ref)
725 return ModRefInfo::ModRef;
726 else if (ref)
727 return ModRefInfo::Ref;
728 else if (mod)
729 return ModRefInfo::Mod;
730 else
732}
NodeBS getRefInfoForCall(const CallICFGNode *cs)
NodeBS getModInfoForCall(const CallICFGNode *cs)
getModRefInfo APIs
@ Ref
Definition SVFType.h:521
@ NoModRef
Definition SVFType.h:523
@ ModRef
Definition SVFType.h:520
@ Mod
Definition SVFType.h:522

◆ getModRefInfo() [2/3]

ModRefInfo MRGenerator::getModRefInfo ( const CallICFGNode cs,
const SVFValue V 
)

Determine whether a const CallICFGNode* instruction can mod or ref a specific memory location pointed by V

Definition at line 738 of file MemRegion.cpp.

739{
740 bool ref = false;
741 bool mod = false;
742
743 if (pta->getPAG()->hasValueNode(V))
744 {
746 const NodeBS csRef = getRefInfoForCall(cs);
747 const NodeBS csMod = getModInfoForCall(cs);
752
753 if (csRefExpanded.intersects(ptsExpanded))
754 ref = true;
755 if (csModExpanded.intersects(ptsExpanded))
756 mod = true;
757 }
758
759 if (mod && ref)
760 return ModRefInfo::ModRef;
761 else if (ref)
762 return ModRefInfo::Ref;
763 else if (mod)
764 return ModRefInfo::Mod;
765 else
767}
virtual void expandFIObjs(const PointsTo &pts, PointsTo &expandedPts)
Expand FI objects.
bool hasValueNode(const SVFValue *V)
Definition IRGraph.h:141
NodeID getValueNode(const SVFValue *V)
Definition IRGraph.h:137

◆ getModRefInfo() [3/3]

ModRefInfo MRGenerator::getModRefInfo ( const CallICFGNode cs1,
const CallICFGNode cs2 
)

Determine mod-ref relations between two const CallICFGNode* instructions

return NoModRef neither two callsites ref or mod any memory

Ref: cs1 ref memory mod by cs2

Mod: cs1 mod memory ref or mod by cs2

ModRef: cs1 ref and mod memory mod by cs2

Definition at line 772 of file MemRegion.cpp.

773{
774 bool ref = false;
775 bool mod = false;
776
780
790
792 if (cs1RefExpanded.intersects(cs2ModExpanded))
793 ref = true;
795 if (cs1ModExpanded.intersects(cs2RefExpanded) || cs1ModExpanded.intersects(cs2ModExpanded))
796 mod = true;
798 if (cs1RefExpanded.intersects(cs2ModExpanded) && cs1ModExpanded.intersects(cs2ModExpanded))
799 ref = mod = true;
800
801 if (ref && mod)
802 return ModRefInfo::ModRef;
803 else if (ref)
804 return ModRefInfo::Ref;
805 else if (mod)
806 return ModRefInfo::Mod;
807 else
809}
ModRefInfo getModRefInfo(const CallICFGNode *cs)

◆ getModSideEffectOfCallSite()

const NodeBS & SVF::MRGenerator::getModSideEffectOfCallSite ( const CallICFGNode cs)
inlineprotected

Get indirect mods of a callsite.

Definition at line 403 of file MemRegion.h.

404 {
405 return csToModsMap[cs];
406 }

◆ getModSideEffectOfFunction()

const NodeBS & SVF::MRGenerator::getModSideEffectOfFunction ( const SVFFunction fun)
inlineprotected

Get indirect mods of a function.

Definition at line 393 of file MemRegion.h.

394 {
395 return funToModsMap[fun];
396 }

◆ getMR()

const MemRegion * MRGenerator::getMR ( const NodeBS cpts) const

Get a memory region according to cpts.

Generate a memory region and put in into functions which use it

Definition at line 93 of file MemRegion.cpp.

94{
95 MemRegion mr(getRepPointsTo(cpts));
96 MRSet::iterator mit = memRegSet.find(&mr);
97 assert(mit!=memRegSet.end() && "memory region not found!!");
98 return *mit;
99}

◆ getMRNum()

u32_t SVF::MRGenerator::getMRNum ( ) const
inline

Definition at line 420 of file MemRegion.h.

421 {
422 return memRegSet.size();
423 }

◆ getMRSet()

MRSet & SVF::MRGenerator::getMRSet ( )
inline

Definition at line 180 of file MemRegion.h.

181 {
182 return memRegSet;
183 }

◆ getMRsForCallSiteRef()

virtual void SVF::MRGenerator::getMRsForCallSiteRef ( MRSet aliasMRs,
const NodeBS cpts,
const SVFFunction  
)
inlineprotectedvirtual

Get memory regions for call site ref according to cpts.

Reimplemented in SVF::DistinctMRG, and SVF::IntraDisjointMRG.

Definition at line 326 of file MemRegion.h.

327 {
328 const MemRegion* mr = getMR(cpts);
329 aliasMRs.insert(mr);
330 }
const MemRegion * getMR(const NodeBS &cpts) const
Get a memory region according to cpts.
Definition MemRegion.cpp:93

◆ getMRsForLoad()

virtual void SVF::MRGenerator::getMRsForLoad ( MRSet aliasMRs,
const NodeBS cpts,
const SVFFunction  
)
inlineprotectedvirtual

Get memory regions for a load statement according to cpts.

Reimplemented in SVF::InterDisjointMRG, SVF::DistinctMRG, and SVF::IntraDisjointMRG.

Definition at line 319 of file MemRegion.h.

320 {
321 const MemRegion* mr = getMR(cpts);
322 aliasMRs.insert(mr);
323 }

◆ getPAGEdgesFromInst()

SVFIR::SVFStmtList & MRGenerator::getPAGEdgesFromInst ( const ICFGNode node)

Given an instruction, get all its the PAGEdge (statement) in sequence.

Definition at line 161 of file MemRegion.cpp.

162{
163 SVFIR* pag = pta->getPAG();
164 if (ptrOnlyMSSA)
165 return pag->getPTASVFStmtList(node);
166 else
167 return pag->getSVFStmtList(node);
168}
SVFStmtList & getSVFStmtList(const ICFGNode *inst)
Given an instruction, get all its PAGEdges.
Definition SVFIR.h:222
SVFStmtList & getPTASVFStmtList(const ICFGNode *inst)
Given an instruction, get all its PTA PAGEdges.
Definition SVFIR.h:227

◆ getPointsToList()

PointsToList & SVF::MRGenerator::getPointsToList ( const SVFFunction fun)
inlineprotected

Definition at line 367 of file MemRegion.h.

368 {
369 return funToPointsToMap[fun];
370 }

◆ getRefInfoForCall()

NodeBS MRGenerator::getRefInfoForCall ( const CallICFGNode cs)

Obtain the ref sets for a call, used for external ModRefInfo queries

Definition at line 694 of file MemRegion.cpp.

695{
696 if (isExtCall(cs) && !isHeapAllocExtCall(cs))
697 {
699 NodeBS refs;
700 for (SVFStmtList::const_iterator bit = pagEdgeList.begin(), ebit =
701 pagEdgeList.end(); bit != ebit; ++bit)
702 {
703 const PAGEdge* edge = *bit;
704 if (const LoadStmt* ld = SVFUtil::dyn_cast<LoadStmt>(edge))
705 refs |= pta->getPts(ld->getRHSVarID()).toNodeBS();
706 }
707 return refs;
708 }
709 else
710 {
712 }
713}

◆ getRefSideEffectOfCallSite()

const NodeBS & SVF::MRGenerator::getRefSideEffectOfCallSite ( const CallICFGNode cs)
inlineprotected

Get indirect refs of a callsite.

Definition at line 398 of file MemRegion.h.

399 {
400 return csToRefsMap[cs];
401 }

◆ getRefSideEffectOfFunction()

const NodeBS & SVF::MRGenerator::getRefSideEffectOfFunction ( const SVFFunction fun)
inlineprotected

Get indirect refs of a function.

Definition at line 388 of file MemRegion.h.

389 {
390 return funToRefsMap[fun];
391 }

◆ getRepPointsTo()

const NodeBS & SVF::MRGenerator::getRepPointsTo ( const NodeBS cpts) const
inline

Get superset cpts set.

Definition at line 186 of file MemRegion.h.

187 {
188 PtsToRepPtsSetMap::const_iterator it = cptsToRepCPtsMap.find(cpts);
189 assert(it!=cptsToRepCPtsMap.end() && "can not find superset of cpts??");
190 return it->second;
191 }
PtsToRepPtsSetMap cptsToRepCPtsMap
Map a condition pts to its rep conditional pts (super set points-to)
Definition MemRegion.h:280

◆ getStoreMRSet()

MRSet & SVF::MRGenerator::getStoreMRSet ( const StoreStmt store)
inline

Definition at line 451 of file MemRegion.h.

452 {
453 return storesToMRsMap[store];
454 }
StoresToMRsMap storesToMRsMap
Map a store SVFIR Edge to its memory regions sets in order for inserting chis in Memory SSA.
Definition MemRegion.h:207

◆ handleCallsiteModRef()

bool MRGenerator::handleCallsiteModRef ( NodeBS mod,
NodeBS ref,
const CallICFGNode cs,
const SVFFunction callee 
)
protectedvirtual

Get Mod-Ref of a callee function.

Get Mod-Ref of a callee function

if a callee is a heap allocator function, then its mod set of this callsite is the heap object.

otherwise, we find the mod/ref sets from the callee function, who has definition and been processed

Definition at line 603 of file MemRegion.cpp.

604{
606 if(isHeapAllocExtCall(cs))
607 {
609 for (SVFStmtList::const_iterator bit = pagEdgeList.begin(),
610 ebit = pagEdgeList.end(); bit != ebit; ++bit)
611 {
612 const PAGEdge* edge = *bit;
613 if (const AddrStmt* addr = SVFUtil::dyn_cast<AddrStmt>(edge))
614 mod.set(addr->getRHSVarID());
615 }
616 }
618 else
619 {
622 }
623 // add ref set
625 // add mod set
627
628 return refchanged || modchanged;
629}
const NodeBS & getModSideEffectOfFunction(const SVFFunction *fun)
Get indirect mods of a function.
Definition MemRegion.h:393
bool addRefSideEffectOfCallSite(const CallICFGNode *cs, const NodeBS &refs)
Add indirect uses an memory object in the function.
bool addModSideEffectOfCallSite(const CallICFGNode *cs, const NodeBS &mods)
Add indirect def an memory object in the function.
const NodeBS & getRefSideEffectOfFunction(const SVFFunction *fun)
Get indirect refs of a function.
Definition MemRegion.h:388

◆ hasCPtsList()

bool SVF::MRGenerator::hasCPtsList ( const SVFFunction fun) const
inlineprotected

Definition at line 363 of file MemRegion.h.

364 {
365 return funToPointsToMap.find(fun)!=funToPointsToMap.end();
366 }

◆ hasModMRSet()

bool SVF::MRGenerator::hasModMRSet ( const CallICFGNode cs)
inline

Definition at line 459 of file MemRegion.h.

460 {
461 return callsiteToModMRsMap.find(cs)!=callsiteToModMRsMap.end();
462 }

◆ hasModSideEffectOfCallSite()

bool SVF::MRGenerator::hasModSideEffectOfCallSite ( const CallICFGNode cs)
inlineprotected

Has indirect mods of a callsite.

Definition at line 413 of file MemRegion.h.

414 {
415 return csToModsMap.find(cs) != csToModsMap.end();
416 }

◆ hasRefMRSet()

bool SVF::MRGenerator::hasRefMRSet ( const CallICFGNode cs)
inline

Definition at line 455 of file MemRegion.h.

456 {
457 return callsiteToRefMRsMap.find(cs)!=callsiteToRefMRsMap.end();
458 }

◆ hasRefSideEffectOfCallSite()

bool SVF::MRGenerator::hasRefSideEffectOfCallSite ( const CallICFGNode cs)
inlineprotected

Has indirect refs of a callsite.

Definition at line 408 of file MemRegion.h.

409 {
410 return csToRefsMap.find(cs) != csToRefsMap.end();
411 }

◆ hasSVFStmtList()

bool MRGenerator::hasSVFStmtList ( const ICFGNode icfgNode)

Whether this instruction has SVFIR Edge.

Definition at line 151 of file MemRegion.cpp.

152{
153 SVFIR* pag = pta->getPAG();
154 if (ptrOnlyMSSA)
155 return pag->hasPTASVFStmtList(node);
156 else
157 return pag->hasSVFStmtList(node);
158}
bool hasPTASVFStmtList(const ICFGNode *inst) const
Definition SVFIR.h:216
bool hasSVFStmtList(const ICFGNode *inst) const
Whether this instruction has SVFIR Edge.
Definition SVFIR.h:212

◆ isAliasedMR()

virtual bool SVF::MRGenerator::isAliasedMR ( const NodeBS cpts,
const MemRegion mr 
)
inlineprotectedvirtual

Whether a region is aliased with a conditional points-to.

Definition at line 304 of file MemRegion.h.

305 {
306 return mr->getPointsTo().intersects(cpts);
307 }

◆ isNonLocalObject()

bool MRGenerator::isNonLocalObject ( NodeID  id,
const SVFFunction curFun 
) const
private

Whether the object node is a non-local object including global, heap, and stack variable in recursions

if the object is heap or global

or if the local variable of its callers or a local variable is in function recursion cycles

Definition at line 575 of file MemRegion.cpp.

576{
577 const MemObj* obj = pta->getPAG()->getObject(id);
578 assert(obj && "object not found!!");
580 const BaseObjVar* pVar = pta->getPAG()->getBaseObject(id);
581 assert(pVar && "object not found!");
582 if(obj->isGlobalObj() || SVFUtil::isa<HeapObjVar, DummyObjVar>(pVar))
583 return true;
586 else if(SVFUtil::isa<StackObjVar>(pVar))
587 {
588 if(const SVFFunction* svffun = pVar->getFunction())
589 {
590 if(svffun!=curFun)
591 return true;
592 else
593 return callGraphSCC->isInCycle(callGraph->getCallGraphNode(svffun)->getId());
594 }
595 }
596
597 return false;
598}
const BaseObjVar * getBaseObject(NodeID id) const
Definition SVFIR.h:405

◆ modRefAnalysis()

void MRGenerator::modRefAnalysis ( PTACallGraphNode callGraphNode,
WorkList worklist 
)
protectedvirtual

Mod-Ref analysis for callsite invoking this callGraphNode.

Call site mod-ref analysis Compute mod-ref of all callsites invoking this call graph node

add ref/mod set of callee to its invocation callsites at caller

handle direct callsites

handle indirect callsites

Definition at line 635 of file MemRegion.cpp.

636{
637
639 for(PTACallGraphNode::iterator it = callGraphNode->InEdgeBegin(), eit = callGraphNode->InEdgeEnd();
640 it!=eit; ++it)
641 {
643
645 for(PTACallGraphEdge::CallInstSet::iterator cit = edge->getDirectCalls().begin(),
646 ecit = edge->getDirectCalls().end(); cit!=ecit; ++cit)
647 {
648 NodeBS mod, ref;
649 const CallICFGNode* cs = (*cit);
650 bool modrefchanged = handleCallsiteModRef(mod, ref, cs, callGraphNode->getFunction());
651 if(modrefchanged)
652 worklist.push(edge->getSrcID());
653 }
655 for(PTACallGraphEdge::CallInstSet::iterator cit = edge->getIndirectCalls().begin(),
656 ecit = edge->getIndirectCalls().end(); cit!=ecit; ++cit)
657 {
658 NodeBS mod, ref;
659 const CallICFGNode* cs = (*cit);
660 bool modrefchanged = handleCallsiteModRef(mod, ref, cs, callGraphNode->getFunction());
661 if(modrefchanged)
662 worklist.push(edge->getSrcID());
663 }
664 }
665}
GEdgeSetTy::iterator iterator
iterator InEdgeBegin()
iterator InEdgeEnd()
virtual bool handleCallsiteModRef(NodeBS &mod, NodeBS &ref, const CallICFGNode *cs, const SVFFunction *fun)
Get Mod-Ref of a callee function.
const SVFFunction * getFunction() const
Get function of this call node.

◆ partitionMRs()

void MRGenerator::partitionMRs ( )
protectedvirtual

Partition regions.

Partition memory regions

Compute all superset of all condition points-to sets TODO: we may need some refined region partitioning algorithm here For now, we just collapse all refs/mods objects at callsites into one region Consider modularly partition memory regions to speed up analysis (only partition regions within function scope)

Generate memory regions according to condition pts after computing superset

Reimplemented in SVF::DistinctMRG, SVF::IntraDisjointMRG, and SVF::InterDisjointMRG.

Definition at line 315 of file MemRegion.cpp.

316{
317
322 for(FunToPointsTosMap::iterator it = getFunToPointsToList().begin(), eit = getFunToPointsToList().end();
323 it!=eit; ++it)
324 {
325 for(PointsToList::iterator cit = it->second.begin(), ecit = it->second.end(); cit!=ecit; ++cit)
326 {
328 }
329 }
331 for(FunToPointsTosMap::iterator it = getFunToPointsToList().begin(), eit = getFunToPointsToList().end();
332 it!=eit; ++it)
333 {
334 const SVFFunction* fun = it->first;
335 for(PointsToList::iterator cit = it->second.begin(), ecit = it->second.end(); cit!=ecit; ++cit)
336 {
337 createMR(fun,*cit);
338 }
339 }
340
341}
FunToPointsTosMap & getFunToPointsToList()
Definition MemRegion.h:371
virtual void sortPointsTo(const NodeBS &cpts)
Given a condition pts, insert into cptsToRepCPtsMap for region generation.
void createMR(const SVFFunction *fun, const NodeBS &cpts)
Generate a memory region and put in into functions which use it.
Definition MemRegion.cpp:70

◆ sortPointsTo()

void MRGenerator::sortPointsTo ( const NodeBS cpts)
protectedvirtual

Given a condition pts, insert into cptsToRepCPtsMap for region generation.

Given a condition pts, insert into cptsToRepCPtsMap Always map it to its superset(rep) cpts according to existing items 1) map cpts to its superset(rep) which exists in the map, otherwise its superset is itself 2) adjust existing items in the map if their supersets are cpts

Definition at line 282 of file MemRegion.cpp.

283{
284
285 if(cptsToRepCPtsMap.find(cpts)!=cptsToRepCPtsMap.end())
286 return;
287
289 NodeBS repCPts = cpts;
290 for(PtsToRepPtsSetMap::iterator it = cptsToRepCPtsMap.begin(),
291 eit = cptsToRepCPtsMap.end(); it!=eit; ++it)
292 {
293 NodeBS& existCPts = it->second;
294 if(cpts.contains(existCPts))
295 {
296 subSetList.insert(it->first);
297 }
298 else if(existCPts.contains(cpts))
299 {
301 }
302 }
303
304 for(PointsToList::iterator it = subSetList.begin(), eit = subSetList.end(); it!=eit; ++it)
305 {
306 cptsToRepCPtsMap[*it] = cpts;
307 }
308
310}
bool contains(const SparseBitVector< ElementSize > &RHS) const
OrderedSet< PointsTo, equalPointsTo > PointsToList
Definition SVFUtil.h:166

◆ updateAliasMRs()

void MRGenerator::updateAliasMRs ( )
protectedvirtual

Update aliased regions for loads/stores/callsites.

Update aliased regions for loads/stores/callsites

update stores with its aliased regions

update callsites with its aliased regions

Definition at line 346 of file MemRegion.cpp.

347{
348
350 for(StoresToPointsToMap::const_iterator it = storesToPointsToMap.begin(), eit = storesToPointsToMap.end(); it!=eit; ++it)
351 {
353 const SVFFunction* fun = getFunction(it->first);
354 const NodeBS& storeCPts = it->second;
356 for(MRSet::iterator ait = aliasMRs.begin(), eait = aliasMRs.end(); ait!=eait; ++ait)
357 {
358 storesToMRsMap[it->first].insert(*ait);
359 }
360 }
361
362 for(LoadsToPointsToMap::const_iterator it = loadsToPointsToMap.begin(), eit = loadsToPointsToMap.end(); it!=eit; ++it)
363 {
365 const SVFFunction* fun = getFunction(it->first);
366 const NodeBS& loadCPts = it->second;
368 for(MRSet::iterator ait = aliasMRs.begin(), eait = aliasMRs.end(); ait!=eait; ++ait)
369 {
370 loadsToMRsMap[it->first].insert(*ait);
371 }
372 }
373
375 for(CallSiteToPointsToMap::const_iterator it = callsiteToModPointsToMap.begin(),
376 eit = callsiteToModPointsToMap.end(); it!=eit; ++it)
377 {
378 const SVFFunction* fun = it->first->getCaller();
380 const NodeBS& callsiteModCPts = it->second;
382 for(MRSet::iterator ait = aliasMRs.begin(), eait = aliasMRs.end(); ait!=eait; ++ait)
383 {
384 callsiteToModMRsMap[it->first].insert(*ait);
385 }
386 }
387 for(CallSiteToPointsToMap::const_iterator it = callsiteToRefPointsToMap.begin(),
388 eit = callsiteToRefPointsToMap.end(); it!=eit; ++it)
389 {
390 const SVFFunction* fun = it->first->getCaller();
392 const NodeBS& callsiteRefCPts = it->second;
394 for(MRSet::iterator ait = aliasMRs.begin(), eait = aliasMRs.end(); ait!=eait; ++ait)
395 {
396 callsiteToRefMRsMap[it->first].insert(*ait);
397 }
398 }
399}
virtual void getMRsForCallSiteRef(MRSet &aliasMRs, const NodeBS &cpts, const SVFFunction *)
Get memory regions for call site ref according to cpts.
Definition MemRegion.h:326
const SVFFunction * getFunction(const PAGEdge *pagEdge) const
Get the function which SVFIR Edge located.
Definition MemRegion.h:435
virtual void getMRsForLoad(MRSet &aliasMRs, const NodeBS &cpts, const SVFFunction *)
Get memory regions for a load statement according to cpts.
Definition MemRegion.h:319
virtual void getAliasMemRegions(MRSet &aliasMRs, const NodeBS &cpts, const SVFFunction *fun)
Get all aliased mem regions from function fun according to cpts.
Definition MemRegion.h:309

Member Data Documentation

◆ allGlobals

NodeBS SVF::MRGenerator::allGlobals
private

All global variable SVFIR node ids.

Definition at line 243 of file MemRegion.h.

◆ cachedPtsChainMap

NodeToPTSSMap SVF::MRGenerator::cachedPtsChainMap
private

Map a pointer to its cached points-to chain;.

Definition at line 240 of file MemRegion.h.

◆ callGraph

PTACallGraph* SVF::MRGenerator::callGraph
private

Definition at line 199 of file MemRegion.h.

◆ callGraphSCC

SCC* SVF::MRGenerator::callGraphSCC
private

Definition at line 198 of file MemRegion.h.

◆ callsiteToModMRsMap

CallSiteToMRsMap SVF::MRGenerator::callsiteToModMRsMap
private

Map a callsite to its mods regions.

Definition at line 211 of file MemRegion.h.

◆ callsiteToModPointsToMap

CallSiteToPointsToMap SVF::MRGenerator::callsiteToModPointsToMap
private

Map a callsite to it mods cpts set.

Definition at line 219 of file MemRegion.h.

◆ callsiteToRefMRsMap

CallSiteToMRsMap SVF::MRGenerator::callsiteToRefMRsMap
private

Map a callsite to its refs regions.

Definition at line 209 of file MemRegion.h.

◆ callsiteToRefPointsToMap

CallSiteToPointsToMap SVF::MRGenerator::callsiteToRefPointsToMap
private

Map a callsite to it refs cpts set.

Definition at line 217 of file MemRegion.h.

◆ cptsToRepCPtsMap

PtsToRepPtsSetMap SVF::MRGenerator::cptsToRepCPtsMap
protected

Map a condition pts to its rep conditional pts (super set points-to)

Definition at line 280 of file MemRegion.h.

◆ csToCallSiteArgsPtsMap

CallSiteToPointsToMap SVF::MRGenerator::csToCallSiteArgsPtsMap
private

Map a callsite to all its object might pass into its callees.

Definition at line 235 of file MemRegion.h.

◆ csToCallSiteRetPtsMap

CallSiteToPointsToMap SVF::MRGenerator::csToCallSiteRetPtsMap
private

Map a callsite to all its object might return from its callees.

Definition at line 237 of file MemRegion.h.

◆ csToModsMap

CallSiteToPointsToMap SVF::MRGenerator::csToModsMap
private

Map a callsite to its indirect defs of memory objects.

Definition at line 233 of file MemRegion.h.

◆ csToRefsMap

CallSiteToPointsToMap SVF::MRGenerator::csToRefsMap
private

Map a callsite to its indirect uses of memory objects.

Definition at line 231 of file MemRegion.h.

◆ funToModsMap

FunToPointsToMap SVF::MRGenerator::funToModsMap
private

Map a function to its indirect defs of memory objects.

Definition at line 229 of file MemRegion.h.

◆ funToMRsMap

FunToMRsMap SVF::MRGenerator::funToMRsMap
private

Map a function to all its memory regions.

Definition at line 203 of file MemRegion.h.

◆ funToPointsToMap

FunToPointsTosMap SVF::MRGenerator::funToPointsToMap
private

Map a function to all of its conditional points-to sets.

Definition at line 222 of file MemRegion.h.

◆ funToRefsMap

FunToPointsToMap SVF::MRGenerator::funToRefsMap
private

Map a function to its indirect uses of memory objects.

Definition at line 227 of file MemRegion.h.

◆ loadsToMRsMap

LoadsToMRsMap SVF::MRGenerator::loadsToMRsMap
private

Map a load SVFIR Edge to its memory regions sets in order for inserting mus in Memory SSA.

Definition at line 205 of file MemRegion.h.

◆ loadsToPointsToMap

LoadsToPointsToMap SVF::MRGenerator::loadsToPointsToMap
private

Map a load SVFIR Edge to its CPts set map.

Definition at line 213 of file MemRegion.h.

◆ memRegSet

MRSet SVF::MRGenerator::memRegSet
protected

A set of All memory regions.

Definition at line 278 of file MemRegion.h.

◆ pagEdgeToFunMap

PAGEdgeToFunMap SVF::MRGenerator::pagEdgeToFunMap
private

Map a PAGEdge to its fun.

Definition at line 224 of file MemRegion.h.

◆ pta

BVDataPTAImpl* SVF::MRGenerator::pta
private

Definition at line 197 of file MemRegion.h.

◆ ptrOnlyMSSA

bool SVF::MRGenerator::ptrOnlyMSSA
private

Definition at line 200 of file MemRegion.h.

◆ storesToMRsMap

StoresToMRsMap SVF::MRGenerator::storesToMRsMap
private

Map a store SVFIR Edge to its memory regions sets in order for inserting chis in Memory SSA.

Definition at line 207 of file MemRegion.h.

◆ storesToPointsToMap

StoresToPointsToMap SVF::MRGenerator::storesToPointsToMap
private

Map a store SVFIR Edge to its CPts set map.

Definition at line 215 of file MemRegion.h.


The documentation for this class was generated from the following files: