AnalysisManager.h revision 987695a5ddd78beca784d4e503ffbc2dc879181a
1bb8e6488bda12b41b32fc22397a44510cacdac50Zhongxing Xu//== AnalysisManager.h - Path sensitive analysis data manager ------*- C++ -*-//
2fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//
3fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//                     The LLVM Compiler Infrastructure
4fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//
5fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// This file is distributed under the University of Illinois Open Source
6fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// License. See LICENSE.TXT for details.
7fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//
8fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//===----------------------------------------------------------------------===//
9fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//
10fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// This file defines the AnalysisManager class that manages the data and policy
11fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// for path sensitive analysis.
12fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//
13fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//===----------------------------------------------------------------------===//
14fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
155a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#ifndef LLVM_CLANG_GR_ANALYSISMANAGER_H
165a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#define LLVM_CLANG_GR_ANALYSISMANAGER_H
17fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
181309f9a3b225ea846e5822691c39a77423125505Ted Kremenek#include "clang/Analysis/AnalysisContext.h"
19987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
209b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
219b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h"
22c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h"
23fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
24fda7832b000ff8927386f093b52c067641679469Zhongxing Xunamespace clang {
25fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
269ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento {
2743dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis  class CheckerManager;
285a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
29fda7832b000ff8927386f093b52c067641679469Zhongxing Xuclass AnalysisManager : public BugReporterData {
3099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
311d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContextManager AnaCtxMgr;
32fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
33fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  ASTContext &Ctx;
34d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie  DiagnosticsEngine &Diags;
354e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  const LangOptions &LangOpts;
36c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek  PathDiagnosticConsumers PathConsumers;
37d07a0d0279c09d1017f8450fce575a94dc9703c0Zhongxing Xu
38fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  // Configurable components creators.
39fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  StoreManagerCreator CreateStoreMgr;
40fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  ConstraintManagerCreator CreateConstraintMgr;
41fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
4243dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis  CheckerManager *CheckerMgr;
4343dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis
44fda7832b000ff8927386f093b52c067641679469Zhongxing Xupublic:
45255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  const AnalyzerOptions &options;
467b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek
47c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek  AnalysisManager(ASTContext &ctx,DiagnosticsEngine &diags,
48c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek                  const LangOptions &lang,
49c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek                  const PathDiagnosticConsumers &Consumers,
50fda7832b000ff8927386f093b52c067641679469Zhongxing Xu                  StoreManagerCreator storemgr,
51c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu                  ConstraintManagerCreator constraintmgr,
5243dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis                  CheckerManager *checkerMgr,
53255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek                  const AnalyzerOptions &Options);
544fed22cdd8bb7d98127853ebb3f42be66bf2ce59Ted Kremenek
55c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek  ~AnalysisManager();
56b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek
5758f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek  void ClearContexts() {
5858f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek    AnaCtxMgr.clear();
5958f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek  }
609b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek
611d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContextManager& getAnalysisDeclContextManager() {
629b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek    return AnaCtxMgr;
639b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek  }
641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
65fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  StoreManagerCreator getStoreManagerCreator() {
66fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return CreateStoreMgr;
677177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  }
68fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
69fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  ConstraintManagerCreator getConstraintManagerCreator() {
70fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return CreateConstraintMgr;
71fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7343dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis  CheckerManager *getCheckerManager() const { return CheckerMgr; }
7443dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis
755032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu  virtual ASTContext &getASTContext() {
76fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return Ctx;
77fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
79fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  virtual SourceManager &getSourceManager() {
805032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu    return getASTContext().getSourceManager();
81fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
83d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie  virtual DiagnosticsEngine &getDiagnostic() {
84fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return Diags;
85fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
874e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  const LangOptions &getLangOpts() const {
884e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie    return LangOpts;
89fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
91c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek  ArrayRef<PathDiagnosticConsumer*> getPathDiagnosticConsumers()  {
92c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek    return PathConsumers;
93b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek  }
9418c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu
95c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek  void FlushDiagnostics();
96c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek
97fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldVisualize() const {
983b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek    return options.visualizeExplodedGraphWithGraphViz ||
993b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek           options.visualizeExplodedGraphWithUbiGraph;
100fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
101fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
102255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  bool shouldInlineCall() const {
103255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek    return options.IPAMode != None;
104255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  }
1057b99d12b4ca67fccdf5090761ba257732e954e75Zhongxing Xu
106b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  CFG *getCFG(Decl const *D) {
107b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu    return AnaCtxMgr.getContext(D)->getCFG();
108b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  }
109b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu
110a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek  template <typename T>
111a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek  T *getAnalysis(Decl const *D) {
112a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek    return AnaCtxMgr.getContext(D)->getAnalysis<T>();
113b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  }
114b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu
115b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  ParentMap &getParentMap(Decl const *D) {
116b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu    return AnaCtxMgr.getContext(D)->getParentMap();
117b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  }
118b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu
1191d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *getAnalysisDeclContext(const Decl *D) {
120c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu    return AnaCtxMgr.getContext(D);
121c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  }
122fda7832b000ff8927386f093b52c067641679469Zhongxing Xu};
123fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
124b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek} // enAnaCtxMgrspace
1255a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
1265a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end clang namespace
127fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
128fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#endif
129