Static Value-Flow Analysis
Loading...
Searching...
No Matches
MutablePointsToDS.h
Go to the documentation of this file.
1//===- MutablePointsToDS.h -- Mutable points-to data structure-------------//
2//
3// SVF: Static Value-Flow Analysis
4//
5// Copyright (C) <2013-> <Yulei Sui>
6//
7
8// This program is free software: you can redistribute it and/or modify
9// it under the terms of the GNU Affero General Public License as published by
10// the Free Software Foundation, either version 3 of the License, or
11// (at your option) any later version.
12
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU Affero General Public License for more details.
17
18// You should have received a copy of the GNU Affero General Public License
19// along with this program. If not, see <http://www.gnu.org/licenses/>.
20//
21//===----------------------------------------------------------------------===//
22
25
26/*
27 * MutablePointsToDS.h
28 *
29 * Authors: Mohamad Barbar and Yulei Sui
30 *
31 * The implementation is based on
32 * Mohamad Barbar and Yulei Sui. Hash Consed Points-To Sets.
33 * 28th Static Analysis Symposium (SAS'21)
34 */
35
36#ifndef MUTABLE_POINTSTO_H_
37#define MUTABLE_POINTSTO_H_
38
39#include<fstream>
40
42#include "Util/SVFUtil.h"
43
44namespace SVF
45{
46
47template <typename Key, typename KeySet, typename Data, typename DataSet>
48class MutableDFPTData;
49
51template <typename Key, typename KeySet, typename Data, typename DataSet>
52class MutablePTData : public PTData<Key, KeySet, Data, DataSet>
53{
54 friend class MutableDFPTData<Key, KeySet, Data, DataSet>;
55public:
58
61 typedef typename PtsMap::iterator PtsMapIter;
62 typedef typename PtsMap::const_iterator PtsMapConstIter;
63 typedef typename DataSet::iterator iterator;
64
66 MutablePTData(bool reversePT = true, PTDataTy ty = PTDataTy::MutBase) : BasePTData(reversePT, ty) { }
67
68 virtual ~MutablePTData() { }
69
71 virtual inline const PtsMap& getPtsMap() const
72 {
73 return ptsMap;
74 }
75
76 virtual inline void clear() override
77 {
78 ptsMap.clear();
79 revPtsMap.clear();
80 }
81
82 virtual inline const DataSet& getPts(const Key& var) override
83 {
84 return ptsMap[var];
85 }
86
87 virtual inline const KeySet& getRevPts(const Data& datum) override
88 {
89 assert(this->rev && "MutablePTData::getRevPts: constructed without reverse PT support!");
90 return revPtsMap[datum];
91 }
92
93 virtual inline bool addPts(const Key &dstKey, const Data& element) override
94 {
96 return addPts(ptsMap[dstKey], element);
97 }
98
99 virtual inline bool unionPts(const Key& dstKey, const Key& srcKey) override
100 {
103 }
104
105 virtual inline bool unionPts(const Key& dstKey, const DataSet& srcDataSet) override
106 {
109 }
110
111 virtual inline void dumpPTData() override
112 {
114 }
115
116 virtual void clearPts(const Key& var, const Data& element) override
117 {
119 ptsMap[var].reset(element);
120 }
121
122 virtual void clearFullPts(const Key& var) override
123 {
124 DataSet &pts = ptsMap[var];
126 pts.clear();
127 }
128
129 virtual void remapAllPts(void) override
130 {
131 for (typename PtsMap::value_type &ppt : ptsMap) ppt.second.checkAndRemap();
132 }
133
134 virtual inline Map<DataSet, unsigned> getAllPts(bool liveOnly) const override
135 {
137 for (typename PtsMap::value_type ppt : ptsMap)
138 {
139 const DataSet &pt = ppt.second;
140 ++allPts[pt];
141 }
142
143 return allPts;
144 }
145
149 {
150 return true;
151 }
152
154 {
155 return ptd->getPTDTY() == PTDataTy::MutBase;
156 }
158
159protected:
160 virtual inline void dumpPts(const PtsMap & ptsSet,OutStream & O = SVFUtil::outs()) const
161 {
162 for (PtsMapConstIter nodeIt = ptsSet.begin(); nodeIt != ptsSet.end(); nodeIt++)
163 {
164 const Key& var = nodeIt->first;
165 const DataSet & pts = nodeIt->second;
166 if (pts.empty())
167 continue;
168 O << var << " ==> { ";
169 for(typename DataSet::iterator cit = pts.begin(), ecit=pts.end(); cit!=ecit; ++cit)
170 {
171 O << *cit << " ";
172 }
173 O << "}\n";
174 }
175 }
176
177private:
180 inline bool unionPts(DataSet& dstDataSet, const DataSet& srcDataSet)
181 {
182 return dstDataSet |= srcDataSet;
183 }
184 inline bool addPts(DataSet &d, const Data& e)
185 {
186 return d.test_and_set(e);
187 }
188 inline void addSingleRevPts(KeySet &revData, const Key& tgr)
189 {
190 if (this->rev)
191 {
193 }
194 }
195 inline void addRevPts(const DataSet &ptsData, const Key& tgr)
196 {
197 if (this->rev)
198 {
199 for(iterator it = ptsData.begin(), eit = ptsData.end(); it!=eit; ++it)
201 }
202 }
203 inline void clearSingleRevPts(KeySet &revSet, const Key &k)
204 {
205 if (this->rev)
206 {
208 }
209 }
210 inline void clearRevPts(const DataSet &pts, const Key &k)
211 {
212 if (this->rev)
213 {
214 for (const Data &d : pts) clearSingleRevPts(revPtsMap[d], k);
215 }
216 }
218
219protected:
222};
223
225template <typename Key, typename KeySet, typename Data, typename DataSet>
226class MutableDiffPTData : public DiffPTData<Key, KeySet, Data, DataSet>
227{
228public:
232
234
236 explicit MutableDiffPTData(bool reversePT = true, PTDataTy ty = PTDataTy::Diff) : BaseDiffPTData(reversePT, ty), mutPTData(reversePT) { }
237
238 ~MutableDiffPTData() override = default;
239
240 virtual inline const PtsMap& getPtsMap() const
241 {
242 return mutPTData.getPtsMap();
243 }
244
245 inline void clear() override
246 {
247 mutPTData.clear();
248 }
249
250 virtual inline const DataSet& getPts(const Key& var) override
251 {
252 return mutPTData.getPts(var);
253 }
254
255 virtual inline const KeySet& getRevPts(const Data& datum) override
256 {
257 assert(this->rev && "MutableDiffPTData::getRevPts: constructed without reverse PT support!");
258 return mutPTData.getRevPts(datum);
259 }
260
261 virtual inline bool addPts(const Key &dstKey, const Data& element) override
262 {
263 return mutPTData.addPts(dstKey, element);
264 }
265
266 virtual inline bool unionPts(const Key& dstKey, const Key& srcKey) override
267 {
268 return mutPTData.unionPts(dstKey, srcKey);
269 }
270
271 virtual inline bool unionPts(const Key& dstKey, const DataSet& srcDataSet) override
272 {
273 return mutPTData.unionPts(dstKey, srcDataSet);
274 }
275
276 virtual void clearPts(const Key& var, const Data& element) override
277 {
278 mutPTData.clearPts(var, element);
279 }
280
281 virtual void clearFullPts(const Key& var) override
282 {
283 mutPTData.clearFullPts(var);
284 }
285
286 virtual void remapAllPts(void) override
287 {
288 mutPTData.remapAllPts();
289 for (typename PtsMap::value_type &ppt : diffPtsMap) ppt.second.checkAndRemap();
290 for (typename PtsMap::value_type &ppt : propaPtsMap) ppt.second.checkAndRemap();
291 }
292
293 virtual inline void dumpPTData() override
294 {
295 mutPTData.dumpPTData();
296 }
297
298 virtual inline const DataSet &getDiffPts(Key &var) override
299 {
300 return diffPtsMap[var];
301 }
302
303 virtual inline bool computeDiffPts(Key &var, const DataSet &all) override
304 {
306 DataSet& diff = diffPtsMap[var];
307 diff.clear();
309 DataSet& propa = getPropaPts(var);
310 diff.intersectWithComplement(all, propa);
311 propa = all;
312 return !diff.empty();
313 }
314
315 virtual inline void updatePropaPtsMap(Key &src, Key &dst) override
316 {
317 DataSet& srcPropa = getPropaPts(src);
318 DataSet& dstPropa = getPropaPts(dst);
320 }
321
322 virtual inline void clearPropaPts(Key &var) override
323 {
324 getPropaPts(var).clear();
325 }
326
327 virtual inline Map<DataSet, unsigned> getAllPts(bool liveOnly) const override
328 {
329 return mutPTData.getAllPts(liveOnly);
330 }
331
335 {
336 return true;
337 }
338
340 {
341 return ptd->getPTDTY() == PTDataTy::MutDiff;
342 }
344
345protected:
347 inline DataSet &getPropaPts(Key &var)
348 {
349 return propaPtsMap[var];
350 }
351
352private:
359};
360
361template <typename Key, typename KeySet, typename Data, typename DataSet>
362class MutableDFPTData : public DFPTData<Key, KeySet, Data, DataSet>
363{
364public:
369
370 typedef typename BaseDFPTData::LocID LocID;
374 typedef typename DFPtsMap::iterator DFPtsMapIter;
375 typedef typename DFPtsMap::const_iterator DFPtsMapconstIter;
376
379
380 virtual ~MutableDFPTData() { }
381
382 virtual inline const PtsMap& getPtsMap() const
383 {
384 return mutPTData.getPtsMap();
385 }
386
387 virtual inline void clear() override
388 {
389 mutPTData.clear();
390 }
391
392 virtual inline const DataSet& getPts(const Key& var) override
393 {
394 return mutPTData.getPts(var);
395 }
396
397 virtual inline const KeySet& getRevPts(const Data& datum) override
398 {
399 assert(this->rev && "MutableDFPTData::getRevPts: constructed without reverse PT support!");
400 return mutPTData.getRevPts(datum);
401 }
402
403 virtual inline bool hasDFInSet(LocID loc) const override
404 {
405 return (dfInPtsMap.find(loc) != dfInPtsMap.end());
406 }
407
408 virtual inline bool hasDFOutSet(LocID loc) const override
409 {
410 return (dfOutPtsMap.find(loc) != dfOutPtsMap.end());
411 }
412
413 virtual inline bool hasDFInSet(LocID loc,const Key& var) const override
414 {
416 if ( it == dfInPtsMap.end())
417 return false;
418 const PtsMap& ptsMap = it->second;
419 return (ptsMap.find(var) != ptsMap.end());
420 }
421
422 virtual inline bool hasDFOutSet(LocID loc, const Key& var) const override
423 {
425 if ( it == dfOutPtsMap.end())
426 return false;
427 const PtsMap& ptsMap = it->second;
428 return (ptsMap.find(var) != ptsMap.end());
429 }
430
431 virtual inline DataSet& getDFInPtsSet(LocID loc, const Key& var) override
432 {
434 return inSet[var];
435 }
436
437 virtual inline DataSet& getDFOutPtsSet(LocID loc, const Key& var) override
438 {
440 return outSet[var];
441 }
442
446 {
447 return dfInPtsMap[loc];
448 }
450 {
451 return dfOutPtsMap[loc];
452 }
453 inline const DFPtsMap& getDFIn()
454 {
455 return dfInPtsMap;
456 }
457 inline const DFPtsMap& getDFOut()
458 {
459 return dfOutPtsMap;
460 }
462
463 virtual inline bool updateDFInFromIn(LocID srcLoc, const Key& srcVar, LocID dstLoc, const Key& dstVar) override
464 {
465 return this->unionPts(getDFInPtsSet(dstLoc,dstVar), getDFInPtsSet(srcLoc,srcVar));
466 }
467
468 virtual inline bool updateDFInFromOut(LocID srcLoc, const Key& srcVar, LocID dstLoc, const Key& dstVar) override
469 {
471 }
472
473 virtual inline bool updateDFOutFromIn(LocID srcLoc, const Key& srcVar, LocID dstLoc, const Key& dstVar) override
474 {
476 }
477
478 virtual inline bool updateAllDFInFromOut(LocID srcLoc, const Key& srcVar, LocID dstLoc, const Key& dstVar) override
479 {
480 return this->updateDFInFromOut(srcLoc,srcVar,dstLoc,dstVar);
481 }
482
483 virtual inline bool updateAllDFInFromIn(LocID srcLoc, const Key& srcVar, LocID dstLoc, const Key& dstVar) override
484 {
485 return this->updateDFInFromIn(srcLoc,srcVar,dstLoc,dstVar);
486 }
487
488 virtual inline bool updateAllDFOutFromIn(LocID loc, const Key& singleton, bool strongUpdates) override
489 {
490 bool changed = false;
491 if (this->hasDFInSet(loc))
492 {
494 const PtsMap & ptsMap = getDFInPtsMap(loc);
495 for (typename PtsMap::const_iterator ptsIt = ptsMap.begin(), ptsEit = ptsMap.end(); ptsIt != ptsEit; ++ptsIt)
496 {
497 const Key var = ptsIt->first;
499 if (strongUpdates && var == singleton)
500 continue;
502 changed = true;
503 }
504 }
505 return changed;
506 }
507
508 virtual inline bool updateTLVPts(LocID srcLoc, const Key& srcVar, const Key& dstVar) override
509 {
510 return this->unionPts(dstVar, this->getDFInPtsSet(srcLoc,srcVar));
511 }
512
513 virtual inline bool updateATVPts(const Key& srcVar, LocID dstLoc, const Key& dstVar) override
514 {
515 return (this->unionPts(this->getDFOutPtsSet(dstLoc, dstVar), this->getPts(srcVar)));
516 }
517
518 virtual inline void clearAllDFOutUpdatedVar(LocID) override
519 {
520 }
521
525 virtual inline bool addPts(const Key &dstKey, const Key& srcKey) override
526 {
527 return addPts(mutPTData.ptsMap[dstKey], srcKey);
528 }
529 virtual inline bool unionPts(const Key& dstKey, const Key& srcKey) override
530 {
531 return unionPts(mutPTData.ptsMap[dstKey], getPts(srcKey));
532 }
533 virtual inline bool unionPts(const Key& dstKey, const DataSet& srcDataSet) override
534 {
535 return unionPts(mutPTData.ptsMap[dstKey], srcDataSet);
536 }
537 virtual void clearPts(const Key& var, const Data& element) override
538 {
539 mutPTData.clearPts(var, element);
540 }
541 virtual void clearFullPts(const Key& var) override
542 {
543 mutPTData.clearFullPts(var);
544 }
545 virtual void remapAllPts(void) override
546 {
547 mutPTData.remapAllPts();
548 for (typename DFPtsMap::value_type &lopt : dfInPtsMap)
549 {
550 for (typename PtsMap::value_type &opt : lopt.second) opt.second.checkAndRemap();
551 }
552
553 for (typename DFPtsMap::value_type &lopt : dfOutPtsMap)
554 {
555 for (typename PtsMap::value_type &opt : lopt.second) opt.second.checkAndRemap();
556 }
557 }
559
560 virtual inline Map<DataSet, unsigned> getAllPts(bool liveOnly) const override
561 {
563 for (typename DFPtsMap::value_type lptsmap : dfInPtsMap)
564 {
565 for (typename PtsMap::value_type vpt : lptsmap.second)
566 {
567 ++allPts[vpt.second];
568 }
569 }
570
571 for (typename DFPtsMap::value_type lptm : dfOutPtsMap)
572 {
573 for (typename PtsMap::value_type vpt : lptm.second)
574 {
575 ++allPts[vpt.second];
576 }
577 }
578
579 return allPts;
580 }
581
585 {
586 return true;
587 }
589 {
590 return ptd->getPTDTY() == BaseDFPTData::MutDataFlow
591 || ptd->getPTDTY() == BaseDFPTData::MutIncDataFlow;
592 }
594
595protected:
598 inline bool unionPts(DataSet& dstDataSet, const DataSet& srcDataSet)
599 {
600 return dstDataSet |= srcDataSet;
601 }
602 inline bool addPts(DataSet &d, const Data& e)
603 {
604 return d.test_and_set(e);
605 }
607
608public:
611 virtual inline void dumpPTData() override
612 {
614 mutPTData.dumpPTData();
616 std::error_code ErrInfo;
617 std::fstream f("svfg_pts.data", std::ios_base::out);
618 if (f.good())
619 {
620 NodeBS locs;
621 for(DFPtsMapconstIter it = dfInPtsMap.begin(), eit = dfInPtsMap.end(); it!=eit; ++it)
622 locs.set(it->first);
623
624 for(DFPtsMapconstIter it = dfOutPtsMap.begin(), eit = dfOutPtsMap.end(); it!=eit; ++it)
625 locs.set(it->first);
626
627 for (NodeBS::iterator it = locs.begin(), eit = locs.end(); it != eit; it++)
628 {
629 LocID loc = *it;
630 if (this->hasDFInSet(loc))
631 {
632 f << "Loc:" << loc << " IN:{";
633 this->dumpPts(this->getDFInPtsMap(loc), f);
634 f << "}\n";
635 }
636
637 if (this->hasDFOutSet(loc))
638 {
639 f << "Loc:" << loc << " OUT:{";
640 this->dumpPts(this->getDFOutPtsMap(loc), f);
641 f << "}\n";
642 }
643 }
644 f.close();
645 if (f.good())
646 {
647 SVFUtil::outs() << "\n";
648 return;
649 }
650 }
651 SVFUtil::outs() << " error opening file for writing!\n";
652 }
653
654 virtual inline void dumpPts(const PtsMap & ptsSet,OutStream & O = SVFUtil::outs()) const
655 {
656 for (PtsMapConstIter nodeIt = ptsSet.begin(); nodeIt != ptsSet.end(); nodeIt++)
657 {
658 const Key& var = nodeIt->first;
659 const DataSet & pts = nodeIt->second;
660 if (pts.empty())
661 continue;
662 O << "<" << var << ",{";
664 O << "}> ";
665 }
666 }
668
669protected:
677};
678
680template <typename Key, typename KeySet, typename Data, typename DataSet>
681class MutableIncDFPTData : public MutableDFPTData<Key, KeySet, Data, DataSet>
682{
683public:
689
690 typedef typename BaseDFPTData::LocID LocID;
692 typedef typename UpdatedVarMap::iterator UpdatedVarMapIter;
693 typedef typename UpdatedVarMap::const_iterator UpdatedVarconstIter;
694 typedef typename DataSet::iterator DataIter;
695
696private:
699
700public:
703
705
706 virtual inline bool updateDFInFromIn(LocID srcLoc, const Key& srcVar, LocID dstLoc, const Key& dstVar) override
707 {
709 this->unionPts(this->getDFInPtsSet(dstLoc,dstVar), this->getDFInPtsSet(srcLoc,srcVar)))
710 {
712 return true;
713 }
714 return false;
715 }
716
717 virtual inline bool updateDFInFromOut(LocID srcLoc, const Key& srcVar, LocID dstLoc, const Key& dstVar) override
718 {
720 this->unionPts(this->getDFInPtsSet(dstLoc,dstVar), this->getDFOutPtsSet(srcLoc,srcVar)))
721 {
723 return true;
724 }
725 return false;
726 }
727
728 virtual inline bool updateDFOutFromIn(LocID srcLoc, const Key& srcVar, LocID dstLoc, const Key& dstVar) override
729 {
731 {
733 if (this->unionPts(this->getDFOutPtsSet(dstLoc,dstVar), this->getDFInPtsSet(srcLoc,srcVar)))
734 {
736 return true;
737 }
738 }
739 return false;
740 }
741
742 virtual inline bool updateAllDFInFromOut(LocID srcLoc, const Key& srcVar, LocID dstLoc, const Key& dstVar) override
743 {
744 if(this->unionPts(this->getDFInPtsSet(dstLoc,dstVar), this->getDFOutPtsSet(srcLoc,srcVar)))
745 {
747 return true;
748 }
749 return false;
750 }
751
752 virtual inline bool updateAllDFInFromIn(LocID srcLoc, const Key& srcVar, LocID dstLoc, const Key& dstVar) override
753 {
754 if(this->unionPts(this->getDFInPtsSet(dstLoc,dstVar), this->getDFInPtsSet(srcLoc,srcVar)))
755 {
757 return true;
758 }
759 return false;
760 }
761
762 virtual inline bool updateAllDFOutFromIn(LocID loc, const Key& singleton, bool strongUpdates) override
763 {
764 bool changed = false;
765 if (this->hasDFInSet(loc))
766 {
768 DataSet pts = getDFInUpdatedVar(loc);
769 for (DataIter ptsIt = pts.begin(), ptsEit = pts.end(); ptsIt != ptsEit; ++ptsIt)
770 {
771 const Key var = *ptsIt;
773 if (strongUpdates && var == singleton)
774 continue;
776 changed = true;
777 }
778 }
779 return changed;
780 }
781
782 virtual inline bool updateTLVPts(LocID srcLoc, const Key& srcVar, const Key& dstVar) override
783 {
785 {
787 return this->mutPTData.unionPts(dstVar, this->getDFInPtsSet(srcLoc,srcVar));
788 }
789 return false;
790 }
791
792 virtual inline bool updateATVPts(const Key& srcVar, LocID dstLoc, const Key& dstVar) override
793 {
794 if (this->unionPts(this->getDFOutPtsSet(dstLoc, dstVar), this->mutPTData.getPts(srcVar)))
795 {
797 return true;
798 }
799 return false;
800 }
801
802 virtual inline void clearAllDFOutUpdatedVar(LocID loc) override
803 {
804 if (this->hasDFOutSet(loc))
805 {
806 DataSet pts = getDFOutUpdatedVar(loc);
807 for (DataIter ptsIt = pts.begin(), ptsEit = pts.end(); ptsIt != ptsEit; ++ptsIt)
808 {
809 const Key var = *ptsIt;
811 }
812 }
813 }
814
818 {
819 return true;
820 }
821
823 {
824 return ptd->getPTDTY() == BasePTData::MutIncDataFlow;
825 }
827private:
829
830
832 {
833 inUpdatedVarMap[loc].set(var);
834 }
837 {
839 if (it != inUpdatedVarMap.end())
840 it->second.reset(var);
841 }
843 inline bool varHasNewDFInPts(LocID loc,const Key& var)
844 {
846 if (it != inUpdatedVarMap.end())
847 return it->second.test(var);
848 return false;
849 }
851 inline const DataSet& getDFInUpdatedVar(LocID loc)
852 {
853 return inUpdatedVarMap[loc];
854 }
856
858
859
861 {
863 }
866 {
868 if (it != outUpdatedVarMap.end())
869 it->second.reset(var);
870 }
872 inline bool varHasNewDFOutPts(LocID loc,const Key& var)
873 {
875 if (it != outUpdatedVarMap.end())
876 return it->second.test(var);
877 return false;
878 }
880 inline const DataSet& getDFOutUpdatedVar(LocID loc)
881 {
882 return outUpdatedVarMap[loc];
883 }
885};
886
890template <typename Key, typename KeySet, typename Data, typename DataSet, typename VersionedKey, typename VersionedKeySet>
891class MutableVersionedPTData : public VersionedPTData<Key, KeySet, Data, DataSet, VersionedKey, VersionedKeySet>
892{
893public:
897
900
902
903 virtual inline void clear() override
904 {
905 tlPTData.clear();
906 atPTData.clear();
907 }
908
909 virtual const DataSet& getPts(const Key& vk) override
910 {
911 return tlPTData.getPts(vk);
912 }
913 virtual const DataSet& getPts(const VersionedKey& vk) override
914 {
915 return atPTData.getPts(vk);
916 }
917
918 virtual const KeySet& getRevPts(const Data& datum) override
919 {
920 assert(this->rev && "MutableVersionedPTData::getRevPts: constructed without reverse PT support!");
921 return tlPTData.getRevPts(datum);
922 }
923 virtual const VersionedKeySet& getVersionedKeyRevPts(const Data& datum) override
924 {
925 assert(this->rev && "MutableVersionedPTData::getVersionedKeyRevPts: constructed without reverse PT support!");
926 return atPTData.getRevPts(datum);
927 }
928
929 virtual bool addPts(const Key& k, const Data& element) override
930 {
931 return tlPTData.addPts(k, element);
932 }
933 virtual bool addPts(const VersionedKey& vk, const Data& element) override
934 {
935 return atPTData.addPts(vk, element);
936 }
937
938 virtual bool unionPts(const Key& dstVar, const Key& srcVar) override
939 {
940 return tlPTData.unionPts(dstVar, srcVar);
941 }
942 virtual bool unionPts(const VersionedKey& dstVar, const VersionedKey& srcVar) override
943 {
945 }
946 virtual bool unionPts(const VersionedKey& dstVar, const Key& srcVar) override
947 {
948 return atPTData.unionPts(dstVar, tlPTData.getPts(srcVar));
949 }
950 virtual bool unionPts(const Key& dstVar, const VersionedKey& srcVar) override
951 {
952 return tlPTData.unionPts(dstVar, atPTData.getPts(srcVar));
953 }
954 virtual bool unionPts(const Key& dstVar, const DataSet& srcDataSet) override
955 {
956 return tlPTData.unionPts(dstVar, srcDataSet);
957 }
958 virtual bool unionPts(const VersionedKey& dstVar, const DataSet& srcDataSet) override
959 {
961 }
962
963 virtual void clearPts(const Key& k, const Data& element) override
964 {
965 tlPTData.clearPts(k, element);
966 }
967 virtual void clearPts(const VersionedKey& vk, const Data& element) override
968 {
970 }
971
972 virtual void clearFullPts(const Key& k) override
973 {
974 tlPTData.clearFullPts(k);
975 }
976 virtual void clearFullPts(const VersionedKey& vk) override
977 {
979 }
980
981 virtual void remapAllPts(void) override
982 {
983 tlPTData.remapAllPts();
985 }
986
987 virtual inline Map<DataSet, unsigned> getAllPts(bool liveOnly) const override
988 {
990 SVFUtil::mergePtsOccMaps<DataSet>(allPts, atPTData.getAllPts(liveOnly));
991 return allPts;
992 }
993
994 virtual inline void dumpPTData() override
995 {
996 SVFUtil::outs() << "== Top-level points-to information\n";
997 tlPTData.dumpPTData();
998 SVFUtil::outs() << "== Address-taken points-to information\n";
1000 }
1001
1005 {
1006 return true;
1007 }
1008
1010 {
1011 return ptd->getPTDTY() == PTDataTy::MutVersioned;
1012 }
1014
1015private:
1020};
1021
1022} // End namespace SVF
1023
1024#endif // MUTABLE_POINTSTO_H_
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 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)
DFPtsMap dfInPtsMap
Data-flow IN set.
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< Key, KeySet, Data, DataSet > mutPTData
MutablePTData< Key, KeySet, Data, DataSet > BaseMutPTData
virtual void remapAllPts(void) override
Remaps all points-to sets to use the current mapping.
DFPtsMap dfOutPtsMap
Data-flow OUT set.
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
DiffPTData implemented with points-to sets which are updated continuously.
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< Key, KeySet, Data, DataSet > mutPTData
Backing to implement the basic PTData methods. This allows us to avoid multiple-inheritance.
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
PtsMap diffPtsMap
Diff points-to to be propagated.
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
PtsMap propaPtsMap
Points-to already propagated.
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)
Incremental version of the mutable data-flow points-to data structure.
PTData< Key, KeySet, Data, DataSet > BasePTData
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.
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.
bool varHasNewDFInPts(LocID loc, const Key &var)
Return TRUE if var has new pts in loc's IN set.
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< Key, KeySet, Data, DataSet > tlPTData
PTData for Keys (top-level pointers, generally).
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< VersionedKey, VersionedKeySet, Data, DataSet > atPTData
PTData for VersionedKeys (address-taken objects, generally).
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 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
bool rev
Whether we maintain reverse points-to sets or not.
PTDataTy
Types of a points-to data structures.
void set(unsigned Idx)
std::ostream & outs()
Overwrite llvm::outs()
Definition SVFUtil.h:52
void dumpSet(NodeBS To, OutStream &O=SVFUtil::outs())
Dump sparse bitvector set.
Definition SVFUtil.cpp:153
void removeKey(const Key &key, KeySet &keySet)
Removes an element from a Set/CondSet (or anything implementing ::erase).
Definition SVFUtil.h:245
void insertKey(const Key &key, KeySet &keySet)
Inserts an element into a Set/CondSet (with ::insert).
Definition SVFUtil.h:232
for isBitcode
Definition BasicTypes.h:70
std::ostream OutStream
Definition GeneralType.h:66
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:76