Static Value-Flow Analysis
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | Static Protected Attributes | List of all members
SVF::AndersenSCD Class Reference

#include <AndersenPWC.h>

Inheritance diagram for SVF::AndersenSCD:
SVF::Andersen SVF::AndersenBase SVF::WPASolver< GraphType > SVF::BVDataPTAImpl SVF::PointerAnalysis SVF::AndersenSFR

Public Types

typedef Map< NodeID, NodeID > NodeToNodeMap
 
- Public Types inherited from SVF::Andersen
typedef SCCDetection< ConstraintGraph * > CGSCC
 
- Public Types inherited from SVF::AndersenBase
typedef OrderedMap< const CallICFGNode *, NodeID > CallSite2DummyValPN
 
- Public Types inherited from SVF::WPASolver< GraphType >
typedef SVF::GenericGraphTraits< GraphType > GTraits
 Define the GTraits and node iterator for printing.
 
typedef GTraits::NodeRef GNODE
 
typedef GTraits::EdgeType GEDGE
 
typedef GTraits::ChildIteratorType child_iterator
 
typedef SCCDetection< GraphType > SCC
 
typedef FIFOWorkList< NodeID > WorkList
 
- Public Types inherited from SVF::BVDataPTAImpl
typedef PTData< NodeID, NodeSet, NodeID, PointsTo > PTDataTy
 
typedef DiffPTData< NodeID, NodeSet, NodeID, PointsTo > DiffPTDataTy
 
typedef DFPTData< NodeID, NodeSet, NodeID, PointsTo > DFPTDataTy
 
typedef VersionedPTData< NodeID, NodeSet, NodeID, PointsTo, VersionedVar, Set< VersionedVar > > VersionedPTDataTy
 
typedef MutablePTData< NodeID, NodeSet, NodeID, PointsTo > MutPTDataTy
 
typedef MutableDiffPTData< NodeID, NodeSet, NodeID, PointsTo > MutDiffPTDataTy
 
typedef MutableDFPTData< NodeID, NodeSet, NodeID, PointsTo > MutDFPTDataTy
 
typedef MutableIncDFPTData< NodeID, NodeSet, NodeID, PointsTo > MutIncDFPTDataTy
 
typedef MutableVersionedPTData< NodeID, NodeSet, NodeID, PointsTo, VersionedVar, Set< VersionedVar > > MutVersionedPTDataTy
 
typedef PersistentPTData< NodeID, NodeSet, NodeID, PointsTo > PersPTDataTy
 
typedef PersistentDiffPTData< NodeID, NodeSet, NodeID, PointsTo > PersDiffPTDataTy
 
typedef PersistentDFPTData< NodeID, NodeSet, NodeID, PointsTo > PersDFPTDataTy
 
typedef PersistentIncDFPTData< NodeID, NodeSet, NodeID, PointsTo > PersIncDFPTDataTy
 
typedef PersistentVersionedPTData< NodeID, NodeSet, NodeID, PointsTo, VersionedVar, Set< VersionedVar > > PersVersionedPTDataTy
 
- Public Types inherited from SVF::PointerAnalysis
typedef Set< const CallICFGNode * > CallSiteSet
 Indirect call edges type, map a callsite to a set of callees.
 
typedef SVFIR::CallSiteToFunPtrMap CallSiteToFunPtrMap
 
typedef Set< const FunObjVar * > FunctionSet
 
typedef OrderedMap< const CallICFGNode *, FunctionSet > CallEdgeMap
 
typedef SCCDetection< CallGraph * > CallGraphSCC
 
typedef Set< const GlobalObjVar * > VTableSet
 
typedef Set< const FunObjVar * > VFunSet
 

Public Member Functions

 AndersenSCD (SVFIR *_pag, PTATY type=PTATY::AndersenSCD_WPA)
 
- Public Member Functions inherited from SVF::Andersen
 Andersen (SVFIR *_pag, PTATY type=PTATY::Andersen_WPA, bool alias_check=true)
 Constructor.
 
virtual ~Andersen ()
 Destructor.
 
virtual void initialize ()
 Initialize analysis.
 
virtual void finalize ()
 Finalize analysis.
 
void resetData ()
 Reset data.
 
virtual const PointsTo & getPts (NodeID id)
 Operation of points-to set.
 
virtual bool unionPts (NodeID id, const PointsTo &target)
 
virtual bool unionPts (NodeID id, NodeID ptd)
 
virtual NodeBS getMayAliases (NodeID node)
 Collect exactly the SVFIR nodes q for which mayAlias(node, q) holds.
 
void dumpTopLevelPtsTo ()
 
void setDetectPWC (bool flag)
 
