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
12using namespace clang;
13using namespace ento;
14
15void AnalysisManager::anchor() { }
16
17AnalysisManager::AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags,
18                                 const LangOptions &lang,
19                                 const PathDiagnosticConsumers &PDC,
20                                 StoreManagerCreator storemgr,
21                                 ConstraintManagerCreator constraintmgr,
22                                 CheckerManager *checkerMgr,
23                                 AnalyzerOptions &Options,
24                                 CodeInjector *injector)
25  : AnaCtxMgr(Options.UnoptimizedCFG,
26              /*AddImplicitDtors=*/true,
27              /*AddInitializers=*/true,
28              Options.includeTemporaryDtorsInCFG(),
29              Options.shouldSynthesizeBodies(),
30              Options.shouldConditionalizeStaticInitializers(),
31              /*addCXXNewAllocator=*/true,
32              injector),
33    Ctx(ctx),
34    Diags(diags),
35    LangOpts(lang),
36    PathConsumers(PDC),
37    CreateStoreMgr(storemgr), CreateConstraintMgr(constraintmgr),
38    CheckerMgr(checkerMgr),
39    options(Options) {
40  AnaCtxMgr.getCFGBuildOptions().setAllAlwaysAdd();
41}
42
43AnalysisManager::~AnalysisManager() {
44  FlushDiagnostics();
45  for (PathDiagnosticConsumers::iterator I = PathConsumers.begin(),
46       E = PathConsumers.end(); I != E; ++I) {
47    delete *I;
48  }
49}
50
51void AnalysisManager::FlushDiagnostics() {
52  PathDiagnosticConsumer::FilesMade filesMade;
53  for (PathDiagnosticConsumers::iterator I = PathConsumers.begin(),
54       E = PathConsumers.end();
55       I != E; ++I) {
56    (*I)->FlushDiagnostics(&filesMade);
57  }
58}
59