Static Value-Flow Analysis
Loading...
Searching...
No Matches
MTASVFGBuilder.h
Go to the documentation of this file.
1//===- MTASVFGBuilder.h -- Thread-aware SVFG builder for FSAM -----------===//
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
23/*
24 * MTASVFGBuilder.h
25 *
26 * Author: Jiawei Yang
27 */
28
29#ifndef INCLUDE_MTA_MTASVFGBUILDER_H_
30#define INCLUDE_MTA_MTASVFGBUILDER_H_
31
32#include "MSSA/SVFGBuilder.h"
33#include "Graphs/SVFG.h"
34#include "Graphs/SVFGEdge.h"
35#include "MTA/MHP.h"
36#include "MTA/LockAnalysis.h"
38#include <utility>
39#include <vector>
40
41namespace SVF
42{
43
44class SlicedSVFGView;
45
47{
48public:
51
53 {
54 Analysis,
56 };
57
66 ~MTASVFGBuilder() override = default;
67
70 typedef std::pair<const StmtSVFGNode*, const StmtSVFGNode*> ThreadVFEdge;
71
89 {
90 return threadVFQueryMap;
91 }
92
116 using ThreadVFCandidateList = std::vector<ThreadVFCandidate>;
117
119 {
120 public:
122 const SlicedSVFGView& scope,
123 const ThreadVFCandidateList* candidates = nullptr)
124 {
126 }
127
129 {
130 return ThreadVFBuildConfig(nullptr, nullptr);
131 }
132
133 private:
134 friend class MTASVFGBuilder;
140
141 const SlicedSVFGView* scope = nullptr;
147 };
148
153
156
158 {
159 return threadAwareEdges.size();
160 }
161
162protected:
164 void buildSVFG() override;
165
168 std::unique_ptr<MRGenerator> createMRGenerator(BVDataPTAImpl* pta, bool ptrOnlyMSSA) override;
169
170private:
172 const SlicedSVFGView* overlayScope = nullptr;
176
180 bool isInOverlayScope(const SVFGNode* node) const;
181
188
195
198
199 void handleStoreLoad(const StmtSVFGNode* store,
200 const StmtSVFGNode* load, PointerAnalysis* pta);
203 PointerAnalysis* pta);
204
211 bool commonLock);
212
215
217
220 bool isHeadOfSpan(const StmtSVFGNode* node);
221 bool isTailOfSpan(const StmtSVFGNode* node);
223
226
231
237};
238
239} // End namespace SVF
240
241#endif /* INCLUDE_MTA_MTASVFGBUILDER_H_ */
Definition MHP.h:52
static ThreadVFBuildConfig wholeProgram()
const ThreadVFCandidateList * candidates
static ThreadVFBuildConfig mainPhase(const SlicedSVFGView &scope, const ThreadVFCandidateList *candidates=nullptr)
ThreadVFBuildConfig(const SlicedSVFGView *scope, const ThreadVFCandidateList *candidates)
~MTASVFGBuilder() override=default
bool recordThreadVFQueries
false = skip [THREAD-VF] recording
void connectMHPEdges(PointerAnalysis *pta)
Connect inter-thread (interference) value-flow edges for MHP pairs.
Map< const StmtSVFGNode *, SVFGNodeIDSet > predecessorCache
SVFGEdgeSet threadAwareEdges
std::unique_ptr< MRGenerator > createMRGenerator(BVDataPTAImpl *pta, bool ptrOnlyMSSA) override
void handleStoreStore(const StmtSVFGNode *firstStore, const StmtSVFGNode *secondStore, PointerAnalysis *pta)
void clearThreadAwareOverlay()
Remove all currently attached thread-aware interference edges.
SVFGEdge * addTDEdge(NodeID srcId, NodeID dstId, const PointsTo &pts)
Add a thread-MHP indirect value-flow edge srcId -> dstId carrying pts.
const ThreadVFCandidateList * overlayCandidates
Map< const StmtSVFGNode *, bool > spanTailCache
Map< const StmtSVFGNode *, SVFGNodeIDSet > successorCache
std::vector< ThreadVFCandidate > ThreadVFCandidateList
void replaceThreadAwareOverlay(MHP *mhp, LockAnalysis *lockAnalysis, const ThreadVFBuildConfig &config)
bool isInOverlayScope(const SVFGNode *node) const
Set< const StmtSVFGNode * > SVFGNodeSet
void addJoinRetEdge(const FormalOUTSVFGNode *formalOut, const ActualOUTSVFGNode *actualOut, CallSiteID callSiteId)
void recordThreadVFSource(const StmtSVFGNode *source, const StmtSVFGNode *destination, bool commonLock)
const ThreadVFQueryMap & getThreadVFQueryMap() const
std::pair< const StmtSVFGNode *, const StmtSVFGNode * > ThreadVFEdge
LockAnalysis * lockAnalysis
bool isHeadOfSpan(const StmtSVFGNode *node)
size_t getThreadAwareEdgeCount() const
bool labelInterferenceEdges
false = VFG_pre (sliced-only): omit edge points-to labels
ThreadVFQueryMap threadVFQueryMap
[THREAD-VF] per-edge query map (see getThreadVFQueryMap).
const SlicedSVFGView * overlayScope
Active overlay configuration; defaults suit VFG_pre.
@ Analysis
Build labelled edges for FSMPTA.
@ SlicingOnly
Build unlabelled connectivity for VFG_pre slicing.
bool isTailOfSpan(const StmtSVFGNode *node)
Map< ThreadVFEdge, Set< const ICFGNode * > > ThreadVFQueryMap
SVFGNodeIDSet getSuccessorNodes(const StmtSVFGNode *node)
MTASVFGBuilder(MHP *mhp, LockAnalysis *lockAnalysis, InterferenceEdgeMode edgeMode=InterferenceEdgeMode::Analysis)
Constructor: driven by the interleaving (MHP) and lock analyses.
void handleStoreLoad(const StmtSVFGNode *store, const StmtSVFGNode *load, PointerAnalysis *pta)
void buildSVFG() override
Rewrite the SVFG build hook: build the stock SVFG, then add MHP edges.
Map< const StmtSVFGNode *, bool > spanHeadCache
SVFGNodeIDSet getPredecessorNodes(const StmtSVFGNode *node)
Lock-span head/tail tests (non-interference lock-pair pruning).
SVFG::SVFGEdgeSetTy SVFGEdgeSet
Definition SVFGBuilder.h:50
for isBitcode
Definition BasicTypes.h:70
unsigned CallSiteID
Definition GeneralType.h:78
u32_t NodeID
Definition GeneralType.h:76
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:76
bool operator==(const ThreadVFCandidate &other) const
bool operator<(const ThreadVFCandidate &other) const
ThreadVFCandidate(NodeID sourceNodeId, NodeID destinationNodeId)