summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/Analysis/PathSensitive/GRCoreEngine.h14
-rw-r--r--clang/lib/Analysis/GRCoreEngine.cpp4
-rw-r--r--clang/lib/Analysis/GRExprEngine.cpp37
3 files changed, 33 insertions, 22 deletions
diff --git a/clang/include/clang/Analysis/PathSensitive/GRCoreEngine.h b/clang/include/clang/Analysis/PathSensitive/GRCoreEngine.h
index 61f73093fc1..d4074af5a9a 100644
--- a/clang/include/clang/Analysis/PathSensitive/GRCoreEngine.h
+++ b/clang/include/clang/Analysis/PathSensitive/GRCoreEngine.h
@@ -126,8 +126,6 @@ class GRStmtNodeBuilderImpl {
const unsigned Idx;
ExplodedNodeImpl* Pred;
ExplodedNodeImpl* LastNode;
- bool HasGeneratedNode;
- bool Populated;
typedef llvm::SmallPtrSet<ExplodedNodeImpl*,5> DeferredTy;
DeferredTy Deferred;
@@ -164,8 +162,6 @@ public:
Stmt* getStmt() const { return B[Idx]; }
CFGBlock* getBlock() const { return &B; }
-
- bool hasGeneratedNode() const { return HasGeneratedNode; }
};
@@ -183,13 +179,12 @@ class GRStmtNodeBuilder {
public:
GRStmtNodeBuilder(GRStmtNodeBuilderImpl& nb) : NB(nb),
CallExprAuditBeg(0), CallExprAuditEnd(0),
- ObjCMsgExprAuditBeg(0), ObjCMsgExprAuditEnd(0), BuildSinks(false) {
+ ObjCMsgExprAuditBeg(0), ObjCMsgExprAuditEnd(0),
+ BuildSinks(false), HasGeneratedNode(false) {
CleanedState = getLastNode()->getState();
}
- bool hasGeneratedNode() const { return NB.hasGeneratedNode(); }
-
void setObjCMsgExprAuditors(GRAuditor<StateTy> **B,
GRAuditor<StateTy> **E) {
ObjCMsgExprAuditBeg = B;
@@ -207,10 +202,12 @@ public:
}
NodeTy* generateNode(Stmt* S, StateTy* St, NodeTy* Pred) {
+ HasGeneratedNode = true;
return static_cast<NodeTy*>(NB.generateNodeImpl(S, St, Pred));
}
NodeTy* generateNode(Stmt* S, StateTy* St) {
+ HasGeneratedNode = true;
return static_cast<NodeTy*>(NB.generateNodeImpl(S, St));
}
@@ -275,7 +272,8 @@ public:
return N;
}
- bool BuildSinks;
+ bool BuildSinks;
+ bool HasGeneratedNode;
};
class GRBranchNodeBuilderImpl {
diff --git a/clang/lib/Analysis/GRCoreEngine.cpp b/clang/lib/Analysis/GRCoreEngine.cpp
index 7ad7f73abf7..c2b8c115fdb 100644
--- a/clang/lib/Analysis/GRCoreEngine.cpp
+++ b/clang/lib/Analysis/GRCoreEngine.cpp
@@ -286,7 +286,7 @@ void GRCoreEngineImpl::GenerateNode(const ProgramPoint& Loc, void* State,
GRStmtNodeBuilderImpl::GRStmtNodeBuilderImpl(CFGBlock* b, unsigned idx,
ExplodedNodeImpl* N, GRCoreEngineImpl* e)
- : Eng(*e), B(*b), Idx(idx), Pred(N), LastNode(N), Populated(false) {
+ : Eng(*e), B(*b), Idx(idx), Pred(N), LastNode(N) {
Deferred.insert(N);
}
@@ -324,8 +324,6 @@ ExplodedNodeImpl* GRStmtNodeBuilderImpl::generateNodeImpl(Stmt* S, void* State,
N->addPredecessor(Pred);
Deferred.erase(Pred);
- HasGeneratedNode = true;
-
if (IsNew) {
Deferred.insert(N);
LastNode = N;
diff --git a/clang/lib/Analysis/GRExprEngine.cpp b/clang/lib/Analysis/GRExprEngine.cpp
index 2e474fc8e9a..8c771bffa14 100644
--- a/clang/lib/Analysis/GRExprEngine.cpp
+++ b/clang/lib/Analysis/GRExprEngine.cpp
@@ -188,7 +188,7 @@ void GRExprEngine::ProcessStmt(Stmt* S, StmtNodeBuilder& builder) {
// dead mappings removed.
if (Dst.size() == 1 && *Dst.begin() == StmtEntryNode &&
- !Builder->hasGeneratedNode())
+ !Builder->HasGeneratedNode)
builder.generateNode(S, GetState(StmtEntryNode), StmtEntryNode);
// NULL out these variables to cleanup.
@@ -715,7 +715,11 @@ void GRExprEngine::EvalStore(NodeSet& Dst, Expr* E, NodeTy* Pred,
assert (Builder && "GRStmtNodeBuilder must be defined.");
unsigned size = Dst.size();
- SaveAndRestore<bool> OldSink(Builder->BuildSinks);
+
+ SaveAndRestore<bool> OldSink(Builder->BuildSinks),
+ OldHasGen(Builder->HasGeneratedNode);
+
+ Builder->HasGeneratedNode = false;
assert (!TargetLV.isUndef());
@@ -724,7 +728,7 @@ void GRExprEngine::EvalStore(NodeSet& Dst, Expr* E, NodeTy* Pred,
// Handle the case where no nodes where generated. Auto-generate that
// contains the updated state if we aren't generating sinks.
- if (!Builder->BuildSinks && Dst.size() == size)
+ if (!Builder->BuildSinks && Dst.size() == size && !Builder->HasGeneratedNode)
TF->GRTransferFuncs::EvalStore(Dst, *this, *Builder, E, Pred, St,
TargetLV, Val);
}
@@ -888,14 +892,18 @@ void GRExprEngine::VisitCall(CallExpr* CE, NodeTy* Pred,
unsigned size = Dst.size();
- SaveAndRestore<bool> OldSink(Builder->BuildSinks);
+ SaveAndRestore<bool> OldSink(Builder->BuildSinks),
+ OldHasGen(Builder->HasGeneratedNode);
+ Builder->HasGeneratedNode = false;
+
EvalCall(Dst, CE, cast<LVal>(L), *DI);
// Handle the case where no nodes where generated. Auto-generate that
// contains the updated state if we aren't generating sinks.
- if (!Builder->BuildSinks && Dst.size() == size)
+ if (!Builder->BuildSinks && Dst.size() == size &&
+ !Builder->HasGeneratedNode)
MakeNode(Dst, CE, *DI, St);
}
}
@@ -991,14 +999,18 @@ void GRExprEngine::VisitObjCMessageExprDispatchHelper(ObjCMessageExpr* ME,
// Dispatch to plug-in transfer function.
unsigned size = Dst.size();
- SaveAndRestore<bool> OldSink(Builder->BuildSinks);
+
+ SaveAndRestore<bool> OldSink(Builder->BuildSinks),
+ OldHasGen(Builder->HasGeneratedNode);
+ Builder->HasGeneratedNode = false;
+
EvalObjCMessageExpr(Dst, ME, Pred);
// Handle the case where no nodes where generated. Auto-generate that
// contains the updated state if we aren't generating sinks.
- if (!Builder->BuildSinks && Dst.size() == size)
+ if (!Builder->BuildSinks && Dst.size() == size && !Builder->HasGeneratedNode)
MakeNode(Dst, ME, Pred, St);
}
@@ -1461,14 +1473,17 @@ void GRExprEngine::EvalReturn(NodeSet& Dst, ReturnStmt* S, NodeTy* Pred) {
assert (Builder && "GRStmtNodeBuilder must be defined.");
unsigned size = Dst.size();
- SaveAndRestore<bool> OldSink(Builder->BuildSinks);
+
+ SaveAndRestore<bool> OldSink(Builder->BuildSinks),
+ OldHasGen(Builder->HasGeneratedNode);
+ Builder->HasGeneratedNode = false;
+
TF->EvalReturn(Dst, *this, *Builder, S, Pred);
- // Handle the case where no nodes where generated. Auto-generate that
- // contains the updated state if we aren't generating sinks.
+ // Handle the case where no nodes where generated.
- if (!Builder->BuildSinks && Dst.size() == size)
+ if (!Builder->BuildSinks && Dst.size() == size && !Builder->HasGeneratedNode)
MakeNode(Dst, S, Pred, GetState(Pred));
}
OpenPOWER on IntegriCloud