AnalysisManager.h revision 327952
1218887Sdim//== AnalysisManager.h - Path sensitive analysis data manager ------*- C++ -*-// 2218887Sdim// 3218887Sdim// The LLVM Compiler Infrastructure 4218887Sdim// 5218887Sdim// This file is distributed under the University of Illinois Open Source 6218887Sdim// License. See LICENSE.TXT for details. 7218887Sdim// 8218887Sdim//===----------------------------------------------------------------------===// 9218887Sdim// 10218887Sdim// This file defines the AnalysisManager class that manages the data and policy 11218887Sdim// for path sensitive analysis. 12218887Sdim// 13218887Sdim//===----------------------------------------------------------------------===// 14218887Sdim 15280031Sdim#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_ANALYSISMANAGER_H 16280031Sdim#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_ANALYSISMANAGER_H 17218887Sdim 18327952Sdim#include "clang/Analysis/AnalysisDeclContext.h" 19243830Sdim#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h" 20218887Sdim#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h" 21218887Sdim#include "clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h" 22239462Sdim#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h" 23218887Sdim 24218887Sdimnamespace clang { 25218887Sdim 26280031Sdimclass CodeInjector; 27280031Sdim 28218887Sdimnamespace ento { 29218887Sdim class CheckerManager; 30218887Sdim 31218887Sdimclass AnalysisManager : public BugReporterData { 32234353Sdim virtual void anchor(); 33234353Sdim AnalysisDeclContextManager AnaCtxMgr; 34218887Sdim 35218887Sdim ASTContext &Ctx; 36226633Sdim DiagnosticsEngine &Diags; 37234353Sdim const LangOptions &LangOpts; 38239462Sdim PathDiagnosticConsumers PathConsumers; 39218887Sdim 40218887Sdim // Configurable components creators. 41218887Sdim StoreManagerCreator CreateStoreMgr; 42218887Sdim ConstraintManagerCreator CreateConstraintMgr; 43218887Sdim 44218887Sdim CheckerManager *CheckerMgr; 45218887Sdim 46218887Sdimpublic: 47243830Sdim AnalyzerOptions &options; 48243830Sdim 49239462Sdim AnalysisManager(ASTContext &ctx,DiagnosticsEngine &diags, 50239462Sdim const LangOptions &lang, 51239462Sdim const PathDiagnosticConsumers &Consumers, 52218887Sdim StoreManagerCreator storemgr, 53218887Sdim ConstraintManagerCreator constraintmgr, 54218887Sdim CheckerManager *checkerMgr, 55280031Sdim AnalyzerOptions &Options, 56280031Sdim CodeInjector* injector = nullptr); 57218887Sdim 58288943Sdim ~AnalysisManager() override; 59288943Sdim 60218887Sdim void ClearContexts() { 61218887Sdim AnaCtxMgr.clear(); 62218887Sdim } 63218887Sdim 64234353Sdim AnalysisDeclContextManager& getAnalysisDeclContextManager() { 65218887Sdim return AnaCtxMgr; 66218887Sdim } 67218887Sdim 68218887Sdim StoreManagerCreator getStoreManagerCreator() { 69218887Sdim return CreateStoreMgr; 70218887Sdim } 71276479Sdim 72276479Sdim AnalyzerOptions& getAnalyzerOptions() override { 73261991Sdim return options; 74261991Sdim } 75218887Sdim 76218887Sdim ConstraintManagerCreator getConstraintManagerCreator() { 77218887Sdim return CreateConstraintMgr; 78218887Sdim } 79218887Sdim 80218887Sdim CheckerManager *getCheckerManager() const { return CheckerMgr; } 81218887Sdim 82276479Sdim ASTContext &getASTContext() override { 83218887Sdim return Ctx; 84218887Sdim } 85218887Sdim 86276479Sdim SourceManager &getSourceManager() override { 87218887Sdim return getASTContext().getSourceManager(); 88218887Sdim } 89218887Sdim 90276479Sdim DiagnosticsEngine &getDiagnostic() override { 91218887Sdim return Diags; 92218887Sdim } 93218887Sdim 94234353Sdim const LangOptions &getLangOpts() const { 95234353Sdim return LangOpts; 96218887Sdim } 97218887Sdim 98276479Sdim ArrayRef<PathDiagnosticConsumer*> getPathDiagnosticConsumers() override { 99239462Sdim return PathConsumers; 100218887Sdim } 101218887Sdim 102239462Sdim void FlushDiagnostics(); 103239462Sdim 104218887Sdim bool shouldVisualize() const { 105243830Sdim return options.visualizeExplodedGraphWithGraphViz || 106243830Sdim options.visualizeExplodedGraphWithUbiGraph; 107218887Sdim } 108218887Sdim 109243830Sdim bool shouldInlineCall() const { 110249423Sdim return options.getIPAMode() != IPAK_None; 111243830Sdim } 112218887Sdim 113218887Sdim CFG *getCFG(Decl const *D) { 114218887Sdim return AnaCtxMgr.getContext(D)->getCFG(); 115218887Sdim } 116218887Sdim 117226633Sdim template <typename T> 118226633Sdim T *getAnalysis(Decl const *D) { 119226633Sdim return AnaCtxMgr.getContext(D)->getAnalysis<T>(); 120218887Sdim } 121218887Sdim 122218887Sdim ParentMap &getParentMap(Decl const *D) { 123218887Sdim return AnaCtxMgr.getContext(D)->getParentMap(); 124218887Sdim } 125218887Sdim 126234353Sdim AnalysisDeclContext *getAnalysisDeclContext(const Decl *D) { 127218887Sdim return AnaCtxMgr.getContext(D); 128218887Sdim } 129218887Sdim}; 130218887Sdim 131234353Sdim} // enAnaCtxMgrspace 132218887Sdim 133218887Sdim} // end clang namespace 134218887Sdim 135218887Sdim#endif 136