зеркало из https://github.com/microsoft/clang-1.git
Added support for ProgramPoints to represent ExplodedNodes in another
ExplodedGraph. This allows us to build "layered" ExplodedGraphs where one simulation is layered on another. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47926 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
544f043d76
Коммит
424f671554
|
@ -25,8 +25,13 @@ namespace clang {
|
|||
|
||||
class ProgramPoint {
|
||||
public:
|
||||
enum Kind { BlockEntranceKind=0, PostStmtKind=1, BlockExitKind=2,
|
||||
BlockEdgeSrcKind=3, BlockEdgeDstKind=4, BlockEdgeAuxKind=5 };
|
||||
enum Kind { LayeredNodeKind = 0x0,
|
||||
BlockEntranceKind = 0x1,
|
||||
PostStmtKind = 0x2,
|
||||
BlockExitKind = 0x3,
|
||||
BlockEdgeSrcKind = 0x5, // Skip 0x4.
|
||||
BlockEdgeDstKind = 0x6,
|
||||
BlockEdgeAuxKind = 0x7 };
|
||||
protected:
|
||||
uintptr_t Data;
|
||||
|
||||
|
@ -40,8 +45,16 @@ protected:
|
|||
ProgramPoint() : Data(0) {}
|
||||
|
||||
public:
|
||||
unsigned getKind() const { return Data & 0x7; }
|
||||
void* getRawPtr() const { return reinterpret_cast<void*>(Data & ~0x7); }
|
||||
|
||||
unsigned getKind() const {
|
||||
unsigned x = Data & 0x7;
|
||||
return x & 0x3 ? x : 0; // Use only lower 2 bits for 0x0.
|
||||
}
|
||||
|
||||
void* getRawPtr() const {
|
||||
return (void*) (getKind() ? Data & ~0x7 : Data & ~0x3);
|
||||
}
|
||||
|
||||
void* getRawData() const { return reinterpret_cast<void*>(Data); }
|
||||
|
||||
static bool classof(const ProgramPoint*) { return true; }
|
||||
|
@ -54,6 +67,27 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
class ExplodedNodeImpl;
|
||||
template <typename StateTy> class ExplodedNode;
|
||||
|
||||
class LayeredNode : public ProgramPoint {
|
||||
public:
|
||||
LayeredNode(ExplodedNodeImpl* N) : ProgramPoint(N, LayeredNodeKind) {
|
||||
assert (reinterpret_cast<uintptr_t>(N) & 0x3 == 0 &&
|
||||
"Address of ExplodedNode must have 4-byte alignment.");
|
||||
}
|
||||
|
||||
ExplodedNodeImpl* getNodeImpl() const {
|
||||
return (ExplodedNodeImpl*) getRawPtr();
|
||||
}
|
||||
|
||||
template <typename StateTy>
|
||||
ExplodedNode<StateTy>* getNode() const {
|
||||
return (ExplodedNode<StateTy>*) getRawPtr();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class BlockEntrance : public ProgramPoint {
|
||||
public:
|
||||
BlockEntrance(const CFGBlock* B) : ProgramPoint(B, BlockEntranceKind) {}
|
||||
|
|
Загрузка…
Ссылка в новой задаче