Skip to content

Commit d5804b3

Browse files
committed
Plug-in transfer function "EvalCall" now takes as an argument the current
GRStmtNodeBuilder and is now responsible for adding its own nodes to the graph. llvm-svn: 47923
1 parent b3ca38c commit d5804b3

File tree

7 files changed

+35
-18
lines changed

7 files changed

+35
-18
lines changed

clang/Analysis/GRExprEngine.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,13 @@ void GRExprEngine::VisitCall(CallExpr* CE, NodeTy* Pred,
549549
continue;
550550

551551
// Dispatch to the plug-in transfer function.
552-
St = EvalCall(CE, cast<LVal>(L), (*DI)->getState());
552+
553+
unsigned size = Dst.size();
554+
555+
EvalCall(Dst, CE, cast<LVal>(L), *DI);
556+
557+
if (Dst.size() == size)
558+
Nodify(Dst, CE, *DI, St);
553559
}
554560

555561
// Check for the "noreturn" attribute.

clang/Analysis/GRSimpleVals.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -397,9 +397,14 @@ RVal GRSimpleVals::EvalNE(ValueManager& ValMgr, LVal L, LVal R) {
397397
// Transfer function for Function Calls.
398398
//===----------------------------------------------------------------------===//
399399

400-
ValueState*
401-
GRSimpleVals::EvalCall(ValueStateManager& StateMgr, ValueManager& ValMgr,
402-
CallExpr* CE, LVal L, ValueState* St) {
400+
void GRSimpleVals::EvalCall(ExplodedNodeSet<ValueState>& Dst,
401+
ValueStateManager& StateMgr,
402+
GRStmtNodeBuilder<ValueState>& Builder,
403+
ValueManager& ValMgr,
404+
CallExpr* CE, LVal L,
405+
ExplodedNode<ValueState>* Pred) {
406+
407+
ValueState* St = Pred->getState();
403408

404409
// Invalidate all arguments passed in by reference (LVals).
405410

@@ -411,6 +416,6 @@ GRSimpleVals::EvalCall(ValueStateManager& StateMgr, ValueManager& ValMgr,
411416
if (isa<LVal>(V))
412417
St = StateMgr.SetRVal(St, cast<LVal>(V), UnknownVal());
413418
}
414-
415-
return St;
419+
420+
Builder.Nodify(Dst, CE, Pred, St);
416421
}

clang/Analysis/GRSimpleVals.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,12 @@ class GRSimpleVals : public GRTransferFuncs {
5252

5353
// Calls.
5454

55-
virtual ValueState* EvalCall(ValueStateManager& StateMgr,
56-
ValueManager& ValMgr,
57-
CallExpr* CE, LVal L,
58-
ValueState* St);
55+
virtual void EvalCall(ExplodedNodeSet<ValueState>& Dst,
56+
ValueStateManager& StateMgr,
57+
GRStmtNodeBuilder<ValueState>& Builder,
58+
ValueManager& ValMgr,
59+
CallExpr* CE, LVal L,
60+
ExplodedNode<ValueState>* Pred);
5961

6062
protected:
6163

clang/include/clang/Analysis/PathSensitive/ExplodedGraph.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,9 +365,10 @@ class ExplodedGraph : public ExplodedGraphImpl {
365365
};
366366

367367

368-
template <typename NodeTy>
368+
template <typename StateTy>
369369
class ExplodedNodeSet {
370370

371+
typedef ExplodedNode<StateTy> NodeTy;
371372
typedef llvm::SmallPtrSet<NodeTy*,5> ImplTy;
372373
ImplTy Impl;
373374

clang/include/clang/Analysis/PathSensitive/GRCoreEngine.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ class GRStmtNodeBuilder {
176176
return static_cast<NodeTy*>(NB.generateNodeImpl(S, St));
177177
}
178178

179-
NodeTy* Nodify(ExplodedNodeSet<NodeTy>& Dst, Stmt* S,
179+
NodeTy* Nodify(ExplodedNodeSet<StateTy>& Dst, Stmt* S,
180180
NodeTy* Pred, StateTy* St) {
181181

182182
// If the state hasn't changed, don't generate a new node.

clang/include/clang/Analysis/PathSensitive/GRExprEngine.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class GRExprEngine {
3131
typedef GRBranchNodeBuilder<GRExprEngine> BranchNodeBuilder;
3232
typedef GRIndirectGotoNodeBuilder<GRExprEngine> IndirectGotoNodeBuilder;
3333
typedef GRSwitchNodeBuilder<GRExprEngine> SwitchNodeBuilder;
34-
typedef ExplodedNodeSet<NodeTy> NodeSet;
34+
typedef ExplodedNodeSet<StateTy> NodeSet;
3535

3636
protected:
3737
/// G - the simulation graph.
@@ -414,8 +414,9 @@ class GRExprEngine {
414414
return TF->EvalBinOp(ValMgr, Op, cast<NonLVal>(L), cast<NonLVal>(R));
415415
}
416416

417-
ValueState* EvalCall(CallExpr* CE, LVal L, ValueState* St) {
418-
return TF->EvalCall(StateMgr, ValMgr, CE, L, St);
417+
void EvalCall(NodeSet& Dst, CallExpr* CE, LVal L, NodeTy* Pred) {
418+
assert (Builder && "GRStmtNodeBuilder must be defined.");
419+
return TF->EvalCall(Dst, StateMgr, *Builder, ValMgr, CE, L, Pred);
419420
}
420421

421422
ValueState* MarkBranch(ValueState* St, Stmt* Terminator, bool branchTaken);

clang/include/clang/Analysis/PathSensitive/GRTransferFuncs.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,11 @@ class GRTransferFuncs {
5454

5555
// Calls.
5656

57-
virtual ValueState* EvalCall(ValueStateManager& StateMgr,
58-
ValueManager& ValMgr, CallExpr* CE, LVal L,
59-
ValueState* St) = 0;
57+
virtual void EvalCall(ExplodedNodeSet<ValueState>& Dst,
58+
ValueStateManager& StateMgr,
59+
GRStmtNodeBuilder<ValueState>& Builder,
60+
ValueManager& ValMgr, CallExpr* CE, LVal L,
61+
ExplodedNode<ValueState>* Pred) = 0;
6062
};
6163

6264
} // end clang namespace

0 commit comments

Comments
 (0)