File: varargs-spill-stack-align-nacl.ll

package info (click to toggle)
llvm-toolchain-9 1%3A9.0.1-16
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 882,436 kB
  • sloc: cpp: 4,167,636; ansic: 714,256; asm: 457,610; python: 155,927; objc: 65,094; sh: 42,856; lisp: 26,908; perl: 7,786; pascal: 7,722; makefile: 6,881; ml: 5,581; awk: 3,648; cs: 2,027; xml: 888; javascript: 381; ruby: 156
file content (31 lines) | stat: -rw-r--r-- 1,103 bytes parent folder | download | duplicates (21)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
; RUN: llc < %s -mtriple=arm-nacl-gnueabi | FileCheck %s

declare void @llvm.va_start(i8*)
declare void @external_func(i8*)

@va_list = external global i8*

; On ARM, varargs arguments are passed in r0-r3 with the rest on the
; stack.  A varargs function must therefore spill rN-r3 just below the
; function's initial stack pointer.
;
; This test checks for a bug in which a gap was left between the spill
; area and varargs arguments on the stack when using 16 byte stack
; alignment.

define void @varargs_func(i32 %arg1, ...) {
  call void @llvm.va_start(i8* bitcast (i8** @va_list to i8*))
  call void @external_func(i8* bitcast (i8** @va_list to i8*))
  ret void
}
; CHECK-LABEL: varargs_func:
; Reserve space for the varargs save area.  This currently reserves
; more than enough (16 bytes rather than the 12 bytes needed).
; CHECK: sub sp, sp, #12
; CHECK: push {r11, lr}
; Align the stack pointer to a multiple of 16.
; CHECK: sub sp, sp, #12
; Calculate the address of the varargs save area and save varargs
; arguments into it.
; CHECK-NEXT: add r0, sp, #20
; CHECK-NEXT: stm r0, {r1, r2, r3}