Add codegen support for __block variables to call _Block_object_dispose as necessary.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66117 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGBlocks.h b/lib/CodeGen/CGBlocks.h
index bef7459..3b9cc50 100644
--- a/lib/CodeGen/CGBlocks.h
+++ b/lib/CodeGen/CGBlocks.h
@@ -94,19 +94,26 @@
     int GlobalUniqueCount;
   } Block;
 
+  llvm::Value *BlockObjectDispose;
+  const llvm::Type *PtrToInt8Ty;
+
   BlockModule(ASTContext &C, llvm::Module &M, const llvm::TargetData &TD,
               CodeGenTypes &T, CodeGenModule &CodeGen)
     : Context(C), TheModule(M), TheTargetData(TD), Types(T),
       CGM(CodeGen),
       NSConcreteGlobalBlock(0), NSConcreteStackBlock(0), BlockDescriptorType(0),
-      GenericBlockLiteralType(0)  {
+      GenericBlockLiteralType(0), BlockObjectDispose(0) {
     Block.GlobalUniqueCount = 0;
+    PtrToInt8Ty = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
   }
 };
 
 class BlockFunction : public BlockBase {
+  CodeGenModule &CGM;
+
 public:
-    enum {
+  const llvm::Type *PtrToInt8Ty;
+  enum {
     BLOCK_FIELD_IS_OBJECT   =  3,  /* id, NSObject, __attribute__((NSObject)),
                                       block, ... */
     BLOCK_FIELD_IS_BLOCK    =  7,  /* a block variable */
@@ -140,7 +147,10 @@
 
   CGBuilderTy &Builder;
 
-  BlockFunction(CGBuilderTy &B) : Builder(B) { }
+  BlockFunction(CodeGenModule &cgm, CGBuilderTy &B)
+    : CGM(cgm), Builder(B) {
+    PtrToInt8Ty = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
+  }
 
   ImplicitParamDecl *BlockStructDecl;
   ImplicitParamDecl *getBlockStructDecl() { return BlockStructDecl; }
@@ -148,6 +158,8 @@
   llvm::Value *BuildCopyHelper(int flag);
   llvm::Value *BuildDestroyHelper(int flag);
 
+  llvm::Value *getBlockObjectDispose();
+  void BuildBlockRelease(const VarDecl &D, llvm::Value *DeclPtr);
 };
 
 }  // end namespace CodeGen