[cfe-commits] r167387 - in /cfe/trunk/test/CodeGenObjC: arc-captured-32bit-block-var-layout.m arc-captured-block-var-inlined-layout.m mrr-captured-block-var-inlined-layout.m

Fariborz Jahanian fjahanian at apple.com
Mon Nov 5 10:14:34 PST 2012


Author: fjahanian
Date: Mon Nov  5 12:14:34 2012
New Revision: 167387

URL: http://llvm.org/viewvc/llvm-project?rev=167387&view=rev
Log:
Tests for 32bit version of block ivar layout metadata.

Added:
    cfe/trunk/test/CodeGenObjC/arc-captured-32bit-block-var-layout.m
Modified:
    cfe/trunk/test/CodeGenObjC/arc-captured-block-var-inlined-layout.m
    cfe/trunk/test/CodeGenObjC/mrr-captured-block-var-inlined-layout.m

Added: cfe/trunk/test/CodeGenObjC/arc-captured-32bit-block-var-layout.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/arc-captured-32bit-block-var-layout.m?rev=167387&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenObjC/arc-captured-32bit-block-var-layout.m (added)
+++ cfe/trunk/test/CodeGenObjC/arc-captured-32bit-block-var-layout.m Mon Nov  5 12:14:34 2012
@@ -0,0 +1,425 @@
+// RUN: %clang_cc1 -fblocks -fobjc-arc -fobjc-runtime-has-weak -triple i386-apple-darwin -O0 -emit-llvm %s -o %t-64.s
+// RUN: FileCheck --input-file=%t-64.s %s
+// rdar://12184410
+
+void x(id y) {}
+void y(int a) {}
+
+extern id opaque_id();
+
+void f() {
+    __weak id wid;
+    __block int byref_int = 0;
+    char ch = 'a';
+    char ch1 = 'b';
+    char ch2 = 'c';
+    short sh = 2;
+    const id bar = (id) opaque_id();
+    id baz = 0;
+    __strong id strong_void_sta;
+    __block id byref_bab = (id)0;
+    __block id bl_var1;
+    int i; double dob;
+
+// The patterns here are a sequence of bytes, each saying first how
+// many sizeof(void*) chunks to skip (high nibble) and then how many
+// to scan (low nibble).  A zero byte says that we've reached the end
+// of the pattern.
+//
+// All of these patterns start with 01 3x because the block header on
+// LP64 consists of an isa pointer (which we're supposed to scan for
+// some reason) followed by three words (2 ints, a function pointer,
+// and a descriptor pointer).
+
+// Test 1
+// block variable layout: BL_BYREF:1, BL_STRONG:3, BL_BYREF:1, BL_OPERATOR:0
+// CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [4 x i8] c"@2@\00" 
+    void (^b)() = ^{
+        byref_int = sh + ch+ch1+ch2 ;
+        x(bar);
+        x(baz);
+        x((id)strong_void_sta);
+        x(byref_bab);
+    };    
+    b();
+
+// Test 2
+// block variable layout: BL_BYREF:1, BL_STRONG:3, BL_WEAK:1, BL_BYREF:2, BL_OPERATOR:0
+// CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [5 x i8] c"@2PA\00"
+    void (^c)() = ^{
+        byref_int = sh + ch+ch1+ch2 ;
+        x(bar);
+        x(baz);
+        x((id)strong_void_sta);
+        x(wid);
+        bl_var1 = 0;
+        x(byref_bab);
+    };    
+}
+
+ at class NSString, NSNumber;
+void g() {
+  NSString *foo;
+   NSNumber *bar;
+   unsigned int bletch;
+   __weak id weak_delegate;
+  unsigned int i;
+  NSString *y;
+  NSString *z;
+// block variable layout: BL_STRONG:2, BL_WEAK:1, BL_STRONG:2, BL_OPERATOR:0
+// CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [5 x i8] c"!1P1\00"
+  void (^c)() = ^{
+   int j = i + bletch;
+   x(foo);
+   x(bar);
+   x(weak_delegate);
+   x(y);
+   x(z); 
+  };
+  c();
+}
+
+// Test 5 (unions/structs and their nesting):
+void h() {
+  struct S5 {
+    int i1;
+    __unsafe_unretained id o1;
+    struct V {
+     int i2;
+     __unsafe_unretained id o2;
+    } v1;
+    int i3;
+    union UI {
+        void * i1;
+        __unsafe_unretained id o1;
+        int i3;
+        __unsafe_unretained id o3;
+    }ui;
+  };
+
+  union U {
+        void * i1;
+        __unsafe_unretained id o1;
+        int i3;
+        __unsafe_unretained id o3;
+  }ui;
+
+  struct S5 s2;
+  union U u2;
+  __block id block_id;
+
+/**
+block variable layout: BL_NON_OBJECT_WORD:1, BL_UNRETAINE:1, BL_NON_OBJECT_WORD:1, 
+                       BL_UNRETAINE:1, BL_NON_OBJECT_WORD:3, BL_BYREF:1, BL_OPERATOR:0
+*/
+// CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [7 x i8] c" ` `\22@\00"
+  void (^c)() = ^{
+    x(s2.ui.o1);
+    x(u2.o1);
+    block_id = 0;
+  };
+  c();
+}
+
+// Test for array of stuff.
+void arr1() {
+  struct S {
+    __unsafe_unretained id unsafe_unretained_var[4];
+ } imported_s;
+
+// block variable layout: BL_UNRETAINE:4, BL_OPERATOR:0
+// CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [2 x i8] c"c\00"
+    void (^c)() = ^{
+        x(imported_s.unsafe_unretained_var[2]);
+    };    
+
+   c();
+}
+
+// Test2 for array of stuff.
+void arr2() {
+  struct S {
+   int a;
+    __unsafe_unretained id unsafe_unretained_var[4];
+ } imported_s;
+
+// block variable layout: BL_NON_OBJECT_WORD:1, BL_UNRETAINE:4, BL_OPERATOR:0
+// CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [3 x i8] c" c\00"
+    void (^c)() = ^{
+        x(imported_s.unsafe_unretained_var[2]);
+    };    
+
+   c();
+}
+
+// Test3 for array of stuff.
+void arr3() {
+  struct S {
+   int a;
+    __unsafe_unretained id unsafe_unretained_var[0];
+ } imported_s;
+
+// block variable layout: BL_OPERATOR:0
+// CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [1 x i8] zeroinitializer
+    void (^c)() = ^{
+      int i = imported_s.a;
+    };    
+
+   c();
+}
+
+
+// Test4 for array of stuff.
+ at class B;
+void arr4() {
+  struct S {
+    struct s0 {
+      __unsafe_unretained id s_f0;
+      __unsafe_unretained id s_f1;
+    } f0;
+
+    __unsafe_unretained id f1;
+
+    struct s1 {
+      int *f0;
+      __unsafe_unretained B *f1;
+    } f4[2][2];
+  } captured_s;
+
+/**
+block variable layout: BL_UNRETAINE:3, 
+                       BL_NON_OBJECT_WORD:1, BL_UNRETAINE:1, 
+                       BL_NON_OBJECT_WORD:1, BL_UNRETAINE:1, 
+                       BL_NON_OBJECT_WORD:1, BL_UNRETAINE:1, 
+                       BL_NON_OBJECT_WORD:1, BL_UNRETAINE:1,
+		       BL_OPERATOR:0
+*/
+// CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [10 x i8]
+  void (^c)() = ^{
+      id i = captured_s.f0.s_f1;
+  };
+
+   c();
+}
+
+// Test1 bitfield in cpatured aggregate.
+void bf1() {
+  struct S {
+    int flag : 25;
+    int flag1: 7;
+    int flag2 :1;
+    int flag3: 7;
+    int flag4: 24;
+  } s;
+
+//  block variable layout: BL_OPERATOR:0
+// CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [1 x i8] zeroinitializer
+  int (^c)() = ^{
+      return s.flag;
+  };
+  c();
+}
+
+// Test2 bitfield in cpatured aggregate.
+void bf2() {
+  struct S {
+    int flag : 1;
+  } s;
+
+// block variable layout: BL_OPERATOR:0
+// CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [1 x i8] zeroinitializer
+  int (^c)() = ^{
+      return s.flag;
+  };
+  c();
+}
+
+// Test3 bitfield in cpatured aggregate.
+void bf3() {
+
+     struct {
+        unsigned short _reserved : 16;
+
+        unsigned char _draggedNodesAreDeletable: 1;
+        unsigned char _draggedOutsideOutlineView : 1;
+        unsigned char _adapterRespondsTo_addRootPaths : 1;
+        unsigned char _adapterRespondsTo_moveDataNodes : 1;
+        unsigned char _adapterRespondsTo_removeRootDataNode : 1;
+        unsigned char _adapterRespondsTo_doubleClickDataNode : 1;
+        unsigned char _adapterRespondsTo_selectDataNode : 1;
+        unsigned char _adapterRespondsTo_textDidEndEditing : 1;
+        unsigned char _adapterRespondsTo_updateAndSaveRoots : 1;
+        unsigned char _adapterRespondsTo_askToDeleteRootNodes : 1;
+        unsigned char _adapterRespondsTo_contextMenuForSelectedNodes : 1;
+        unsigned char _adapterRespondsTo_pasteboardFilenamesForNodes : 1;
+        unsigned char _adapterRespondsTo_writeItemsToPasteboard : 1;
+        unsigned char _adapterRespondsTo_writeItemsToPasteboardXXXX : 1;
+
+        unsigned int _filler : 32;
+    } _flags;
+
+// block variable layout: BL_OPERATOR:0
+// CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [1 x i8] zeroinitializer
+  unsigned char (^c)() = ^{
+      return _flags._draggedNodesAreDeletable;
+  };
+
+   c();
+}
+
+// Test4 unnamed bitfield
+void bf4() {
+
+     struct {
+        unsigned short _reserved : 16;
+
+        unsigned char _draggedNodesAreDeletable: 1;
+        unsigned char _draggedOutsideOutlineView : 1;
+        unsigned char _adapterRespondsTo_addRootPaths : 1;
+        unsigned char _adapterRespondsTo_moveDataNodes : 1;
+        unsigned char _adapterRespondsTo_removeRootDataNode : 1;
+        unsigned char _adapterRespondsTo_doubleClickDataNode : 1;
+        unsigned char _adapterRespondsTo_selectDataNode : 1;
+        unsigned char _adapterRespondsTo_textDidEndEditing : 1;
+
+        unsigned long long : 64;
+
+        unsigned char _adapterRespondsTo_updateAndSaveRoots : 1;
+        unsigned char _adapterRespondsTo_askToDeleteRootNodes : 1;
+        unsigned char _adapterRespondsTo_contextMenuForSelectedNodes : 1;
+        unsigned char _adapterRespondsTo_pasteboardFilenamesForNodes : 1;
+        unsigned char _adapterRespondsTo_writeItemsToPasteboard : 1;
+        unsigned char _adapterRespondsTo_writeItemsToPasteboardXXXX : 1;
+
+        unsigned int _filler : 32;
+    } _flags;
+
+//  block variable layout: BL_OPERATOR:0
+// CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [1 x i8] zeroinitializer
+  unsigned char (^c)() = ^{
+      return _flags._draggedNodesAreDeletable;
+  };
+
+   c();
+}
+
+
+
+// Test5 unnamed bitfield.
+void bf5() {
+     struct {
+        unsigned char flag : 1;
+        unsigned int  : 32;
+        unsigned char flag1 : 1;
+    } _flags;
+
+//  block variable layout: BL_OPERATOR:0
+// CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [1 x i8] zeroinitializer
+  unsigned char (^c)() = ^{
+      return _flags.flag;
+  };
+
+   c();
+}
+
+
+// Test6 0 length bitfield.
+void bf6() {
+     struct {
+        unsigned char flag : 1;
+        unsigned int  : 0;
+        unsigned char flag1 : 1;
+    } _flags;
+
+// block variable layout: BL_OPERATOR:0
+// CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [1 x i8] zeroinitializer
+  unsigned char (^c)() = ^{
+      return _flags.flag;
+  };
+
+   c();
+}
+
+// Test7 large number of captured variables.
+void Test7() {
+    __weak id wid;
+    __weak id wid1, wid2, wid3, wid4;
+    __weak id wid5, wid6, wid7, wid8;
+    __weak id wid9, wid10, wid11, wid12;
+    __weak id wid13, wid14, wid15, wid16;
+    const id bar = (id) opaque_id();
+//block variable layout: BL_STRONG:1, BL_WEAK:16, BL_OPERATOR:0
+// CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [3 x i8] c"0_\00"
+    void (^b)() = ^{
+      x(bar);
+      x(wid1);
+      x(wid2);
+      x(wid3);
+      x(wid4);
+      x(wid5);
+      x(wid6);
+      x(wid7);
+      x(wid8);
+      x(wid9);
+      x(wid10);
+      x(wid11);
+      x(wid12);
+      x(wid13);
+      x(wid14);
+      x(wid15);
+      x(wid16);
+    };    
+}
+
+
+// Test 8 very large number of captured variables.
+void Test8() {
+__weak id wid;
+    __weak id wid1, wid2, wid3, wid4;
+    __weak id wid5, wid6, wid7, wid8;
+    __weak id wid9, wid10, wid11, wid12;
+    __weak id wid13, wid14, wid15, wid16;
+    __weak id w1, w2, w3, w4;
+    __weak id w5, w6, w7, w8;
+    __weak id w9, w10, w11, w12;
+    __weak id w13, w14, w15, w16;
+    const id bar = (id) opaque_id();
+// block variable layout: BL_STRONG:1, BL_WEAK:16, BL_WEAK:16, BL_WEAK:1, BL_OPERATOR:0
+// CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [5 x i8]
+    void (^b)() = ^{
+      x(bar);
+      x(wid1);
+      x(wid2);
+      x(wid3);
+      x(wid4);
+      x(wid5);
+      x(wid6);
+      x(wid7);
+      x(wid8);
+      x(wid9);
+      x(wid10);
+      x(wid11);
+      x(wid12);
+      x(wid13);
+      x(wid14);
+      x(wid15);
+      x(wid16);
+      x(w1);
+      x(w2);
+      x(w3);
+      x(w4);
+      x(w5);
+      x(w6);
+      x(w7);
+      x(w8);
+      x(w9);
+      x(w10);
+      x(w11);
+      x(w12);
+      x(w13);
+      x(w14);
+      x(w15);
+      x(w16);
+      x(wid);
+    };  
+}

