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 
15 void AnalysisManager::anchor() { }
16 
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, Options.includeImplicitDtorsInCFG(),
26           /*AddInitializers=*/true, Options.includeTemporaryDtorsInCFG(),
27           Options.includeLifetimeInCFG(),
28           // Adding LoopExit elements to the CFG is a requirement for loop
29           // unrolling.
30           Options.includeLoopExitInCFG() || Options.shouldUnrollLoops(),
31           Options.includeScopesInCFG(), Options.shouldSynthesizeBodies(),
32           Options.shouldConditionalizeStaticInitializers(),
33           /*addCXXNewAllocator=*/true, Options.includeRichConstructorsInCFG(),
34           Options.shouldElideConstructors(), injector),
35       Ctx(ASTCtx), Diags(diags), LangOpts(ASTCtx.getLangOpts()),
36       PathConsumers(PDC), CreateStoreMgr(storemgr),
37       CreateConstraintMgr(constraintmgr), CheckerMgr(checkerMgr),
38       options(Options) {
39   AnaCtxMgr.getCFGBuildOptions().setAllAlwaysAdd();
40 }
41 
42 AnalysisManager::~AnalysisManager() {
43   FlushDiagnostics();
44   for (PathDiagnosticConsumers::iterator I = PathConsumers.begin(),
45        E = PathConsumers.end(); I != E; ++I) {
46     delete *I;
47   }
48 }
49 
50 void AnalysisManager::FlushDiagnostics() {
51   PathDiagnosticConsumer::FilesMade filesMade;
52   for (PathDiagnosticConsumers::iterator I = PathConsumers.begin(),
53        E = PathConsumers.end();
54        I != E; ++I) {
55     (*I)->FlushDiagnostics(&filesMade);
56   }
57 }
58