From 9a935fbdebc51d86802ceab7738c4dff4e8d4425 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Wed, 18 Jun 2008 05:34:07 +0000 Subject: Added a new ProgramPoint: PostPurgeDeadSymbols. This new program point distinguishes between the cases when we just evaluated the transfer function of a Stmt* (PostStmt) or performed a load (PostLoad). This solves a caching bug observed in a recent bug report. llvm-svn: 52443 --- clang/lib/Analysis/GRExprEngine.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'clang/lib/Analysis/GRExprEngine.cpp') diff --git a/clang/lib/Analysis/GRExprEngine.cpp b/clang/lib/Analysis/GRExprEngine.cpp index 837d9100914..2580172d530 100644 --- a/clang/lib/Analysis/GRExprEngine.cpp +++ b/clang/lib/Analysis/GRExprEngine.cpp @@ -214,6 +214,9 @@ void GRExprEngine::ProcessStmt(Stmt* S, StmtNodeBuilder& builder) { SaveAndRestore OldSink(Builder->BuildSinks); SaveOr OldHasGen(Builder->HasGeneratedNode); + SaveAndRestore OldPurgeDeadSymbols(Builder->PurgingDeadSymbols); + Builder->PurgingDeadSymbols = true; + TF->EvalDeadSymbols(Tmp, *this, *Builder, EntryNode, S, CleanedState, DeadSymbols); @@ -965,7 +968,10 @@ ValueState* GRExprEngine::EvalLocation(Expr* Ex, NodeTy* Pred, // Check for loads/stores from/to undefined values. if (location.isUndef()) { - if (NodeTy* Succ = Builder->generateNode(Ex, St, Pred, isLoad)) { + ProgramPoint::Kind K = + isLoad ? ProgramPoint::PostLoadKind : ProgramPoint::PostStmtKind; + + if (NodeTy* Succ = Builder->generateNode(Ex, St, Pred, K)) { Succ->markAsSink(); UndefDeref.insert(Succ); } @@ -1000,7 +1006,10 @@ ValueState* GRExprEngine::EvalLocation(Expr* Ex, NodeTy* Pred, // We don't use "MakeNode" here because the node will be a sink // and we have no intention of processing it later. - NodeTy* NullNode = Builder->generateNode(Ex, StNull, Pred, isLoad); + ProgramPoint::Kind K = + isLoad ? ProgramPoint::PostLoadKind : ProgramPoint::PostStmtKind; + + NodeTy* NullNode = Builder->generateNode(Ex, StNull, Pred, K); if (NullNode) { @@ -2437,6 +2446,7 @@ struct VISIBILITY_HIDDEN DOTGraphTraits : break; case ProgramPoint::PostLoadKind: + case ProgramPoint::PostPurgeDeadSymbolsKind: case ProgramPoint::PostStmtKind: { const PostStmt& L = cast(Loc); Stmt* S = L.getStmt(); -- cgit v1.2.3