- Public Member Functions inherited from SVF::AndersenBase
 AndersenBase (SVFIR *_pag, PTATY type=PTATY::Andersen_BASE, bool alias_check=true)
 Constructor.
 
 ~AndersenBase () override
 Destructor.
 
virtual void analyze () override
 Andersen analysis.
 
virtual void solveAndwritePtsToFile (const std::string &filename)
 
virtual void readPtsFromFile (const std::string &filename)
 
virtual void solveConstraints ()
 
virtual bool updateThreadCallGraph (const CallSiteToFunPtrMap &, NodePairSet &)
 Update thread call graph.
 
virtual void connectCaller2ForkedFunParams (const CallICFGNode *cs, const FunObjVar *F, NodePairSet &cpySrcNodes)
 Connect formal and actual parameters for indirect forksites.
 
virtual void connectCaller2CalleeParams (const CallICFGNode *cs, const FunObjVar *F, NodePairSet &cpySrcNodes)
 Connect formal and actual parameters for indirect callsites.
 
ConstraintGraph * getConstraintGraph ()
 Get constraint graph.
 
NodeID sccRepNode (NodeID id) const override
 SCC methods.
 
NodeBS & sccSubNodes (NodeID repId)
 
void printStat ()
 dump statistics
 
virtual void normalizePointsTo () override
 
void cleanConsCG (NodeID id)
 remove redundant gepnodes in constraint graph
 
- Public Member Functions inherited from SVF::BVDataPTAImpl
 BVDataPTAImpl (SVFIR *pag, PTATY type, bool alias_check=true)
 Constructor.
 
 ~BVDataPTAImpl () override=default
 Destructor.
 
PersistentPointsToCache< PointsTo > & getPtCache ()
 
const PointsTo & getPts (NodeID id) override
 
const NodeSet & getRevPts (NodeID nodeId) override
 
virtual void clearPts (NodeID id, NodeID element)
 Remove element from the points-to set of id.
 
virtual void clearFullPts (NodeID id)
 Clear points-to set of id.
 
virtual bool addPts (NodeID id, NodeID ptd)
 
virtual void clearAllPts ()
 Clear all data.
 
virtual void expandFIObjs (const PointsTo &pts, PointsTo &expandedPts)
 Expand FI objects.
 
virtual void expandFIObjs (const NodeBS &pts, NodeBS &expandedPts)
 TODO: remove repetition.
 
void remapPointsToSets (void)
 Remap all points-to sets to use the current mapping.
 
virtual void writeToFile (const std::string &filename)
 Interface for analysis result storage on filesystem.
 
virtual void writeObjVarToFile (const std::string &filename)
 
virtual void writePtsResultToFile (std::fstream &f)
 
virtual void writeGepObjVarMapToFile (std::fstream &f)
 
virtual bool readFromFile (const std::string &filename)
 
virtual void readPtsResultFromFile (std::ifstream &f)
 
virtual void readGepObjVarMapFromFile (std::ifstream &f)
 
virtual void readAndSetObjFieldSensitivity (std::ifstream &f, const std::string &delimiterStr)
 
AliasResult alias (const SVFVar *V1, const SVFVar *V2) override
 Interface expose to users of our pointer analysis, given Value infos.
 
AliasResult alias (NodeID node1, NodeID node2) override
 Interface expose to users of our pointer analysis, given PAGNodeID.
 
virtual AliasResult alias (const PointsTo &pts1, const PointsTo &pts2)
 Interface expose to users of our pointer analysis, given two pts.
 
bool mayAlias (const PointsTo &pts1, const PointsTo &pts2)
 Convenience bool wrappers: return true if the two operands may/must/partial alias.
 
void dumpCPts () override
 dump and debug, print out conditional pts
 
void dumpTopLevelPtsTo () override
 
void dumpAllPts () override
 
bool mayAlias (const SVFVar *V1, const SVFVar *V2)
 
bool mayAlias (NodeID node1, NodeID node2)
 
- Public Member Functions inherited from SVF::PointerAnalysis
ICFG * getICFG () const
 Get ICFG.
 
u32_t getNumOfResolvedIndCallEdge () const
 Return number of resolved indirect call edges.
 
CallGraph * getCallGraph () const
 Return call graph.
 
CallGraphSCC * getCallGraphSCC () const
 Return call graph SCC.
 
 PointerAnalysis (SVFIR *pag, PTATY ty=PTATY::Default_PTA, bool alias_check=true)
 Constructor.
 
PTATY getAnalysisTy () const
 Type of pointer analysis.
 
PTAImplTy getImplTy () const
 Return implementation type of the pointer analysis.
 
bool printStat ()
 Whether print statistics.
 
