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

#include <MemSSA.h>

Public Types

enum  MemPartition { Distinct , IntraDisjoint , InterDisjoint }
 
typedef MemRegion::Condition Condition
 define condition here changes needed if we add new type
 
typedef MSSAMU< ConditionMU
 
typedef RetMU< ConditionRETMU
 
typedef LoadMU< ConditionLOADMU
 
typedef CallMU< ConditionCALLMU
 
typedef MSSACHI< ConditionCHI
 
typedef EntryCHI< ConditionENTRYCHI
 
typedef StoreCHI< ConditionSTORECHI
 
typedef CallCHI< ConditionCALLCHI
 
typedef MSSAPHI< ConditionPHI
 
typedef MSSADEF MDEF
 
typedef Set< MU * > MUSet
 
typedef Set< CHI * > CHISet
 
typedef Set< PHI * > PHISet
 
typedef MRGenerator::MRSet MRSet
 Define mem region set.
 
typedef std::vector< const MemRegion * > MRVector
 
typedef Map< const LoadStmt *, MUSetLoadToMUSetMap
 
typedef Map< const StoreStmt *, CHISetStoreToChiSetMap
 
typedef Map< const CallICFGNode *, MUSetCallSiteToMUSetMap
 
typedef Map< const CallICFGNode *, CHISetCallSiteToCHISetMap
 
typedef OrderedMap< const SVFBasicBlock *, PHISetBBToPhiSetMap
 
typedef Map< const SVFFunction *, CHISetFunToEntryChiSetMap
 Map from fun to its entry chi set and return mu set.
 
typedef Map< const SVFFunction *, MUSetFunToReturnMuSetMap
 
typedef std::vector< const SVFBasicBlock * > BBList
 For phi insertion.
 
typedef Map< const SVFBasicBlock *, MRSetBBToMRSetMap
 
typedef Map< const MemRegion *, BBListMemRegToBBsMap
 
typedef Map< const MemRegion *, std::vector< MRVer * > > MemRegToVerStackMap
 For SSA renaming.
 
typedef Map< const MemRegion *, MRVERSIONMemRegToCounterMap
 
typedef SVFIR::SVFStmtList SVFStmtList
 SVFIR edge list.
 

Static Public Attributes

static double timeOfGeneratingMemRegions = 0
 Statistics.
 
static double timeOfCreateMUCHI = 0
 Time for generating mu/chi for load/store/calls.
 
static double timeOfInsertingPHI = 0
 Time for inserting phis.
 
static double timeOfSSARenaming = 0
 Time for SSA rename.
 

Protected Member Functions

virtual void createMUCHI (const SVFFunction &fun)
 Create mu chi for candidate regions in a function.
 
virtual void insertPHI (const SVFFunction &fun)
 Insert phi for candidate regions in a function.
 
virtual void SSARename (const SVFFunction &fun)
 SSA rename for a function.
 
virtual void SSARenameBB (const SVFBasicBlock &bb)
 SSA rename for a basic block.
 

Protected Attributes

BVDataPTAImplpta
 
MRGeneratormrGen
 
MemSSAStatstat
 

Private Attributes

LoadToMUSetMap load2MuSetMap
 
StoreToChiSetMap store2ChiSetMap
 
CallSiteToMUSetMap callsiteToMuSetMap
 
CallSiteToCHISetMap callsiteToChiSetMap
 
BBToPhiSetMap bb2PhiSetMap
 
FunToEntryChiSetMap funToEntryChiSetMap
 
FunToReturnMuSetMap funToReturnMuSetMap
 
MemRegToVerStackMap mr2VerStackMap
 
MemRegToCounterMap mr2CounterMap
 
MRSet usedRegs
 The following three set are used for prune SSA phi insertion.
 
MemRegToBBsMap reg2BBMap
 Maps memory region to its basic block.
 
MRSet varKills
 Collect memory regions whose definition killed.
 
std::vector< std::unique_ptr< MRVer > > usedMRVers
 
void destroy ()
 Release the memory.
 
MRVernewSSAName (const MemRegion *mr, MSSADEF *def)
 Get a new SSA name of a memory region.
 
MRVergetTopStackVer (const MemRegion *mr)
 Get the last version of the SSA ver of memory region.
 
void collectRegUses (const MemRegion *mr)
 Collect region uses and region defs according to mus/chis, in order to insert phis.
 
void collectRegDefs (const SVFBasicBlock *bb, const MemRegion *mr)
 
void AddLoadMU (const SVFBasicBlock *bb, const LoadStmt *load, const MRSet &mrSet)
 Add methods for mus/chis/phis.
 
void AddStoreCHI (const SVFBasicBlock *bb, const StoreStmt *store, const MRSet &mrSet)
 
void AddCallSiteMU (const CallICFGNode *cs, const MRSet &mrSet)
 
void AddCallSiteCHI (const CallICFGNode *cs, const MRSet &mrSet)
 
void AddMSSAPHI (const SVFBasicBlock *bb, const MRSet &mrSet)
 
void AddLoadMU (const SVFBasicBlock *bb, const LoadStmt *load, const MemRegion *mr)
 
void AddStoreCHI (const SVFBasicBlock *bb, const StoreStmt *store, const MemRegion *mr)
 
void AddCallSiteMU (const CallICFGNode *cs, const MemRegion *mr)
 
void AddCallSiteCHI (const CallICFGNode *cs, const MemRegion *mr)
 
void AddMSSAPHI (const SVFBasicBlock *bb, const MemRegion *mr)
 
void RenameMuSet (const MUSet &muSet)
 Rename mus, chis and phis.
 
void RenameChiSet (const CHISet &chiSet, MRVector &memRegs)
 Rename chi set.
 
void RenamePhiRes (const PHISet &phiSet, MRVector &memRegs)
 Rename result (LHS) of phis.
 
void RenamePhiOps (const PHISet &phiSet, u32_t pos, MRVector &)
 Rename operands (RHS) of phis.
 
 MemSSA (BVDataPTAImpl *p, bool ptrOnlyMSSA)
 Constructor.
 
SVFIRgetPAG ()
 Return SVFIR.
 
BVDataPTAImplgetPTA () const
 Return PTA.
 
MRGeneratorgetMRGenerator ()
 Return MRGenerator.
 
virtual void buildMemSSA (const SVFFunction &fun)
 We start from here.
 
void performStat ()
 Perform statistics.
 
bool hasMU (const PAGEdge *inst) const
 Has mu/chi methods.
 
bool hasCHI (const PAGEdge *inst) const
 
bool hasMU (const CallICFGNode *cs) const
 
bool hasCHI (const CallICFGNode *cs) const
 
bool hasFuncEntryChi (const SVFFunction *fun) const
 Has function entry chi or return mu.
 
bool hasReturnMu (const SVFFunction *fun) const
 
CHISetgetFuncEntryChiSet (const SVFFunction *fun)
 
MUSetgetReturnMuSet (const SVFFunction *fun)
 
MUSetgetMUSet (const LoadStmt *ld)
 Get methods of mu/chi/phi.
 
CHISetgetCHISet (const StoreStmt *st)
 
MUSetgetMUSet (const CallICFGNode *cs)
 
CHISetgetCHISet (const CallICFGNode *cs)
 
PHISetgetPHISet (const SVFBasicBlock *bb)
 
bool hasPHISet (const SVFBasicBlock *bb) const
 
LoadToMUSetMapgetLoadToMUSetMap ()
 
StoreToChiSetMapgetStoreToChiSetMap ()
 
