aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/CXX/expr/expr.cast/p4.cpp8
-rw-r--r--test/CodeGen/blocks-1.c24
-rw-r--r--test/CodeGen/blocksignature.c8
-rw-r--r--test/CodeGen/blockstret.c2
-rw-r--r--test/CodeGenObjC/block-var-layout.m91
-rw-r--r--test/CodeGenObjCXX/block-var-layout.mm73
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"