AnalysisManager.h revision 226633
1297717Ssgalabov//== AnalysisManager.h - Path sensitive analysis data manager ------*- C++ -*-//
2297717Ssgalabov//
3297717Ssgalabov//                     The LLVM Compiler Infrastructure
4297717Ssgalabov//
5297717Ssgalabov// This file is distributed under the University of Illinois Open Source
6297717Ssgalabov// License. See LICENSE.TXT for details.
7297717Ssgalabov//
8297717Ssgalabov//===----------------------------------------------------------------------===//
9297717Ssgalabov//
10297717Ssgalabov// This file defines the AnalysisManager class that manages the data and policy
11297717Ssgalabov// for path sensitive analysis.
12297717Ssgalabov//
13297717Ssgalabov//===----------------------------------------------------------------------===//
14297717Ssgalabov
15297717Ssgalabov#ifndef LLVM_CLANG_GR_ANALYSISMANAGER_H
16297717Ssgalabov#define LLVM_CLANG_GR_ANALYSISMANAGER_H
17297717Ssgalabov
18297717Ssgalabov#include "clang/Analysis/AnalysisContext.h"
19297717Ssgalabov#include "clang/Frontend/AnalyzerOptions.h"
20297717Ssgalabov#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
21297717Ssgalabov#include "clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h"
22297717Ssgalabov
23297717Ssgalabovnamespace clang {
24297717Ssgalabov
25297717Ssgalabovnamespace idx {
26297717Ssgalabov  class Indexer;
27297717Ssgalabov  class TranslationUnit;
28297717Ssgalabov}
29297717Ssgalabov
30297717Ssgalabovnamespace ento {
31297717Ssgalabov  class CheckerManager;
32297717Ssgalabov
33297717Ssgalabovclass AnalysisManager : public BugReporterData {
34297717Ssgalabov  AnalysisContextManager AnaCtxMgr;
35297717Ssgalabov  LocationContextManager LocCtxMgr;
36297717Ssgalabov
37297717Ssgalabov  ASTContext &Ctx;
38297717Ssgalabov  DiagnosticsEngine &Diags;
39297717Ssgalabov  const LangOptions &LangInfo;
40297717Ssgalabov
41297717Ssgalabov  llvm::OwningPtr<PathDiagnosticConsumer> PD;
42297717Ssgalabov
43297717Ssgalabov  // Configurable components creators.
44297717Ssgalabov  StoreManagerCreator CreateStoreMgr;
45297717Ssgalabov  ConstraintManagerCreator CreateConstraintMgr;
46297717Ssgalabov
47297717Ssgalabov  CheckerManager *CheckerMgr;
48297717Ssgalabov
49297717Ssgalabov  /// \brief Provide function definitions in other translation units. This is
50297717Ssgalabov  /// NULL if we don't have multiple translation units. AnalysisManager does
51297717Ssgalabov  /// not own the Indexer.
52297717Ssgalabov  idx::Indexer *Idxer;
53297717Ssgalabov
54297717Ssgalabov  enum AnalysisScope { ScopeTU, ScopeDecl } AScope;
55297717Ssgalabov
56297717Ssgalabov  // The maximum number of exploded nodes the analyzer will generate.
57297717Ssgalabov  unsigned MaxNodes;
58297717Ssgalabov
59297717Ssgalabov  // The maximum number of times the analyzer visit a block.
60297717Ssgalabov  unsigned MaxVisit;
61297717Ssgalabov
62297717Ssgalabov  bool VisualizeEGDot;
63297717Ssgalabov  bool VisualizeEGUbi;
64297717Ssgalabov  AnalysisPurgeMode PurgeDead;
65297717Ssgalabov
66297717Ssgalabov  /// EargerlyAssume - A flag indicating how the engine should handle
67297717Ssgalabov  //   expressions such as: 'x = (y != 0)'.  When this flag is true then
68297717Ssgalabov  //   the subexpression 'y != 0' will be eagerly assumed to be true or false,
69297717Ssgalabov  //   thus evaluating it to the integers 0 or 1 respectively.  The upside
70297717Ssgalabov  //   is that this can increase analysis precision until we have a better way
71297717Ssgalabov  //   to lazily evaluate such logic.  The downside is that it eagerly
72297717Ssgalabov  //   bifurcates paths.
73297717Ssgalabov  bool EagerlyAssume;
74297717Ssgalabov  bool TrimGraph;
75297717Ssgalabov  bool InlineCall;
76297717Ssgalabov  bool EagerlyTrimEGraph;
77297717Ssgalabov
78297717Ssgalabovpublic:
79297717Ssgalabov  AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags,
80297717Ssgalabov                  const LangOptions &lang, PathDiagnosticConsumer *pd,
81297717Ssgalabov                  StoreManagerCreator storemgr,
82297717Ssgalabov                  ConstraintManagerCreator constraintmgr,
83297717Ssgalabov                  CheckerManager *checkerMgr,
84297717Ssgalabov                  idx::Indexer *idxer,
85297717Ssgalabov                  unsigned maxnodes, unsigned maxvisit,
86297717Ssgalabov                  bool vizdot, bool vizubi, AnalysisPurgeMode purge,
87297717Ssgalabov                  bool eager, bool trim,
88297717Ssgalabov                  bool inlinecall, bool useUnoptimizedCFG,
89297717Ssgalabov                  bool addImplicitDtors, bool addInitializers,
90297717Ssgalabov                  bool eagerlyTrimEGraph);
91297717Ssgalabov
92297717Ssgalabov  /// Construct a clone of the given AnalysisManager with the given ASTContext
93297717Ssgalabov  /// and DiagnosticsEngine.
94297717Ssgalabov  AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags,
95297717Ssgalabov                  AnalysisManager &ParentAM);
96297717Ssgalabov
97297717Ssgalabov  ~AnalysisManager() { FlushDiagnostics(); }
98297717Ssgalabov
99297717Ssgalabov  void ClearContexts() {
100297717Ssgalabov    LocCtxMgr.clear();
101297717Ssgalabov    AnaCtxMgr.clear();
102297717Ssgalabov  }
103297717Ssgalabov
104297717Ssgalabov  AnalysisContextManager& getAnalysisContextManager() {
105297717Ssgalabov    return AnaCtxMgr;
106297717Ssgalabov  }
107297717Ssgalabov
108297717Ssgalabov  StoreManagerCreator getStoreManagerCreator() {
109297717Ssgalabov    return CreateStoreMgr;
110297717Ssgalabov  }
111297717Ssgalabov
112297717Ssgalabov  ConstraintManagerCreator getConstraintManagerCreator() {
113297717Ssgalabov    return CreateConstraintMgr;
114297717Ssgalabov  }
115297717Ssgalabov
116297717Ssgalabov  CheckerManager *getCheckerManager() const { return CheckerMgr; }
117297717Ssgalabov
118297717Ssgalabov  idx::Indexer *getIndexer() const { return Idxer; }
119297717Ssgalabov
120297717Ssgalabov  virtual ASTContext &getASTContext() {
121297717Ssgalabov    return Ctx;
122297717Ssgalabov  }
123297717Ssgalabov
124297717Ssgalabov  virtual SourceManager &getSourceManager() {
125297717Ssgalabov    return getASTContext().getSourceManager();
126297717Ssgalabov  }
127297717Ssgalabov
128297717Ssgalabov  virtual DiagnosticsEngine &getDiagnostic() {
129297717Ssgalabov    return Diags;
130297717Ssgalabov  }
131297717Ssgalabov
132297717Ssgalabov  const LangOptions &getLangOptions() const {
133297717Ssgalabov    return LangInfo;
134297717Ssgalabov  }
135297717Ssgalabov
136297717Ssgalabov  virtual PathDiagnosticConsumer *getPathDiagnosticConsumer() {
137297717Ssgalabov    return PD.get();
138297717Ssgalabov  }
139297717Ssgalabov
140297717Ssgalabov  void FlushDiagnostics() {
141297717Ssgalabov    if (PD.get())
142297717Ssgalabov      PD->FlushDiagnostics();
143297717Ssgalabov  }
144297717Ssgalabov
145297717Ssgalabov  unsigned getMaxNodes() const { return MaxNodes; }
146297717Ssgalabov
147297717Ssgalabov  unsigned getMaxVisit() const { return MaxVisit; }
148297717Ssgalabov
149297717Ssgalabov  bool shouldVisualizeGraphviz() const { return VisualizeEGDot; }
150297717Ssgalabov
151297717Ssgalabov  bool shouldVisualizeUbigraph() const { return VisualizeEGUbi; }
152297717Ssgalabov
153297717Ssgalabov  bool shouldVisualize() const {
154297717Ssgalabov    return VisualizeEGDot || VisualizeEGUbi;
155297717Ssgalabov  }
156297717Ssgalabov
157297717Ssgalabov  bool shouldEagerlyTrimExplodedGraph() const { return EagerlyTrimEGraph; }
158297717Ssgalabov
159297717Ssgalabov  bool shouldTrimGraph() const { return TrimGraph; }
160297717Ssgalabov
161297717Ssgalabov  AnalysisPurgeMode getPurgeMode() const { return PurgeDead; }
162297717Ssgalabov
163297717Ssgalabov  bool shouldEagerlyAssume() const { return EagerlyAssume; }
164297717Ssgalabov
165297717Ssgalabov  bool shouldInlineCall() const { return InlineCall; }
166297717Ssgalabov
167297717Ssgalabov  bool hasIndexer() const { return Idxer != 0; }
168297717Ssgalabov
169297717Ssgalabov  AnalysisContext *getAnalysisContextInAnotherTU(const Decl *D);
170297717Ssgalabov
171297717Ssgalabov  CFG *getCFG(Decl const *D) {
172297717Ssgalabov    return AnaCtxMgr.getContext(D)->getCFG();
173297717Ssgalabov  }
174297717Ssgalabov
175297717Ssgalabov  template <typename T>
176297717Ssgalabov  T *getAnalysis(Decl const *D) {
177297717Ssgalabov    return AnaCtxMgr.getContext(D)->getAnalysis<T>();
178297717Ssgalabov  }
179297717Ssgalabov
180297717Ssgalabov  ParentMap &getParentMap(Decl const *D) {
181297717Ssgalabov    return AnaCtxMgr.getContext(D)->getParentMap();
182297717Ssgalabov  }
183297717Ssgalabov
184297717Ssgalabov  AnalysisContext *getAnalysisContext(const Decl *D) {
185297717Ssgalabov    return AnaCtxMgr.getContext(D);
186297717Ssgalabov  }
187297717Ssgalabov
188297717Ssgalabov  AnalysisContext *getAnalysisContext(const Decl *D, idx::TranslationUnit *TU) {
189297717Ssgalabov    return AnaCtxMgr.getContext(D, TU);
190297717Ssgalabov  }
191297717Ssgalabov
192297717Ssgalabov  const StackFrameContext *getStackFrame(AnalysisContext *Ctx,
193297717Ssgalabov                                         LocationContext const *Parent,
194297717Ssgalabov                                         const Stmt *S,
195297717Ssgalabov                                         const CFGBlock *Blk, unsigned Idx) {
196297717Ssgalabov    return LocCtxMgr.getStackFrame(Ctx, Parent, S, Blk, Idx);
197297717Ssgalabov  }
198297717Ssgalabov
199297717Ssgalabov  // Get the top level stack frame.
200297717Ssgalabov  const StackFrameContext *getStackFrame(Decl const *D,
201297717Ssgalabov                                         idx::TranslationUnit *TU) {
202297717Ssgalabov    return LocCtxMgr.getStackFrame(AnaCtxMgr.getContext(D, TU), 0, 0, 0, 0);
203297717Ssgalabov  }
204297717Ssgalabov
205297717Ssgalabov  // Get a stack frame with parent.
206297717Ssgalabov  StackFrameContext const *getStackFrame(const Decl *D,
207297717Ssgalabov                                         LocationContext const *Parent,
208297717Ssgalabov                                         const Stmt *S,
209297717Ssgalabov                                         const CFGBlock *Blk, unsigned Idx) {
210297717Ssgalabov    return LocCtxMgr.getStackFrame(AnaCtxMgr.getContext(D), Parent, S,
211297717Ssgalabov                                   Blk,Idx);
212297717Ssgalabov  }
213297717Ssgalabov};
214297717Ssgalabov
215297717Ssgalabov} // end GR namespace
216297717Ssgalabov
217297717Ssgalabov} // end clang namespace
218297717Ssgalabov
219297717Ssgalabov#endif
220297717Ssgalabov