FunToReturnMuSetMapgetFunToRetMuSetMap ()
 
FunToEntryChiSetMapgetFunToEntryChiSetMap ()
 
CallSiteToMUSetMapgetCallSiteToMuSetMap ()
 
CallSiteToCHISetMapgetCallSiteToChiSetMap ()
 
BBToPhiSetMapgetBBToPhiSetMap ()
 
u32_t getLoadMuNum () const
 Stat methods.
 
u32_t getStoreChiNum () const
 
u32_t getFunEntryChiNum () const
 
u32_t getFunRetMuNum () const
 
u32_t getCallSiteMuNum () const
 
u32_t getCallSiteChiNum () const
 
u32_t getBBPhiNum () const
 
void dumpMSSA (OutStream &Out=SVFUtil::outs())
 Print Memory SSA.
 

Detailed Description

Definition at line 52 of file MemSSA.h.

Member Typedef Documentation

◆ BBList

For phi insertion.

Definition at line 93 of file MemSSA.h.

◆ BBToMRSetMap

Definition at line 94 of file MemSSA.h.

◆ BBToPhiSetMap

Definition at line 84 of file MemSSA.h.

◆ CALLCHI

Definition at line 66 of file MemSSA.h.

◆ CALLMU

Definition at line 62 of file MemSSA.h.

◆ CallSiteToCHISetMap

Definition at line 83 of file MemSSA.h.

◆ CallSiteToMUSetMap

Definition at line 82 of file MemSSA.h.

◆ CHI

Definition at line 63 of file MemSSA.h.

◆ CHISet

Definition at line 71 of file MemSSA.h.

◆ Condition

define condition here changes needed if we add new type

Definition at line 58 of file MemSSA.h.

◆ ENTRYCHI

Definition at line 64 of file MemSSA.h.

◆ FunToEntryChiSetMap

Map from fun to its entry chi set and return mu set.

Definition at line 88 of file MemSSA.h.

◆ FunToReturnMuSetMap

Definition at line 89 of file MemSSA.h.

◆ LOADMU

Definition at line 61 of file MemSSA.h.

◆ LoadToMUSetMap

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

Definition at line 80 of file MemSSA.h.

◆ MDEF

Definition at line 68 of file MemSSA.h.

◆ MemRegToBBsMap

Definition at line 95 of file MemSSA.h.

◆ MemRegToCounterMap

Definition at line 100 of file MemSSA.h.

◆ MemRegToVerStackMap

For SSA renaming.

Definition at line 99 of file MemSSA.h.

◆ MRSet

Define mem region set.

Definition at line 75 of file MemSSA.h.

◆ MRVector

Definition at line 76 of file MemSSA.h.

◆ MU

Definition at line 59 of file MemSSA.h.

◆ MUSet

Definition at line 70 of file MemSSA.h.

◆ PHI

Definition at line 67 of file MemSSA.h.

◆ PHISet

Definition at line 72 of file MemSSA.h.

◆ RETMU

Definition at line 60 of file MemSSA.h.

◆ STORECHI

Definition at line 65 of file MemSSA.h.

◆ StoreToChiSetMap

Definition at line 81 of file MemSSA.h.

◆ SVFStmtList

SVFIR edge list.

Definition at line 103 of file MemSSA.h.

Member Enumeration Documentation

◆ MemPartition

Enumerator
Distinct 
IntraDisjoint 
InterDisjoint 

Definition at line 113 of file MemSSA.h.

114 {
115 Distinct,
118 };
@ InterDisjoint
Definition MemSSA.h:117
@ IntraDisjoint
Definition MemSSA.h:116

Constructor & Destructor Documentation

◆ MemSSA()

MemSSA::MemSSA ( BVDataPTAImpl p,
bool  ptrOnlyMSSA 
)

Constructor.

Constructor

Generate whole program memory regions

Definition at line 47 of file MemSSA.cpp.

48{
49 pta = p;
51 && "please specify a pointer analysis");
52
54 mrGen = new DistinctMRG(pta, ptrOnlyMSSA);
56 mrGen = new IntraDisjointMRG(pta, ptrOnlyMSSA);
58 mrGen = new InterDisjointMRG(pta, ptrOnlyMSSA);
59 else
60 assert(false && "unrecognised memory partition strategy");
61
62
63 stat = new MemSSAStat(this);
64
66 double mrStart = stat->getClk(true);
68 double mrEnd = stat->getClk(true);
70}
#define TIMEINTERVAL
Definition SVFType.h:512
cJSON * p
Definition cJSON.cpp:2559
virtual void generateMRs()
Start generating memory regions.
MRGenerator * mrGen
Definition MemSSA.h:122
static double timeOfGeneratingMemRegions
Statistics.
Definition MemSSA.h:107
BVDataPTAImpl * pta
Definition MemSSA.h:121
MemSSAStat * stat
Definition MemSSA.h:123
static const OptionMap< MemSSA::MemPartition > MemPar
Definition Options.h:145
@ Default_PTA
default pta without any analysis
PTATY getAnalysisTy() const
Type of pointer analysis.
static double getClk(bool mark=false)
Definition SVFStat.cpp:48
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:74

◆ ~MemSSA()

virtual SVF::MemSSA::~MemSSA ( )
inlinevirtual

Destructor.

Definition at line 301 of file MemSSA.h.

302 {
303 destroy();
304 }
void destroy()
Release the memory.
Definition MemSSA.cpp:366

Member Function Documentation

◆ AddCallSiteCHI() [1/2]

void SVF::MemSSA::AddCallSiteCHI ( const CallICFGNode cs,
const MemRegion mr 
)
inlineprivate

Definition at line 233 of file MemSSA.h.

234 {
235 CALLCHI* chi = new CALLCHI(cs, mr);
236 callsiteToChiSetMap[cs].insert(chi);
237 collectRegUses(mr);
238 collectRegDefs(chi->getBasicBlock(),mr);
239 }
CallSiteToCHISetMap callsiteToChiSetMap
Definition MemSSA.h:137
void collectRegDefs(const SVFBasicBlock *bb, const MemRegion *mr)
Definition MemSSA.h:180
CallCHI< Condition > CALLCHI
Definition MemSSA.h:66
void collectRegUses(const MemRegion *mr)
Collect region uses and region defs according to mus/chis, in order to insert phis.
Definition MemSSA.h:175

◆ AddCallSiteCHI() [2/2]

void SVF::MemSSA::AddCallSiteCHI ( const CallICFGNode cs,
const MRSet mrSet 
)
inlineprivate

Definition at line 204 of file MemSSA.h.

205 {
206 for (MRSet::iterator iter = mrSet.begin(), eiter = mrSet.end(); iter != eiter; ++iter)
207 AddCallSiteCHI(cs,*iter);
208 }
void AddCallSiteCHI(const CallICFGNode *cs, const MRSet &mrSet)
Definition MemSSA.h:204

◆ AddCallSiteMU() [1/2]

void SVF::MemSSA::AddCallSiteMU ( const CallICFGNode cs,
const MemRegion mr 
)
inlineprivate

Definition at line 227 of file MemSSA.h.

228 {
229 CALLMU* mu = new CALLMU(cs, mr);
230 callsiteToMuSetMap[cs].insert(mu);
231 collectRegUses(mr);
232 }
CallMU< Condition > CALLMU
Definition MemSSA.h:62
CallSiteToMUSetMap callsiteToMuSetMap
Definition MemSSA.h:136

