diff options
author | Anna Zaks <ganna@apple.com> | 2011-10-24 18:25:53 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2011-10-24 18:25:53 +0000 |
commit | 1aae01a8308d2f8e31adab3f4d7ac35543aac680 (patch) | |
tree | 81807c40f9fd0a60caa539fe85407d69c6b6760f /lib/StaticAnalyzer/Core/CoreEngine.cpp | |
parent | fe9b2a84105b898b48a2935d50d209c880f36aa3 (diff) |
[analyzer] Pass external Dst set to NodeBuilder
This moves the responsibility for storing the output node set from the
builder to the clients. The builder is just responsible for transforming
an input set into the output set: {SrcSet/SrcNode} -> {Frontier}.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142826 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer/Core/CoreEngine.cpp')
-rw-r--r-- | lib/StaticAnalyzer/Core/CoreEngine.cpp | 40 |
1 files changed, 18 insertions, 22 deletions
diff --git a/lib/StaticAnalyzer/Core/CoreEngine.cpp b/lib/StaticAnalyzer/Core/CoreEngine.cpp index 525bd71111..b9ab7b4c74 100644 --- a/lib/StaticAnalyzer/Core/CoreEngine.cpp +++ b/lib/StaticAnalyzer/Core/CoreEngine.cpp @@ -315,7 +315,8 @@ void CoreEngine::HandleBlockEntrance(const BlockEntrance &L, // Process the entrance of the block. if (CFGElement E = L.getFirstElement()) { NodeBuilderContext Ctx(*this, L.getBlock(), Pred); - StmtNodeBuilder Builder(Pred, 0, Ctx); + ExplodedNodeSet Dst; + StmtNodeBuilder Builder(Pred, Dst, 0, Ctx); SubEng.processCFGElement(E, Builder, Pred); } else @@ -419,8 +420,11 @@ void CoreEngine::HandleBranch(const Stmt *Cond, const Stmt *Term, const CFGBlock * B, ExplodedNode *Pred) { assert(B->succ_size() == 2); NodeBuilderContext Ctx(*this, B, Pred); - SubEng.processBranch(Cond, Term, Ctx, Pred, + ExplodedNodeSet Dst; + SubEng.processBranch(Cond, Term, Ctx, Pred, Dst, *(B->succ_begin()), *(B->succ_begin()+1)); + // Enqueue the new frontier onto the worklist. + enqueue(Dst); } void CoreEngine::HandlePostStmt(const CFGBlock *B, unsigned StmtIdx, @@ -432,7 +436,8 @@ void CoreEngine::HandlePostStmt(const CFGBlock *B, unsigned StmtIdx, HandleBlockExit(B, Pred); else { NodeBuilderContext Ctx(*this, B, Pred); - StmtNodeBuilder Builder(Pred, StmtIdx, Ctx); + ExplodedNodeSet Dst; + StmtNodeBuilder Builder(Pred, Dst, StmtIdx, Ctx); SubEng.processCFGElement((*B)[StmtIdx], Builder, Pred); } } @@ -457,9 +462,9 @@ void CoreEngine::generateNode(const ProgramPoint &Loc, if (IsNew) WList->enqueue(Node); } -void CoreEngine::enqueue(NodeBuilder &NB) { - for (NodeBuilder::iterator I = NB.results_begin(), - E = NB.results_end(); I != E; ++I) { +void CoreEngine::enqueue(ExplodedNodeSet &S) { + for (ExplodedNodeSet::iterator I = S.begin(), + E = S.end(); I != E; ++I) { WList->enqueue(*I); } } @@ -494,28 +499,19 @@ ExplodedNode* NodeBuilder::generateNodeImpl(const ProgramPoint &Loc, bool IsNew; ExplodedNode *N = C.Eng.G->getNode(Loc, State, &IsNew); N->addPredecessor(FromN, *C.Eng.G); - Deferred.erase(FromN); + Frontier.erase(FromN); if (MarkAsSink) N->markAsSink(); - - if (IsNew && !N->isSink()) - Deferred.insert(N); + + if (IsNew) + Frontier.Add(N); return (IsNew ? N : 0); } - -StmtNodeBuilder::StmtNodeBuilder(ExplodedNode *N, unsigned idx, - NodeBuilderContext &Ctx) - : NodeBuilder(Ctx), Idx(idx), - PurgingDeadSymbols(false), BuildSinks(false), hasGeneratedNode(false), - PointKind(ProgramPoint::PostStmtKind), Tag(0) { - Deferred.insert(N); -} - StmtNodeBuilder::~StmtNodeBuilder() { - for (DeferredTy::iterator I=Deferred.begin(), E=Deferred.end(); I!=E; ++I) + for (iterator I=Frontier.begin(), E=Frontier.end(); I!=E; ++I) if (!(*I)->isSink()) GenerateAutoTransition(*I); } @@ -554,14 +550,14 @@ void StmtNodeBuilder::GenerateAutoTransition(ExplodedNode *N) { C.Eng.WList->enqueue(Succ, C.Block, Idx+1); } -ExplodedNode *StmtNodeBuilder::MakeNode(ExplodedNodeSet &Dst, +ExplodedNode *StmtNodeBuilder::MakeNode(ExplodedNodeSet &DstSet, const Stmt *S, ExplodedNode *Pred, const ProgramState *St, ProgramPoint::Kind K) { ExplodedNode *N = generateNode(S, St, Pred, K, 0, BuildSinks); if (N && !BuildSinks){ - Dst.Add(N); + DstSet.Add(N); } return N; } |