From: Zhongxing Xu Date: Mon, 3 Aug 2009 03:27:37 +0000 (+0000) Subject: now we can let AnalysisManager to own the PathDiagnosticClient. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d07a0d0279c09d1017f8450fce575a94dc9703c0;p=clang now we can let AnalysisManager to own the PathDiagnosticClient. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77945 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Analysis/PathSensitive/AnalysisManager.h b/include/clang/Analysis/PathSensitive/AnalysisManager.h index 2cff088ee0..883454fd2e 100644 --- a/include/clang/Analysis/PathSensitive/AnalysisManager.h +++ b/include/clang/Analysis/PathSensitive/AnalysisManager.h @@ -29,8 +29,8 @@ class AnalysisManager : public BugReporterData { Diagnostic &Diags; const LangOptions &LangInfo; - PathDiagnosticClient *PD; - + llvm::OwningPtr PD; + // Configurable components creators. StoreManagerCreator CreateStoreMgr; ConstraintManagerCreator CreateConstraintMgr; @@ -127,7 +127,7 @@ public: } virtual PathDiagnosticClient *getPathDiagnosticClient() { - return PD; + return PD.get(); } bool shouldVisualizeGraphviz() const { return VisualizeEGDot; } diff --git a/lib/Frontend/AnalysisConsumer.cpp b/lib/Frontend/AnalysisConsumer.cpp index 5af6c0112a..1ab3690745 100644 --- a/lib/Frontend/AnalysisConsumer.cpp +++ b/lib/Frontend/AnalysisConsumer.cpp @@ -84,7 +84,10 @@ namespace { const std::string OutDir; AnalyzerOptions Opts; - llvm::OwningPtr PD; + + // PD is owned by AnalysisManager. + PathDiagnosticClient *PD; + StoreManagerCreator CreateStoreMgr; ConstraintManagerCreator CreateConstraintMgr; @@ -107,7 +110,7 @@ namespace { switch (Opts.AnalysisDiagOpt) { default: #define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATEFN, AUTOCREATE) \ - case PD_##NAME: PD.reset(CREATEFN(OutDir, PP, PPF)); break; + case PD_##NAME: PD = CREATEFN(OutDir, PP, PPF); break; #include "clang/Frontend/Analyses.def" } } @@ -154,7 +157,7 @@ namespace { virtual void Initialize(ASTContext &Context) { Ctx = &Context; - Mgr.reset(new AnalysisManager(*Ctx, Diags, LOpts, PD.get(), + Mgr.reset(new AnalysisManager(*Ctx, Diags, LOpts, PD, CreateStoreMgr, CreateConstraintMgr, Opts.AnalyzerDisplayProgress, Opts.VisualizeEGDot, Opts.VisualizeEGUbi, @@ -221,7 +224,6 @@ void AnalysisConsumer::HandleTopLevelSingleDecl(Decl *D) { } void AnalysisConsumer::HandleTranslationUnit(ASTContext &C) { - if(!TranslationUnitActions.empty()) { for (Actions::iterator I = TranslationUnitActions.begin(), E = TranslationUnitActions.end(); I != E; ++I) @@ -237,11 +239,11 @@ void AnalysisConsumer::HandleTranslationUnit(ASTContext &C) { if (ObjCImplementationDecl* ID = dyn_cast(*I)) HandleCode(ID, 0, ObjCImplementationActions); } - + // Explicitly destroy the PathDiagnosticClient. This will flush its output. // FIXME: This should be replaced with something that doesn't rely on // side-effects in PathDiagnosticClient's destructor. - PD.reset(NULL); + Mgr.reset(NULL); } void AnalysisConsumer::HandleCode(Decl* D, Stmt* Body, Actions& actions) {