AnalysisManager.h revision 9b823e8e1ccb8a2cb49923bad22a80ca96f41f92
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
15fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#ifndef LLVM_CLANG_ANALYSIS_ANALYSISMANAGER_H
16fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#define LLVM_CLANG_ANALYSIS_ANALYSISMANAGER_H
17fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
181309f9a3b225ea846e5822691c39a77423125505Ted Kremenek#include "clang/Analysis/AnalysisContext.h"
196b67630d5df195f4fe0e4273061c016901d69681Ted Kremenek#include "clang/Checker/BugReporter/BugReporter.h"
206b67630d5df195f4fe0e4273061c016901d69681Ted Kremenek#include "clang/Checker/BugReporter/PathDiagnostic.h"
21fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
22fda7832b000ff8927386f093b52c067641679469Zhongxing Xunamespace clang {
23fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
24c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xunamespace idx {
25c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  class Indexer;
26c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  class TranslationUnit;
27c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu}
28c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu
29fda7832b000ff8927386f093b52c067641679469Zhongxing Xuclass AnalysisManager : public BugReporterData {
30b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  AnalysisContextManager AnaCtxMgr;
3118c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu  LocationContextManager LocCtxMgr;
32fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
33fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  ASTContext &Ctx;
34fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  Diagnostic &Diags;
35fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  const LangOptions &LangInfo;
36fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
37d07a0d0279c09d1017f8450fce575a94dc9703c0Zhongxing Xu  llvm::OwningPtr<PathDiagnosticClient> PD;
38d07a0d0279c09d1017f8450fce575a94dc9703c0Zhongxing Xu
39fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  // Configurable components creators.
40fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  StoreManagerCreator CreateStoreMgr;
41fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  ConstraintManagerCreator CreateConstraintMgr;
42fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
43c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  /// \brief Provide function definitions in other translation units. This is
44c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  /// NULL if we don't have multiple translation units. AnalysisManager does
45c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  /// not own the Indexer.
46c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  idx::Indexer *Idxer;
47c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu
48fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  enum AnalysisScope { ScopeTU, ScopeDecl } AScope;
491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
506362b893731ccf4480a96527db9e55e04b801503Zhongxing Xu  // The maximum number of exploded nodes the analyzer will generate.
51c09289d104b8e01ecd998e3f08b2b0561049e1dcZhongxing Xu  unsigned MaxNodes;
52c09289d104b8e01ecd998e3f08b2b0561049e1dcZhongxing Xu
536362b893731ccf4480a96527db9e55e04b801503Zhongxing Xu  // The maximum number of times the analyzer will go through a loop.
546362b893731ccf4480a96527db9e55e04b801503Zhongxing Xu  unsigned MaxLoop;
556362b893731ccf4480a96527db9e55e04b801503Zhongxing Xu
56fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool VisualizeEGDot;
57fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool VisualizeEGUbi;
58fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool PurgeDead;
595032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu
605032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu  /// EargerlyAssume - A flag indicating how the engine should handle
615032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu  //   expressions such as: 'x = (y != 0)'.  When this flag is true then
625032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu  //   the subexpression 'y != 0' will be eagerly assumed to be true or false,
635032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu  //   thus evaluating it to the integers 0 or 1 respectively.  The upside
645032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu  //   is that this can increase analysis precision until we have a better way
655032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu  //   to lazily evaluate such logic.  The downside is that it eagerly
665032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu  //   bifurcates paths.
67fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool EagerlyAssume;
68fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool TrimGraph;
697b99d12b4ca67fccdf5090761ba257732e954e75Zhongxing Xu  bool InlineCall;
70fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
71fda7832b000ff8927386f093b52c067641679469Zhongxing Xupublic:
72b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  AnalysisManager(ASTContext &ctx, Diagnostic &diags,
73fda7832b000ff8927386f093b52c067641679469Zhongxing Xu                  const LangOptions &lang, PathDiagnosticClient *pd,
74fda7832b000ff8927386f093b52c067641679469Zhongxing Xu                  StoreManagerCreator storemgr,
75c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu                  ConstraintManagerCreator constraintmgr,
76c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu                  idx::Indexer *idxer,
77c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu                  unsigned maxnodes, unsigned maxloop,
787b99d12b4ca67fccdf5090761ba257732e954e75Zhongxing Xu                  bool vizdot, bool vizubi, bool purge, bool eager, bool trim,
799b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek                  bool inlinecall, bool useUnoptimizedCFG)
80fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
819b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek    : AnaCtxMgr(useUnoptimizedCFG), Ctx(ctx), Diags(diags), LangInfo(lang),
829b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek      PD(pd),
83c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu      CreateStoreMgr(storemgr), CreateConstraintMgr(constraintmgr),Idxer(idxer),
846362b893731ccf4480a96527db9e55e04b801503Zhongxing Xu      AScope(ScopeDecl), MaxNodes(maxnodes), MaxLoop(maxloop),
85fda7832b000ff8927386f093b52c067641679469Zhongxing Xu      VisualizeEGDot(vizdot), VisualizeEGUbi(vizubi), PurgeDead(purge),
867b99d12b4ca67fccdf5090761ba257732e954e75Zhongxing Xu      EagerlyAssume(eager), TrimGraph(trim), InlineCall(inlinecall) {}
8758f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek
88b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek  ~AnalysisManager() { FlushDiagnostics(); }
89b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek
9058f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek  void ClearContexts() {
9158f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek    LocCtxMgr.clear();
9258f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek    AnaCtxMgr.clear();
9358f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek  }
949b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek
959b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek  AnalysisContextManager& getAnalysisContextManager() {
969b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek    return AnaCtxMgr;
979b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek  }
981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
99fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  StoreManagerCreator getStoreManagerCreator() {
100fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return CreateStoreMgr;
1017177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  }
102fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
103fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  ConstraintManagerCreator getConstraintManagerCreator() {
104fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return CreateConstraintMgr;
105fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1072ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu  idx::Indexer *getIndexer() const { return Idxer; }
1082ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu
1095032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu  virtual ASTContext &getASTContext() {
110fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return Ctx;
111fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
1121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
113fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  virtual SourceManager &getSourceManager() {
1145032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu    return getASTContext().getSourceManager();
115fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
117fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  virtual Diagnostic &getDiagnostic() {
118fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return Diags;
119fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
1201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
121fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  const LangOptions &getLangOptions() const {
122fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return LangInfo;
123fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
125fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  virtual PathDiagnosticClient *getPathDiagnosticClient() {
1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return PD.get();
127fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
128b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek
129b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek  void FlushDiagnostics() {
130b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek    if (PD.get())
131b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek      PD->FlushDiagnostics();
132b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek  }
13318c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu
134c09289d104b8e01ecd998e3f08b2b0561049e1dcZhongxing Xu  unsigned getMaxNodes() const { return MaxNodes; }
135c09289d104b8e01ecd998e3f08b2b0561049e1dcZhongxing Xu
1366362b893731ccf4480a96527db9e55e04b801503Zhongxing Xu  unsigned getMaxLoop() const { return MaxLoop; }
1376362b893731ccf4480a96527db9e55e04b801503Zhongxing Xu
138fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldVisualizeGraphviz() const { return VisualizeEGDot; }
139fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
140fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldVisualizeUbigraph() const { return VisualizeEGUbi; }
141fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
142fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldVisualize() const {
143fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return VisualizeEGDot || VisualizeEGUbi;
144fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
145fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
146fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldTrimGraph() const { return TrimGraph; }
147fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
148fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldPurgeDead() const { return PurgeDead; }
149fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
150fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldEagerlyAssume() const { return EagerlyAssume; }
151fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
1527b99d12b4ca67fccdf5090761ba257732e954e75Zhongxing Xu  bool shouldInlineCall() const { return InlineCall; }
1537b99d12b4ca67fccdf5090761ba257732e954e75Zhongxing Xu
154c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  bool hasIndexer() const { return Idxer != 0; }
155c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu
156c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  const AnalysisContext *getAnalysisContextInAnotherTU(const Decl *D);
157c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu
158b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  CFG *getCFG(Decl const *D) {
159b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu    return AnaCtxMgr.getContext(D)->getCFG();
160b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  }
161b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu
162b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  LiveVariables *getLiveVariables(Decl const *D) {
163b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu    return AnaCtxMgr.getContext(D)->getLiveVariables();
164b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  }
165b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu
166b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  ParentMap &getParentMap(Decl const *D) {
167b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu    return AnaCtxMgr.getContext(D)->getParentMap();
168b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  }
169b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu
1702ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu  AnalysisContext *getAnalysisContext(const Decl *D) {
171c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu    return AnaCtxMgr.getContext(D);
172c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  }
173c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu
1742ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu  AnalysisContext *getAnalysisContext(const Decl *D, idx::TranslationUnit *TU) {
1752ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu    return AnaCtxMgr.getContext(D, TU);
1762ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu  }
1772ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu
178c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  const StackFrameContext *getStackFrame(AnalysisContext *Ctx,
179c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu                                         LocationContext const *Parent,
180c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu                                         Stmt const *S, const CFGBlock *Blk,
181c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu                                         unsigned Idx) {
182c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu    return LocCtxMgr.getStackFrame(Ctx, Parent, S, Blk, Idx);
183c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  }
184c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu
185798d2ca60d1cd6de70d28a5ce60337a2b03a663fZhongxing Xu  // Get the top level stack frame.
186c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  const StackFrameContext *getStackFrame(Decl const *D,
1872ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu                                         idx::TranslationUnit *TU) {
188c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu    return LocCtxMgr.getStackFrame(AnaCtxMgr.getContext(D, TU), 0, 0, 0, 0);
189b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  }
190798d2ca60d1cd6de70d28a5ce60337a2b03a663fZhongxing Xu
191798d2ca60d1cd6de70d28a5ce60337a2b03a663fZhongxing Xu  // Get a stack frame with parent.
192798d2ca60d1cd6de70d28a5ce60337a2b03a663fZhongxing Xu  StackFrameContext const *getStackFrame(Decl const *D,
193798d2ca60d1cd6de70d28a5ce60337a2b03a663fZhongxing Xu                                         LocationContext const *Parent,
19462d399e1880aacd9dc494fce374245b0da915adaZhongxing Xu                                         Stmt const *S, const CFGBlock *Blk,
19562d399e1880aacd9dc494fce374245b0da915adaZhongxing Xu                                         unsigned Idx) {
19662d399e1880aacd9dc494fce374245b0da915adaZhongxing Xu    return LocCtxMgr.getStackFrame(AnaCtxMgr.getContext(D), Parent, S, Blk,Idx);
197798d2ca60d1cd6de70d28a5ce60337a2b03a663fZhongxing Xu  }
198fda7832b000ff8927386f093b52c067641679469Zhongxing Xu};
199fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
200fda7832b000ff8927386f093b52c067641679469Zhongxing Xu}
201fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
202fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#endif
203