diff options
author | Ted Kremenek <kremenek@apple.com> | 2012-01-31 01:20:02 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2012-01-31 01:20:02 +0000 |
commit | 1dd7fd710646d27edc76bfb226d7e78f05fe143b (patch) | |
tree | 7277271a53a0d026f0508015ebccd5295295a030 /clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp | |
parent | f8c36e005a32c9be7d7f27347f738c4dac9b5c09 (diff) | |
download | bcm5719-llvm-1dd7fd710646d27edc76bfb226d7e78f05fe143b.tar.gz bcm5719-llvm-1dd7fd710646d27edc76bfb226d7e78f05fe143b.zip |
Minor refactor within ExplodedGraph::reclaimRecentlyAllocatedNodes(). No functionality change.
llvm-svn: 149320
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp | 140 |
1 files changed, 76 insertions, 64 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp b/clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp index 75b024329e0..4752f28b696 100644 --- a/clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExplodedGraph.cpp @@ -66,20 +66,7 @@ ExplodedGraph::~ExplodedGraph() { // Node reclamation. //===----------------------------------------------------------------------===// -void ExplodedGraph::reclaimRecentlyAllocatedNodes() { - if (!recentlyAllocatedNodes) - return; - - // Only periodically relcaim nodes so that we can build up a set of - // nodes that meet the reclamation criteria. Freshly created nodes - // by definition have no successor, and thus cannot be reclaimed (see below). - assert(reclaimCounter > 0); - if (--reclaimCounter != 0) - return; - reclaimCounter = CounterTop; - - NodeList &nl = *getNodeList(recentlyAllocatedNodes); - +bool ExplodedGraph::shouldCollect(const ExplodedNode *node) { // Reclaimn all nodes that match *all* the following criteria: // // (1) 1 predecessor (that has one successor) @@ -90,61 +77,86 @@ void ExplodedGraph::reclaimRecentlyAllocatedNodes() { // (6) The 'GDM' is the same as the predecessor. // (7) The LocationContext is the same as the predecessor. // (8) The PostStmt is for a non-consumed Stmt or Expr. - - for (NodeList::iterator i = nl.begin(), e = nl.end() ; i != e; ++i) { - ExplodedNode *node = *i; - - // Conditions 1 and 2. - if (node->pred_size() != 1 || node->succ_size() != 1) - continue; - ExplodedNode *pred = *(node->pred_begin()); - if (pred->succ_size() != 1) - continue; + // Conditions 1 and 2. + if (node->pred_size() != 1 || node->succ_size() != 1) + return false; - ExplodedNode *succ = *(node->succ_begin()); - if (succ->pred_size() != 1) - continue; - - // Condition 3. - ProgramPoint progPoint = node->getLocation(); - if (!isa<PostStmt>(progPoint) || - (isa<CallEnter>(progPoint) || isa<CallExit>(progPoint))) - continue; - // Condition 4. - PostStmt ps = cast<PostStmt>(progPoint); - if (ps.getTag()) - continue; + const ExplodedNode *pred = *(node->pred_begin()); + if (pred->succ_size() != 1) + return false; + + const ExplodedNode *succ = *(node->succ_begin()); + if (succ->pred_size() != 1) + return false; + + // Condition 3. + ProgramPoint progPoint = node->getLocation(); + if (!isa<PostStmt>(progPoint) || + (isa<CallEnter>(progPoint) || isa<CallExit>(progPoint))) + return false; + + // Condition 4. + PostStmt ps = cast<PostStmt>(progPoint); + if (ps.getTag()) + return false; + + if (isa<BinaryOperator>(ps.getStmt())) + return false; + + // Conditions 5, 6, and 7. + ProgramStateRef state = node->getState(); + ProgramStateRef pred_state = pred->getState(); + if (state->store != pred_state->store || state->GDM != pred_state->GDM || + progPoint.getLocationContext() != pred->getLocationContext()) + return false; + + // Condition 8. + if (const Expr *Ex = dyn_cast<Expr>(ps.getStmt())) { + ParentMap &PM = progPoint.getLocationContext()->getParentMap(); + if (!PM.isConsumedExpr(Ex)) + return false; + } + + return true; +} - if (isa<BinaryOperator>(ps.getStmt())) - continue; +void ExplodedGraph::collectNode(ExplodedNode *node) { + // Removing a node means: + // (a) changing the predecessors successor to the successor of this node + // (b) changing the successors predecessor to the predecessor of this node + // (c) Putting 'node' onto freeNodes. + assert(node->pred_size() == 1 || node->succ_size() == 1); + ExplodedNode *pred = *(node->pred_begin()); + ExplodedNode *succ = *(node->succ_begin()); + pred->replaceSuccessor(succ); + succ->replacePredecessor(pred); + if (!freeNodes) + freeNodes = new NodeList(); + getNodeList(freeNodes)->push_back(node); + Nodes.RemoveNode(node); + --NumNodes; + node->~ExplodedNode(); +} - // Conditions 5, 6, and 7. - ProgramStateRef state = node->getState(); - ProgramStateRef pred_state = pred->getState(); - if (state->store != pred_state->store || state->GDM != pred_state->GDM || - progPoint.getLocationContext() != pred->getLocationContext()) - continue; +void ExplodedGraph::reclaimRecentlyAllocatedNodes() { + if (!recentlyAllocatedNodes) + return; - // Condition 8. - if (const Expr *Ex = dyn_cast<Expr>(ps.getStmt())) { - ParentMap &PM = progPoint.getLocationContext()->getParentMap(); - if (!PM.isConsumedExpr(Ex)) - continue; - } - - // If we reach here, we can remove the node. This means: - // (a) changing the predecessors successor to the successor of this node - // (b) changing the successors predecessor to the predecessor of this node - // (c) Putting 'node' onto freeNodes. - pred->replaceSuccessor(succ); - succ->replacePredecessor(pred); - if (!freeNodes) - freeNodes = new NodeList(); - getNodeList(freeNodes)->push_back(node); - Nodes.RemoveNode(node); - --NumNodes; - node->~ExplodedNode(); + // Only periodically relcaim nodes so that we can build up a set of + // nodes that meet the reclamation criteria. Freshly created nodes + // by definition have no successor, and thus cannot be reclaimed (see below). + assert(reclaimCounter > 0); + if (--reclaimCounter != 0) + return; + reclaimCounter = CounterTop; + + NodeList &nl = *getNodeList(recentlyAllocatedNodes); + + for (NodeList::iterator i = nl.begin(), e = nl.end() ; i != e; ++i) { + ExplodedNode *node = *i; + if (shouldCollect(node)) + collectNode(node); } nl.clear(); |