AnalysisManager.h revision 243830
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
15218887Sdim#ifndef LLVM_CLANG_GR_ANALYSISMANAGER_H
16218887Sdim#define LLVM_CLANG_GR_ANALYSISMANAGER_H
17218887Sdim
18218887Sdim#include "clang/Analysis/AnalysisContext.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
26218887Sdimnamespace ento {
27218887Sdim  class CheckerManager;
28218887Sdim
29218887Sdimclass AnalysisManager : public BugReporterData {
30234353Sdim  virtual void anchor();
31234353Sdim  AnalysisDeclContextManager AnaCtxMgr;
32218887Sdim
33218887Sdim  ASTContext &Ctx;
34226633Sdim  DiagnosticsEngine &Diags;
35234353Sdim  const LangOptions &LangOpts;
36239462Sdim  PathDiagnosticConsumers PathConsumers;
37218887Sdim
38218887Sdim  // Configurable components creators.
39218887Sdim  StoreManagerCreator CreateStoreMgr;
40218887Sdim  ConstraintManagerCreator CreateConstraintMgr;
41218887Sdim
42218887Sdim  CheckerManager *CheckerMgr;
43218887Sdim
44218887Sdimpublic:
45243830Sdim  AnalyzerOptions &options;
46243830Sdim
47239462Sdim  AnalysisManager(ASTContext &ctx,DiagnosticsEngine &diags,
48239462Sdim                  const LangOptions &lang,
49239462Sdim                  const PathDiagnosticConsumers &Consumers,
50218887Sdim                  StoreManagerCreator storemgr,
51218887Sdim                  ConstraintManagerCreator constraintmgr,
52218887Sdim                  CheckerManager *checkerMgr,
53243830Sdim                  AnalyzerOptions &Options);
54218887Sdim
55239462Sdim  ~AnalysisManager();
56218887Sdim
57218887Sdim  void ClearContexts() {
58218887Sdim    AnaCtxMgr.clear();
59218887Sdim  }
60218887Sdim
61234353Sdim  AnalysisDeclContextManager& getAnalysisDeclContextManager() {
62218887Sdim    return AnaCtxMgr;
63218887Sdim  }
64218887Sdim
65218887Sdim  StoreManagerCreator getStoreManagerCreator() {
66218887Sdim    return CreateStoreMgr;
67218887Sdim  }
68218887Sdim
69218887Sdim  ConstraintManagerCreator getConstraintManagerCreator() {
70218887Sdim    return CreateConstraintMgr;
71218887Sdim  }
72218887Sdim
73218887Sdim  CheckerManager *getCheckerManager() const { return CheckerMgr; }
74218887Sdim
75218887Sdim  virtual ASTContext &getASTContext() {
76218887Sdim    return Ctx;
77218887Sdim  }
78218887Sdim
79218887Sdim  virtual SourceManager &getSourceManager() {
80218887Sdim    return getASTContext().getSourceManager();
81218887Sdim  }
82218887Sdim
83226633Sdim  virtual DiagnosticsEngine &getDiagnostic() {
84218887Sdim    return Diags;
85218887Sdim  }
86218887Sdim
87234353Sdim  const LangOptions &getLangOpts() const {
88234353Sdim    return LangOpts;
89218887Sdim  }
90218887Sdim
91239462Sdim  ArrayRef<PathDiagnosticConsumer*> getPathDiagnosticConsumers()  {
92239462Sdim    return PathConsumers;
93218887Sdim  }
94218887Sdim
95239462Sdim  void FlushDiagnostics();
96239462Sdim
97218887Sdim  bool shouldVisualize() const {
98243830Sdim    return options.visualizeExplodedGraphWithGraphViz ||
99243830Sdim           options.visualizeExplodedGraphWithUbiGraph;
100218887Sdim  }
101218887Sdim
102243830Sdim  bool shouldInlineCall() const {
103243830Sdim    return options.IPAMode != None;
104243830Sdim  }
105218887Sdim
106218887Sdim  CFG *getCFG(Decl const *D) {
107218887Sdim    return AnaCtxMgr.getContext(D)->getCFG();
108218887Sdim  }
109218887Sdim
110226633Sdim  template <typename T>
111226633Sdim  T *getAnalysis(Decl const *D) {
112226633Sdim    return AnaCtxMgr.getContext(D)->getAnalysis<T>();
113218887Sdim  }
114218887Sdim
115218887Sdim  ParentMap &getParentMap(Decl const *D) {
116218887Sdim    return AnaCtxMgr.getContext(D)->getParentMap();
117218887Sdim  }
118218887Sdim
119234353Sdim  AnalysisDeclContext *getAnalysisDeclContext(const Decl *D) {
120218887Sdim    return AnaCtxMgr.getContext(D);
121218887Sdim  }
122218887Sdim};
123218887Sdim
124234353Sdim} // enAnaCtxMgrspace
125218887Sdim
126218887Sdim} // end clang namespace
127218887Sdim
128218887Sdim#endif
129