| Index: test/NaCl/X86/dynamic-stack-alloc.ll
|
| diff --git a/test/NaCl/X86/dynamic-stack-alloc.ll b/test/NaCl/X86/dynamic-stack-alloc.ll
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2c61d417cd4489783a087acf42ab399ca477abd4
|
| --- /dev/null
|
| +++ b/test/NaCl/X86/dynamic-stack-alloc.ll
|
| @@ -0,0 +1,47 @@
|
| +; RUN: llc -mtriple=x86_64-nacl %s -o - | FileCheck %s
|
| +; RUN: llc -mtriple=x86_64-nacl -fast-isel %s -o - | FileCheck %s
|
| +
|
| +; Test calling with many parameters (such that some need to go on the stack),
|
| +; along with dynamic stack allocation and x86-64 NaCl stack/frame
|
| +; register sandboxing.
|
| +
|
| +declare i32 @callee(i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7, i32 %a8, i8* %ptr)
|
| +
|
| +define i32 @dyn_stack_alloc (i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7, i32 %a8, i32 %amt) {
|
| + %p = alloca i8, i32 %amt, align 1
|
| + %x = call i32 @callee(i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7, i32 %a8, i8* %p)
|
| + ret i32 %x
|
| +}
|
| +
|
| +; CHECK-LABEL: dyn_stack_alloc
|
| +; Set up frame pointer and save two registers.
|
| +; CHECK: movl %ebp, %eax
|
| +; CHECK-NEXT: pushq %rax
|
| +; CHECK: movq %rsp, %rbp
|
| +; CHECK-NEXT: .L
|
| +; CHECK-NEXT: .cfi_def_cfa_register %rbp
|
| +; CHECK-NEXT: pushq
|
| +; CHECK-NEXT: pushq
|
| +; CHECK-NOT: pushq
|
| +
|
| +; The dynamic alloc (aligned):
|
| +; CHECK: movl 32(%rbp), [[AMT:%.*]]
|
| +; CHECK: movl %esp, [[TMP:%.*]]
|
| +; CHECK-NEXT: addl $15, [[AMT]]
|
| +; CHECK-NEXT: andl $-16, [[AMT]]
|
| +; CHECK-NEXT: subl [[AMT]], [[TMP]]
|
| +; Set the SP based on the final value of TMP.
|
| +; CHECK-NEXT: naclrestsp_noflags [[TMP]], %r15
|
| +
|
| +; Make more room for call arguments:
|
| +; CHECK: naclsspq $32, %r15
|
| +; CHECK: callq callee
|
| +
|
| +; Restore stack pointer from frame pointer - 16. It is -16 because
|
| +; the code still needs to pop the two pushed regs, before restoring
|
| +; the frame pointer from the stack.
|
| +; CHECK: naclspadj $-16, %r15
|
| +; CHECK-NEXT: popq
|
| +; CHECK-NEXT: popq
|
| +; CHECK-NEXT: naclrestbp (%rsp), %r15
|
| +; CHECK-NEXT: naclaspq $8, %r15
|
|
|