Diagnostic &Diags;
const LangOptions &LangInfo;
- PathDiagnosticClient *PD;
-
+ llvm::OwningPtr<PathDiagnosticClient> PD;
+
// Configurable components creators.
StoreManagerCreator CreateStoreMgr;
ConstraintManagerCreator CreateConstraintMgr;
}
virtual PathDiagnosticClient *getPathDiagnosticClient() {
- return PD;
+ return PD.get();
}
bool shouldVisualizeGraphviz() const { return VisualizeEGDot; }
const std::string OutDir;
AnalyzerOptions Opts;
- llvm::OwningPtr<PathDiagnosticClient> PD;
+
+ // PD is owned by AnalysisManager.
+ PathDiagnosticClient *PD;
+
StoreManagerCreator CreateStoreMgr;
ConstraintManagerCreator CreateConstraintMgr;
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"
}
}
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,
}
void AnalysisConsumer::HandleTranslationUnit(ASTContext &C) {
-
if(!TranslationUnitActions.empty()) {
for (Actions::iterator I = TranslationUnitActions.begin(),
E = TranslationUnitActions.end(); I != E; ++I)
if (ObjCImplementationDecl* ID = dyn_cast<ObjCImplementationDecl>(*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) {