SVF
FlowSensitiveTBHC.h
Go to the documentation of this file.
1 //===- FlowSensitiveTBHC.h -- flow-sensitive type filter ----------------//
2 
3 /*
4  * FlowSensitiveTBHC.h
5  *
6  * Created on: Oct 08, 2019
7  * Author: Mohamad Barbar
8  */
9 
10 #ifndef FLOWSENSITIVETYPEFILTER_H_
11 #define FLOWSENSITIVETYPEFILTER_H_
12 
13 #include "SVF-FE/DCHG.h"
14 #include "Graphs/SVFGOPT.h"
15 #include "MSSA/SVFGBuilder.h"
17 #include "WPA/FlowSensitive.h"
18 
19 namespace SVF
20 {
21 
22 class SVFModule;
23 
28 {
29 public:
32  static const MDNode *getRawCTirMetadata(const SVFGNode *);
33 
35  FlowSensitiveTBHC(PAG* _pag, PTATY type = FSTBHC_WPA);
36 
38  virtual ~FlowSensitiveTBHC() { };
39 
41  virtual void analyze() override;
43  virtual void initialize() override;
45  virtual void finalize() override;
46 
48  virtual const std::string PTAName() const override
49  {
50  return "FSTBHC";
51  }
52 
54  static inline bool classof(const FlowSensitiveTBHC *)
55  {
56  return true;
57  }
58 
60  static inline bool classof(const PointerAnalysis *pta)
61  {
62  return pta->getAnalysisTy() == FSTBHC_WPA;
63  }
64 
65  virtual bool propAlongIndirectEdge(const IndirectSVFGEdge* edge) override;
66  virtual bool propAlongDirectEdge(const DirectSVFGEdge* edge) override;
67 
68  virtual bool processAddr(const AddrSVFGNode* addr) override;
69  virtual bool processGep(const GepSVFGNode* gep) override;
70  virtual bool processLoad(const LoadSVFGNode* load) override;
71  virtual bool processStore(const StoreSVFGNode* store) override;
72  virtual bool processPhi(const PHISVFGNode* phi) override;
73  virtual bool processCopy(const CopySVFGNode* copy) override;
74 
75  virtual inline const NodeBS& getAllFieldsObjNode(NodeID id) override;
76 
77  virtual inline bool updateInFromIn(const SVFGNode* srcStmt, NodeID srcVar, const SVFGNode* dstStmt, NodeID dstVar) override;
78  virtual inline bool updateInFromOut(const SVFGNode* srcStmt, NodeID srcVar, const SVFGNode* dstStmt, NodeID dstVar) override;
79 
80  virtual inline bool unionPtsFromIn(const SVFGNode* stmt, NodeID srcVar, NodeID dstVar) override;
81  virtual inline bool unionPtsFromTop(const SVFGNode* stmt, NodeID srcVar, NodeID dstVar) override;
82 
83  virtual inline bool propDFOutToIn(const SVFGNode* srcStmt, NodeID srcVar, const SVFGNode* dstStmt, NodeID dstVar) override;
84  virtual inline bool propDFInToIn(const SVFGNode* srcStmt, NodeID srcVar, const SVFGNode* dstStmt, NodeID dstVar) override;
85 
86  virtual void expandFIObjs(const PointsTo& pts, PointsTo& expandedPts) override;
87 
91  const DIType *getTypeFromCTirMetadata(const SVFGNode *);
92 
93 protected:
94  virtual void backPropagate(NodeID clone) override;
95 
96  virtual void countAliases(Set<std::pair<NodeID, NodeID>> cmp, unsigned *mayAliases, unsigned *noAliases) override;
97 
98 private:
101  void determineWhichGepsAreLoads(void);
102 
105  bool gepIsLoad(NodeID gep);
106 
111  bool allReuse;
112 
117 };
118 
119 } // End namespace SVF
120 
121 #endif /* FLOWSENSITIVETYPEFILTER_H_ */
virtual void finalize() override
Finalize analysis.
static bool classof(const PointerAnalysis *pta)
For LLVM RTTI.
virtual bool processPhi(const PHISVFGNode *phi) override
u32_t NodeID
Definition: SVFBasicTypes.h:80
virtual const NodeBS & getAllFieldsObjNode(NodeID id) override
bool storeReuse
Whether to allow for reuse at stores.
virtual bool processCopy(const CopySVFGNode *copy) override
virtual void initialize() override
Initialize analysis.
Sparse flow-sensitive type-based heap cloning WPA.
Definition: PAG.h:47
PTATY getAnalysisTy() const
Type of pointer analysis.
std::unordered_map< Key, Value, Hash, KeyEqual, Allocator > Map
Definition: SVFBasicTypes.h:98
virtual bool propAlongDirectEdge(const DirectSVFGEdge *edge) override
Propagate points-to information along a DIRECT SVFG edge.
virtual ~FlowSensitiveTBHC()
Destructor.
virtual void expandFIObjs(const PointsTo &pts, PointsTo &expandedPts) override
Expand FI objects.
virtual void backPropagate(NodeID clone) override
BVDataPTAImpl * pta
PTA extending this class.
NodeBS loadGeps
Maps whether a (SVFG) GEP node is a load or not.
virtual bool processLoad(const LoadSVFGNode *load) override
virtual bool processStore(const StoreSVFGNode *store) override
virtual bool propAlongIndirectEdge(const IndirectSVFGEdge *edge) override
Propagate points-to information along an INDIRECT SVFG edge.
std::unordered_set< Key, Hash, KeyEqual, Allocator > Set
Definition: SVFBasicTypes.h:93
virtual void countAliases(Set< std::pair< NodeID, NodeID >> cmp, unsigned *mayAliases, unsigned *noAliases) override
Fills may/noAliases for the location/pointer pairs in cmp.
virtual bool processGep(const GepSVFGNode *gep) override
virtual void analyze() override
Flow sensitive analysis with FSTBHC.
const DIType * getTypeFromCTirMetadata(const SVFGNode *)
virtual bool unionPtsFromIn(const SVFGNode *stmt, NodeID srcVar, NodeID dstVar) override
virtual bool processAddr(const AddrSVFGNode *addr) override
virtual bool propDFOutToIn(const SVFGNode *srcStmt, NodeID srcVar, const SVFGNode *dstStmt, NodeID dstVar) override
virtual bool unionPtsFromTop(const SVFGNode *stmt, NodeID srcVar, NodeID dstVar) override
llvm::MDNode MDNode
Definition: BasicTypes.h:138
virtual bool propDFInToIn(const SVFGNode *srcStmt, NodeID srcVar, const SVFGNode *dstStmt, NodeID dstVar) override
for isBitcode
Definition: ContextDDA.h:15
static const MDNode * getRawCTirMetadata(const SVFGNode *)
llvm::SparseBitVector NodeBS
Definition: SVFBasicTypes.h:87
FlowSensitiveTBHC(PAG *_pag, PTATY type=FSTBHC_WPA)
Constructor.
Map< NodeID, NodeBS > gepToSVFGRetrievers
Maps GEP objects to the SVFG nodes that retrieved them with getGepObjClones.
virtual const std::string PTAName() const override
Get PTA name.
virtual bool updateInFromOut(const SVFGNode *srcStmt, NodeID srcVar, const SVFGNode *dstStmt, NodeID dstVar) override
PTATY
Pointer analysis type list.
static bool classof(const FlowSensitiveTBHC *)
For LLVM RTTI.
NodeBS PointsTo
Definition: SVFBasicTypes.h:88
virtual bool updateInFromIn(const SVFGNode *srcStmt, NodeID srcVar, const SVFGNode *dstStmt, NodeID dstVar) override
llvm::DIType DIType
Definition: BasicTypes.h:217