1d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump//===-- CGBlocks.h - state for LLVM CodeGen for blocks ----------*- C++ -*-===//
2d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump//
3d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump//                     The LLVM Compiler Infrastructure
4d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump//
5d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump// This file is distributed under the University of Illinois Open Source
6d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump// License. See LICENSE.TXT for details.
7d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump//
8d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump//===----------------------------------------------------------------------===//
9d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump//
10d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump// This is the internal state used for llvm translation for block literals.
11d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump//
12d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump//===----------------------------------------------------------------------===//
13d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump
14d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump#ifndef CLANG_CODEGEN_CGBLOCKS_H
15d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump#define CLANG_CODEGEN_CGBLOCKS_H
16d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump
172a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump#include "CodeGenTypes.h"
182a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump#include "clang/AST/Type.h"
19a1cf15f4680e5cf39e72e28c5ea854fcba792e84Owen Anderson#include "llvm/Module.h"
202a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump#include "clang/Basic/TargetInfo.h"
21199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck#include "clang/AST/CharUnits.h"
222a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump#include "clang/AST/Expr.h"
232a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump#include "clang/AST/ExprCXX.h"
242a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump#include "clang/AST/ExprObjC.h"
252a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump
26bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall#include "CodeGenFunction.h"
272a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump#include "CGBuilder.h"
282a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump#include "CGCall.h"
292a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump#include "CGValue.h"
302a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump
312a998148a6823c44d67da347c95eb2ea21f6b986Mike Stumpnamespace llvm {
322a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump  class Module;
332a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump  class Constant;
342a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump  class Function;
352a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump  class GlobalValue;
362a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump  class TargetData;
372a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump  class FunctionType;
383d3ec1c099ec8bfac3aa1fb0126fe515b7c7fa05John McCall  class PointerType;
392a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump  class Value;
40f21efe9088a0b3eda1209d1706529f6cb2073092Benjamin Kramer  class LLVMContext;
412a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump}
422a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump
43d883d841c20729972e70853cb08c2e4c7d044d2dMike Stumpnamespace clang {
44d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump
45d883d841c20729972e70853cb08c2e4c7d044d2dMike Stumpnamespace CodeGen {
46d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall
4790a904309c79977fcba2ff0542e2e4cd8e3c3fafMike Stumpclass CodeGenModule;
486b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCallclass CGBlockInfo;
49d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump
50d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCallenum BlockFlag_t {
51d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  BLOCK_HAS_COPY_DISPOSE =  (1 << 25),
52d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  BLOCK_HAS_CXX_OBJ =       (1 << 26),
53d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  BLOCK_IS_GLOBAL =         (1 << 28),
54d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  BLOCK_USE_STRET =         (1 << 29),
55d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  BLOCK_HAS_SIGNATURE  =    (1 << 30)
56d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump};
57d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCallclass BlockFlags {
58d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  uint32_t flags;
59d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump
60d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  BlockFlags(uint32_t flags) : flags(flags) {}
612a998148a6823c44d67da347c95eb2ea21f6b986Mike Stumppublic:
62d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  BlockFlags() : flags(0) {}
63d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  BlockFlags(BlockFlag_t flag) : flags(flag) {}
6490a904309c79977fcba2ff0542e2e4cd8e3c3fafMike Stump
65d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  uint32_t getBitMask() const { return flags; }
66d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  bool empty() const { return flags == 0; }
67c0ea8855adbc22f5a431f275ba1f7c3b9e0abc6bBlaine Garst
68d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  friend BlockFlags operator|(BlockFlags l, BlockFlags r) {
69d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    return BlockFlags(l.flags | r.flags);
70d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  }
71d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  friend BlockFlags &operator|=(BlockFlags &l, BlockFlags r) {
72d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    l.flags |= r.flags;
73d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    return l;
74d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  }
75d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  friend bool operator&(BlockFlags l, BlockFlags r) {
76d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    return (l.flags & r.flags);
772a998148a6823c44d67da347c95eb2ea21f6b986Mike Stump  }
78d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump};
79d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCallinline BlockFlags operator|(BlockFlag_t l, BlockFlag_t r) {
80d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  return BlockFlags(l) | BlockFlags(r);
81d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall}
82d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump
83d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCallenum BlockFieldFlag_t {
84d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  BLOCK_FIELD_IS_OBJECT   = 0x03,  /* id, NSObject, __attribute__((NSObject)),
85d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall                                    block, ... */
86d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  BLOCK_FIELD_IS_BLOCK    = 0x07,  /* a block variable */
87797b6327571f9d7b1c45404a56ddcbf9b9298ae8Mike Stump
88d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  BLOCK_FIELD_IS_BYREF    = 0x08,  /* the on stack structure holding the __block
89d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall                                    variable */
90d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  BLOCK_FIELD_IS_WEAK     = 0x10,  /* declared __weak, only used in byref copy
91d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall                                    helpers */
92f85e193739c953358c865005855253af4f68a497John McCall  BLOCK_FIELD_IS_ARC      = 0x40,  /* field has ARC-specific semantics */
93d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  BLOCK_BYREF_CALLER      = 128,   /* called from __block (byref) copy/dispose
94d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall                                      support routines */
95d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  BLOCK_BYREF_CURRENT_MAX = 256
96d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall};
9777b89b87c3b9220fea1bc80f6d6598d2003cc8a8Chris Lattner
98d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCallclass BlockFieldFlags {
99d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  uint32_t flags;
1006b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall
101d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  BlockFieldFlags(uint32_t flags) : flags(flags) {}
102d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCallpublic:
103d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  BlockFieldFlags() : flags(0) {}
104d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  BlockFieldFlags(BlockFieldFlag_t flag) : flags(flag) {}
1050892099dbc640720400a1d9decd2733a09d733e5Mike Stump
106d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  uint32_t getBitMask() const { return flags; }
107d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  bool empty() const { return flags == 0; }
1083947de5edda7e0c32060c568cc5f7b2aae6f70b4Mike Stump
109d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  /// Answers whether the flags indicate that this field is an object
110d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  /// or block pointer that requires _Block_object_assign/dispose.
111d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  bool isSpecialPointer() const { return flags & BLOCK_FIELD_IS_OBJECT; }
1123947de5edda7e0c32060c568cc5f7b2aae6f70b4Mike Stump
113d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  friend BlockFieldFlags operator|(BlockFieldFlags l, BlockFieldFlags r) {
114d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    return BlockFieldFlags(l.flags | r.flags);
115d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  }
116d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  friend BlockFieldFlags &operator|=(BlockFieldFlags &l, BlockFieldFlags r) {
117d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    l.flags |= r.flags;
118d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    return l;
119d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  }
120d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  friend bool operator&(BlockFieldFlags l, BlockFieldFlags r) {
121d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    return (l.flags & r.flags);
122d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  }
123d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall};
124d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCallinline BlockFieldFlags operator|(BlockFieldFlag_t l, BlockFieldFlag_t r) {
125d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  return BlockFieldFlags(l) | BlockFieldFlags(r);
126d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall}
1270892099dbc640720400a1d9decd2733a09d733e5Mike Stump
128d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall/// CGBlockInfo - Information to generate a block literal.
129d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCallclass CGBlockInfo {
130d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCallpublic:
131d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  /// Name - The name of the block, kindof.
132bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall  llvm::StringRef Name;
133d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall
134d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  /// The field index of 'this' within the block, if there is one.
135d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  unsigned CXXThisIndex;
136d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall
137d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  class Capture {
138d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    uintptr_t Data;
139bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall    EHScopeStack::stable_iterator Cleanup;
140d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall
141d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  public:
142d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    bool isIndex() const { return (Data & 1) != 0; }
143d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    bool isConstant() const { return !isIndex(); }
144d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    unsigned getIndex() const { assert(isIndex()); return Data >> 1; }
145d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    llvm::Value *getConstant() const {
146d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall      assert(isConstant());
147d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall      return reinterpret_cast<llvm::Value*>(Data);
148d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    }
149bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall    EHScopeStack::stable_iterator getCleanup() const {
150bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall      assert(isIndex());
151bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall      return Cleanup;
152bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall    }
153bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall    void setCleanup(EHScopeStack::stable_iterator cleanup) {
154bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall      assert(isIndex());
155bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall      Cleanup = cleanup;
156bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall    }
157d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall
158d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    static Capture makeIndex(unsigned index) {
159d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall      Capture v;
160d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall      v.Data = (index << 1) | 1;
161d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall      return v;
162d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    }
163d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall
164d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    static Capture makeConstant(llvm::Value *value) {
165d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall      Capture v;
166d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall      v.Data = reinterpret_cast<uintptr_t>(value);
167d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall      return v;
168d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    }
169d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  };
17045031c08c608e548ac12caf0547f89574e994b96Mike Stump
171d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  /// CanBeGlobal - True if the block can be global, i.e. it has
172d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  /// no non-constant captures.
173d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  bool CanBeGlobal : 1;
174d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall
175d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  /// True if the block needs a custom copy or dispose function.
176d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  bool NeedsCopyDispose : 1;
177d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall
178d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  /// HasCXXObject - True if the block's custom copy/dispose functions
179d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  /// need to be run even in GC mode.
180d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  bool HasCXXObject : 1;
181d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall
18264cd2328ef55735c910d3d51dd40eafc38d7a504John McCall  /// UsesStret : True if the block uses an stret return.  Mutable
18364cd2328ef55735c910d3d51dd40eafc38d7a504John McCall  /// because it gets set later in the block-creation process.
18464cd2328ef55735c910d3d51dd40eafc38d7a504John McCall  mutable bool UsesStret : 1;
18564cd2328ef55735c910d3d51dd40eafc38d7a504John McCall
186bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall  /// The mapping of allocated indexes within the block.
187bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall  llvm::DenseMap<const VarDecl*, Capture> Captures;
188bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall
189bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall  llvm::AllocaInst *Address;
1902acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner  llvm::StructType *StructureType;
191bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall  const BlockDecl *Block;
192bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall  const BlockExpr *BlockExpression;
193d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  CharUnits BlockSize;
194d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  CharUnits BlockAlign;
1959f75ab129a02c17375fc616aa33176c88fdff5aeJohn McCall
1969f75ab129a02c17375fc616aa33176c88fdff5aeJohn McCall  /// An instruction which dominates the full-expression that the
1979f75ab129a02c17375fc616aa33176c88fdff5aeJohn McCall  /// block is inside.
1989f75ab129a02c17375fc616aa33176c88fdff5aeJohn McCall  llvm::Instruction *DominatingIP;
1999f75ab129a02c17375fc616aa33176c88fdff5aeJohn McCall
2009f75ab129a02c17375fc616aa33176c88fdff5aeJohn McCall  /// The next block in the block-info chain.  Invalid if this block
2019f75ab129a02c17375fc616aa33176c88fdff5aeJohn McCall  /// info is not part of the CGF's block-info chain, which is true
2029f75ab129a02c17375fc616aa33176c88fdff5aeJohn McCall  /// if it corresponds to a global block or a block whose expression
2039f75ab129a02c17375fc616aa33176c88fdff5aeJohn McCall  /// has been encountered.
204bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall  CGBlockInfo *NextBlockInfo;
205d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall
206d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  const Capture &getCapture(const VarDecl *var) const {
207bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall    return const_cast<CGBlockInfo*>(this)->getCapture(var);
208bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall  }
209bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall  Capture &getCapture(const VarDecl *var) {
210bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall    llvm::DenseMap<const VarDecl*, Capture>::iterator
211d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall      it = Captures.find(var);
212d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    assert(it != Captures.end() && "no entry for variable!");
213d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    return it->second;
214d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  }
21545031c08c608e548ac12caf0547f89574e994b96Mike Stump
216bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall  const BlockDecl *getBlockDecl() const { return Block; }
217bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall  const BlockExpr *getBlockExpr() const {
218bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall    assert(BlockExpression);
219bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall    assert(BlockExpression->getBlockDecl() == Block);
220bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall    return BlockExpression;
221bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall  }
2223947de5edda7e0c32060c568cc5f7b2aae6f70b4Mike Stump
223bf0716b0ab692bb93949e8969c0c2041d5ad50f4John McCall  CGBlockInfo(const BlockDecl *blockDecl, llvm::StringRef Name);
224d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump};
225d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump
226d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump}  // end namespace CodeGen
227d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump}  // end namespace clang
228d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump
229d883d841c20729972e70853cb08c2e4c7d044d2dMike Stump#endif
230