1 | // RUN: %clang_cc1 -triple arm64-apple-ios -target-abi darwinpcs -emit-llvm -o - %s | FileCheck %s |
2 | struct Empty {}; |
3 | |
4 | Empty emptyvar; |
5 | |
6 | int take_args(int a, ...) { |
7 | __builtin_va_list l; |
8 | __builtin_va_start(l, a); |
9 | // CHECK: call void @llvm.va_start |
10 | |
11 | emptyvar = __builtin_va_arg(l, Empty); |
12 | // CHECK: load i8*, i8** |
13 | // CHECK-NOT: getelementptr |
14 | // CHECK: [[EMPTY_PTR:%[a-zA-Z0-9._]+]] = bitcast i8* {{%[a-zA-Z0-9._]+}} to %struct.Empty* |
15 | |
16 | // It's conceivable that EMPTY_PTR may not actually be a valid pointer |
17 | // (e.g. it's at the very bottom of the stack and the next page is |
18 | // invalid). This doesn't matter provided it's never loaded (there's no |
19 | // well-defined way to tell), but it becomes a problem if we do try to use it. |
20 | // CHECK-NOT: load %struct.Empty, %struct.Empty* [[EMPTY_PTR]] |
21 | |
22 | int i = __builtin_va_arg(l, int); |
23 | // CHECK: va_arg i8** {{%[a-zA-Z0-9._]+}}, i32 |
24 | |
25 | __builtin_va_end(l); |
26 | return i; |
27 | } |
28 | |