xref: /aosp_15_r20/external/clang/test/CodeGen/arm-vaarg-align.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // REQUIRES: arm-registered-target
2*67e74705SXin Li // RUN: %clang_cc1 -triple arm -target-abi aapcs %s -emit-llvm -o - | FileCheck -check-prefix=AAPCS %s
3*67e74705SXin Li // RUN: %clang_cc1 -triple arm -target-abi apcs-gnu %s -emit-llvm -o - | FileCheck -check-prefix=APCS-GNU %s
4*67e74705SXin Li /*
5*67e74705SXin Li  * Check that va_arg accesses stack according to ABI alignment
6*67e74705SXin Li  * long long and double require 8-byte alignment under AAPCS
7*67e74705SXin Li  * however, they only require 4-byte alignment under APCS
8*67e74705SXin Li  */
t1(int i,...)9*67e74705SXin Li long long t1(int i, ...) {
10*67e74705SXin Li     // AAPCS: t1
11*67e74705SXin Li     // APCS-GNU: t1
12*67e74705SXin Li     __builtin_va_list ap;
13*67e74705SXin Li     __builtin_va_start(ap, i);
14*67e74705SXin Li     // AAPCS: add i32 %{{.*}} 7
15*67e74705SXin Li     // AAPCS: and i32 %{{.*}} -8
16*67e74705SXin Li     // APCS-GNU-NOT: add i32 %{{.*}} 7
17*67e74705SXin Li     // APCS-GNU-NOT: and i32 %{{.*}} -8
18*67e74705SXin Li     long long ll = __builtin_va_arg(ap, long long);
19*67e74705SXin Li     __builtin_va_end(ap);
20*67e74705SXin Li     return ll;
21*67e74705SXin Li }
t2(int i,...)22*67e74705SXin Li double t2(int i, ...) {
23*67e74705SXin Li     // AAPCS: t2
24*67e74705SXin Li     // APCS-GNU: t2
25*67e74705SXin Li     __builtin_va_list ap;
26*67e74705SXin Li     __builtin_va_start(ap, i);
27*67e74705SXin Li     // AAPCS: add i32 %{{.*}} 7
28*67e74705SXin Li     // AAPCS: and i32 %{{.*}} -8
29*67e74705SXin Li     // APCS-GNU-NOT: add i32 %{{.*}} 7
30*67e74705SXin Li     // APCS-GNU-NOT: and i32 %{{.*}} -8
31*67e74705SXin Li     double ll = __builtin_va_arg(ap, double);
32*67e74705SXin Li     __builtin_va_end(ap);
33*67e74705SXin Li     return ll;
34*67e74705SXin Li }
35