diff options
author | Mike Stump <mrs@apple.com> | 2009-03-07 02:53:18 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-03-07 02:53:18 +0000 |
commit | 6f7d9f8774c5888fe25f55ced435510b73cffd0e (patch) | |
tree | 5e1c651994e4ffd1ef7cc5243980407fd415e3cd | |
parent | aeb0ffd56c2a9109d95b766ad24298389a16ba8a (diff) | |
download | bcm5719-llvm-6f7d9f8774c5888fe25f55ced435510b73cffd0e.tar.gz bcm5719-llvm-6f7d9f8774c5888fe25f55ced435510b73cffd0e.zip |
codegen support for dispose helpers for block literals.
llvm-svn: 66320
-rw-r--r-- | clang/lib/CodeGen/CGBlocks.cpp | 24 | ||||
-rw-r--r-- | clang/test/CodeGen/blocks-1.c | 2 |
2 files changed, 24 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGBlocks.cpp b/clang/lib/CodeGen/CGBlocks.cpp index 8020a8b26f2..344ac60d98a 100644 --- a/clang/lib/CodeGen/CGBlocks.cpp +++ b/clang/lib/CodeGen/CGBlocks.cpp @@ -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); diff --git a/clang/test/CodeGen/blocks-1.c b/clang/test/CodeGen/blocks-1.c index 8b5de629e8e..df2a3fda6b8 100644 --- a/clang/test/CodeGen/blocks-1.c +++ b/clang/test/CodeGen/blocks-1.c @@ -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 && |