John McCall | d1e40d5 | 2011-10-02 01:16:38 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -fblocks -fobjc-arc -fobjc-runtime-has-weak -triple x86_64-apple-darwin -O0 -emit-llvm %s -o %t-64.s |
John McCall | f85e193 | 2011-06-15 23:02:42 +0000 | [diff] [blame] | 2 | // RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s |
| 3 | // rdar://8991729 |
| 4 | |
| 5 | __weak id wid; |
| 6 | void x(id y) {} |
| 7 | void y(int a) {} |
| 8 | |
| 9 | extern id opaque_id(); |
| 10 | |
| 11 | void f() { |
| 12 | __block int byref_int = 0; |
| 13 | char ch = 'a'; |
| 14 | char ch1 = 'b'; |
| 15 | char ch2 = 'c'; |
| 16 | short sh = 2; |
| 17 | const id bar = (id) opaque_id(); |
| 18 | id baz = 0; |
| 19 | __strong id strong_void_sta; |
| 20 | __block id byref_bab = (id)0; |
| 21 | __block id bl_var1; |
| 22 | int i; double dob; |
| 23 | |
| 24 | // The patterns here are a sequence of bytes, each saying first how |
| 25 | // many sizeof(void*) chunks to skip (high nibble) and then how many |
| 26 | // to scan (low nibble). A zero byte says that we've reached the end |
| 27 | // of the pattern. |
| 28 | // |
| 29 | // All of these patterns start with 01 3x because the block header on |
| 30 | // LP64 consists of an isa pointer (which we're supposed to scan for |
| 31 | // some reason) followed by three words (2 ints, a function pointer, |
| 32 | // and a descriptor pointer). |
| 33 | |
| 34 | // Test 1 |
| 35 | // byref int, short, char, char, char, id, id, strong id, byref id |
| 36 | // 01 35 10 00 |
| 37 | // CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [4 x i8] c"\015\10\00" |
| 38 | void (^b)() = ^{ |
| 39 | byref_int = sh + ch+ch1+ch2 ; |
| 40 | x(bar); |
| 41 | x(baz); |
| 42 | x((id)strong_void_sta); |
| 43 | x(byref_bab); |
| 44 | }; |
| 45 | b(); |
| 46 | |
| 47 | // Test 2 |
| 48 | // byref int, short, char, char, char, id, id, strong id, byref void*, byref id |
| 49 | // 01 36 10 00 |
| 50 | // CHECK-LP64: @"\01L_OBJC_CLASS_NAME_{{.*}}" = internal global [4 x i8] c"\016\10\00" |
| 51 | void (^c)() = ^{ |
| 52 | byref_int = sh + ch+ch1+ch2 ; |
| 53 | x(bar); |
| 54 | x(baz); |
| 55 | x((id)strong_void_sta); |
| 56 | x(wid); |
| 57 | bl_var1 = 0; |
| 58 | x(byref_bab); |
| 59 | }; |
| 60 | } |