Static Value-Flow Analysis
Loading...
Searching...
No Matches
MemSSA.cpp
Go to the documentation of this file.
1//===- MemSSA.cpp -- Base class of pointer analyses------------------//
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 * MemSSA.cpp
25 *
26 * Created on: Dec 14, 2013
27 * Author: Yulei Sui
28 */
29
30#include "Util/Options.h"
32#include "MSSA/MemPartition.h"
33#include "MSSA/MemSSA.h"
34#include "Graphs/SVFGStat.h"
35#include "Graphs/CallGraph.h"
36#include "SVFIR/SVFVariables.h"
37
38using namespace SVF;
39using namespace SVFUtil;
40
45
49MemSSA::MemSSA(BVDataPTAImpl* p, std::unique_ptr<MRGenerator> mrGenerator)
50{
51 pta = p;
53 && "please specify a pointer analysis");
54 assert(mrGenerator != nullptr && "builder must supply an MRGenerator");
55 mrGen = std::move(mrGenerator);
56
57 stat = new MemSSAStat(this);
58
60 double mrStart = stat->getClk(true);
61 mrGen->generateMRs();
62 double mrEnd = stat->getClk(true);
64}
65
67{
68 return pta->getPAG();
69}
70
75{
76
77 assert(!isExtCall(&fun) && "we do not build memory ssa for external functions");
78
79 DBOUT(DMSSA, outs() << "Building Memory SSA for function " << fun.getName()
80 << " \n");
81
82 usedRegs.clear();
83 reg2BBMap.clear();
84
86 double muchiStart = stat->getClk(true);
87 createMUCHI(fun);
88 double muchiEnd = stat->getClk(true);
90
92 double phiStart = stat->getClk(true);
93 insertPHI(fun);
94 double phiEnd = stat->getClk(true);
96
98 double renameStart = stat->getClk(true);
99 SSARename(fun);
100 double renameEnd = stat->getClk(true);
102
103}
104
110{
111
112
113 DBOUT(DMSSA,
114 outs() << "\t creating mu chi for function " << fun.getName()
115 << "\n");
116 // 1. create mu/chi
117 // insert a set of mus for memory regions at each load
118 // inset a set of chis for memory regions at each store
119
120 // 2. find global names (region name before renaming) of each memory region,
121 // collect used mrs in usedRegs, and collect its def basic block in reg2BBMap
122 // in the form of mu(r) and r = chi (r)
123 // a) mu(r):
124 // if(r \not\in varKills) global = global \cup r
125 // b) r = chi(r):
126 // if(r \not\in varKills) global = global \cup r
127 // varKills = varKills \cup r
128 // block(r) = block(r) \cup bb_{chi}
129
132 BBList reachableBBs = fun.getReachableBBs();
133
134 for (BBList::const_iterator iter = reachableBBs.begin(), eiter = reachableBBs.end();
135 iter != eiter; ++iter)
136 {
137 const SVFBasicBlock* bb = *iter;
138 varKills.clear();
139 for (const auto& inst: bb->getICFGNodeList())
140 {
141 if(mrGen->hasSVFStmtList(inst))
142 {
143 SVFStmtList& pagEdgeList = mrGen->getSVFStmtsFromInst(inst);
144 for (SVFStmtList::const_iterator bit = pagEdgeList.begin(),
145 ebit = pagEdgeList.end(); bit != ebit; ++bit)
146 {
147 const PAGEdge* inst = *bit;
148 if (const LoadStmt* load = SVFUtil::dyn_cast<LoadStmt>(inst))
149 AddLoadMU(bb, load, mrGen->getLoadMRSet(load));
150 else if (const StoreStmt* store = SVFUtil::dyn_cast<StoreStmt>(inst))
151 AddStoreCHI(bb, store, mrGen->getStoreMRSet(store));
152 }
153 }
154 if (isNonInstricCallSite(inst))
155 {
156 const CallICFGNode* cs = cast<CallICFGNode>(inst);
157 if(mrGen->hasRefMRSet(cs))
158 AddCallSiteMU(cs,mrGen->getCallSiteRefMRSet(cs));
159
160 if(mrGen->hasModMRSet(cs))
161 AddCallSiteCHI(cs,mrGen->getCallSiteModMRSet(cs));
162 }
163 }
164 }
165
166 // create entry chi for this function including all memory regions
167 // initialize them with version 0 and 1 r_1 = chi (r_0)
168 for (MRSet::iterator iter = usedRegs.begin(), eiter = usedRegs.end();
169 iter != eiter; ++iter)
170 {
171 const MemRegion* mr = *iter;
172 // initialize mem region version and stack for renaming phase
173 mr2CounterMap[mr] = 0;
174 mr2VerStackMap[mr].clear();
175 ENTRYCHI* chi = new ENTRYCHI(&fun, mr);
176 chi->setOpVer(newSSAName(mr,chi));
177 chi->setResVer(newSSAName(mr,chi));
178 funToEntryChiSetMap[&fun].insert(chi);
179
182 if(fun.hasReturn())
183 {
184 RETMU* mu = new RETMU(&fun, mr);
185 funToReturnMuSetMap[&fun].insert(mu);
186 }
187
188 }
189
190}
191
192/*
193 * Insert phi node
194 */
196{
197
198 DBOUT(DMSSA,
199 outs() << "\t insert phi for function " << fun.getName() << "\n");
200
202 // record whether a phi of mr has already been inserted into the bb.
204
205 // start inserting phi node
206 for (MRSet::iterator iter = usedRegs.begin(), eiter = usedRegs.end();
207 iter != eiter; ++iter)
208 {
209 const MemRegion* mr = *iter;
210
211 BBList bbs = reg2BBMap[mr];
212 while (!bbs.empty())
213 {
214 const SVFBasicBlock* bb = bbs.back();
215 bbs.pop_back();
216 Map<const SVFBasicBlock*,Set<const SVFBasicBlock*>>::const_iterator it = df.find(bb);
217 if(it == df.end())
218 {
219 writeWrnMsg("bb not in the dominance frontier map??");
220 continue;
221 }
222 const Set<const SVFBasicBlock*>& domSet = it->second;
223 for (const SVFBasicBlock* pbb : domSet)
224 {
225 // if we never insert this phi node before
226 if (0 == bb2MRSetMap[pbb].count(mr))
227 {
228 bb2MRSetMap[pbb].insert(mr);
229 // insert phi node
230 AddMSSAPHI(pbb,mr);
231 // continue to insert phi in its iterative dominate frontiers
232 bbs.push_back(pbb);
233 }
234 }
235 }
236 }
237
238}
239
244{
245
246 DBOUT(DMSSA,
247 outs() << "\t ssa rename for function " << fun.getName() << "\n");
248
250}
251
257{
258
259 // record which mem region needs to pop stack
261
262 // rename phi result op
263 // for each r = phi (...)
264 // rewrite r as new name
265 if (hasPHISet(&bb))
267
268
269 // process mu and chi
270 // for each mu(r)
271 // rewrite r with top mrver of stack(r)
272 // for each r = chi(r')
273 // rewrite r' with top mrver of stack(r)
274 // rewrite r with new name
275
276 for (const auto& pNode: bb.getICFGNodeList())
277 {
278 if(mrGen->hasSVFStmtList(pNode))
279 {
280 SVFStmtList& pagEdgeList = mrGen->getSVFStmtsFromInst(pNode);
281 for(SVFStmtList::const_iterator bit = pagEdgeList.begin(), ebit= pagEdgeList.end();
282 bit!=ebit; ++bit)
283 {
284 const PAGEdge* inst = *bit;
285 if (const LoadStmt* load = SVFUtil::dyn_cast<LoadStmt>(inst))
286 RenameMuSet(getMUSet(load));
287
288 else if (const StoreStmt* store = SVFUtil::dyn_cast<StoreStmt>(inst))
290
291 }
292 }
294 {
296 if(mrGen->hasRefMRSet(cs))
298
299 if(mrGen->hasModMRSet(cs))
301 }
302 else if(isRetInstNode(pNode))
303 {
304 const FunObjVar* fun = bb.getParent();
306 }
307 }
308
309
310 // fill phi operands of succ basic blocks
311 for (const SVFBasicBlock* succ : bb.getSuccessors())
312 {
314 if (hasPHISet(succ))
316 }
317
318 // for succ basic block in dominator tree
319 const FunObjVar* fun = bb.getParent();
321 Map<const SVFBasicBlock*,Set<const SVFBasicBlock*>>::const_iterator mapIter = dtBBsMap.find(&bb);
322 if (mapIter != dtBBsMap.end())
323 {
324 const Set<const SVFBasicBlock*>& dtBBs = mapIter->second;
325 for (const SVFBasicBlock* dtbb : dtBBs)
326 {
328 }
329 }
330 // for each r = chi(..), and r = phi(..)
331 // pop ver stack(r)
332 while (!memRegs.empty())
333 {
334 const MemRegion* mr = memRegs.back();
335 memRegs.pop_back();
336 mr2VerStackMap[mr].pop_back();
337 }
338
339}
340
342{
343 assert(0 != mr2CounterMap.count(mr)
344 && "did not find initial version in map? ");
345 assert(0 != mr2VerStackMap.count(mr)
346 && "did not find initial stack in map? ");
347
348 MRVERSION version = mr2CounterMap[mr];
349 mr2CounterMap[mr] = version + 1;
350 auto mrVer = std::make_unique<MRVer>(mr, version, def);
351 auto mrVerPtr = mrVer.get();
352 mr2VerStackMap[mr].push_back(mrVerPtr);
353 usedMRVers.push_back(std::move(mrVer));
354 return mrVerPtr;
355}
356
361{
362
363 for (LoadToMUSetMap::iterator iter = load2MuSetMap.begin(), eiter =
364 load2MuSetMap.end(); iter != eiter; ++iter)
365 {
366 for (MUSet::iterator it = iter->second.begin(), eit =
367 iter->second.end(); it != eit; ++it)
368 {
369 delete *it;
370 }
371 }
372
373 for (StoreToChiSetMap::iterator iter = store2ChiSetMap.begin(), eiter =
374 store2ChiSetMap.end(); iter != eiter; ++iter)
375 {
376 for (CHISet::iterator it = iter->second.begin(), eit =
377 iter->second.end(); it != eit; ++it)
378 {
379 delete *it;
380 }
381 }
382
383 for (CallSiteToMUSetMap::iterator iter = callsiteToMuSetMap.begin(),
384 eiter = callsiteToMuSetMap.end(); iter != eiter; ++iter)
385 {
386 for (MUSet::iterator it = iter->second.begin(), eit =
387 iter->second.end(); it != eit; ++it)
388 {
389 delete *it;
390 }
391 }
392
393 for (CallSiteToCHISetMap::iterator iter = callsiteToChiSetMap.begin(),
394 eiter = callsiteToChiSetMap.end(); iter != eiter; ++iter)
395 {
396 for (CHISet::iterator it = iter->second.begin(), eit =
397 iter->second.end(); it != eit; ++it)
398 {
399 delete *it;
400 }
401 }
402
403 for (FunToEntryChiSetMap::iterator iter = funToEntryChiSetMap.begin(),
404 eiter = funToEntryChiSetMap.end(); iter != eiter; ++iter)
405 {
406 for (CHISet::iterator it = iter->second.begin(), eit =
407 iter->second.end(); it != eit; ++it)
408 {
409 delete *it;
410 }
411 }
412
413 for (FunToReturnMuSetMap::iterator iter = funToReturnMuSetMap.begin(),
414 eiter = funToReturnMuSetMap.end(); iter != eiter; ++iter)
415 {
416 for (MUSet::iterator it = iter->second.begin(), eit =
417 iter->second.end(); it != eit; ++it)
418 {
419 delete *it;
420 }
421 }
422
423 for (BBToPhiSetMap::iterator iter = bb2PhiSetMap.begin(), eiter =
424 bb2PhiSetMap.end(); iter != eiter; ++iter)
425 {
426 for (PHISet::iterator it = iter->second.begin(), eit =
427 iter->second.end(); it != eit; ++it)
428 {
429 delete *it;
430 }
431 }
432
433 mrGen.reset();
434 delete stat;
435 stat = nullptr;
436 pta = nullptr;
437}
438
443{
444 if(pta->printStat())
445 stat->performStat();
446}
447
452{
453 u32_t num = 0;
454 LoadToMUSetMap::const_iterator it = load2MuSetMap.begin();
455 LoadToMUSetMap::const_iterator eit = load2MuSetMap.end();
456 for (; it != eit; it++)
457 {
458 const MUSet & muSet = it->second;
459 num+= muSet.size();
460 }
461 return num;
462}
463
464
469{
470 u32_t num = 0;
471 StoreToChiSetMap::const_iterator it = store2ChiSetMap.begin();
472 StoreToChiSetMap::const_iterator eit = store2ChiSetMap.end();
473 for (; it != eit; it++)
474 {
475 const CHISet& chiSet = it->second;
476 num += chiSet.size();
477 }
478 return num;
479}
480
481
486{
487 u32_t num = 0;
488 FunToEntryChiSetMap::const_iterator it = funToEntryChiSetMap.begin();
489 FunToEntryChiSetMap::const_iterator eit = funToEntryChiSetMap.end();
490 for (; it != eit; it++)
491 {
492 const CHISet& chiSet = it->second;
493 num += chiSet.size();
494 }
495 return num;
496}
497
498
503{
504 u32_t num = 0;
505 FunToReturnMuSetMap::const_iterator it = funToReturnMuSetMap.begin();
506 FunToReturnMuSetMap::const_iterator eit = funToReturnMuSetMap.end();
507 for (; it != eit; it++)
508 {
509 const MUSet & muSet = it->second;
510 num+= muSet.size();
511 }
512 return num;
513}
514
515
520{
521 u32_t num = 0;
522 CallSiteToMUSetMap::const_iterator it = callsiteToMuSetMap.begin();
523 CallSiteToMUSetMap::const_iterator eit = callsiteToMuSetMap.end();
524 for (; it != eit; it++)
525 {
526 const MUSet & muSet = it->second;
527 num+= muSet.size();
528 }
529 return num;
530}
531
532
537{
538 u32_t num = 0;
539 CallSiteToCHISetMap::const_iterator it = callsiteToChiSetMap.begin();
540 CallSiteToCHISetMap::const_iterator eit = callsiteToChiSetMap.end();
541 for (; it != eit; it++)
542 {
543 const CHISet & chiSet = it->second;
544 num+= chiSet.size();
545 }
546 return num;
547}
548
549
554{
555 u32_t num = 0;
556 BBToPhiSetMap::const_iterator it = bb2PhiSetMap.begin();
557 BBToPhiSetMap::const_iterator eit = bb2PhiSetMap.end();
558 for (; it != eit; it++)
559 {
560 const PHISet & phiSet = it->second;
561 num+= phiSet.size();
562 }
563 return num;
564}
565
570{
571
573 for (const auto& item: *svfirCallGraph)
574 {
575 const FunObjVar* fun = item.second->getFunction();
576 if(Options::MSSAFun()!="" && Options::MSSAFun()!=fun->getName())
577 continue;
578
579 Out << "==========FUNCTION: " << fun->getName() << "==========\n";
580 // dump function entry chi nodes
581 if (hasFuncEntryChi(fun))
582 {
584 for (CHISet::iterator chi_it = entry_chis.begin(); chi_it != entry_chis.end(); chi_it++)
585 {
586 (*chi_it)->dump();
587 }
588 }
589
590 for (FunObjVar::const_bb_iterator bit = fun->begin(), ebit = fun->end();
591 bit != ebit; ++bit)
592 {
593 const SVFBasicBlock* bb = bit->second;
594 Out << bb->getName() << "\n";
595 PHISet& phiSet = getPHISet(bb);
596 for(PHISet::iterator pi = phiSet.begin(), epi = phiSet.end(); pi !=epi; ++pi)
597 {
598 (*pi)->dump();
599 }
600
601 bool last_is_chi = false;
602 for (const auto& inst: bb->getICFGNodeList())
603 {
604 bool isAppCall = isNonInstricCallSite(inst) && !isExtCall(inst);
605 if (isAppCall || isHeapAllocExtCall(inst))
606 {
607 const CallICFGNode* cs = cast<CallICFGNode>(inst);
608 if(hasMU(cs))
609 {
610 if (!last_is_chi)
611 {
612 Out << "\n";
613 }
614 for (MUSet::iterator mit = getMUSet(cs).begin(), emit = getMUSet(cs).end();
615 mit != emit; ++mit)
616 {
617 (*mit)->dump();
618 }
619 }
620
621 Out << inst->toString() << "\n";
622
623 if(hasCHI(cs))
624 {
625 for (CHISet::iterator cit = getCHISet(cs).begin(), ecit = getCHISet(cs).end();
626 cit != ecit; ++cit)
627 {
628 (*cit)->dump();
629 }
630 Out << "\n";
631 last_is_chi = true;
632 }
633 else
634 last_is_chi = false;
635 }
636 else
637 {
638 bool dump_preamble = false;
639 SVFStmtList& pagEdgeList = mrGen->getSVFStmtsFromInst(inst);
640 for(SVFStmtList::const_iterator bit = pagEdgeList.begin(), ebit= pagEdgeList.end();
641 bit!=ebit; ++bit)
642 {
643 const PAGEdge* edge = *bit;
644 if (const LoadStmt* load = SVFUtil::dyn_cast<LoadStmt>(edge))
645 {
646 MUSet& muSet = getMUSet(load);
647 for(MUSet::iterator it = muSet.begin(), eit = muSet.end(); it!=eit; ++it)
648 {
649 if (!dump_preamble && !last_is_chi)
650 {
651 Out << "\n";
652 dump_preamble = true;
653 }
654 (*it)->dump();
655 }
656 }
657 }
658
659 Out << inst->toString() << "\n";
660
661 bool has_chi = false;
662 for(SVFStmtList::const_iterator bit = pagEdgeList.begin(), ebit= pagEdgeList.end();
663 bit!=ebit; ++bit)
664 {
665 const PAGEdge* edge = *bit;
666 if (const StoreStmt* store = SVFUtil::dyn_cast<StoreStmt>(edge))
667 {
668 CHISet& chiSet = getCHISet(store);
669 for(CHISet::iterator it = chiSet.begin(), eit = chiSet.end(); it!=eit; ++it)
670 {
671 has_chi = true;
672 (*it)->dump();
673 }
674 }
675 }
676 if (has_chi)
677 {
678 Out << "\n";
679 last_is_chi = true;
680 }
681 else
682 last_is_chi = false;
683 }
684 }
685 }
686
687 // dump return mu nodes
688 if (hasReturnMu(fun))
689 {
691 for (MUSet::iterator mu_it = return_mus.begin(); mu_it != return_mus.end(); mu_it++)
692 {
693 (*mu_it)->dump();
694 }
695 }
696 }
697}
#define DBOUT(TYPE, X)
LLVM debug macros, define type of your DBUG model of each pass.
Definition SVFType.h:576
#define TIMEINTERVAL
Definition SVFType.h:604
#define DMSSA
Definition SVFType.h:593
cJSON * p
Definition cJSON.cpp:2559
cJSON * item
Definition cJSON.h:222
int count
Definition cJSON.h:216
BasicBlockGraph::IDToNodeMapTy::const_iterator const_bb_iterator
const Map< const SVFBasicBlock *, BBSet > & getDomFrontierMap() const
const Map< const SVFBasicBlock *, BBSet > & getDomTreeMap() const
const_bb_iterator begin() const
const SVFBasicBlock * getEntryBlock() const
const_bb_iterator end() const
const std::vector< const SVFBasicBlock * > & getReachableBBs() const
bool hasReturn() const
Memory Region class.
Definition MemRegion.h:60
virtual void performStat() override
Definition SVFGStat.cpp:74
PHISet & getPHISet(const SVFBasicBlock *bb)
Definition MemSSA.h:399
MemSSA(BVDataPTAImpl *p, std::unique_ptr< MRGenerator > mrGenerator)
Definition MemSSA.cpp:49
std::vector< const SVFBasicBlock * > BBList
For phi insertion.
Definition MemSSA.h:93
void RenamePhiOps(const PHISet &phiSet, u32_t pos, MRVector &)
Rename operands (RHS) of phis.
Definition MemSSA.h:285
u32_t getFunEntryChiNum() const
Definition MemSSA.cpp:485
BBToPhiSetMap bb2PhiSetMap
Definition MemSSA.h:138
CallSiteToCHISetMap callsiteToChiSetMap
Definition MemSSA.h:137
CHISet & getCHISet(const StoreStmt *st)
Definition MemSSA.h:387
MemRegToCounterMap mr2CounterMap
Definition MemSSA.h:144
void RenameMuSet(const MUSet &muSet)
Rename mus, chis and phis.
Definition MemSSA.h:249
virtual void createMUCHI(const FunObjVar &fun)
Create mu chi for candidate regions in a function.
Definition MemSSA.cpp:109
u32_t getCallSiteChiNum() const
Definition MemSSA.cpp:536
static double timeOfGeneratingMemRegions
Statistics.
Definition MemSSA.h:107
MRVer * newSSAName(const MemRegion *mr, MSSADEF *def)
Get a new SSA name of a memory region.
Definition MemSSA.cpp:341
void AddStoreCHI(const SVFBasicBlock *bb, const StoreStmt *store, const MRSet &mrSet)
Definition MemSSA.h:194
static double timeOfInsertingPHI
Time for inserting phis.
Definition MemSSA.h:109
bool hasReturnMu(const FunObjVar *fun) const
Definition MemSSA.h:366
void destroy()
Release the memory.
Definition MemSSA.cpp:360
SVFIR * getPAG()
Return SVFIR.
Definition MemSSA.cpp:66
bool hasPHISet(const SVFBasicBlock *bb) const
Definition MemSSA.h:403
void AddLoadMU(const SVFBasicBlock *bb, const LoadStmt *load, const MRSet &mrSet)
Add methods for mus/chis/phis.
Definition MemSSA.h:189
SVFIR::SVFStmtList SVFStmtList
SVFIR edge list.
Definition MemSSA.h:103
BVDataPTAImpl * pta
Definition MemSSA.h:121
static double timeOfCreateMUCHI
Time for generating mu/chi for load/store/calls.
Definition MemSSA.h:108
MemSSAStat * stat
Definition MemSSA.h:123
CHISet & getFuncEntryChiSet(const FunObjVar *fun)
Definition MemSSA.h:371
FunToEntryChiSetMap funToEntryChiSetMap
Definition MemSSA.h:140
virtual void insertPHI(const FunObjVar &fun)
Insert phi for candidate regions in a function.
Definition MemSSA.cpp:195
LoadToMUSetMap load2MuSetMap
Definition MemSSA.h:134
void RenameChiSet(const CHISet &chiSet, MRVector &memRegs)
Rename chi set.
Definition MemSSA.h:260
void RenamePhiRes(const PHISet &phiSet, MRVector &memRegs)
Rename result (LHS) of phis.
Definition MemSSA.h:273
u32_t getFunRetMuNum() const
Definition MemSSA.cpp:502
EntryCHI< Condition > ENTRYCHI
Definition MemSSA.h:64
std::vector< std::unique_ptr< MRVer > > usedMRVers
Definition MemSSA.h:157
StoreToChiSetMap store2ChiSetMap
Definition MemSSA.h:135
void dumpMSSA(OutStream &Out=SVFUtil::outs())
Print Memory SSA.
Definition MemSSA.cpp:569
std::vector< const MemRegion * > MRVector
Definition MemSSA.h:76
Set< MU * > MUSet
Definition MemSSA.h:70
void performStat()
Perform statistics.
Definition MemSSA.cpp:442
Set< PHI * > PHISet
Definition MemSSA.h:72
virtual void buildMemSSA(const FunObjVar &fun)
We start from here.
Definition MemSSA.cpp:74
void AddCallSiteMU(const CallICFGNode *cs, const MRSet &mrSet)
Definition MemSSA.h:199
bool hasFuncEntryChi(const FunObjVar *fun) const
Has function entry chi or return mu.
Definition MemSSA.h:362
RetMU< Condition > RETMU
Definition MemSSA.h:60
static double timeOfSSARenaming
Time for SSA rename.
Definition MemSSA.h:110
u32_t getBBPhiNum() const
Definition MemSSA.cpp:553
u32_t getCallSiteMuNum() const
Definition MemSSA.cpp:519
u32_t getStoreChiNum() const
Definition MemSSA.cpp:468
u32_t getLoadMuNum() const
Stat methods.
Definition MemSSA.cpp:451
std::unique_ptr< MRGenerator > mrGen
Definition MemSSA.h:122
CallSiteToMUSetMap callsiteToMuSetMap
Definition MemSSA.h:136
FunToReturnMuSetMap funToReturnMuSetMap
Definition MemSSA.h:141
bool hasCHI(const PAGEdge *inst) const
Definition MemSSA.h:338
virtual void SSARename(const FunObjVar &fun)
SSA rename for a function.
Definition MemSSA.cpp:243
MRSet usedRegs
The following three set are used for prune SSA phi insertion.
Definition MemSSA.h:150
Map< const SVFBasicBlock *, MRSet > BBToMRSetMap
Definition MemSSA.h:94
MUSet & getMUSet(const LoadStmt *ld)
Get methods of mu/chi/phi.
Definition MemSSA.h:383
void AddCallSiteCHI(const CallICFGNode *cs, const MRSet &mrSet)
Definition MemSSA.h:204
MUSet & getReturnMuSet(const FunObjVar *fun)
Definition MemSSA.h:375
MemRegToBBsMap reg2BBMap
Maps memory region to its basic block.
Definition MemSSA.h:152
void AddMSSAPHI(const SVFBasicBlock *bb, const MRSet &mrSet)
Definition MemSSA.h:209
MemRegToVerStackMap mr2VerStackMap
Definition MemSSA.h:143
MRSet varKills
Collect memory regions whose definition killed.
Definition MemSSA.h:154
virtual void SSARenameBB(const SVFBasicBlock &bb)
SSA rename for a basic block.
Definition MemSSA.cpp:256
bool hasMU(const PAGEdge *inst) const
Has mu/chi methods.
Definition MemSSA.h:327
Set< CHI * > CHISet
Definition MemSSA.h:71
static const Option< std::string > MSSAFun
Definition Options.h:139
bool printStat()
Whether print statistics.
SVFIR * getPAG() const
PTATY getAnalysisTy() const
Type of pointer analysis.
const FunObjVar * getParent() const
const std::vector< const ICFGNode * > & getICFGNodeList() const
u32_t getBBPredecessorPos(const SVFBasicBlock *succbb)
const ICFGNode * back() const
std::vector< const SVFBasicBlock * > getSuccessors() const
const CallGraph * getCallGraph()
Get CG.
Definition SVFIR.h:248
static SVFIR * getPAG(bool buildFromFile=false)
Singleton design here to make sure we only have one instance during any analysis.
Definition SVFIR.h:120
static double getClk(bool mark=false)
Definition SVFStat.cpp:51
virtual const std::string & getName() const
Definition SVFValue.h:184
bool isHeapAllocExtCall(const ICFGNode *cs)
Definition SVFUtil.cpp:361
bool isNonInstricCallSite(const ICFGNode *inst)
Whether an instruction is a callsite in the application code, excluding llvm intrinsic calls.
Definition SVFUtil.h:182
bool isExtCall(const FunObjVar *fun)
Definition SVFUtil.cpp:441
void writeWrnMsg(const std::string &msg)
Writes a message run through wrnMsg.
Definition SVFUtil.cpp:72
bool isRetInstNode(const ICFGNode *node)
Definition SVFUtil.cpp:380
std::ostream & outs()
Overwrite llvm::outs()
Definition SVFUtil.h:52
for isBitcode
Definition BasicTypes.h:70
@ Default_PTA
default pta without any analysis
Definition PTATY.h:35
NodeID MRVERSION
Definition MemRegion.h:56
std::ostream OutStream
Definition GeneralType.h:66
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:76
unsigned u32_t
Definition GeneralType.h:67