◆ AddCallSiteMU() [2/2]

void SVF::MemSSA::AddCallSiteMU ( const CallICFGNode cs,
const MRSet mrSet 
)
inlineprivate

Definition at line 199 of file MemSSA.h.

200 {
201 for (MRSet::iterator iter = mrSet.begin(), eiter = mrSet.end(); iter != eiter; ++iter)
202 AddCallSiteMU(cs,*iter);
203 }
void AddCallSiteMU(const CallICFGNode *cs, const MRSet &mrSet)
Definition MemSSA.h:199

◆ AddLoadMU() [1/2]

void SVF::MemSSA::AddLoadMU ( const SVFBasicBlock bb,
const LoadStmt load,
const MemRegion mr 
)
inlineprivate

Definition at line 214 of file MemSSA.h.

215 {
216 LOADMU* mu = new LOADMU(bb,load, mr);
217 load2MuSetMap[load].insert(mu);
218 collectRegUses(mr);
219 }
LoadMU< Condition > LOADMU
Definition MemSSA.h:61
LoadToMUSetMap load2MuSetMap
Definition MemSSA.h:134

◆ AddLoadMU() [2/2]

void SVF::MemSSA::AddLoadMU ( const SVFBasicBlock bb,
const LoadStmt load,
const MRSet mrSet 
)
inlineprivate

Add methods for mus/chis/phis.

Definition at line 189 of file MemSSA.h.

190 {
191 for (MRSet::iterator iter = mrSet.begin(), eiter = mrSet.end(); iter != eiter; ++iter)
192 AddLoadMU(bb,load,*iter);
193 }
void AddLoadMU(const SVFBasicBlock *bb, const LoadStmt *load, const MRSet &mrSet)
Add methods for mus/chis/phis.
Definition MemSSA.h:189

◆ AddMSSAPHI() [1/2]

void SVF::MemSSA::AddMSSAPHI ( const SVFBasicBlock bb,
const MemRegion mr 
)
inlineprivate

Definition at line 240 of file MemSSA.h.

241 {
242 bb2PhiSetMap[bb].insert(new PHI(bb, mr));
243 }
BBToPhiSetMap bb2PhiSetMap
Definition MemSSA.h:138
MSSAPHI< Condition > PHI
Definition MemSSA.h:67

◆ AddMSSAPHI() [2/2]

void SVF::MemSSA::AddMSSAPHI ( const SVFBasicBlock bb,
const MRSet mrSet 
)
inlineprivate

Definition at line 209 of file MemSSA.h.

210 {
211 for (MRSet::iterator iter = mrSet.begin(), eiter = mrSet.end(); iter != eiter; ++iter)
212 AddMSSAPHI(bb,*iter);
213 }
void AddMSSAPHI(const SVFBasicBlock *bb, const MRSet &mrSet)
Definition MemSSA.h:209

◆ AddStoreCHI() [1/2]

void SVF::MemSSA::AddStoreCHI ( const SVFBasicBlock bb,
const StoreStmt store,
const MemRegion mr 
)
inlineprivate

Definition at line 220 of file MemSSA.h.

221 {
222 STORECHI* chi = new STORECHI(bb,store, mr);
223 store2ChiSetMap[store].insert(chi);
224 collectRegUses(mr);
225 collectRegDefs(bb,mr);
226 }
StoreCHI< Condition > STORECHI
Definition MemSSA.h:65
StoreToChiSetMap store2ChiSetMap
Definition MemSSA.h:135

◆ AddStoreCHI() [2/2]

void SVF::MemSSA::AddStoreCHI ( const SVFBasicBlock bb,
const StoreStmt store,
const MRSet mrSet 
)
inlineprivate

Definition at line 194 of file MemSSA.h.

195 {
196 for (MRSet::iterator iter = mrSet.begin(), eiter = mrSet.end(); iter != eiter; ++iter)
197 AddStoreCHI(bb,store,*iter);
198 }
void AddStoreCHI(const SVFBasicBlock *bb, const StoreStmt *store, const MRSet &mrSet)
Definition MemSSA.h:194

◆ buildMemSSA()

void MemSSA::buildMemSSA ( const SVFFunction fun)
virtual

We start from here.

Start building memory SSA

Create mus/chis for loads/stores/calls for memory regions

Insert PHI for memory regions

SSA rename for memory regions

Definition at line 80 of file MemSSA.cpp.

81{
82
83 assert(!isExtCall(&fun) && "we do not build memory ssa for external functions");
84
85 DBOUT(DMSSA, outs() << "Building Memory SSA for function " << fun.getName()
86 << " \n");
87
88 usedRegs.clear();
89 reg2BBMap.clear();
90
92 double muchiStart = stat->getClk(true);
93 createMUCHI(fun);
94 double muchiEnd = stat->getClk(true);
96
98 double phiStart = stat->getClk(true);
99 insertPHI(fun);
100 double phiEnd = stat->getClk(true);
102
104 double renameStart = stat->getClk(true);
105 SSARename(fun);
106 double renameEnd = stat->getClk(true);
108
109}
#define DBOUT(TYPE, X)
LLVM debug macros, define type of your DBUG model of each pass.
Definition SVFType.h:484
#define DMSSA
Definition SVFType.h:501
virtual void SSARename(const SVFFunction &fun)
SSA rename for a function.
Definition MemSSA.cpp:249
static double timeOfInsertingPHI
Time for inserting phis.
Definition MemSSA.h:109
static double timeOfCreateMUCHI
Time for generating mu/chi for load/store/calls.
Definition MemSSA.h:108
virtual void createMUCHI(const SVFFunction &fun)
Create mu chi for candidate regions in a function.
Definition MemSSA.cpp:115
static double timeOfSSARenaming
Time for SSA rename.
Definition MemSSA.h:110
virtual void insertPHI(const SVFFunction &fun)
Insert phi for candidate regions in a function.
Definition MemSSA.cpp:201
MRSet usedRegs
The following three set are used for prune SSA phi insertion.
Definition MemSSA.h:150
MemRegToBBsMap reg2BBMap
Maps memory region to its basic block.
Definition MemSSA.h:152
const std::string & getName() const
Definition SVFValue.h:243
bool isExtCall(const SVFFunction *fun)
Definition SVFUtil.h:278
std::ostream & outs()
Overwrite llvm::outs()
Definition SVFUtil.h:50

◆ collectRegDefs()

void SVF::MemSSA::collectRegDefs ( const SVFBasicBlock bb,
const MemRegion mr 
)
inlineprivate

Definition at line 180 of file MemSSA.h.

181 {
182 varKills.insert(mr);
183 reg2BBMap[mr].push_back(bb);
184 }
MRSet varKills
Collect memory regions whose definition killed.
Definition MemSSA.h:154

◆ collectRegUses()

void SVF::MemSSA::collectRegUses ( const MemRegion mr)
inlineprivate

Collect region uses and region defs according to mus/chis, in order to insert phis.

Definition at line 175 of file MemSSA.h.

176 {
177 if (0 == varKills.count(mr))
178 usedRegs.insert(mr);
179 }

◆ createMUCHI()

void MemSSA::createMUCHI ( const SVFFunction fun)
protectedvirtual

Create mu chi for candidate regions in a function.

Create mu/chi according to memory regions collect used mrs in usedRegs and construction map from region to BB for prune SSA phi insertion

get all reachable basic blocks from function entry ignore dead basic blocks

if the function does not have a reachable return instruction from function entry then we won't create return mu for it

