diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/CXX/expr/expr.cast/p4.cpp | 8 | ||||
-rw-r--r-- | test/CodeGen/blocks-1.c | 24 | ||||
-rw-r--r-- | test/CodeGen/blocksignature.c | 8 | ||||
-rw-r--r-- | test/CodeGen/blockstret.c | 2 | ||||
-rw-r--r-- | test/CodeGenObjC/block-var-layout.m | 91 | ||||
-rw-r--r-- | test/CodeGenObjCXX/block-var-layout.mm | 73 |
6 files changed, 116 insertions, 90 deletions
diff --git a/test/CXX/expr/expr.cast/p4.cpp b/test/CXX/expr/expr.cast/p4.cpp index d3f978571b..907e008724 100644 --- a/test/CXX/expr/expr.cast/p4.cpp +++ b/test/CXX/expr/expr.cast/p4.cpp @@ -7,16 +7,16 @@ struct C : A, B { }; // CHECK: casting_away_constness void casting_away_constness(const B &b, const C &c, const B *bp, const C *cp) { // CHECK: DerivedToBase (B) - // CHECK: DeclRefExpr {{.*}} ParmVar='c' + // CHECK: DeclRefExpr {{.*}} ParmVar {{.*}} 'c' (void)(B&)c; // CHECK: BaseToDerived (B) - // CHECK: DeclRefExpr {{.*}} ParmVar='b' + // CHECK: DeclRefExpr {{.*}} ParmVar {{.*}} 'b' (void)(C&)b; // CHECK: DerivedToBase (B) - // CHECK: DeclRefExpr {{.*}} ParmVar='cp' + // CHECK: DeclRefExpr {{.*}} ParmVar {{.*}} 'cp' (void)(B*)cp; // CHECK: BaseToDerived (B) - // CHECK: DeclRefExpr {{.*}} ParmVar='bp' + // CHECK: DeclRefExpr {{.*}} ParmVar {{.*}} 'bp' (void)(C*)bp; // CHECK: ReturnStmt return; diff --git a/test/CodeGen/blocks-1.c b/test/CodeGen/blocks-1.c index 1eb13063c6..350f7a3baf 100644 --- a/test/CodeGen/blocks-1.c +++ b/test/CodeGen/blocks-1.c @@ -1,7 +1,7 @@ // RUN: %clang_cc1 %s -emit-llvm -o %t -fblocks // RUN: grep "_Block_object_dispose" %t | count 17 -// RUN: grep "__copy_helper_block_" %t | count 16 -// RUN: grep "__destroy_helper_block_" %t | count 16 +// RUN: grep "__copy_helper_block_" %t | count 14 +// RUN: grep "__destroy_helper_block_" %t | count 14 // RUN: grep "__Block_byref_object_copy_" %t | count 2 // RUN: grep "__Block_byref_object_dispose_" %t | count 2 // RUN: grep "i32 135)" %t | count 2 @@ -14,7 +14,7 @@ void test1() { int b=2; a=1; printf("a is %d, b is %d\n", a, b); - ^{ a = 10; printf("a is %d, b is %d\n", a, b); }(); + ^{ a = 10; printf("a is %d, b is %d\n", a, b); }(); // needs copy/dispose printf("a is %d, b is %d\n", a, b); a = 1; printf("a is %d, b is %d\n", a, b); @@ -24,8 +24,8 @@ void test2() { __block int a; a=1; printf("a is %d\n", a); - ^{ - ^{ + ^{ // needs copy/dispose + ^{ // needs copy/dispose a = 10; }(); }(); @@ -37,13 +37,13 @@ void test2() { void test3() { __block int k; __block int (^j)(int); - ^{j=0; k=0;}(); + ^{j=0; k=0;}(); // needs copy/dispose } int test4() { extern int g; static int i = 1; - ^(int j){ i = j; g = 0; }(0); + ^(int j){ i = j; g = 0; }(0); // does not need copy/dispose return i + g; } @@ -51,19 +51,19 @@ int g; void test5() { __block struct { int i; } i; - ^{ (void)i; }(); + ^{ (void)i; }(); // needs copy/dispose } void test6() { __block int i; - ^{ i=1; }(); - ^{}(); + ^{ i=1; }(); // needs copy/dispose + ^{}(); // does not need copy/dispose } void test7() { - ^{ + ^{ // does not need copy/dispose __block int i; - ^{ i = 1; }(); + ^{ i = 1; }(); // needs copy/dispose }(); } diff --git a/test/CodeGen/blocksignature.c b/test/CodeGen/blocksignature.c index 26f2048bbc..7526f19468 100644 --- a/test/CodeGen/blocksignature.c +++ b/test/CodeGen/blocksignature.c @@ -6,9 +6,11 @@ // X64: @.str1 = private unnamed_addr constant [12 x i8] c"i16@?0c8f12\00" // X64: store i32 1073741824, i32* -// X32: @.str = private unnamed_addr constant [6 x i8] c"v4@?0\00" -// X32: @__block_literal_global = internal constant %1 { i8** @_NSConcreteGlobalBlock, i32 1342177280, -// X32: @.str1 = private unnamed_addr constant [11 x i8] c"i12@?0c4f8\00" +// X32: [[STR1:@.*]] = private unnamed_addr constant [6 x i8] c"v4@?0\00" +// X32: @__block_descriptor_tmp = internal constant [[FULL_DESCRIPTOR_T:%.*]] { i32 0, i32 20, i8* getelementptr inbounds ([6 x i8]* [[STR1]], i32 0, i32 0), i8* null } +// X32: @__block_literal_global = internal constant [[GLOBAL_LITERAL_T:%.*]] { i8** @_NSConcreteGlobalBlock, i32 1342177280, i32 0, i8* bitcast (void (i8*)* @__block_global_{{.*}} to i8*), [[DESCRIPTOR_T:%.*]]* bitcast ([[FULL_DESCRIPTOR_T]]* @__block_descriptor_tmp to {{%.*}}*) } +// X32: [[STR2:@.*]] = private unnamed_addr constant [11 x i8] c"i12@?0c4f8\00" +// X32: @__block_descriptor_tmp{{.*}} = internal constant [[FULL_DESCRIPTOR_T]] { i32 0, i32 24, i8* getelementptr inbounds ([11 x i8]* [[STR2]], i32 0, i32 0), i8* null } // X32: store i32 1073741824, i32* // rdar://7635294 diff --git a/test/CodeGen/blockstret.c b/test/CodeGen/blockstret.c index f630f22b16..e49b52a188 100644 --- a/test/CodeGen/blockstret.c +++ b/test/CodeGen/blockstret.c @@ -1,7 +1,7 @@ // RUN: %clang_cc1 -fblocks -triple x86_64-apple-darwin9 %s -emit-llvm -o - | FileCheck %s -check-prefix=X64 // RUN: %clang_cc1 -fblocks -triple i686-apple-darwin9 %s -emit-llvm -o - | FileCheck %s -check-prefix=X32 -// X64: internal constant %2 { i8** @_NSConcreteGlobalBlock, i32 1879048192 +// X64: internal constant {{%.*}} { i8** @_NSConcreteGlobalBlock, i32 1879048192 // X64: store i32 1610612736, i32* %want // X32: @_NSConcreteGlobalBlock, i32 1879048192, i32 0, diff --git a/test/CodeGenObjC/block-var-layout.m b/test/CodeGenObjC/block-var-layout.m index fa131f63be..466dee1e9e 100644 --- a/test/CodeGenObjC/block-var-layout.m +++ b/test/CodeGenObjC/block-var-layout.m @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fblocks -fobjc-gc -triple x86_64-apple-darwin -O0 -S %s -o %t-64.s +// RUN: %clang_cc1 -fblocks -fobjc-gc -triple x86_64-apple-darwin -O0 -emit-llvm %s -o %t-64.s // RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s struct S { @@ -16,19 +16,38 @@ __weak id wid; void x(id y) {} void y(int a) {} +extern id opaque_id(); + void f() { __block int byref_int = 0; char ch = 'a'; char ch1 = 'b'; char ch2 = 'c'; short sh = 2; - const id bar = (id)0; + const id bar = (id) opaque_id(); id baz = 0; __strong void *strong_void_sta; __block id byref_bab = (id)0; __block void *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). + +// FIXME: do these really have to be named L_OBJC_CLASS_NAME_xxx? +// FIXME: sequences should never end in x0 00 instead of just 00 + +// Test 1 +// byref int, short, char, char, char, id, id, strong void*, byref id +// 01 35 10 00 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [4 x i8] c"\015\10\00" void (^b)() = ^{ byref_int = sh + ch+ch1+ch2 ; x(bar); @@ -39,6 +58,9 @@ void f() { b(); // Test 2 +// byref int, short, char, char, char, id, id, strong void*, byref void*, byref id +// 01 36 10 00 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [4 x i8] c"\016\10\00" void (^c)() = ^{ byref_int = sh + ch+ch1+ch2 ; x(bar); @@ -51,7 +73,11 @@ void f() { c(); // Test 3 -void (^d)() = ^{ +// byref int, short, char, char, char, id, id, byref void*, int, double, byref id +// 01 34 11 30 00 +// FIXME: we'd get a better format here if we sorted by scannability, not just alignment +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [5 x i8] c"\014\11 \00" + void (^d)() = ^{ byref_int = sh + ch+ch1+ch2 ; x(bar); x(baz); @@ -62,7 +88,10 @@ void (^d)() = ^{ }; d(); -// Test4 +// Test 4 +// struct S (int, id, int, id, int, id) +// 01 41 11 11 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [5 x i8] c"\01A\11\11\00" struct S s2; void (^e)() = ^{ x(s2.o1); @@ -72,7 +101,7 @@ void (^d)() = ^{ // Test 5 (unions/structs and their nesting): void Test5() { -struct S5 { + struct S5 { int i1; id o1; struct V { @@ -86,23 +115,26 @@ struct S5 { int i3; id o3; }ui; -}; + }; -union U { + union U { void * i1; id o1; int i3; id o3; -}ui; + }ui; -struct S5 s2; -union U u2; -void (^c)() = ^{ + struct S5 s2; + union U u2; + +// struct s2 (int, id, int, id, int, id?), union u2 (id?) +// 01 41 11 12 70 00 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [6 x i8] c"\01A\11\12p\00" + void (^c)() = ^{ x(s2.ui.o1); x(u2.o1); -}; -c(); - + }; + c(); } // rdar: //8417746 @@ -111,6 +143,10 @@ void notifyBlock(id dependentBlock) { id singleObservationToken; id token; void (^b)(); + +// id, id, void(^)() +// 01 33 00 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [3 x i8] c"\013\00" void (^wrapperBlock)() = ^() { CFRelease(singleObservationToken); CFRelease(singleObservationToken); @@ -122,28 +158,9 @@ void notifyBlock(id dependentBlock) { } void test_empty_block() { - void (^wrapperBlock)() = ^() { - }; +// 01 00 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [2 x i8] c"\01\00" + void (^wrapperBlock)() = ^() { + }; wrapperBlock(); } - -// CHECK-LP64: L_OBJC_CLASS_NAME_: -// CHECK-LP64-NEXT: .asciz "\0011\024" - -// CHECK-LP64: L_OBJC_CLASS_NAME_1: -// CHECK-LP64-NEXT: .asciz "\0011\025" - -// CHECK-LP64: L_OBJC_CLASS_NAME_6: -// CHECK-LP64-NEXT: .asciz "\0011\023!" - -// CHECK-LP64: L_OBJC_CLASS_NAME_11: -// CHECK-LP64-NEXT: .asciz "\001A\021\021" - -// CHECK-LP64: L_OBJC_CLASS_NAME_14: -// CHECK-LP64-NEXT: .asciz "\001A\021\022p" - -// CHECK-LP64: L_OBJC_CLASS_NAME_16: -// CHECK-LP64-NEXT: .asciz "\0013" - -// CHECK-LP64: L_OBJC_CLASS_NAME_20: -// CHECK-LP64-NEXT: .asciz "\001" diff --git a/test/CodeGenObjCXX/block-var-layout.mm b/test/CodeGenObjCXX/block-var-layout.mm index 0a9a8178e7..363e21497e 100644 --- a/test/CodeGenObjCXX/block-var-layout.mm +++ b/test/CodeGenObjCXX/block-var-layout.mm @@ -1,6 +1,8 @@ -// RUN: %clang_cc1 -x objective-c++ -fblocks -fobjc-gc -triple x86_64-apple-darwin -O0 -S %s -o %t-64.s -// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s +// RUN: %clang_cc1 -x objective-c++ -fblocks -fobjc-gc -triple x86_64-apple-darwin -emit-llvm %s -o %t-64.ll +// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.ll %s +// See commentary in test/CodeGenObjC/block-var-layout.m, from which +// this is largely cloned. struct S { int i1; @@ -17,19 +19,25 @@ __weak id wid; void x(id y) {} void y(int a) {} +extern id opaque_id(); + void f() { __block int byref_int = 0; char ch = 'a'; char ch1 = 'b'; char ch2 = 'c'; short sh = 2; - const id bar = (id)0; + const id bar = (id) opaque_id(); id baz = 0; __strong void *strong_void_sta; __block id byref_bab = (id)0; __block void *bl_var1; int i; double dob; +// Test 1 +// byref int, short, char, char, char, id, id, strong void*, byref id +// 01 35 10 00 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [4 x i8] c"\015\10\00" void (^b)() = ^{ byref_int = sh + ch+ch1+ch2 ; x(bar); @@ -40,6 +48,9 @@ void f() { b(); // Test 2 +// byref int, short, char, char, char, id, id, strong void*, byref void*, byref id +// 01 36 10 00 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [4 x i8] c"\016\10\00" void (^c)() = ^{ byref_int = sh + ch+ch1+ch2 ; x(bar); @@ -52,6 +63,10 @@ void f() { c(); // Test 3 +// byref int, short, char, char, char, id, id, byref void*, int, double, byref id +// 01 34 11 30 00 +// FIXME: we'd get a better format here if we sorted by scannability, not just alignment +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [5 x i8] c"\014\11 \00" void (^d)() = ^{ byref_int = sh + ch+ch1+ch2 ; x(bar); @@ -64,6 +79,9 @@ void (^d)() = ^{ d(); // Test4 +// struct S (int, id, int, id, int, id) +// 01 41 11 11 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [5 x i8] c"\01A\11\11\00" struct S s2; void (^e)() = ^{ x(s2.o1); @@ -73,7 +91,7 @@ void (^d)() = ^{ // Test 5 (unions/structs and their nesting): void Test5() { -struct S5 { + struct S5 { int i1; id o1; struct V { @@ -87,22 +105,26 @@ struct S5 { int i3; id o3; }ui; -}; + }; -union U { + union U { void * i1; id o1; int i3; id o3; -}ui; + }ui; + + struct S5 s2; + union U u2; -struct S5 s2; -union U u2; -void (^c)() = ^{ +// struct s2 (int, id, int, id, int, id?), union u2 (id?) +// 01 41 11 12 70 00 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [6 x i8] c"\01A\11\12p\00" + void (^c)() = ^{ x(s2.ui.o1); x(u2.o1); -}; -c(); + }; + c(); } @@ -112,6 +134,10 @@ void notifyBlock(id dependentBlock) { id singleObservationToken; id token; void (^b)(); + +// id, id, void(^)() +// 01 33 00 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [3 x i8] c"\013\00" void (^wrapperBlock)() = ^() { CFRelease(singleObservationToken); CFRelease(singleObservationToken); @@ -123,28 +149,9 @@ void notifyBlock(id dependentBlock) { } void test_empty_block() { +// 01 00 +// CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [2 x i8] c"\01\00" void (^wrapperBlock)() = ^() { }; wrapperBlock(); } - -// CHECK-LP64: L_OBJC_CLASS_NAME_: -// CHECK-LP64-NEXT: .asciz "\0011\024" - -// CHECK-LP64: L_OBJC_CLASS_NAME_1: -// CHECK-LP64-NEXT: .asciz "\0011\025" - -// CHECK-LP64: L_OBJC_CLASS_NAME_6: -// CHECK-LP64-NEXT: .asciz "\0011\023!" - -// CHECK-LP64: L_OBJC_CLASS_NAME_11: -// CHECK-LP64-NEXT: .asciz "\001A\021\021" - -// CHECK-LP64: L_OBJC_CLASS_NAME_16: -// CHECK-LP64-NEXT: .asciz "\001A\021\022p" - -// CHECK-LP64: L_OBJC_CLASS_NAME_20: -// CHECK-LP64-NEXT: .asciz "\0013" - -// CHECK-LP64: L_OBJC_CLASS_NAME_24: -// CHECK-LP64-NEXT: .asciz "\001" |