1# REQUIRES: x86 2# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t1.o 3# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/x86-64-split-stack-extra.s -o %t2.o 4# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/x86-64-split-stack-main.s -o %t3.o 5 6# RUN: ld.lld --defsym __morestack=0x100 --defsym __morestack_non_split=0x200 %t1.o %t2.o %t3.o -o %t -z notext 7# RUN: llvm-objdump -d %t | FileCheck %s 8 9# Avoid duplicating the prologue for every test via macros. 10 11.macro prologue1 function_to_call 12 .global prologue1_calls_\function_to_call 13 .type prologue1_calls_\function_to_call,@function 14prologue1_calls_\function_to_call: 15 cmp %fs:0x70,%rsp 16 jae 1f 17 callq __morestack 18 retq 191: 20 # Various and duplicate calls to ensure every code path is taken. 21 callq \function_to_call 22 callq \function_to_call 23 callq 1b 24 callq non_function_text_symbol 25 retq 26 .size prologue1_calls_\function_to_call,. - prologue1_calls_\function_to_call 27.endm 28 29.macro prologue2 function_to_call register compare_amount 30 .global prologue2_calls_\function_to_call\register 31 .type prologue2_calls_\function_to_call\register,@function 32prologue2_calls_\function_to_call\register: 33 lea -\compare_amount(%rsp),%\register 34 cmp %fs:0x70,%\register 35 jae 1f 36 callq __morestack 37 retq 381: 39 # Various and duplicate calls to ensure every code path is taken. 40 callq \function_to_call 41 callq \function_to_call 42 callq 1b 43 callq non_function_text_symbol 44 retq 45 .size prologue2_calls_\function_to_call\register,. - prologue2_calls_\function_to_call\register 46.endm 47 48 .section .text,"ax",@progbits,unique,0 49 .local foo 50foo: 51 .quad foo 52 53 .section .text,"ax",@progbits,unique,1 54 55# For split-stack code calling split-stack code, ensure prologue v1 still 56# calls plain __morestack, and that any raw bytes written to the prologue 57# make sense. 58# CHECK: <prologue1_calls_split>: 59# CHECK-NEXT: cmp{{.*}}%fs:{{[^,]*}},{{.*}}%rsp 60# CHECK: jae{{.*$}} 61# CHECK-NEXT: callq{{.*}}<__morestack> 62 63prologue1 split 64 65# For split-stack code calling split-stack code, ensure prologue v2 still 66# calls plain __morestack, that any raw bytes written to the prologue 67# make sense, and that the register number is preserved. 68# CHECK: <prologue2_calls_splitr10>: 69# CHECK-NEXT: lea{{.*}} -512(%rsp),{{.*}}%r10 70# CHECK: cmp{{.*}}%fs:{{[^,]*}},{{.*}}%r{{[0-9]+}} 71# CHECK: jae{{.*}} 72# CHECK-NEXT: callq{{.*}}<__morestack> 73 74prologue2 split r10 0x200 75 76# CHECK: <prologue2_calls_splitr11>: 77# CHECK-NEXT: lea{{.*}} -256(%rsp),{{.*}}%r11 78# CHECK: cmp{{.*}}%fs:{{[^,]*}},{{.*}}%r{{[0-9]+}} 79# CHECK: jae{{.*}} 80# CHECK-NEXT: callq{{.*}}<__morestack> 81 82prologue2 split r11 0x100 83 84# For split-stack code calling non-split-stack code, ensure prologue v1 85# calls __morestack_non_split, and that any raw bytes written to the prologue 86# make sense. 87# CHECK: <prologue1_calls_non_split>: 88# CHECK-NEXT: stc{{.*$}} 89# CHECK-NEXT: nopl{{.*$}} 90# CHECK: jae{{.*$}} 91# CHECK-NEXT: callq{{.*}}<__morestack_non_split> 92 93prologue1 non_split 94 95# For split-stack code calling non-split-stack code, ensure prologue v2 96# calls __morestack_non_split, that any raw bytes written to the prologue 97# make sense, and that the register number is preserved 98# CHECK: <prologue2_calls_non_splitr10>: 99# CHECK-NEXT: lea{{.*}} -16640(%rsp),{{.*}}%r10 100# CHECK: cmp{{.*}}%fs:{{[^,]*}},{{.*}}%r10 101# CHECK: jae{{.*$}} 102# CHECK-NEXT: callq{{.*}}<__morestack_non_split> 103 104prologue2 non_split r10 0x100 105 106# CHECK: <prologue2_calls_non_splitr11>: 107# CHECK-NEXT: lea{{.*}} -16896(%rsp),{{.*}}%r11 108# CHECK: cmp{{.*}}%fs:{{[^,]*}},{{.*}}%r11 109# CHECK: jae{{.*$}} 110# CHECK-NEXT: callq{{.*}}<__morestack_non_split> 111 112prologue2 non_split r11 0x200 113 114 .section .note.GNU-stack,"",@progbits 115 .section .note.GNU-split-stack,"",@progbits 116