AnalysisContext.h revision 1d26f48dc2eea1c07431ca1519d7034a21b9bcff
1bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev//=== AnalysisContext.h - Analysis context for Path Sens analysis --*- C++ -*-// 2bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// 3bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// The LLVM Compiler Infrastructure 4bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// 5bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// This file is distributed under the University of Illinois Open Source 6bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// License. See LICENSE.TXT for details. 7bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// 8bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev//===----------------------------------------------------------------------===// 9bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// 10bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// This file defines AnalysisDeclContext, a class that manages the analysis context 11bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// data for path sensitive analysis. 12bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev// 13bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev//===----------------------------------------------------------------------===// 14bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 15bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#ifndef LLVM_CLANG_ANALYSIS_ANALYSISCONTEXT_H 16bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#define LLVM_CLANG_ANALYSIS_ANALYSISCONTEXT_H 17bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 18bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include "clang/AST/Decl.h" 19bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include "clang/AST/Expr.h" 20bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include "clang/Analysis/CFG.h" 21bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include "llvm/ADT/OwningPtr.h" 22bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include "llvm/ADT/IntrusiveRefCntPtr.h" 23bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include "llvm/ADT/FoldingSet.h" 24bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include "llvm/ADT/PointerUnion.h" 25bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include "llvm/ADT/DenseMap.h" 26bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#include "llvm/Support/Allocator.h" 27bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 28bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevnamespace clang { 29bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 30bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass Decl; 31bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass Stmt; 32bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass CFGReverseBlockReachabilityAnalysis; 33bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass CFGStmtMap; 34bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass LiveVariables; 35bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass ManagedAnalysis; 36bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass ParentMap; 37bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass PseudoConstantAnalysis; 38bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass ImplicitParamDecl; 39bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass LocationContextManager; 40bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass StackFrameContext; 41bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass AnalysisDeclContextManager; 42bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass LocationContext; 43bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 44bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevnamespace idx { class TranslationUnit; } 45bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 46bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/// The base class of a hierarchy of objects representing analyses tied 47bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/// to AnalysisDeclContext. 48bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass ManagedAnalysis { 49bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevprotected: 50bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ManagedAnalysis() {} 51bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevpublic: 52bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev virtual ~ManagedAnalysis(); 53bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 54bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // Subclasses need to implement: 55bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // 56bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // static const void *getTag(); 57bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // 58bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // Which returns a fixed pointer address to distinguish classes of 59bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // analysis objects. They also need to implement: 60bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // 61bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // static [Derived*] create(AnalysisDeclContext &Ctx); 62bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // 63bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // which creates the analysis object given an AnalysisDeclContext. 64bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}; 65bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 66bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 67bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/// AnalysisDeclContext contains the context data for the function or method under 68bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev/// analysis. 69bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass AnalysisDeclContext { 70bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev /// Backpoint to the AnalysisManager object that created this AnalysisDeclContext. 71bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev /// This may be null. 72bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev AnalysisDeclContextManager *Manager; 73bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 74bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const Decl *D; 75bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 76bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // TranslationUnit is NULL if we don't have multiple translation units. 77bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev idx::TranslationUnit *TU; 78bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 79bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev llvm::OwningPtr<CFG> cfg, completeCFG; 80bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev llvm::OwningPtr<CFGStmtMap> cfgStmtMap; 81bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 82bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev CFG::BuildOptions cfgBuildOptions; 83bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev CFG::BuildOptions::ForcedBlkExprs *forcedBlkExprs; 84bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 85bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev bool builtCFG, builtCompleteCFG; 86bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 87bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev llvm::OwningPtr<LiveVariables> liveness; 88bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev llvm::OwningPtr<LiveVariables> relaxedLiveness; 89bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev llvm::OwningPtr<ParentMap> PM; 90bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev llvm::OwningPtr<PseudoConstantAnalysis> PCA; 91bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev llvm::OwningPtr<CFGReverseBlockReachabilityAnalysis> CFA; 92bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 93bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev llvm::BumpPtrAllocator A; 94bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 95bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // FIXME: remove. 96bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev llvm::DenseMap<const BlockDecl*,void*> *ReferencedBlockVars; 97bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 98bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev void *ManagedAnalyses; 99bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 100bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevpublic: 101bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev AnalysisDeclContext(AnalysisDeclContextManager *Mgr, 102bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const Decl *D, 103bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev idx::TranslationUnit *TU); 104bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 105bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev AnalysisDeclContext(AnalysisDeclContextManager *Mgr, 106bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const Decl *D, 107bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev idx::TranslationUnit *TU, 108bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const CFG::BuildOptions &BuildOptions); 109bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 110bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ~AnalysisDeclContext(); 111bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 112bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ASTContext &getASTContext() { return D->getASTContext(); } 113bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const Decl *getDecl() const { return D; } 114bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 115bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev idx::TranslationUnit *getTranslationUnit() const { return TU; } 116bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 117bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev /// Return the build options used to construct the CFG. 118bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev CFG::BuildOptions &getCFGBuildOptions() { 119bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev return cfgBuildOptions; 120bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 121bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 122bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const CFG::BuildOptions &getCFGBuildOptions() const { 123bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev return cfgBuildOptions; 124bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 125bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 126bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev /// getAddEHEdges - Return true iff we are adding exceptional edges from 127bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev /// callExprs. If this is false, then try/catch statements and blocks 128bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev /// reachable from them can appear to be dead in the CFG, analysis passes must 129bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev /// cope with that. 130bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev bool getAddEHEdges() const { return cfgBuildOptions.AddEHEdges; } 131bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev bool getUseUnoptimizedCFG() const { 132bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev return !cfgBuildOptions.PruneTriviallyFalseEdges; 133bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 134bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev bool getAddImplicitDtors() const { return cfgBuildOptions.AddImplicitDtors; } 135bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev bool getAddInitializers() const { return cfgBuildOptions.AddInitializers; } 136bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 137bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev void registerForcedBlockExpression(const Stmt *stmt); 138bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const CFGBlock *getBlockForRegisteredExpression(const Stmt *stmt); 139bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 140bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev Stmt *getBody() const; 141bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev CFG *getCFG(); 142bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 143bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev CFGStmtMap *getCFGStmtMap(); 144bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 145bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev CFGReverseBlockReachabilityAnalysis *getCFGReachablityAnalysis(); 146bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 147bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev /// Return a version of the CFG without any edges pruned. 148bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev CFG *getUnoptimizedCFG(); 149bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 150bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev void dumpCFG(); 151bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 152bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev /// \brief Returns true if we have built a CFG for this analysis context. 153bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev /// Note that this doesn't correspond to whether or not a valid CFG exists, it 154bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev /// corresponds to whether we *attempted* to build one. 155bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev bool isCFGBuilt() const { return builtCFG; } 156bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 157bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ParentMap &getParentMap(); 158bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev PseudoConstantAnalysis *getPseudoConstantAnalysis(); 159bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 160bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev typedef const VarDecl * const * referenced_decls_iterator; 161bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 162bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev std::pair<referenced_decls_iterator, referenced_decls_iterator> 163bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev getReferencedBlockVars(const BlockDecl *BD); 164bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 165bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev /// Return the ImplicitParamDecl* associated with 'self' if this 166bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev /// AnalysisDeclContext wraps an ObjCMethodDecl. Returns NULL otherwise. 167bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const ImplicitParamDecl *getSelfDecl() const; 168bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 169bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const StackFrameContext *getStackFrame(LocationContext const *Parent, 170bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const Stmt *S, 171bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const CFGBlock *Blk, 172bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev unsigned Idx); 173bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 174bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev /// Return the specified analysis object, lazily running the analysis if 175bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev /// necessary. Return NULL if the analysis could not run. 176bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev template <typename T> 177bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev T *getAnalysis() { 178bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const void *tag = T::getTag(); 179bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ManagedAnalysis *&data = getAnalysisImpl(tag); 180bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev if (!data) { 181bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev data = T::create(*this); 182bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 183bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev return static_cast<T*>(data); 184bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 185bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevprivate: 186bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ManagedAnalysis *&getAnalysisImpl(const void* tag); 187bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 188bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev LocationContextManager &getLocationContextManager(); 189bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}; 190bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 191bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass LocationContext : public llvm::FoldingSetNode { 192bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevpublic: 193bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev enum ContextKind { StackFrame, Scope, Block }; 194bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 195bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevprivate: 196bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ContextKind Kind; 197bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 198bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // AnalysisDeclContext can't be const since some methods may modify its member. 199bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev AnalysisDeclContext *Ctx; 200bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 201bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const LocationContext *Parent; 202bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 203bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevprotected: 204bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev LocationContext(ContextKind k, AnalysisDeclContext *ctx, 205bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const LocationContext *parent) 206bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev : Kind(k), Ctx(ctx), Parent(parent) {} 207bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 208bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevpublic: 209bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev virtual ~LocationContext(); 210bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 211bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ContextKind getKind() const { return Kind; } 212bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 213bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev AnalysisDeclContext *getAnalysisDeclContext() const { return Ctx; } 214bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 215bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev idx::TranslationUnit *getTranslationUnit() const { 216bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev return Ctx->getTranslationUnit(); 217bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 218bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 219bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const LocationContext *getParent() const { return Parent; } 220bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 221bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev bool isParentOf(const LocationContext *LC) const; 222bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 223bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const Decl *getDecl() const { return getAnalysisDeclContext()->getDecl(); } 224bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 225bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev CFG *getCFG() const { return getAnalysisDeclContext()->getCFG(); } 226bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 227bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev template <typename T> 228bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev T *getAnalysis() const { 229bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev return getAnalysisDeclContext()->getAnalysis<T>(); 230bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 231bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 232bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ParentMap &getParentMap() const { 233bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev return getAnalysisDeclContext()->getParentMap(); 234bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 235bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 236bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const ImplicitParamDecl *getSelfDecl() const { 237bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev return Ctx->getSelfDecl(); 238bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 239bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 240bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const StackFrameContext *getCurrentStackFrame() const; 241bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const StackFrameContext * 242bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev getStackFrameForDeclContext(const DeclContext *DC) const; 243bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 244bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev virtual void Profile(llvm::FoldingSetNodeID &ID) = 0; 245bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 246bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev static bool classof(const LocationContext*) { return true; } 247bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 248bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevpublic: 249bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev static void ProfileCommon(llvm::FoldingSetNodeID &ID, 250bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ContextKind ck, 251bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev AnalysisDeclContext *ctx, 252bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const LocationContext *parent, 253bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const void *data); 254bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}; 255bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 256bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass StackFrameContext : public LocationContext { 257bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // The callsite where this stack frame is established. 258bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const Stmt *CallSite; 259bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 260bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // The parent block of the callsite. 261bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const CFGBlock *Block; 262bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 263bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // The index of the callsite in the CFGBlock. 264bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev unsigned Index; 265bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 266bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev friend class LocationContextManager; 267bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev StackFrameContext(AnalysisDeclContext *ctx, const LocationContext *parent, 268bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const Stmt *s, const CFGBlock *blk, 269bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev unsigned idx) 270bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev : LocationContext(StackFrame, ctx, parent), CallSite(s), 271bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev Block(blk), Index(idx) {} 272bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 273bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevpublic: 274bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ~StackFrameContext() {} 275bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 276bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const Stmt *getCallSite() const { return CallSite; } 277bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 278bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const CFGBlock *getCallSiteBlock() const { return Block; } 279bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 280bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev unsigned getIndex() const { return Index; } 281bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 282bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev void Profile(llvm::FoldingSetNodeID &ID); 283bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 284bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev static void Profile(llvm::FoldingSetNodeID &ID, AnalysisDeclContext *ctx, 285bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const LocationContext *parent, const Stmt *s, 286bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const CFGBlock *blk, unsigned idx) { 287bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ProfileCommon(ID, StackFrame, ctx, parent, s); 288bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ID.AddPointer(blk); 289bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ID.AddInteger(idx); 290bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 291bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 292bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev static bool classof(const LocationContext *Ctx) { 293bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev return Ctx->getKind() == StackFrame; 294bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 295bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}; 296bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 297bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass ScopeContext : public LocationContext { 298bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const Stmt *Enter; 299bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 300bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev friend class LocationContextManager; 301bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ScopeContext(AnalysisDeclContext *ctx, const LocationContext *parent, 302bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const Stmt *s) 303bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev : LocationContext(Scope, ctx, parent), Enter(s) {} 304bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 305bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevpublic: 306bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ~ScopeContext() {} 307bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 308bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev void Profile(llvm::FoldingSetNodeID &ID); 309bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 310bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev static void Profile(llvm::FoldingSetNodeID &ID, AnalysisDeclContext *ctx, 311bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const LocationContext *parent, const Stmt *s) { 312bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ProfileCommon(ID, Scope, ctx, parent, s); 313bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 314bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 315bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev static bool classof(const LocationContext *Ctx) { 316bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev return Ctx->getKind() == Scope; 317bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 318bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}; 319bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 320bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass BlockInvocationContext : public LocationContext { 321bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // FIXME: Add back context-sensivity (we don't want libAnalysis to know 322bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // about MemRegion). 323bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const BlockDecl *BD; 324bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 325bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev friend class LocationContextManager; 326bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 327bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev BlockInvocationContext(AnalysisDeclContext *ctx, const LocationContext *parent, 328bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const BlockDecl *bd) 329bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev : LocationContext(Block, ctx, parent), BD(bd) {} 330bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 331bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevpublic: 332bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ~BlockInvocationContext() {} 333bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 334bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const BlockDecl *getBlockDecl() const { return BD; } 335bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 336bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev void Profile(llvm::FoldingSetNodeID &ID); 337bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 338bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev static void Profile(llvm::FoldingSetNodeID &ID, AnalysisDeclContext *ctx, 339bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const LocationContext *parent, const BlockDecl *bd) { 340bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ProfileCommon(ID, Block, ctx, parent, bd); 341bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 342bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 343bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev static bool classof(const LocationContext *Ctx) { 344bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev return Ctx->getKind() == Block; 345bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 346bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}; 347bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 348bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass LocationContextManager { 349bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev llvm::FoldingSet<LocationContext> Contexts; 350bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevpublic: 351bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ~LocationContextManager(); 352bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 353bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const StackFrameContext *getStackFrame(AnalysisDeclContext *ctx, 354bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const LocationContext *parent, 355bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const Stmt *s, 356bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const CFGBlock *blk, unsigned idx); 357bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 358bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const ScopeContext *getScope(AnalysisDeclContext *ctx, 359bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const LocationContext *parent, 360bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const Stmt *s); 361bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 362bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev /// Discard all previously created LocationContext objects. 363bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev void clear(); 364bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevprivate: 365bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev template <typename LOC, typename DATA> 366bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const LOC *getLocationContext(AnalysisDeclContext *ctx, 367bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const LocationContext *parent, 368bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const DATA *d); 369bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}; 370bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 371bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevclass AnalysisDeclContextManager { 372bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev typedef llvm::DenseMap<const Decl*, AnalysisDeclContext*> ContextMap; 373bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 374bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ContextMap Contexts; 375bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev LocationContextManager LocContexts; 376bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev CFG::BuildOptions cfgBuildOptions; 377bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 378bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevpublic: 379bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev AnalysisDeclContextManager(bool useUnoptimizedCFG = false, 380bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev bool addImplicitDtors = false, 381bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev bool addInitializers = false); 382bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 383bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev ~AnalysisDeclContextManager(); 384bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 385bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev AnalysisDeclContext *getContext(const Decl *D, idx::TranslationUnit *TU = 0); 386bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 387bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev bool getUseUnoptimizedCFG() const { 388bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev return !cfgBuildOptions.PruneTriviallyFalseEdges; 389bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 390bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 391bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev CFG::BuildOptions &getCFGBuildOptions() { 392bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev return cfgBuildOptions; 393bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 394bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 395bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const StackFrameContext *getStackFrame(AnalysisDeclContext *Ctx, 396bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev LocationContext const *Parent, 397bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const Stmt *S, 398bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const CFGBlock *Blk, 399bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev unsigned Idx) { 400bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev return LocContexts.getStackFrame(Ctx, Parent, S, Blk, Idx); 401bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 402bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 403bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // Get the top level stack frame. 404bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const StackFrameContext *getStackFrame(Decl const *D, 405bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev idx::TranslationUnit *TU) { 406bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev return LocContexts.getStackFrame(getContext(D, TU), 0, 0, 0, 0); 407bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 408bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 409bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev // Get a stack frame with parent. 410bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev StackFrameContext const *getStackFrame(const Decl *D, 411bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev LocationContext const *Parent, 412bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const Stmt *S, 413bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev const CFGBlock *Blk, 414bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev unsigned Idx) { 415bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev return LocContexts.getStackFrame(getContext(D), Parent, S, Blk, Idx); 416bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 417bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 418bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 419bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev /// Discard all previously created AnalysisDeclContexts. 420bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev void clear(); 421bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 422bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishevprivate: 423bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev friend class AnalysisDeclContext; 424bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 425bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev LocationContextManager &getLocationContextManager() { 426bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev return LocContexts; 427bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev } 428bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev}; 429bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev 430bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev} // end clang namespace 431bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev#endif 432bda86ae8203fd360c4e87c310498da1e1e4c53a7Yavor Goulishev