diff options
| author | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-08-03 03:13:46 +0000 |
|---|---|---|
| committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-08-03 03:13:46 +0000 |
| commit | bcbe44fa909e87481e7cca19b2cc73d44052e73f (patch) | |
| tree | 4f06b2b10471545b16ccb650b85777341e59103a | |
| parent | 854d34a9fbd0952a0fc42c486afd879ccaf92974 (diff) | |
| download | bcm5719-llvm-bcbe44fa909e87481e7cca19b2cc73d44052e73f.tar.gz bcm5719-llvm-bcbe44fa909e87481e7cca19b2cc73d44052e73f.zip | |
Create only one AnalysisManager for each translation unit. In HandleCode(),
reset the current analysis context of the AnalysisManager.
llvm-svn: 77943
| -rw-r--r-- | clang/include/clang/Analysis/PathSensitive/AnalysisManager.h | 4 | ||||
| -rw-r--r-- | clang/lib/Frontend/AnalysisConsumer.cpp | 25 |
2 files changed, 15 insertions, 14 deletions
diff --git a/clang/include/clang/Analysis/PathSensitive/AnalysisManager.h b/clang/include/clang/Analysis/PathSensitive/AnalysisManager.h index e7371de6562..2cff088ee0d 100644 --- a/clang/include/clang/Analysis/PathSensitive/AnalysisManager.h +++ b/clang/include/clang/Analysis/PathSensitive/AnalysisManager.h @@ -75,6 +75,10 @@ public: CurrentContext = 0; } + + void setContext(Decl *D) { + CurrentContext = ContextMgr.getContext(D); + } Decl *getCodeDecl() const { assert (AScope == ScopeDecl); diff --git a/clang/lib/Frontend/AnalysisConsumer.cpp b/clang/lib/Frontend/AnalysisConsumer.cpp index 44d79be11c1..5af6c0112a6 100644 --- a/clang/lib/Frontend/AnalysisConsumer.cpp +++ b/clang/lib/Frontend/AnalysisConsumer.cpp @@ -88,6 +88,8 @@ namespace { StoreManagerCreator CreateStoreMgr; ConstraintManagerCreator CreateConstraintMgr; + llvm::OwningPtr<AnalysisManager> Mgr; + AnalysisConsumer(Diagnostic &diags, Preprocessor* pp, PreprocessorFactory* ppf, const LangOptions& lopts, @@ -152,6 +154,12 @@ namespace { virtual void Initialize(ASTContext &Context) { Ctx = &Context; + Mgr.reset(new AnalysisManager(*Ctx, Diags, LOpts, PD.get(), + CreateStoreMgr, CreateConstraintMgr, + Opts.AnalyzerDisplayProgress, + Opts.VisualizeEGDot, Opts.VisualizeEGUbi, + Opts.PurgeDead, Opts.EagerlyAssume, + Opts.TrimGraph)); } virtual void HandleTopLevelDecl(DeclGroupRef D) { @@ -215,14 +223,9 @@ void AnalysisConsumer::HandleTopLevelSingleDecl(Decl *D) { void AnalysisConsumer::HandleTranslationUnit(ASTContext &C) { if(!TranslationUnitActions.empty()) { - AnalysisManager mgr(*Ctx, Diags, LOpts, PD.get(), - CreateStoreMgr, CreateConstraintMgr, - Opts.AnalyzerDisplayProgress, Opts.VisualizeEGDot, - Opts.VisualizeEGUbi, Opts.PurgeDead, Opts.EagerlyAssume, - Opts.TrimGraph); for (Actions::iterator I = TranslationUnitActions.begin(), E = TranslationUnitActions.end(); I != E; ++I) - (*I)(mgr); + (*I)(*Mgr); } if (!ObjCImplementationActions.empty()) { @@ -253,17 +256,11 @@ void AnalysisConsumer::HandleCode(Decl* D, Stmt* Body, Actions& actions) { !Ctx->getSourceManager().isFromMainFile(D->getLocation())) return; - // Create an AnalysisManager that will manage the state for analyzing - // this method/function. - AnalysisManager mgr(D, *Ctx, Diags, LOpts, PD.get(), - CreateStoreMgr, CreateConstraintMgr, - Opts.AnalyzerDisplayProgress, Opts.VisualizeEGDot, - Opts.VisualizeEGUbi, Opts.PurgeDead, Opts.EagerlyAssume, - Opts.TrimGraph); + Mgr->setContext(D); // Dispatch on the actions. for (Actions::iterator I = actions.begin(), E = actions.end(); I != E; ++I) - (*I)(mgr); + (*I)(*Mgr); } //===----------------------------------------------------------------------===// |