Modified: cfe/trunk/test/CodeGenObjC/arc-captured-block-var-inlined-layout.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/arc-captured-block-var-inlined-layout.m?rev=167387&r1=167386&r2=167387&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenObjC/arc-captured-block-var-inlined-layout.m (original)
+++ cfe/trunk/test/CodeGenObjC/arc-captured-block-var-inlined-layout.m Mon Nov  5 12:14:34 2012
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -fblocks -fobjc-arc -fobjc-runtime-has-weak -triple x86_64-apple-darwin -O0 -emit-llvm %s -o - | FileCheck %s
+// RUN: %clang_cc1 -fblocks -fobjc-arc -fobjc-runtime-has-weak -triple i386-apple-darwin -O0 -emit-llvm %s -o - | FileCheck -check-prefix=CHECK-i386 %s
 // rdar://12184410
 
 void x(id y) {}
@@ -16,12 +17,14 @@
 
 //  Inline instruction for block variable layout: 0x0100
 // CHECK: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i64 256 }
+// CHECK-i386: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i32 256 }
     void (^b)() = ^{
         x(bar);
     };    
 
 // Inline instruction for block variable layout: 0x0210
 // CHECK: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i64 528 }
+// CHECK-i386: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i32 528 }
     void (^c)() = ^{
         x(bar);
         x(baz);
@@ -30,6 +33,7 @@
 
 // Inline instruction for block variable layout: 0x0230
 // CHECK: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i64 560 }
+// CHECK-i386: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i32 560 }
     void (^d)() = ^{
         x(bar);
         x(baz);
@@ -40,6 +44,7 @@
 
 // Inline instruction for block variable layout: 0x0231
 // CHECK: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i64 561 }
+// CHECK-i386: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i32 561 }
     __weak id wid;
     id (^e)() = ^{
         x(bar);
@@ -52,6 +57,7 @@
 
 // Inline instruction for block variable layout: 0x0235
 // CHECK: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i64 565 }
+// CHECK-i386: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i32 565 }
     __weak id wid1, wid2, wid3, wid4;
     id (^f)() = ^{
         x(bar);
@@ -68,6 +74,7 @@
 
 // Inline instruction for block variable layout: 0x035
 // CHECK: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i64 53 }
+// CHECK-i386: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i32 53 }
     id (^g)() = ^{
         byref_int = 1;
         bl_var1 = 0;
@@ -81,12 +88,14 @@
 
 // Inline instruction for block variable layout: 0x01
 // CHECK: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i64 1 }
+// CHECK-i386: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i32 1 }
     id (^h)() = ^{
         return wid;
     };
 
 // Inline instruction for block variable layout: 0x020
 // CHECK: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i64 32 }
+// CHECK-i386: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i32 32 }
     void (^ii)() = ^{
        byref_int = 1;
        byref_bab = 0;
@@ -94,6 +103,7 @@
 
 // Inline instruction for block variable layout: 0x0102
 // CHECK: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i64 258 }
+// CHECK-i386: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i32 258 }
     void (^jj)() = ^{
       x(bar);
       x(wid1);

Modified: cfe/trunk/test/CodeGenObjC/mrr-captured-block-var-inlined-layout.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/mrr-captured-block-var-inlined-layout.m?rev=167387&r1=167386&r2=167387&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenObjC/mrr-captured-block-var-inlined-layout.m (original)
+++ cfe/trunk/test/CodeGenObjC/mrr-captured-block-var-inlined-layout.m Mon Nov  5 12:14:34 2012
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -fblocks -triple x86_64-apple-darwin -O0 -emit-llvm %s -o - | FileCheck %s
+// RUN: %clang_cc1 -fblocks -triple i386-apple-darwin -O0 -emit-llvm %s -o - | FileCheck -check-prefix=CHECK-i386 %s
 // rdar://12184410
 
 void x(id y) {}
@@ -17,12 +18,14 @@
 
 // block variable layout: BL_UNRETAINED:1, BL_OPERATOR:0
 // CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [2 x i8] c"`\00"
+// CHECK-i386: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [2 x i8] c"`\00"
     void (^b)() = ^{
         x(bar);
     };    
 
 // block variable layout: BL_UNRETAINED:2, BL_BYREF:1, BL_OPERATOR:0
 // CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [3 x i8] c"a@\00"
+// CHECK-i386: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [3 x i8] c"a@\00"
     void (^c)() = ^{
         x(bar);
         x(baz);
@@ -31,6 +34,7 @@
 
 // block variable layout: BL_UNRETAINED:2, BL_BYREF:3, BL_OPERATOR:0
 // CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [3 x i8] c"aB\00
+// CHECK-i386: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [3 x i8] c"aB\00
     void (^d)() = ^{
         x(bar);
         x(baz);
@@ -41,6 +45,7 @@
 
 // block variable layout: BL_UNRETAINED:2, BL_BYREF:3, BL_OPERATOR:0
 // CHECK: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [3 x i8] c"aB\00"
+// CHECK-i386: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [3 x i8] c"aB\00"
     id (^e)() = ^{
         x(bar);
         x(baz);
@@ -52,6 +57,7 @@
 
 // Inline instruction for block variable layout: 0x020
 // CHECK: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i64 32 }
+// CHECK-i386: i8* getelementptr inbounds ([6 x i8]* {{@.*}}, i32 0, i32 0), i32 32 }
     void (^ii)() = ^{
        byref_int = 1;
        byref_bab = 0;





More information about the cfe-commits mailing list