AnalysisContext.h revision ac7cc2d37e82181e73fcc265c1d0a619d18b7605
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// 10ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie// This file defines AnalysisDeclContext, a class that manages the analysis 11ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie// context 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" 19892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek#include "clang/AST/Expr.h" 20b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek#include "clang/Analysis/CFG.h" 2130a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "llvm/ADT/DenseMap.h" 22326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#include "llvm/ADT/FoldingSet.h" 2330a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "llvm/ADT/IntrusiveRefCntPtr.h" 2430a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "llvm/ADT/OwningPtr.h" 25326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#include "llvm/ADT/PointerUnion.h" 26326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#include "llvm/Support/Allocator.h" 27326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 28326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremeneknamespace clang { 29326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 30326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass Decl; 31326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass Stmt; 32af13d5b25b360e698cc1cf1055ad7d14e008e505Ted Kremenekclass CFGReverseBlockReachabilityAnalysis; 33283a358aecb75e30fcd486f2206f6c03c5e7f11dTed Kremenekclass CFGStmtMap; 34326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass LiveVariables; 35a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenekclass ManagedAnalysis; 36326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass ParentMap; 37db34ab70961ca4b24b600eb47053d7af304659f5Tom Careclass PseudoConstantAnalysis; 38326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass ImplicitParamDecl; 39326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass LocationContextManager; 40326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass StackFrameContext; 417fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenekclass BlockInvocationContext; 421d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenekclass AnalysisDeclContextManager; 43ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikieclass LocationContext; 44b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek 45c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xunamespace idx { class TranslationUnit; } 46c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu 47a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek/// The base class of a hierarchy of objects representing analyses tied 481d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek/// to AnalysisDeclContext. 49a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenekclass ManagedAnalysis { 50a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenekprotected: 51a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek ManagedAnalysis() {} 52a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenekpublic: 53a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek virtual ~ManagedAnalysis(); 54ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 55a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek // Subclasses need to implement: 56a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek // 57a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek // static const void *getTag(); 58a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek // 59a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek // Which returns a fixed pointer address to distinguish classes of 60a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek // analysis objects. They also need to implement: 61a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek // 621d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek // static [Derived*] create(AnalysisDeclContext &Ctx); 63a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek // 641d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek // which creates the analysis object given an AnalysisDeclContext. 65a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek}; 66ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 67ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 68ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie/// AnalysisDeclContext contains the context data for the function or method 69ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie/// under analysis. 701d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenekclass AnalysisDeclContext { 71ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// Backpoint to the AnalysisManager object that created this 72ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie /// AnalysisDeclContext. This may be null. 731d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContextManager *Manager; 74ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 75cca300a91966df70c9c320e477a3c26ba622673dTed Kremenek const Decl * const D; 76326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 776f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<CFG> cfg, completeCFG; 786f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<CFGStmtMap> cfgStmtMap; 79b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek 80b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek CFG::BuildOptions cfgBuildOptions; 81b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek CFG::BuildOptions::ForcedBlkExprs *forcedBlkExprs; 82ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 83ad5a894df1841698c824381b414630799adc26caTed Kremenek bool builtCFG, builtCompleteCFG; 846f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<ParentMap> PM; 856f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<PseudoConstantAnalysis> PCA; 866f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith OwningPtr<CFGReverseBlockReachabilityAnalysis> CFA; 87b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek 88326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek llvm::BumpPtrAllocator A; 89b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek 90b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek llvm::DenseMap<const BlockDecl*,void*> *ReferencedBlockVars; 91b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek 92a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek void *ManagedAnalyses; 93a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek 94326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekpublic: 951d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext(AnalysisDeclContextManager *Mgr, 96d200187bd27f9ad68699693a6e57f9ee3ff260faJordy Rose const Decl *D); 97bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek 981d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext(AnalysisDeclContextManager *Mgr, 99b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek const Decl *D, 100b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek const CFG::BuildOptions &BuildOptions); 101326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 1021d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek ~AnalysisDeclContext(); 103326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 104445895a97ae3f1d7bad3480839d31ed3ebcc9c83Ted Kremenek ASTContext &getASTContext() const { return D->getASTContext(); } 105c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu const Decl *getDecl() const { return D; } 106c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu 107ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek /// Return the AnalysisDeclContextManager (if any) that created 108ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek /// this AnalysisDeclContext. 109ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek AnalysisDeclContextManager *getManager() const { 110ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek return Manager; 111ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek } 112ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek 11374fb1a493cf5d2dd0fb51a4eadf74e85e10a3457Ted Kremenek /// Return the build options used to construct the CFG. 11474fb1a493cf5d2dd0fb51a4eadf74e85e10a3457Ted Kremenek CFG::BuildOptions &getCFGBuildOptions() { 11574fb1a493cf5d2dd0fb51a4eadf74e85e10a3457Ted Kremenek return cfgBuildOptions; 11674fb1a493cf5d2dd0fb51a4eadf74e85e10a3457Ted Kremenek } 11774fb1a493cf5d2dd0fb51a4eadf74e85e10a3457Ted Kremenek 11874fb1a493cf5d2dd0fb51a4eadf74e85e10a3457Ted Kremenek const CFG::BuildOptions &getCFGBuildOptions() const { 11974fb1a493cf5d2dd0fb51a4eadf74e85e10a3457Ted Kremenek return cfgBuildOptions; 12074fb1a493cf5d2dd0fb51a4eadf74e85e10a3457Ted Kremenek } 121ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 122f3477c13eeaf11b32a41f181398fb5deffd0dd73Sylvestre Ledru /// getAddEHEdges - Return true iff we are adding exceptional edges from 123326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// callExprs. If this is false, then try/catch statements and blocks 124326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// reachable from them can appear to be dead in the CFG, analysis passes must 125326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// cope with that. 126ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie bool getAddEHEdges() const { return cfgBuildOptions.AddEHEdges; } 127b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek bool getUseUnoptimizedCFG() const { 128bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek return !cfgBuildOptions.PruneTriviallyFalseEdges; 129b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek } 130b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek bool getAddImplicitDtors() const { return cfgBuildOptions.AddImplicitDtors; } 131b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek bool getAddInitializers() const { return cfgBuildOptions.AddInitializers; } 1329b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek 1330d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenek void registerForcedBlockExpression(const Stmt *stmt); 1340d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenek const CFGBlock *getBlockForRegisteredExpression(const Stmt *stmt); 135ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 136453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks /// \brief Get the body of the Declaration. 137a2d7e6511a8767dc67381c210601b895a8ebae39Anna Zaks Stmt *getBody() const; 138453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks 139453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks /// \brief Get the body of the Declaration. 140087f40702fd00898fbb66d765d1143fd944c0485Anna Zaks /// \param[out] IsAutosynthesized Specifies if the body is auto-generated 141087f40702fd00898fbb66d765d1143fd944c0485Anna Zaks /// by the BodyFarm. 142453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks Stmt *getBody(bool &IsAutosynthesized) const; 143453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks 144453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks /// \brief Checks if the body of the Decl is generated by the BodyFarm. 145453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks /// 146453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks /// Note, the lookup is not free. We are going to call getBody behind 147087f40702fd00898fbb66d765d1143fd944c0485Anna Zaks /// the scenes. 148453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks /// \sa getBody 149453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks bool isBodyAutosynthesized() const; 150453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks 151326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek CFG *getCFG(); 152ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 153283a358aecb75e30fcd486f2206f6c03c5e7f11dTed Kremenek CFGStmtMap *getCFGStmtMap(); 15404eeba43040969c05cfcb563195ef5b199297b62Anders Carlsson 155af13d5b25b360e698cc1cf1055ad7d14e008e505Ted Kremenek CFGReverseBlockReachabilityAnalysis *getCFGReachablityAnalysis(); 156ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 157ad5a894df1841698c824381b414630799adc26caTed Kremenek /// Return a version of the CFG without any edges pruned. 158ad5a894df1841698c824381b414630799adc26caTed Kremenek CFG *getUnoptimizedCFG(); 159ad5a894df1841698c824381b414630799adc26caTed Kremenek 160682060c5d95f6e4f79536013781ab0870cdd3850Ted Kremenek void dumpCFG(bool ShowColors); 16104eeba43040969c05cfcb563195ef5b199297b62Anders Carlsson 1625d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth /// \brief Returns true if we have built a CFG for this analysis context. 1635d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth /// Note that this doesn't correspond to whether or not a valid CFG exists, it 1645d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth /// corresponds to whether we *attempted* to build one. 1655d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth bool isCFGBuilt() const { return builtCFG; } 1665d98994c7749312a43ce6adf45537979a98e7afdChandler Carruth 167326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ParentMap &getParentMap(); 168db34ab70961ca4b24b600eb47053d7af304659f5Tom Care PseudoConstantAnalysis *getPseudoConstantAnalysis(); 169326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 170326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek typedef const VarDecl * const * referenced_decls_iterator; 171326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 172326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek std::pair<referenced_decls_iterator, referenced_decls_iterator> 173326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek getReferencedBlockVars(const BlockDecl *BD); 174d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek 175326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// Return the ImplicitParamDecl* associated with 'self' if this 1761d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek /// AnalysisDeclContext wraps an ObjCMethodDecl. Returns NULL otherwise. 177326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const ImplicitParamDecl *getSelfDecl() const; 178ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 179b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek const StackFrameContext *getStackFrame(LocationContext const *Parent, 180b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek const Stmt *S, 181b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek const CFGBlock *Blk, 182ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie unsigned Idx); 1837fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 1847fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const BlockInvocationContext * 1857fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek getBlockInvocationContext(const LocationContext *parent, 1867fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const BlockDecl *BD, 1877fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const void *ContextData); 188ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 189a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// Return the specified analysis object, lazily running the analysis if 190a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek /// necessary. Return NULL if the analysis could not run. 191a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek template <typename T> 192a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek T *getAnalysis() { 193a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek const void *tag = T::getTag(); 194a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek ManagedAnalysis *&data = getAnalysisImpl(tag); 195a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek if (!data) { 196a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek data = T::create(*this); 197a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek } 198a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek return static_cast<T*>(data); 199a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek } 200a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenekprivate: 201a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek ManagedAnalysis *&getAnalysisImpl(const void* tag); 202ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 203b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek LocationContextManager &getLocationContextManager(); 204326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek}; 205326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 206326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass LocationContext : public llvm::FoldingSetNode { 207326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekpublic: 208326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek enum ContextKind { StackFrame, Scope, Block }; 209326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 210326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekprivate: 211326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ContextKind Kind; 212a02d893f15d4663bdba3bd92ade10070bf0510e4Zhongxing Xu 213ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie // AnalysisDeclContext can't be const since some methods may modify its 214ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie // member. 2151d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *Ctx; 216a02d893f15d4663bdba3bd92ade10070bf0510e4Zhongxing Xu 217326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *Parent; 218326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 219326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekprotected: 2201d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek LocationContext(ContextKind k, AnalysisDeclContext *ctx, 221326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *parent) 222326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek : Kind(k), Ctx(ctx), Parent(parent) {} 223326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 224326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekpublic: 225326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek virtual ~LocationContext(); 226d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek 227326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ContextKind getKind() const { return Kind; } 228326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 2291d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *getAnalysisDeclContext() const { return Ctx; } 230326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 231326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *getParent() const { return Parent; } 232326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 2338ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xu bool isParentOf(const LocationContext *LC) const; 2348ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xu 2351d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek const Decl *getDecl() const { return getAnalysisDeclContext()->getDecl(); } 236326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 2371d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek CFG *getCFG() const { return getAnalysisDeclContext()->getCFG(); } 238326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 239a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek template <typename T> 240a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek T *getAnalysis() const { 2411d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek return getAnalysisDeclContext()->getAnalysis<T>(); 242326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 243326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 244d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek ParentMap &getParentMap() const { 2451d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek return getAnalysisDeclContext()->getParentMap(); 246326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 247326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 248326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const ImplicitParamDecl *getSelfDecl() const { 249326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek return Ctx->getSelfDecl(); 250326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 251d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek 252326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const StackFrameContext *getCurrentStackFrame() const; 253326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 254fadcd5d5bbe1bfc1c6b8d819cc2242f780a49fecAnna Zaks /// Return true if the current LocationContext has no caller context. 255fadcd5d5bbe1bfc1c6b8d819cc2242f780a49fecAnna Zaks virtual bool inTopFrame() const; 256fadcd5d5bbe1bfc1c6b8d819cc2242f780a49fecAnna Zaks 257326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek virtual void Profile(llvm::FoldingSetNodeID &ID) = 0; 258326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 259ac7cc2d37e82181e73fcc265c1d0a619d18b7605Jordan Rose void dumpStack(raw_ostream &OS, StringRef Indent = "") const; 26075f8bd01319000b3e1438847505302670514759dJordan Rose LLVM_ATTRIBUTE_USED void dumpStack() const; 26175f8bd01319000b3e1438847505302670514759dJordan Rose 262326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekpublic: 263326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek static void ProfileCommon(llvm::FoldingSetNodeID &ID, 264326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ContextKind ck, 2651d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *ctx, 266326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *parent, 2679c378f705405d37f49795d5e915989de774fe11fTed Kremenek const void *data); 268326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek}; 269326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 270326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass StackFrameContext : public LocationContext { 27126c9cb55cb96643c0759c08d037c16c309864087Zhongxing Xu // The callsite where this stack frame is established. 272892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek const Stmt *CallSite; 273326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 274326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek // The parent block of the callsite. 275326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const CFGBlock *Block; 276326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 277326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek // The index of the callsite in the CFGBlock. 278326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek unsigned Index; 279326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 280326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek friend class LocationContextManager; 2811d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek StackFrameContext(AnalysisDeclContext *ctx, const LocationContext *parent, 282ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie const Stmt *s, const CFGBlock *blk, 283d706434b0231c76fd9acf30060646a7aa8f69aefZhongxing Xu unsigned idx) 284892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek : LocationContext(StackFrame, ctx, parent), CallSite(s), 285d706434b0231c76fd9acf30060646a7aa8f69aefZhongxing Xu Block(blk), Index(idx) {} 286326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 287326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekpublic: 288326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ~StackFrameContext() {} 289326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 290892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek const Stmt *getCallSite() const { return CallSite; } 291d706434b0231c76fd9acf30060646a7aa8f69aefZhongxing Xu 292326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const CFGBlock *getCallSiteBlock() const { return Block; } 293326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 294fadcd5d5bbe1bfc1c6b8d819cc2242f780a49fecAnna Zaks /// Return true if the current LocationContext has no caller context. 295fadcd5d5bbe1bfc1c6b8d819cc2242f780a49fecAnna Zaks virtual bool inTopFrame() const { return getParent() == 0; } 296fadcd5d5bbe1bfc1c6b8d819cc2242f780a49fecAnna Zaks 297326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek unsigned getIndex() const { return Index; } 298326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 299326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID); 300d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek 3011d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek static void Profile(llvm::FoldingSetNodeID &ID, AnalysisDeclContext *ctx, 302d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek const LocationContext *parent, const Stmt *s, 303892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek const CFGBlock *blk, unsigned idx) { 304326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ProfileCommon(ID, StackFrame, ctx, parent, s); 305326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ID.AddPointer(blk); 306326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ID.AddInteger(idx); 307326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 308326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 3099c378f705405d37f49795d5e915989de774fe11fTed Kremenek static bool classof(const LocationContext *Ctx) { 310326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek return Ctx->getKind() == StackFrame; 311326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 312326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek}; 313326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 314326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass ScopeContext : public LocationContext { 315326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const Stmt *Enter; 316d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek 317326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek friend class LocationContextManager; 3181d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek ScopeContext(AnalysisDeclContext *ctx, const LocationContext *parent, 319326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const Stmt *s) 320326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek : LocationContext(Scope, ctx, parent), Enter(s) {} 321326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 322326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekpublic: 323326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ~ScopeContext() {} 324326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 325326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID); 326326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 3271d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek static void Profile(llvm::FoldingSetNodeID &ID, AnalysisDeclContext *ctx, 328326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *parent, const Stmt *s) { 329326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ProfileCommon(ID, Scope, ctx, parent, s); 330326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 331326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 3329c378f705405d37f49795d5e915989de774fe11fTed Kremenek static bool classof(const LocationContext *Ctx) { 333326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek return Ctx->getKind() == Scope; 334326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 335326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek}; 336326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 337326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass BlockInvocationContext : public LocationContext { 338326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const BlockDecl *BD; 3397fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 3407fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek // FIXME: Come up with a more type-safe way to model context-sensitivity. 3417fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const void *ContextData; 342326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 343326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek friend class LocationContextManager; 344326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 345ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie BlockInvocationContext(AnalysisDeclContext *ctx, 346ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie const LocationContext *parent, 3477fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const BlockDecl *bd, const void *contextData) 3487fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek : LocationContext(Block, ctx, parent), BD(bd), ContextData(contextData) {} 349326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 350326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekpublic: 351326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ~BlockInvocationContext() {} 352326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 353326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const BlockDecl *getBlockDecl() const { return BD; } 3547fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 3557fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const void *getContextData() const { return ContextData; } 356326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 357326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID); 358326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 3591d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek static void Profile(llvm::FoldingSetNodeID &ID, AnalysisDeclContext *ctx, 3607fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const LocationContext *parent, const BlockDecl *bd, 3617fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const void *contextData) { 362326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ProfileCommon(ID, Block, ctx, parent, bd); 3637fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek ID.AddPointer(contextData); 364326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 365d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek 3669c378f705405d37f49795d5e915989de774fe11fTed Kremenek static bool classof(const LocationContext *Ctx) { 367326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek return Ctx->getKind() == Block; 368326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek } 369326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek}; 370326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 371326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekclass LocationContextManager { 372326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek llvm::FoldingSet<LocationContext> Contexts; 373326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekpublic: 374326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek ~LocationContextManager(); 375d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek 3761d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek const StackFrameContext *getStackFrame(AnalysisDeclContext *ctx, 377326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *parent, 378892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek const Stmt *s, 379d706434b0231c76fd9acf30060646a7aa8f69aefZhongxing Xu const CFGBlock *blk, unsigned idx); 380326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 3811d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek const ScopeContext *getScope(AnalysisDeclContext *ctx, 382326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *parent, 383326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const Stmt *s); 3847fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 3857fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const BlockInvocationContext * 3867fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek getBlockInvocationContext(AnalysisDeclContext *ctx, 3877fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const LocationContext *parent, 3887fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const BlockDecl *BD, 3897fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const void *ContextData); 390d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek 391326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek /// Discard all previously created LocationContext objects. 392326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek void clear(); 393326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenekprivate: 394326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek template <typename LOC, typename DATA> 3951d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek const LOC *getLocationContext(AnalysisDeclContext *ctx, 396326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const LocationContext *parent, 397326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek const DATA *d); 398326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek}; 399326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek 4001d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenekclass AnalysisDeclContextManager { 4011d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek typedef llvm::DenseMap<const Decl*, AnalysisDeclContext*> ContextMap; 402ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 403b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek ContextMap Contexts; 404b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek LocationContextManager LocContexts; 405b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek CFG::BuildOptions cfgBuildOptions; 406a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek 407a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek /// Flag to indicate whether or not bodies should be synthesized 408a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek /// for well-known functions. 409a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek bool SynthesizeBodies; 410ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 411b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenekpublic: 4121d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContextManager(bool useUnoptimizedCFG = false, 4135a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose bool addImplicitDtors = false, 4145a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose bool addInitializers = false, 415a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek bool addTemporaryDtors = false, 41602a88c3edf1aeb9580e0b6e444b30c52846a673cTed Kremenek bool synthesizeBodies = false, 41702a88c3edf1aeb9580e0b6e444b30c52846a673cTed Kremenek bool addStaticInitBranches = false); 418ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 4191d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek ~AnalysisDeclContextManager(); 420ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 421d200187bd27f9ad68699693a6e57f9ee3ff260faJordy Rose AnalysisDeclContext *getContext(const Decl *D); 422ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 423b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek bool getUseUnoptimizedCFG() const { 424b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek return !cfgBuildOptions.PruneTriviallyFalseEdges; 425b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek } 426ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 427b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek CFG::BuildOptions &getCFGBuildOptions() { 428b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek return cfgBuildOptions; 429b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek } 430a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek 431a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek /// Return true if faux bodies should be synthesized for well-known 432a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek /// functions. 433a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek bool synthesizeBodies() const { return SynthesizeBodies; } 434ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 4351d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek const StackFrameContext *getStackFrame(AnalysisDeclContext *Ctx, 436b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek LocationContext const *Parent, 437b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek const Stmt *S, 438b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek const CFGBlock *Blk, 439b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek unsigned Idx) { 440b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek return LocContexts.getStackFrame(Ctx, Parent, S, Blk, Idx); 441b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek } 442ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 443b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek // Get the top level stack frame. 444d200187bd27f9ad68699693a6e57f9ee3ff260faJordy Rose const StackFrameContext *getStackFrame(const Decl *D) { 445d200187bd27f9ad68699693a6e57f9ee3ff260faJordy Rose return LocContexts.getStackFrame(getContext(D), 0, 0, 0, 0); 446b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek } 447ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie 448b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek // Get a stack frame with parent. 449ba243b59a1074e0962f6abfa3bb9aa984eac1245David Blaikie StackFrameContext const *getStackFrame(const Decl *D, 450b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek LocationContext const *Parent, 451b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek const Stmt *S, 452b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek const CFGBlock *Blk, 453b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek unsigned Idx) { 454b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek return LocContexts.getStackFrame(getContext(D), Parent, S, Blk, Idx); 455b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek } 456b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek 4571d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek /// Discard all previously created AnalysisDeclContexts. 458b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek void clear(); 459b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek 460b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenekprivate: 4611d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek friend class AnalysisDeclContext; 462b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek 463b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek LocationContextManager &getLocationContextManager() { 464b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek return LocContexts; 465b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek } 466b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek}; 467b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek 468326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek} // end clang namespace 469326be568e2cb04285c84e6e26a3e6b3822607361Ted Kremenek#endif 470