mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 07:31:53 +00:00
1d8af51850
For CoreCLR on Windows, stack probes must be emitted as inline sequences that probe successive stack pages between the current stack limit and the desired new stack pointer location. This implements support for the inline expansion on x64. For in-body alloca probes, expansion is done during instruction lowering. For prolog probes, a stub call is initially emitted during prolog creation, and expanded after epilog generation, to avoid complications that arise when introducing new machine basic blocks during prolog and epilog creation. Added a new test case, modified an existing one to exclude non-x64 coreclr (for now). Add test case Fix tests git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252578 91177308-0d34-0410-b5e6-96231b3b80d8
78 lines
1.6 KiB
LLVM
78 lines
1.6 KiB
LLVM
; This test is attempting to detect that the compiler correctly generates stack
|
|
; probe calls when the size of the local variables exceeds the specified stack
|
|
; probe size.
|
|
;
|
|
; Testing the default value of 4096 bytes makes sense, because the default
|
|
; stack probe size equals the page size (4096 bytes for all x86 targets), and
|
|
; this is unlikely to change in the future.
|
|
;
|
|
; RUN: llc -mtriple=i686-windows-msvc < %s | FileCheck %s
|
|
|
|
target datalayout = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32"
|
|
|
|
define i32 @test1() "stack-probe-size"="0" {
|
|
%buffer = alloca [4095 x i8]
|
|
|
|
ret i32 0
|
|
|
|
; CHECK-LABEL: _test1:
|
|
; CHECK-NOT: subl $4095, %esp
|
|
; CHECK: movl $4095, %eax
|
|
; CHECK: calll __chkstk
|
|
}
|
|
|
|
define i32 @test2() {
|
|
%buffer = alloca [4095 x i8]
|
|
|
|
ret i32 0
|
|
|
|
; CHECK-LABEL: _test2:
|
|
; CHECK-NOT: movl $4095, %eax
|
|
; CHECK: subl $4095, %esp
|
|
; CHECK-NOT: calll __chkstk
|
|
}
|
|
|
|
define i32 @test3() "stack-probe-size"="8192" {
|
|
%buffer = alloca [4095 x i8]
|
|
|
|
ret i32 0
|
|
|
|
; CHECK-LABEL: _test3:
|
|
; CHECK-NOT: movl $4095, %eax
|
|
; CHECK: subl $4095, %esp
|
|
; CHECK-NOT: calll __chkstk
|
|
}
|
|
|
|
define i32 @test4() "stack-probe-size"="0" {
|
|
%buffer = alloca [4096 x i8]
|
|
|
|
ret i32 0
|
|
|
|
; CHECK-LABEL: _test4:
|
|
; CHECK-NOT: subl $4096, %esp
|
|
; CHECK: movl $4096, %eax
|
|
; CHECK: calll __chkstk
|
|
}
|
|
|
|
define i32 @test5() {
|
|
%buffer = alloca [4096 x i8]
|
|
|
|
ret i32 0
|
|
|
|
; CHECK-LABEL: _test5:
|
|
; CHECK-NOT: subl $4096, %esp
|
|
; CHECK: movl $4096, %eax
|
|
; CHECK: calll __chkstk
|
|
}
|
|
|
|
define i32 @test6() "stack-probe-size"="8192" {
|
|
%buffer = alloca [4096 x i8]
|
|
|
|
ret i32 0
|
|
|
|
; CGECK-LABEL: _test6:
|
|
; CGECK-NOT: movl $4096, %eax
|
|
; CGECK: subl $4096, %esp
|
|
; CGECK-NOT: calll __chkstk
|
|
}
|