diff options
author | Anna Zaks <ganna@apple.com> | 2012-03-13 22:15:58 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2012-03-13 22:15:58 +0000 |
commit | 6cc0969ab37c614d6cf496f2ed6d2fca397a0133 (patch) | |
tree | 51ad93546b01a4da85b102041680f204ab4ecada /lib/StaticAnalyzer/Core | |
parent | fc544e3d52c43746b1b273f38ec7d65461f0064a (diff) |
[analyser] Refactor shouldInline logic into a helper.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152677 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer/Core')
-rw-r--r-- | lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp b/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp index bb4ea99b16..8c9154cf4c 100644 --- a/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp +++ b/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp @@ -127,13 +127,29 @@ static unsigned getNumberStackFrames(const LocationContext *LCtx) { return count; } +// Determine if we should inline the call. +static bool shouldInline(const FunctionDecl *FD, ExplodedNode *Pred, + AnalysisManager &AMgr) { + AnalysisDeclContext *CalleeADC = AMgr.getAnalysisDeclContext(FD); + const CFG *CalleeCFG = CalleeADC->getCFG(); + + if (getNumberStackFrames(Pred->getLocationContext()) + == AMgr.InlineMaxStackDepth) + return false; + + if (CalleeCFG->getNumBlockIDs() > AMgr.InlineMaxFunctionSize) + return false; + + return true; +} + bool ExprEngine::InlineCall(ExplodedNodeSet &Dst, const CallExpr *CE, ExplodedNode *Pred) { ProgramStateRef state = Pred->getState(); const Expr *Callee = CE->getCallee(); const FunctionDecl *FD = - state->getSVal(Callee, Pred->getLocationContext()).getAsFunctionDecl(); + state->getSVal(Callee, Pred->getLocationContext()).getAsFunctionDecl(); if (!FD || !FD->hasBody(FD)) return false; @@ -142,16 +158,11 @@ bool ExprEngine::InlineCall(ExplodedNodeSet &Dst, // FIXME: Handle C++. break; case Stmt::CallExprClass: { - if (getNumberStackFrames(Pred->getLocationContext()) - == AMgr.InlineMaxStackDepth) - return false; - - AnalysisDeclContext *CalleeADC = AMgr.getAnalysisDeclContext(FD); - const CFG *CalleeCFG = CalleeADC->getCFG(); - if (CalleeCFG->getNumBlockIDs() > AMgr.InlineMaxFunctionSize) + if (!shouldInline(FD, Pred, AMgr)) return false; // Construct a new stack frame for the callee. + AnalysisDeclContext *CalleeADC = AMgr.getAnalysisDeclContext(FD); const StackFrameContext *CallerSFC = Pred->getLocationContext()->getCurrentStackFrame(); const StackFrameContext *CalleeSFC = |