[analyzer] Convert VisitDeclStmt to use local node builder.

llvm-svn: 142830
This commit is contained in:
Anna Zaks 2011-10-24 18:26:12 +00:00
parent cbdf10be19
commit 5236792019
3 changed files with 31 additions and 23 deletions

View File

@ -283,6 +283,24 @@ public:
C.ContextPred->getLocationContext()->getCurrentStackFrame(),
C.Block->getBlockID());
}
void takeNodes(const ExplodedNodeSet &S) {
for (ExplodedNodeSet::iterator I = S.begin(), E = S.end(); I != E; ++I )
Frontier.erase(*I);
}
void takeNodes(ExplodedNode *N) {
Frontier.erase(N);
}
void addNodes(const ExplodedNodeSet &S) {
Frontier.insert(S);
}
void addNodes(ExplodedNode *N) {
Frontier.Add(N);
}
};
class CommonNodeBuilder {
@ -403,23 +421,6 @@ public:
BuildSinks = Tmp;
return N;
}
void takeNodes(const ExplodedNodeSet &S) {
for (ExplodedNodeSet::iterator I = S.begin(), E = S.end(); I != E; ++I )
Frontier.erase(*I);
}
void takeNodes(ExplodedNode *N) {
Frontier.erase(N);
}
void addNodes(const ExplodedNodeSet &S) {
Frontier.insert(S);
}
void addNodes(ExplodedNode *N) {
Frontier.Add(N);
}
};
class BranchNodeBuilder: public NodeBuilder {

View File

@ -1297,7 +1297,7 @@ void ExprEngine::evalBind(ExplodedNodeSet &Dst, const Stmt *StoreE,
getCheckerManager().runCheckersForBind(CheckedSet, Pred, location, Val,
StoreE, *this);
// TODO: Remove TmpDst after NB refactoring is done.
// TODO:AZ Remove TmpDst after NB refactoring is done.
ExplodedNodeSet TmpDst;
Builder->takeNodes(CheckedSet);
PureStmtNodeBuilder Bldr(CheckedSet, TmpDst, *currentBuilderContext);

View File

@ -302,6 +302,9 @@ void ExprEngine::VisitCast(const CastExpr *CastE, const Expr *Ex,
void ExprEngine::VisitCompoundLiteralExpr(const CompoundLiteralExpr *CL,
ExplodedNode *Pred,
ExplodedNodeSet &Dst) {
PureStmtNodeBuilder B(Pred, Dst, *currentBuilderContext);
Builder->takeNodes(Pred);
const InitListExpr *ILE
= cast<InitListExpr>(CL->getInitializer()->IgnoreParens());
@ -311,9 +314,10 @@ void ExprEngine::VisitCompoundLiteralExpr(const CompoundLiteralExpr *CL,
state = state->bindCompoundLiteral(CL, LC, ILV);
if (CL->isLValue())
MakeNode(Dst, CL, Pred, state->BindExpr(CL, state->getLValue(CL, LC)));
B.generateNode(CL, Pred, state->BindExpr(CL, state->getLValue(CL, LC)));
else
MakeNode(Dst, CL, Pred, state->BindExpr(CL, ILV));
B.generateNode(CL, Pred, state->BindExpr(CL, ILV));
Builder->addNodes(Dst);
}
void ExprEngine::VisitDeclStmt(const DeclStmt *DS, ExplodedNode *Pred,
@ -333,8 +337,9 @@ void ExprEngine::VisitDeclStmt(const DeclStmt *DS, ExplodedNode *Pred,
ExplodedNodeSet dstPreVisit;
getCheckerManager().runCheckersForPreStmt(dstPreVisit, Pred, DS, *this);
PureStmtNodeBuilder B(dstPreVisit, Dst, *currentBuilderContext);
Builder->takeNodes(dstPreVisit);
const VarDecl *VD = dyn_cast<VarDecl>(D);
for (ExplodedNodeSet::iterator I = dstPreVisit.begin(), E = dstPreVisit.end();
I!=E; ++I) {
ExplodedNode *N = *I;
@ -362,13 +367,15 @@ void ExprEngine::VisitDeclStmt(const DeclStmt *DS, ExplodedNode *Pred,
InitVal = svalBuilder.getConjuredSymbolVal(NULL, InitEx,
Builder->getCurrentBlockCount());
}
B.takeNodes(N);
evalBind(Dst, DS, N, state->getLValue(VD, LC), InitVal, true);
B.addNodes(Dst);
}
else {
MakeNode(Dst, DS, N, state->bindDeclWithNoInit(state->getRegion(VD, LC)));
B.generateNode(DS, N,state->bindDeclWithNoInit(state->getRegion(VD, LC)));
}
}
Builder->addNodes(Dst);
}
void ExprEngine::VisitLogicalExpr(const BinaryOperator* B, ExplodedNode *Pred,