Definition at line 115 of file MemSSA.cpp.

116{
117
118
119 DBOUT(DMSSA,
120 outs() << "\t creating mu chi for function " << fun.getName()
121 << "\n");
122 // 1. create mu/chi
123 // insert a set of mus for memory regions at each load
124 // inset a set of chis for memory regions at each store
125
126 // 2. find global names (region name before renaming) of each memory region,
127 // collect used mrs in usedRegs, and collect its def basic block in reg2BBMap
128 // in the form of mu(r) and r = chi (r)
129 // a) mu(r):
130 // if(r \not\in varKills) global = global \cup r
131 // b) r = chi(r):
132 // if(r \not\in varKills) global = global \cup r
133 // varKills = varKills \cup r
134 // block(r) = block(r) \cup bb_{chi}
135
138 BBList reachableBBs = fun.getReachableBBs();
139
140 for (BBList::const_iterator iter = reachableBBs.begin(), eiter = reachableBBs.end();
141 iter != eiter; ++iter)
142 {
143 const SVFBasicBlock* bb = *iter;
144 varKills.clear();
145 for (const auto& inst: bb->getICFGNodeList())
146 {
147 if(mrGen->hasSVFStmtList(inst))
148 {
150 for (SVFStmtList::const_iterator bit = pagEdgeList.begin(),
151 ebit = pagEdgeList.end(); bit != ebit; ++bit)
152 {
153 const PAGEdge* inst = *bit;
154 if (const LoadStmt* load = SVFUtil::dyn_cast<LoadStmt>(inst))
155 AddLoadMU(bb, load, mrGen->getLoadMRSet(load));
156 else if (const StoreStmt* store = SVFUtil::dyn_cast<StoreStmt>(inst))
157 AddStoreCHI(bb, store, mrGen->getStoreMRSet(store));
158 }
159 }
160 if (isNonInstricCallSite(inst))
161 {
162 const CallICFGNode* cs = cast<CallICFGNode>(inst);
163 if(mrGen->hasRefMRSet(cs))
165
166 if(mrGen->hasModMRSet(cs))
168 }
169 }
170 }
171
172 // create entry chi for this function including all memory regions
173 // initialize them with version 0 and 1 r_1 = chi (r_0)
174 for (MRSet::iterator iter = usedRegs.begin(), eiter = usedRegs.end();
175 iter != eiter; ++iter)
176 {
177 const MemRegion* mr = *iter;
178 // initialize mem region version and stack for renaming phase
179 mr2CounterMap[mr] = 0;
180 mr2VerStackMap[mr].clear();
181 ENTRYCHI* chi = new ENTRYCHI(&fun, mr);
182 chi->setOpVer(newSSAName(mr,chi));
183 chi->setResVer(newSSAName(mr,chi));
184 funToEntryChiSetMap[&fun].insert(chi);
185
188 if(fun.hasReturn())
189 {
190 RETMU* mu = new RETMU(&fun, mr);
191 funToReturnMuSetMap[&fun].insert(mu);
192 }
193
194 }
195
196}
MRSet & getStoreMRSet(const StoreStmt *store)
Definition MemRegion.h:451
MRSet & getCallSiteRefMRSet(const CallICFGNode *cs)
Definition MemRegion.h:463
SVFStmtList & getPAGEdgesFromInst(const ICFGNode *node)
Given an instruction, get all its the PAGEdge (statement) in sequence.
bool hasModMRSet(const CallICFGNode *cs)
Definition MemRegion.h:459
bool hasSVFStmtList(const ICFGNode *icfgNode)
Whether this instruction has SVFIR Edge.
MRSet & getLoadMRSet(const LoadStmt *load)
Definition MemRegion.h:447
MRSet & getCallSiteModMRSet(const CallICFGNode *cs)
Definition MemRegion.h:467
bool hasRefMRSet(const CallICFGNode *cs)
Definition MemRegion.h:455
Memory Region class.
Definition MemRegion.h:56
std::vector< const SVFBasicBlock * > BBList
For phi insertion.
Definition MemSSA.h:93
MemRegToCounterMap mr2CounterMap
Definition MemSSA.h:144
MRVer * newSSAName(const MemRegion *mr, MSSADEF *def)
Get a new SSA name of a memory region.
Definition MemSSA.cpp:347
SVFIR::SVFStmtList SVFStmtList
SVFIR edge list.
Definition MemSSA.h:103
FunToEntryChiSetMap funToEntryChiSetMap
Definition MemSSA.h:140
EntryCHI< Condition > ENTRYCHI
Definition MemSSA.h:64
RetMU< Condition > RETMU
Definition MemSSA.h:60
FunToReturnMuSetMap funToReturnMuSetMap
Definition MemSSA.h:141
MemRegToVerStackMap mr2VerStackMap
Definition MemSSA.h:143
const std::vector< const SVFBasicBlock * > & getReachableBBs() const
Definition SVFValue.h:461
bool hasReturn() const
Definition SVFValue.h:471
bool isNonInstricCallSite(const ICFGNode *inst)
Whether an instruction is a callsite in the application code, excluding llvm intrinsic calls.
Definition SVFUtil.h:189

◆ destroy()

void MemSSA::destroy ( )
private

Release the memory.

Clean up memory

Definition at line 366 of file MemSSA.cpp.

367{
368
369 for (LoadToMUSetMap::iterator iter = load2MuSetMap.begin(), eiter =
370 load2MuSetMap.end(); iter != eiter; ++iter)
371 {
372 for (MUSet::iterator it = iter->second.begin(), eit =
373 iter->second.end(); it != eit; ++it)
374 {
375 delete *it;
376 }
377 }
378
379 for (StoreToChiSetMap::iterator iter = store2ChiSetMap.begin(), eiter =
380 store2ChiSetMap.end(); iter != eiter; ++iter)
381 {
382 for (CHISet::iterator it = iter->second.begin(), eit =
383 iter->second.end(); it != eit; ++it)
384 {
385 delete *it;
386 }
387 }
388
389 for (CallSiteToMUSetMap::iterator iter = callsiteToMuSetMap.begin(),
390 eiter = callsiteToMuSetMap.end(); iter != eiter; ++iter)
391 {
392 for (MUSet::iterator it = iter->second.begin(), eit =
393 iter->second.end(); it != eit; ++it)
394 {
395 delete *it;
396 }
397 }
398
399 for (CallSiteToCHISetMap::iterator iter = callsiteToChiSetMap.begin(),
400 eiter = callsiteToChiSetMap.end(); iter != eiter; ++iter)
401 {
402 for (CHISet::iterator it = iter->second.begin(), eit =
403 iter->second.end(); it != eit; ++it)
404 {
405 delete *it;
406 }
407 }
408
409 for (FunToEntryChiSetMap::iterator iter = funToEntryChiSetMap.begin(),
410 eiter = funToEntryChiSetMap.end(); iter != eiter; ++iter)
411 {
412 for (CHISet::iterator it = iter->second.begin(), eit =
413 iter->second.end(); it != eit; ++it)
414 {
415 delete *it;
416 }
417 }
418
419 for (FunToReturnMuSetMap::iterator iter = funToReturnMuSetMap.begin(),
420 eiter = funToReturnMuSetMap.end(); iter != eiter; ++iter)
421 {
422 for (MUSet::iterator it = iter->second.begin(), eit =
423 iter->second.end(); it != eit; ++it)
424 {
425 delete *it;
426 }
427 }
428
429 for (BBToPhiSetMap::iterator iter = bb2PhiSetMap.begin(), eiter =
430 bb2PhiSetMap.end(); iter != eiter; ++iter)
431 {
432 for (PHISet::iterator it = iter->second.begin(), eit =
433 iter->second.end(); it != eit; ++it)
434 {
435 delete *it;
436 }
437 }
438
439 delete mrGen;
440 mrGen = nullptr;
441 delete stat;
442 stat = nullptr;
443 pta = nullptr;
444}

