1 //==- WorkList.h - Worklist class used by CoreEngine ---------------*- C++ -*-//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines WorkList, a pure virtual class that represents an opaque
11 // worklist used by CoreEngine to explore the reachability state space.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_CLANG_GR_WORKLIST
16 #define LLVM_CLANG_GR_WORKLIST
18 #include "clang/StaticAnalyzer/Core/PathSensitive/BlockCounter.h"
19 #include "clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h"
31 const CFGBlock *block;
32 unsigned blockIdx; // This is the index of the next statement.
35 WorkListUnit(ExplodedNode *N, BlockCounter C,
36 const CFGBlock *B, unsigned idx)
42 explicit WorkListUnit(ExplodedNode *N, BlockCounter C)
48 /// Returns the node associated with the worklist unit.
49 ExplodedNode *getNode() const { return node; }
51 /// Returns the block counter map associated with the worklist unit.
52 BlockCounter getBlockCounter() const { return counter; }
54 /// Returns the CFGblock associated with the worklist unit.
55 const CFGBlock *getBlock() const { return block; }
57 /// Return the index within the CFGBlock for the worklist unit.
58 unsigned getIndex() const { return blockIdx; }
62 BlockCounter CurrentCounter;
65 virtual bool hasWork() const = 0;
67 virtual void enqueue(const WorkListUnit& U) = 0;
69 void enqueue(ExplodedNode *N, const CFGBlock *B, unsigned idx) {
70 enqueue(WorkListUnit(N, CurrentCounter, B, idx));
73 void enqueue(ExplodedNode *N) {
74 assert(N->getLocation().getKind() != ProgramPoint::PostStmtKind);
75 enqueue(WorkListUnit(N, CurrentCounter));
78 virtual WorkListUnit dequeue() = 0;
80 void setBlockCounter(BlockCounter C) { CurrentCounter = C; }
81 BlockCounter getBlockCounter() const { return CurrentCounter; }
87 virtual bool visit(const WorkListUnit &U) = 0;
89 virtual bool visitItemsInWorkList(Visitor &V) = 0;
91 static WorkList *makeDFS();
92 static WorkList *makeBFS();
93 static WorkList *makeBFSBlockDFSContents();
98 } // end clang namespace