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