AnalysisManager.h revision 344779
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; 48341825Sdim 49344779Sdim AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags, 50239462Sdim const PathDiagnosticConsumers &Consumers, 51218887Sdim StoreManagerCreator storemgr, 52341825Sdim ConstraintManagerCreator constraintmgr, 53344779Sdim CheckerManager *checkerMgr, AnalyzerOptions &Options, 54344779Sdim CodeInjector *injector = nullptr); 55218887Sdim 56288943Sdim ~AnalysisManager() override; 57288943Sdim 58218887Sdim void ClearContexts() { 59218887Sdim AnaCtxMgr.clear(); 60218887Sdim } 61341825Sdim 62234353Sdim AnalysisDeclContextManager& getAnalysisDeclContextManager() { 63218887Sdim return AnaCtxMgr; 64218887Sdim } 65218887Sdim 66218887Sdim StoreManagerCreator getStoreManagerCreator() { 67218887Sdim return CreateStoreMgr; 68218887Sdim } 69276479Sdim 70276479Sdim AnalyzerOptions& getAnalyzerOptions() override { 71261991Sdim return options; 72261991Sdim } 73218887Sdim 74218887Sdim ConstraintManagerCreator getConstraintManagerCreator() { 75218887Sdim return CreateConstraintMgr; 76218887Sdim } 77218887Sdim 78218887Sdim CheckerManager *getCheckerManager() const { return CheckerMgr; } 79218887Sdim 80276479Sdim ASTContext &getASTContext() override { 81218887Sdim return Ctx; 82218887Sdim } 83218887Sdim 84276479Sdim SourceManager &getSourceManager() override { 85218887Sdim return getASTContext().getSourceManager(); 86218887Sdim } 87218887Sdim 88276479Sdim DiagnosticsEngine &getDiagnostic() override { 89218887Sdim return Diags; 90218887Sdim } 91218887Sdim 92234353Sdim const LangOptions &getLangOpts() const { 93234353Sdim return LangOpts; 94218887Sdim } 95218887Sdim 96276479Sdim ArrayRef<PathDiagnosticConsumer*> getPathDiagnosticConsumers() override { 97239462Sdim return PathConsumers; 98218887Sdim } 99218887Sdim 100239462Sdim void FlushDiagnostics(); 101239462Sdim 102218887Sdim bool shouldVisualize() const { 103344779Sdim return options.visualizeExplodedGraphWithGraphViz; 104218887Sdim } 105218887Sdim 106243830Sdim bool shouldInlineCall() const { 107249423Sdim return options.getIPAMode() != IPAK_None; 108243830Sdim } 109218887Sdim 110218887Sdim CFG *getCFG(Decl const *D) { 111218887Sdim return AnaCtxMgr.getContext(D)->getCFG(); 112218887Sdim } 113218887Sdim 114226633Sdim template <typename T> 115226633Sdim T *getAnalysis(Decl const *D) { 116226633Sdim return AnaCtxMgr.getContext(D)->getAnalysis<T>(); 117218887Sdim } 118218887Sdim 119218887Sdim ParentMap &getParentMap(Decl const *D) { 120218887Sdim return AnaCtxMgr.getContext(D)->getParentMap(); 121218887Sdim } 122218887Sdim 123234353Sdim AnalysisDeclContext *getAnalysisDeclContext(const Decl *D) { 124218887Sdim return AnaCtxMgr.getContext(D); 125218887Sdim } 126341825Sdim 127341825Sdim static bool isInCodeFile(SourceLocation SL, const SourceManager &SM) { 128341825Sdim if (SM.isInMainFile(SL)) 129341825Sdim return true; 130341825Sdim 131341825Sdim // Support the "unified sources" compilation method (eg. WebKit) that 132341825Sdim // involves producing non-header files that include other non-header files. 133341825Sdim // We should be included directly from a UnifiedSource* file 134341825Sdim // and we shouldn't be a header - which is a very safe defensive check. 135341825Sdim SourceLocation IL = SM.getIncludeLoc(SM.getFileID(SL)); 136341825Sdim if (!IL.isValid() || !SM.isInMainFile(IL)) 137341825Sdim return false; 138341825Sdim // Should rather be "file name starts with", but the current .getFilename 139341825Sdim // includes the full path. 140341825Sdim if (SM.getFilename(IL).contains("UnifiedSource")) { 141341825Sdim // It might be great to reuse FrontendOptions::getInputKindForExtension() 142341825Sdim // but for now it doesn't discriminate between code and header files. 143341825Sdim return llvm::StringSwitch<bool>(SM.getFilename(SL).rsplit('.').second) 144341825Sdim .Cases("c", "m", "mm", "C", "cc", "cp", true) 145341825Sdim .Cases("cpp", "CPP", "c++", "cxx", "cppm", true) 146341825Sdim .Default(false); 147341825Sdim } 148341825Sdim 149341825Sdim return false; 150341825Sdim } 151341825Sdim 152341825Sdim bool isInCodeFile(SourceLocation SL) { 153341825Sdim const SourceManager &SM = getASTContext().getSourceManager(); 154341825Sdim return isInCodeFile(SL, SM); 155341825Sdim } 156218887Sdim}; 157218887Sdim 158234353Sdim} // enAnaCtxMgrspace 159218887Sdim 160218887Sdim} // end clang namespace 161218887Sdim 162218887Sdim#endif 163