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