xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/varargs-spill-stack-align-nacl.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm-nacl-gnueabi | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.va_start(i8*)
4*9880d681SAndroid Build Coastguard Workerdeclare void @external_func(i8*)
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker@va_list = external global i8*
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; On ARM, varargs arguments are passed in r0-r3 with the rest on the
9*9880d681SAndroid Build Coastguard Worker; stack.  A varargs function must therefore spill rN-r3 just below the
10*9880d681SAndroid Build Coastguard Worker; function's initial stack pointer.
11*9880d681SAndroid Build Coastguard Worker;
12*9880d681SAndroid Build Coastguard Worker; This test checks for a bug in which a gap was left between the spill
13*9880d681SAndroid Build Coastguard Worker; area and varargs arguments on the stack when using 16 byte stack
14*9880d681SAndroid Build Coastguard Worker; alignment.
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdefine void @varargs_func(i32 %arg1, ...) {
17*9880d681SAndroid Build Coastguard Worker  call void @llvm.va_start(i8* bitcast (i8** @va_list to i8*))
18*9880d681SAndroid Build Coastguard Worker  call void @external_func(i8* bitcast (i8** @va_list to i8*))
19*9880d681SAndroid Build Coastguard Worker  ret void
20*9880d681SAndroid Build Coastguard Worker}
21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: varargs_func:
22*9880d681SAndroid Build Coastguard Worker; Reserve space for the varargs save area.  This currently reserves
23*9880d681SAndroid Build Coastguard Worker; more than enough (16 bytes rather than the 12 bytes needed).
24*9880d681SAndroid Build Coastguard Worker; CHECK: sub sp, sp, #12
25*9880d681SAndroid Build Coastguard Worker; CHECK: push {r11, lr}
26*9880d681SAndroid Build Coastguard Worker; Align the stack pointer to a multiple of 16.
27*9880d681SAndroid Build Coastguard Worker; CHECK: sub sp, sp, #12
28*9880d681SAndroid Build Coastguard Worker; Calculate the address of the varargs save area and save varargs
29*9880d681SAndroid Build Coastguard Worker; arguments into it.
30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add r0, sp, #20
31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: stm r0, {r1, r2, r3}
32