42using namespace SVFUtil;
60 else assert(
false &&
"BVDataPTAImpl::BVDataPTAImpl: unexpected points-to backing type!");
67 else assert(
false &&
"BVDataPTAImpl::BVDataPTAImpl: unexpected points-to backing type!");
75 else assert(
false &&
"BVDataPTAImpl::BVDataPTAImpl: unexpected points-to backing type!");
81 else assert(
false &&
"BVDataPTAImpl::BVDataPTAImpl: unexpected points-to backing type!");
88 else assert(
false &&
"BVDataPTAImpl::BVDataPTAImpl: unexpected points-to backing type!");
90 else assert(
false &&
"no points-to data available");
104 if (
names.size() > 1)
110 subtitle =
"Andersen's analysis bitvector";
112 subtitle =
"flow-sensitive analysis bitvector";
114 subtitle =
"CFL analysis bitvector";
116 subtitle =
"Type analysis bitvector";
123 SVFUtil::outs() <<
"################ (program : " << moduleName <<
")###############\n";
125 ptCache.printStats(
"bitvector");
126 SVFUtil::outs() <<
"#######################################################" << std::endl;
168 std::fstream
f(
filename.c_str(), std::ios_base::out);
171 outs() <<
" error opening file for writing!\n";
209 f <<
var <<
" -> { ";
238 f << it->second <<
"\n";
251 outs() <<
"Storing pointer analysis results to '" <<
filename <<
"'...";
254 std::fstream
f(
filename.c_str(), std::ios_base::app);
257 outs() <<
" error opening file for writing!\n";
307 if (
line.at(0) ==
'[' ||
line ==
"---VERSIONED---")
continue;
308 if (
line ==
"------")
break;
310 if (
pos == string::npos)
break;
311 if (
line.back() !=
'}')
break;
353 if (
line ==
"------")
break;
378 assert(
false &&
"new gep obj node kind?");
416 outs() <<
"Loading pointer analysis results from '" <<
filename <<
"'...";
421 outs() <<
" error opening file for reading!\n";
452 if (
getPAG()->isValidTopLevelPtr(node))
455 outs() <<
"\nNodeID " << node->
getId() <<
" ";
459 outs() <<
"\t\tPointsTo: {empty}\n\n";
463 outs() <<
"\t\tPointsTo: { ";
466 outs() << *it <<
" ";
489 outs() <<
"----------------------------------------------\n";
493 outs() <<
"----------------------------------------------\n";
531 for(ThreadCallGraph::CallSiteSet::const_iterator it =
tdCallGraph->forksitesBegin(),
535 if(SVFUtil::dyn_cast<FunValVar>(
pVar) ==
nullptr)
544 if(
obj->isFunction())
567 for (
auto t: memToFieldsMap)
571 assert(
obj &&
"Invalid baseObj in memToFieldsMap");
572 assert(
obj->isFieldInsensitive() ==
obj->isFieldInsensitive());
573 if (
obj->isFieldInsensitive())
575 for (
NodeID id : t.second)
582 assert(
id == base &&
"Not a GepObj Node or a baseObj Node?");
610 GepObjVarMap.erase(std::make_pair(base, apOffset));
611 memToFieldsMap[base].reset(
n);
virtual void normalizePointsTo()
virtual void writeToFile(const std::string &filename)
Interface for analysis result storage on filesystem.
virtual bool readFromFile(const std::string &filename)
virtual void writeObjVarToFile(const std::string &filename)
virtual void clearPts(NodeID id, NodeID element)
Remove element from the points-to set of id.
virtual void readAndSetObjFieldSensitivity(std::ifstream &f, const std::string &delimiterStr)
AliasResult alias(const SVFVar *V1, const SVFVar *V2) override
Interface expose to users of our pointer analysis, given Value infos.
virtual void writeGepObjVarMapToFile(std::fstream &f)
void finalize() override
Finalization of pointer analysis, and normalize points-to information to Bit Vector representation.
virtual void writePtsResultToFile(std::fstream &f)
virtual void expandFIObjs(const PointsTo &pts, PointsTo &expandedPts)
Expand FI objects.
void dumpAllPts() override
void remapPointsToSets(void)
Remap all points-to sets to use the current mapping.
BVDataPTAImpl(SVFIR *pag, PTATY type, bool alias_check=true)
Constructor.
virtual void onTheFlyThreadCallGraphSolve(const CallSiteToFunPtrMap &callsites, CallEdgeMap &newForkEdges)
On the fly thread call graph construction respecting forksite.
PersistentPointsToCache< PointsTo > ptCache
virtual void onTheFlyCallGraphSolve(const CallSiteToFunPtrMap &callsites, CallEdgeMap &newEdges)
On the fly call graph construction.
virtual bool updateCallGraph(const CallSiteToFunPtrMap &)
Update callgraph. This should be implemented by its subclass.
std::unique_ptr< PTDataTy > ptD
Points-to data.
PersistentPointsToCache< PointsTo > & getPtCache()
PTData< NodeID, NodeSet, NodeID, PointsTo > PTDataTy
void dumpTopLevelPtsTo() override
const PointsTo & getPts(NodeID id) override
virtual void readPtsResultFromFile(std::ifstream &f)
PTDataTy * getPTDataTy() const
Get points-to data structure.
virtual bool addPts(NodeID id, NodeID ptd)
virtual void readGepObjVarMapFromFile(std::ifstream &f)
const SVFVar * getVtablePtr() const
bool isVirtualCall() const
virtual const FunObjVar * getFunction() const
Get containing function, or null for globals/constants.
iterator begin()
Iterators.
void removeGNode(NodeType *node)
Delete a node.
IDToNodeMapTy::iterator iterator
Node Iterators.
NodeType * getGNode(NodeID id) const
Get a node.
static NodeIDAllocator * get(void)
Return (singleton) allocator.
void increaseNumOfObjAndNodes()
static const Option< bool > INCDFPTData
static const OptionMap< PTBackingType > ptDataBacking
PTData type.
static const Option< u32_t > MaxFieldLimit
Maximum number of field derivations for an object.
bool isFieldInsensitive(NodeID id) const
virtual void finalize()
Finalization of a pointer analysis, including checking alias correctness.
virtual void dumpPts(NodeID ptr, const PointsTo &pts)
bool print_stat
User input flags.
OrderedMap< const CallICFGNode *, FunctionSet > CallEdgeMap
bool containBlackHoleNode(const PointsTo &pts)
Determine whether a points-to contains a black hole or constant node.
PTAImplTy ptaImplTy
PTA implementation type.
OrderedNodeSet & getAllValidPtrs()
Get all Valid Pointers for resolution.
virtual void resolveIndCalls(const CallICFGNode *cs, const PointsTo &target, CallEdgeMap &newEdges)
Resolve indirect call edges.
CallGraph * callgraph
Call graph used for pointer analysis.
virtual void resolveCPPIndCalls(const CallICFGNode *cs, const PointsTo &target, CallEdgeMap &newEdges)
Resolve cpp indirect call edges.
void setObjFieldInsensitive(NodeID id)
SVFIR::CallSiteToFunPtrMap CallSiteToFunPtrMap
PTATY ptaTy
Pointer analysis Type.
NodeBS toNodeBS() const
Returns this points-to set as a NodeBS.
std::pair< NodeID, APOffset > GepOffset
NodeID getBaseObjVarID(NodeID id) const
Base and Offset methods for Value and Object node.
const BaseObjVar * getBaseObject(NodeID id) const
const ObjVar * getObjVar(NodeID id) const
NodeBS & getAllFieldsObjVars(const BaseObjVar *obj)
Get all fields of an object.
NodeID addGepObjNode(GepObjVar *gepObj, NodeID base, const APOffset &apOffset)
const CallSiteToFunPtrMap & getIndirectCallsites() const
Add/get indirect callsites.
const SVFVar * getSVFVar(NodeID id) const
ObjVar/GepObjVar/BaseObjVar.
OffsetToGepVarMap & getGepObjNodeMap()
Return GepObjVarMap.
Map< NodeID, NodeBS > MemObjToFieldsMap
Map< GepOffset, NodeID > OffsetToGepVarMap
const std::string & getModuleIdentifier() const
MemObjToFieldsMap & getMemToFieldsMap()
Return memToFieldsMap.
NodeID getId() const
Get ID.
std::ostream & outs()
Overwrite llvm::outs()
std::vector< std::string > split(const std::string &s, char separator)
Split into two substrings around the first occurrence of a separator string.
@ BVDataImpl
Represents BVDataPTAImpl.
PTATY
Pointer analysis type list.
@ Cxt_DDA
context sensitive DDA
@ VFS_WPA
Versioned sparse flow-sensitive WPA.
@ Andersen_WPA
Andersen PTA.
@ FSSPARSE_WPA
Sparse flow sensitive WPA.
@ AndersenSFR_WPA
Stride-based field representation.
@ FieldS_DDA
Field sensitive DDA.
@ FlowS_DDA
Flow sensitive DDA.
@ AndersenWaveDiff_WPA
Diff wave propagation andersen-style WPA.
@ CFLFICI_WPA
Flow-, context-, insensitive CFL-reachability-based analysis.
@ TypeCPP_WPA
Type-based analysis for C++.
@ FSDATAFLOW_WPA
Traditional Dataflow-based flow sensitive WPA.
@ Steensgaard_WPA
Steensgaard PTA.
@ FSCS_WPA
Flow-, context- sensitive WPA.
@ CFLFSCS_WPA
Flow-, context-, CFL-reachability-based analysis.
@ Andersen_BASE
Base Andersen PTA.
@ AndersenSCD_WPA
Selective cycle detection andersen-style WPA.
OrderedSet< NodeID > OrderedNodeSet
llvm::IRBuilder IRBuilder