[cfe-commits] r167331 - in /cfe/trunk: lib/CodeGen/CGObjCMac.cpp test/CodeGenObjC/mrr-captured-block-var-inlined-layout.m

Fariborz Jahanian fjahanian at apple.com
Sun Nov 4 10:21:46 PST 2012


On Nov 2, 2012, at 5:35 PM, John McCall wrote:

> On Nov 2, 2012, at 3:51 PM, Fariborz Jahanian wrote:
>> Author: fjahanian
>> Date: Fri Nov  2 17:51:18 2012
>> New Revision: 167331
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=167331&view=rev
>> Log:
>> objective-C mrr block. Block variable layout metadata in
>> mrr mode.
>> 
>> Added:
>>   cfe/trunk/test/CodeGenObjC/mrr-captured-block-var-inlined-layout.m
>> Modified:
>>   cfe/trunk/lib/CodeGen/CGObjCMac.cpp
>> 
>> Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=167331&r1=167330&r2=167331&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Fri Nov  2 17:51:18 2012
>> @@ -942,6 +942,8 @@
>>                           unsigned int BytePos, bool ForStrongLayout,
>>                           bool &HasUnion);
>> 
>> +  Qualifiers::ObjCLifetime GetObjCLifeTime(QualType QT);
>> +  
>>  void UpdateRunSkipBlockVars(bool IsByref,
>>                              Qualifiers::ObjCLifetime LifeTime,
>>                              unsigned FieldOffset,
>> @@ -1962,6 +1964,25 @@
>>  return C;
>> }
>> 
>> +Qualifiers::ObjCLifetime CGObjCCommonMac::GetObjCLifeTime(QualType FQT) {
> 
> For consistency, please call this getObjCLifetime, or better yet, something
> like getBlockCaptureLifetime.  Also, please add a comment explaining its
> purpose.
> 
>> +  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;
> 
> I don't think these qualifiers can ever be present in an MRC build,
> and we should never be emitting this layout in a GC build.
> 
>> +  if (FQT->isObjCObjectPointerType() || FQT->isBlockPointerType())
>> +    return Qualifiers::OCL_Strong;
> 
> This is true of direct captures, but an MRR __block variable of a id/block
> actually uses __unsafe_unretained semantics.
> 
>> +  if (const PointerType *PT = FQT->getAs<PointerType>())
>> +    return (GetObjCLifeTime(PT->getPointeeType()));
> 
> This seems wrong.  There's no difference between an id* and a char*
> for the purposes of this layout — it's just opaque data.  An id* is
> definitely not a strong capture.
In r167374.
- Thank you, Fariborz

> 
> John.





More information about the cfe-commits mailing list