forked from OSchip/llvm-project
61 lines
1.7 KiB
Objective-C
61 lines
1.7 KiB
Objective-C
// RUN: %clang_cc1 -fblocks -fobjc-arc -fobjc-runtime-has-weak -triple x86_64-apple-darwin -O0 -emit-llvm %s -o %t-64.s
|
|
// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s
|
|
// rdar://8991729
|
|
|
|
__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) 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
|
|
// byref int, short, char, char, char, id, id, strong id, 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);
|
|
x(baz);
|
|
x((id)strong_void_sta);
|
|
x(byref_bab);
|
|
};
|
|
b();
|
|
|
|
// Test 2
|
|
// byref int, short, char, char, char, id, id, strong id, 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);
|
|
x(baz);
|
|
x((id)strong_void_sta);
|
|
x(wid);
|
|
bl_var1 = 0;
|
|
x(byref_bab);
|
|
};
|
|
}
|