AnalysisManager.h revision 87e154c09bbb060a0620bc988d7723bee64fb79c
1//== AnalysisManager.h - Path sensitive analysis data manager ------*- C++ -*-//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the AnalysisManager class that manages the data and policy
11// for path sensitive analysis.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_CLANG_GR_ANALYSISMANAGER_H
16#define LLVM_CLANG_GR_ANALYSISMANAGER_H
17
18#include "clang/Analysis/AnalysisContext.h"
19#include "clang/Frontend/AnalyzerOptions.h"
20#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
21#include "clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h"
22
23namespace clang {
24
25namespace ento {
26  class CheckerManager;
27
28class AnalysisManager : public BugReporterData {
29  virtual void anchor();
30  AnalysisDeclContextManager AnaCtxMgr;
31
32  ASTContext &Ctx;
33  DiagnosticsEngine &Diags;
34  const LangOptions &LangOpts;
35
36  OwningPtr<PathDiagnosticConsumer> PD;
37
38  // Configurable components creators.
39  StoreManagerCreator CreateStoreMgr;
40  ConstraintManagerCreator CreateConstraintMgr;
41
42  CheckerManager *CheckerMgr;
43
44  enum AnalysisScope { ScopeTU, ScopeDecl } AScope;
45
46  /// \brief The maximum number of exploded nodes the analyzer will generate.
47  unsigned MaxNodes;
48
49  /// \brief The maximum number of times the analyzer visits a block.
50  unsigned MaxVisit;
51
52  bool VisualizeEGDot;
53  bool VisualizeEGUbi;
54  AnalysisPurgeMode PurgeDead;
55
56  /// \brief The flag regulates if we should eagerly assume evaluations of
57  /// conditionals, thus, bifurcating the path.
58  ///
59  /// EagerlyAssume - A flag indicating how the engine should handle
60  ///   expressions such as: 'x = (y != 0)'.  When this flag is true then
61  ///   the subexpression 'y != 0' will be eagerly assumed to be true or false,
62  ///   thus evaluating it to the integers 0 or 1 respectively.  The upside
63  ///   is that this can increase analysis precision until we have a better way
64  ///   to lazily evaluate such logic.  The downside is that it eagerly
65  ///   bifurcates paths.
66  bool EagerlyAssume;
67  bool TrimGraph;
68  bool EagerlyTrimEGraph;
69
70public:
71  // \brief inter-procedural analysis mode.
72  AnalysisIPAMode IPAMode;
73
74  // Settings for inlining tuning.
75  /// \brief The inlining stack depth limit.
76  unsigned InlineMaxStackDepth;
77  /// \brief The max number of basic blocks in a function being inlined.
78  unsigned InlineMaxFunctionSize;
79  /// \brief The mode of function selection used during inlining.
80  AnalysisInliningMode InliningMode;
81
82  /// \brief Do not re-analyze paths leading to exhausted nodes with a different
83  /// strategy. We get better code coverage when retry is enabled.
84  bool NoRetryExhausted;
85
86public:
87  AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags,
88                  const LangOptions &lang, PathDiagnosticConsumer *pd,
89                  StoreManagerCreator storemgr,
90                  ConstraintManagerCreator constraintmgr,
91                  CheckerManager *checkerMgr,
92                  unsigned maxnodes, unsigned maxvisit,
93                  bool vizdot, bool vizubi, AnalysisPurgeMode purge,
94                  bool eager, bool trim,
95                  bool useUnoptimizedCFG,
96                  bool addImplicitDtors, bool addInitializers,
97                  bool eagerlyTrimEGraph,
98                  AnalysisIPAMode ipa,
99                  unsigned inlineMaxStack,
100                  unsigned inlineMaxFunctionSize,
101                  AnalysisInliningMode inliningMode,
102                  bool NoRetry);
103
104  /// Construct a clone of the given AnalysisManager with the given ASTContext
105  /// and DiagnosticsEngine.
106  AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags,
107                  AnalysisManager &ParentAM);
108
109  ~AnalysisManager() { FlushDiagnostics(); }
110
111  void ClearContexts() {
112    AnaCtxMgr.clear();
113  }
114
115  AnalysisDeclContextManager& getAnalysisDeclContextManager() {
116    return AnaCtxMgr;
117  }
118
119  StoreManagerCreator getStoreManagerCreator() {
120    return CreateStoreMgr;
121  }
122
123  ConstraintManagerCreator getConstraintManagerCreator() {
124    return CreateConstraintMgr;
125  }
126
127  CheckerManager *getCheckerManager() const { return CheckerMgr; }
128
129  virtual ASTContext &getASTContext() {
130    return Ctx;
131  }
132
133  virtual SourceManager &getSourceManager() {
134    return getASTContext().getSourceManager();
135  }
136
137  virtual DiagnosticsEngine &getDiagnostic() {
138    return Diags;
139  }
140
141  const LangOptions &getLangOpts() const {
142    return LangOpts;
143  }
144
145  virtual PathDiagnosticConsumer *getPathDiagnosticConsumer() {
146    return PD.get();
147  }
148
149  void FlushDiagnostics() {
150    if (PD.get())
151      PD->FlushDiagnostics(0);
152  }
153
154  unsigned getMaxNodes() const { return MaxNodes; }
155
156  unsigned getMaxVisit() const { return MaxVisit; }
157
158  bool shouldVisualizeGraphviz() const { return VisualizeEGDot; }
159
160  bool shouldVisualizeUbigraph() const { return VisualizeEGUbi; }
161
162  bool shouldVisualize() const {
163    return VisualizeEGDot || VisualizeEGUbi;
164  }
165
166  bool shouldEagerlyTrimExplodedGraph() const { return EagerlyTrimEGraph; }
167
168  bool shouldTrimGraph() const { return TrimGraph; }
169
170  AnalysisPurgeMode getPurgeMode() const { return PurgeDead; }
171
172  bool shouldEagerlyAssume() const { return EagerlyAssume; }
173
174  bool shouldInlineCall() const { return (IPAMode == Inlining); }
175
176  CFG *getCFG(Decl const *D) {
177    return AnaCtxMgr.getContext(D)->getCFG();
178  }
179
180  template <typename T>
181  T *getAnalysis(Decl const *D) {
182    return AnaCtxMgr.getContext(D)->getAnalysis<T>();
183  }
184
185  ParentMap &getParentMap(Decl const *D) {
186    return AnaCtxMgr.getContext(D)->getParentMap();
187  }
188
189  AnalysisDeclContext *getAnalysisDeclContext(const Decl *D) {
190    return AnaCtxMgr.getContext(D);
191  }
192
193  AnalysisDeclContext *getAnalysisDeclContext(const Decl *D, idx::TranslationUnit *TU) {
194    return AnaCtxMgr.getContext(D, TU);
195  }
196
197};
198
199} // enAnaCtxMgrspace
200
201} // end clang namespace
202
203#endif
204