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