void disablePrintStat ()
 Whether print statistics.
 
CallEdgeMap & getIndCallMap ()
 Get callees from an indirect callsite.
 
bool hasIndCSCallees (const CallICFGNode *cs) const
 
const FunctionSet & getIndCSCallees (const CallICFGNode *cs) const
 
virtual void resolveIndCalls (const CallICFGNode *cs, const PointsTo &target, CallEdgeMap &newEdges)
 Resolve indirect call edges.
 
void callGraphSCCDetection ()
 PTACallGraph SCC related methods.
 
NodeID getCallGraphSCCRepNode (NodeID id) const
 Get SCC rep node of a SVFG node.
 
bool inSameCallGraphSCC (const FunObjVar *fun1, const FunObjVar *fun2)
 Return TRUE if this edge is inside a PTACallGraph SCC, i.e., src node and dst node are in the same SCC on the SVFG.
 
bool isInRecursion (const FunObjVar *fun) const
 
bool isLocalVarInRecursiveFun (NodeID id) const
 Whether a local variable is in function recursions.
 
CommonCHGraph * getCHGraph () const
 get CHGraph
 
void getVFnsFromCHA (const CallICFGNode *cs, VFunSet &vfns)
 
void getVFnsFromPts (const CallICFGNode *cs, const PointsTo &target, VFunSet &vfns)
 
void connectVCallToVFns (const CallICFGNode *cs, const VFunSet &vfns, CallEdgeMap &newEdges)
 
virtual void resolveCPPIndCalls (const CallICFGNode *cs, const PointsTo &target, CallEdgeMap &newEdges)
 Resolve cpp indirect call edges.
 
SVFIR * getPAG () const
 
PTAStat * getStat () const
 Get PTA stat.
 
OrderedNodeSet & getAllValidPtrs ()
 Get all Valid Pointers for resolution.
 
virtual void computeDDAPts (NodeID)
 Compute points-to results on-demand, overridden by derived classes.
 
bool mayAlias (const SVFVar *V1, const SVFVar *V2)
 Convenience bool wrappers: return true if the two operands may/must/partial alias.
 
bool mayAlias (NodeID node1, NodeID node2)
 
void printIndCSTargets (const CallICFGNode *cs, const FunctionSet &targets)
 Print targets of a function pointer.
 
virtual void dumpPts (NodeID ptr, const PointsTo &pts)
 
void printIndCSTargets ()
 
void dumpAllTypes ()
 
void dumpStat ()
 Dump the statistics.
 
bool containBlackHoleNode (const PointsTo &pts)
 Determine whether a points-to contains a black hole or constant node.
 
bool containConstantNode (const PointsTo &pts)
 
virtual bool isBlkObjOrConstantObj (NodeID ptd) const
 
bool isHeapMemObj (NodeID id) const
 Whether this object is heap or array.
 
bool isArrayMemObj (NodeID id) const
 
bool isFIObjNode (NodeID id) const
 
NodeID getBaseObjVarID (NodeID id)
 
NodeID getFIObjVar (NodeID id)
 
NodeID getGepObjVar (NodeID id, const APOffset &ap)
 
virtual const NodeBS & getAllFieldsObjVars (NodeID id)
 
void setObjFieldInsensitive (NodeID id)
 
bool isFieldInsensitive (NodeID id) const
 

Static Public Member Functions

static AndersenSCD * createAndersenSCD (SVFIR *_pag)
 Create an singleton instance directly instead of invoking llvm pass manager.
 
static void releaseAndersenSCD ()
 
- Static Public Member Functions inherited from SVF::Andersen
static bool classof (const Andersen *)
 Methods for support type inquiry through isa, cast, and dyn_cast:
 
static bool classof (const PointerAnalysis *pta)
 
- Static Public Member Functions inherited from SVF::AndersenBase
static bool classof (const AndersenBase *)
 Methods for support type inquiry through isa, cast, and dyn_cast:
 
static bool classof (const PointerAnalysis *pta)
 
- Static Public Member Functions inherited from SVF::BVDataPTAImpl
static bool classof (const PointerAnalysis *pta)
 

Protected Member Functions

void addSccCandidate (NodeID nodeId)
 
virtual NodeStack & SCCDetect ()
 
virtual void PWCDetect ()
 
virtual void solveWorklist ()
 
virtual void handleLoadStore (ConstraintNode *node)
 
virtual void processAddr (const AddrCGEdge *addr)
 
virtual bool addCopyEdge (NodeID src, NodeID dst)
 
virtual bool updateCallGraph (const CallSiteToFunPtrMap &callsites)
 
virtual void processPWC (ConstraintNode *rep)
 
