| //==- GRWorkList.h - Worklist class used by GRCoreEngine -----------*- C++ -*-// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines GRWorkList, a pure virtual class that represents an opaque |
| // worklist used by GRCoreEngine to explore the reachability state space. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_CLANG_ANALYSIS_GRWORKLIST |
| #define LLVM_CLANG_ANALYSIS_GRWORKLIST |
| |
| #include "clang/Checker/PathSensitive/GRBlockCounter.h" |
| #include <cstddef> |
| |
| namespace clang { |
| |
| class CFGBlock; |
| class ExplodedNode; |
| class ExplodedNodeImpl; |
| |
| class GRWorkListUnit { |
| ExplodedNode* Node; |
| GRBlockCounter Counter; |
| CFGBlock* Block; |
| unsigned BlockIdx; // This is the index of the next statement. |
| |
| public: |
| GRWorkListUnit(ExplodedNode* N, GRBlockCounter C, |
| CFGBlock* B, unsigned idx) |
| : Node(N), |
| Counter(C), |
| Block(B), |
| BlockIdx(idx) {} |
| |
| explicit GRWorkListUnit(ExplodedNode* N, GRBlockCounter C) |
| : Node(N), |
| Counter(C), |
| Block(NULL), |
| BlockIdx(0) {} |
| |
| ExplodedNode* getNode() const { return Node; } |
| GRBlockCounter getBlockCounter() const { return Counter; } |
| CFGBlock* getBlock() const { return Block; } |
| unsigned getIndex() const { return BlockIdx; } |
| }; |
| |
| class GRWorkList { |
| GRBlockCounter CurrentCounter; |
| public: |
| virtual ~GRWorkList(); |
| virtual bool hasWork() const = 0; |
| |
| virtual void Enqueue(const GRWorkListUnit& U) = 0; |
| |
| void Enqueue(ExplodedNode* N, CFGBlock& B, unsigned idx) { |
| Enqueue(GRWorkListUnit(N, CurrentCounter, &B, idx)); |
| } |
| |
| void Enqueue(ExplodedNode* N) { |
| Enqueue(GRWorkListUnit(N, CurrentCounter)); |
| } |
| |
| virtual GRWorkListUnit Dequeue() = 0; |
| |
| void setBlockCounter(GRBlockCounter C) { CurrentCounter = C; } |
| GRBlockCounter getBlockCounter() const { return CurrentCounter; } |
| |
| static GRWorkList *MakeDFS(); |
| static GRWorkList *MakeBFS(); |
| static GRWorkList *MakeBFSBlockDFSContents(); |
| }; |
| } // end clang namespace |
| #endif |