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