From: Mike Stump Date: Sat, 21 Mar 2009 21:00:35 +0000 (+0000) Subject: Fixup codegen for nested block literals so that we generate X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a8b60c9bd8e992bed2096aa2c9982c3045e8247c;p=clang Fixup codegen for nested block literals so that we generate copy_helpers and dispose_helpers as necessary for them. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67453 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index c233ff3854..5780fc2958 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -254,7 +254,6 @@ llvm::Value *CodeGenFunction::BuildBlockLiteralTmp(const BlockExpr *BE) { if (LocalDeclMap[VD]) { if (BDRE->isByRef()) { - // FIXME: For only local, or all byrefs? NoteForHelper[helpersize].flag = BLOCK_FIELD_IS_BYREF | // FIXME: Someone double check this. (VD->getType().isObjCGCWeak() ? BLOCK_FIELD_IS_WEAK : 0); @@ -272,6 +271,9 @@ llvm::Value *CodeGenFunction::BuildBlockLiteralTmp(const BlockExpr *BE) { false, false); } if (BDRE->isByRef()) { + NoteForHelper[helpersize].flag = BLOCK_FIELD_IS_BYREF | + // FIXME: Someone double check this. + (VD->getType().isObjCGCWeak() ? BLOCK_FIELD_IS_WEAK : 0); E = new (getContext()) UnaryOperator(E, UnaryOperator::AddrOf, getContext().getPointerType(E->getType()), @@ -511,6 +513,8 @@ llvm::Value *CodeGenFunction::GetAddrOfBlockDecl(const BlockDeclRefExpr *E) { uint64_t Align = getContext().getDeclAlignInBytes(E->getDecl()); const llvm::Type *PtrStructTy = llvm::PointerType::get(BuildByRefType(E->getType(), Align), 0); + // The block literal will need a copy/destroy helper. + BlockHasCopyDispose = true; Ty = PtrStructTy; Ty = llvm::PointerType::get(Ty, 0); V = Builder.CreateBitCast(V, Ty); diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp index eb2fe4f502..8a4febeecf 100644 --- a/lib/CodeGen/CGDecl.cpp +++ b/lib/CodeGen/CGDecl.cpp @@ -334,8 +334,6 @@ void CodeGenFunction::EmitLocalBlockVarDecl(const VarDecl &D) { int flag = 0; int flags = 0; - // The block literal will need a copy/destroy helper. - BlockHasCopyDispose = true; needsDispose = true; if (Ty->isBlockPointerType()) { diff --git a/test/CodeGen/blocks-1.c b/test/CodeGen/blocks-1.c index ae63e73a18..54a8351568 100644 --- a/test/CodeGen/blocks-1.c +++ b/test/CodeGen/blocks-1.c @@ -1,11 +1,11 @@ // RUN: clang %s -emit-llvm -o %t -fblocks -f__block && -// RUN: grep "_Block_object_dispose" %t | count 12 && -// RUN: grep "__copy_helper_block_" %t | count 8 && -// RUN: grep "__destroy_helper_block_" %t | count 8 && +// RUN: grep "_Block_object_dispose" %t | count 15 && +// RUN: grep "__copy_helper_block_" %t | count 12 && +// RUN: grep "__destroy_helper_block_" %t | count 12 && // RUN: grep "__Block_byref_id_object_copy_" %t | count 2 && // RUN: grep "__Block_byref_id_object_dispose_" %t | count 2 && // RUN: grep "i32 135)" %t | count 2 && -// RUN: grep "_Block_object_assign" %t | count 7 +// RUN: grep "_Block_object_assign" %t | count 9 #include @@ -20,7 +20,6 @@ void test1() { printf("a is %d, b is %d\n", a, b); } - void test2() { __block int a; a=1; @@ -55,6 +54,11 @@ void test5() { ^{ (void)i; }(); } +void test6() { + __block int i; + ^{ i=1; }(); +} + int main() { int rv = 0; test1();