aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Analysis/PathSensitive/ExplodedGraph.h30
-rw-r--r--include/clang/Analysis/PathSensitive/GRCoreEngine.h48
-rw-r--r--include/clang/Analysis/PathSensitive/GRExprEngine.h2
-rw-r--r--include/clang/Analysis/PathSensitive/ValueState.h4
4 files changed, 33 insertions, 51 deletions
diff --git a/include/clang/Analysis/PathSensitive/ExplodedGraph.h b/include/clang/Analysis/PathSensitive/ExplodedGraph.h
index a3d1bfe82e..423f4f065c 100644
--- a/include/clang/Analysis/PathSensitive/ExplodedGraph.h
+++ b/include/clang/Analysis/PathSensitive/ExplodedGraph.h
@@ -114,15 +114,6 @@ protected:
}
public:
- // This method is only defined so that we can cast a
- // void* to FoldingSet<ExplodedNodeImpl> so that we can iterate
- // over the vertices of EdgeNodeSetMap in ExplodeGraphImpl.
- // The actual profiling of vertices will be done in the derived
- // class, ExplodedNode<>. Nodes will NEVER be INSERTED into the
- // FoldingSet using this Profile method (since it doesn't do anything).
- inline void Profile(llvm::FoldingSetNodeID& ID) const {
- assert (false && "Needs to be implemented in derived class.");
- }
/// getLocation - Returns the edge associated with the given node.
const ProgramPoint& getLocation() const { return Location; }
@@ -139,11 +130,8 @@ public:
template <typename StateTy>
struct GRTrait {
- static inline void* toPtr(StateTy S) {
- return reinterpret_cast<void*>(S);
- }
- static inline StateTy toState(void* P) {
- return reinterpret_cast<StateTy>(P);
+ static inline void Profile(llvm::FoldingSetNodeID& ID, const StateTy* St) {
+ St->Profile(ID);
}
};
@@ -153,19 +141,19 @@ class ExplodedNode : public ExplodedNodeImpl {
public:
/// Construct a ExplodedNodeImpl with the given node ID, program edge,
/// and state.
- explicit ExplodedNode(const ProgramPoint& loc, StateTy state)
- : ExplodedNodeImpl(loc, GRTrait<StateTy>::toPtr(state)) {}
+ explicit ExplodedNode(const ProgramPoint& loc, StateTy* St)
+ : ExplodedNodeImpl(loc, St) {}
/// getState - Returns the state associated with the node.
- inline StateTy getState() const {
- return GRTrait<StateTy>::toState(State);
+ inline StateTy* getState() const {
+ return static_cast<StateTy*>(State);
}
// Profiling (for FoldingSet).
static inline void Profile(llvm::FoldingSetNodeID& ID,
const ProgramPoint& Loc,
- StateTy state) {
+ StateTy* state) {
ID.Add(Loc);
GRTrait<StateTy>::Profile(ID, state);
}
@@ -293,7 +281,7 @@ protected:
protected:
virtual ExplodedNodeImpl*
getNodeImpl(const ProgramPoint& L, void* State, bool* IsNew) {
- return getNode(L, GRTrait<StateTy>::toState(State), IsNew);
+ return getNode(L, static_cast<StateTy*>(State), IsNew);
}
public:
@@ -309,7 +297,7 @@ public:
/// where the 'Location' is a ProgramPoint in the CFG. If no node for
/// this pair exists, it is created. IsNew is set to true if
/// the node was freshly created.
- NodeTy* getNode(const ProgramPoint& L, StateTy State, bool* IsNew = NULL) {
+ NodeTy* getNode(const ProgramPoint& L, StateTy* State, bool* IsNew = NULL) {
// Profile 'State' to determine if we already have an existing node.
llvm::FoldingSetNodeID profile;
diff --git a/include/clang/Analysis/PathSensitive/GRCoreEngine.h b/include/clang/Analysis/PathSensitive/GRCoreEngine.h
index 2051850c92..53986a326f 100644
--- a/include/clang/Analysis/PathSensitive/GRCoreEngine.h
+++ b/include/clang/Analysis/PathSensitive/GRCoreEngine.h
@@ -168,18 +168,16 @@ public:
return static_cast<NodeTy*>(NB.getLastNode());
}
- NodeTy* generateNode(Stmt* S, StateTy State, NodeTy* Pred) {
- void *state = GRTrait<StateTy>::toPtr(State);
- return static_cast<NodeTy*>(NB.generateNodeImpl(S, state, Pred));
+ NodeTy* generateNode(Stmt* S, StateTy* St, NodeTy* Pred) {
+ return static_cast<NodeTy*>(NB.generateNodeImpl(S, St, Pred));
}
- NodeTy* generateNode(Stmt* S, StateTy State) {
- void *state = GRTrait<StateTy>::toPtr(State);
- return static_cast<NodeTy*>(NB.generateNodeImpl(S, state));
+ NodeTy* generateNode(Stmt* S, StateTy* St) {
+ return static_cast<NodeTy*>(NB.generateNodeImpl(S, St));
}
- NodeTy* Nodify(ExplodedNodeSet<NodeTy> Dst, Stmt* S,
- NodeTy* Pred, StateTy St) {
+ NodeTy* Nodify(ExplodedNodeSet<NodeTy>& Dst, Stmt* S,
+ NodeTy* Pred, StateTy* St) {
// If the state hasn't changed, don't generate a new node.
if (St == Pred->getState()) {
@@ -251,13 +249,12 @@ public:
return static_cast<NodeTy*>(NB.getPredecessor());
}
- StateTy getState() const {
+ StateTy* getState() const {
return getPredecessor()->getState();
}
- inline NodeTy* generateNode(StateTy State, bool branch) {
- void *state = GRTrait<StateTy>::toPtr(State);
- return static_cast<NodeTy*>(NB.generateNodeImpl(state, branch));
+ inline NodeTy* generateNode(StateTy* St, bool branch) {
+ return static_cast<NodeTy*>(NB.generateNodeImpl(St, branch));
}
GRBlockCounter getBlockCounter() const {
@@ -334,13 +331,12 @@ public:
inline Expr* getTarget() const { return NB.getTarget(); }
- inline NodeTy* generateNode(const iterator& I, StateTy St, bool isSink=false){
- void *state = GRTrait<StateTy>::toPtr(St);
- return static_cast<NodeTy*>(NB.generateNodeImpl(I, state, isSink));
+ inline NodeTy* generateNode(const iterator& I, StateTy* St, bool isSink=false){
+ return static_cast<NodeTy*>(NB.generateNodeImpl(I, St, isSink));
}
- inline StateTy getState() const {
- return GRTrait<StateTy>::toState(NB.getState());
+ inline StateTy* getState() const {
+ return static_cast<StateTy*>(NB.getState());
}
};
@@ -402,18 +398,16 @@ public:
inline Expr* getCondition() const { return NB.getCondition(); }
- inline NodeTy* generateCaseStmtNode(const iterator& I, StateTy St) {
- void *state = GRTrait<StateTy>::toPtr(St);
- return static_cast<NodeTy*>(NB.generateCaseStmtNodeImpl(I, state));
+ inline NodeTy* generateCaseStmtNode(const iterator& I, StateTy* St) {
+ return static_cast<NodeTy*>(NB.generateCaseStmtNodeImpl(I, St));
}
- inline NodeTy* generateDefaultCaseNode(StateTy St, bool isSink = false) {
- void *state = GRTrait<StateTy>::toPtr(St);
- return static_cast<NodeTy*>(NB.generateDefaultCaseNodeImpl(state, isSink));
+ inline NodeTy* generateDefaultCaseNode(StateTy* St, bool isSink = false) {
+ return static_cast<NodeTy*>(NB.generateDefaultCaseNodeImpl(St, isSink));
}
- inline StateTy getState() const {
- return GRTrait<StateTy>::toState(NB.getState());
+ inline StateTy* getState() const {
+ return static_cast<StateTy*>(NB.getState());
}
};
@@ -432,7 +426,7 @@ protected:
CheckerTy* Checker;
virtual void* getInitialState() {
- return GRTrait<StateTy>::toPtr(getCheckerState().getInitialState());
+ return getCheckerState().getInitialState();
}
virtual void* ProcessEOP(CFGBlock* Blk, void* State) {
@@ -448,7 +442,7 @@ protected:
virtual bool ProcessBlockEntrance(CFGBlock* Blk, void* State,
GRBlockCounter BC) {
return Checker->ProcessBlockEntrance(Blk,
- GRTrait<StateTy>::toState(State), BC);
+ static_cast<StateTy*>(State), BC);
}
virtual void ProcessBranch(Expr* Condition, Stmt* Terminator,
diff --git a/include/clang/Analysis/PathSensitive/GRExprEngine.h b/include/clang/Analysis/PathSensitive/GRExprEngine.h
index a6d502f2a3..ffbd064c30 100644
--- a/include/clang/Analysis/PathSensitive/GRExprEngine.h
+++ b/include/clang/Analysis/PathSensitive/GRExprEngine.h
@@ -22,7 +22,7 @@ namespace clang {
class GRExprEngine {
public:
- typedef ValueState* StateTy;
+ typedef ValueState StateTy;
typedef ExplodedGraph<GRExprEngine> GraphTy;
typedef GraphTy::NodeTy NodeTy;
diff --git a/include/clang/Analysis/PathSensitive/ValueState.h b/include/clang/Analysis/PathSensitive/ValueState.h
index ba323b5a86..2d538f544c 100644
--- a/include/clang/Analysis/PathSensitive/ValueState.h
+++ b/include/clang/Analysis/PathSensitive/ValueState.h
@@ -93,7 +93,7 @@ public:
/// Profile - Profile the contents of a ValueState object for use
/// in a FoldingSet.
- static void Profile(llvm::FoldingSetNodeID& ID, ValueState* V) {
+ static void Profile(llvm::FoldingSetNodeID& ID, const ValueState* V) {
V->SubExprBindings.Profile(ID);
V->BlockExprBindings.Profile(ID);
V->VarBindings.Profile(ID);
@@ -103,7 +103,7 @@ public:
/// Profile - Used to profile the contents of this object for inclusion
/// in a FoldingSet.
- void Profile(llvm::FoldingSetNodeID& ID) {
+ void Profile(llvm::FoldingSetNodeID& ID) const {
Profile(ID, this);
}