diff options
| author | Ted Kremenek <kremenek@apple.com> | 2008-04-11 22:03:04 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2008-04-11 22:03:04 +0000 |
| commit | 811c2b4edb1b7b107326a3061f41aa344bc62d52 (patch) | |
| tree | 6fdab92c0c1f4dcefbbc531c2d9857820a776485 /clang/lib | |
| parent | 0a86fdb1ff5bc39294242078829208e4580636ed (diff) | |
| download | bcm5719-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.cpp | 36 |
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; +} |

