29#ifndef INCLUDE_MTA_MTASVFGBUILDER_H_
30#define INCLUDE_MTA_MTASVFGBUILDER_H_
70 typedef std::pair<const StmtSVFGNode*, const StmtSVFGNode*>
ThreadVFEdge;
static ThreadVFBuildConfig wholeProgram()
const ThreadVFCandidateList * candidates
static ThreadVFBuildConfig mainPhase(const SlicedSVFGView &scope, const ThreadVFCandidateList *candidates=nullptr)
const SlicedSVFGView * scope
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.
void connectThreadJoinEdges()
void collectLoadStoreSVFGNodes()
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
llvm::IRBuilder IRBuilder
bool operator==(const ThreadVFCandidate &other) const
bool operator<(const ThreadVFCandidate &other) const
ThreadVFCandidate(NodeID sourceNodeId, NodeID destinationNodeId)