AnalysisContext.h revision 087f40702fd00898fbb66d765d1143fd944c0485
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//=== AnalysisContext.h - Analysis context for Path Sens analysis --*- C++ -*-// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file defines AnalysisDeclContext, a class that manages the analysis 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// context data for path sensitive analysis. 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef LLVM_CLANG_ANALYSIS_ANALYSISCONTEXT_H 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define LLVM_CLANG_ANALYSIS_ANALYSISCONTEXT_H 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "clang/AST/Decl.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/AST/Expr.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Analysis/CFG.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/DenseMap.h" 223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "llvm/ADT/FoldingSet.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/ADT/IntrusiveRefCntPtr.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/OwningPtr.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/PointerUnion.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Support/Allocator.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace clang { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Decl; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Stmt; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CFGReverseBlockReachabilityAnalysis; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CFGStmtMap; 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class LiveVariables; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ManagedAnalysis; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ParentMap; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PseudoConstantAnalysis; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImplicitParamDecl; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocationContextManager; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StackFrameContext; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BlockInvocationContext; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AnalysisDeclContextManager; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocationContext; 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace idx { class TranslationUnit; } 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/// The base class of a hierarchy of objects representing analyses tied 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// to AnalysisDeclContext. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ManagedAnalysis { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected: 51b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ManagedAnalysis() {} 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ManagedAnalysis(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Subclasses need to implement: 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // static const void *getTag(); 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Which returns a fixed pointer address to distinguish classes of 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // analysis objects. They also need to implement: 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // static [Derived*] create(AnalysisDeclContext &Ctx); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // which creates the analysis object given an AnalysisDeclContext. 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// AnalysisDeclContext contains the context data for the function or method 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// under analysis. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AnalysisDeclContext { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Backpoint to the AnalysisManager object that created this 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// AnalysisDeclContext. This may be null. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnalysisDeclContextManager *Manager; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Decl * const D; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwningPtr<CFG> cfg, completeCFG; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwningPtr<CFGStmtMap> cfgStmtMap; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CFG::BuildOptions cfgBuildOptions; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CFG::BuildOptions::ForcedBlkExprs *forcedBlkExprs; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool builtCFG, builtCompleteCFG; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwningPtr<ParentMap> PM; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwningPtr<PseudoConstantAnalysis> PCA; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OwningPtr<CFGReverseBlockReachabilityAnalysis> CFA; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) llvm::BumpPtrAllocator A; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) llvm::DenseMap<const BlockDecl*,void*> *ReferencedBlockVars; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void *ManagedAnalyses; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnalysisDeclContext(AnalysisDeclContextManager *Mgr, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Decl *D); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnalysisDeclContext(AnalysisDeclContextManager *Mgr, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Decl *D, 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CFG::BuildOptions &BuildOptions); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~AnalysisDeclContext(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASTContext &getASTContext() const { return D->getASTContext(); } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Decl *getDecl() const { return D; } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Return the AnalysisDeclContextManager (if any) that created 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// this AnalysisDeclContext. 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnalysisDeclContextManager *getManager() const { 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Manager; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Return the build options used to construct the CFG. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CFG::BuildOptions &getCFGBuildOptions() { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cfgBuildOptions; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CFG::BuildOptions &getCFGBuildOptions() const { 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return cfgBuildOptions; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 121558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// getAddEHEdges - Return true iff we are adding exceptional edges from 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// callExprs. If this is false, then try/catch statements and blocks 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// reachable from them can appear to be dead in the CFG, analysis passes must 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// cope with that. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool getAddEHEdges() const { return cfgBuildOptions.AddEHEdges; } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool getUseUnoptimizedCFG() const { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !cfgBuildOptions.PruneTriviallyFalseEdges; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool getAddImplicitDtors() const { return cfgBuildOptions.AddImplicitDtors; } 131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool getAddInitializers() const { return cfgBuildOptions.AddInitializers; } 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void registerForcedBlockExpression(const Stmt *stmt); 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const CFGBlock *getBlockForRegisteredExpression(const Stmt *stmt); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Get the body of the Declaration. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt *getBody() const; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Get the body of the Declaration. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \param[out] IsAutosynthesized Specifies if the body is auto-generated 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// by the BodyFarm. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Stmt *getBody(bool &IsAutosynthesized) const; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Checks if the body of the Decl is generated by the BodyFarm. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Note, the lookup is not free. We are going to call getBody behind 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// the scenes. 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// \sa getBody 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool isBodyAutosynthesized() const; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CFG *getCFG(); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CFGStmtMap *getCFGStmtMap(); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CFGReverseBlockReachabilityAnalysis *getCFGReachablityAnalysis(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Return a version of the CFG without any edges pruned. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CFG *getUnoptimizedCFG(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void dumpCFG(bool ShowColors); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Returns true if we have built a CFG for this analysis context. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Note that this doesn't correspond to whether or not a valid CFG exists, it 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// corresponds to whether we *attempted* to build one. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isCFGBuilt() const { return builtCFG; } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParentMap &getParentMap(); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PseudoConstantAnalysis *getPseudoConstantAnalysis(); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef const VarDecl * const * referenced_decls_iterator; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::pair<referenced_decls_iterator, referenced_decls_iterator> 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getReferencedBlockVars(const BlockDecl *BD); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// Return the ImplicitParamDecl* associated with 'self' if this 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// AnalysisDeclContext wraps an ObjCMethodDecl. Returns NULL otherwise. 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ImplicitParamDecl *getSelfDecl() const; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const StackFrameContext *getStackFrame(LocationContext const *Parent, 180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const Stmt *S, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CFGBlock *Blk, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned Idx); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BlockInvocationContext * 185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) getBlockInvocationContext(const LocationContext *parent, 186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const BlockDecl *BD, 187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const void *ContextData); 188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /// Return the specified analysis object, lazily running the analysis if 190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /// necessary. Return NULL if the analysis could not run. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename T> 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T *getAnalysis() { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *tag = T::getTag(); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ManagedAnalysis *&data = getAnalysisImpl(tag); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!data) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data = T::create(*this); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<T*>(data); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)private: 201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ManagedAnalysis *&getAnalysisImpl(const void* tag); 202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LocationContextManager &getLocationContextManager(); 204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LocationContext : public llvm::FoldingSetNode { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum ContextKind { StackFrame, Scope, Block }; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContextKind Kind; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AnalysisDeclContext can't be const since some methods may modify its 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // member. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnalysisDeclContext *Ctx; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationContext *Parent; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected: 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocationContext(ContextKind k, AnalysisDeclContext *ctx, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationContext *parent) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Kind(k), Ctx(ctx), Parent(parent) {} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~LocationContext(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContextKind getKind() const { return Kind; } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnalysisDeclContext *getAnalysisDeclContext() const { return Ctx; } 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationContext *getParent() const { return Parent; } 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool isParentOf(const LocationContext *LC) const; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Decl *getDecl() const { return getAnalysisDeclContext()->getDecl(); } 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CFG *getCFG() const { return getAnalysisDeclContext()->getCFG(); } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename T> 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T *getAnalysis() const { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return getAnalysisDeclContext()->getAnalysis<T>(); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParentMap &getParentMap() const { 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return getAnalysisDeclContext()->getParentMap(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ImplicitParamDecl *getSelfDecl() const { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Ctx->getSelfDecl(); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StackFrameContext *getCurrentStackFrame() const; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Return true if the current LocationContext has no caller context. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool inTopFrame() const; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Profile(llvm::FoldingSetNodeID &ID) = 0; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void ProfileCommon(llvm::FoldingSetNodeID &ID, 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContextKind ck, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnalysisDeclContext *ctx, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationContext *parent, 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const void *data); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 267558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass StackFrameContext : public LocationContext { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The callsite where this stack frame is established. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Stmt *CallSite; 270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The parent block of the callsite. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CFGBlock *Block; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The index of the callsite in the CFGBlock. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned Index; 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class LocationContextManager; 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StackFrameContext(AnalysisDeclContext *ctx, const LocationContext *parent, 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Stmt *s, const CFGBlock *blk, 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned idx) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocationContext(StackFrame, ctx, parent), CallSite(s), 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Block(blk), Index(idx) {} 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~StackFrameContext() {} 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Stmt *getCallSite() const { return CallSite; } 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CFGBlock *getCallSiteBlock() const { return Block; } 290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /// Return true if the current LocationContext has no caller context. 292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual bool inTopFrame() const { return getParent() == 0; } 293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned getIndex() const { return Index; } 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Profile(llvm::FoldingSetNodeID &ID); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Profile(llvm::FoldingSetNodeID &ID, AnalysisDeclContext *ctx, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationContext *parent, const Stmt *s, 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CFGBlock *blk, unsigned idx) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileCommon(ID, StackFrame, ctx, parent, s); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddPointer(blk); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddInteger(idx); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const LocationContext *Ctx) { 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Ctx->getKind() == StackFrame; 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopeContext : public LocationContext { 312b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const Stmt *Enter; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class LocationContextManager; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopeContext(AnalysisDeclContext *ctx, const LocationContext *parent, 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Stmt *s) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocationContext(Scope, ctx, parent), Enter(s) {} 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopeContext() {} 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Profile(llvm::FoldingSetNodeID &ID); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void Profile(llvm::FoldingSetNodeID &ID, AnalysisDeclContext *ctx, 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationContext *parent, const Stmt *s) { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileCommon(ID, Scope, ctx, parent, s); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const LocationContext *Ctx) { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Ctx->getKind() == Scope; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BlockInvocationContext : public LocationContext { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BlockDecl *BD; 336ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // FIXME: Come up with a more type-safe way to model context-sensitivity. 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const void *ContextData; 339ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class LocationContextManager; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockInvocationContext(AnalysisDeclContext *ctx, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationContext *parent, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BlockDecl *bd, const void *contextData) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocationContext(Block, ctx, parent), BD(bd), ContextData(contextData) {} 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~BlockInvocationContext() {} 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BlockDecl *getBlockDecl() const { return BD; } 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const void *getContextData() const { return ContextData; } 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Profile(llvm::FoldingSetNodeID &ID); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Profile(llvm::FoldingSetNodeID &ID, AnalysisDeclContext *ctx, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationContext *parent, const BlockDecl *bd, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void *contextData) { 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileCommon(ID, Block, ctx, parent, bd); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ID.AddPointer(contextData); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const LocationContext *Ctx) { 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Ctx->getKind() == Block; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocationContextManager { 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::FoldingSet<LocationContext> Contexts; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~LocationContextManager(); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StackFrameContext *getStackFrame(AnalysisDeclContext *ctx, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationContext *parent, 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Stmt *s, 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CFGBlock *blk, unsigned idx); 3771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const ScopeContext *getScope(AnalysisDeclContext *ctx, 3793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const LocationContext *parent, 380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const Stmt *s); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BlockInvocationContext * 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getBlockInvocationContext(AnalysisDeclContext *ctx, 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationContext *parent, 3853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const BlockDecl *BD, 3863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const void *ContextData); 3873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 3883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch /// Discard all previously created LocationContext objects. 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void clear(); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private: 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename LOC, typename DATA> 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LOC *getLocationContext(AnalysisDeclContext *ctx, 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationContext *parent, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DATA *d); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AnalysisDeclContextManager { 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef llvm::DenseMap<const Decl*, AnalysisDeclContext*> ContextMap; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContextMap Contexts; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocationContextManager LocContexts; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CFG::BuildOptions cfgBuildOptions; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Flag to indicate whether or not bodies should be synthesized 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// for well-known functions. 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool SynthesizeBodies; 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnalysisDeclContextManager(bool useUnoptimizedCFG = false, 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool addImplicitDtors = false, 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool addInitializers = false, 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool addTemporaryDtors = false, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool synthesizeBodies = false); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~AnalysisDeclContextManager(); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnalysisDeclContext *getContext(const Decl *D); 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool getUseUnoptimizedCFG() const { 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !cfgBuildOptions.PruneTriviallyFalseEdges; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CFG::BuildOptions &getCFGBuildOptions() { 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cfgBuildOptions; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Return true if faux bodies should be synthesized for well-known 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// functions. 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool synthesizeBodies() const { return SynthesizeBodies; } 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StackFrameContext *getStackFrame(AnalysisDeclContext *Ctx, 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocationContext const *Parent, 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Stmt *S, 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CFGBlock *Blk, 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned Idx) { 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return LocContexts.getStackFrame(Ctx, Parent, S, Blk, Idx); 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the top level stack frame. 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StackFrameContext *getStackFrame(const Decl *D) { 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return LocContexts.getStackFrame(getContext(D), 0, 0, 0, 0); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get a stack frame with parent. 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StackFrameContext const *getStackFrame(const Decl *D, 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocationContext const *Parent, 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Stmt *S, 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CFGBlock *Blk, 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned Idx) { 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return LocContexts.getStackFrame(getContext(D), Parent, S, Blk, Idx); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Discard all previously created AnalysisDeclContexts. 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void clear(); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private: 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class AnalysisDeclContext; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocationContextManager &getLocationContextManager() { 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return LocContexts; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // end clang namespace 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)