xref: /llvm-project/llvm/test/CodeGen/ARM/Windows/wineh-framepointer.ll (revision 40c937cba239db817b53d47c4525a751a8c488a0)
12ab19bfaSMartin Storsjö;; Check that this produces the expected assembly output
22ab19bfaSMartin Storsjö; RUN: llc -mtriple=thumbv7-windows -o - %s -verify-machineinstrs | FileCheck %s
32ab19bfaSMartin Storsjö;; Also try to write an object file, which verifies that the SEH opcodes
42ab19bfaSMartin Storsjö;; match the actual prologue/epilogue length.
52ab19bfaSMartin Storsjö; RUN: llc -mtriple=thumbv7-windows -filetype=obj -o %t.obj %s -verify-machineinstrs
62ab19bfaSMartin Storsjö
72ab19bfaSMartin Storsjö; CHECK-LABEL: alloc_local:
82ab19bfaSMartin Storsjö; CHECK-NEXT: .seh_proc alloc_local
92ab19bfaSMartin Storsjö; CHECK-NEXT: @ %bb.0:                                @ %entry
102ab19bfaSMartin Storsjö; CHECK-NEXT:         push.w  {r4, r5, r6, r7, r8, r9, r10}
112ab19bfaSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r4-r10}
122ab19bfaSMartin Storsjö; CHECK-NEXT:         sub     sp, #4
132ab19bfaSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc 4
142ab19bfaSMartin Storsjö; CHECK-NEXT:         vpush   {d8, d9, d10, d11, d12, d13, d14, d15}
152ab19bfaSMartin Storsjö; CHECK-NEXT:         .seh_save_fregs         {d8-d15}
162ab19bfaSMartin Storsjö; CHECK-NEXT:         push.w  {r11, lr}
172ab19bfaSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r11, lr}
182ab19bfaSMartin Storsjö; CHECK-NEXT:         mov     r11, sp
192ab19bfaSMartin Storsjö; CHECK-NEXT:         .seh_save_sp    r11
202ab19bfaSMartin Storsjö; CHECK-NEXT:         .seh_endprologue
212ab19bfaSMartin Storsjö; CHECK-NEXT:         movw    r4, #1256
222ab19bfaSMartin Storsjö; CHECK-NEXT:         bl      __chkstk
232ab19bfaSMartin Storsjö; CHECK-NEXT:         sub.w   sp, sp, r4
242ab19bfaSMartin Storsjö; CHECK-NEXT:         mov     r4, sp
252ab19bfaSMartin Storsjö; CHECK-NEXT:         bfc     r4, #0, #4
262ab19bfaSMartin Storsjö; CHECK-NEXT:         mov     sp, r4
272ab19bfaSMartin Storsjö
282ab19bfaSMartin Storsjö; CHECK:              ldr.w   [[TMP:r[0-9]]], [r11, #104]
292ab19bfaSMartin Storsjö; CHECK:              mov     r0, [[TMP]]
302ab19bfaSMartin Storsjö
312ab19bfaSMartin Storsjö; CHECK:              .seh_startepilogue
322ab19bfaSMartin Storsjö; CHECK-NEXT:         mov     sp, r11
332ab19bfaSMartin Storsjö; CHECK-NEXT:         .seh_save_sp    r11
342ab19bfaSMartin Storsjö; CHECK-NEXT:         pop.w   {r11, lr}
352ab19bfaSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r11, lr}
362ab19bfaSMartin Storsjö; CHECK-NEXT:         vpop    {d8, d9, d10, d11, d12, d13, d14, d15}
372ab19bfaSMartin Storsjö; CHECK-NEXT:         .seh_save_fregs         {d8-d15}
382ab19bfaSMartin Storsjö; CHECK-NEXT:         add     sp, #4
392ab19bfaSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc 4
402ab19bfaSMartin Storsjö; CHECK-NEXT:         pop.w   {r4, r5, r6, r7, r8, r9, r10}
412ab19bfaSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r4-r10}
422ab19bfaSMartin Storsjö; CHECK-NEXT:         bx      lr
432ab19bfaSMartin Storsjö; CHECK-NEXT:         .seh_nop
442ab19bfaSMartin Storsjö; CHECK-NEXT:         .seh_endepilogue
452ab19bfaSMartin Storsjö; CHECK-NEXT:         .seh_endproc
462ab19bfaSMartin Storsjö
472ab19bfaSMartin Storsjödefine arm_aapcs_vfpcc void @alloc_local(i32 noundef %a, i32 noundef %b, i32 noundef %c, i32 noundef %d, i32 noundef %e) uwtable {
482ab19bfaSMartin Storsjöentry:
492ab19bfaSMartin Storsjö  %buf2 = alloca [5000 x i8], align 16
502ab19bfaSMartin Storsjö  %vla = alloca i8, i32 %a, align 1
512ab19bfaSMartin Storsjö  call void @llvm.lifetime.start.p0(i64 5000, ptr nonnull %buf2) #3
522ab19bfaSMartin Storsjö  call arm_aapcs_vfpcc void @other(i32 noundef %e, ptr noundef nonnull %vla, ptr noundef nonnull %buf2)
532ab19bfaSMartin Storsjö  call void asm sideeffect "", "~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r10},~{r11},~{r12}"()
542ab19bfaSMartin Storsjö  call void asm sideeffect "", "~{d8},~{d9},~{d10},~{d11},~{d12},~{d13},~{d14},~{d15}"()
552ab19bfaSMartin Storsjö  call void @llvm.lifetime.end.p0(i64 5000, ptr nonnull %buf2) #3
562ab19bfaSMartin Storsjö  ret void
572ab19bfaSMartin Storsjö}
582ab19bfaSMartin Storsjö
592ab19bfaSMartin Storsjödeclare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)
602ab19bfaSMartin Storsjödeclare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)
612ab19bfaSMartin Storsjö
622ab19bfaSMartin Storsjödeclare arm_aapcs_vfpcc void @other(i32 noundef, ptr noundef, ptr noundef)
63*40c937cbSMartin Storsjö
64*40c937cbSMartin Storsjö; CHECK-LABEL: everything_varargs:
65*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_proc everything_varargs
66*40c937cbSMartin Storsjö; CHECK-NEXT: @ %bb.0:                                @ %entry
67*40c937cbSMartin Storsjö; CHECK-NEXT:         sub     sp, #12
68*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc 12
69*40c937cbSMartin Storsjö; CHECK-NEXT:         push.w  {r4, r5, r6, r7, r8, r9}
70*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r4-r9}
71*40c937cbSMartin Storsjö; CHECK-NEXT:         sub     sp, #4
72*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc 4
73*40c937cbSMartin Storsjö; CHECK-NEXT:         vpush   {d8, d9, d10, d11, d12, d13, d14, d15}
74*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_save_fregs         {d8-d15}
75*40c937cbSMartin Storsjö; CHECK-NEXT:         push.w  {r11, lr}
76*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r11, lr}
77*40c937cbSMartin Storsjö; CHECK-NEXT:         mov     r11, sp
78*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_save_sp    r11
79*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_endprologue
80*40c937cbSMartin Storsjö; CHECK-NEXT:         movw    r4, #1258
81*40c937cbSMartin Storsjö; CHECK-NEXT:         bl      __chkstk
82*40c937cbSMartin Storsjö; CHECK-NEXT:         sub.w   sp, sp, r4
83*40c937cbSMartin Storsjö; CHECK-NEXT:         mov     r4, sp
84*40c937cbSMartin Storsjö; CHECK-NEXT:         bfc     r4, #0, #4
85*40c937cbSMartin Storsjö; CHECK-NEXT:         mov     sp, r4
86*40c937cbSMartin Storsjö
87*40c937cbSMartin Storsjö; CHECK:              .seh_startepilogue
88*40c937cbSMartin Storsjö; CHECK-NEXT:         mov     sp, r11
89*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_save_sp    r11
90*40c937cbSMartin Storsjö; CHECK-NEXT:         pop.w   {r11, lr}
91*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r11, lr}
92*40c937cbSMartin Storsjö; CHECK-NEXT:         vpop    {d8, d9, d10, d11, d12, d13, d14, d15}
93*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_save_fregs         {d8-d15}
94*40c937cbSMartin Storsjö; CHECK-NEXT:         add     sp, #4
95*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc 4
96*40c937cbSMartin Storsjö; CHECK-NEXT:         pop.w   {r4, r5, r6, r7, r8, r9}
97*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r4-r9}
98*40c937cbSMartin Storsjö; CHECK-NEXT:         add     sp, #12
99*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc 12
100*40c937cbSMartin Storsjö; CHECK-NEXT:         bx      lr
101*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_nop
102*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_endepilogue
103*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_endproc
104*40c937cbSMartin Storsjö
105*40c937cbSMartin Storsjödefine arm_aapcs_vfpcc void @everything_varargs(i32 noundef %a, ...) {
106*40c937cbSMartin Storsjöentry:
107*40c937cbSMartin Storsjö  %buf2 = alloca [5000 x i8], align 16
108*40c937cbSMartin Storsjö  %ap = alloca ptr, align 4
109*40c937cbSMartin Storsjö  %vla = alloca i8, i32 %a, align 1
110*40c937cbSMartin Storsjö  call void @llvm.lifetime.start.p0(i64 5000, ptr nonnull %buf2)
111*40c937cbSMartin Storsjö  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %ap)
112*40c937cbSMartin Storsjö  call void @llvm.va_start(ptr nonnull %ap)
113*40c937cbSMartin Storsjö  %0 = load ptr, ptr %ap, align 4
114*40c937cbSMartin Storsjö  call arm_aapcs_vfpcc void @other2(i32 noundef %a, ptr noundef nonnull %vla, ptr noundef nonnull %buf2, ptr noundef %0)
115*40c937cbSMartin Storsjö  call void @llvm.va_end(ptr nonnull %ap)
116*40c937cbSMartin Storsjö  call void asm sideeffect "", "~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r11},~{r12}"()
117*40c937cbSMartin Storsjö  call void asm sideeffect "", "~{d8},~{d9},~{d10},~{d11},~{d12},~{d13},~{d14},~{d15}"()
118*40c937cbSMartin Storsjö  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %ap)
119*40c937cbSMartin Storsjö  call void @llvm.lifetime.end.p0(i64 5000, ptr nonnull %buf2)
120*40c937cbSMartin Storsjö  ret void
121*40c937cbSMartin Storsjö}
122*40c937cbSMartin Storsjö
123*40c937cbSMartin Storsjö; CHECK-LABEL: novector_varargs:
124*40c937cbSMartin Storsjö; CHECK-NEXT: .seh_proc novector_varargs
125*40c937cbSMartin Storsjö; CHECK-NEXT: @ %bb.0:                                @ %entry
126*40c937cbSMartin Storsjö; CHECK-NEXT:         sub     sp, #12
127*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc 12
128*40c937cbSMartin Storsjö; CHECK-NEXT:         push.w  {r4, r5, r6, r7, r8, r9}
129*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r4-r9}
130*40c937cbSMartin Storsjö; CHECK-NEXT:         push.w  {r11, lr}
131*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r11, lr}
132*40c937cbSMartin Storsjö; CHECK-NEXT:         mov     r11, sp
133*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_save_sp    r11
134*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_endprologue
135*40c937cbSMartin Storsjö; CHECK-NEXT:         movw    r4, #1259
136*40c937cbSMartin Storsjö; CHECK-NEXT:         bl      __chkstk
137*40c937cbSMartin Storsjö; CHECK-NEXT:         sub.w   sp, sp, r4
138*40c937cbSMartin Storsjö; CHECK-NEXT:         mov     r4, sp
139*40c937cbSMartin Storsjö; CHECK-NEXT:         bfc     r4, #0, #4
140*40c937cbSMartin Storsjö; CHECK-NEXT:         mov     sp, r4
141*40c937cbSMartin Storsjö
142*40c937cbSMartin Storsjö; CHECK:              .seh_startepilogue
143*40c937cbSMartin Storsjö; CHECK-NEXT:         mov     sp, r11
144*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_save_sp    r11
145*40c937cbSMartin Storsjö; CHECK-NEXT:         pop.w   {r11, lr}
146*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r11, lr}
147*40c937cbSMartin Storsjö; CHECK-NEXT:         pop.w   {r4, r5, r6, r7, r8, r9}
148*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_save_regs_w        {r4-r9}
149*40c937cbSMartin Storsjö; CHECK-NEXT:         add     sp, #12
150*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_stackalloc 12
151*40c937cbSMartin Storsjö; CHECK-NEXT:         bx      lr
152*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_nop
153*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_endepilogue
154*40c937cbSMartin Storsjö; CHECK-NEXT:         .seh_endproc
155*40c937cbSMartin Storsjö
156*40c937cbSMartin Storsjödefine arm_aapcs_vfpcc void @novector_varargs(i32 noundef %a, ...) {
157*40c937cbSMartin Storsjöentry:
158*40c937cbSMartin Storsjö  %buf2 = alloca [5000 x i8], align 16
159*40c937cbSMartin Storsjö  %ap = alloca ptr, align 4
160*40c937cbSMartin Storsjö  %vla = alloca i8, i32 %a, align 1
161*40c937cbSMartin Storsjö  call void @llvm.lifetime.start.p0(i64 5000, ptr nonnull %buf2)
162*40c937cbSMartin Storsjö  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %ap)
163*40c937cbSMartin Storsjö  call void @llvm.va_start(ptr nonnull %ap)
164*40c937cbSMartin Storsjö  %0 = load ptr, ptr %ap, align 4
165*40c937cbSMartin Storsjö  call arm_aapcs_vfpcc void @other2(i32 noundef %a, ptr noundef nonnull %vla, ptr noundef nonnull %buf2, ptr noundef %0)
166*40c937cbSMartin Storsjö  call void @llvm.va_end(ptr nonnull %ap)
167*40c937cbSMartin Storsjö  call void asm sideeffect "", "~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r11},~{r12}"()
168*40c937cbSMartin Storsjö  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %ap)
169*40c937cbSMartin Storsjö  call void @llvm.lifetime.end.p0(i64 5000, ptr nonnull %buf2)
170*40c937cbSMartin Storsjö  ret void
171*40c937cbSMartin Storsjö}
172*40c937cbSMartin Storsjö
173*40c937cbSMartin Storsjödeclare void @llvm.va_start(ptr)
174*40c937cbSMartin Storsjödeclare void @llvm.va_end(ptr)
175*40c937cbSMartin Storsjö
176*40c937cbSMartin Storsjödeclare arm_aapcs_vfpcc void @other2(i32 noundef, ptr noundef, ptr noundef, ptr noundef)
177