Static Value-Flow Analysis
Loading...
Searching...
No Matches
MemRegion.cpp
Go to the documentation of this file.
1//===- MemRegion.cpp -- Memory region-----------------------------------------//
2//
3// SVF: Static Value-Flow Analysis
4//
5// Copyright (C) <2013-2017> <Yulei Sui>
6//
7
8// This program is free software: you can redistribute it and/or modify
9// it under the terms of the GNU Affero General Public License as published by
10// the Free Software Foundation, either version 3 of the License, or
11// (at your option) any later version.
12
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU Affero General Public License for more details.
17
18// You should have received a copy of the GNU Affero General Public License
19// along with this program. If not, see <http://www.gnu.org/licenses/>.
20//
21//===----------------------------------------------------------------------===//
22
23/*
24 * MemRegion.cpp
25 *
26 * Created on: Dec 14, 2013
27 * Author: Yulei Sui
28 */
29
30#include "Util/Options.h"
31#include "SVFIR/SVFModule.h"
32#include "MSSA/MemRegion.h"
33#include "MSSA/MSSAMuChi.h"
34#include "Graphs/CallGraph.h"
35
36using namespace SVF;
37using namespace SVFUtil;
38
41
43 pta(p), ptrOnlyMSSA(ptrOnly)
44{
47}
48
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}
66
70void MRGenerator::createMR(const SVFFunction* fun, const NodeBS& cpts)
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}
89
93const MemRegion* MRGenerator::getMR(const NodeBS& cpts) const
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}
100
101
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}
120
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}
150
152{
153 SVFIR* pag = pta->getPAG();
154 if (ptrOnlyMSSA)
155 return pag->hasPTASVFStmtList(node);
156 else
157 return pag->hasSVFStmtList(node);
158}
159
160
162{
163 SVFIR* pag = pta->getPAG();
164 if (ptrOnlyMSSA)
165 return pag->getPTASVFStmtList(node);
166 else
167 return pag->getSVFStmtList(node);
168}
169
170
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}
222
223
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}
275
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}
311
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}
342
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}
400
401
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}
413
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}
425
430{
431 if(!refs.empty())
432 {
437 return csToRefsMap[cs] |= refset;
438 }
439 return false;
440}
441
446{
447 if(!mods.empty())
448 {
453 return csToModsMap[cs] |= modset;
454 }
455 return false;
456}
457
458
463{
464
465 NodeStack& topoOrder = callGraphSCC->topoNodeStack();
466 while(!topoOrder.empty())
467 {
469 topoOrder.pop();
470 worklist.push(callgraphNodeID);
471 }
472}
473
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}
520
521
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}
553
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}
570
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}
599
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}
630
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}
666
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}
690
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}
714
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}
733
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}
768
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}
810
811std::ostream& SVF::operator<<(std::ostream &o, const MRVer& mrver)
812{
813 o << "MRVERID: " << mrver.getID() <<" MemRegion: " << mrver.getMR()->dumpStr() << " MRVERSION: " << mrver.getSSAVersion() << " MSSADef: " << mrver.getDef()->getType() << ", "
814 << mrver.getDef()->getMR()->dumpStr() ;
815 return o;
816}
unsigned u32_t
Definition CommandLine.h:18
#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
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
cJSON * p
Definition cJSON.cpp:2559
cJSON * item
Definition cJSON.h:222
virtual void expandFIObjs(const PointsTo &pts, PointsTo &expandedPts)
Expand FI objects.
const PointsTo & getPts(NodeID id) override
const RetICFGNode * getRetICFGNode() const
Return callsite.
Definition ICFGNode.h:457
const SVFFunction * getCaller() const
Return callsite.
Definition ICFGNode.h:470
bool push(const Data &data)
Definition WorkList.h:165
bool empty() const
Definition WorkList.h:146
iterator begin()
Iterators.
IDToNodeMapTy::iterator iterator
Node Iterators.
GEdgeSetTy::iterator iterator
iterator InEdgeBegin()
iterator InEdgeEnd()
bool hasValueNode(const SVFValue *V)
Definition IRGraph.h:141
NodeID getValueNode(const SVFValue *V)
Definition IRGraph.h:137
virtual void getMRsForCallSiteRef(MRSet &aliasMRs, const NodeBS &cpts, const SVFFunction *)
Get memory regions for call site ref according to cpts.
Definition MemRegion.h:326
PTACallGraph * callGraph
Definition MemRegion.h:199
LoadsToMRsMap loadsToMRsMap
Map a load SVFIR Edge to its memory regions sets in order for inserting mus in Memory SSA.
Definition MemRegion.h:205
NodeToPTSSMap cachedPtsChainMap
Map a pointer to its cached points-to chain;.
Definition MemRegion.h:240
bool hasModSideEffectOfCallSite(const CallICFGNode *cs)
Has indirect mods of a callsite.
Definition MemRegion.h:413
const SVFFunction * getFunction(const PAGEdge *pagEdge) const
Get the function which SVFIR Edge located.
Definition MemRegion.h:435
virtual void collectModRefForLoadStore()
Generate regions for loads/stores.
CallSiteToPointsToMap csToCallSiteRetPtsMap
Map a callsite to all its object might return from its callees.
Definition MemRegion.h:237
StoresToMRsMap storesToMRsMap
Map a store SVFIR Edge to its memory regions sets in order for inserting chis in Memory SSA.
Definition MemRegion.h:207
SVFStmtList & getPAGEdgesFromInst(const ICFGNode *node)
Given an instruction, get all its the PAGEdge (statement) in sequence.
FunToPointsToMap funToModsMap
Map a function to its indirect defs of memory objects.
Definition MemRegion.h:229
bool isNonLocalObject(NodeID id, const SVFFunction *curFun) const
CallSiteToPointsToMap callsiteToRefPointsToMap
Map a callsite to it refs cpts set.
Definition MemRegion.h:217
void addModSideEffectOfFunction(const SVFFunction *fun, const NodeBS &mods)
Add indirect def an memory object in the function.
FunToMRsMap funToMRsMap
Map a function to all its memory regions.
Definition MemRegion.h:203
virtual void generateMRs()
Start generating memory regions.
virtual void collectModRefForCall()
Generate regions for calls/rets.
const MemRegion * getMR(const NodeBS &cpts) const
Get a memory region according to cpts.
Definition MemRegion.cpp:93
FunToPointsTosMap & getFunToPointsToList()
Definition MemRegion.h:371
CallSiteToPointsToMap csToModsMap
Map a callsite to its indirect defs of memory objects.
Definition MemRegion.h:233
virtual void sortPointsTo(const NodeBS &cpts)
Given a condition pts, insert into cptsToRepCPtsMap for region generation.
void addCPtsToLoad(NodeBS &cpts, const LoadStmt *ld, const SVFFunction *fun)
Definition MemRegion.h:347
CallSiteToMRsMap callsiteToRefMRsMap
Map a callsite to its refs regions.
Definition MemRegion.h:209
const NodeBS & getModSideEffectOfFunction(const SVFFunction *fun)
Get indirect mods of a function.
Definition MemRegion.h:393
StoresToPointsToMap storesToPointsToMap
Map a store SVFIR Edge to its CPts set map.
Definition MemRegion.h:215
NodeBS & CollectPtsChain(NodeID id)
bool addRefSideEffectOfCallSite(const CallICFGNode *cs, const NodeBS &refs)
Add indirect uses an memory object in the function.
SVFIR::SVFStmtList SVFStmtList
SVFIR edge list.
Definition MemRegion.h:176
void addRefSideEffectOfFunction(const SVFFunction *fun, const NodeBS &refs)
Add/Get methods for side-effect of functions and callsites.
OrderedSet< NodeBS, SVFUtil::equalNodeBS > PointsToList
Definition MemRegion.h:143
bool addModSideEffectOfCallSite(const CallICFGNode *cs, const NodeBS &mods)
Add indirect def an memory object in the function.
void addCPtsToCallSiteRefs(NodeBS &cpts, const CallICFGNode *cs)
Definition MemRegion.h:353
NodeBS getRefInfoForCall(const CallICFGNode *cs)
bool hasRefSideEffectOfCallSite(const CallICFGNode *cs)
Has indirect refs of a callsite.
Definition MemRegion.h:408
OrderedSet< const MemRegion *, MemRegion::equalMemRegion > MRSet
Get typedef from Pointer Analysis.
Definition MemRegion.h:141
virtual void updateAliasMRs()
Update aliased regions for loads/stores/callsites.
void collectCallSitePts(const CallICFGNode *cs)
const NodeBS & getRepPointsTo(const NodeBS &cpts) const
Get superset cpts set.
Definition MemRegion.h:186
bool hasSVFStmtList(const ICFGNode *icfgNode)
Whether this instruction has SVFIR Edge.
PAGEdgeToFunMap pagEdgeToFunMap
Map a PAGEdge to its fun.
Definition MemRegion.h:224
void getCallGraphSCCRevTopoOrder(WorkList &worklist)
Get reverse topo call graph scc.
PtsToRepPtsSetMap cptsToRepCPtsMap
Map a condition pts to its rep conditional pts (super set points-to)
Definition MemRegion.h:280
void addCPtsToCallSiteMods(NodeBS &cpts, const CallICFGNode *cs)
Definition MemRegion.h:358
CallSiteToPointsToMap callsiteToModPointsToMap
Map a callsite to it mods cpts set.
Definition MemRegion.h:219
const NodeBS & getRefSideEffectOfFunction(const SVFFunction *fun)
Get indirect refs of a function.
Definition MemRegion.h:388
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 partitionMRs()
Partition regions.
ModRefInfo getModRefInfo(const CallICFGNode *cs)
void createMR(const SVFFunction *fun, const NodeBS &cpts)
Generate a memory region and put in into functions which use it.
Definition MemRegion.cpp:70
void destroy()
Clean up memory.
Definition MemRegion.cpp:52
const NodeBS & getRefSideEffectOfCallSite(const CallICFGNode *cs)
Get indirect refs of a callsite.
Definition MemRegion.h:398
CallSiteToPointsToMap csToRefsMap
Map a callsite to its indirect uses of memory objects.
Definition MemRegion.h:231
MRGenerator(BVDataPTAImpl *p, bool ptrOnly)
Definition MemRegion.cpp:42
virtual bool handleCallsiteModRef(NodeBS &mod, NodeBS &ref, const CallICFGNode *cs, const SVFFunction *fun)
Get Mod-Ref of a callee function.
NodeBS & getCallSiteArgsPts(const CallICFGNode *cs)
Return the pts chain of all callsite arguments.
Definition MemRegion.h:255
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
virtual void modRefAnalysis(PTACallGraphNode *callGraphNode, WorkList &worklist)
Mod-Ref analysis for callsite invoking this callGraphNode.
void getEscapObjviaGlobals(NodeBS &globs, const NodeBS &pts)
Get all the objects in callee's modref escaped via global objects (the chain pts of globals)
CallSiteToMRsMap callsiteToModMRsMap
Map a callsite to its mods regions.
Definition MemRegion.h:211
NodeBS getModInfoForCall(const CallICFGNode *cs)
getModRefInfo APIs
const NodeBS & getModSideEffectOfCallSite(const CallICFGNode *cs)
Get indirect mods of a callsite.
Definition MemRegion.h:403
NodeBS & getCallSiteRetPts(const CallICFGNode *cs)
Return the pts chain of the return parameter of the callsite.
Definition MemRegion.h:260
NodeBS allGlobals
All global variable SVFIR node ids.
Definition MemRegion.h:243
LoadsToPointsToMap loadsToPointsToMap
Map a load SVFIR Edge to its CPts set map.
Definition MemRegion.h:213
void addCPtsToStore(NodeBS &cpts, const StoreStmt *st, const SVFFunction *fun)
Add cpts to store/load.
Definition MemRegion.h:341
FunToPointsToMap funToRefsMap
Map a function to its indirect uses of memory objects.
Definition MemRegion.h:227
SCCDetection< PTACallGraph * > SCC
Call Graph SCC.
Definition MemRegion.h:178
MRSet memRegSet
A set of All memory regions.
Definition MemRegion.h:278
BVDataPTAImpl * pta
Definition MemRegion.h:197
void collectGlobals()
Collect all global variables for later escape analysis.
CallSiteToPointsToMap csToCallSiteArgsPtsMap
Map a callsite to all its object might pass into its callees.
Definition MemRegion.h:235
static u32_t totalVERNum
ver ID 0 is reserved
Definition MSSAMuChi.h:50
Memory Region class.
Definition MemRegion.h:56
static u32_t totalMRNum
region ID 0 is reserved
Definition MemRegion.h:62
static const Option< bool > IgnoreDeadFun
Definition Options.h:139
const SVFFunction * getFunction() const
Get function of this call node.
PTACallGraphNode * getCallGraphNode(NodeID id) const
Get call graph node.
SVFIR * getPAG() const
PTACallGraph * getCallGraph() const
Return call graph.
NodeBS toNodeBS() const
Returns this points-to set as a NodeBS.
Definition PointsTo.cpp:313
NodeID getId() const
Get ID.
const std::vector< const ICFGNode * > & getICFGNodeList() const
Definition SVFValue.h:580
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
const CallSiteSet & getCallSiteSet() const
Get all callsites.
Definition SVFIR.h:255
bool hasPTASVFStmtList(const ICFGNode *inst) const
Definition SVFIR.h:216
CallGraph * getCallGraph()
Definition SVFIR.h:193
NodeBS getFieldsAfterCollapse(NodeID id)
Definition SVFIR.cpp:511
SVFStmtList & getSVFStmtList(const ICFGNode *inst)
Given an instruction, get all its PAGEdges.
Definition SVFIR.h:222
bool hasSVFStmtList(const ICFGNode *inst) const
Whether this instruction has SVFIR Edge.
Definition SVFIR.h:212
std::vector< const SVFVar * > SVFVarList
Definition SVFIR.h:60
std::vector< const SVFStmt * > SVFStmtList
Definition SVFIR.h:59
const BaseObjVar * getBaseObject(NodeID id) const
Definition SVFIR.h:405
NodeID getBaseObjVar(NodeID id) const
Base and Offset methods for Value and Object node.
Definition SVFIR.h:477
bool hasCallSiteArgsMap(const CallICFGNode *cs) const
Callsite has argument list.
Definition SVFIR.h:283
bool callsiteHasRet(const RetICFGNode *cs) const
Definition SVFIR.h:311
SVFStmtList & getPTASVFStmtList(const ICFGNode *inst)
Given an instruction, get all its PTA PAGEdges.
Definition SVFIR.h:227
const MemObj * getObject(NodeID id) const
Definition SVFIR.h:396
const SVFVarList & getCallSiteArgsList(const CallICFGNode *cs) const
Get callsite argument list.
Definition SVFIR.h:293
static SVFIR * getPAG(bool buildFromFile=false)
Singleton design here to make sure we only have one instance during any analysis.
Definition SVFIR.h:116
const SVFVar * getCallSiteRet(const RetICFGNode *cs) const
Get callsite return.
Definition SVFIR.h:305
virtual bool isPointer() const
Whether it is a pointer.
bool test(unsigned Idx) const
void set(unsigned Idx)
bool contains(const SparseBitVector< ElementSize > &RHS) const
iterator begin() const
bool isExtCall(const SVFFunction *fun)
Definition SVFUtil.h:278
std::string pasMsg(const std::string &msg)
Print each pass/phase message by converting a string into blue string output.
Definition SVFUtil.cpp:100
bool isHeapAllocExtCall(const ICFGNode *cs)
Definition SVFUtil.cpp:370
std::ostream & outs()
Overwrite llvm::outs()
Definition SVFUtil.h:50
for isBitcode
Definition BasicTypes.h:68
std::stack< NodeID > NodeStack
ModRefInfo
Definition SVFType.h:519
@ Ref
Definition SVFType.h:521
@ NoModRef
Definition SVFType.h:523
@ ModRef
Definition SVFType.h:520
@ Mod
Definition SVFType.h:522
u32_t NodeID
Definition GeneralType.h:55
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:74
IntervalValue operator<<(const IntervalValue &lhs, const IntervalValue &rhs)
Left binary shift of IntervalValues.