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:
45622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek  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,
53622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek                  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  }
68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  AnalyzerOptions& getAnalyzerOptions() override {
70d95b70175646829c26344d5f0bda1ec3009f2a5bAnna Zaks    return options;
71d95b70175646829c26344d5f0bda1ec3009f2a5bAnna Zaks  }
72fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
73fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  ConstraintManagerCreator getConstraintManagerCreator() {
74fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return CreateConstraintMgr;
75fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7743dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis  CheckerManager *getCheckerManager() const { return CheckerMgr; }
7843dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis
79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ASTContext &getASTContext() override {
80fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return Ctx;
81fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceManager &getSourceManager() override {
845032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu    return getASTContext().getSourceManager();
85fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  DiagnosticsEngine &getDiagnostic() override {
88fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return Diags;
89fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
914e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  const LangOptions &getLangOpts() const {
924e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie    return LangOpts;
93fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ArrayRef<PathDiagnosticConsumer*> getPathDiagnosticConsumers() override {
96c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek    return PathConsumers;
97b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek  }
9818c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu
99c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek  void FlushDiagnostics();
100c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek
101fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldVisualize() const {
1023b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek    return options.visualizeExplodedGraphWithGraphViz ||
1033b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek           options.visualizeExplodedGraphWithUbiGraph;
104fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
105fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
106255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  bool shouldInlineCall() const {
107bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks    return options.getIPAMode() != IPAK_None;
108255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek  }
1097b99d12b4ca67fccdf5090761ba257732e954e75Zhongxing Xu
110b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  CFG *getCFG(Decl const *D) {
111b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu    return AnaCtxMgr.getContext(D)->getCFG();
112b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  }
113b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu
114a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek  template <typename T>
115a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek  T *getAnalysis(Decl const *D) {
116a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek    return AnaCtxMgr.getContext(D)->getAnalysis<T>();
117b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  }
118b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu
119b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  ParentMap &getParentMap(Decl const *D) {
120b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu    return AnaCtxMgr.getContext(D)->getParentMap();
121b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  }
122b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu
1231d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *getAnalysisDeclContext(const Decl *D) {
124c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu    return AnaCtxMgr.getContext(D);
125c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  }
126fda7832b000ff8927386f093b52c067641679469Zhongxing Xu};
127fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
128b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek} // enAnaCtxMgrspace
1295a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
1305a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end clang namespace
131fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
132fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#endif
133