AnalysisManager.h revision 327952
1218887Sdim//== AnalysisManager.h - Path sensitive analysis data manager ------*- C++ -*-//
2218887Sdim//
3218887Sdim//                     The LLVM Compiler Infrastructure
4218887Sdim//
5218887Sdim// This file is distributed under the University of Illinois Open Source
6218887Sdim// License. See LICENSE.TXT for details.
7218887Sdim//
8218887Sdim//===----------------------------------------------------------------------===//
9218887Sdim//
10218887Sdim// This file defines the AnalysisManager class that manages the data and policy
11218887Sdim// for path sensitive analysis.
12218887Sdim//
13218887Sdim//===----------------------------------------------------------------------===//
14218887Sdim
15280031Sdim#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_ANALYSISMANAGER_H
16280031Sdim#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_ANALYSISMANAGER_H
17218887Sdim
18327952Sdim#include "clang/Analysis/AnalysisDeclContext.h"
19243830Sdim#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
20218887Sdim#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
21218887Sdim#include "clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h"
22239462Sdim#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h"
23218887Sdim
24218887Sdimnamespace clang {
25218887Sdim
26280031Sdimclass CodeInjector;
27280031Sdim
28218887Sdimnamespace ento {
29218887Sdim  class CheckerManager;
30218887Sdim
31218887Sdimclass AnalysisManager : public BugReporterData {
32234353Sdim  virtual void anchor();
33234353Sdim  AnalysisDeclContextManager AnaCtxMgr;
34218887Sdim
35218887Sdim  ASTContext &Ctx;
36226633Sdim  DiagnosticsEngine &Diags;
37234353Sdim  const LangOptions &LangOpts;
38239462Sdim  PathDiagnosticConsumers PathConsumers;
39218887Sdim
40218887Sdim  // Configurable components creators.
41218887Sdim  StoreManagerCreator CreateStoreMgr;
42218887Sdim  ConstraintManagerCreator CreateConstraintMgr;
43218887Sdim
44218887Sdim  CheckerManager *CheckerMgr;
45218887Sdim
46218887Sdimpublic:
47243830Sdim  AnalyzerOptions &options;
48243830Sdim
49239462Sdim  AnalysisManager(ASTContext &ctx,DiagnosticsEngine &diags,
50239462Sdim                  const LangOptions &lang,
51239462Sdim                  const PathDiagnosticConsumers &Consumers,
52218887Sdim                  StoreManagerCreator storemgr,
53218887Sdim                  ConstraintManagerCreator constraintmgr,
54218887Sdim                  CheckerManager *checkerMgr,
55280031Sdim                  AnalyzerOptions &Options,
56280031Sdim                  CodeInjector* injector = nullptr);
57218887Sdim
58288943Sdim  ~AnalysisManager() override;
59288943Sdim
60218887Sdim  void ClearContexts() {
61218887Sdim    AnaCtxMgr.clear();
62218887Sdim  }
63218887Sdim
64234353Sdim  AnalysisDeclContextManager& getAnalysisDeclContextManager() {
65218887Sdim    return AnaCtxMgr;
66218887Sdim  }
67218887Sdim
68218887Sdim  StoreManagerCreator getStoreManagerCreator() {
69218887Sdim    return CreateStoreMgr;
70218887Sdim  }
71276479Sdim
72276479Sdim  AnalyzerOptions& getAnalyzerOptions() override {
73261991Sdim    return options;
74261991Sdim  }
75218887Sdim
76218887Sdim  ConstraintManagerCreator getConstraintManagerCreator() {
77218887Sdim    return CreateConstraintMgr;
78218887Sdim  }
79218887Sdim
80218887Sdim  CheckerManager *getCheckerManager() const { return CheckerMgr; }
81218887Sdim
82276479Sdim  ASTContext &getASTContext() override {
83218887Sdim    return Ctx;
84218887Sdim  }
85218887Sdim
86276479Sdim  SourceManager &getSourceManager() override {
87218887Sdim    return getASTContext().getSourceManager();
88218887Sdim  }
89218887Sdim
90276479Sdim  DiagnosticsEngine &getDiagnostic() override {
91218887Sdim    return Diags;
92218887Sdim  }
93218887Sdim
94234353Sdim  const LangOptions &getLangOpts() const {
95234353Sdim    return LangOpts;
96218887Sdim  }
97218887Sdim
98276479Sdim  ArrayRef<PathDiagnosticConsumer*> getPathDiagnosticConsumers() override {
99239462Sdim    return PathConsumers;
100218887Sdim  }
101218887Sdim
102239462Sdim  void FlushDiagnostics();
103239462Sdim
104218887Sdim  bool shouldVisualize() const {
105243830Sdim    return options.visualizeExplodedGraphWithGraphViz ||
106243830Sdim           options.visualizeExplodedGraphWithUbiGraph;
107218887Sdim  }
108218887Sdim
109243830Sdim  bool shouldInlineCall() const {
110249423Sdim    return options.getIPAMode() != IPAK_None;
111243830Sdim  }
112218887Sdim
113218887Sdim  CFG *getCFG(Decl const *D) {
114218887Sdim    return AnaCtxMgr.getContext(D)->getCFG();
115218887Sdim  }
116218887Sdim
117226633Sdim  template <typename T>
118226633Sdim  T *getAnalysis(Decl const *D) {
119226633Sdim    return AnaCtxMgr.getContext(D)->getAnalysis<T>();
120218887Sdim  }
121218887Sdim
122218887Sdim  ParentMap &getParentMap(Decl const *D) {
123218887Sdim    return AnaCtxMgr.getContext(D)->getParentMap();
124218887Sdim  }
125218887Sdim
126234353Sdim  AnalysisDeclContext *getAnalysisDeclContext(const Decl *D) {
127218887Sdim    return AnaCtxMgr.getContext(D);
128218887Sdim  }
129218887Sdim};
130218887Sdim
131234353Sdim} // enAnaCtxMgrspace
132218887Sdim
133218887Sdim} // end clang namespace
134218887Sdim
135218887Sdim#endif
136