◆ dumpMSSA()

void MemSSA::dumpMSSA ( OutStream Out = SVFUtil::outs())

Print Memory SSA.

Print SSA

Definition at line 576 of file MemSSA.cpp.

577{
578
580 for (const auto& item: *svfirCallGraph)
581 {
582 const SVFFunction* fun = item.second->getFunction();
583 if(Options::MSSAFun()!="" && Options::MSSAFun()!=fun->getName())
584 continue;
585
586 Out << "==========FUNCTION: " << fun->getName() << "==========\n";
587 // dump function entry chi nodes
588 if (hasFuncEntryChi(fun))
589 {
591 for (CHISet::iterator chi_it = entry_chis.begin(); chi_it != entry_chis.end(); chi_it++)
592 {
593 (*chi_it)->dump();
594 }
595 }
596
597 for (SVFFunction::const_iterator bit = fun->begin(), ebit = fun->end();
598 bit != ebit; ++bit)
599 {
600 const SVFBasicBlock* bb = *bit;
601 Out << bb->getName() << "\n";
602 PHISet& phiSet = getPHISet(bb);
603 for(PHISet::iterator pi = phiSet.begin(), epi = phiSet.end(); pi !=epi; ++pi)
604 {
605 (*pi)->dump();
606 }
607
608 bool last_is_chi = false;
609 for (const auto& inst: bb->getICFGNodeList())
610 {
611 bool isAppCall = isNonInstricCallSite(inst) && !isExtCall(inst);
612 if (isAppCall || isHeapAllocExtCall(inst))
613 {
614 const CallICFGNode* cs = cast<CallICFGNode>(inst);
615 if(hasMU(cs))
616 {
617 if (!last_is_chi)
618 {
619 Out << "\n";
620 }
621 for (MUSet::iterator mit = getMUSet(cs).begin(), emit = getMUSet(cs).end();
622 mit != emit; ++mit)
623 {
624 (*mit)->dump();
625 }
626 }
627
628 Out << inst->toString() << "\n";
629
630 if(hasCHI(cs))
631 {
632 for (CHISet::iterator cit = getCHISet(cs).begin(), ecit = getCHISet(cs).end();
633 cit != ecit; ++cit)
634 {
635 (*cit)->dump();
636 }
637 Out << "\n";
638 last_is_chi = true;
639 }
640 else
641 last_is_chi = false;
642 }
643 else
644 {
645 bool dump_preamble = false;
647 for(SVFStmtList::const_iterator bit = pagEdgeList.begin(), ebit= pagEdgeList.end();
648 bit!=ebit; ++bit)
649 {
650 const PAGEdge* edge = *bit;
651 if (const LoadStmt* load = SVFUtil::dyn_cast<LoadStmt>(edge))
652 {
653 MUSet& muSet = getMUSet(load);
654 for(MUSet::iterator it = muSet.begin(), eit = muSet.end(); it!=eit; ++it)
655 {
656 if (!dump_preamble && !last_is_chi)
657 {
658 Out << "\n";
659 dump_preamble = true;
660 }
661 (*it)->dump();
662 }
663 }
664 }
665
666 Out << inst->toString() << "\n";
667
668 bool has_chi = false;
669 for(SVFStmtList::const_iterator bit = pagEdgeList.begin(), ebit= pagEdgeList.end();
670 bit!=ebit; ++bit)
671 {
672 const PAGEdge* edge = *bit;
673 if (const StoreStmt* store = SVFUtil::dyn_cast<StoreStmt>(edge))
674 {
675 CHISet& chiSet = getCHISet(store);
676 for(CHISet::iterator it = chiSet.begin(), eit = chiSet.end(); it!=eit; ++it)
677 {
678 has_chi = true;
679 (*it)->dump();
680 }
681 }
682 }
683 if (has_chi)
684 {
685 Out << "\n";
686 last_is_chi = true;
687 }
688 else
689 last_is_chi = false;
690 }
691 }
692 }
693
694 // dump return mu nodes
695 if (hasReturnMu(fun))
696 {
698 for (MUSet::iterator mu_it = return_mus.begin(); mu_it != return_mus.end(); mu_it++)
699 {
700 (*mu_it)->dump();
701 }
702 }
703 }
704}
cJSON * item
Definition cJSON.h:222
PHISet & getPHISet(const SVFBasicBlock *bb)
Definition MemSSA.h:397
CHISet & getCHISet(const StoreStmt *st)
Definition MemSSA.h:385
bool hasReturnMu(const SVFFunction *fun) const
Definition MemSSA.h:364
MUSet & getReturnMuSet(const SVFFunction *fun)
Definition MemSSA.h:373
Set< MU * > MUSet
Definition MemSSA.h:70
Set< PHI * > PHISet
Definition MemSSA.h:72
CHISet & getFuncEntryChiSet(const SVFFunction *fun)
Definition MemSSA.h:369
bool hasCHI(const PAGEdge *inst) const
Definition MemSSA.h:336
MUSet & getMUSet(const LoadStmt *ld)
Get methods of mu/chi/phi.
Definition MemSSA.h:381
bool hasFuncEntryChi(const SVFFunction *fun) const
Has function entry chi or return mu.
Definition MemSSA.h:360
bool hasMU(const PAGEdge *inst) const
Has mu/chi methods.
Definition MemSSA.h:325
Set< CHI * > CHISet
Definition MemSSA.h:71
static const Option< std::string > MSSAFun
Definition Options.h:143
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
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
bool isHeapAllocExtCall(const ICFGNode *cs)
Definition SVFUtil.cpp:370

◆ getBBPhiNum()

u32_t MemSSA::getBBPhiNum ( ) const

Get PHI numbers

Definition at line 560 of file MemSSA.cpp.

561{
562 u32_t num = 0;
563 BBToPhiSetMap::const_iterator it = bb2PhiSetMap.begin();
564 BBToPhiSetMap::const_iterator eit = bb2PhiSetMap.end();
565 for (; it != eit; it++)
566 {
567 const PHISet & phiSet = it->second;
568 num+= phiSet.size();
569 }
570 return num;
571}
unsigned u32_t
Definition CommandLine.h:18

◆ getBBToPhiSetMap()

BBToPhiSetMap & SVF::MemSSA::getBBToPhiSetMap ( )
inline

Definition at line 429 of file MemSSA.h.

430 {
431 return bb2PhiSetMap;
432 }

◆ getCallSiteChiNum()

u32_t MemSSA::getCallSiteChiNum ( ) const

Get CallCHI numbers

Definition at line 543 of file MemSSA.cpp.

544{
545 u32_t num = 0;
546 CallSiteToCHISetMap::const_iterator it = callsiteToChiSetMap.begin();
547 CallSiteToCHISetMap::const_iterator eit = callsiteToChiSetMap.end();
548 for (; it != eit; it++)
549 {
550 const CHISet & chiSet = it->second;
551 num+= chiSet.size();
552 }
553 return num;
554}

◆ getCallSiteMuNum()

u32_t MemSSA::getCallSiteMuNum ( ) const

