aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhongxing Xu <xuzhongxing@gmail.com>2009-08-03 03:13:46 +0000
committerZhongxing Xu <xuzhongxing@gmail.com>2009-08-03 03:13:46 +0000
commitc471e7b44e63ff1b46b480e723c4130aeaef5a8a (patch)
treea7b526862868e3470b67e12764f36834371ebfdd
parent2e3124486f343d770a2a5c2b7e78268bfc328a58 (diff)
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
-rw-r--r--include/clang/Analysis/PathSensitive/AnalysisManager.h4
-rw-r--r--lib/Frontend/AnalysisConsumer.cpp25
2 files changed, 15 insertions, 14 deletions
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<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);
}
//===----------------------------------------------------------------------===//