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