svf-lib 1.0.1133 → 1.0.1136
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SVF-linux/Release-build/lib/libSvf.a +0 -0
- package/SVF-linux/include/MemoryModel/PointerAnalysis.h +0 -4
- package/SVF-linux/include/WPA/Andersen.h +0 -220
- package/SVF-osx/Release-build/lib/libSvf.a +0 -0
- package/SVF-osx/include/MemoryModel/PointerAnalysis.h +0 -4
- package/SVF-osx/include/WPA/Andersen.h +0 -220
- package/package.json +1 -1
|
Binary file
|
|
@@ -64,13 +64,9 @@ public:
|
|
|
64
64
|
// Whole program analysis
|
|
65
65
|
Andersen_BASE, ///< Base Andersen PTA
|
|
66
66
|
Andersen_WPA, ///< Andersen PTA
|
|
67
|
-
AndersenLCD_WPA, ///< Lazy cycle detection andersen-style WPA
|
|
68
|
-
AndersenHCD_WPA, ///< Hybird cycle detection andersen-style WPA
|
|
69
|
-
AndersenHLCD_WPA, ///< Hybird lazy cycle detection andersen-style WPA
|
|
70
67
|
AndersenSCD_WPA, ///< Selective cycle detection andersen-style WPA
|
|
71
68
|
AndersenSFR_WPA, ///< Stride-based field representation
|
|
72
69
|
AndersenWaveDiff_WPA, ///< Diff wave propagation andersen-style WPA
|
|
73
|
-
AndersenWaveDiffWithType_WPA, ///< Diff wave propagation with type info andersen-style WPA
|
|
74
70
|
Steensgaard_WPA, ///< Steensgaard PTA
|
|
75
71
|
CSCallString_WPA, ///< Call string based context sensitive WPA
|
|
76
72
|
CSSummary_WPA, ///< Summary based context sensitive WPA
|
|
@@ -35,7 +35,6 @@
|
|
|
35
35
|
#include "WPA/WPASolver.h"
|
|
36
36
|
#include "MemoryModel/SVFIR.h"
|
|
37
37
|
#include "Graphs/ConsG.h"
|
|
38
|
-
#include "Graphs/OfflineConsG.h"
|
|
39
38
|
|
|
40
39
|
namespace SVF
|
|
41
40
|
{
|
|
@@ -86,11 +85,7 @@ public:
|
|
|
86
85
|
{
|
|
87
86
|
return ( pta->getAnalysisTy() == Andersen_BASE
|
|
88
87
|
|| pta->getAnalysisTy() == Andersen_WPA
|
|
89
|
-
|| pta->getAnalysisTy() == AndersenLCD_WPA
|
|
90
|
-
|| pta->getAnalysisTy() == AndersenHCD_WPA
|
|
91
|
-
|| pta->getAnalysisTy() == AndersenHLCD_WPA
|
|
92
88
|
|| pta->getAnalysisTy() == AndersenWaveDiff_WPA
|
|
93
|
-
|| pta->getAnalysisTy() == AndersenWaveDiffWithType_WPA
|
|
94
89
|
|| pta->getAnalysisTy() == AndersenSCD_WPA
|
|
95
90
|
|| pta->getAnalysisTy() == AndersenSFR_WPA
|
|
96
91
|
|| pta->getAnalysisTy() == TypeCPP_WPA
|
|
@@ -190,11 +185,7 @@ public:
|
|
|
190
185
|
static inline bool classof(const PointerAnalysis *pta)
|
|
191
186
|
{
|
|
192
187
|
return (pta->getAnalysisTy() == Andersen_WPA
|
|
193
|
-
|| pta->getAnalysisTy() == AndersenLCD_WPA
|
|
194
|
-
|| pta->getAnalysisTy() == AndersenHCD_WPA
|
|
195
|
-
|| pta->getAnalysisTy() == AndersenHLCD_WPA
|
|
196
188
|
|| pta->getAnalysisTy() == AndersenWaveDiff_WPA
|
|
197
|
-
|| pta->getAnalysisTy() == AndersenWaveDiffWithType_WPA
|
|
198
189
|
|| pta->getAnalysisTy() == AndersenSCD_WPA
|
|
199
190
|
|| pta->getAnalysisTy() == AndersenSFR_WPA);
|
|
200
191
|
}
|
|
@@ -454,217 +445,6 @@ protected:
|
|
|
454
445
|
virtual void mergeNodeToRep(NodeID nodeId,NodeID newRepId);
|
|
455
446
|
};
|
|
456
447
|
|
|
457
|
-
|
|
458
|
-
/*
|
|
459
|
-
* Lazy Cycle Detection Based Andersen Analysis
|
|
460
|
-
*/
|
|
461
|
-
class AndersenLCD : virtual public Andersen
|
|
462
|
-
{
|
|
463
|
-
|
|
464
|
-
private:
|
|
465
|
-
static AndersenLCD* lcdAndersen;
|
|
466
|
-
EdgeSet metEdges;
|
|
467
|
-
NodeSet lcdCandidates;
|
|
468
|
-
|
|
469
|
-
public:
|
|
470
|
-
AndersenLCD(SVFIR* _pag, PTATY type = AndersenLCD_WPA) :
|
|
471
|
-
Andersen(_pag, type), metEdges({}), lcdCandidates( {})
|
|
472
|
-
{
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
/// Create an singleton instance directly instead of invoking llvm pass manager
|
|
476
|
-
static AndersenLCD* createAndersenLCD(SVFIR* _pag)
|
|
477
|
-
{
|
|
478
|
-
if (lcdAndersen == nullptr)
|
|
479
|
-
{
|
|
480
|
-
lcdAndersen = new AndersenLCD(_pag);
|
|
481
|
-
lcdAndersen->analyze();
|
|
482
|
-
return lcdAndersen;
|
|
483
|
-
}
|
|
484
|
-
return lcdAndersen;
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
static void releaseAndersenLCD()
|
|
488
|
-
{
|
|
489
|
-
if (lcdAndersen)
|
|
490
|
-
delete lcdAndersen;
|
|
491
|
-
lcdAndersen = nullptr;
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
protected:
|
|
495
|
-
// 'lcdCandidates' is used to collect nodes need to be visited by SCC detector
|
|
496
|
-
//@{
|
|
497
|
-
inline bool hasLCDCandidate () const
|
|
498
|
-
{
|
|
499
|
-
return !lcdCandidates.empty();
|
|
500
|
-
};
|
|
501
|
-
inline void cleanLCDCandidate()
|
|
502
|
-
{
|
|
503
|
-
lcdCandidates.clear();
|
|
504
|
-
};
|
|
505
|
-
inline void addLCDCandidate(NodeID nodeId)
|
|
506
|
-
{
|
|
507
|
-
lcdCandidates.insert(nodeId);
|
|
508
|
-
};
|
|
509
|
-
//@}
|
|
510
|
-
|
|
511
|
-
// 'metEdges' is used to collect edges met by AndersenLCD, to avoid redundant visit
|
|
512
|
-
//@{
|
|
513
|
-
bool isMetEdge (ConstraintEdge* edge) const
|
|
514
|
-
{
|
|
515
|
-
EdgeSet::const_iterator it = metEdges.find(edge->getEdgeID());
|
|
516
|
-
return it != metEdges.end();
|
|
517
|
-
};
|
|
518
|
-
void addMetEdge(ConstraintEdge* edge)
|
|
519
|
-
{
|
|
520
|
-
metEdges.insert(edge->getEdgeID());
|
|
521
|
-
};
|
|
522
|
-
//@}
|
|
523
|
-
|
|
524
|
-
//AndersenLCD worklist processer
|
|
525
|
-
void solveWorklist();
|
|
526
|
-
// Solve constraints of each nodes
|
|
527
|
-
virtual void handleCopyGep(ConstraintNode* node);
|
|
528
|
-
// Collapse nodes and fields based on 'lcdCandidates'
|
|
529
|
-
void mergeSCC();
|
|
530
|
-
// AndersenLCD specified SCC detector, need to input a nodeStack 'lcdCandidate'
|
|
531
|
-
NodeStack& SCCDetect();
|
|
532
|
-
bool mergeSrcToTgt(NodeID nodeId, NodeID newRepId);
|
|
533
|
-
};
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
/*!
|
|
538
|
-
* Hybrid Cycle Detection Based Andersen Analysis
|
|
539
|
-
*/
|
|
540
|
-
class AndersenHCD : virtual public Andersen
|
|
541
|
-
{
|
|
542
|
-
|
|
543
|
-
public:
|
|
544
|
-
typedef SCCDetection<OfflineConsG*> OSCC;
|
|
545
|
-
|
|
546
|
-
private:
|
|
547
|
-
static AndersenHCD* hcdAndersen;
|
|
548
|
-
NodeSet mergedNodes;
|
|
549
|
-
OfflineConsG* oCG;
|
|
550
|
-
|
|
551
|
-
public:
|
|
552
|
-
AndersenHCD(SVFIR* _pag, PTATY type = AndersenHCD_WPA) :
|
|
553
|
-
Andersen(_pag, type), oCG(nullptr)
|
|
554
|
-
{
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
/// Create an singleton instance directly instead of invoking llvm pass manager
|
|
558
|
-
static AndersenHCD *createAndersenHCD(SVFIR* _pag)
|
|
559
|
-
{
|
|
560
|
-
if (hcdAndersen == nullptr)
|
|
561
|
-
{
|
|
562
|
-
hcdAndersen = new AndersenHCD(_pag);
|
|
563
|
-
hcdAndersen->analyze();
|
|
564
|
-
return hcdAndersen;
|
|
565
|
-
}
|
|
566
|
-
return hcdAndersen;
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
static void releaseAndersenHCD()
|
|
570
|
-
{
|
|
571
|
-
if (hcdAndersen)
|
|
572
|
-
delete hcdAndersen;
|
|
573
|
-
hcdAndersen = nullptr;
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
protected:
|
|
577
|
-
virtual void initialize();
|
|
578
|
-
|
|
579
|
-
// Get offline rep node from offline constraint graph
|
|
580
|
-
//@{
|
|
581
|
-
inline bool hasOfflineRep(NodeID nodeId) const
|
|
582
|
-
{
|
|
583
|
-
return oCG->hasOCGRep(nodeId);
|
|
584
|
-
}
|
|
585
|
-
inline NodeID getOfflineRep(NodeID nodeId)
|
|
586
|
-
{
|
|
587
|
-
return oCG->getOCGRep(nodeId);
|
|
588
|
-
}
|
|
589
|
-
//@}
|
|
590
|
-
|
|
591
|
-
// The set 'mergedNodes' is used to record the merged node, therefore avoiding re-merge nodes
|
|
592
|
-
//@{
|
|
593
|
-
inline bool isaMergedNode(NodeID node) const
|
|
594
|
-
{
|
|
595
|
-
NodeSet::const_iterator it = mergedNodes.find(node);
|
|
596
|
-
return it != mergedNodes.end();
|
|
597
|
-
};
|
|
598
|
-
inline void setMergedNode(NodeID node)
|
|
599
|
-
{
|
|
600
|
-
if (!isaMergedNode(node))
|
|
601
|
-
mergedNodes.insert(node);
|
|
602
|
-
};
|
|
603
|
-
//@}
|
|
604
|
-
|
|
605
|
-
virtual void solveWorklist();
|
|
606
|
-
virtual void mergeSCC(NodeID nodeId);
|
|
607
|
-
void mergeNodeAndPts(NodeID node, NodeID tgt);
|
|
608
|
-
|
|
609
|
-
};
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
/*!
|
|
614
|
-
* Hybrid Lazy Cycle Detection Based Andersen Analysis
|
|
615
|
-
*/
|
|
616
|
-
class AndersenHLCD : public AndersenHCD, public AndersenLCD
|
|
617
|
-
{
|
|
618
|
-
|
|
619
|
-
private:
|
|
620
|
-
static AndersenHLCD* hlcdAndersen;
|
|
621
|
-
|
|
622
|
-
public:
|
|
623
|
-
AndersenHLCD(SVFIR* _pag, PTATY type = AndersenHLCD_WPA) :
|
|
624
|
-
Andersen(_pag, type), AndersenHCD(_pag, type), AndersenLCD(_pag, type)
|
|
625
|
-
{
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
/// Create an singleton instance directly instead of invoking llvm pass manager
|
|
629
|
-
static AndersenHLCD *createAndersenHLCD(SVFIR* _pag)
|
|
630
|
-
{
|
|
631
|
-
if (hlcdAndersen == nullptr)
|
|
632
|
-
{
|
|
633
|
-
hlcdAndersen = new AndersenHLCD(_pag);
|
|
634
|
-
hlcdAndersen->analyze();
|
|
635
|
-
return hlcdAndersen;
|
|
636
|
-
}
|
|
637
|
-
return hlcdAndersen;
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
static void releaseAndersenHLCD()
|
|
641
|
-
{
|
|
642
|
-
if (hlcdAndersen)
|
|
643
|
-
delete hlcdAndersen;
|
|
644
|
-
hlcdAndersen = nullptr;
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
protected:
|
|
648
|
-
void initialize()
|
|
649
|
-
{
|
|
650
|
-
AndersenHCD::initialize();
|
|
651
|
-
}
|
|
652
|
-
void solveWorklist()
|
|
653
|
-
{
|
|
654
|
-
AndersenHCD::solveWorklist();
|
|
655
|
-
}
|
|
656
|
-
void handleCopyGep(ConstraintNode* node)
|
|
657
|
-
{
|
|
658
|
-
AndersenLCD::handleCopyGep(node);
|
|
659
|
-
}
|
|
660
|
-
void mergeSCC(NodeID nodeId);
|
|
661
|
-
bool mergeSrcToTgt(NodeID nodeId, NodeID newRepId)
|
|
662
|
-
{
|
|
663
|
-
return AndersenLCD::mergeSrcToTgt(nodeId, newRepId);
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
};
|
|
667
|
-
|
|
668
448
|
} // End namespace SVF
|
|
669
449
|
|
|
670
450
|
#endif /* ANDERSENPASS_H_ */
|
|
Binary file
|
|
@@ -64,13 +64,9 @@ public:
|
|
|
64
64
|
// Whole program analysis
|
|
65
65
|
Andersen_BASE, ///< Base Andersen PTA
|
|
66
66
|
Andersen_WPA, ///< Andersen PTA
|
|
67
|
-
AndersenLCD_WPA, ///< Lazy cycle detection andersen-style WPA
|
|
68
|
-
AndersenHCD_WPA, ///< Hybird cycle detection andersen-style WPA
|
|
69
|
-
AndersenHLCD_WPA, ///< Hybird lazy cycle detection andersen-style WPA
|
|
70
67
|
AndersenSCD_WPA, ///< Selective cycle detection andersen-style WPA
|
|
71
68
|
AndersenSFR_WPA, ///< Stride-based field representation
|
|
72
69
|
AndersenWaveDiff_WPA, ///< Diff wave propagation andersen-style WPA
|
|
73
|
-
AndersenWaveDiffWithType_WPA, ///< Diff wave propagation with type info andersen-style WPA
|
|
74
70
|
Steensgaard_WPA, ///< Steensgaard PTA
|
|
75
71
|
CSCallString_WPA, ///< Call string based context sensitive WPA
|
|
76
72
|
CSSummary_WPA, ///< Summary based context sensitive WPA
|
|
@@ -35,7 +35,6 @@
|
|
|
35
35
|
#include "WPA/WPASolver.h"
|
|
36
36
|
#include "MemoryModel/SVFIR.h"
|
|
37
37
|
#include "Graphs/ConsG.h"
|
|
38
|
-
#include "Graphs/OfflineConsG.h"
|
|
39
38
|
|
|
40
39
|
namespace SVF
|
|
41
40
|
{
|
|
@@ -86,11 +85,7 @@ public:
|
|
|
86
85
|
{
|
|
87
86
|
return ( pta->getAnalysisTy() == Andersen_BASE
|
|
88
87
|
|| pta->getAnalysisTy() == Andersen_WPA
|
|
89
|
-
|| pta->getAnalysisTy() == AndersenLCD_WPA
|
|
90
|
-
|| pta->getAnalysisTy() == AndersenHCD_WPA
|
|
91
|
-
|| pta->getAnalysisTy() == AndersenHLCD_WPA
|
|
92
88
|
|| pta->getAnalysisTy() == AndersenWaveDiff_WPA
|
|
93
|
-
|| pta->getAnalysisTy() == AndersenWaveDiffWithType_WPA
|
|
94
89
|
|| pta->getAnalysisTy() == AndersenSCD_WPA
|
|
95
90
|
|| pta->getAnalysisTy() == AndersenSFR_WPA
|
|
96
91
|
|| pta->getAnalysisTy() == TypeCPP_WPA
|
|
@@ -190,11 +185,7 @@ public:
|
|
|
190
185
|
static inline bool classof(const PointerAnalysis *pta)
|
|
191
186
|
{
|
|
192
187
|
return (pta->getAnalysisTy() == Andersen_WPA
|
|
193
|
-
|| pta->getAnalysisTy() == AndersenLCD_WPA
|
|
194
|
-
|| pta->getAnalysisTy() == AndersenHCD_WPA
|
|
195
|
-
|| pta->getAnalysisTy() == AndersenHLCD_WPA
|
|
196
188
|
|| pta->getAnalysisTy() == AndersenWaveDiff_WPA
|
|
197
|
-
|| pta->getAnalysisTy() == AndersenWaveDiffWithType_WPA
|
|
198
189
|
|| pta->getAnalysisTy() == AndersenSCD_WPA
|
|
199
190
|
|| pta->getAnalysisTy() == AndersenSFR_WPA);
|
|
200
191
|
}
|
|
@@ -454,217 +445,6 @@ protected:
|
|
|
454
445
|
virtual void mergeNodeToRep(NodeID nodeId,NodeID newRepId);
|
|
455
446
|
};
|
|
456
447
|
|
|
457
|
-
|
|
458
|
-
/*
|
|
459
|
-
* Lazy Cycle Detection Based Andersen Analysis
|
|
460
|
-
*/
|
|
461
|
-
class AndersenLCD : virtual public Andersen
|
|
462
|
-
{
|
|
463
|
-
|
|
464
|
-
private:
|
|
465
|
-
static AndersenLCD* lcdAndersen;
|
|
466
|
-
EdgeSet metEdges;
|
|
467
|
-
NodeSet lcdCandidates;
|
|
468
|
-
|
|
469
|
-
public:
|
|
470
|
-
AndersenLCD(SVFIR* _pag, PTATY type = AndersenLCD_WPA) :
|
|
471
|
-
Andersen(_pag, type), metEdges({}), lcdCandidates( {})
|
|
472
|
-
{
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
/// Create an singleton instance directly instead of invoking llvm pass manager
|
|
476
|
-
static AndersenLCD* createAndersenLCD(SVFIR* _pag)
|
|
477
|
-
{
|
|
478
|
-
if (lcdAndersen == nullptr)
|
|
479
|
-
{
|
|
480
|
-
lcdAndersen = new AndersenLCD(_pag);
|
|
481
|
-
lcdAndersen->analyze();
|
|
482
|
-
return lcdAndersen;
|
|
483
|
-
}
|
|
484
|
-
return lcdAndersen;
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
static void releaseAndersenLCD()
|
|
488
|
-
{
|
|
489
|
-
if (lcdAndersen)
|
|
490
|
-
delete lcdAndersen;
|
|
491
|
-
lcdAndersen = nullptr;
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
protected:
|
|
495
|
-
// 'lcdCandidates' is used to collect nodes need to be visited by SCC detector
|
|
496
|
-
//@{
|
|
497
|
-
inline bool hasLCDCandidate () const
|
|
498
|
-
{
|
|
499
|
-
return !lcdCandidates.empty();
|
|
500
|
-
};
|
|
501
|
-
inline void cleanLCDCandidate()
|
|
502
|
-
{
|
|
503
|
-
lcdCandidates.clear();
|
|
504
|
-
};
|
|
505
|
-
inline void addLCDCandidate(NodeID nodeId)
|
|
506
|
-
{
|
|
507
|
-
lcdCandidates.insert(nodeId);
|
|
508
|
-
};
|
|
509
|
-
//@}
|
|
510
|
-
|
|
511
|
-
// 'metEdges' is used to collect edges met by AndersenLCD, to avoid redundant visit
|
|
512
|
-
//@{
|
|
513
|
-
bool isMetEdge (ConstraintEdge* edge) const
|
|
514
|
-
{
|
|
515
|
-
EdgeSet::const_iterator it = metEdges.find(edge->getEdgeID());
|
|
516
|
-
return it != metEdges.end();
|
|
517
|
-
};
|
|
518
|
-
void addMetEdge(ConstraintEdge* edge)
|
|
519
|
-
{
|
|
520
|
-
metEdges.insert(edge->getEdgeID());
|
|
521
|
-
};
|
|
522
|
-
//@}
|
|
523
|
-
|
|
524
|
-
//AndersenLCD worklist processer
|
|
525
|
-
void solveWorklist();
|
|
526
|
-
// Solve constraints of each nodes
|
|
527
|
-
virtual void handleCopyGep(ConstraintNode* node);
|
|
528
|
-
// Collapse nodes and fields based on 'lcdCandidates'
|
|
529
|
-
void mergeSCC();
|
|
530
|
-
// AndersenLCD specified SCC detector, need to input a nodeStack 'lcdCandidate'
|
|
531
|
-
NodeStack& SCCDetect();
|
|
532
|
-
bool mergeSrcToTgt(NodeID nodeId, NodeID newRepId);
|
|
533
|
-
};
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
/*!
|
|
538
|
-
* Hybrid Cycle Detection Based Andersen Analysis
|
|
539
|
-
*/
|
|
540
|
-
class AndersenHCD : virtual public Andersen
|
|
541
|
-
{
|
|
542
|
-
|
|
543
|
-
public:
|
|
544
|
-
typedef SCCDetection<OfflineConsG*> OSCC;
|
|
545
|
-
|
|
546
|
-
private:
|
|
547
|
-
static AndersenHCD* hcdAndersen;
|
|
548
|
-
NodeSet mergedNodes;
|
|
549
|
-
OfflineConsG* oCG;
|
|
550
|
-
|
|
551
|
-
public:
|
|
552
|
-
AndersenHCD(SVFIR* _pag, PTATY type = AndersenHCD_WPA) :
|
|
553
|
-
Andersen(_pag, type), oCG(nullptr)
|
|
554
|
-
{
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
/// Create an singleton instance directly instead of invoking llvm pass manager
|
|
558
|
-
static AndersenHCD *createAndersenHCD(SVFIR* _pag)
|
|
559
|
-
{
|
|
560
|
-
if (hcdAndersen == nullptr)
|
|
561
|
-
{
|
|
562
|
-
hcdAndersen = new AndersenHCD(_pag);
|
|
563
|
-
hcdAndersen->analyze();
|
|
564
|
-
return hcdAndersen;
|
|
565
|
-
}
|
|
566
|
-
return hcdAndersen;
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
static void releaseAndersenHCD()
|
|
570
|
-
{
|
|
571
|
-
if (hcdAndersen)
|
|
572
|
-
delete hcdAndersen;
|
|
573
|
-
hcdAndersen = nullptr;
|
|
574
|
-
}
|
|
575
|
-
|
|
576
|
-
protected:
|
|
577
|
-
virtual void initialize();
|
|
578
|
-
|
|
579
|
-
// Get offline rep node from offline constraint graph
|
|
580
|
-
//@{
|
|
581
|
-
inline bool hasOfflineRep(NodeID nodeId) const
|
|
582
|
-
{
|
|
583
|
-
return oCG->hasOCGRep(nodeId);
|
|
584
|
-
}
|
|
585
|
-
inline NodeID getOfflineRep(NodeID nodeId)
|
|
586
|
-
{
|
|
587
|
-
return oCG->getOCGRep(nodeId);
|
|
588
|
-
}
|
|
589
|
-
//@}
|
|
590
|
-
|
|
591
|
-
// The set 'mergedNodes' is used to record the merged node, therefore avoiding re-merge nodes
|
|
592
|
-
//@{
|
|
593
|
-
inline bool isaMergedNode(NodeID node) const
|
|
594
|
-
{
|
|
595
|
-
NodeSet::const_iterator it = mergedNodes.find(node);
|
|
596
|
-
return it != mergedNodes.end();
|
|
597
|
-
};
|
|
598
|
-
inline void setMergedNode(NodeID node)
|
|
599
|
-
{
|
|
600
|
-
if (!isaMergedNode(node))
|
|
601
|
-
mergedNodes.insert(node);
|
|
602
|
-
};
|
|
603
|
-
//@}
|
|
604
|
-
|
|
605
|
-
virtual void solveWorklist();
|
|
606
|
-
virtual void mergeSCC(NodeID nodeId);
|
|
607
|
-
void mergeNodeAndPts(NodeID node, NodeID tgt);
|
|
608
|
-
|
|
609
|
-
};
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
/*!
|
|
614
|
-
* Hybrid Lazy Cycle Detection Based Andersen Analysis
|
|
615
|
-
*/
|
|
616
|
-
class AndersenHLCD : public AndersenHCD, public AndersenLCD
|
|
617
|
-
{
|
|
618
|
-
|
|
619
|
-
private:
|
|
620
|
-
static AndersenHLCD* hlcdAndersen;
|
|
621
|
-
|
|
622
|
-
public:
|
|
623
|
-
AndersenHLCD(SVFIR* _pag, PTATY type = AndersenHLCD_WPA) :
|
|
624
|
-
Andersen(_pag, type), AndersenHCD(_pag, type), AndersenLCD(_pag, type)
|
|
625
|
-
{
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
/// Create an singleton instance directly instead of invoking llvm pass manager
|
|
629
|
-
static AndersenHLCD *createAndersenHLCD(SVFIR* _pag)
|
|
630
|
-
{
|
|
631
|
-
if (hlcdAndersen == nullptr)
|
|
632
|
-
{
|
|
633
|
-
hlcdAndersen = new AndersenHLCD(_pag);
|
|
634
|
-
hlcdAndersen->analyze();
|
|
635
|
-
return hlcdAndersen;
|
|
636
|
-
}
|
|
637
|
-
return hlcdAndersen;
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
static void releaseAndersenHLCD()
|
|
641
|
-
{
|
|
642
|
-
if (hlcdAndersen)
|
|
643
|
-
delete hlcdAndersen;
|
|
644
|
-
hlcdAndersen = nullptr;
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
protected:
|
|
648
|
-
void initialize()
|
|
649
|
-
{
|
|
650
|
-
AndersenHCD::initialize();
|
|
651
|
-
}
|
|
652
|
-
void solveWorklist()
|
|
653
|
-
{
|
|
654
|
-
AndersenHCD::solveWorklist();
|
|
655
|
-
}
|
|
656
|
-
void handleCopyGep(ConstraintNode* node)
|
|
657
|
-
{
|
|
658
|
-
AndersenLCD::handleCopyGep(node);
|
|
659
|
-
}
|
|
660
|
-
void mergeSCC(NodeID nodeId);
|
|
661
|
-
bool mergeSrcToTgt(NodeID nodeId, NodeID newRepId)
|
|
662
|
-
{
|
|
663
|
-
return AndersenLCD::mergeSrcToTgt(nodeId, newRepId);
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
};
|
|
667
|
-
|
|
668
448
|
} // End namespace SVF
|
|
669
449
|
|
|
670
450
|
#endif /* ANDERSENPASS_H_ */
|