AnalysisManager.h revision fda7832b000ff8927386f093b52c067641679469
1fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//== AnalysisManager.cpp - Path sensitive analysis data manager ----*- C++ -*-// 2fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// 3fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// The LLVM Compiler Infrastructure 4fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// 5fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// This file is distributed under the University of Illinois Open Source 6fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// License. See LICENSE.TXT for details. 7fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// 8fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//===----------------------------------------------------------------------===// 9fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// 10fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// This file defines the AnalysisManager class that manages the data and policy 11fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// for path sensitive analysis. 12fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// 13fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//===----------------------------------------------------------------------===// 14fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 15fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#ifndef LLVM_CLANG_ANALYSIS_ANALYSISMANAGER_H 16fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#define LLVM_CLANG_ANALYSIS_ANALYSISMANAGER_H 17fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 18fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#include "clang/Analysis/PathSensitive/BugReporter.h" 19fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#include "clang/Analysis/PathSensitive/AnalysisContext.h" 20fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#include "clang/Analysis/PathDiagnostic.h" 21fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 22fda7832b000ff8927386f093b52c067641679469Zhongxing Xunamespace clang { 23fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 24fda7832b000ff8927386f093b52c067641679469Zhongxing Xuclass AnalysisManager : public BugReporterData { 25fda7832b000ff8927386f093b52c067641679469Zhongxing Xu AnalysisContextManager ContextMgr; 26fda7832b000ff8927386f093b52c067641679469Zhongxing Xu AnalysisContext *CurrentContext; 27fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 28fda7832b000ff8927386f093b52c067641679469Zhongxing Xu ASTContext &Ctx; 29fda7832b000ff8927386f093b52c067641679469Zhongxing Xu Diagnostic &Diags; 30fda7832b000ff8927386f093b52c067641679469Zhongxing Xu const LangOptions &LangInfo; 31fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 32fda7832b000ff8927386f093b52c067641679469Zhongxing Xu llvm::OwningPtr<PathDiagnosticClient> PD; 33fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 34fda7832b000ff8927386f093b52c067641679469Zhongxing Xu // Configurable components creators. 35fda7832b000ff8927386f093b52c067641679469Zhongxing Xu StoreManagerCreator CreateStoreMgr; 36fda7832b000ff8927386f093b52c067641679469Zhongxing Xu ConstraintManagerCreator CreateConstraintMgr; 37fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 38fda7832b000ff8927386f093b52c067641679469Zhongxing Xu enum AnalysisScope { ScopeTU, ScopeDecl } AScope; 39fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 40fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool DisplayedFunction; 41fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool VisualizeEGDot; 42fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool VisualizeEGUbi; 43fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool PurgeDead; 44fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool EagerlyAssume; 45fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool TrimGraph; 46fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 47fda7832b000ff8927386f093b52c067641679469Zhongxing Xupublic: 48fda7832b000ff8927386f093b52c067641679469Zhongxing Xu AnalysisManager(Decl *d, ASTContext &ctx, Diagnostic &diags, 49fda7832b000ff8927386f093b52c067641679469Zhongxing Xu const LangOptions &lang, PathDiagnosticClient *pd, 50fda7832b000ff8927386f093b52c067641679469Zhongxing Xu StoreManagerCreator storemgr, 51fda7832b000ff8927386f093b52c067641679469Zhongxing Xu ConstraintManagerCreator constraintmgr, 52fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool displayProgress, bool vizdot, bool vizubi, 53fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool purge, bool eager, bool trim) 54fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 55fda7832b000ff8927386f093b52c067641679469Zhongxing Xu : Ctx(ctx), Diags(diags), LangInfo(lang), PD(pd), 56fda7832b000ff8927386f093b52c067641679469Zhongxing Xu CreateStoreMgr(storemgr), CreateConstraintMgr(constraintmgr), 57fda7832b000ff8927386f093b52c067641679469Zhongxing Xu AScope(ScopeDecl), DisplayedFunction(!displayProgress), 58fda7832b000ff8927386f093b52c067641679469Zhongxing Xu VisualizeEGDot(vizdot), VisualizeEGUbi(vizubi), PurgeDead(purge), 59fda7832b000ff8927386f093b52c067641679469Zhongxing Xu EagerlyAssume(eager), TrimGraph(trim) { 60fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 61fda7832b000ff8927386f093b52c067641679469Zhongxing Xu CurrentContext = ContextMgr.getContext(d); 62fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 63fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 64fda7832b000ff8927386f093b52c067641679469Zhongxing Xu AnalysisManager(ASTContext &ctx, Diagnostic &diags, 65fda7832b000ff8927386f093b52c067641679469Zhongxing Xu const LangOptions &lang, PathDiagnosticClient *pd, 66fda7832b000ff8927386f093b52c067641679469Zhongxing Xu StoreManagerCreator storemgr, 67fda7832b000ff8927386f093b52c067641679469Zhongxing Xu ConstraintManagerCreator constraintmgr, 68fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool displayProgress, bool vizdot, bool vizubi, 69fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool purge, bool eager, bool trim) 70fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 71fda7832b000ff8927386f093b52c067641679469Zhongxing Xu : Ctx(ctx), Diags(diags), LangInfo(lang), PD(pd), 72fda7832b000ff8927386f093b52c067641679469Zhongxing Xu CreateStoreMgr(storemgr), CreateConstraintMgr(constraintmgr), 73fda7832b000ff8927386f093b52c067641679469Zhongxing Xu AScope(ScopeDecl), DisplayedFunction(!displayProgress), 74fda7832b000ff8927386f093b52c067641679469Zhongxing Xu VisualizeEGDot(vizdot), VisualizeEGUbi(vizubi), PurgeDead(purge), 75fda7832b000ff8927386f093b52c067641679469Zhongxing Xu EagerlyAssume(eager), TrimGraph(trim) { 76fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 77fda7832b000ff8927386f093b52c067641679469Zhongxing Xu CurrentContext = 0; 78fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 79fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 80fda7832b000ff8927386f093b52c067641679469Zhongxing Xu Decl *getCodeDecl() const { 81fda7832b000ff8927386f093b52c067641679469Zhongxing Xu assert (AScope == ScopeDecl); 82fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return CurrentContext->getDecl(); 83fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 84fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 85fda7832b000ff8927386f093b52c067641679469Zhongxing Xu Stmt *getBody() const { 86fda7832b000ff8927386f093b52c067641679469Zhongxing Xu assert (AScope == ScopeDecl); 87fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return CurrentContext->getBody(); 88fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 89fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 90fda7832b000ff8927386f093b52c067641679469Zhongxing Xu StoreManagerCreator getStoreManagerCreator() { 91fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return CreateStoreMgr; 92fda7832b000ff8927386f093b52c067641679469Zhongxing Xu }; 93fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 94fda7832b000ff8927386f093b52c067641679469Zhongxing Xu ConstraintManagerCreator getConstraintManagerCreator() { 95fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return CreateConstraintMgr; 96fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 97fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 98fda7832b000ff8927386f093b52c067641679469Zhongxing Xu virtual CFG *getCFG() { 99fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return CurrentContext->getCFG(); 100fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 101fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 102fda7832b000ff8927386f093b52c067641679469Zhongxing Xu virtual ParentMap &getParentMap() { 103fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return CurrentContext->getParentMap(); 104fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 105fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 106fda7832b000ff8927386f093b52c067641679469Zhongxing Xu virtual LiveVariables *getLiveVariables() { 107fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return CurrentContext->getLiveVariables(); 108fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 109fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 110fda7832b000ff8927386f093b52c067641679469Zhongxing Xu virtual ASTContext &getContext() { 111fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return Ctx; 112fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 113fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 114fda7832b000ff8927386f093b52c067641679469Zhongxing Xu virtual SourceManager &getSourceManager() { 115fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return getContext().getSourceManager(); 116fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 117fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 118fda7832b000ff8927386f093b52c067641679469Zhongxing Xu virtual Diagnostic &getDiagnostic() { 119fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return Diags; 120fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 121fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 122fda7832b000ff8927386f093b52c067641679469Zhongxing Xu const LangOptions &getLangOptions() const { 123fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return LangInfo; 124fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 125fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 126fda7832b000ff8927386f093b52c067641679469Zhongxing Xu virtual PathDiagnosticClient *getPathDiagnosticClient() { 127fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return PD.get(); 128fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 129fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 130fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool shouldVisualizeGraphviz() const { return VisualizeEGDot; } 131fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 132fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool shouldVisualizeUbigraph() const { return VisualizeEGUbi; } 133fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 134fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool shouldVisualize() const { 135fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return VisualizeEGDot || VisualizeEGUbi; 136fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 137fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 138fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool shouldTrimGraph() const { return TrimGraph; } 139fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 140fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool shouldPurgeDead() const { return PurgeDead; } 141fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 142fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool shouldEagerlyAssume() const { return EagerlyAssume; } 143fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 144fda7832b000ff8927386f093b52c067641679469Zhongxing Xu void DisplayFunction(); 145fda7832b000ff8927386f093b52c067641679469Zhongxing Xu}; 146fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 147fda7832b000ff8927386f093b52c067641679469Zhongxing Xu} 148fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 149fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#endif 150