Get CallMU numbers

Definition at line 526 of file MemSSA.cpp.

527{
528 u32_t num = 0;
529 CallSiteToMUSetMap::const_iterator it = callsiteToMuSetMap.begin();
530 CallSiteToMUSetMap::const_iterator eit = callsiteToMuSetMap.end();
531 for (; it != eit; it++)
532 {
533 const MUSet & muSet = it->second;
534 num+= muSet.size();
535 }
536 return num;
537}

◆ getCallSiteToChiSetMap()

CallSiteToCHISetMap & SVF::MemSSA::getCallSiteToChiSetMap ( )
inline

Definition at line 425 of file MemSSA.h.

426 {
427 return callsiteToChiSetMap;
428 }

◆ getCallSiteToMuSetMap()

CallSiteToMUSetMap & SVF::MemSSA::getCallSiteToMuSetMap ( )
inline

Definition at line 421 of file MemSSA.h.

422 {
423 return callsiteToMuSetMap;
424 }

◆ getCHISet() [1/2]

CHISet & SVF::MemSSA::getCHISet ( const CallICFGNode cs)
inline

Definition at line 393 of file MemSSA.h.

394 {
395 return callsiteToChiSetMap[cs];
396 }

◆ getCHISet() [2/2]

CHISet & SVF::MemSSA::getCHISet ( const StoreStmt st)
inline

Definition at line 385 of file MemSSA.h.

386 {
387 return store2ChiSetMap[st];
388 }

◆ getFuncEntryChiSet()

CHISet & SVF::MemSSA::getFuncEntryChiSet ( const SVFFunction fun)
inline

Definition at line 369 of file MemSSA.h.

370 {
371 return funToEntryChiSetMap[fun];
372 }

◆ getFunEntryChiNum()

u32_t MemSSA::getFunEntryChiNum ( ) const

Get EntryCHI numbers

Definition at line 492 of file MemSSA.cpp.

493{
494 u32_t num = 0;
495 FunToEntryChiSetMap::const_iterator it = funToEntryChiSetMap.begin();
496 FunToEntryChiSetMap::const_iterator eit = funToEntryChiSetMap.end();
497 for (; it != eit; it++)
498 {
499 const CHISet& chiSet = it->second;
500 num += chiSet.size();
501 }
502 return num;
503}

◆ getFunRetMuNum()

u32_t MemSSA::getFunRetMuNum ( ) const

Get RetMU numbers

Definition at line 509 of file MemSSA.cpp.

510{
511 u32_t num = 0;
512 FunToReturnMuSetMap::const_iterator it = funToReturnMuSetMap.begin();
513 FunToReturnMuSetMap::const_iterator eit = funToReturnMuSetMap.end();
514 for (; it != eit; it++)
515 {
516 const MUSet & muSet = it->second;
517 num+= muSet.size();
518 }
519 return num;
520}

◆ getFunToEntryChiSetMap()

FunToEntryChiSetMap & SVF::MemSSA::getFunToEntryChiSetMap ( )
inline

Definition at line 417 of file MemSSA.h.

418 {
419 return funToEntryChiSetMap;
420 }

◆ getFunToRetMuSetMap()

FunToReturnMuSetMap & SVF::MemSSA::getFunToRetMuSetMap ( )
inline

Definition at line 413 of file MemSSA.h.

414 {
415 return funToReturnMuSetMap;
416 }

◆ getLoadMuNum()

u32_t MemSSA::getLoadMuNum ( ) const

Stat methods.

Get loadMU numbers

Definition at line 458 of file MemSSA.cpp.

459{
460 u32_t num = 0;
461 LoadToMUSetMap::const_iterator it = load2MuSetMap.begin();
462 LoadToMUSetMap::const_iterator eit = load2MuSetMap.end();
463 for (; it != eit; it++)
464 {
465 const MUSet & muSet = it->second;
466 num+= muSet.size();
467 }
468 return num;
469}

◆ getLoadToMUSetMap()

LoadToMUSetMap & SVF::MemSSA::getLoadToMUSetMap ( )
inline

Definition at line 405 of file MemSSA.h.

406 {
407 return load2MuSetMap;
408 }

◆ getMRGenerator()

MRGenerator * SVF::MemSSA::getMRGenerator ( )
inline

Return MRGenerator.

Definition at line 313 of file MemSSA.h.

314 {
315 return mrGen;
316 }

◆ getMUSet() [1/2]

MUSet & SVF::MemSSA::getMUSet ( const CallICFGNode cs)
inline

Definition at line 389 of file MemSSA.h.

390 {
391 return callsiteToMuSetMap[cs];
392 }

◆ getMUSet() [2/2]

MUSet & SVF::MemSSA::getMUSet ( const LoadStmt ld)
inline

Get methods of mu/chi/phi.

Definition at line 381 of file MemSSA.h.

382 {
383 return load2MuSetMap[ld];
384 }

◆ getPAG()

SVFIR * MemSSA::getPAG ( )
inline

Return SVFIR.

Definition at line 72 of file MemSSA.cpp.

73{
74 return pta->getPAG();
75}
SVFIR * getPAG() const

◆ getPHISet()

PHISet & SVF::MemSSA::getPHISet ( const SVFBasicBlock bb)
inline

Definition at line 397 of file MemSSA.h.

398 {
399 return bb2PhiSetMap[bb];
400 }

◆ getPTA()

BVDataPTAImpl * SVF::MemSSA::getPTA ( ) const
inline

Return PTA.

Definition at line 308 of file MemSSA.h.

309 {
310 return pta;
311 }

◆ getReturnMuSet()

MUSet & SVF::MemSSA::getReturnMuSet ( const SVFFunction fun)
inline

Definition at line 373 of file MemSSA.h.

374 {
375 return funToReturnMuSetMap[fun];
376 }

◆ getStoreChiNum()

u32_t MemSSA::getStoreChiNum ( ) const

Get StoreCHI numbers

Definition at line 475 of file MemSSA.cpp.

476{
477 u32_t num = 0;
478 StoreToChiSetMap::const_iterator it = store2ChiSetMap.begin();
479 StoreToChiSetMap::const_iterator eit = store2ChiSetMap.end();
480 for (; it != eit; it++)
481 {
482 const CHISet& chiSet = it->second;
483 num += chiSet.size();
484 }
485 return num;
486}

◆ getStoreToChiSetMap()

StoreToChiSetMap & SVF::MemSSA::getStoreToChiSetMap ( )
inline

Definition at line 409 of file MemSSA.h.

410 {
411 return store2ChiSetMap;
412 }

◆ getTopStackVer()

MRVer * SVF::MemSSA::getTopStackVer ( const MemRegion mr)
inlineprivate

Get the last version of the SSA ver of memory region.

Definition at line 166 of file MemSSA.h.

167 {
168 std::vector<MRVer*> &stack = mr2VerStackMap[mr];
169 assert(!stack.empty() && "stack is empty!!");
170 return stack.back();
171 }

◆ hasCHI() [1/2]

bool SVF::MemSSA::hasCHI ( const CallICFGNode cs) const
inline

Definition at line 352 of file MemSSA.h.

353 {
354 return callsiteToChiSetMap.find(cs)!=callsiteToChiSetMap.end();
355 }

◆ hasCHI() [2/2]

bool SVF::MemSSA::hasCHI ( const PAGEdge inst) const
inline

Definition at line 336 of file MemSSA.h.

