41using namespace SVFUtil;
59 else assert(
false &&
"BVDataPTAImpl::BVDataPTAImpl: unexpected points-to backing type!");
66 else assert(
false &&
"BVDataPTAImpl::BVDataPTAImpl: unexpected points-to backing type!");
74 else assert(
false &&
"BVDataPTAImpl::BVDataPTAImpl: unexpected points-to backing type!");
80 else assert(
false &&
"BVDataPTAImpl::BVDataPTAImpl: unexpected points-to backing type!");
87 else assert(
false &&
"BVDataPTAImpl::BVDataPTAImpl: unexpected points-to backing type!");
89 else assert(
false &&
"no points-to data available");
103 if (
names.size() > 1)
109 subtitle =
"Andersen's analysis bitvector";
111 subtitle =
"flow-sensitive analysis bitvector";
113 subtitle =
"CFL analysis bitvector";
115 subtitle =
"Type analysis bitvector";
122 SVFUtil::outs() <<
"################ (program : " << moduleName <<
")###############\n";
124 ptCache.printStats(
"bitvector");
125 SVFUtil::outs() <<
"#######################################################" << std::endl;
167 std::fstream
f(
filename.c_str(), std::ios_base::out);
170 outs() <<
" error opening file for writing!\n";
208 f <<
var <<
" -> { ";
237 f <<
it->second <<
"\n";
250 outs() <<
"Storing pointer analysis results to '" <<
filename <<
"'...";
253 std::fstream
f(
filename.c_str(), std::ios_base::app);
256 outs() <<
" error opening file for writing!\n";
306 if (
line.at(0) ==
'[' ||
line ==
"---VERSIONED---")
continue;
307 if (
line ==
"------")
break;
309 if (
pos == string::npos)
break;
310 if (
line.back() !=
'}')
break;
352 if (
line ==
"------")
break;
377 assert(
false &&
"new gep obj node kind?");
415 outs() <<
"Loading pointer analysis results from '" <<
filename <<
"'...";
420 outs() <<
" error opening file for reading!\n";
451 if (
getPAG()->isValidTopLevelPtr(node))
454 outs() <<
"\nNodeID " << node->
getId() <<
" ";
458 outs() <<
"\t\tPointsTo: {empty}\n\n";
462 outs() <<
"\t\tPointsTo: { ";
488 outs() <<
"----------------------------------------------\n";
492 outs() <<
"----------------------------------------------\n";
530 for(CallSiteSet::const_iterator
it =
tdCallGraph->forksitesBegin(),
534 if(SVFUtil::dyn_cast<FunValVar>(
pVar) ==
nullptr)
543 if(
obj->isFunction())
566 for (
auto t: memToFieldsMap)
570 assert(
obj &&
"Invalid baseObj in memToFieldsMap");
571 assert(
obj->isFieldInsensitive() ==
obj->isFieldInsensitive());
572 if (
obj->isFieldInsensitive())
574 for (
NodeID id : t.second)
581 assert(
id == base &&
"Not a GepObj Node or a baseObj Node?");
609 GepObjVarMap.erase(std::make_pair(base, apOffset));
610 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