From: Zhongxing Xu Date: Mon, 3 Aug 2009 03:13:46 +0000 (+0000) Subject: Create only one AnalysisManager for each translation unit. In HandleCode(), X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c471e7b44e63ff1b46b480e723c4130aeaef5a8a;p=clang Create only one AnalysisManager for each translation unit. In HandleCode(), reset the current analysis context of the AnalysisManager. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77943 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Analysis/PathSensitive/AnalysisManager.h b/include/clang/Analysis/PathSensitive/AnalysisManager.h index e7371de656..2cff088ee0 100644 --- a/include/clang/Analysis/PathSensitive/AnalysisManager.h +++ b/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/lib/Frontend/AnalysisConsumer.cpp b/lib/Frontend/AnalysisConsumer.cpp index 44d79be11c..5af6c0112a 100644 --- a/lib/Frontend/AnalysisConsumer.cpp +++ b/lib/Frontend/AnalysisConsumer.cpp @@ -88,6 +88,8 @@ namespace { StoreManagerCreator CreateStoreMgr; ConstraintManagerCreator CreateConstraintMgr; + llvm::OwningPtr 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); } //===----------------------------------------------------------------------===//