337 {
338 if (const StoreStmt* store = SVFUtil::dyn_cast<StoreStmt>(
339 inst))
340 {
341 bool has_store = store2ChiSetMap.count(store) != 0;
342 assert(has_store && "not associated with mem region!");
343 return has_store;
344 }
345 else
346 return false;
347 }

◆ hasFuncEntryChi()

bool SVF::MemSSA::hasFuncEntryChi ( const SVFFunction fun) const
inline

Has function entry chi or return mu.

Definition at line 360 of file MemSSA.h.

361 {
362 return (funToEntryChiSetMap.find(fun) != funToEntryChiSetMap.end());
363 }

◆ hasMU() [1/2]

bool SVF::MemSSA::hasMU ( const CallICFGNode cs) const
inline

Definition at line 348 of file MemSSA.h.

349 {
350 return callsiteToMuSetMap.find(cs)!=callsiteToMuSetMap.end();
351 }

◆ hasMU() [2/2]

bool SVF::MemSSA::hasMU ( const PAGEdge inst) const
inline

Has mu/chi methods.

Definition at line 325 of file MemSSA.h.

326 {
327 if (const LoadStmt* load = SVFUtil::dyn_cast<LoadStmt>(inst))
328 {
329 bool hasMu = load2MuSetMap.count(load) != 0;
330 assert(hasMu && "not associated with mem region!");
331 return hasMu;
332 }
333 else
334 return false;
335 }

◆ hasPHISet()

bool SVF::MemSSA::hasPHISet ( const SVFBasicBlock bb) const
inline

Definition at line 401 of file MemSSA.h.

402 {
403 return bb2PhiSetMap.find(bb)!=bb2PhiSetMap.end();
404 }

◆ hasReturnMu()

bool SVF::MemSSA::hasReturnMu ( const SVFFunction fun) const
inline

Definition at line 364 of file MemSSA.h.

365 {
366 return (funToReturnMuSetMap.find(fun) != funToReturnMuSetMap.end());
367 }

◆ insertPHI()

void MemSSA::insertPHI ( const SVFFunction fun)
protectedvirtual

Insert phi for candidate regions in a function.

Definition at line 201 of file MemSSA.cpp.

202{
203
204 DBOUT(DMSSA,
205 outs() << "\t insert phi for function " << fun.getName() << "\n");
206
208 // record whether a phi of mr has already been inserted into the bb.
210
211 // start inserting phi node
212 for (MRSet::iterator iter = usedRegs.begin(), eiter = usedRegs.end();
213 iter != eiter; ++iter)
214 {
215 const MemRegion* mr = *iter;
216
217 BBList bbs = reg2BBMap[mr];
218 while (!bbs.empty())
219 {
220 const SVFBasicBlock* bb = bbs.back();
221 bbs.pop_back();
222 Map<const SVFBasicBlock*,Set<const SVFBasicBlock*>>::const_iterator it = df.find(bb);
223 if(it == df.end())
224 {
225 writeWrnMsg("bb not in the dominance frontier map??");
226 continue;
227 }
228 const Set<const SVFBasicBlock*>& domSet = it->second;
229 for (const SVFBasicBlock* pbb : domSet)
230 {
231 // if we never insert this phi node before
232 if (0 == bb2MRSetMap[pbb].count(mr))
233 {
234 bb2MRSetMap[pbb].insert(mr);
235 // insert phi node
236 AddMSSAPHI(pbb,mr);
237 // continue to insert phi in its iterative dominate frontiers
238 bbs.push_back(pbb);
239 }
240 }
241 }
242 }
243
244}
int count
Definition cJSON.h:216
Map< const SVFBasicBlock *, MRSet > BBToMRSetMap
Definition MemSSA.h:94
const ICFGNode * back() const
Definition SVFValue.h:611
const Map< const SVFBasicBlock *, BBSet > & getDomFrontierMap() const
Definition SVFValue.h:506
void writeWrnMsg(const std::string &msg)
Writes a message run through wrnMsg.
Definition SVFUtil.cpp:67

◆ newSSAName()

MRVer * MemSSA::newSSAName ( const MemRegion mr,
MSSADEF def 
)
private

Get a new SSA name of a memory region.

Definition at line 347 of file MemSSA.cpp.

348{
349 assert(0 != mr2CounterMap.count(mr)
350 && "did not find initial version in map? ");
351 assert(0 != mr2VerStackMap.count(mr)
352 && "did not find initial stack in map? ");
353
354 MRVERSION version = mr2CounterMap[mr];
355 mr2CounterMap[mr] = version + 1;
356 auto mrVer = std::make_unique<MRVer>(mr, version, def);
357 auto mrVerPtr = mrVer.get();
358 mr2VerStackMap[mr].push_back(mrVerPtr);
359 usedMRVers.push_back(std::move(mrVer));
360 return mrVerPtr;
361}
std::vector< std::unique_ptr< MRVer > > usedMRVers
Definition MemSSA.h:157
NodeID MRVERSION
Definition MemRegion.h:52

◆ performStat()

void MemSSA::performStat ( )

Perform statistics.

Perform statistics

Definition at line 449 of file MemSSA.cpp.

450{
451 if(pta->printStat())
452 stat->performStat();
453}
virtual void performStat() override
Definition SVFGStat.cpp:74
bool printStat()
Whether print statistics.

◆ RenameChiSet()

void SVF::MemSSA::RenameChiSet ( const CHISet chiSet,
MRVector memRegs 
)
inlineprivate

Rename chi set.

Definition at line 260 of file MemSSA.h.

261 {
262 for (CHISet::const_iterator cit = chiSet.begin(), ecit = chiSet.end();
263 cit != ecit; ++cit)
264 {
265 CHI* chi = (*cit);
266 chi->setOpVer(getTopStackVer(chi->getMR()));
267 chi->setResVer(newSSAName(chi->getMR(),chi));
268 memRegs.push_back(chi->getMR());
269 }
270 }
MSSACHI< Condition > CHI
Definition MemSSA.h:63
MRVer * getTopStackVer(const MemRegion *mr)
Get the last version of the SSA ver of memory region.
Definition MemSSA.h:166

◆ RenameMuSet()

void SVF::MemSSA::RenameMuSet ( const MUSet muSet)
inlineprivate

Rename mus, chis and phis.

Rename mu set

Definition at line 249 of file MemSSA.h.

250 {
251 for (MUSet::const_iterator mit = muSet.begin(), emit = muSet.end();
252 mit != emit; ++mit)
253 {
254 MU* mu = (*mit);
255 mu->setVer(getTopStackVer(mu->getMR()));
256 }
257 }
MSSAMU< Condition > MU
Definition MemSSA.h:59

◆ RenamePhiOps()

void SVF::MemSSA::RenamePhiOps ( const PHISet phiSet,
u32_t  pos,
MRVector  
)
inlineprivate

Rename operands (RHS) of phis.

Definition at line 285 of file MemSSA.h.

286 {
287 for (PHISet::const_iterator iter = phiSet.begin(), eiter = phiSet.end();
288 iter != eiter; ++iter)
289 {
290 PHI* phi = *iter;
291 phi->setOpVer(getTopStackVer(phi->getMR()), pos);
292 }
293 }

◆ RenamePhiRes()

void SVF::MemSSA::RenamePhiRes ( const PHISet phiSet,
MRVector memRegs 
)
inlineprivate

Rename result (LHS) of phis.

Definition at line 273 of file MemSSA.h.

