[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