]> granicus.if.org Git - clang/commitdiff
codegen support for dispose helpers for block literals.
authorMike Stump <mrs@apple.com>
Sat, 7 Mar 2009 02:53:18 +0000 (02:53 +0000)
committerMike Stump <mrs@apple.com>
Sat, 7 Mar 2009 02:53:18 +0000 (02:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66320 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGBlocks.cpp
test/CodeGen/blocks-1.c

index 8020a8b26f26e30a993af221957355800172aaba..344ac60d98add342ff461598fa7181ed1ef44f9d 100644 (file)
@@ -802,7 +802,29 @@ GenerateDestroyHelperFunction(bool BlockHasCopyDispose,
                                           FunctionDecl::Static, false,
                                           true);
   CGF.StartFunction(FD, R, Fn, Args, SourceLocation());
-  // EmitStmt(BExpr->getBody());
+
+  llvm::Value *SrcObj = CGF.GetAddrOfLocalVar(Src);
+  llvm::Type *PtrPtrT;
+  PtrPtrT = llvm::PointerType::get(llvm::PointerType::get(T, 0), 0);
+  SrcObj = Builder.CreateBitCast(SrcObj, PtrPtrT);
+  SrcObj = Builder.CreateLoad(SrcObj);
+
+  for (unsigned i=0; i < NoteForHelper.size(); ++i) {
+    int flag = NoteForHelper[i].flag;
+    int index = NoteForHelper[i].index;
+
+    if ((NoteForHelper[i].flag & BLOCK_FIELD_IS_BYREF)
+        || NoteForHelper[i].RequiresCopying) {
+      llvm::Value *Srcv = SrcObj;
+      Srcv = Builder.CreateStructGEP(Srcv, index);
+      Srcv = Builder.CreateBitCast(Srcv,
+                                   llvm::PointerType::get(PtrToInt8Ty, 0));
+      Srcv = Builder.CreateLoad(Srcv);
+
+      BuildBlockRelease(Srcv, flag);
+    }
+  }
+
   CGF.FinishFunction();
 
   return llvm::ConstantExpr::getBitCast(Fn, PtrToInt8Ty);
index 8b5de629e8e76fa8445af8e203d159fe0ea41e8e..df2a3fda6b8c911779efcb6f981463d1c33c1141 100644 (file)
@@ -1,5 +1,5 @@
 // RUN: clang %s -emit-llvm -o %t -fblocks -f__block &&
-// RUN: grep "_Block_object_dispose" %t | count 6 &&
+// RUN: grep "_Block_object_dispose" %t | count 10 &&
 // RUN: grep "__copy_helper_block_" %t | count 6 &&
 // RUN: grep "__destroy_helper_block_" %t | count 6 &&
 // RUN: grep "__Block_byref_id_object_copy_" %t | count 2 &&