AnalysisManager.h revision 261991
155714Skris//== AnalysisManager.h - Path sensitive analysis data manager ------*- C++ -*-//
255714Skris//
355714Skris//                     The LLVM Compiler Infrastructure
455714Skris//
555714Skris// This file is distributed under the University of Illinois Open Source
655714Skris// License. See LICENSE.TXT for details.
755714Skris//
859191Skris//===----------------------------------------------------------------------===//
959191Skris//
1059191Skris// This file defines the AnalysisManager class that manages the data and policy
1159191Skris// for path sensitive analysis.
1259191Skris//
1359191Skris//===----------------------------------------------------------------------===//
1459191Skris
1559191Skris#ifndef LLVM_CLANG_GR_ANALYSISMANAGER_H
1659191Skris#define LLVM_CLANG_GR_ANALYSISMANAGER_H
1759191Skris
1859191Skris#include "clang/Analysis/AnalysisContext.h"
1959191Skris#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
2059191Skris#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
2159191Skris#include "clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h"
2259191Skris#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h"
2359191Skris
2459191Skrisnamespace clang {
2559191Skris
2659191Skrisnamespace ento {
2759191Skris  class CheckerManager;
2859191Skris
2959191Skrisclass AnalysisManager : public BugReporterData {
3059191Skris  virtual void anchor();
3159191Skris  AnalysisDeclContextManager AnaCtxMgr;
3259191Skris
3359191Skris  ASTContext &Ctx;
3459191Skris  DiagnosticsEngine &Diags;
3559191Skris  const LangOptions &LangOpts;
3659191Skris  PathDiagnosticConsumers PathConsumers;
3759191Skris
3859191Skris  // Configurable components creators.
3959191Skris  StoreManagerCreator CreateStoreMgr;
4059191Skris  ConstraintManagerCreator CreateConstraintMgr;
4159191Skris
4259191Skris  CheckerManager *CheckerMgr;
4359191Skris
4459191Skrispublic:
4559191Skris  AnalyzerOptions &options;
4659191Skris
4759191Skris  AnalysisManager(ASTContext &ctx,DiagnosticsEngine &diags,
4859191Skris                  const LangOptions &lang,
4959191Skris                  const PathDiagnosticConsumers &Consumers,
5059191Skris                  StoreManagerCreator storemgr,
5159191Skris                  ConstraintManagerCreator constraintmgr,
5259191Skris                  CheckerManager *checkerMgr,
5355714Skris                  AnalyzerOptions &Options);
5455714Skris
5555714Skris  ~AnalysisManager();
5655714Skris
5755714Skris  void ClearContexts() {
5855714Skris    AnaCtxMgr.clear();
5955714Skris  }
6055714Skris
6155714Skris  AnalysisDeclContextManager& getAnalysisDeclContextManager() {
6255714Skris    return AnaCtxMgr;
6355714Skris  }
6455714Skris
6555714Skris  StoreManagerCreator getStoreManagerCreator() {
6655714Skris    return CreateStoreMgr;
6755714Skris  }
6855714Skris
6955714Skris  AnalyzerOptions& getAnalyzerOptions() {
7055714Skris    return options;
7155714Skris  }
7255714Skris
7355714Skris  ConstraintManagerCreator getConstraintManagerCreator() {
7455714Skris    return CreateConstraintMgr;
7555714Skris  }
7655714Skris
7755714Skris  CheckerManager *getCheckerManager() const { return CheckerMgr; }
7855714Skris
7955714Skris  virtual ASTContext &getASTContext() {
8055714Skris    return Ctx;
8155714Skris  }
8255714Skris
8355714Skris  virtual SourceManager &getSourceManager() {
8455714Skris    return getASTContext().getSourceManager();
8555714Skris  }
8655714Skris
8755714Skris  virtual DiagnosticsEngine &getDiagnostic() {
8855714Skris    return Diags;
8955714Skris  }
9055714Skris
9155714Skris  const LangOptions &getLangOpts() const {
9255714Skris    return LangOpts;
9355714Skris  }
9455714Skris
9555714Skris  ArrayRef<PathDiagnosticConsumer*> getPathDiagnosticConsumers()  {
9655714Skris    return PathConsumers;
9755714Skris  }
9855714Skris
9955714Skris  void FlushDiagnostics();
10055714Skris
10155714Skris  bool shouldVisualize() const {
10255714Skris    return options.visualizeExplodedGraphWithGraphViz ||
10355714Skris           options.visualizeExplodedGraphWithUbiGraph;
10455714Skris  }
10555714Skris
10655714Skris  bool shouldInlineCall() const {
10755714Skris    return options.getIPAMode() != IPAK_None;
10855714Skris  }
10955714Skris
11055714Skris  CFG *getCFG(Decl const *D) {
111    return AnaCtxMgr.getContext(D)->getCFG();
112  }
113
114  template <typename T>
115  T *getAnalysis(Decl const *D) {
116    return AnaCtxMgr.getContext(D)->getAnalysis<T>();
117  }
118
119  ParentMap &getParentMap(Decl const *D) {
120    return AnaCtxMgr.getContext(D)->getParentMap();
121  }
122
123  AnalysisDeclContext *getAnalysisDeclContext(const Decl *D) {
124    return AnaCtxMgr.getContext(D);
125  }
126};
127
128} // enAnaCtxMgrspace
129
130} // end clang namespace
131
132#endif
133