diff options
author | Jordan Rose <jordan_rose@apple.com> | 2012-12-06 18:58:15 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2012-12-06 18:58:15 +0000 |
commit | 4ecca28e20410f5e2816c5ddff5cdeaf45fb74b5 (patch) | |
tree | 52bb2074cab18501391d82c1d9f847bd49964c85 /lib/StaticAnalyzer | |
parent | fbe4d36f1f83ca12b532e0a946cbffcdb54f904c (diff) |
[analyzer] Use a smarter algorithm to find the last block in an inlined call.
Previously we would search for the last statement, then back up to the
entrance of the block that contained that statement. Now, while we're
scanning for the statement, we just keep track of which blocks are being
exited (in reverse order).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@169526 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer')
-rw-r--r-- | lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp | 21 |
1 files changed, 3 insertions, 18 deletions
diff --git a/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp b/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp index 7528b7fbf2..3ce4612160 100644 --- a/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp +++ b/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp @@ -64,6 +64,7 @@ void ExprEngine::processCallEnter(CallEnter CE, ExplodedNode *Pred) { static std::pair<const Stmt*, const CFGBlock*> getLastStmt(const ExplodedNode *Node) { const Stmt *S = 0; + const CFGBlock *Blk = 0; const StackFrameContext *SF = Node->getLocation().getLocationContext()->getCurrentStackFrame(); @@ -91,6 +92,8 @@ static std::pair<const Stmt*, } while (!CE || CE->getCalleeContext() != CEE->getCalleeContext()); // Continue searching the graph. + } else if (const BlockEdge *BE = dyn_cast<BlockEdge>(&PP)) { + Blk = BE->getSrc(); } } else if (const CallEnter *CE = dyn_cast<CallEnter>(&PP)) { // If we reached the CallEnter for this function, it has no statements. @@ -104,24 +107,6 @@ static std::pair<const Stmt*, Node = *Node->pred_begin(); } - const CFGBlock *Blk = 0; - if (S) { - // Now, get the enclosing basic block. - while (Node) { - const ProgramPoint &PP = Node->getLocation(); - if (isa<BlockEdge>(PP) && - (PP.getLocationContext()->getCurrentStackFrame() == SF)) { - BlockEdge &EPP = cast<BlockEdge>(PP); - Blk = EPP.getDst(); - break; - } - if (Node->pred_empty()) - return std::pair<const Stmt*, const CFGBlock*>(S, (CFGBlock*)0); - - Node = *Node->pred_begin(); - } - } - return std::pair<const Stmt*, const CFGBlock*>(S, Blk); } |