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
15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_ANALYSISMANAGER_H
16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_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
26176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass CodeInjector;
27176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
289ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento {
2943dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis  class CheckerManager;
305a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
31fda7832b000ff8927386f093b52c067641679469Zhongxing Xuclass AnalysisManager : public BugReporterData {
3299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
331d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContextManager AnaCtxMgr;
34fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
35fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  ASTContext &Ctx;
36d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie  DiagnosticsEngine &Diags;
374e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  const LangOptions &LangOpts;
38c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek  PathDiagnosticConsumers PathConsumers;
39d07a0d0279c09d1017f8450fce575a94dc9703c0Zhongxing Xu
40fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  // Configurable components creators.
41fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  StoreManagerCreator CreateStoreMgr;
42fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  ConstraintManagerCreator CreateConstraintMgr;
43fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
4443dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis  CheckerManager *CheckerMgr;
4543dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis
46fda7832b000ff8927386f093b52c067641679469Zhongxing Xupublic:
47622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  AnalyzerOptions &options;
487b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek
49c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek  AnalysisManager(ASTContext &ctx,DiagnosticsEngine &diags,
50c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek                  const LangOptions &lang,
51c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek                  const PathDiagnosticConsumers &Consumers,
52fda7832b000ff8927386f093b52c067641679469Zhongxing Xu                  StoreManagerCreator storemgr,
53c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu                  ConstraintManagerCreator constraintmgr,
5443dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis                  CheckerManager *checkerMgr,
55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  AnalyzerOptions &Options,
56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                  CodeInjector* injector = nullptr);
574fed22cdd8bb7d98127853ebb3f42be66bf2ce59Ted Kremenek
5833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar  ~AnalysisManager() override;
5933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar
6058f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek  void ClearContexts() {
6158f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek    AnaCtxMgr.clear();
6258f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek  }
639b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek
641d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContextManager& getAnalysisDeclContextManager() {
659b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek    return AnaCtxMgr;
669b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek  }
671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
68fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  StoreManagerCreator getStoreManagerCreator() {
69fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return CreateStoreMgr;
707177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  }
71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  AnalyzerOptions& getAnalyzerOptions() override {
73d95b70175646829c26344d5f0bda1ec3009f2a5bAnna Zaks    return options;
74d95b70175646829c26344d5f0bda1ec3009f2a5bAnna Zaks  }
75fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
76fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  ConstraintManagerCreator getConstraintManagerCreator() {
77fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return CreateConstraintMgr;
78fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8043dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis  CheckerManager *getCheckerManager() const { return CheckerMgr; }
8143dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis
82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ASTContext &getASTContext() override {
83fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return Ctx;
84fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceManager &getSourceManager() override {
875032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu    return getASTContext().getSourceManager();
88fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  DiagnosticsEngine &getDiagnostic() override {
91fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return Diags;
92fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
944e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  const LangOptions &getLangOpts() const {
954e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie    return LangOpts;
96fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ArrayRef<PathDiagnosticConsumer*> getPathDiagnosticConsumers() override {
99c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek    return PathConsumers;
100b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek  }
10118c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu
102c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek  void FlushDiagnostics();
103c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek
104fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldVisualize() const {
1053b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek    return options.visualizeExplodedGraphWithGraphViz ||
1063b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek           options.visualizeExplodedGraphWithUbiGraph;
107fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
108fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
109255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  bool shouldInlineCall() const {
110bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    return options.getIPAMode() != IPAK_None;
111255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  }
1127b99d12b4ca67fccdf5090761ba257732e954e75Zhongxing Xu
113b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  CFG *getCFG(Decl const *D) {
114b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu    return AnaCtxMgr.getContext(D)->getCFG();
115b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  }
116b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu
117a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek  template <typename T>
118a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek  T *getAnalysis(Decl const *D) {
119a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek    return AnaCtxMgr.getContext(D)->getAnalysis<T>();
120b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  }
121b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu
122b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  ParentMap &getParentMap(Decl const *D) {
123b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu    return AnaCtxMgr.getContext(D)->getParentMap();
124b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  }
125b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu
1261d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *getAnalysisDeclContext(const Decl *D) {
127c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu    return AnaCtxMgr.getContext(D);
128c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  }
129fda7832b000ff8927386f093b52c067641679469Zhongxing Xu};
130fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
131b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek} // enAnaCtxMgrspace
1325a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
1335a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end clang namespace
134fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
135fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#endif
136