diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2010-02-17 19:54:08 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-02-17 19:54:08 +0000 |
commit | 0b63ba4d4642467529afbddc227a06979b6080fb (patch) | |
tree | b14b879766a4a443a1535d653970faa1919dc0eb | |
parent | 56bddeda24adcb927dd5ceafd75f84ebc2eb4203 (diff) |
Patch to remove arbitrary imporation of 'self' into
a block without it being used. This causes over release
of objects in certain runtime-senitive apps.
(fixes radar 7581175).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96501 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/CGBlocks.cpp | 13 | ||||
-rw-r--r-- | test/CodeGenObjC/blocks-5.m | 16 |
2 files changed, 16 insertions, 13 deletions
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index 46b62441d6..2f0961326a 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -110,19 +110,6 @@ static bool CanBlockBeGlobal(const CodeGenFunction::BlockInfo &Info) { /// invoke function. static void AllocateAllBlockDeclRefs(const CodeGenFunction::BlockInfo &Info, CodeGenFunction *CGF) { - // Always allocate self, as it is often handy in the debugger, even if there - // is no codegen in the block that uses it. This is also useful to always do - // this as if we didn't, we'd have to figure out all code that uses a self - // pointer, including implicit uses. - if (const ObjCMethodDecl *OMD - = dyn_cast_or_null<ObjCMethodDecl>(CGF->CurFuncDecl)) { - ImplicitParamDecl *SelfDecl = OMD->getSelfDecl(); - BlockDeclRefExpr *BDRE = new (CGF->getContext()) - BlockDeclRefExpr(SelfDecl, - SelfDecl->getType(), SourceLocation(), false); - CGF->AllocateBlockDecl(BDRE); - } - // FIXME: Also always forward the this pointer in C++ as well. for (size_t i = 0; i < Info.DeclRefs.size(); ++i) diff --git a/test/CodeGenObjC/blocks-5.m b/test/CodeGenObjC/blocks-5.m new file mode 100644 index 0000000000..12c381bb74 --- /dev/null +++ b/test/CodeGenObjC/blocks-5.m @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -fblocks -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s +// radar 7581175 + +extern void dispatch_async (void (^)(void)); + +@interface Foo +@end + +@implementation Foo +- (void)dealloc { + dispatch_async(^{}); +} +@end + +// CHECK: self.addr +// CHECK: self.addr |