36#ifndef MUTABLE_POINTSTO_H_
37#define MUTABLE_POINTSTO_H_
47template <
typename Key,
typename KeySet,
typename Data,
typename DataSet>
51template <
typename Key,
typename KeySet,
typename Data,
typename DataSet>
76 virtual inline void clear()
override
82 virtual inline const DataSet&
getPts(
const Key& var)
override
87 virtual inline const KeySet&
getRevPts(
const Data& datum)
override
89 assert(this->
rev &&
"MutablePTData::getRevPts: constructed without reverse PT support!");
93 virtual inline bool addPts(
const Key &dstKey,
const Data& element)
override
99 virtual inline bool unionPts(
const Key& dstKey,
const Key& srcKey)
override
105 virtual inline bool unionPts(
const Key& dstKey,
const DataSet& srcDataSet)
override
116 virtual void clearPts(
const Key& var,
const Data& element)
override
119 ptsMap[var].reset(element);
124 DataSet &pts =
ptsMap[var];
131 for (
typename PtsMap::value_type &ppt :
ptsMap) ppt.second.checkAndRemap();
137 for (
typename PtsMap::value_type ppt :
ptsMap)
139 const DataSet &pt = ppt.second;
155 return ptd->
getPTDTY() == PTDataTy::MutBase;
162 for (
PtsMapConstIter nodeIt = ptsSet.begin(); nodeIt != ptsSet.end(); nodeIt++)
164 const Key& var = nodeIt->first;
165 const DataSet & pts = nodeIt->second;
168 O << var <<
" ==> { ";
169 for(
typename DataSet::iterator cit = pts.begin(), ecit=pts.end(); cit!=ecit; ++cit)
180 inline bool unionPts(DataSet& dstDataSet,
const DataSet& srcDataSet)
182 return dstDataSet |= srcDataSet;
184 inline bool addPts(DataSet &d,
const Data& e)
186 return d.test_and_set(e);
195 inline void addRevPts(
const DataSet &ptsData,
const Key& tgr)
199 for(
iterator it = ptsData.begin(), eit = ptsData.end(); it!=eit; ++it)
225template <
typename Key,
typename KeySet,
typename Data,
typename DataSet>
250 virtual inline const DataSet&
getPts(
const Key& var)
override
255 virtual inline const KeySet&
getRevPts(
const Data& datum)
override
257 assert(this->
rev &&
"MutableDiffPTData::getRevPts: constructed without reverse PT support!");
261 virtual inline bool addPts(
const Key &dstKey,
const Data& element)
override
263 return mutPTData.addPts(dstKey, element);
266 virtual inline bool unionPts(
const Key& dstKey,
const Key& srcKey)
override
268 return mutPTData.unionPts(dstKey, srcKey);
271 virtual inline bool unionPts(
const Key& dstKey,
const DataSet& srcDataSet)
override
273 return mutPTData.unionPts(dstKey, srcDataSet);
276 virtual void clearPts(
const Key& var,
const Data& element)
override
289 for (
typename PtsMap::value_type &ppt :
diffPtsMap) ppt.second.checkAndRemap();
290 for (
typename PtsMap::value_type &ppt :
propaPtsMap) ppt.second.checkAndRemap();
310 diff.intersectWithComplement(all, propa);
312 return !diff.empty();
319 dstPropa &= srcPropa;
341 return ptd->
getPTDTY() == PTDataTy::MutDiff;
361template <
typename Key,
typename KeySet,
typename Data,
typename DataSet>
387 virtual inline void clear()
override
392 virtual inline const DataSet&
getPts(
const Key& var)
override
397 virtual inline const KeySet&
getRevPts(
const Data& datum)
override
399 assert(this->
rev &&
"MutableDFPTData::getRevPts: constructed without reverse PT support!");
418 const PtsMap& ptsMap = it->second;
419 return (ptsMap.find(var) != ptsMap.end());
427 const PtsMap& ptsMap = it->second;
428 return (ptsMap.find(var) != ptsMap.end());
490 bool changed =
false;
495 for (
typename PtsMap::const_iterator ptsIt = ptsMap.begin(), ptsEit = ptsMap.end(); ptsIt != ptsEit; ++ptsIt)
497 const Key var = ptsIt->first;
499 if (strongUpdates && var == singleton)
525 virtual inline bool addPts(
const Key &dstKey,
const Key& srcKey)
override
529 virtual inline bool unionPts(
const Key& dstKey,
const Key& srcKey)
override
533 virtual inline bool unionPts(
const Key& dstKey,
const DataSet& srcDataSet)
override
537 virtual void clearPts(
const Key& var,
const Data& element)
override
548 for (
typename DFPtsMap::value_type &lopt :
dfInPtsMap)
550 for (
typename PtsMap::value_type &opt : lopt.second) opt.second.checkAndRemap();
553 for (
typename DFPtsMap::value_type &lopt :
dfOutPtsMap)
555 for (
typename PtsMap::value_type &opt : lopt.second) opt.second.checkAndRemap();
563 for (
typename DFPtsMap::value_type lptsmap :
dfInPtsMap)
565 for (
typename PtsMap::value_type vpt : lptsmap.second)
567 ++allPts[vpt.second];
571 for (
typename DFPtsMap::value_type lptm :
dfOutPtsMap)
573 for (
typename PtsMap::value_type vpt : lptm.second)
575 ++allPts[vpt.second];
598 inline bool unionPts(DataSet& dstDataSet,
const DataSet& srcDataSet)
600 return dstDataSet |= srcDataSet;
602 inline bool addPts(DataSet &d,
const Data& e)
604 return d.test_and_set(e);
616 std::error_code ErrInfo;
617 std::fstream f(
"svfg_pts.data", std::ios_base::out);
632 f <<
"Loc:" << loc <<
" IN:{";
639 f <<
"Loc:" << loc <<
" OUT:{";
656 for (
PtsMapConstIter nodeIt = ptsSet.begin(); nodeIt != ptsSet.end(); nodeIt++)
658 const Key& var = nodeIt->first;
659 const DataSet & pts = nodeIt->second;
662 O <<
"<" << var <<
",{";
680template <
typename Key,
typename KeySet,
typename Data,
typename DataSet>
764 bool changed =
false;
769 for (
DataIter ptsIt = pts.begin(), ptsEit = pts.end(); ptsIt != ptsEit; ++ptsIt)
771 const Key var = *ptsIt;
773 if (strongUpdates && var == singleton)
807 for (
DataIter ptsIt = pts.begin(), ptsEit = pts.end(); ptsIt != ptsEit; ++ptsIt)
809 const Key var = *ptsIt;
840 it->second.reset(var);
847 return it->second.test(var);
869 it->second.reset(var);
876 return it->second.test(var);
890template <
typename Key,
typename KeySet,
typename Data,
typename DataSet,
typename VersionedKey,
typename VersionedKeySet>
903 virtual inline void clear()
override
909 virtual const DataSet&
getPts(
const Key& vk)
override
913 virtual const DataSet&
getPts(
const VersionedKey& vk)
override
918 virtual const KeySet&
getRevPts(
const Data& datum)
override
920 assert(this->
rev &&
"MutableVersionedPTData::getRevPts: constructed without reverse PT support!");
925 assert(this->
rev &&
"MutableVersionedPTData::getVersionedKeyRevPts: constructed without reverse PT support!");
929 virtual bool addPts(
const Key& k,
const Data& element)
override
933 virtual bool addPts(
const VersionedKey& vk,
const Data& element)
override
935 return atPTData.addPts(vk, element);
938 virtual bool unionPts(
const Key& dstVar,
const Key& srcVar)
override
940 return tlPTData.unionPts(dstVar, srcVar);
942 virtual bool unionPts(
const VersionedKey& dstVar,
const VersionedKey& srcVar)
override
944 return atPTData.unionPts(dstVar, srcVar);
946 virtual bool unionPts(
const VersionedKey& dstVar,
const Key& srcVar)
override
950 virtual bool unionPts(
const Key& dstVar,
const VersionedKey& srcVar)
override
954 virtual bool unionPts(
const Key& dstVar,
const DataSet& srcDataSet)
override
956 return tlPTData.unionPts(dstVar, srcDataSet);
958 virtual bool unionPts(
const VersionedKey& dstVar,
const DataSet& srcDataSet)
override
960 return atPTData.unionPts(dstVar, srcDataSet);
963 virtual void clearPts(
const Key& k,
const Data& element)
override
967 virtual void clearPts(
const VersionedKey& vk,
const Data& element)
override
998 SVFUtil::outs() <<
"== Address-taken points-to information\n";
1011 return ptd->
getPTDTY() == PTDataTy::MutVersioned;
DFPTData(bool reversePT=true, PTDataTy ty=BasePTData::DataFlow)
Constructor.
DiffPTData(bool reversePT=true, PTDataTy ty=PTDataTy::Diff)
Map< LocID, PtsMap > DFPtsMap
Data-flow point-to map.
virtual bool updateATVPts(const Key &srcVar, LocID dstLoc, const Key &dstVar) override
Update address-taken variables OUT[dstLoc:dstVar] with points-to of top-level pointers.
virtual DataSet & getDFOutPtsSet(LocID loc, const Key &var) override
DFPTData< Key, KeySet, Data, DataSet > BaseDFPTData
const PtsMap & getDFInPtsMap(LocID loc)
virtual bool updateTLVPts(LocID srcLoc, const Key &srcVar, const Key &dstVar) override
Update points-to set of top-level pointers with IN[srcLoc:srcVar].
const PtsMap & getDFOutPtsMap(LocID loc)
virtual bool updateAllDFInFromIn(LocID srcLoc, const Key &srcVar, LocID dstLoc, const Key &dstVar) override
Union (IN[dstLoc::dstVar], IN[srcLoc:srcVar]. There is no flag check, unlike the above.
PTData< Key, KeySet, Data, DataSet > BasePTData
DFPtsMap::iterator DFPtsMapIter
BaseMutPTData::PtsMapConstIter PtsMapConstIter
virtual void clearAllDFOutUpdatedVar(LocID) override
virtual void clear() override
Clears all points-to sets as if nothing is stored.
virtual bool updateAllDFOutFromIn(LocID loc, const Key &singleton, bool strongUpdates) override
For each variable var in IN at loc, do updateDFOutFromIn(loc, var, loc, var).
static bool classof(const MutableDFPTData< Key, KeySet, Data, DataSet > *)
const DFPtsMap & getDFIn()
virtual bool updateAllDFInFromOut(LocID srcLoc, const Key &srcVar, LocID dstLoc, const Key &dstVar) override
Union (IN[dstLoc::dstVar], OUT[srcLoc:srcVar]. There is no flag check, unlike the above.
virtual bool updateDFInFromOut(LocID srcLoc, const Key &srcVar, LocID dstLoc, const Key &dstVar) override
Union (IN[dstLoc:dstVar], OUT[srcLoc:srcVar]).
bool unionPts(DataSet &dstDataSet, const DataSet &srcDataSet)
virtual void dumpPTData() override
virtual ~MutableDFPTData()
virtual const DataSet & getPts(const Key &var) override
Get points-to set of var.
virtual bool hasDFInSet(LocID loc) const override
const DFPtsMap & getDFOut()
virtual bool hasDFInSet(LocID loc, const Key &var) const override
virtual DataSet & getDFInPtsSet(LocID loc, const Key &var) override
virtual void clearFullPts(const Key &var) override
Fully clears the points-to set of var.
virtual Map< DataSet, unsigned > getAllPts(bool liveOnly) const override
virtual bool updateDFOutFromIn(LocID srcLoc, const Key &srcVar, LocID dstLoc, const Key &dstVar) override
Union (OUT[dstLoc:dstVar], IN[srcLoc:srcVar]).
virtual bool unionPts(const Key &dstKey, const DataSet &srcDataSet) override
Performs pts(dstVar) = pts(dstVar) U srcDataSet.
virtual bool addPts(const Key &dstKey, const Key &srcKey) override
bool addPts(DataSet &d, const Data &e)
virtual const PtsMap & getPtsMap() const
virtual bool updateDFInFromIn(LocID srcLoc, const Key &srcVar, LocID dstLoc, const Key &dstVar) override
virtual const KeySet & getRevPts(const Data &datum) override
Get reverse points-to set of a datum.
virtual bool hasDFOutSet(LocID loc) const override
static bool classof(const PTData< Key, KeySet, Data, DataSet > *ptd)
MutablePTData< NodeID, NodeSet, NodeID, PointsTo > mutPTData
MutablePTData< Key, KeySet, Data, DataSet > BaseMutPTData
virtual void remapAllPts(void) override
Remaps all points-to sets to use the current mapping.
virtual bool unionPts(const Key &dstKey, const Key &srcKey) override
Performs pts(dstVar) = pts(dstVar) U pts(srcVar).
DFPtsMap::const_iterator DFPtsMapconstIter
virtual void clearPts(const Key &var, const Data &element) override
Clears element from the points-to set of var.
BaseMutPTData::PtsMap PtsMap
BaseDFPTData::LocID LocID
virtual void dumpPts(const PtsMap &ptsSet, OutStream &O=SVFUtil::outs()) const
MutableDFPTData(bool reversePT=true, PTDataTy ty=BaseDFPTData::MutDataFlow)
Constructor.
BasePTData::PTDataTy PTDataTy
virtual bool hasDFOutSet(LocID loc, const Key &var) const override
virtual bool unionPts(const Key &dstKey, const Key &srcKey) override
Performs pts(dstVar) = pts(dstVar) U pts(srcVar).
DataSet & getPropaPts(Key &var)
Get propagated points to.
MutablePTData< Key, KeySet, Data, DataSet >::PtsMap PtsMap
static bool classof(const MutableDiffPTData< Key, KeySet, Data, DataSet > *)
virtual void updatePropaPtsMap(Key &src, Key &dst) override
virtual const PtsMap & getPtsMap() const
MutablePTData< NodeID, NodeSet, NodeID, PointsTo > mutPTData
virtual void clearPropaPts(Key &var) override
Clear propagated points-to set of var.
~MutableDiffPTData() override=default
virtual Map< DataSet, unsigned > getAllPts(bool liveOnly) const override
PTData< Key, KeySet, Data, DataSet > BasePTData
virtual void clearPts(const Key &var, const Data &element) override
Clears element from the points-to set of var.
void clear() override
Clears all points-to sets as if nothing is stored.
virtual bool addPts(const Key &dstKey, const Data &element) override
Adds element to the points-to set associated with var.
virtual bool unionPts(const Key &dstKey, const DataSet &srcDataSet) override
Performs pts(dstVar) = pts(dstVar) U srcDataSet.
virtual void remapAllPts(void) override
Remaps all points-to sets to use the current mapping.
virtual void clearFullPts(const Key &var) override
Fully clears the points-to set of var.
virtual const DataSet & getPts(const Key &var) override
Get points-to set of var.
BasePTData::PTDataTy PTDataTy
DiffPTData< Key, KeySet, Data, DataSet > BaseDiffPTData
virtual const KeySet & getRevPts(const Data &datum) override
Get reverse points-to set of a datum.
virtual bool computeDiffPts(Key &var, const DataSet &all) override
virtual void dumpPTData() override
Dump stored keys and points-to sets.
MutableDiffPTData(bool reversePT=true, PTDataTy ty=PTDataTy::Diff)
Constructor.
virtual const DataSet & getDiffPts(Key &var) override
Get diff points to.
static bool classof(const PTData< Key, KeySet, Data, DataSet > *ptd)
PTData< Key, KeySet, Data, DataSet > BasePTData
DataSet::iterator DataIter
virtual bool updateAllDFInFromOut(LocID srcLoc, const Key &srcVar, LocID dstLoc, const Key &dstVar) override
Union (IN[dstLoc::dstVar], OUT[srcLoc:srcVar]. There is no flag check, unlike the above.
void setVarDFInSetUpdated(LocID loc, const Key &var)
Handle address-taken variables whose IN pts changed.
const DataSet & getDFOutUpdatedVar(LocID loc)
Get all var which have new pts information in loc's OUT set.
virtual bool updateAllDFOutFromIn(LocID loc, const Key &singleton, bool strongUpdates) override
For each variable var in IN at loc, do updateDFOutFromIn(loc, var, loc, var).
DFPTData< Key, KeySet, Data, DataSet > BaseDFPTData
bool varHasNewDFOutPts(LocID loc, const Key &var)
Return TRUE if var has new pts in loc's OUT set.
MutableDFPTData< Key, KeySet, Data, DataSet > BaseMutDFPTData
BasePTData::PTDataTy PTDataTy
Map< LocID, DataSet > UpdatedVarMap
for propagating only newly added variable in IN/OUT set
BaseDFPTData::LocID LocID
virtual bool updateDFInFromIn(LocID srcLoc, const Key &srcVar, LocID dstLoc, const Key &dstVar) override
virtual bool updateTLVPts(LocID srcLoc, const Key &srcVar, const Key &dstVar) override
Update points-to set of top-level pointers with IN[srcLoc:srcVar].
void setVarDFOutSetUpdated(LocID loc, const Key &var)
Handle address-taken variables whose OUT pts changed.
static bool classof(const MutableIncDFPTData< Key, KeySet, Data, DataSet > *)
UpdatedVarMap::iterator UpdatedVarMapIter
const DataSet & getDFInUpdatedVar(LocID loc)
Get all var which have new pts information in loc's IN set.
void removeVarFromDFInUpdatedSet(LocID loc, const Key &var)
Remove var from loc's IN updated set.
MutablePTData< Key, KeySet, Data, DataSet > BaseMutPTData
MutableIncDFPTData(bool reversePT=true, PTDataTy ty=BasePTData::MutIncDataFlow)
Constructor.
virtual bool updateDFOutFromIn(LocID srcLoc, const Key &srcVar, LocID dstLoc, const Key &dstVar) override
Union (OUT[dstLoc:dstVar], IN[srcLoc:srcVar]).
static bool classof(const PTData< Key, KeySet, Data, DataSet > *ptd)
virtual bool updateATVPts(const Key &srcVar, LocID dstLoc, const Key &dstVar) override
Update address-taken variables OUT[dstLoc:dstVar] with points-to of top-level pointers.
UpdatedVarMap inUpdatedVarMap
void removeVarFromDFOutUpdatedSet(LocID loc, const Key &var)
Remove var from loc's OUT updated set.
virtual void clearAllDFOutUpdatedVar(LocID loc) override
virtual bool updateDFInFromOut(LocID srcLoc, const Key &srcVar, LocID dstLoc, const Key &dstVar) override
Union (IN[dstLoc:dstVar], OUT[srcLoc:srcVar]).
virtual bool updateAllDFInFromIn(LocID srcLoc, const Key &srcVar, LocID dstLoc, const Key &dstVar) override
Union (IN[dstLoc::dstVar], IN[srcLoc:srcVar]. There is no flag check, unlike the above.
virtual ~MutableIncDFPTData()
bool varHasNewDFInPts(LocID loc, const Key &var)
Return TRUE if var has new pts in loc's IN set.
UpdatedVarMap outUpdatedVarMap
UpdatedVarMap::const_iterator UpdatedVarconstIter
PTData implemented using points-to sets which are created once and updated continuously.
virtual const KeySet & getRevPts(const Data &datum) override
Get reverse points-to set of a datum.
virtual bool unionPts(const Key &dstKey, const Key &srcKey) override
Performs pts(dstVar) = pts(dstVar) U pts(srcVar).
virtual bool unionPts(const Key &dstKey, const DataSet &srcDataSet) override
Performs pts(dstVar) = pts(dstVar) U srcDataSet.
virtual void dumpPTData() override
Dump stored keys and points-to sets.
virtual void remapAllPts(void) override
Remaps all points-to sets to use the current mapping.
virtual void clearFullPts(const Key &var) override
Fully clears the points-to set of var.
void addSingleRevPts(KeySet &revData, const Key &tgr)
MutablePTData(bool reversePT=true, PTDataTy ty=PTDataTy::MutBase)
Constructor.
void clearSingleRevPts(KeySet &revSet, const Key &k)
static bool classof(const PTData< Key, KeySet, Data, DataSet > *ptd)
static bool classof(const MutablePTData< Key, KeySet, Data, DataSet > *)
virtual void clearPts(const Key &var, const Data &element) override
Clears element from the points-to set of var.
virtual Map< DataSet, unsigned > getAllPts(bool liveOnly) const override
Map< Data, KeySet > RevPtsMap
void clearRevPts(const DataSet &pts, const Key &k)
bool addPts(DataSet &d, const Data &e)
virtual const DataSet & getPts(const Key &var) override
Get points-to set of var.
BasePTData::PTDataTy PTDataTy
virtual bool addPts(const Key &dstKey, const Data &element) override
Adds element to the points-to set associated with var.
PTData< Key, KeySet, Data, DataSet > BasePTData
bool unionPts(DataSet &dstDataSet, const DataSet &srcDataSet)
virtual void clear() override
Clears all points-to sets as if nothing is stored.
PtsMap::iterator PtsMapIter
void addRevPts(const DataSet &ptsData, const Key &tgr)
virtual const PtsMap & getPtsMap() const
Return Points-to map.
Map< Key, DataSet > PtsMap
DataSet::iterator iterator
PtsMap::const_iterator PtsMapConstIter
virtual void dumpPts(const PtsMap &ptsSet, OutStream &O=SVFUtil::outs()) const
virtual bool addPts(const Key &k, const Data &element) override
Adds element to the points-to set associated with var.
MutablePTData< NodeID, NodeSet, NodeID, PointsTo > tlPTData
virtual const DataSet & getPts(const Key &vk) override
Get points-to set of var.
virtual void clearPts(const VersionedKey &vk, const Data &element) override
PTData< Key, KeySet, Data, DataSet > BasePTData
MutablePTData< VersionedVar, Set< VersionedVar >, NodeID, PointsTo > atPTData
virtual bool unionPts(const VersionedKey &dstVar, const Key &srcVar) override
virtual bool unionPts(const VersionedKey &dstVar, const VersionedKey &srcVar) override
virtual const DataSet & getPts(const VersionedKey &vk) override
static bool classof(const PTData< Key, KeySet, Data, DataSet > *ptd)
static bool classof(const MutableVersionedPTData< Key, KeySet, Data, DataSet, VersionedKey, VersionedKeySet > *)
virtual void remapAllPts(void) override
Remaps all points-to sets to use the current mapping.
virtual Map< DataSet, unsigned > getAllPts(bool liveOnly) const override
virtual void dumpPTData() override
Dump stored keys and points-to sets.
virtual const VersionedKeySet & getVersionedKeyRevPts(const Data &datum) override
virtual bool unionPts(const Key &dstVar, const VersionedKey &srcVar) override
virtual void clearFullPts(const Key &k) override
Fully clears the points-to set of var.
VersionedPTData< Key, KeySet, Data, DataSet, VersionedKey, VersionedKeySet > BaseVersionedPTData
virtual bool unionPts(const Key &dstVar, const DataSet &srcDataSet) override
Performs pts(dstVar) = pts(dstVar) U srcDataSet.
virtual bool unionPts(const VersionedKey &dstVar, const DataSet &srcDataSet) override
virtual void clearFullPts(const VersionedKey &vk) override
virtual void clearPts(const Key &k, const Data &element) override
Clears element from the points-to set of var.
virtual void clear() override
Clears all points-to sets as if nothing is stored.
virtual const KeySet & getRevPts(const Data &datum) override
Get reverse points-to set of a datum.
MutableVersionedPTData(bool reversePT=true, PTDataTy ty=PTDataTy::MutVersioned)
virtual ~MutableVersionedPTData()
virtual bool unionPts(const Key &dstVar, const Key &srcVar) override
Performs pts(dstVar) = pts(dstVar) U pts(srcVar).
virtual bool addPts(const VersionedKey &vk, const Data &element) override
BasePTData::PTDataTy PTDataTy
PTData(bool reversePT=true, PTDataTy ty=PTDataTy::Base)
bool rev
Whether we maintain reverse points-to sets or not.
PTDataTy
Types of a points-to data structures.
PTDataTy getPTDTY() const
Get the type of points-to data structure that this is.
SparseBitVectorIterator iterator
VersionedPTData(bool reversePT=true, PTDataTy ty=PTDataTy::Versioned)
void mergePtsOccMaps(Map< Data, unsigned > &to, const Map< Data, unsigned > from)
Given a map mapping points-to sets to a count, adds from into to.
std::ostream & outs()
Overwrite llvm::outs().
void dumpSet(NodeBS To, OutStream &O=SVFUtil::outs())
Dump sparse bitvector set.
void removeKey(const Key &key, KeySet &keySet)
Removes an element from a Set/CondSet (or anything implementing erase).
void insertKey(const Key &key, KeySet &keySet)
Inserts an element into a Set/CondSet (with insert).
std::unordered_map< Key, Value, Hash, KeyEqual, Allocator > Map