274 {
275 for (PHISet::const_iterator iter = phiSet.begin(), eiter = phiSet.end();
276 iter != eiter; ++iter)
277 {
278 PHI* phi = *iter;
279 phi->setResVer(newSSAName(phi->getMR(),phi));
280 memRegs.push_back(phi->getMR());
281 }
282 }

◆ SSARename()

void MemSSA::SSARename ( const SVFFunction fun)
protectedvirtual

SSA rename for a function.

SSA construction algorithm

Definition at line 249 of file MemSSA.cpp.

250{
251
252 DBOUT(DMSSA,
253 outs() << "\t ssa rename for function " << fun.getName() << "\n");
254
256}
virtual void SSARenameBB(const SVFBasicBlock &bb)
SSA rename for a basic block.
Definition MemSSA.cpp:262
const SVFBasicBlock * getEntryBlock() const
Definition SVFValue.h:420

◆ SSARenameBB()

void MemSSA::SSARenameBB ( const SVFBasicBlock bb)
protectedvirtual

SSA rename for a basic block.

Renaming for each memory regions See the renaming algorithm in book Engineering A Compiler (Figure 9.12)

Definition at line 262 of file MemSSA.cpp.

263{
264
265 // record which mem region needs to pop stack
267
268 // rename phi result op
269 // for each r = phi (...)
270 // rewrite r as new name
271 if (hasPHISet(&bb))
273
274
275 // process mu and chi
276 // for each mu(r)
277 // rewrite r with top mrver of stack(r)
278 // for each r = chi(r')
279 // rewrite r' with top mrver of stack(r)
280 // rewrite r with new name
281
282 for (const auto& pNode: bb.getICFGNodeList())
283 {
285 {
287 for(SVFStmtList::const_iterator bit = pagEdgeList.begin(), ebit= pagEdgeList.end();
288 bit!=ebit; ++bit)
289 {
290 const PAGEdge* inst = *bit;
291 if (const LoadStmt* load = SVFUtil::dyn_cast<LoadStmt>(inst))
292 RenameMuSet(getMUSet(load));
293
294 else if (const StoreStmt* store = SVFUtil::dyn_cast<StoreStmt>(inst))
296
297 }
298 }
300 {
302 if(mrGen->hasRefMRSet(cs))
304
305 if(mrGen->hasModMRSet(cs))
307 }
308 else if(isRetInstNode(pNode))
309 {
310 const SVFFunction* fun = bb.getParent();
312 }
313 }
314
315
316 // fill phi operands of succ basic blocks
317 for (const SVFBasicBlock* succ : bb.getSuccessors())
318 {
320 if (hasPHISet(succ))
322 }
323
324 // for succ basic block in dominator tree
325 const SVFFunction* fun = bb.getParent();
327 Map<const SVFBasicBlock*,Set<const SVFBasicBlock*>>::const_iterator mapIter = dtBBsMap.find(&bb);
328 if (mapIter != dtBBsMap.end())
329 {
330 const Set<const SVFBasicBlock*>& dtBBs = mapIter->second;
331 for (const SVFBasicBlock* dtbb : dtBBs)
332 {
334 }
335 }
336 // for each r = chi(..), and r = phi(..)
337 // pop ver stack(r)
338 while (!memRegs.empty())
339 {
340 const MemRegion* mr = memRegs.back();
341 memRegs.pop_back();
342 mr2VerStackMap[mr].pop_back();
343 }
344
345}
void RenamePhiOps(const PHISet &phiSet, u32_t pos, MRVector &)
Rename operands (RHS) of phis.
Definition MemSSA.h:285
void RenameMuSet(const MUSet &muSet)
Rename mus, chis and phis.
Definition MemSSA.h:249
bool hasPHISet(const SVFBasicBlock *bb) const
Definition MemSSA.h:401
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
std::vector< const MemRegion * > MRVector
Definition MemSSA.h:76
const SVFFunction * getParent() const
Definition SVFValue.h:595
u32_t getBBPredecessorPos(const SVFBasicBlock *succbb)
Definition SVFValue.cpp:241
const Map< const SVFBasicBlock *, BBSet > & getDomTreeMap() const
Definition SVFValue.h:501
bool isRetInstNode(const ICFGNode *node)
Definition SVFUtil.cpp:389

Member Data Documentation

◆ bb2PhiSetMap

BBToPhiSetMap SVF::MemSSA::bb2PhiSetMap
private

Definition at line 138 of file MemSSA.h.

◆ callsiteToChiSetMap

CallSiteToCHISetMap SVF::MemSSA::callsiteToChiSetMap
private

Definition at line 137 of file MemSSA.h.

◆ callsiteToMuSetMap

CallSiteToMUSetMap SVF::MemSSA::callsiteToMuSetMap
private

Definition at line 136 of file MemSSA.h.

◆ funToEntryChiSetMap

FunToEntryChiSetMap SVF::MemSSA::funToEntryChiSetMap
private

Definition at line 140 of file MemSSA.h.

◆ funToReturnMuSetMap

FunToReturnMuSetMap SVF::MemSSA::funToReturnMuSetMap
private

Definition at line 141 of file MemSSA.h.

◆ load2MuSetMap

LoadToMUSetMap SVF::MemSSA::load2MuSetMap
private

Definition at line 134 of file MemSSA.h.

◆ mr2CounterMap

MemRegToCounterMap SVF::MemSSA::mr2CounterMap
private

Definition at line 144 of file MemSSA.h.

◆ mr2VerStackMap

MemRegToVerStackMap SVF::MemSSA::mr2VerStackMap
private

Definition at line 143 of file MemSSA.h.

◆ mrGen

MRGenerator* SVF::MemSSA::mrGen
protected

Definition at line 122 of file MemSSA.h.

◆ pta

BVDataPTAImpl* SVF::MemSSA::pta
protected

Definition at line 121 of file MemSSA.h.

◆ reg2BBMap

MemRegToBBsMap SVF::MemSSA::reg2BBMap
private

Maps memory region to its basic block.

Definition at line 152 of file MemSSA.h.

◆ stat

MemSSAStat* SVF::MemSSA::stat
protected

Definition at line 123 of file MemSSA.h.

◆ store2ChiSetMap

StoreToChiSetMap SVF::MemSSA::store2ChiSetMap
private

Definition at line 135 of file MemSSA.h.

◆ timeOfCreateMUCHI

double MemSSA::timeOfCreateMUCHI = 0
static

Time for generating mu/chi for load/store/calls.

Definition at line 108 of file MemSSA.h.

◆ timeOfGeneratingMemRegions

double MemSSA::timeOfGeneratingMemRegions = 0
static

Statistics.

Time for allocating regions.

Time for allocating regions

Definition at line 107 of file MemSSA.h.

◆ timeOfInsertingPHI

double MemSSA::timeOfInsertingPHI = 0
static

Time for inserting phis.

Definition at line 109 of file MemSSA.h.

◆ timeOfSSARenaming

double MemSSA::timeOfSSARenaming = 0
static

Time for SSA rename.

Definition at line 110 of file MemSSA.h.

◆ usedMRVers

std::vector<std::unique_ptr<MRVer> > SVF::MemSSA::usedMRVers
private

Definition at line 157 of file MemSSA.h.

◆ usedRegs

MRSet SVF::MemSSA::usedRegs
private

The following three set are used for prune SSA phi insertion.

Collects used memory regions

Definition at line 150 of file MemSSA.h.

◆ varKills

MRSet SVF::MemSSA::varKills
private

Collect memory regions whose definition killed.

Definition at line 154 of file MemSSA.h.


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