aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnna Zaks <ganna@apple.com>2011-10-18 23:06:48 +0000
committerAnna Zaks <ganna@apple.com>2011-10-18 23:06:48 +0000
commitc9003c89c7aead1686aba89c8e3ddcea1f2bec54 (patch)
tree33ec4a356a4a66b44d723ff181a970d3de5b2556
parent4e82d3cf6fd4c907265e3fa3aac0a835c35dc759 (diff)
[analyzer] Move predecessor into the NodeBuilder context.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142454 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h2
-rw-r--r--include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h35
-rw-r--r--lib/StaticAnalyzer/Core/CoreEngine.cpp10
-rw-r--r--lib/StaticAnalyzer/Core/ExprEngine.cpp6
4 files changed, 25 insertions, 28 deletions
diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h b/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h
index c2188454c9..55ba42c737 100644
--- a/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h
+++ b/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h
@@ -48,7 +48,7 @@ public:
Location(loc),
ST(st),
size(Dst.size()),
- Ctx(builder.C.Eng, builder.getBlock()),
+ Ctx(builder.C.Eng, builder.getBlock(), pred),
NB(builder),
respondsToCallback(respondsToCB) {
assert(!(ST && ST != Pred->getState()));
diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h b/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h
index 4892293a42..b151dfef22 100644
--- a/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h
+++ b/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h
@@ -171,8 +171,9 @@ public:
struct NodeBuilderContext {
CoreEngine &Eng;
const CFGBlock *Block;
- NodeBuilderContext(CoreEngine &E, const CFGBlock *B)
- : Eng(E), Block(B) { assert(B); }
+ ExplodedNode *ContextPred;
+ NodeBuilderContext(CoreEngine &E, const CFGBlock *B, ExplodedNode *N)
+ : Eng(E), Block(B), ContextPred(N) { assert(B); assert(!N->isSink()); }
};
/// This is the simplest builder which generates nodes in the ExplodedGraph.
@@ -219,17 +220,15 @@ protected:
bool MarkAsSink = false);
public:
- NodeBuilder(ExplodedNode *N, NodeBuilderContext &Ctx, bool F = true)
- : BuilderPred(N), C(Ctx), Finalized(F), HasGeneratedNodes(false) {
- assert(!N->isSink());
- Deferred.insert(N);
+ NodeBuilder(NodeBuilderContext &Ctx, bool F = true)
+ : C(Ctx), Finalized(F), HasGeneratedNodes(false) {
+ Deferred.insert(C.ContextPred);
}
/// Create a new builder using the parent builder's context.
- NodeBuilder(ExplodedNode *N, const NodeBuilder &ParentBldr, bool F = true)
- : BuilderPred(N), C(ParentBldr.C), Finalized(F), HasGeneratedNodes(false) {
- assert(!N->isSink());
- Deferred.insert(N);
+ NodeBuilder(const NodeBuilder &ParentBldr, bool F = true)
+ : C(ParentBldr.C), Finalized(F), HasGeneratedNodes(false) {
+ Deferred.insert(C.ContextPred);
}
virtual ~NodeBuilder() {}
@@ -269,8 +268,8 @@ public:
/// visited on the exploded graph path.
unsigned getCurrentBlockCount() const {
return getBlockCounter().getNumVisited(
- BuilderPred->getLocationContext()->getCurrentStackFrame(),
- C.Block->getBlockID());
+ C.ContextPred->getLocationContext()->getCurrentStackFrame(),
+ C.Block->getBlockID());
}
};
@@ -363,7 +362,7 @@ public:
}
void importNodesFromBuilder(const NodeBuilder &NB) {
- ExplodedNode *NBPred = const_cast<ExplodedNode*>(NB.BuilderPred);
+ ExplodedNode *NBPred = const_cast<ExplodedNode*>(NB.C.ContextPred);
if (NB.hasGeneratedNodes()) {
Deferred.erase(NBPred);
Deferred.insert(NB.Deferred.begin(), NB.Deferred.end());
@@ -379,19 +378,19 @@ class BranchNodeBuilder: public NodeBuilder {
bool InFeasibleFalse;
public:
- BranchNodeBuilder(ExplodedNode *Pred, NodeBuilderContext &C,
+ BranchNodeBuilder(NodeBuilderContext &C,
const CFGBlock *dstT, const CFGBlock *dstF)
- : NodeBuilder(Pred, C), DstT(dstT), DstF(dstF),
+ : NodeBuilder(C), DstT(dstT), DstF(dstF),
InFeasibleTrue(!DstT), InFeasibleFalse(!DstF) {}
/// Create a new builder using the parent builder's context.
- BranchNodeBuilder(ExplodedNode *Pred, BranchNodeBuilder &ParentBldr)
- : NodeBuilder(Pred, ParentBldr), DstT(ParentBldr.DstT),
+ BranchNodeBuilder(BranchNodeBuilder &ParentBldr)
+ : NodeBuilder(ParentBldr), DstT(ParentBldr.DstT),
DstF(ParentBldr.DstF),
InFeasibleTrue(!DstT), InFeasibleFalse(!DstF) {}
ExplodedNode *generateNode(const ProgramState *State, bool branch,
- ExplodedNode *Pred = 0);
+ ExplodedNode *Pred);
const CFGBlock *getTargetBlock(bool branch) const {
return branch ? DstT : DstF;
diff --git a/lib/StaticAnalyzer/Core/CoreEngine.cpp b/lib/StaticAnalyzer/Core/CoreEngine.cpp
index a40a0dc683..93eb1423cf 100644
--- a/lib/StaticAnalyzer/Core/CoreEngine.cpp
+++ b/lib/StaticAnalyzer/Core/CoreEngine.cpp
@@ -314,7 +314,7 @@ void CoreEngine::HandleBlockEntrance(const BlockEntrance &L,
// Process the entrance of the block.
if (CFGElement E = L.getFirstElement()) {
- NodeBuilderContext Ctx(*this, L.getBlock());
+ NodeBuilderContext Ctx(*this, L.getBlock(), Pred);
StmtNodeBuilder Builder(Pred, 0, Ctx);
SubEng.processCFGElement(E, Builder, Pred);
}
@@ -418,7 +418,7 @@ void CoreEngine::HandleBlockExit(const CFGBlock * B, ExplodedNode *Pred) {
void CoreEngine::HandleBranch(const Stmt *Cond, const Stmt *Term,
const CFGBlock * B, ExplodedNode *Pred) {
assert(B->succ_size() == 2);
- NodeBuilderContext Ctx(*this, B);
+ NodeBuilderContext Ctx(*this, B, Pred);
SubEng.processBranch(Cond, Term, Ctx, Pred,
*(B->succ_begin()), *(B->succ_begin()+1));
}
@@ -431,7 +431,7 @@ void CoreEngine::HandlePostStmt(const CFGBlock *B, unsigned StmtIdx,
if (StmtIdx == B->size())
HandleBlockExit(B, Pred);
else {
- NodeBuilderContext Ctx(*this, B);
+ NodeBuilderContext Ctx(*this, B, Pred);
StmtNodeBuilder Builder(Pred, StmtIdx, Ctx);
SubEng.processCFGElement((*B)[StmtIdx], Builder, Pred);
}
@@ -508,7 +508,7 @@ ExplodedNode* NodeBuilder::generateNodeImpl(const ProgramPoint &Loc,
StmtNodeBuilder::StmtNodeBuilder(ExplodedNode *N, unsigned idx,
NodeBuilderContext &Ctx)
- : NodeBuilder(N, Ctx), Idx(idx),
+ : NodeBuilder(Ctx), Idx(idx),
PurgingDeadSymbols(false), BuildSinks(false), hasGeneratedNode(false),
PointKind(ProgramPoint::PostStmtKind), Tag(0) {
Deferred.insert(N);
@@ -573,8 +573,6 @@ ExplodedNode *BranchNodeBuilder::generateNode(const ProgramState *State,
if (!isFeasible(branch))
return NULL;
- if (!NodePred)
- NodePred = BuilderPred;
ProgramPoint Loc = BlockEdge(C.Block, branch ? DstT:DstF,
NodePred->getLocationContext());
ExplodedNode *Succ = generateNodeImpl(Loc, State, NodePred);
diff --git a/lib/StaticAnalyzer/Core/ExprEngine.cpp b/lib/StaticAnalyzer/Core/ExprEngine.cpp
index 19b1a2fa73..5f1fe1b5e0 100644
--- a/lib/StaticAnalyzer/Core/ExprEngine.cpp
+++ b/lib/StaticAnalyzer/Core/ExprEngine.cpp
@@ -949,7 +949,7 @@ void ExprEngine::processBranch(const Stmt *Condition, const Stmt *Term,
// Check for NULL conditions; e.g. "for(;;)"
if (!Condition) {
- BranchNodeBuilder NullCondBldr(Pred, BldCtx, DstT, DstF);
+ BranchNodeBuilder NullCondBldr(BldCtx, DstT, DstF);
NullCondBldr.markInfeasible(false);
NullCondBldr.generateNode(Pred->getState(), true, Pred);
Engine.enqueue(NullCondBldr);
@@ -960,7 +960,7 @@ void ExprEngine::processBranch(const Stmt *Condition, const Stmt *Term,
Condition->getLocStart(),
"Error evaluating branch");
- NodeBuilder CheckerBldr(Pred, BldCtx);
+ NodeBuilder CheckerBldr(BldCtx);
getCheckerManager().runCheckersForBranchCondition(Condition, CheckerBldr,
Pred, *this);
@@ -971,7 +971,7 @@ void ExprEngine::processBranch(const Stmt *Condition, const Stmt *Term,
if (PredI->isSink())
continue;
- BranchNodeBuilder builder(PredI, BldCtx, DstT, DstF);
+ BranchNodeBuilder builder(BldCtx, DstT, DstF);
const ProgramState *PrevState = Pred->getState();
SVal X = PrevState->getSVal(Condition);