virtual void handleCopyGep (ConstraintNode *node)
 
- Protected Member Functions inherited from SVF::Andersen
virtual void computeDiffPts (NodeID id)
 Handle diff points-to set.
 
virtual const PointsTo & getDiffPts (NodeID id)
 
void updatePropaPts (NodeID dstId, NodeID srcId)
 Handle propagated points-to set.
 
void clearPropaPts (NodeID src)
 
virtual void initWorklist ()
 
virtual void processNode (NodeID nodeId)
 Override WPASolver function in order to use the default solver.
 
void processAllAddr ()
 handling various constraints
 
virtual bool processLoad (NodeID node, const ConstraintEdge *load)
 
virtual bool processStore (NodeID node, const ConstraintEdge *load)
 
virtual bool processCopy (NodeID node, const ConstraintEdge *edge)
 
virtual bool processGep (NodeID node, const GepCGEdge *edge)
 
virtual bool processGepPts (const PointsTo &pts, const GepCGEdge *edge)
 
virtual void mergeNodeToRep (NodeID nodeId, NodeID newRepId)
 Merge sub node to its rep.
 
virtual bool mergeSrcToTgt (NodeID srcId, NodeID tgtId)
 
void mergeSccNodes (NodeID repNodeId, const NodeBS &subNodes)
 Merge sub node in a SCC cycle to their rep node.
 
void mergeSccCycle ()
 
virtual void collapsePWCNode (NodeID nodeId)
 Collapse a field object into its base for field insensitive analysis.
 
void collapseFields ()
 collapse positive weight cycles of a graph
 
bool collapseNodePts (NodeID nodeId)
 
bool collapseField (NodeID nodeId)
 
void updateNodeRepAndSubs (NodeID nodeId, NodeID newRepId)
 Updates subnodes of its rep, and rep node of its subs.
 
std::optional< NodeBS > collectMayAliasesFromIndex (const PointsTo &expandedPts)
 
virtual void validateSuccessTests (std::string fun)
 Also check getMayAliases on the pointers that the alias tests use.
 
void sanitizePts ()
 Sanitize pts for field insensitive objects.
 
virtual const std::string PTAName () const
 Get PTA name.
 
virtual void cluster (void) const
 
- Protected Member Functions inherited from SVF::AndersenBase
void heapAllocatorViaIndCall (const CallICFGNode *cs, NodePairSet &cpySrcNodes)
 
- Protected Member Functions inherited from SVF::WPASolver< GraphType >
 WPASolver ()
 Constructor.
 
virtual ~WPASolver ()=default
 Destructor.
 
SCC * getSCCDetector () const
 Get SCC detector.
 
const GraphType graph ()
 Get/Set graph methods.
 
void setGraph (GraphType g)
 
virtual NodeStack & SCCDetect (NodeSet &candidates)
 
virtual void propagate (GNODE *v)
 
virtual bool propFromSrcToDst (GEDGE *)
 Propagate information from source to destination node, to be implemented in the child class.
 
NodeID popFromWorklist ()
 Worklist operations.
 
virtual void pushIntoWorklist (NodeID id)
 
bool isWorklistEmpty ()
 
bool isInWorklist (NodeID id)
 
GNODE * Node (NodeID id)
 Get node on the graph.
 
NodeID Node_Index (GNODE node)
 Get node ID.
 
- Protected Member Functions inherited from SVF::BVDataPTAImpl
PTDataTy * getPTDataTy () const
 Get points-to data structure.
 
void finalize () override
 Finalization of pointer analysis, and normalize points-to information to Bit Vector representation.
 
DiffPTDataTy * getDiffPTDataTy () const
 
DFPTDataTy * getDFPTDataTy () const
 
MutDFPTDataTy * getMutDFPTDataTy () const
 
VersionedPTDataTy * getVersionedPTDataTy () const
 
virtual void onTheFlyCallGraphSolve (const CallSiteToFunPtrMap &callsites, CallEdgeMap &newEdges)
 On the fly call graph construction.
 
virtual void onTheFlyThreadCallGraphSolve (const CallSiteToFunPtrMap &callsites, CallEdgeMap &newForkEdges)
 On the fly thread call graph construction respecting forksite.
 
- Protected Member Functions inherited from SVF::PointerAnalysis
const CallSiteToFunPtrMap & getIndirectCallsites () const
 Return all indirect callsites.
 
NodeID getFunPtr (const CallICFGNode *cs) const
 Return function pointer PAGNode at a callsite cs.
 
virtual void validateTests ()
 Alias check functions to verify correctness of pointer analysis.
 
virtual void validateExpectedFailureTests (std::string fun)
 
