diff options
author | Anna Zaks <ganna@apple.com> | 2013-03-26 18:57:58 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2013-03-26 18:57:58 +0000 |
commit | 8a660eb1084294a903f6dcc00bf2fa4e3bc92cfc (patch) | |
tree | 7ad7bf446b160f3758a89b0695a81ef2ea65674b /lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp | |
parent | df5f80f8a34e26a4fb77f48f858c7838426a0785 (diff) |
[analyzer] Change inlining policy to inline small functions when reanalyzing ObjC methods as top level.
This allows us to better reason about(inline) small wrapper functions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178063 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp')
-rw-r--r-- | lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp b/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp index f3d545a026..d71e528848 100644 --- a/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp +++ b/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp @@ -234,11 +234,11 @@ public: else if (Mode == AM_Path) { llvm::errs() << " (Path, "; switch (IMode) { - case ExprEngine::Inline_None: - llvm::errs() << " Inline_None"; + case ExprEngine::Inline_Minimal: + llvm::errs() << " Inline_Minimal"; break; - case ExprEngine::Inline_All: - llvm::errs() << " Inline_All"; + case ExprEngine::Inline_Regular: + llvm::errs() << " Inline_Regular"; break; } llvm::errs() << ")"; @@ -284,7 +284,8 @@ public: virtual void HandleTranslationUnit(ASTContext &C); /// \brief Determine which inlining mode should be used when this function is - /// analyzed. For example, determines if the callees should be inlined. + /// analyzed. This allows to redefine the default inlining policies when + /// analyzing a given function. ExprEngine::InliningModes getInliningModeForFunction(const Decl *D, SetOfConstDecls Visited); @@ -299,7 +300,7 @@ public: /// set of functions which should be considered analyzed after analyzing the /// given root function. void HandleCode(Decl *D, AnalysisMode Mode, - ExprEngine::InliningModes IMode = ExprEngine::Inline_None, + ExprEngine::InliningModes IMode = ExprEngine::Inline_Minimal, SetOfConstDecls *VisitedCallees = 0); void RunPathSensitiveChecks(Decl *D, @@ -410,22 +411,18 @@ static bool shouldSkipFunction(const Decl *D, ExprEngine::InliningModes AnalysisConsumer::getInliningModeForFunction(const Decl *D, SetOfConstDecls Visited) { - ExprEngine::InliningModes HowToInline = - (Mgr->shouldInlineCall()) ? ExprEngine::Inline_All : - ExprEngine::Inline_None; - // We want to reanalyze all ObjC methods as top level to report Retain - // Count naming convention errors more aggressively. But we can turn off + // Count naming convention errors more aggressively. But we should tune down // inlining when reanalyzing an already inlined function. if (Visited.count(D)) { assert(isa<ObjCMethodDecl>(D) && "We are only reanalyzing ObjCMethods."); const ObjCMethodDecl *ObjCM = cast<ObjCMethodDecl>(D); if (ObjCM->getMethodFamily() != OMF_init) - HowToInline = ExprEngine::Inline_None; + return ExprEngine::Inline_Minimal; } - return HowToInline; + return ExprEngine::Inline_Regular; } void AnalysisConsumer::HandleDeclsCallGraph(const unsigned LocalTUDeclsSize) { @@ -595,7 +592,7 @@ void AnalysisConsumer::HandleCode(Decl *D, AnalysisMode Mode, checkerMgr->runCheckersOnASTBody(D, *Mgr, BR); if ((Mode & AM_Path) && checkerMgr->hasPathSensitiveCheckers()) { RunPathSensitiveChecks(D, IMode, VisitedCallees); - if (IMode != ExprEngine::Inline_None) + if (IMode != ExprEngine::Inline_Minimal) NumFunctionsAnalyzed++; } } |