AnalysisManager.h revision 5032ffe4259e7d436f2eb19e5a29fdae559e7c12
1bb8e6488bda12b41b32fc22397a44510cacdac50Zhongxing Xu//== AnalysisManager.h - 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; 2625e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu AnalysisContext *EntryContext; 2718c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu 2818c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu LocationContextManager LocCtxMgr; 29fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 30fda7832b000ff8927386f093b52c067641679469Zhongxing Xu ASTContext &Ctx; 31fda7832b000ff8927386f093b52c067641679469Zhongxing Xu Diagnostic &Diags; 32fda7832b000ff8927386f093b52c067641679469Zhongxing Xu const LangOptions &LangInfo; 33fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 34d07a0d0279c09d1017f8450fce575a94dc9703c0Zhongxing Xu llvm::OwningPtr<PathDiagnosticClient> PD; 35d07a0d0279c09d1017f8450fce575a94dc9703c0Zhongxing Xu 36fda7832b000ff8927386f093b52c067641679469Zhongxing Xu // Configurable components creators. 37fda7832b000ff8927386f093b52c067641679469Zhongxing Xu StoreManagerCreator CreateStoreMgr; 38fda7832b000ff8927386f093b52c067641679469Zhongxing Xu ConstraintManagerCreator CreateConstraintMgr; 39fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 40fda7832b000ff8927386f093b52c067641679469Zhongxing Xu enum AnalysisScope { ScopeTU, ScopeDecl } AScope; 41fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 42fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool DisplayedFunction; 43fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool VisualizeEGDot; 44fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool VisualizeEGUbi; 45fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool PurgeDead; 465032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu 475032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu /// EargerlyAssume - A flag indicating how the engine should handle 485032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu // expressions such as: 'x = (y != 0)'. When this flag is true then 495032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu // the subexpression 'y != 0' will be eagerly assumed to be true or false, 505032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu // thus evaluating it to the integers 0 or 1 respectively. The upside 515032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu // is that this can increase analysis precision until we have a better way 525032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu // to lazily evaluate such logic. The downside is that it eagerly 535032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu // bifurcates paths. 54fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool EagerlyAssume; 55fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool TrimGraph; 56fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 57fda7832b000ff8927386f093b52c067641679469Zhongxing Xupublic: 58fda7832b000ff8927386f093b52c067641679469Zhongxing Xu AnalysisManager(Decl *d, ASTContext &ctx, Diagnostic &diags, 59fda7832b000ff8927386f093b52c067641679469Zhongxing Xu const LangOptions &lang, PathDiagnosticClient *pd, 60fda7832b000ff8927386f093b52c067641679469Zhongxing Xu StoreManagerCreator storemgr, 61fda7832b000ff8927386f093b52c067641679469Zhongxing Xu ConstraintManagerCreator constraintmgr, 62fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool displayProgress, bool vizdot, bool vizubi, 63fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool purge, bool eager, bool trim) 64fda7832b000ff8927386f093b52c067641679469Zhongxing Xu : Ctx(ctx), Diags(diags), LangInfo(lang), PD(pd), 65fda7832b000ff8927386f093b52c067641679469Zhongxing Xu CreateStoreMgr(storemgr), CreateConstraintMgr(constraintmgr), 66fda7832b000ff8927386f093b52c067641679469Zhongxing Xu AScope(ScopeDecl), DisplayedFunction(!displayProgress), 67fda7832b000ff8927386f093b52c067641679469Zhongxing Xu VisualizeEGDot(vizdot), VisualizeEGUbi(vizubi), PurgeDead(purge), 68fda7832b000ff8927386f093b52c067641679469Zhongxing Xu EagerlyAssume(eager), TrimGraph(trim) { 69fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 7025e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu EntryContext = ContextMgr.getContext(d); 71fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 72fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 73fda7832b000ff8927386f093b52c067641679469Zhongxing Xu AnalysisManager(ASTContext &ctx, Diagnostic &diags, 74fda7832b000ff8927386f093b52c067641679469Zhongxing Xu const LangOptions &lang, PathDiagnosticClient *pd, 75fda7832b000ff8927386f093b52c067641679469Zhongxing Xu StoreManagerCreator storemgr, 76fda7832b000ff8927386f093b52c067641679469Zhongxing Xu ConstraintManagerCreator constraintmgr, 77fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool displayProgress, bool vizdot, bool vizubi, 78fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool purge, bool eager, bool trim) 79fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 80fda7832b000ff8927386f093b52c067641679469Zhongxing Xu : Ctx(ctx), Diags(diags), LangInfo(lang), PD(pd), 81fda7832b000ff8927386f093b52c067641679469Zhongxing Xu CreateStoreMgr(storemgr), CreateConstraintMgr(constraintmgr), 82fda7832b000ff8927386f093b52c067641679469Zhongxing Xu AScope(ScopeDecl), DisplayedFunction(!displayProgress), 83fda7832b000ff8927386f093b52c067641679469Zhongxing Xu VisualizeEGDot(vizdot), VisualizeEGUbi(vizubi), PurgeDead(purge), 84fda7832b000ff8927386f093b52c067641679469Zhongxing Xu EagerlyAssume(eager), TrimGraph(trim) { 85fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 8625e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu EntryContext = 0; 87fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 88c471e7b44e63ff1b46b480e723c4130aeaef5a8aZhongxing Xu 8925e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu void setEntryContext(Decl *D) { 9025e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu EntryContext = ContextMgr.getContext(D); 9198f6f2573e400a4245cfb2d6976ffb8a875d25c7Ted Kremenek DisplayedFunction = false; 92c471e7b44e63ff1b46b480e723c4130aeaef5a8aZhongxing Xu } 93fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 942376002038c8b904acd20be754aedd1a7471be71Ted Kremenek const Decl *getCodeDecl() const { 95fda7832b000ff8927386f093b52c067641679469Zhongxing Xu assert (AScope == ScopeDecl); 9625e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu return EntryContext->getDecl(); 97fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 98fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 99fda7832b000ff8927386f093b52c067641679469Zhongxing Xu Stmt *getBody() const { 100fda7832b000ff8927386f093b52c067641679469Zhongxing Xu assert (AScope == ScopeDecl); 10125e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu return EntryContext->getBody(); 102fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 103fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 104fda7832b000ff8927386f093b52c067641679469Zhongxing Xu StoreManagerCreator getStoreManagerCreator() { 105fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return CreateStoreMgr; 106fda7832b000ff8927386f093b52c067641679469Zhongxing Xu }; 107fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 108fda7832b000ff8927386f093b52c067641679469Zhongxing Xu ConstraintManagerCreator getConstraintManagerCreator() { 109fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return CreateConstraintMgr; 110fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 111fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 112fda7832b000ff8927386f093b52c067641679469Zhongxing Xu virtual CFG *getCFG() { 11325e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu return EntryContext->getCFG(); 114fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 115fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 116fda7832b000ff8927386f093b52c067641679469Zhongxing Xu virtual ParentMap &getParentMap() { 11725e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu return EntryContext->getParentMap(); 118fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 119fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 120fda7832b000ff8927386f093b52c067641679469Zhongxing Xu virtual LiveVariables *getLiveVariables() { 12125e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu return EntryContext->getLiveVariables(); 122fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 123fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 1245032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu virtual ASTContext &getASTContext() { 125fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return Ctx; 126fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 127fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 128fda7832b000ff8927386f093b52c067641679469Zhongxing Xu virtual SourceManager &getSourceManager() { 1295032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu return getASTContext().getSourceManager(); 130fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 131fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 132fda7832b000ff8927386f093b52c067641679469Zhongxing Xu virtual Diagnostic &getDiagnostic() { 133fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return Diags; 134fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 135fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 136fda7832b000ff8927386f093b52c067641679469Zhongxing Xu const LangOptions &getLangOptions() const { 137fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return LangInfo; 138fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 139fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 140fda7832b000ff8927386f093b52c067641679469Zhongxing Xu virtual PathDiagnosticClient *getPathDiagnosticClient() { 141d07a0d0279c09d1017f8450fce575a94dc9703c0Zhongxing Xu return PD.get(); 142fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 14318c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu 14425e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu StackFrameContext *getEntryStackFrame() { 14525e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu return LocCtxMgr.getStackFrame(EntryContext, 0, 0); 14618c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu } 147fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 148fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool shouldVisualizeGraphviz() const { return VisualizeEGDot; } 149fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 150fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool shouldVisualizeUbigraph() const { return VisualizeEGUbi; } 151fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 152fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool shouldVisualize() const { 153fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return VisualizeEGDot || VisualizeEGUbi; 154fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 155fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 156fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool shouldTrimGraph() const { return TrimGraph; } 157fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 158fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool shouldPurgeDead() const { return PurgeDead; } 159fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 160fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool shouldEagerlyAssume() const { return EagerlyAssume; } 161fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 162fda7832b000ff8927386f093b52c067641679469Zhongxing Xu void DisplayFunction(); 163fda7832b000ff8927386f093b52c067641679469Zhongxing Xu}; 164fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 165fda7832b000ff8927386f093b52c067641679469Zhongxing Xu} 166fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 167fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#endif 168