AnalysisManager.h revision 280031
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_STATICANALYZER_CORE_PATHSENSITIVE_ANALYSISMANAGER_H 16#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_ANALYSISMANAGER_H 17 18#include "clang/Analysis/AnalysisContext.h" 19#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h" 20#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h" 21#include "clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h" 22#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h" 23 24namespace clang { 25 26class CodeInjector; 27 28namespace ento { 29 class CheckerManager; 30 31class AnalysisManager : public BugReporterData { 32 virtual void anchor(); 33 AnalysisDeclContextManager AnaCtxMgr; 34 35 ASTContext &Ctx; 36 DiagnosticsEngine &Diags; 37 const LangOptions &LangOpts; 38 PathDiagnosticConsumers PathConsumers; 39 40 // Configurable components creators. 41 StoreManagerCreator CreateStoreMgr; 42 ConstraintManagerCreator CreateConstraintMgr; 43 44 CheckerManager *CheckerMgr; 45 46public: 47 AnalyzerOptions &options; 48 49 AnalysisManager(ASTContext &ctx,DiagnosticsEngine &diags, 50 const LangOptions &lang, 51 const PathDiagnosticConsumers &Consumers, 52 StoreManagerCreator storemgr, 53 ConstraintManagerCreator constraintmgr, 54 CheckerManager *checkerMgr, 55 AnalyzerOptions &Options, 56 CodeInjector* injector = nullptr); 57 58 ~AnalysisManager(); 59 60 void ClearContexts() { 61 AnaCtxMgr.clear(); 62 } 63 64 AnalysisDeclContextManager& getAnalysisDeclContextManager() { 65 return AnaCtxMgr; 66 } 67 68 StoreManagerCreator getStoreManagerCreator() { 69 return CreateStoreMgr; 70 } 71 72 AnalyzerOptions& getAnalyzerOptions() override { 73 return options; 74 } 75 76 ConstraintManagerCreator getConstraintManagerCreator() { 77 return CreateConstraintMgr; 78 } 79 80 CheckerManager *getCheckerManager() const { return CheckerMgr; } 81 82 ASTContext &getASTContext() override { 83 return Ctx; 84 } 85 86 SourceManager &getSourceManager() override { 87 return getASTContext().getSourceManager(); 88 } 89 90 DiagnosticsEngine &getDiagnostic() override { 91 return Diags; 92 } 93 94 const LangOptions &getLangOpts() const { 95 return LangOpts; 96 } 97 98 ArrayRef<PathDiagnosticConsumer*> getPathDiagnosticConsumers() override { 99 return PathConsumers; 100 } 101 102 void FlushDiagnostics(); 103 104 bool shouldVisualize() const { 105 return options.visualizeExplodedGraphWithGraphViz || 106 options.visualizeExplodedGraphWithUbiGraph; 107 } 108 109 bool shouldInlineCall() const { 110 return options.getIPAMode() != IPAK_None; 111 } 112 113 CFG *getCFG(Decl const *D) { 114 return AnaCtxMgr.getContext(D)->getCFG(); 115 } 116 117 template <typename T> 118 T *getAnalysis(Decl const *D) { 119 return AnaCtxMgr.getContext(D)->getAnalysis<T>(); 120 } 121 122 ParentMap &getParentMap(Decl const *D) { 123 return AnaCtxMgr.getContext(D)->getParentMap(); 124 } 125 126 AnalysisDeclContext *getAnalysisDeclContext(const Decl *D) { 127 return AnaCtxMgr.getContext(D); 128 } 129}; 130 131} // enAnaCtxMgrspace 132 133} // end clang namespace 134 135#endif 136