[cfe-commits] r167374 - in /cfe/trunk: lib/CodeGen/CGObjCMac.cpp test/CodeGenObjC/arc-captured-block-var-inlined-layout.m test/CodeGenObjC/mrr-captured-block-var-inlined-layout.m
John McCall
rjmccall at apple.com
Sat Nov 10 16:13:10 PST 2012
On Nov 4, 2012, at 10:19 AM, Fariborz Jahanian wrote:
> Author: fjahanian
> Date: Sun Nov 4 12:19:40 2012
> New Revision: 167374
>
> URL: http://llvm.org/viewvc/llvm-project?rev=167374&view=rev
> Log:
> Fixes liftime of captured block variables in mrr mode, per John's feedback, as
> well as couple of tests which were not being excercised because of TYPOs.
>
> Modified:
> cfe/trunk/lib/CodeGen/CGObjCMac.cpp
> cfe/trunk/test/CodeGenObjC/arc-captured-block-var-inlined-layout.m
> cfe/trunk/test/CodeGenObjC/mrr-captured-block-var-inlined-layout.m
>
> Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=167374&r1=167373&r2=167374&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Sun Nov 4 12:19:40 2012
> @@ -942,7 +942,7 @@
> unsigned int BytePos, bool ForStrongLayout,
> bool &HasUnion);
>
> - Qualifiers::ObjCLifetime GetObjCLifeTime(QualType QT);
> + Qualifiers::ObjCLifetime getBlockCaptureLifetime(QualType QT);
>
> void UpdateRunSkipBlockVars(bool IsByref,
> Qualifiers::ObjCLifetime LifeTime,
> @@ -1964,21 +1964,16 @@
> return C;
> }
>
> -Qualifiers::ObjCLifetime CGObjCCommonMac::GetObjCLifeTime(QualType FQT) {
> +/// getBlockCaptureLifetime - This routine returns life time of the captured
> +/// block variable for the purpose of block layout meta-data generation. FQT is
> +/// the type of the variable captured in the block.
> +Qualifiers::ObjCLifetime CGObjCCommonMac::getBlockCaptureLifetime(QualType FQT) {
> if (CGM.getLangOpts().ObjCAutoRefCount)
> return FQT.getObjCLifetime();
>
> - // MRR, is more ad hoc.
> - if (FQT.isObjCGCStrong())
> - return Qualifiers::OCL_Strong;
> - if (FQT.isObjCGCWeak())
> - return Qualifiers::OCL_Weak;
> -
> + // MRR.
> if (FQT->isObjCObjectPointerType() || FQT->isBlockPointerType())
> - return Qualifiers::OCL_Strong;
> -
> - if (const PointerType *PT = FQT->getAs<PointerType>())
> - return (GetObjCLifeTime(PT->getPointeeType()));
> + return Qualifiers::OCL_ExplicitNone;
I think I might have been unclear — when a normal variable of one of these
types is captured in a block in MRR, it basically has __strong semantics.
It's only __block variables that capture their results with __unsafe_unretained
semantics.
So the extended layout for the following block in MRR should describe the
variable as __strong:
NSString *string = foo.title;
bar(^(NSWindow *window){ window.title = string; });
Whereas the extended layout for the following block should describe the
variable as byref, and the variable's own layout should describe its contents
as __unsafe_unretained:
__block NSString *string;
bar(^(NSWindow *window) { string = window.title; });
John.
More information about the cfe-commits
mailing list