1218887Sdim//== AnalysisManager.h - Path sensitive analysis data manager ------*- C++ -*-// 2218887Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6218887Sdim// 7218887Sdim//===----------------------------------------------------------------------===// 8218887Sdim// 9218887Sdim// This file defines the AnalysisManager class that manages the data and policy 10218887Sdim// for path sensitive analysis. 11218887Sdim// 12218887Sdim//===----------------------------------------------------------------------===// 13218887Sdim 14280031Sdim#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_ANALYSISMANAGER_H 15280031Sdim#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_ANALYSISMANAGER_H 16218887Sdim 17327952Sdim#include "clang/Analysis/AnalysisDeclContext.h" 18360784Sdim#include "clang/Analysis/PathDiagnostic.h" 19243830Sdim#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h" 20218887Sdim#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h" 21239462Sdim#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h" 22218887Sdim 23218887Sdimnamespace clang { 24218887Sdim 25280031Sdimclass CodeInjector; 26280031Sdim 27218887Sdimnamespace ento { 28218887Sdim class CheckerManager; 29218887Sdim 30218887Sdimclass AnalysisManager : public BugReporterData { 31234353Sdim virtual void anchor(); 32234353Sdim AnalysisDeclContextManager AnaCtxMgr; 33218887Sdim 34218887Sdim ASTContext &Ctx; 35234353Sdim const LangOptions &LangOpts; 36239462Sdim PathDiagnosticConsumers PathConsumers; 37218887Sdim 38218887Sdim // Configurable components creators. 39218887Sdim StoreManagerCreator CreateStoreMgr; 40218887Sdim ConstraintManagerCreator CreateConstraintMgr; 41218887Sdim 42218887Sdim CheckerManager *CheckerMgr; 43218887Sdim 44218887Sdimpublic: 45243830Sdim AnalyzerOptions &options; 46341825Sdim 47360784Sdim AnalysisManager(ASTContext &ctx, 48239462Sdim const PathDiagnosticConsumers &Consumers, 49218887Sdim StoreManagerCreator storemgr, 50341825Sdim ConstraintManagerCreator constraintmgr, 51344779Sdim CheckerManager *checkerMgr, AnalyzerOptions &Options, 52344779Sdim CodeInjector *injector = nullptr); 53218887Sdim 54288943Sdim ~AnalysisManager() override; 55288943Sdim 56218887Sdim void ClearContexts() { 57218887Sdim AnaCtxMgr.clear(); 58218887Sdim } 59341825Sdim 60234353Sdim AnalysisDeclContextManager& getAnalysisDeclContextManager() { 61218887Sdim return AnaCtxMgr; 62218887Sdim } 63218887Sdim 64218887Sdim StoreManagerCreator getStoreManagerCreator() { 65218887Sdim return CreateStoreMgr; 66218887Sdim } 67276479Sdim 68276479Sdim AnalyzerOptions& getAnalyzerOptions() override { 69261991Sdim return options; 70261991Sdim } 71218887Sdim 72218887Sdim ConstraintManagerCreator getConstraintManagerCreator() { 73218887Sdim return CreateConstraintMgr; 74218887Sdim } 75218887Sdim 76218887Sdim CheckerManager *getCheckerManager() const { return CheckerMgr; } 77218887Sdim 78276479Sdim ASTContext &getASTContext() override { 79218887Sdim return Ctx; 80218887Sdim } 81218887Sdim 82276479Sdim SourceManager &getSourceManager() override { 83218887Sdim return getASTContext().getSourceManager(); 84218887Sdim } 85218887Sdim 86234353Sdim const LangOptions &getLangOpts() const { 87234353Sdim return LangOpts; 88218887Sdim } 89218887Sdim 90276479Sdim ArrayRef<PathDiagnosticConsumer*> getPathDiagnosticConsumers() override { 91239462Sdim return PathConsumers; 92218887Sdim } 93218887Sdim 94239462Sdim void FlushDiagnostics(); 95239462Sdim 96218887Sdim bool shouldVisualize() const { 97344779Sdim return options.visualizeExplodedGraphWithGraphViz; 98218887Sdim } 99218887Sdim 100243830Sdim bool shouldInlineCall() const { 101249423Sdim return options.getIPAMode() != IPAK_None; 102243830Sdim } 103218887Sdim 104218887Sdim CFG *getCFG(Decl const *D) { 105218887Sdim return AnaCtxMgr.getContext(D)->getCFG(); 106218887Sdim } 107218887Sdim 108226633Sdim template <typename T> 109226633Sdim T *getAnalysis(Decl const *D) { 110226633Sdim return AnaCtxMgr.getContext(D)->getAnalysis<T>(); 111218887Sdim } 112218887Sdim 113218887Sdim ParentMap &getParentMap(Decl const *D) { 114218887Sdim return AnaCtxMgr.getContext(D)->getParentMap(); 115218887Sdim } 116218887Sdim 117234353Sdim AnalysisDeclContext *getAnalysisDeclContext(const Decl *D) { 118218887Sdim return AnaCtxMgr.getContext(D); 119218887Sdim } 120341825Sdim 121341825Sdim static bool isInCodeFile(SourceLocation SL, const SourceManager &SM) { 122341825Sdim if (SM.isInMainFile(SL)) 123341825Sdim return true; 124341825Sdim 125341825Sdim // Support the "unified sources" compilation method (eg. WebKit) that 126341825Sdim // involves producing non-header files that include other non-header files. 127341825Sdim // We should be included directly from a UnifiedSource* file 128341825Sdim // and we shouldn't be a header - which is a very safe defensive check. 129341825Sdim SourceLocation IL = SM.getIncludeLoc(SM.getFileID(SL)); 130341825Sdim if (!IL.isValid() || !SM.isInMainFile(IL)) 131341825Sdim return false; 132341825Sdim // Should rather be "file name starts with", but the current .getFilename 133341825Sdim // includes the full path. 134341825Sdim if (SM.getFilename(IL).contains("UnifiedSource")) { 135341825Sdim // It might be great to reuse FrontendOptions::getInputKindForExtension() 136341825Sdim // but for now it doesn't discriminate between code and header files. 137341825Sdim return llvm::StringSwitch<bool>(SM.getFilename(SL).rsplit('.').second) 138341825Sdim .Cases("c", "m", "mm", "C", "cc", "cp", true) 139341825Sdim .Cases("cpp", "CPP", "c++", "cxx", "cppm", true) 140341825Sdim .Default(false); 141341825Sdim } 142341825Sdim 143341825Sdim return false; 144341825Sdim } 145341825Sdim 146341825Sdim bool isInCodeFile(SourceLocation SL) { 147341825Sdim const SourceManager &SM = getASTContext().getSourceManager(); 148341825Sdim return isInCodeFile(SL, SM); 149341825Sdim } 150218887Sdim}; 151218887Sdim 152234353Sdim} // enAnaCtxMgrspace 153218887Sdim 154218887Sdim} // end clang namespace 155218887Sdim 156218887Sdim#endif 157