SVF
AndersenSFR.h
Go to the documentation of this file.
1 //===- AndersenSFR.h -- SFR based field-sensitive Andersen's analysis-------------//
2 //
3 // SVF: Static Value-Flow Analysis
4 //
5 // Copyright (C) <2013-2017> <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 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 General Public License for more details.
17 
18 // You should have received a copy of the GNU General Public License
19 // along with this program. If not, see <http://www.gnu.org/licenses/>.
20 //
21 //===----------------------------------------------------------------------===//
22 
23 /*
24  * AndersenSFR.h
25  *
26  * Created on: 09, Feb, 2019
27  * Author: Yuxiang Lei
28  */
29 
30 #ifndef PROJECT_ANDERSENSFR_H
31 #define PROJECT_ANDERSENSFR_H
32 
33 
34 #include "WPA/Andersen.h"
35 #include "WPA/CSC.h"
36 
37 namespace SVF
38 {
39 
43 class AndersenSCD : public Andersen
44 {
45 public:
47 
48 protected:
51  NodeToNodeMap pwcReps;
52 
53 public:
55  Andersen(_pag,type)
56  {
57  }
58 
61  {
62  if (scdAndersen == nullptr)
63  {
64  new AndersenSCD(_pag);
65  scdAndersen->analyze();
66  return scdAndersen;
67  }
68  return scdAndersen;
69  }
70 
71  static void releaseAndersenSCD()
72  {
73  if (scdAndersen)
74  delete scdAndersen;
75  scdAndersen = nullptr;
76  }
77 
78 protected:
79  inline void addSccCandidate(NodeID nodeId)
80  {
81  sccCandidates.insert(sccRepNode(nodeId));
82  }
83 
84  virtual NodeStack& SCCDetect();
85  virtual void PWCDetect();
86  virtual void solveWorklist();
87  virtual void handleLoadStore(ConstraintNode* node);
88  virtual void processAddr(const AddrCGEdge* addr);
89  virtual bool addCopyEdge(NodeID src, NodeID dst);
90  virtual bool updateCallGraph(const CallSiteToFunPtrMap& callsites);
91  virtual void processPWC(ConstraintNode* rep);
92  virtual void handleCopyGep(ConstraintNode* node);
93 
94 };
95 
96 
97 
101 class AndersenSFR : public AndersenSCD
102 {
103 public:
107 
108 private:
110 
113  FieldReps fieldReps;
114 
115 public:
117  AndersenSCD(_pag, type), csc(nullptr)
118  {
119  }
120 
123  {
124  if (sfrAndersen == nullptr)
125  {
126  new AndersenSFR(_pag);
127  sfrAndersen->analyze();
128  return sfrAndersen;
129  }
130  return sfrAndersen;
131  }
132 
133  static void releaseAndersenSFR()
134  {
135  if (sfrAndersen)
136  delete sfrAndersen;
137  }
138 
140  {
141  if (csc != nullptr)
142  {
143  delete(csc);
144  csc = nullptr;
145  }
146  }
147 
148 protected:
149  void initialize();
150  void PWCDetect();
151  void fieldExpand(NodeSet& initials, Size_t offset, NodeBS& strides, PointsTo& expandPts);
152  bool processGepPts(PointsTo& pts, const GepCGEdge* edge);
153  bool mergeSrcToTgt(NodeID nodeId, NodeID newRepId);
154 
155 };
156 
157 } // End namespace SVF
158 
159 #endif //PROJECT_ANDERSENSFR_H
Map< NodeID, NodeSet > FieldReps
Definition: AndersenSFR.h:105
Set< NodeID > NodeSet
u32_t NodeID
Definition: SVFBasicTypes.h:80
std::stack< NodeID > NodeStack
static AndersenSFR * sfrAndersen
Definition: AndersenSFR.h:109
static AndersenSCD * createAndersenSCD(PAG *_pag)
Create an singleton instance directly instead of invoking llvm pass manager.
Definition: AndersenSFR.h:60
virtual NodeStack & SCCDetect()
Definition: AndersenSCD.cpp:94
Definition: PAG.h:47
Map< NodeID, pair< NodeID, NodeSet > > SFRTrait
Definition: AndersenSFR.h:106
virtual void analyze() override
Andersen analysis.
Definition: Andersen.cpp:92
std::unordered_map< Key, Value, Hash, KeyEqual, Allocator > Map
Definition: SVFBasicTypes.h:98
static void releaseAndersenSFR()
Definition: AndersenSFR.h:133
FieldReps fieldReps
Definition: AndersenSFR.h:113
virtual void handleCopyGep(ConstraintNode *node)
virtual bool updateCallGraph(const CallSiteToFunPtrMap &callsites)
virtual void handleLoadStore(ConstraintNode *node)
NodeSet sfrObjNodes
Definition: AndersenSFR.h:112
NodeToNodeMap pwcReps
Definition: AndersenSFR.h:51
signed long Size_t
Definition: SVFBasicTypes.h:78
virtual void initialize()
Initialize analysis.
Definition: Andersen.cpp:167
Map< NodeID, NodeID > NodeToNodeMap
Definition: AndersenSFR.h:46
virtual void solveWorklist()
Definition: AndersenSCD.cpp:41
static AndersenSFR * createAndersenSFR(PAG *_pag)
Create an singleton instance directly instead of invoking llvm pass manager.
Definition: AndersenSFR.h:122
AndersenSCD(PAG *_pag, PTATY type=AndersenSCD_WPA)
Definition: AndersenSFR.h:54
virtual void PWCDetect()
PAG::CallSiteToFunPtrMap CallSiteToFunPtrMap
static void releaseAndersenSCD()
Definition: AndersenSFR.h:71
Stride-based field representation.
static AndersenSCD * scdAndersen
Definition: AndersenSFR.h:49
virtual bool processGepPts(const PointsTo &pts, const GepCGEdge *edge)
Definition: Andersen.cpp:358
for isBitcode
Definition: ContextDDA.h:15
void addSccCandidate(NodeID nodeId)
Definition: AndersenSFR.h:79
virtual void processPWC(ConstraintNode *rep)
llvm::SparseBitVector NodeBS
Definition: SVFBasicTypes.h:87
AndersenSFR(PAG *_pag, PTATY type=AndersenSFR_WPA)
Definition: AndersenSFR.h:116
virtual bool mergeSrcToTgt(NodeID srcId, NodeID tgtId)
Definition: Andersen.cpp:747
Map< NodeID, NodeBS > NodeStrides
Definition: AndersenSFR.h:104
PTATY
Pointer analysis type list.
Selective cycle detection andersen-style WPA.
virtual void processAddr(const AddrCGEdge *addr)
NodeBS PointsTo
Definition: SVFBasicTypes.h:88
NodeID sccRepNode(NodeID id) const
SCC methods.
Definition: Andersen.h:211
virtual bool addCopyEdge(NodeID src, NodeID dst)
NodeSet sccCandidates
Definition: AndersenSFR.h:50
Definition: CSC.h:49