[cfe-commits] r48127 - in /cfe/trunk: Analysis/GRCoreEngine.cpp Analysis/GRExprEngine.cpp include/clang/Analysis/PathSensitive/GRCoreEngine.h
Ted Kremenek
kremenek at apple.com
Sun Mar 9 21:45:01 PDT 2008
Author: kremenek
Date: Sun Mar 9 23:45:00 2008
New Revision: 48127
URL: http://llvm.org/viewvc/llvm-project?rev=48127&view=rev
Log:
More edge-case handling with using liveness information to prune dead state values.
Modified:
cfe/trunk/Analysis/GRCoreEngine.cpp
cfe/trunk/Analysis/GRExprEngine.cpp
cfe/trunk/include/clang/Analysis/PathSensitive/GRCoreEngine.h
Modified: cfe/trunk/Analysis/GRCoreEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/GRCoreEngine.cpp?rev=48127&r1=48126&r2=48127&view=diff
==============================================================================
--- cfe/trunk/Analysis/GRCoreEngine.cpp (original)
+++ cfe/trunk/Analysis/GRCoreEngine.cpp Sun Mar 9 23:45:00 2008
@@ -292,7 +292,7 @@
GRStmtNodeBuilderImpl::GRStmtNodeBuilderImpl(CFGBlock* b, unsigned idx,
ExplodedNodeImpl* N, GRCoreEngineImpl* e)
- : Eng(*e), B(*b), Idx(idx), LastNode(N), Populated(false) {
+ : Eng(*e), B(*b), Idx(idx), Pred(N), LastNode(N), Populated(false) {
Deferred.insert(N);
}
Modified: cfe/trunk/Analysis/GRExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Analysis/GRExprEngine.cpp?rev=48127&r1=48126&r2=48127&view=diff
==============================================================================
--- cfe/trunk/Analysis/GRExprEngine.cpp (original)
+++ cfe/trunk/Analysis/GRExprEngine.cpp Sun Mar 9 23:45:00 2008
@@ -403,6 +403,8 @@
CleanedState = StateMgr.RemoveDeadBindings(StmtEntryNode->getState(),
CurrentStmt, Liveness);
+
+ Builder->SetCleanedState(CleanedState);
// Visit the statement.
Modified: cfe/trunk/include/clang/Analysis/PathSensitive/GRCoreEngine.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRCoreEngine.h?rev=48127&r1=48126&r2=48127&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/GRCoreEngine.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/GRCoreEngine.h Sun Mar 9 23:45:00 2008
@@ -121,6 +121,7 @@
GRCoreEngineImpl& Eng;
CFGBlock& B;
const unsigned Idx;
+ ExplodedNodeImpl* Pred;
ExplodedNodeImpl* LastNode;
bool HasGeneratedNode;
bool Populated;
@@ -136,7 +137,9 @@
~GRStmtNodeBuilderImpl();
- inline ExplodedNodeImpl* getLastNode() {
+ ExplodedNodeImpl* getBasePredecessor() const { return Pred; }
+
+ ExplodedNodeImpl* getLastNode() const {
return LastNode ? (LastNode->isSink() ? NULL : LastNode) : NULL;
}
@@ -160,9 +163,12 @@
typedef ExplodedNode<StateTy> NodeTy;
GRStmtNodeBuilderImpl& NB;
+ StateTy* CleanedState;
public:
- GRStmtNodeBuilder(GRStmtNodeBuilderImpl& nb) : NB(nb), BuildSinks(false) {}
+ GRStmtNodeBuilder(GRStmtNodeBuilderImpl& nb) : NB(nb), BuildSinks(false) {
+ CleanedState = getLastNode()->getState();
+ }
NodeTy* getLastNode() const {
return static_cast<NodeTy*>(NB.getLastNode());
@@ -176,12 +182,24 @@
return static_cast<NodeTy*>(NB.generateNodeImpl(S, St));
}
+ StateTy* GetState(NodeTy* Pred) const {
+ if ((ExplodedNodeImpl*) Pred == NB.getBasePredecessor())
+ return CleanedState;
+ else
+ return Pred->getState();
+ }
+
+ void SetCleanedState(StateTy* St) {
+ CleanedState = St;
+ }
+
NodeTy* Nodify(ExplodedNodeSet<StateTy>& Dst, Stmt* S,
NodeTy* Pred, StateTy* St) {
+ StateTy* PredState = GetState(Pred);
// If the state hasn't changed, don't generate a new node.
- if (!BuildSinks && St == Pred->getState()) {
+ if (!BuildSinks && St == PredState) {
Dst.Add(Pred);
return NULL;
}
More information about the cfe-commits
mailing list