1 //===-- AnalysisManager.cpp -------------------------------------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
11
12 using namespace clang;
13 using namespace ento;
14
anchor()15 void AnalysisManager::anchor() { }
16
AnalysisManager(ASTContext & ASTCtx,DiagnosticsEngine & diags,const PathDiagnosticConsumers & PDC,StoreManagerCreator storemgr,ConstraintManagerCreator constraintmgr,CheckerManager * checkerMgr,AnalyzerOptions & Options,CodeInjector * injector)17 AnalysisManager::AnalysisManager(ASTContext &ASTCtx, DiagnosticsEngine &diags,
18 const PathDiagnosticConsumers &PDC,
19 StoreManagerCreator storemgr,
20 ConstraintManagerCreator constraintmgr,
21 CheckerManager *checkerMgr,
22 AnalyzerOptions &Options,
23 CodeInjector *injector)
24 : AnaCtxMgr(
25 ASTCtx, Options.UnoptimizedCFG,
26 Options.ShouldIncludeImplicitDtorsInCFG,
27 /*AddInitializers=*/true,
28 Options.ShouldIncludeTemporaryDtorsInCFG,
29 Options.ShouldIncludeLifetimeInCFG,
30 // Adding LoopExit elements to the CFG is a requirement for loop
31 // unrolling.
32 Options.ShouldIncludeLoopExitInCFG ||
33 Options.ShouldUnrollLoops,
34 Options.ShouldIncludeScopesInCFG,
35 Options.ShouldSynthesizeBodies,
36 Options.ShouldConditionalizeStaticInitializers,
37 /*addCXXNewAllocator=*/true,
38 Options.ShouldIncludeRichConstructorsInCFG,
39 Options.ShouldElideConstructors, injector),
40 Ctx(ASTCtx), Diags(diags), LangOpts(ASTCtx.getLangOpts()),
41 PathConsumers(PDC), CreateStoreMgr(storemgr),
42 CreateConstraintMgr(constraintmgr), CheckerMgr(checkerMgr),
43 options(Options) {
44 AnaCtxMgr.getCFGBuildOptions().setAllAlwaysAdd();
45 }
46
~AnalysisManager()47 AnalysisManager::~AnalysisManager() {
48 FlushDiagnostics();
49 for (PathDiagnosticConsumers::iterator I = PathConsumers.begin(),
50 E = PathConsumers.end(); I != E; ++I) {
51 delete *I;
52 }
53 }
54
FlushDiagnostics()55 void AnalysisManager::FlushDiagnostics() {
56 PathDiagnosticConsumer::FilesMade filesMade;
57 for (PathDiagnosticConsumers::iterator I = PathConsumers.begin(),
58 E = PathConsumers.end();
59 I != E; ++I) {
60 (*I)->FlushDiagnostics(&filesMade);
61 }
62 }
63