void resetObjFieldSensitive ()
 Reset all object node as field-sensitive.
 

Protected Attributes

NodeSet sccCandidates
 
NodeToNodeMap pwcReps
 
- Protected Attributes inherited from SVF::Andersen
CallSite2DummyValPN callsite2DummyValPN
 Map an instruction to a dummy obj which created at an indirect callsite, which invokes a heap allocator.
 
- Protected Attributes inherited from SVF::AndersenBase
ConstraintGraph * consCG
 Constraint Graph.
 
CallSite2DummyValPN callsite2DummyValPN
 
- Protected Attributes inherited from SVF::WPASolver< GraphType >
bool reanalyze
 Reanalyze if any constraint value changed.
 
u32_t iterationForPrintStat
 print out statistics for i-th iteration
 
GraphType _graph
 Graph.
 
std::unique_ptr< SCC > scc
 SCC.
 
WorkList worklist
 Worklist for resolution.
 
- Protected Attributes inherited from SVF::PointerAnalysis
bool print_stat
 User input flags.
 
bool alias_validation
 Flag for validating points-to/alias results.
 
u32_t OnTheFlyIterBudgetForStat
 Flag for iteration budget for on-the-fly statistics.
 
PTATY ptaTy
 Pointer analysis Type.
 
PTAImplTy ptaImplTy
 PTA implementation type.
 
PTAStat * stat
 Statistics.
 
CallGraph * callgraph
 Call graph used for pointer analysis.
 
CallGraphSCC * callGraphSCC
 SCC for PTACallGraph.
 
ICFG * icfg
 Interprocedural control-flow graph.
 
CommonCHGraph * chgraph
 CHGraph.
 

Static Protected Attributes

static AndersenSCD * scdAndersen = nullptr
 
- Static Protected Attributes inherited from SVF::PointerAnalysis
static SVFIR * pag = nullptr
 SVFIR.
 

Additional Inherited Members

- Public Attributes inherited from SVF::AndersenBase
NodeBS redundantGepNodes
 
- Public Attributes inherited from SVF::WPASolver< GraphType >
u32_t numOfIteration
 num of iterations during constraint solving
 
- Static Public Attributes inherited from SVF::AndersenBase
static u32_t numOfProcessedAddr = 0
 Statistics.
 
static u32_t numOfProcessedCopy = 0
 Number of processed Addr edge.
 
static u32_t numOfProcessedGep = 0
 Number of processed Copy edge.
 
static u32_t numOfProcessedLoad = 0
 Number of processed Gep edge.
 
static u32_t numOfProcessedStore = 0
 Number of processed Load edge.
 
static u32_t numOfSfrs = 0
 Number of processed Store edge.
 
static u32_t numOfFieldExpand = 0
 
static u32_t numOfSCCDetection = 0
 
static double timeOfSCCDetection = 0
 
static double timeOfSCCMerges = 0
 
static double timeOfCollapse = 0
 
static u32_t AveragePointsToSetSize = 0
 
static u32_t MaxPointsToSetSize = 0
 
static double timeOfProcessCopyGep = 0
 
static double timeOfProcessLoadStore = 0
 
static double timeOfUpdateCallGraph = 0
 
- Static Public Attributes inherited from SVF::PointerAnalysis
static const std::string aliasTestMayAlias = "MAYALIAS"
 
static const std::string aliasTestMayAliasMangled = "_Z8MAYALIASPvS_"
 
static const std::string aliasTestNoAlias = "NOALIAS"
 
static const std::string aliasTestNoAliasMangled = "_Z7NOALIASPvS_"
 
static const std::string aliasTestPartialAlias = "PARTIALALIAS"
 
static const std::string aliasTestPartialAliasMangled = "_Z12PARTIALALIASPvS_"
 
static const std::string aliasTestMustAlias = "MUSTALIAS"
 
static const std::string aliasTestMustAliasMangled = "_Z9MUSTALIASPvS_"
 
static const std::string aliasTestFailMayAlias = "EXPECTEDFAIL_MAYALIAS"
 
static const std::string aliasTestFailMayAliasMangled = "_Z21EXPECTEDFAIL_MAYALIASPvS_"
 
static const std::string aliasTestFailNoAlias = "EXPECTEDFAIL_NOALIAS"
 
static const std::string aliasTestFailNoAliasMangled = "_Z20EXPECTEDFAIL_NOALIASPvS_"
 

Detailed Description

Selective Cycle Detection Based Andersen Analysis

Definition at line 46 of file AndersenPWC.h.

Member Typedef Documentation

◆ NodeToNodeMap

Definition at line 49 of file AndersenPWC.h.

Constructor & Destructor Documentation

◆ AndersenSCD()

