1 // RUN: %clang_cc1 -fblocks -fobjc-arc -fobjc-runtime-has-weak -triple x86_64-apple-darwin -O0 -emit-llvm %s -o %t-64.s 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 } 61