summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-04-11 22:03:04 +0000
committerTed Kremenek <kremenek@apple.com>2008-04-11 22:03:04 +0000
commit811c2b4edb1b7b107326a3061f41aa344bc62d52 (patch)
tree6fdab92c0c1f4dcefbbc531c2d9857820a776485 /clang/lib
parent0a86fdb1ff5bc39294242078829208e4580636ed (diff)
downloadbcm5719-llvm-811c2b4edb1b7b107326a3061f41aa344bc62d52.tar.gz
bcm5719-llvm-811c2b4edb1b7b107326a3061f41aa344bc62d52.zip
Added "GREndPathNodeBuilder", a new node builder that will be used for
evaluating transfer functions at the end-of-path. llvm-svn: 49561
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Analysis/GRCoreEngine.cpp36
1 files changed, 27 insertions, 9 deletions
diff --git a/clang/lib/Analysis/GRCoreEngine.cpp b/clang/lib/Analysis/GRCoreEngine.cpp
index 53831ed06d5..42c89270f90 100644
--- a/clang/lib/Analysis/GRCoreEngine.cpp
+++ b/clang/lib/Analysis/GRCoreEngine.cpp
@@ -124,16 +124,10 @@ void GRCoreEngineImpl::HandleBlockEdge(const BlockEdge& L,
assert (getCFG().getExit().size() == 0
&& "EXIT block cannot contain Stmts.");
- // Process the final state transition.
- void* State = ProcessEOP(Blk, Pred->State);
+ // Process the final state transition.
+ GREndPathNodeBuilderImpl Builder(Blk, Pred, this);
+ ProcessEndPath(Builder);
- bool IsNew;
- ExplodedNodeImpl* Node = G->getNodeImpl(BlockEntrance(Blk), State, &IsNew);
- Node->addPredecessor(Pred);
-
- // If the node was freshly created, mark it as an "End-Of-Path" node.
- if (IsNew) G->addEndOfPath(Node);
-
// This path is done. Don't enqueue any more nodes.
return;
}
@@ -442,3 +436,27 @@ GRSwitchNodeBuilderImpl::generateDefaultCaseNodeImpl(void* St, bool isSink) {
return NULL;
}
+
+GREndPathNodeBuilderImpl::~GREndPathNodeBuilderImpl() {
+ // Auto-generate an EOP node if one has not been generated.
+ if (!HasGeneratedNode) generateNodeImpl(Pred->State);
+}
+
+ExplodedNodeImpl* GREndPathNodeBuilderImpl::generateNodeImpl(void* State) {
+ HasGeneratedNode = true;
+
+ bool IsNew;
+
+ ExplodedNodeImpl* Node =
+ Eng.G->getNodeImpl(BlockEntrance(&B), Pred->State, &IsNew);
+
+
+ Node->addPredecessor(Pred);
+
+ if (IsNew) {
+ Node->markAsSink();
+ Eng.G->addEndOfPath(Node);
+ }
+
+ return Node;
+}
OpenPOWER on IntegriCloud