SVF::AndersenSCD::AndersenSCD ( SVFIR *  _pag,
PTATY  type = PTATY::AndersenSCD_WPA 
)
inline

Definition at line 57 of file AndersenPWC.h.

57 :
58 Andersen(_pag,type)
59 {
60 }
newitem type
Definition cJSON.cpp:2739
Andersen(SVFIR *_pag, PTATY type=PTATY::Andersen_WPA, bool alias_check=true)
Constructor.
Definition Andersen.h:199

Member Function Documentation

◆ addCopyEdge()

bool AndersenSCD::addCopyEdge ( NodeID  src,
NodeID  dst 
)
protectedvirtual

If one copy edge is successful added, the src node should be added into SCC detection

Reimplemented from SVF::Andersen.

Definition at line 262 of file AndersenSCD.cpp.

263{
264 if (Andersen::addCopyEdge(src, dst))
265 {
266 addSccCandidate(src);
267 return true;
268 }
269 return false;
270}
void addSccCandidate(NodeID nodeId)
Definition AndersenPWC.h:82
virtual bool addCopyEdge(NodeID src, NodeID dst)
Add copy edge on constraint graph.
Definition Andersen.h:328

◆ addSccCandidate()

void SVF::AndersenSCD::addSccCandidate ( NodeID  nodeId)
inlineprotected

Definition at line 82 of file AndersenPWC.h.

83 {
85 }
NodeID sccRepNode(NodeID id) const override
SCC methods.
Definition Andersen.h:131
NodeSet sccCandidates
Definition AndersenPWC.h:53
llvm::IRBuilder IRBuilder
Definition BasicTypes.h:76

◆ createAndersenSCD()

static AndersenSCD * SVF::AndersenSCD::createAndersenSCD ( SVFIR *  _pag)
inlinestatic

Create an singleton instance directly instead of invoking llvm pass manager.

Definition at line 63 of file AndersenPWC.h.

64 {
65 if (scdAndersen == nullptr)
66 {
67 scdAndersen = new AndersenSCD(_pag);
69 return scdAndersen;
70 }
71 return scdAndersen;
72 }
virtual void analyze() override
Andersen analysis.
Definition Andersen.cpp:150
static AndersenSCD * scdAndersen
Definition AndersenPWC.h:52
AndersenSCD(SVFIR *_pag, PTATY type=PTATY::AndersenSCD_WPA)
Definition AndersenPWC.h:57

◆ handleCopyGep()

void AndersenSCD::handleCopyGep ( ConstraintNode *  node)
protectedvirtual

Compute diff points-to set before propagation

Reimplemented from SVF::Andersen.

Definition at line 150 of file AndersenSCD.cpp.

151{
152 NodeID nodeId = node->getId();
153
154 if (!Options::DetectPWC() && getSCCDetector()->subNodes(nodeId).count() > 1)
155 processPWC(node);
156 else if(isInWorklist(nodeId))
158}
int count
Definition cJSON.h:216
virtual void processPWC(ConstraintNode *rep)
virtual void handleCopyGep(ConstraintNode *node)
Definition Andersen.cpp:498
static Option< bool > DetectPWC
Definition Options.h:206
NodeID getId() const
Get ID.
Definition SVFValue.h:158
bool isInWorklist(NodeID id)
Definition WPASolver.h:165
SCC * getSCCDetector() const
Get SCC detector.
Definition WPASolver.h:68
u32_t NodeID
Definition GeneralType.h:76

◆ handleLoadStore()

void AndersenSCD::handleLoadStore ( ConstraintNode *  node)
protectedvirtual

Source nodes of new added edges are pushed into sccCandidates. Source nodes of new added edges whose pts differ from those of dst nodes are pushed into worklist.

Reimplemented from SVF::Andersen.

Definition at line 209 of file AndersenSCD.cpp.

