r175100 - objective-C: Make order of ivars which are synthesized

Douglas Gregor dgregor at apple.com
Wed Feb 13 15:03:03 PST 2013


On Feb 13, 2013, at 2:50 PM, Fariborz Jahanian <fjahanian at apple.com> wrote:

> Author: fjahanian
> Date: Wed Feb 13 16:50:36 2013
> New Revision: 175100
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=175100&view=rev
> Log:
> objective-C: Make order of ivars which are synthesized
> in the course of property synthesis deterministic (ordered
> by their type size), instead of having hashtable order
> (as it is currently). // rdar://13192366

How about using source order, since type size isn't going to give a total order?

	- Doug

> Added:
>    cfe/trunk/test/CodeGenObjC/reorder-synthesized-ivars.m
> Modified:
>    cfe/trunk/lib/AST/DeclObjC.cpp
> 
> Modified: cfe/trunk/lib/AST/DeclObjC.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclObjC.cpp?rev=175100&r1=175099&r2=175100&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclObjC.cpp (original)
> +++ cfe/trunk/lib/AST/DeclObjC.cpp Wed Feb 13 16:50:36 2013
> @@ -1074,6 +1074,20 @@ void ObjCInterfaceDecl::setImplementatio
>   getASTContext().setObjCImplementation(getDefinition(), ImplD);
> }
> 
> +namespace {
> +  struct SynthesizeIvarChunk {
> +    uint64_t Size;
> +    ObjCIvarDecl *Ivar;
> +    SynthesizeIvarChunk(uint64_t size, ObjCIvarDecl *ivar)
> +      : Size(size), Ivar(ivar) {}
> +  };
> +
> +  bool operator<(const SynthesizeIvarChunk & LHS,
> +                 const SynthesizeIvarChunk &RHS) {
> +      return LHS.Size < RHS.Size;
> +  }
> +}
> +
> /// all_declared_ivar_begin - return first ivar declared in this class,
> /// its extensions and its implementation. Lazily build the list on first
> /// access.
> @@ -1110,14 +1124,33 @@ ObjCIvarDecl *ObjCInterfaceDecl::all_dec
> 
>   if (ObjCImplementationDecl *ImplDecl = getImplementation()) {
>     if (!ImplDecl->ivar_empty()) {
> -      ObjCImplementationDecl::ivar_iterator I = ImplDecl->ivar_begin(),
> -                                            E = ImplDecl->ivar_end();
> -      if (!data().IvarList) {
> -        data().IvarList = *I; ++I;
> -        curIvar = data().IvarList;
> +      SmallVector<SynthesizeIvarChunk, 16> layout;
> +      for (ObjCImplementationDecl::ivar_iterator I = ImplDecl->ivar_begin(),
> +           E = ImplDecl->ivar_end(); I != E; ++I) {
> +        ObjCIvarDecl *IV = *I;
> +        if (IV->getSynthesize() && !IV->isInvalidDecl()) {
> +          layout.push_back(SynthesizeIvarChunk(
> +                             IV->getASTContext().getTypeSize(IV->getType()), IV));
> +          continue;
> +        }
> +        if (!data().IvarList)
> +          data().IvarList = *I;
> +        else
> +          curIvar->setNextIvar(*I);
> +        curIvar = *I;
> +      }
> +      
> +      if (!layout.empty()) {
> +        // Order synthesized ivars by their size.
> +        std::stable_sort(layout.begin(), layout.end());
> +        unsigned Ix = 0, EIx = layout.size();
> +        if (!data().IvarList) {
> +          data().IvarList = layout[0].Ivar; Ix++;
> +          curIvar = data().IvarList;
> +        }
> +        for ( ; Ix != EIx; curIvar = layout[Ix].Ivar, Ix++)
> +          curIvar->setNextIvar(layout[Ix].Ivar);
>       }
> -      for ( ;I != E; curIvar = *I, ++I)
> -        curIvar->setNextIvar(*I);
>     }
>   }
>   return data().IvarList;
> 
> Added: cfe/trunk/test/CodeGenObjC/reorder-synthesized-ivars.m
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/reorder-synthesized-ivars.m?rev=175100&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGenObjC/reorder-synthesized-ivars.m (added)
> +++ cfe/trunk/test/CodeGenObjC/reorder-synthesized-ivars.m Wed Feb 13 16:50:36 2013
> @@ -0,0 +1,58 @@
> +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-default-synthesize-properties -emit-llvm -x objective-c %s -o - | FileCheck %s
> +// rdar://13192366
> +typedef signed char BOOL;
> + at interface NSObject 
> +{
> +  id isa;
> +}
> + at end
> +
> + at interface MyClass : NSObject
> +
> + at property (readwrite) BOOL boolean1;
> + at property (readwrite, copy) id object1;
> + at property (readwrite) BOOL boolean2;
> + at property (readwrite, copy) id object2;
> + at property (readwrite) BOOL boolean3;
> + at property (readwrite, copy) id object3;
> + at property (readwrite) BOOL boolean4;
> + at property (readwrite, copy) id object4;
> + at property (readwrite) BOOL boolean5;
> + at property (readwrite, copy) id object5;
> + at property (readwrite) BOOL boolean6;
> + at property (readwrite, copy) id object6;
> + at property (readwrite) BOOL boolean7;
> + at property (readwrite) BOOL MyBool;
> + at property (readwrite, copy) id object7;
> + at property (readwrite) BOOL boolean8;
> + at property (readwrite, copy) id object8;
> + at property (readwrite) BOOL boolean9;
> + at property (readwrite, copy) id object9;
> + at end
> +
> + at implementation MyClass
> +{
> +  id MyIvar;
> +  BOOL _MyBool;
> +  char * pc;
> +}
> + at end
> +
> +// CHECK: @"{{.*}}" = internal global [10 x i8] c"_boolean
> +// CHECK-NEXT: @"{{.*}}" = internal global [10 x i8] c"_boolean
> +// CHECK-NEXT: @"{{.*}}" = internal global [10 x i8] c"_boolean
> +// CHECK-NEXT: @"{{.*}}" = internal global [10 x i8] c"_boolean
> +// CHECK-NEXT: @"{{.*}}" = internal global [10 x i8] c"_boolean
> +// CHECK-NEXT: @"{{.*}}" = internal global [10 x i8] c"_boolean
> +// CHECK-NEXT: @"{{.*}}" = internal global [10 x i8] c"_boolean
> +// CHECK-NEXT: @"{{.*}}" = internal global [10 x i8] c"_boolean
> +// CHECK-NEXT: @"{{.*}}" = internal global [10 x i8] c"_boolean
> +// CHECK-NEXT: @"{{.*}}" = internal global [9 x i8] c"_object
> +// CHECK-NEXT: @"{{.*}}" = internal global [9 x i8] c"_object
> +// CHECK-NEXT: @"{{.*}}" = internal global [9 x i8] c"_object
> +// CHECK-NEXT: @"{{.*}}" = internal global [9 x i8] c"_object
> +// CHECK-NEXT: @"{{.*}}" = internal global [9 x i8] c"_object
> +// CHECK-NEXT: @"{{.*}}" = internal global [9 x i8] c"_object
> +// CHECK-NEXT: @"{{.*}}" = internal global [9 x i8] c"_object
> +// CHECK-NEXT: @"{{.*}}" = internal global [9 x i8] c"_object
> +// CHECK-NEXT: @"{{.*}}" = internal global [9 x i8] c"_object
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list