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)