210{
211 double insertStart = stat->getClk();
212
213 NodeID nodeId = node->getId();
214 // handle load
216 eit = node->outgoingLoadsEnd(); it != eit; ++it)
218 getPts(nodeId).end(); piter != epiter; ++piter)
219 {
220 NodeID ptd = *piter;
221 if (processLoad(ptd, *it))
222 {
223 reanalyze = true;
224 }
225 }
226
227 // handle store
229 eit = node->incomingStoresEnd(); it != eit; ++it)
231 getPts(nodeId).end(); piter != epiter; ++piter)
232 {
233 NodeID ptd = *piter;
234 if (processStore(ptd, *it))
235 {
236 reanalyze = true;
237 }
238 }
239
240 double insertEnd = stat->getClk();
242}
#define TIMEINTERVAL
Definition SVFType.h:604
static double timeOfProcessLoadStore
Definition Andersen.h:174
virtual bool processLoad(NodeID node, const ConstraintEdge *load)
Definition Andersen.cpp:575
virtual const PointsTo & getPts(NodeID id)
Operation of points-to set.
Definition Andersen.h:241
virtual bool processStore(NodeID node, const ConstraintEdge *load)
Definition Andersen.cpp:595
const_iterator outgoingLoadsEnd() const
Definition ConsGNode.h:194
const_iterator incomingStoresBegin() const
Definition ConsGNode.h:215
const_iterator incomingStoresEnd() const
Definition ConsGNode.h:219
ConstraintEdge::ConstraintEdgeSetTy::const_iterator const_iterator
Definition ConsGNode.h:45
const_iterator outgoingLoadsBegin() const
Definition ConsGNode.h:190
PTAStat * stat
Statistics.
const_iterator end() const
Definition PointsTo.h:133
const_iterator begin() const
Definition PointsTo.h:129
static double getClk(bool mark=false)
Definition SVFStat.cpp:52
bool reanalyze
Reanalyze if any constraint value changed.
Definition WPASolver.h:172

◆ processAddr()

void AndersenSCD::processAddr ( const AddrCGEdge *  addr)
protectedvirtual

Initialize worklist via processing addrs

Reimplemented from SVF::Andersen.

Definition at line 248 of file AndersenSCD.cpp.

249{
251
252 NodeID dst = addr->getDstID();
253 NodeID src = addr->getSrcID();
254 addPts(dst,src);
255 addSccCandidate(dst);
256}
static u32_t numOfProcessedAddr
Statistics.
Definition Andersen.h:159
virtual bool addPts(NodeID id, NodeID ptd)

◆ processPWC()

void AndersenSCD::processPWC ( ConstraintNode *  rep)
protectedvirtual

Definition at line 164 of file AndersenSCD.cpp.

165{
166 NodeID repId = rep->getId();
167
169 for (NodeID nId : getSCCDetector()->subNodes(repId))
170 pwcNodes.insert(nId);
171
173 for (NodeID subId : pwcNodes)
175 tmpWorkList.push(subId);
176
177 while (!tmpWorkList.empty())
178 {
181
182 if (!getDiffPts(nodeId).empty())
183 {
185 for (ConstraintEdge* edge : node->getCopyOutEdges())
186 {
188 if (changed && pwcNodes.find(edge->getDstID()) != pwcNodes.end())
189 tmpWorkList.push(edge->getDstID());
190 }
191 for (ConstraintEdge* edge : node->getGepOutEdges())
192 {
193 if (GepCGEdge *gepEdge = SVFUtil::dyn_cast<GepCGEdge>(edge))
194 {
196 if (changed && pwcNodes.find(edge->getDstID()) != pwcNodes.end())
197 tmpWorkList.push(edge->getDstID());
198 }
199 }
200 }
201 }
202}
if(prebuffer< 0)
Definition cJSON.cpp:1269
ConstraintGraph * consCG
Constraint Graph.
Definition Andersen.h:180
virtual void computeDiffPts(NodeID id)
Handle diff points-to set.
Definition Andersen.h:273
virtual const PointsTo & getDiffPts(NodeID id)
Definition Andersen.h:281
virtual bool processGep(NodeID node, const GepCGEdge *edge)
Definition Andersen.cpp:635
virtual bool processCopy(NodeID node, const ConstraintEdge *edge)
Definition Andersen.cpp:615
ConstraintNode * getConstraintNode(NodeID id) const
Get/add/remove constraint node.
Definition ConsG.h:104
FIFOWorkList< NodeID > WorkList
Definition WPASolver.h:56
Set< NodeID > NodeSet
Definition GeneralType.h:87

◆ PWCDetect()

void AndersenSCD::PWCDetect ( )
protectedvirtual

Reimplemented in SVF::AndersenSFR.

Definition at line 127 of file AndersenSCD.cpp.

128{
129 // replace scc candidates by their reps
131 sccCandidates.clear();
134 tmpSccCandidates.clear();
135
136 // set scc edge type as direct edge
138 setDetectPWC(true);
139
141
142 // reset scc edge type
144}
void setDetectPWC(bool flag)
Definition Andersen.h:263

◆ releaseAndersenSCD()

static void SVF::AndersenSCD::releaseAndersenSCD ( )
inlinestatic

Definition at line 74 of file AndersenPWC.h.

75 {
76 if (scdAndersen)
77 delete scdAndersen;
78 scdAndersen = nullptr;
79 }

◆ SCCDetect()

NodeStack & AndersenSCD::SCCDetect ( )
protectedvirtual

SCC detection for SCD

