AnalysisContext.h revision 8ddf7cead8a67342a4584a203e0bf736b7efedbe
1326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek//=== AnalysisContext.h - Analysis context for Path Sens analysis --*- C++ -*-// 2326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek// 3326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek// The LLVM Compiler Infrastructure 4326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek// 5326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek// This file is distributed under the University of Illinois Open Source 6326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek// License. See LICENSE.TXT for details. 7326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek// 8326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek//===----------------------------------------------------------------------===// 9326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek// 10326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek// This file defines AnalysisContext, a class that manages the analysis context 11326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek// data for path sensitive analysis. 12326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek// 13326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek//===----------------------------------------------------------------------===// 14326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 15326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#ifndef LLVM_CLANG_ANALYSIS_ANALYSISCONTEXT_H 16326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#define LLVM_CLANG_ANALYSIS_ANALYSISCONTEXT_H 17326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 18326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#include "clang/AST/Decl.h" 19326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#include "llvm/ADT/OwningPtr.h" 20326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#include "llvm/ADT/FoldingSet.h" 21326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#include "llvm/ADT/PointerUnion.h" 22326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#include "llvm/ADT/DenseMap.h" 23326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#include "llvm/Support/Allocator.h" 24326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 25326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremeneknamespace clang { 26326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 27326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass Decl; 28326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass Stmt; 29326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass CFG; 30326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass CFGBlock; 31326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass LiveVariables; 32326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass ParentMap; 33326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass ImplicitParamDecl; 34326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass LocationContextManager; 35326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass StackFrameContext; 36326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 37326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek/// AnalysisContext contains the context data for the function or method under 38326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek/// analysis. 39326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass AnalysisContext { 40326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const Decl *D; 41326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 42326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek // AnalysisContext owns the following data. 43326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek CFG *cfg; 44326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek LiveVariables *liveness; 45326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ParentMap *PM; 46326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek llvm::DenseMap<const BlockDecl*,void*> *ReferencedBlockVars; 47326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek llvm::BumpPtrAllocator A; 48326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool AddEHEdges; 49326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekpublic: 50326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek AnalysisContext(const Decl *d, bool addehedges = false) 51326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek : D(d), cfg(0), liveness(0), PM(0), ReferencedBlockVars(0), 52326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek AddEHEdges(addehedges) {} 53326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 54326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ~AnalysisContext(); 55326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 56326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ASTContext &getASTContext() { return D->getASTContext(); } 57326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const Decl *getDecl() { return D; } 58326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// getAddEHEdges - Return true iff we are adding exceptional edges from 59326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// callExprs. If this is false, then try/catch statements and blocks 60326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// reachable from them can appear to be dead in the CFG, analysis passes must 61326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// cope with that. 62326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek bool getAddEHEdges() const { return AddEHEdges; } 63326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek Stmt *getBody(); 64326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek CFG *getCFG(); 65326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ParentMap &getParentMap(); 66326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek LiveVariables *getLiveVariables(); 67326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 68326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek typedef const VarDecl * const * referenced_decls_iterator; 69326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 70326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek std::pair<referenced_decls_iterator, referenced_decls_iterator> 71326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek getReferencedBlockVars(const BlockDecl *BD); 72326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 73326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// Return the ImplicitParamDecl* associated with 'self' if this 74326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// AnalysisContext wraps an ObjCMethodDecl. Returns NULL otherwise. 75326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const ImplicitParamDecl *getSelfDecl() const; 76326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek}; 77326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 78326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass AnalysisContextManager { 79326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek typedef llvm::DenseMap<const Decl*, AnalysisContext*> ContextMap; 80326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ContextMap Contexts; 81326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekpublic: 82326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ~AnalysisContextManager(); 83326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 84326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek AnalysisContext *getContext(const Decl *D); 85326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 86326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek // Discard all previously created AnalysisContexts. 87326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void clear(); 88326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek}; 89326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 90326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass LocationContext : public llvm::FoldingSetNode { 91326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekpublic: 92326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek enum ContextKind { StackFrame, Scope, Block }; 93326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 94326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekprivate: 95326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ContextKind Kind; 96326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek AnalysisContext *Ctx; 97326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *Parent; 98326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 99326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekprotected: 100326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek LocationContext(ContextKind k, AnalysisContext *ctx, 101326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *parent) 102326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek : Kind(k), Ctx(ctx), Parent(parent) {} 103326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 104326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekpublic: 105326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek virtual ~LocationContext(); 106326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 107326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ContextKind getKind() const { return Kind; } 108326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 109326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek AnalysisContext *getAnalysisContext() const { return Ctx; } 110326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 111326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *getParent() const { return Parent; } 112326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 1138ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xu bool isParentOf(const LocationContext *LC) const; 1148ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xu 115326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const Decl *getDecl() const { return getAnalysisContext()->getDecl(); } 116326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 117326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek CFG *getCFG() const { return getAnalysisContext()->getCFG(); } 118326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 119326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek LiveVariables *getLiveVariables() const { 120326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek return getAnalysisContext()->getLiveVariables(); 121326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 122326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 123326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ParentMap &getParentMap() const { 124326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek return getAnalysisContext()->getParentMap(); 125326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 126326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 127326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const ImplicitParamDecl *getSelfDecl() const { 128326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek return Ctx->getSelfDecl(); 129326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 130326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 131326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const StackFrameContext *getCurrentStackFrame() const; 132326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const StackFrameContext * 133326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek getStackFrameForDeclContext(const DeclContext *DC) const; 134326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 135326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek virtual void Profile(llvm::FoldingSetNodeID &ID) = 0; 136326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 137326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek static bool classof(const LocationContext*) { return true; } 138326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 139326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekpublic: 140326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek static void ProfileCommon(llvm::FoldingSetNodeID &ID, 141326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ContextKind ck, 142326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek AnalysisContext *ctx, 143326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *parent, 144326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const void* data); 145326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek}; 146326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 147326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass StackFrameContext : public LocationContext { 148326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek // The callsite where this stack frame is established. 149326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const Stmt *CallSite; 150326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 151326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek // The parent block of the callsite. 152326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const CFGBlock *Block; 153326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 154326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek // The index of the callsite in the CFGBlock. 155326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek unsigned Index; 156326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 157326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek friend class LocationContextManager; 158326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek StackFrameContext(AnalysisContext *ctx, const LocationContext *parent, 159326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const Stmt *s, const CFGBlock *blk, unsigned idx) 160326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek : LocationContext(StackFrame, ctx, parent), CallSite(s), Block(blk), 161326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek Index(idx) {} 162326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 163326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekpublic: 164326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ~StackFrameContext() {} 165326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 166326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const Stmt *getCallSite() const { return CallSite; } 167326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 168326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const CFGBlock *getCallSiteBlock() const { return Block; } 169326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 170326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek unsigned getIndex() const { return Index; } 171326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 172326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID); 173326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 174326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek static void Profile(llvm::FoldingSetNodeID &ID, AnalysisContext *ctx, 175326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *parent, const Stmt *s, 176326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const CFGBlock *blk, unsigned idx) { 177326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ProfileCommon(ID, StackFrame, ctx, parent, s); 178326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ID.AddPointer(blk); 179326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ID.AddInteger(idx); 180326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 181326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 182326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek static bool classof(const LocationContext* Ctx) { 183326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek return Ctx->getKind() == StackFrame; 184326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 185326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek}; 186326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 187326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass ScopeContext : public LocationContext { 188326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const Stmt *Enter; 189326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 190326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek friend class LocationContextManager; 191326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ScopeContext(AnalysisContext *ctx, const LocationContext *parent, 192326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const Stmt *s) 193326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek : LocationContext(Scope, ctx, parent), Enter(s) {} 194326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 195326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekpublic: 196326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ~ScopeContext() {} 197326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 198326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID); 199326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 200326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek static void Profile(llvm::FoldingSetNodeID &ID, AnalysisContext *ctx, 201326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *parent, const Stmt *s) { 202326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ProfileCommon(ID, Scope, ctx, parent, s); 203326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 204326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 205326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek static bool classof(const LocationContext* Ctx) { 206326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek return Ctx->getKind() == Scope; 207326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 208326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek}; 209326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 210326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass BlockInvocationContext : public LocationContext { 211326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek // FIXME: Add back context-sensivity (we don't want libAnalysis to know 212326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek // about MemRegion). 213326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const BlockDecl *BD; 214326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 215326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek friend class LocationContextManager; 216326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 217326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek BlockInvocationContext(AnalysisContext *ctx, const LocationContext *parent, 218326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const BlockDecl *bd) 219326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek : LocationContext(Block, ctx, parent), BD(bd) {} 220326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 221326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekpublic: 222326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ~BlockInvocationContext() {} 223326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 224326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const BlockDecl *getBlockDecl() const { return BD; } 225326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 226326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID); 227326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 228326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek static void Profile(llvm::FoldingSetNodeID &ID, AnalysisContext *ctx, 229326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *parent, const BlockDecl *bd) { 230326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ProfileCommon(ID, Block, ctx, parent, bd); 231326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 232326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 233326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek static bool classof(const LocationContext* Ctx) { 234326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek return Ctx->getKind() == Block; 235326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 236326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek}; 237326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 238326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass LocationContextManager { 239326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek llvm::FoldingSet<LocationContext> Contexts; 240326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekpublic: 241326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ~LocationContextManager(); 242326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 243326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const StackFrameContext *getStackFrame(AnalysisContext *ctx, 244326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *parent, 245326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const Stmt *s, const CFGBlock *blk, 246326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek unsigned idx); 247326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 248326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const ScopeContext *getScope(AnalysisContext *ctx, 249326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *parent, 250326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const Stmt *s); 251326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 252326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// Discard all previously created LocationContext objects. 253326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void clear(); 254326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekprivate: 255326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek template <typename LOC, typename DATA> 256326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LOC *getLocationContext(AnalysisContext *ctx, 257326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *parent, 258326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const DATA *d); 259326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek}; 260326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 261326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek} // end clang namespace 262326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#endif 263