xref: /llvm-project/llvm/test/CodeGen/X86/tailcc-ssp.ll (revision 854bbc50fc99ddf71c4c65193e06eb79ce1ef69f)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc -mtriple=x86_64-windows-msvc %s -o - -verify-machineinstrs | FileCheck %s -check-prefix=WINDOWS
3; RUN: llc -mtriple=x86_64-linux-gnu    %s -o - -verify-machineinstrs | FileCheck %s -check-prefix=LINUX
4
5declare void @h(ptr, i64, ptr)
6
7define tailcc void @tailcall_frame(ptr %0, i64 %1) sspreq {
8; WINDOWS-LABEL: tailcall_frame:
9; WINDOWS:       # %bb.0:
10; WINDOWS-NEXT:    subq $56, %rsp
11; WINDOWS-NEXT:    .seh_stackalloc 56
12; WINDOWS-NEXT:    .seh_endprologue
13; WINDOWS-NEXT:    movq __security_cookie(%rip), %rax
14; WINDOWS-NEXT:    xorq %rsp, %rax
15; WINDOWS-NEXT:    movq %rax, {{[0-9]+}}(%rsp)
16; WINDOWS-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
17; WINDOWS-NEXT:    xorq %rsp, %rcx
18; WINDOWS-NEXT:    cmpq __security_cookie(%rip), %rcx
19; WINDOWS-NEXT:    jne .LBB0_1
20; WINDOWS-NEXT:  # %bb.2:
21; WINDOWS-NEXT:    xorl %ecx, %ecx
22; WINDOWS-NEXT:    xorl %edx, %edx
23; WINDOWS-NEXT:    xorl %r8d, %r8d
24; WINDOWS-NEXT:    addq $56, %rsp
25; WINDOWS-NEXT:    jmp h # TAILCALL
26; WINDOWS-NEXT:  .LBB0_1:
27; WINDOWS-NEXT:    callq __security_check_cookie
28; WINDOWS-NEXT:    int3
29; WINDOWS-NEXT:    .seh_endproc
30;
31; LINUX-LABEL: tailcall_frame:
32; LINUX:       # %bb.0:
33; LINUX-NEXT:    subq $24, %rsp
34; LINUX-NEXT:    .cfi_def_cfa_offset 32
35; LINUX-NEXT:    movq %fs:40, %rax
36; LINUX-NEXT:    movq %rax, {{[0-9]+}}(%rsp)
37; LINUX-NEXT:    movq %fs:40, %rax
38; LINUX-NEXT:    cmpq {{[0-9]+}}(%rsp), %rax
39; LINUX-NEXT:    jne .LBB0_2
40; LINUX-NEXT:  # %bb.1: # %SP_return
41; LINUX-NEXT:    xorl %edi, %edi
42; LINUX-NEXT:    xorl %esi, %esi
43; LINUX-NEXT:    xorl %edx, %edx
44; LINUX-NEXT:    addq $24, %rsp
45; LINUX-NEXT:    .cfi_def_cfa_offset 8
46; LINUX-NEXT:    jmp h@PLT # TAILCALL
47; LINUX-NEXT:  .LBB0_2: # %CallStackCheckFailBlk
48; LINUX-NEXT:    .cfi_def_cfa_offset 32
49; LINUX-NEXT:    callq __stack_chk_fail@PLT
50
51   tail call tailcc void @h(ptr null, i64 0, ptr null)
52   ret void
53}
54
55declare void @bar()
56define void @tailcall_unrelated_frame() sspreq {
57; WINDOWS-LABEL: tailcall_unrelated_frame:
58; WINDOWS:       # %bb.0:
59; WINDOWS-NEXT:    subq $40, %rsp
60; WINDOWS-NEXT:    .seh_stackalloc 40
61; WINDOWS-NEXT:    .seh_endprologue
62; WINDOWS-NEXT:    movq __security_cookie(%rip), %rax
63; WINDOWS-NEXT:    xorq %rsp, %rax
64; WINDOWS-NEXT:    movq %rax, {{[0-9]+}}(%rsp)
65; WINDOWS-NEXT:    callq bar
66; WINDOWS-NEXT:    movq {{[0-9]+}}(%rsp), %rcx
67; WINDOWS-NEXT:    xorq %rsp, %rcx
68; WINDOWS-NEXT:    cmpq __security_cookie(%rip), %rcx
69; WINDOWS-NEXT:    jne .LBB1_1
70; WINDOWS-NEXT:  # %bb.2:
71; WINDOWS-NEXT:    addq $40, %rsp
72; WINDOWS-NEXT:    jmp bar # TAILCALL
73; WINDOWS-NEXT:  .LBB1_1:
74; WINDOWS-NEXT:    callq __security_check_cookie
75; WINDOWS-NEXT:    int3
76; WINDOWS-NEXT:    .seh_endproc
77
78; LINUX-LABEL: tailcall_unrelated_frame:
79; LINUX:       # %bb.0:
80; LINUX-NEXT:    pushq %rax
81; LINUX-NEXT:    .cfi_def_cfa_offset 16
82; LINUX-NEXT:    movq %fs:40, %rax
83; LINUX-NEXT:    movq %rax, (%rsp)
84; LINUX-NEXT:    callq bar@PLT
85; LINUX-NEXT:    movq %fs:40, %rax
86; LINUX-NEXT:    cmpq (%rsp), %rax
87; LINUX-NEXT:    jne .LBB1_2
88; LINUX-NEXT:  # %bb.1: # %SP_return
89; LINUX-NEXT:    popq %rax
90; LINUX-NEXT:    .cfi_def_cfa_offset 8
91; LINUX-NEXT:    jmp bar@PLT # TAILCALL
92; LINUX-NEXT:  .LBB1_2: # %CallStackCheckFailBlk
93; LINUX-NEXT:    .cfi_def_cfa_offset 16
94; LINUX-NEXT:    callq __stack_chk_fail@PLT
95
96  call void @bar()
97  tail call void @bar()
98  ret void
99}
100