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. _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
