Andrew Top | 61a8495 | 2019-04-30 15:07:33 -0700 | [diff] [blame] | 1 | // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -o - %s | FileCheck -check-prefix=CHECK32 %s |
| 2 | // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck -check-prefix=CHECK64 %s |
| 3 | |
| 4 | struct A { |
| 5 | long x, y; |
| 6 | }; |
| 7 | |
| 8 | struct B { |
| 9 | long x, y, z, w; |
| 10 | }; |
| 11 | |
| 12 | extern "C" { |
| 13 | |
| 14 | int f1(A, A, A, A); |
| 15 | B f2(void); |
| 16 | _Complex float f3(void); |
| 17 | A &f4(); |
| 18 | |
| 19 | } |
| 20 | |
| 21 | void test() { |
| 22 | A a; |
| 23 | |
| 24 | // CHECK32: call i32 bitcast (i32 (i32, i32, i32, i32, i32, i32, i32, i32)* @f1 to i32 (i8*, i32, i32, i32, i32, i32, i32, i32, i32)*)(i8* nest bitcast (i32 (i32, i32, i32, i32, i32, i32, i32, i32)* @f1 to i8*) |
| 25 | // CHECK64: call i32 bitcast (i32 (i64, i64, i64, i64, i64, i64, %struct.A*)* @f1 to i32 (i8*, i64, i64, i64, i64, i64, i64, %struct.A*)*)(i8* nest bitcast (i32 (i64, i64, i64, i64, i64, i64, %struct.A*)* @f1 to i8*) |
| 26 | __builtin_call_with_static_chain(f1(a, a, a, a), f1); |
| 27 | |
| 28 | // CHECK32: call void bitcast (void (%struct.B*)* @f2 to void (%struct.B*, i8*)*)(%struct.B* sret %{{[0-9a-z]+}}, i8* nest bitcast (void (%struct.B*)* @f2 to i8*)) |
| 29 | // CHECK64: call void bitcast (void (%struct.B*)* @f2 to void (%struct.B*, i8*)*)(%struct.B* sret %{{[0-9a-z]+}}, i8* nest bitcast (void (%struct.B*)* @f2 to i8*)) |
| 30 | __builtin_call_with_static_chain(f2(), f2); |
| 31 | |
| 32 | // CHECK32: call i64 bitcast (i64 ()* @f3 to i64 (i8*)*)(i8* nest bitcast (i64 ()* @f3 to i8*)) |
| 33 | // CHECK64: call <2 x float> bitcast (<2 x float> ()* @f3 to <2 x float> (i8*)*)(i8* nest bitcast (<2 x float> ()* @f3 to i8*)) |
| 34 | __builtin_call_with_static_chain(f3(), f3); |
| 35 | |
| 36 | // CHECK32: call dereferenceable(8) %struct.A* bitcast (%struct.A* ()* @f4 to %struct.A* (i8*)*)(i8* nest bitcast (%struct.A* ()* @f4 to i8*)) |
| 37 | // CHECK64: call dereferenceable(16) %struct.A* bitcast (%struct.A* ()* @f4 to %struct.A* (i8*)*)(i8* nest bitcast (%struct.A* ()* @f4 to i8*)) |
| 38 | __builtin_call_with_static_chain(f4(), f4); |
| 39 | } |