1 //== AnalysisManager.h - Path sensitive analysis data manager ------*- C++ -*-//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the AnalysisManager class that manages the data and policy
11 // for path sensitive analysis.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_CLANG_GR_ANALYSISMANAGER_H
16 #define LLVM_CLANG_GR_ANALYSISMANAGER_H
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"
27 class TranslationUnit;
33 class AnalysisManager : public BugReporterData {
34 AnalysisContextManager AnaCtxMgr;
35 LocationContextManager LocCtxMgr;
38 DiagnosticsEngine &Diags;
39 const LangOptions &LangInfo;
41 llvm::OwningPtr<PathDiagnosticConsumer> PD;
43 // Configurable components creators.
44 StoreManagerCreator CreateStoreMgr;
45 ConstraintManagerCreator CreateConstraintMgr;
47 CheckerManager *CheckerMgr;
49 /// \brief Provide function definitions in other translation units. This is
50 /// NULL if we don't have multiple translation units. AnalysisManager does
51 /// not own the Indexer.
54 enum AnalysisScope { ScopeTU, ScopeDecl } AScope;
56 // The maximum number of exploded nodes the analyzer will generate.
59 // The maximum number of times the analyzer visit a block.
64 AnalysisPurgeMode PurgeDead;
66 /// EargerlyAssume - A flag indicating how the engine should handle
67 // expressions such as: 'x = (y != 0)'. When this flag is true then
68 // the subexpression 'y != 0' will be eagerly assumed to be true or false,
69 // thus evaluating it to the integers 0 or 1 respectively. The upside
70 // is that this can increase analysis precision until we have a better way
71 // to lazily evaluate such logic. The downside is that it eagerly
76 bool EagerlyTrimEGraph;
79 AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags,
80 const LangOptions &lang, PathDiagnosticConsumer *pd,
81 StoreManagerCreator storemgr,
82 ConstraintManagerCreator constraintmgr,
83 CheckerManager *checkerMgr,
85 unsigned maxnodes, unsigned maxvisit,
86 bool vizdot, bool vizubi, AnalysisPurgeMode purge,
87 bool eager, bool trim,
88 bool inlinecall, bool useUnoptimizedCFG,
89 bool addImplicitDtors, bool addInitializers,
90 bool eagerlyTrimEGraph);
92 /// Construct a clone of the given AnalysisManager with the given ASTContext
93 /// and DiagnosticsEngine.
94 AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags,
95 AnalysisManager &ParentAM);
97 ~AnalysisManager() { FlushDiagnostics(); }
99 void ClearContexts() {
104 AnalysisContextManager& getAnalysisContextManager() {
108 StoreManagerCreator getStoreManagerCreator() {
109 return CreateStoreMgr;
112 ConstraintManagerCreator getConstraintManagerCreator() {
113 return CreateConstraintMgr;
116 CheckerManager *getCheckerManager() const { return CheckerMgr; }
118 idx::Indexer *getIndexer() const { return Idxer; }
120 virtual ASTContext &getASTContext() {
124 virtual SourceManager &getSourceManager() {
125 return getASTContext().getSourceManager();
128 virtual DiagnosticsEngine &getDiagnostic() {
132 const LangOptions &getLangOptions() const {
136 virtual PathDiagnosticConsumer *getPathDiagnosticConsumer() {
140 void FlushDiagnostics() {
142 PD->FlushDiagnostics();
145 unsigned getMaxNodes() const { return MaxNodes; }
147 unsigned getMaxVisit() const { return MaxVisit; }
149 bool shouldVisualizeGraphviz() const { return VisualizeEGDot; }
151 bool shouldVisualizeUbigraph() const { return VisualizeEGUbi; }
153 bool shouldVisualize() const {
154 return VisualizeEGDot || VisualizeEGUbi;
157 bool shouldEagerlyTrimExplodedGraph() const { return EagerlyTrimEGraph; }
159 bool shouldTrimGraph() const { return TrimGraph; }
161 AnalysisPurgeMode getPurgeMode() const { return PurgeDead; }
163 bool shouldEagerlyAssume() const { return EagerlyAssume; }
165 bool shouldInlineCall() const { return InlineCall; }
167 bool hasIndexer() const { return Idxer != 0; }
169 AnalysisContext *getAnalysisContextInAnotherTU(const Decl *D);
171 CFG *getCFG(Decl const *D) {
172 return AnaCtxMgr.getContext(D)->getCFG();
175 template <typename T>
176 T *getAnalysis(Decl const *D) {
177 return AnaCtxMgr.getContext(D)->getAnalysis<T>();
180 ParentMap &getParentMap(Decl const *D) {
181 return AnaCtxMgr.getContext(D)->getParentMap();
184 AnalysisContext *getAnalysisContext(const Decl *D) {
185 return AnaCtxMgr.getContext(D);
188 AnalysisContext *getAnalysisContext(const Decl *D, idx::TranslationUnit *TU) {
189 return AnaCtxMgr.getContext(D, TU);
192 const StackFrameContext *getStackFrame(AnalysisContext *Ctx,
193 LocationContext const *Parent,
195 const CFGBlock *Blk, unsigned Idx) {
196 return LocCtxMgr.getStackFrame(Ctx, Parent, S, Blk, Idx);
199 // Get the top level stack frame.
200 const StackFrameContext *getStackFrame(Decl const *D,
201 idx::TranslationUnit *TU) {
202 return LocCtxMgr.getStackFrame(AnaCtxMgr.getContext(D, TU), 0, 0, 0, 0);
205 // Get a stack frame with parent.
206 StackFrameContext const *getStackFrame(const Decl *D,
207 LocationContext const *Parent,
209 const CFGBlock *Blk, unsigned Idx) {
210 return LocCtxMgr.getStackFrame(AnaCtxMgr.getContext(D), Parent, S,
215 } // end GR namespace
217 } // end clang namespace