Reimplemented from SVF::Andersen.

Definition at line 98 of file AndersenSCD.cpp.

99{
101
102 double sccStart = stat->getClk();
104 double sccEnd = stat->getClk();
106
107 double mergeStart = stat->getClk();
109 double mergeEnd = stat->getClk();
111
112 if (!Options::DetectPWC())
113 {
114 sccStart = stat->getClk();
115 PWCDetect();
116 sccEnd = stat->getClk();
118 }
119
120 return getSCCDetector()->topoNodeStack();
121}
static double timeOfSCCMerges
Definition Andersen.h:169
static u32_t numOfSCCDetection
Definition Andersen.h:167
static double timeOfSCCDetection
Definition Andersen.h:168
virtual void PWCDetect()
void mergeSccCycle()
Definition Andersen.cpp:732

◆ solveWorklist()

void AndersenSCD::solveWorklist ( )
protectedvirtual

Reimplemented from SVF::WPASolver< GraphType >.

Definition at line 45 of file AndersenSCD.cpp.

46{
47 // Initialize the nodeStack via a whole SCC detection
48 // Nodes in nodeStack are in topological order by default.
49 NodeStack& nodeStack = SCCDetect();
50
53 sccCandidates.clear();
54
55 // propagate point-to sets
56 while (!nodeStack.empty())
57 {
58 NodeID nodeId = nodeStack.top();
59 nodeStack.pop();
60
61 if (sccRepNode(nodeId) == nodeId)
62 {
64
66 // push the rep of node into worklist
68
69 double propStart = stat->getClk();
70 // propagate pts through copy and gep edges
72 handleCopyGep(node);
73 double propEnd = stat->getClk();
75
77 }
78 }
79
80 // New nodes will be inserted into workList during processing.
81 while (!isWorklistEmpty())
82 {
84
85 double insertStart = stat->getClk();
86 // add copy edges via processing load or store edges
88 handleLoadStore(node);
89 double insertEnd = stat->getClk();
91 }
92}
static double timeOfProcessCopyGep
Definition Andersen.h:173
virtual NodeStack & SCCDetect()
virtual void handleLoadStore(ConstraintNode *node)
virtual void handleCopyGep(ConstraintNode *node)
void collapseFields()
collapse positive weight cycles of a graph
Definition Andersen.cpp:717
virtual void collapsePWCNode(NodeID nodeId)
Collapse a field object into its base for field insensitive analysis.
Definition Andersen.cpp:708
NodeID popFromWorklist()
Worklist operations.
Definition WPASolver.h:152
virtual void pushIntoWorklist(NodeID id)
Definition WPASolver.h:157
bool isWorklistEmpty()
Definition WPASolver.h:161
std::stack< NodeID > NodeStack
Definition GeneralType.h:92

◆ updateCallGraph()

bool AndersenSCD::updateCallGraph ( const CallSiteToFunPtrMap &  callsites)
protectedvirtual

Update call graph for the input indirect callsites

nodes as a src of a generated new copy edge

Reimplemented from SVF::AndersenBase.

Definition at line 276 of file AndersenSCD.cpp.

277{
278 double cgUpdateStart = stat->getClk();
279
283 for(CallEdgeMap::iterator it = newEdges.begin(), eit = newEdges.end(); it!=eit; ++it )
284 {
285 for(FunctionSet::iterator cit = it->second.begin(), ecit = it->second.end(); cit!=ecit; ++cit)
286 {
288 }
289 }
290
291 double cgUpdateEnd = stat->getClk();
293
294 return (!newEdges.empty());
295}
static double timeOfUpdateCallGraph
Definition Andersen.h:175
virtual void connectCaller2CalleeParams(const CallICFGNode *cs, const FunObjVar *F, NodePairSet &cpySrcNodes)
Connect formal and actual parameters for indirect callsites.
virtual void onTheFlyCallGraphSolve(const CallSiteToFunPtrMap &callsites, CallEdgeMap &newEdges)
On the fly call graph construction.
OrderedMap< const CallICFGNode *, FunctionSet > CallEdgeMap
Set< NodePair > NodePairSet
Definition GeneralType.h:88

Member Data Documentation

◆ pwcReps

NodeToNodeMap SVF::AndersenSCD::pwcReps
protected

Definition at line 54 of file AndersenPWC.h.

◆ sccCandidates

NodeSet SVF::AndersenSCD::sccCandidates
protected

Definition at line 53 of file AndersenPWC.h.

◆ scdAndersen

AndersenSCD * AndersenSCD::scdAndersen = nullptr
staticprotected

Definition at line 52 of file AndersenPWC.h.


The documentation for this class was generated from the following files: