mirror of
https://github.com/opnsense/src.git
synced 2026-02-27 03:40:37 -05:00
79 lines
2.2 KiB
C++
79 lines
2.2 KiB
C++
//==- 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
|