1# REQUIRES: ppc 2 3# RUN: llvm-mc -filetype=obj -triple=powerpc64le-unknown-linux %s -o %t1.o 4# RUN: llvm-mc -filetype=obj -triple=powerpc64le-unknown-linux %p/Inputs/ppc64-no-split-stack.s -o %t2.o 5# RUN: ld.lld --defsym __morestack=0x10010000 %t1.o %t2.o -o %t 6# RUN: llvm-objdump -d %t | FileCheck %s 7 8# RUN: llvm-mc -filetype=obj -triple=powerpc64-unknown-linux %s -o %t1.o 9# RUN: llvm-mc -filetype=obj -triple=powerpc64-unknown-linux %p/Inputs/ppc64-no-split-stack.s -o %t2.o 10# RUN: ld.lld --defsym __morestack=0x10010000 %t1.o %t2.o -o %t 11# RUN: llvm-objdump -d %t | FileCheck %s 12 13 .abiversion 2 14 .section ".text" 15 16 17# A caller with a stack that is small enough that the addis instruction 18# from the split-stack prologue is unneeded, and after the prologue adjustment 19# the stack size still fits within 16 bits. 20 .p2align 2 21 .global caller_small_stack 22 .type caller_small_stack, @function 23caller_small_stack: 24.Lcss_gep: 25 addis 2, 12, .TOC.-.Lcss_gep@ha 26 addi 2, 2, .TOC.-.Lcss_gep@l 27 .localentry caller_small_stack, .-caller_small_stack 28 ld 0, -0x7040(13) 29 addi 12, 1, -32 30 nop 31 cmpld 7, 12, 0 32 blt- 7, .Lcss_alloc_more 33.Lcss_body: 34 mflr 0 35 std 0, 16(1) 36 stdu 1, -32(1) 37 bl nss_callee 38 addi 1, 1, 32 39 ld 0, 16(1) 40 mtlr 0 41 blr 42.Lcss_alloc_more: 43 mflr 0 44 std 0, 16(1) 45 bl __morestack 46 ld 0, 16(1) 47 mtlr 0 48 blr 49 b .Lcss_body 50 .size caller_small_stack, .-caller_small_stack 51 52# CHECK-LABEL: caller_small_stack 53# CHECK: ld 0, -28736(13) 54# CHECK-NEXT: addi 12, 1, -16416 55# CHECK-NEXT: nop 56# CHECK-NEXT: cmpld 7, 12, 0 57# CHECK-NEXT: bt- 28, 0x10010204 58 59# A caller that has a stack size that fits within 16 bits, but the adjusted 60# stack size after prologue adjustment now overflows 16 bits needing both addis 61# and addi instructions. 62 .p2align 2 63 .global caller_med_stack 64 .type caller_med_stack, @function 65caller_med_stack: 66.Lcms_gep: 67 addis 2, 12, .TOC.-.Lcms_gep@ha 68 addi 12, 12, .TOC.-.Lcms_gep@l 69 .localentry caller_med_stack, .-caller_med_stack 70 ld 0, -0x7040(13) 71 addi 12, 1, -32764 72 nop 73 cmpld 7, 12, 0 74 blt- 7, .Lcms_alloc_more 75.Lcms_body: 76 mflr 0 77 std 0, 16(1) 78 stdu 1, -32764(1) 79 bl nss_callee 80 addi 1, 1, 32764 81 ld 0, 16(1) 82 mtlr 0 83 blr 84.Lcms_alloc_more: 85 mflr 0 86 std 0, 16(1) 87 bl __morestack 88 ld 0, 16(1) 89 mtlr 0 90 blr 91 b .Lcms_body 92 .size caller_med_stack, .-caller_med_stack 93 94# A caller with a large enough stack frame that both the addis and 95# addi instructions are used in the split-stack prologue. 96 .p2align 2 97 .global caller_large_stack 98 .type caller_large_stack, @function 99caller_large_stack: 100.Lcls_gep: 101 addis 2, 12, .TOC.-.Lcls_gep@ha 102 addi 12, 12, .TOC.-.Lcls_gep@l 103 .localentry caller_large_stack, .-caller_large_stack 104 ld 0, -0x7040(13) 105 addis 12, 1, -1 106 addi 12, 12, -32 107 cmpld 7, 12, 0 108 blt- 7, .Lcls_alloc_more 109.Lcls_body: 110 mflr 0 111 std 0, 16(1) 112 lis 0, -1 113 addi 0, 0, -32 114 stdux 1, 0, 1 115 bl nss_callee 116 ld 1, 0(1) 117 ld 0, 16(1) 118 mtlr 0 119 blr 120.Lcls_alloc_more: 121 mflr 0 122 std 0, 16(1) 123 bl __morestack 124 ld 0, 16(1) 125 mtlr 0 126 blr 127 b .Lcls_body 128 .size caller_large_stack, .-caller_large_stack 129 130# CHECK-LABEL: caller_large_stack 131# CHECK: ld 0, -28736(13) 132# CHECK-NEXT: addis 12, 1, -1 133# CHECK-NEXT: addi 12, 12, -16416 134# CHECK-NEXT: cmpld 7, 12, 0 135# CHECK-NEXT: bt- 28, 0x100102bc 136 137# A caller with a stack size that is larger then 16 bits, but aligned such that 138# the addi instruction is unneeded. 139 .p2align 2 140 .global caller_large_aligned_stack 141 .type caller_large_aligned_stack, @function 142caller_large_aligned_stack: 143.Lclas_gep: 144 addis 2, 12, .TOC.-.Lclas_gep@ha 145 addi 12, 12, .TOC.-.Lclas_gep@l 146 .localentry caller_large_aligned_stack, .-caller_large_aligned_stack 147 ld 0, -0x7040(13) 148 addis 12, 1, -2 149 nop 150 cmpld 7, 12, 0 151 blt- 7, .Lclas_alloc_more 152.Lclas_body: 153 mflr 0 154 std 0, 16(1) 155 lis 0, -2 156 stdux 1, 0, 1 157 bl nss_callee 158 ld 1, 0(1) 159 ld 0, 16(1) 160 mtlr 0 161 blr 162.Lclas_alloc_more: 163 mflr 0 164 std 0, 16(1) 165 bl __morestack 166 ld 0, 16(1) 167 mtlr 0 168 blr 169 b .Lclas_body 170 .size caller_large_aligned_stack, .-caller_large_aligned_stack 171 172# CHECK-LABEL: caller_large_aligned_stack 173# CHECK: ld 0, -28736(13) 174# CHECK-NEXT: addis 12, 1, -2 175# CHECK-NEXT: addi 12, 12, -16384 176# CHECK-NEXT: cmpld 7, 12, 0 177# CHECK-NEXT: bt- 28, 0x10010318 178 179# main only calls split-stack functions or __morestack so 180# there should be no adjustment of its split-stack prologue. 181 .p2align 2 182 .global main 183 .type main, @function 184main: 185.Lmain_gep: 186 addis 2, 12,.TOC.-.Lmain_gep@ha 187 addi 2, 2,.TOC.-.Lmain_gep@l 188 .localentry main,.-main 189 ld 0, -0x7040(13) 190 addi 12,1,-32 191 nop 192 cmpld 7, 12,0 193 blt- 7, .Lmain_morestack 194.Lmain_body: 195 mflr 0 196 std 0, 16(1) 197 stdu 1, -32(1) 198 bl caller_small_stack 199 nop 200 bl caller_med_stack 201 nop 202 bl caller_large_stack 203 nop 204 bl caller_large_aligned_stack 205 addi 1, 1, 32 206 ld 0, 16(1) 207 mtlr 0 208 blr 209.Lmain_morestack: 210 mflr 0 211 std 0, 16(1) 212 bl __morestack 213 ld 0, 16(1) 214 mtlr 0 215 blr 216 b .Lmain_body 217 .size main,.-main 218# CHECK-LABEL: main 219# CHECK: ld 0, -28736(13) 220# CHECK-NEXT: addi 12, 1, -32 221# CHECK-NEXT: nop 222# CHECK-NEXT: cmpld 7, 12, 0 223 224 .section .note.GNU-split-stack,"",@progbits 225