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