• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
23 namespace clang {
24 
25 namespace ento {
26   class CheckerManager;
27 
28 class 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 
70 public:
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 
86 public:
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 
~AnalysisManager()109   ~AnalysisManager() { FlushDiagnostics(); }
110 
ClearContexts()111   void ClearContexts() {
112     AnaCtxMgr.clear();
113   }
114 
getAnalysisDeclContextManager()115   AnalysisDeclContextManager& getAnalysisDeclContextManager() {
116     return AnaCtxMgr;
117   }
118 
getStoreManagerCreator()119   StoreManagerCreator getStoreManagerCreator() {
120     return CreateStoreMgr;
121   }
122 
getConstraintManagerCreator()123   ConstraintManagerCreator getConstraintManagerCreator() {
124     return CreateConstraintMgr;
125   }
126 
getCheckerManager()127   CheckerManager *getCheckerManager() const { return CheckerMgr; }
128 
getASTContext()129   virtual ASTContext &getASTContext() {
130     return Ctx;
131   }
132 
getSourceManager()133   virtual SourceManager &getSourceManager() {
134     return getASTContext().getSourceManager();
135   }
136 
getDiagnostic()137   virtual DiagnosticsEngine &getDiagnostic() {
138     return Diags;
139   }
140 
getLangOpts()141   const LangOptions &getLangOpts() const {
142     return LangOpts;
143   }
144 
getPathDiagnosticConsumer()145   virtual PathDiagnosticConsumer *getPathDiagnosticConsumer() {
146     return PD.get();
147   }
148 
FlushDiagnostics()149   void FlushDiagnostics() {
150     if (PD.get())
151       PD->FlushDiagnostics(0);
152   }
153 
getMaxNodes()154   unsigned getMaxNodes() const { return MaxNodes; }
155 
getMaxVisit()156   unsigned getMaxVisit() const { return MaxVisit; }
157 
shouldVisualizeGraphviz()158   bool shouldVisualizeGraphviz() const { return VisualizeEGDot; }
159 
shouldVisualizeUbigraph()160   bool shouldVisualizeUbigraph() const { return VisualizeEGUbi; }
161 
shouldVisualize()162   bool shouldVisualize() const {
163     return VisualizeEGDot || VisualizeEGUbi;
164   }
165 
shouldEagerlyTrimExplodedGraph()166   bool shouldEagerlyTrimExplodedGraph() const { return EagerlyTrimEGraph; }
167 
shouldTrimGraph()168   bool shouldTrimGraph() const { return TrimGraph; }
169 
getPurgeMode()170   AnalysisPurgeMode getPurgeMode() const { return PurgeDead; }
171 
shouldEagerlyAssume()172   bool shouldEagerlyAssume() const { return EagerlyAssume; }
173 
shouldInlineCall()174   bool shouldInlineCall() const { return (IPAMode == Inlining); }
175 
getCFG(Decl const * D)176   CFG *getCFG(Decl const *D) {
177     return AnaCtxMgr.getContext(D)->getCFG();
178   }
179 
180   template <typename T>
getAnalysis(Decl const * D)181   T *getAnalysis(Decl const *D) {
182     return AnaCtxMgr.getContext(D)->getAnalysis<T>();
183   }
184 
getParentMap(Decl const * D)185   ParentMap &getParentMap(Decl const *D) {
186     return AnaCtxMgr.getContext(D)->getParentMap();
187   }
188 
getAnalysisDeclContext(const Decl * D)189   AnalysisDeclContext *getAnalysisDeclContext(const Decl *D) {
190     return AnaCtxMgr.getContext(D);
191   }
192 
getAnalysisDeclContext(const Decl * D,idx::TranslationUnit * TU)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