103{
104
106 u32_t totalCallsites = 0;
107 u32_t morePreciseCallsites = 0;
108 u32_t zeroTargetCallsites = 0;
109 u32_t oneTargetCallsites = 0;
110 u32_t twoTargetCallsites = 0;
111 u32_t moreThanTwoCallsites = 0;
112
115 {
116 NodeID vtptr = nIter->first;
117 const PointsTo& ddaPts = pta->
getPts(vtptr);
118 const PointsTo& anderPts = ander->
getPts(vtptr);
119
121 const CallICFGNode* cbn = nIter->second;
122
124 {
125
126 continue;
127 }
128
130 totalCallsites++;
131 if(callees.size() == 0)
132 zeroTargetCallsites++;
133 else if(callees.size() == 1)
134 oneTargetCallsites++;
135 else if(callees.size() == 2)
136 twoTargetCallsites++;
137 else
138 moreThanTwoCallsites++;
139
141 continue;
142
147
148 ++morePreciseCallsites;
149 outs() <<
"============more precise callsite =================\n";
150 outs() << (nIter->second)->toString() <<
"\n";
153 outs() <<
"------ander pts or vtable num---(" << anderPts.
count() <<
")--\n";
154 outs() <<
"------DDA vfn num---(" << ander_vfns.size() <<
")--\n";
155
156 outs() <<
"------DDA pts or vtable num---(" << ddaPts.
count() <<
")--\n";
157 outs() <<
"------DDA vfn num---(" << dda_vfns.size() <<
")--\n";
158
159 outs() <<
"-------------------------\n";
161 outs() <<
"=================================================\n";
162 }
163
164 outs() <<
"=================================================\n";
166 outs() <<
"Total analyzed virtual callsites: " << totalCallsites <<
"\n";
168 outs() <<
"Precise callsites: " << morePreciseCallsites <<
"\n";
169 outs() <<
"Zero target callsites: " << zeroTargetCallsites <<
"\n";
170 outs() <<
"One target callsites: " << oneTargetCallsites <<
"\n";
171 outs() <<
"Two target callsites: " << twoTargetCallsites <<
"\n";
172 outs() <<
"More than two target callsites: " << moreThanTwoCallsites <<
"\n";
173 outs() <<
"=================================================\n";
174}
static AndersenWaveDiff * createAndersenWaveDiff(SVFIR *_pag)
Create an singleton instance directly instead of invoking llvm pass manager.
virtual const PointsTo & getPts(NodeID id)
Operation of points-to set.
bool hasIndCSCallees(const CallICFGNode *cs) const
const FunctionSet & getIndCSCallees(const CallICFGNode *cs) const
CallEdgeMap & getIndCallMap()
Get callees from an indirect callsite.
Set< const FunObjVar * > FunctionSet
void getVFnsFromPts(const CallICFGNode *cs, const PointsTo &target, VFunSet &vfns)
virtual const PointsTo & getPts(NodeID ptr)=0
Get points-to targets of a pointer. It needs to be implemented in child class.
CallGraph * getCallGraph() const
Return call graph.
bool empty() const
Returns true if set is empty.
u32_t count() const
Returns number of elements.
const std::string getSourceLoc(const Value *val)
std::ostream & outs()
Overwrite llvm::outs().
std::unordered_set< Key, Hash, KeyEqual, Allocator > Set