xref: /llvm-project/llvm/test/MC/ARM/seh-packed.s (revision d4022ff3310635f682e9937c8ffa4aeb0d2e2854)
1// This test checks various cases around generating packed unwind info.
2
3// RUN: llvm-mc -triple thumbv7-pc-win32 -filetype=obj %s | llvm-readobj -u - | FileCheck %s
4
5// CHECK:       RuntimeFunction {
6// CHECK-NEXT:    Function: func6
7// CHECK-NEXT:    Fragment: No
8// CHECK-NEXT:    FunctionLength: 8
9// CHECK-NEXT:    ReturnType: bx <reg>
10// CHECK-NEXT:    HomedParameters: No
11// CHECK-NEXT:    Reg: 7
12// CHECK-NEXT:    R: 1
13// CHECK-NEXT:    LinkRegister: No
14// CHECK-NEXT:    Chaining: No
15// CHECK-NEXT:    StackAdjustment: 0
16// CHECK-NEXT:    Prologue [
17// CHECK-NEXT:    ]
18// CHECK-NEXT:    Epilogue [
19// CHECK-NEXT:      bx <reg>
20// CHECK-NEXT:    ]
21// CHECK-NEXT:  }
22// CHECK-NEXT:  RuntimeFunction {
23// CHECK-NEXT:    Function: func7
24// CHECK-NEXT:    Fragment: No
25// CHECK-NEXT:    FunctionLength: 8
26// CHECK-NEXT:    ReturnType: bx <reg>
27// CHECK-NEXT:    HomedParameters: No
28// CHECK-NEXT:    Reg: 0
29// CHECK-NEXT:    R: 0
30// CHECK-NEXT:    LinkRegister: No
31// CHECK-NEXT:    Chaining: No
32// CHECK-NEXT:    StackAdjustment: 0
33// CHECK-NEXT:    Prologue [
34// CHECK-NEXT:      push {r4}
35// CHECK-NEXT:    ]
36// CHECK-NEXT:    Epilogue [
37// CHECK-NEXT:      pop {r4}
38// CHECK-NEXT:      bx <reg>
39// CHECK-NEXT:    ]
40// CHECK-NEXT:  }
41// CHECK-NEXT:  RuntimeFunction {
42// CHECK-NEXT:    Function: func8
43// CHECK-NEXT:    Fragment: No
44// CHECK-NEXT:    FunctionLength: 10
45// CHECK-NEXT:    ReturnType: bx <reg>
46// CHECK-NEXT:    HomedParameters: No
47// CHECK-NEXT:    Reg: 0
48// CHECK-NEXT:    R: 0
49// CHECK-NEXT:    LinkRegister: Yes
50// CHECK-NEXT:    Chaining: No
51// CHECK-NEXT:    StackAdjustment: 0
52// CHECK-NEXT:    Prologue [
53// CHECK-NEXT:      push {r4, lr}
54// CHECK-NEXT:    ]
55// CHECK-NEXT:    Epilogue [
56// CHECK-NEXT:      pop {r4, lr}
57// CHECK-NEXT:      bx <reg>
58// CHECK-NEXT:    ]
59// CHECK-NEXT:  }
60// CHECK-NEXT:  RuntimeFunction {
61// CHECK-NEXT:    Function: func9
62// CHECK-NEXT:    Fragment: No
63// CHECK-NEXT:    FunctionLength: 24
64// CHECK-NEXT:    ReturnType: b.w <target>
65// CHECK-NEXT:    HomedParameters: No
66// CHECK-NEXT:    Reg: 0
67// CHECK-NEXT:    R: 1
68// CHECK-NEXT:    LinkRegister: Yes
69// CHECK-NEXT:    Chaining: No
70// CHECK-NEXT:    StackAdjustment: 32
71// CHECK-NEXT:    Prologue [
72// CHECK-NEXT:      sub sp, sp, #32
73// CHECK-NEXT:      vpush {d8}
74// CHECK-NEXT:      push {lr}
75// CHECK-NEXT:    ]
76// CHECK-NEXT:    Epilogue [
77// CHECK-NEXT:      add sp, sp, #32
78// CHECK-NEXT:      vpop {d8}
79// CHECK-NEXT:      pop {lr}
80// CHECK-NEXT:      b.w <target>
81// CHECK-NEXT:    ]
82// CHECK-NEXT:  }
83// CHECK-NEXT:  RuntimeFunction {
84// CHECK-NEXT:    Function: func10
85// CHECK-NEXT:    Fragment: No
86// CHECK-NEXT:    FunctionLength: 26
87// CHECK-NEXT:    ReturnType: bx <reg>
88// CHECK-NEXT:    HomedParameters: No
89// CHECK-NEXT:    Reg: 1
90// CHECK-NEXT:    R: 1
91// CHECK-NEXT:    LinkRegister: Yes
92// CHECK-NEXT:    Chaining: Yes
93// CHECK-NEXT:    StackAdjustment: 16
94// CHECK-NEXT:    Prologue [
95// CHECK-NEXT:      sub sp, sp, #16
96// CHECK-NEXT:      vpush {d8-d9}
97// CHECK-NEXT:      mov r11, sp
98// CHECK-NEXT:      push {r11, lr}
99// CHECK-NEXT:    ]
100// CHECK-NEXT:    Epilogue [
101// CHECK-NEXT:      add sp, sp, #16
102// CHECK-NEXT:      vpop {d8-d9}
103// CHECK-NEXT:      pop {r11, lr}
104// CHECK-NEXT:      bx <reg>
105// CHECK-NEXT:    ]
106// CHECK-NEXT:  }
107// CHECK-NEXT:  RuntimeFunction {
108// CHECK-NEXT:    Function: func11
109// CHECK-NEXT:    Fragment: No
110// CHECK-NEXT:    FunctionLength: 24
111// CHECK-NEXT:    ReturnType: pop {pc}
112// CHECK-NEXT:    HomedParameters: No
113// CHECK-NEXT:    Reg: 1
114// CHECK-NEXT:    R: 1
115// CHECK-NEXT:    LinkRegister: Yes
116// CHECK-NEXT:    Chaining: Yes
117// CHECK-NEXT:    StackAdjustment: 16
118// CHECK-NEXT:    Prologue [
119// CHECK-NEXT:      sub sp, sp, #16
120// CHECK-NEXT:      vpush {d8-d9}
121// CHECK-NEXT:      mov r11, sp
122// CHECK-NEXT:      push {r11, lr}
123// CHECK-NEXT:    ]
124// CHECK-NEXT:    Epilogue [
125// CHECK-NEXT:      add sp, sp, #16
126// CHECK-NEXT:      vpop {d8-d9}
127// CHECK-NEXT:      pop {r11, pc}
128// CHECK-NEXT:    ]
129// CHECK-NEXT:  }
130// CHECK-NEXT:  RuntimeFunction {
131// CHECK-NEXT:    Function: func12
132// CHECK-NEXT:    Fragment: No
133// CHECK-NEXT:    FunctionLength: 18
134// CHECK-NEXT:    ReturnType: b.w <target>
135// CHECK-NEXT:    HomedParameters: No
136// CHECK-NEXT:    Reg: 6
137// CHECK-NEXT:    R: 1
138// CHECK-NEXT:    LinkRegister: No
139// CHECK-NEXT:    Chaining: No
140// CHECK-NEXT:    StackAdjustment: 16
141// CHECK-NEXT:    Prologue [
142// CHECK-NEXT:      sub sp, sp, #16
143// CHECK-NEXT:      vpush {d8-d14}
144// CHECK-NEXT:    ]
145// CHECK-NEXT:    Epilogue [
146// CHECK-NEXT:      add sp, sp, #16
147// CHECK-NEXT:      vpop {d8-d14}
148// CHECK-NEXT:      b.w <target>
149// CHECK-NEXT:    ]
150// CHECK-NEXT:  }
151// CHECK-NEXT:  RuntimeFunction {
152// CHECK-NEXT:    Function: func13
153// CHECK-NEXT:    Fragment: No
154// CHECK-NEXT:    FunctionLength: 18
155// CHECK-NEXT:    ReturnType: pop {pc}
156// CHECK-NEXT:    HomedParameters: No
157// CHECK-NEXT:    Reg: 6
158// CHECK-NEXT:    R: 0
159// CHECK-NEXT:    LinkRegister: Yes
160// CHECK-NEXT:    Chaining: Yes
161// CHECK-NEXT:    StackAdjustment: 20
162// CHECK-NEXT:    Prologue [
163// CHECK-NEXT:      sub sp, sp, #20
164// CHECK-NEXT:      add.w r11, sp, #28
165// CHECK-NEXT:      push {r4-r11, lr}
166// CHECK-NEXT:    ]
167// CHECK-NEXT:    Epilogue [
168// CHECK-NEXT:      add sp, sp, #20
169// CHECK-NEXT:      pop {r4-r11, pc}
170// CHECK-NEXT:    ]
171// CHECK-NEXT:  }
172// CHECK-NEXT:  RuntimeFunction {
173// CHECK-NEXT:    Function: func14
174// CHECK-NEXT:    Fragment: No
175// CHECK-NEXT:    FunctionLength: 14
176// CHECK-NEXT:    ReturnType: pop {pc}
177// CHECK-NEXT:    HomedParameters: No
178// CHECK-NEXT:    Reg: 7
179// CHECK-NEXT:    R: 0
180// CHECK-NEXT:    LinkRegister: Yes
181// CHECK-NEXT:    Chaining: No
182// CHECK-NEXT:    StackAdjustment: 20
183// CHECK-NEXT:    Prologue [
184// CHECK-NEXT:      sub sp, sp, #20
185// CHECK-NEXT:      push {r4-r11, lr}
186// CHECK-NEXT:    ]
187// CHECK-NEXT:    Epilogue [
188// CHECK-NEXT:      add sp, sp, #20
189// CHECK-NEXT:      pop {r4-r11, pc}
190// CHECK-NEXT:    ]
191// CHECK-NEXT:  }
192// CHECK-NEXT:  RuntimeFunction {
193// CHECK-NEXT:    Function: func15
194// CHECK-NEXT:    Fragment: No
195// CHECK-NEXT:    FunctionLength: 20
196// CHECK-NEXT:    ReturnType: pop {pc}
197// CHECK-NEXT:    HomedParameters: Yes
198// CHECK-NEXT:    Reg: 0
199// CHECK-NEXT:    R: 0
200// CHECK-NEXT:    LinkRegister: Yes
201// CHECK-NEXT:    Chaining: No
202// CHECK-NEXT:    StackAdjustment: 512
203// CHECK-NEXT:    Prologue [
204// CHECK-NEXT:      sub sp, sp, #512
205// CHECK-NEXT:      push {r4, lr}
206// CHECK-NEXT:      push {r0-r3}
207// CHECK-NEXT:    ]
208// CHECK-NEXT:    Epilogue [
209// CHECK-NEXT:      add sp, sp, #512
210// CHECK-NEXT:      pop {r4}
211// CHECK-NEXT:      ldr pc, [sp], #20
212// CHECK-NEXT:    ]
213// CHECK-NEXT:  }
214// CHECK-NEXT:  RuntimeFunction {
215// CHECK-NEXT:    Function: func16
216// CHECK-NEXT:    Fragment: No
217// CHECK-NEXT:    FunctionLength: 20
218// CHECK-NEXT:    ReturnType: b.w <target>
219// CHECK-NEXT:    HomedParameters: Yes
220// CHECK-NEXT:    Reg: 7
221// CHECK-NEXT:    R: 1
222// CHECK-NEXT:    LinkRegister: Yes
223// CHECK-NEXT:    Chaining: Yes
224// CHECK-NEXT:    StackAdjustment: 0
225// CHECK-NEXT:    Prologue [
226// CHECK-NEXT:      mov r11, sp
227// CHECK-NEXT:      push {r11, lr}
228// CHECK-NEXT:      push {r0-r3}
229// CHECK-NEXT:    ]
230// CHECK-NEXT:    Epilogue [
231// CHECK-NEXT:      pop {r11, lr}
232// CHECK-NEXT:      add sp, sp, #16
233// CHECK-NEXT:      b.w <target>
234// CHECK-NEXT:    ]
235// CHECK-NEXT:  }
236// CHECK-NEXT:  RuntimeFunction {
237// CHECK-NEXT:    Function: func17
238// CHECK-NEXT:    Fragment: No
239// CHECK-NEXT:    FunctionLength: 20
240// CHECK-NEXT:    ReturnType: bx <reg>
241// CHECK-NEXT:    HomedParameters: Yes
242// CHECK-NEXT:    Reg: 0
243// CHECK-NEXT:    R: 0
244// CHECK-NEXT:    LinkRegister: No
245// CHECK-NEXT:    Chaining: No
246// CHECK-NEXT:    StackAdjustment: 512
247// CHECK-NEXT:    Prologue [
248// CHECK-NEXT:      sub sp, sp, #512
249// CHECK-NEXT:      push {r4}
250// CHECK-NEXT:      push {r0-r3}
251// CHECK-NEXT:    ]
252// CHECK-NEXT:    Epilogue [
253// CHECK-NEXT:      add sp, sp, #512
254// CHECK-NEXT:      pop {r4}
255// CHECK-NEXT:      add sp, sp, #16
256// CHECK-NEXT:      bx <reg>
257// CHECK-NEXT:    ]
258// CHECK-NEXT:  }
259// CHECK-NEXT:  RuntimeFunction {
260// CHECK-NEXT:    Function: func18
261// CHECK-NEXT:    Fragment: No
262// CHECK-NEXT:    FunctionLength: 6
263// CHECK-NEXT:    ReturnType: pop {pc}
264// CHECK-NEXT:    HomedParameters: No
265// CHECK-NEXT:    Reg: 7
266// CHECK-NEXT:    R: 1
267// CHECK-NEXT:    LinkRegister: Yes
268// CHECK-NEXT:    Chaining: No
269// CHECK-NEXT:    StackAdjustment: 4
270// CHECK-NEXT:    Prologue [
271// CHECK-NEXT:      push {r3, lr}
272// CHECK-NEXT:    ]
273// CHECK-NEXT:    Epilogue [
274// CHECK-NEXT:      pop {r3, pc}
275// CHECK-NEXT:    ]
276// CHECK-NEXT:  }
277// CHECK-NEXT:  RuntimeFunction {
278// CHECK-NEXT:    Function: func19
279// CHECK-NEXT:    Fragment: No
280// CHECK-NEXT:    FunctionLength: 12
281// CHECK-NEXT:    ReturnType: bx <reg>
282// CHECK-NEXT:    HomedParameters: Yes
283// CHECK-NEXT:    Reg: 0
284// CHECK-NEXT:    R: 0
285// CHECK-NEXT:    LinkRegister: No
286// CHECK-NEXT:    Chaining: No
287// CHECK-NEXT:    StackAdjustment: 16
288// CHECK-NEXT:    Prologue [
289// CHECK-NEXT:      push {r0-r4}
290// CHECK-NEXT:      push {r0-r3}
291// CHECK-NEXT:    ]
292// CHECK-NEXT:    Epilogue [
293// CHECK-NEXT:      pop {r0-r4}
294// CHECK-NEXT:      add sp, sp, #16
295// CHECK-NEXT:      bx <reg>
296// CHECK-NEXT:    ]
297// CHECK-NEXT:  }
298// CHECK-NEXT:  RuntimeFunction {
299// CHECK-NEXT:    Function: func20
300// CHECK-NEXT:    Fragment: No
301// CHECK-NEXT:    FunctionLength: 14
302// CHECK-NEXT:    ReturnType: bx <reg>
303// CHECK-NEXT:    HomedParameters: Yes
304// CHECK-NEXT:    Reg: 0
305// CHECK-NEXT:    R: 0
306// CHECK-NEXT:    LinkRegister: No
307// CHECK-NEXT:    Chaining: No
308// CHECK-NEXT:    StackAdjustment: 16
309// CHECK-NEXT:    Prologue [
310// CHECK-NEXT:      push {r0-r4}
311// CHECK-NEXT:      push {r0-r3}
312// CHECK-NEXT:    ]
313// CHECK-NEXT:    Epilogue [
314// CHECK-NEXT:      add sp, sp, #16
315// CHECK-NEXT:      pop {r4}
316// CHECK-NEXT:      add sp, sp, #16
317// CHECK-NEXT:      bx <reg>
318// CHECK-NEXT:    ]
319// CHECK-NEXT:  }
320// CHECK-NEXT:  RuntimeFunction {
321// CHECK-NEXT:    Function: func21
322// CHECK-NEXT:    Fragment: No
323// CHECK-NEXT:    FunctionLength: 14
324// CHECK-NEXT:    ReturnType: bx <reg>
325// CHECK-NEXT:    HomedParameters: Yes
326// CHECK-NEXT:    Reg: 0
327// CHECK-NEXT:    R: 0
328// CHECK-NEXT:    LinkRegister: No
329// CHECK-NEXT:    Chaining: No
330// CHECK-NEXT:    StackAdjustment: 16
331// CHECK-NEXT:    Prologue [
332// CHECK-NEXT:      sub sp, sp, #16
333// CHECK-NEXT:      push {r4}
334// CHECK-NEXT:      push {r0-r3}
335// CHECK-NEXT:    ]
336// CHECK-NEXT:    Epilogue [
337// CHECK-NEXT:      pop {r0-r4}
338// CHECK-NEXT:      add sp, sp, #16
339// CHECK-NEXT:      bx <reg>
340// CHECK-NEXT:    ]
341// CHECK-NEXT:  }
342// CHECK-NEXT:  RuntimeFunction {
343// CHECK-NEXT:    Function: func22
344// CHECK-NEXT:    Fragment: Yes
345// CHECK-NEXT:    FunctionLength: 14
346// CHECK-NEXT:    ReturnType: pop {pc}
347// CHECK-NEXT:    HomedParameters: Yes
348// CHECK-NEXT:    Reg: 0
349// CHECK-NEXT:    R: 0
350// CHECK-NEXT:    LinkRegister: Yes
351// CHECK-NEXT:    Chaining: No
352// CHECK-NEXT:    StackAdjustment: 512
353// CHECK-NEXT:    Prologue [
354// CHECK-NEXT:      sub sp, sp, #512
355// CHECK-NEXT:      push {r4, lr}
356// CHECK-NEXT:      push {r0-r3}
357// CHECK-NEXT:    ]
358// CHECK-NEXT:    Epilogue [
359// CHECK-NEXT:      add sp, sp, #512
360// CHECK-NEXT:      pop {r4}
361// CHECK-NEXT:      ldr pc, [sp], #20
362// CHECK-NEXT:    ]
363// CHECK-NEXT:  }
364// CHECK-NEXT:  RuntimeFunction {
365// CHECK-NEXT:    Function: func24
366// CHECK-NEXT:    Fragment: No
367// CHECK-NEXT:    FunctionLength: 16
368// CHECK-NEXT:    ReturnType: pop {pc}
369// CHECK-NEXT:    HomedParameters: No
370// CHECK-NEXT:    Reg: 3
371// CHECK-NEXT:    R: 0
372// CHECK-NEXT:    LinkRegister: Yes
373// CHECK-NEXT:    Chaining: Yes
374// CHECK-NEXT:    StackAdjustment: 8
375// CHECK-NEXT:    Prologue [
376// CHECK-NEXT:      add.w r11, sp, #24
377// CHECK-NEXT:      push {r2-r7, r11, lr}
378// CHECK-NEXT:    ]
379// CHECK-NEXT:    Epilogue [
380// CHECK-NEXT:      add sp, sp, #8
381// CHECK-NEXT:      pop {r4-r7, r11, pc}
382// CHECK-NEXT:    ]
383// CHECK-NEXT:  }
384// CHECK-NEXT:  RuntimeFunction {
385// CHECK-NEXT:    Function: func25
386// CHECK-NEXT:    Fragment: No
387// CHECK-NEXT:    FunctionLength: 16
388// CHECK-NEXT:    ReturnType: pop {pc}
389// CHECK-NEXT:    HomedParameters: No
390// CHECK-NEXT:    Reg: 3
391// CHECK-NEXT:    R: 0
392// CHECK-NEXT:    LinkRegister: Yes
393// CHECK-NEXT:    Chaining: Yes
394// CHECK-NEXT:    StackAdjustment: 8
395// CHECK-NEXT:    Prologue [
396// CHECK-NEXT:      sub sp, sp, #8
397// CHECK-NEXT:      add.w r11, sp, #16
398// CHECK-NEXT:      push {r4-r7, r11, lr}
399// CHECK-NEXT:    ]
400// CHECK-NEXT:    Epilogue [
401// CHECK-NEXT:      pop {r2-r7, r11, pc}
402// CHECK-NEXT:    ]
403// CHECK-NEXT:  }
404// CHECK-NEXT:  RuntimeFunction {
405// CHECK-NEXT:    Function: func26
406// CHECK-NEXT:    Fragment: No
407// CHECK-NEXT:    FunctionLength: 8
408// CHECK-NEXT:    ReturnType: bx <reg>
409// CHECK-NEXT:    HomedParameters: No
410// CHECK-NEXT:    Reg: 7
411// CHECK-NEXT:    R: 1
412// CHECK-NEXT:    LinkRegister: No
413// CHECK-NEXT:    Chaining: No
414// CHECK-NEXT:    StackAdjustment: 12
415// CHECK-NEXT:    Prologue [
416// CHECK-NEXT:      push {r1-r3}
417// CHECK-NEXT:    ]
418// CHECK-NEXT:    Epilogue [
419// CHECK-NEXT:      add sp, sp, #12
420// CHECK-NEXT:      bx <reg>
421// CHECK-NEXT:    ]
422// CHECK-NEXT:  }
423// CHECK-NEXT:  RuntimeFunction {
424// CHECK-NEXT:    Function: func27
425// CHECK-NEXT:    Fragment: No
426// CHECK-NEXT:    FunctionLength: 8
427// CHECK-NEXT:    ReturnType: bx <reg>
428// CHECK-NEXT:    HomedParameters: No
429// CHECK-NEXT:    Reg: 7
430// CHECK-NEXT:    R: 1
431// CHECK-NEXT:    LinkRegister: No
432// CHECK-NEXT:    Chaining: No
433// CHECK-NEXT:    StackAdjustment: 12
434// CHECK-NEXT:    Prologue [
435// CHECK-NEXT:      sub sp, sp, #12
436// CHECK-NEXT:    ]
437// CHECK-NEXT:    Epilogue [
438// CHECK-NEXT:      pop {r1-r3}
439// CHECK-NEXT:      bx <reg>
440// CHECK-NEXT:    ]
441// CHECK-NEXT:  }
442// CHECK-NEXT:  RuntimeFunction {
443// CHECK-NEXT:    Function: func28
444// CHECK-NEXT:    Fragment: No
445// CHECK-NEXT:    FunctionLength: 8
446// CHECK-NEXT:    ReturnType: bx <reg>
447// CHECK-NEXT:    HomedParameters: Yes
448// CHECK-NEXT:    Reg: 7
449// CHECK-NEXT:    R: 1
450// CHECK-NEXT:    LinkRegister: No
451// CHECK-NEXT:    Chaining: No
452// CHECK-NEXT:    StackAdjustment: 0
453// CHECK-NEXT:    Prologue [
454// CHECK-NEXT:      push {r0-r3}
455// CHECK-NEXT:    ]
456// CHECK-NEXT:    Epilogue [
457// CHECK-NEXT:      add sp, sp, #16
458// CHECK-NEXT:      bx <reg>
459// CHECK-NEXT:    ]
460// CHECK-NEXT:  }
461// CHECK-NEXT:  RuntimeFunction {
462// CHECK-NEXT:    Function: func29
463// CHECK-NEXT:    Fragment: No
464// CHECK-NEXT:    FunctionLength: 10
465// CHECK-NEXT:    ReturnType: pop {pc}
466// CHECK-NEXT:    HomedParameters: Yes
467// CHECK-NEXT:    Reg: 7
468// CHECK-NEXT:    R: 1
469// CHECK-NEXT:    LinkRegister: Yes
470// CHECK-NEXT:    Chaining: No
471// CHECK-NEXT:    StackAdjustment: 0
472// CHECK-NEXT:    Prologue [
473// CHECK-NEXT:      push {lr}
474// CHECK-NEXT:      push {r0-r3}
475// CHECK-NEXT:    ]
476// CHECK-NEXT:    Epilogue [
477// CHECK-NEXT:      ldr pc, [sp], #20
478// CHECK-NEXT:    ]
479// CHECK-NEXT:  }
480// CHECK-NEXT:  RuntimeFunction {
481// CHECK-NEXT:    Function: func30
482// CHECK-NEXT:    Fragment: No
483// CHECK-NEXT:    FunctionLength: 6
484// CHECK-NEXT:    ReturnType: pop {pc}
485// CHECK-NEXT:    HomedParameters: No
486// CHECK-NEXT:    Reg: 2
487// CHECK-NEXT:    R: 0
488// CHECK-NEXT:    LinkRegister: Yes
489// CHECK-NEXT:    Chaining: No
490// CHECK-NEXT:    StackAdjustment: 0
491// CHECK-NEXT:    Prologue [
492// CHECK-NEXT:      push {r4-r6, lr}
493// CHECK-NEXT:    ]
494// CHECK-NEXT:    Epilogue [
495// CHECK-NEXT:      pop {r4-r6, pc}
496// CHECK-NEXT:    ]
497// CHECK-NEXT:  }
498// CHECK-NEXT:  RuntimeFunction {
499// CHECK-NEXT:    Function: func31
500// CHECK-NEXT:    Fragment: No
501// CHECK-NEXT:    FunctionLength: 4
502// CHECK-NEXT:    ReturnType: (no epilogue)
503// CHECK-NEXT:    HomedParameters: No
504// CHECK-NEXT:    Reg: 2
505// CHECK-NEXT:    R: 0
506// CHECK-NEXT:    LinkRegister: Yes
507// CHECK-NEXT:    Chaining: No
508// CHECK-NEXT:    StackAdjustment: 0
509// CHECK-NEXT:    Prologue [
510// CHECK-NEXT:      push {r4-r6, lr}
511// CHECK-NEXT:    ]
512// CHECK-NEXT:  }
513
514// CHECK:         Function: notpacked1
515// CHECK-NEXT:    ExceptionRecord:
516// CHECK:         Function: notpacked2
517// CHECK-NEXT:    ExceptionRecord:
518// CHECK:         Function: notpacked3
519// CHECK-NEXT:    ExceptionRecord:
520// CHECK:         Function: notpacked4
521// CHECK-NEXT:    ExceptionRecord:
522// CHECK:         Function: notpacked5
523// CHECK-NEXT:    ExceptionRecord:
524// CHECK:         Function: notpacked6
525// CHECK-NEXT:    ExceptionRecord:
526// CHECK:         Function: notpacked7
527// CHECK-NEXT:    ExceptionRecord:
528// CHECK:         Function: notpacked8
529// CHECK-NEXT:    ExceptionRecord:
530// CHECK:         Function: notpacked9
531// CHECK-NEXT:    ExceptionRecord:
532
533        .text
534        .syntax unified
535
536        .seh_proc func6
537func6:
538        .seh_endprologue
539        nop
540        nop
541        nop
542        .seh_startepilogue
543        bx lr
544        .seh_nop
545        .seh_endepilogue
546        .seh_endproc
547
548        .seh_proc func7
549func7:
550        push {r4}
551        .seh_save_regs {r4}
552        .seh_endprologue
553        nop
554        .seh_startepilogue
555        pop {r4}
556        .seh_save_regs {r4}
557        bx lr
558        .seh_nop
559        .seh_endepilogue
560        .seh_endproc
561
562        .seh_proc func8
563func8:
564        push {r4,lr}
565        .seh_save_regs {r4,lr}
566        .seh_endprologue
567        nop
568        .seh_startepilogue
569        pop.w {r4,lr}
570        .seh_save_regs_w {r4,lr}
571        bx lr
572        .seh_nop
573        .seh_endepilogue
574        .seh_endproc
575
576        .seh_proc func9
577func9:
578        push {lr}
579        .seh_save_regs {lr}
580        vpush {d8}
581        .seh_save_fregs {d8}
582        sub sp, sp, #32
583        .seh_stackalloc 32
584        .seh_endprologue
585        nop
586        .seh_startepilogue
587        add sp, sp, #32
588        .seh_stackalloc 32
589        vpop {d8}
590        .seh_save_fregs {d8}
591        pop.w {lr}
592        .seh_save_regs_w {lr}
593        b.w tailcall
594        .seh_nop_w
595        .seh_endepilogue
596        .seh_endproc
597
598        .seh_proc func10
599func10:
600        push.w {r11,lr}
601        .seh_save_regs_w {r11,lr}
602        mov r11, sp
603        .seh_nop
604        vpush {d8-d9}
605        .seh_save_fregs {d8-d9}
606        sub sp, sp, #16
607        .seh_stackalloc 16
608        .seh_endprologue
609        nop
610        .seh_startepilogue
611        add sp, sp, #16
612        .seh_stackalloc 16
613        vpop {d8-d9}
614        .seh_save_fregs {d8-d9}
615        pop.w {r11,lr}
616        .seh_save_regs_w {r11,lr}
617        bx lr
618        .seh_nop
619        .seh_endepilogue
620        .seh_endproc
621
622        .seh_proc func11
623func11:
624        push.w {r11,lr}
625        .seh_save_regs_w {r11,lr}
626        mov r11, sp
627        .seh_nop
628        vpush {d8-d9}
629        .seh_save_fregs {d8-d9}
630        sub sp, sp, #16
631        .seh_stackalloc 16
632        .seh_endprologue
633        nop
634        .seh_startepilogue
635        add sp, sp, #16
636        .seh_stackalloc 16
637        vpop {d8-d9}
638        .seh_save_fregs {d8-d9}
639        pop.w {r11,pc}
640        .seh_save_regs_w {r11,pc}
641        .seh_endepilogue
642        .seh_endproc
643
644        .seh_proc func12
645func12:
646        vpush {d8-d14}
647        .seh_save_fregs {d8-d14}
648        sub sp, sp, #16
649        .seh_stackalloc 16
650        .seh_endprologue
651        nop
652        .seh_startepilogue
653        add sp, sp, #16
654        .seh_stackalloc 16
655        vpop {d8-d14}
656        .seh_save_fregs {d8-d14}
657        b.w tailcall
658        .seh_nop_w
659        .seh_endepilogue
660        .seh_endproc
661
662        .seh_proc func13
663func13:
664        push.w {r4-r11,lr}
665        .seh_save_regs_w {r4-r11,lr}
666        add.w r11, sp, #0x1c
667        .seh_nop_w
668        sub sp, sp, #20
669        .seh_stackalloc 20
670        .seh_endprologue
671        nop
672        .seh_startepilogue
673        add sp, sp, #20
674        .seh_stackalloc 20
675        pop.w {r4-r11,pc}
676        .seh_save_regs_w {r4-r11,lr}
677        .seh_endepilogue
678        .seh_endproc
679
680        .seh_proc func14
681func14:
682        push.w {r4-r11,lr}
683        .seh_save_regs_w {r4-r11,lr}
684        sub sp, sp, #20
685        .seh_stackalloc 20
686        .seh_endprologue
687        nop
688        .seh_startepilogue
689        add sp, sp, #20
690        .seh_stackalloc 20
691        pop.w {r4-r11,pc}
692        .seh_save_regs_w {r4-r11,lr}
693        .seh_endepilogue
694        .seh_endproc
695
696        .seh_proc func15
697func15:
698        push {r0-r3}
699        .seh_save_regs {r0-r3}
700        push {r4,lr}
701        .seh_save_regs {r4,lr}
702        sub.w sp, sp, #512
703        .seh_stackalloc_w 512
704        .seh_endprologue
705        nop
706        .seh_startepilogue
707        add.w sp, sp, #512
708        .seh_stackalloc_w 512
709        pop {r4}
710        .seh_save_regs {r4}
711        ldr pc, [sp], #20
712        .seh_save_lr 20
713        .seh_endepilogue
714        .seh_endproc
715
716        .seh_proc func16
717func16:
718        push {r0-r3}
719        .seh_save_regs {r0-r3}
720        push.w {r11,lr}
721        .seh_save_regs_w {r11,lr}
722        mov r11, sp
723        .seh_nop
724        .seh_endprologue
725        nop
726        .seh_startepilogue
727        pop.w {r11, lr}
728        .seh_save_regs_w {r11,lr}
729        add sp, sp, #16
730        .seh_stackalloc 16
731        b.w tailcall
732        .seh_nop_w
733        .seh_endepilogue
734        .seh_endproc
735
736        .seh_proc func17
737func17:
738        push {r0-r3}
739        .seh_save_regs {r0-r3}
740        push {r4}
741        .seh_save_regs {r4}
742        sub.w sp, sp, #512
743        .seh_stackalloc_w 512
744        .seh_endprologue
745        nop
746        .seh_startepilogue
747        add.w sp, sp, #512
748        .seh_stackalloc_w 512
749        pop {r4}
750        .seh_save_regs {r4}
751        add sp, sp, #16
752        .seh_stackalloc 16
753        bx lr
754        .seh_nop
755        .seh_endepilogue
756        .seh_endproc
757
758        .seh_proc func18
759func18:
760        push {r3,lr}
761        .seh_save_regs {r3,lr}
762        .seh_endprologue
763        nop
764        .seh_startepilogue
765        pop {r3,pc}
766        .seh_save_regs {r3,pc}
767        .seh_endepilogue
768        .seh_endproc
769
770        .seh_proc func19
771func19:
772        push {r0-r3}
773        .seh_save_regs {r0-r3}
774        push {r0-r4}
775        .seh_save_regs {r0-r4}
776        .seh_endprologue
777        nop
778        .seh_startepilogue
779        pop {r0-r4}
780        .seh_save_regs {r0-r4}
781        add sp, sp, #16
782        .seh_stackalloc 16
783        bx lr
784        .seh_nop
785        .seh_endepilogue
786        .seh_endproc
787
788        .seh_proc func20
789func20:
790        push {r0-r3}
791        .seh_save_regs {r0-r3}
792        push {r0-r4}
793        .seh_save_regs {r0-r4}
794        .seh_endprologue
795        nop
796        .seh_startepilogue
797        add sp, sp, #16
798        .seh_stackalloc 16
799        pop {r4}
800        .seh_save_regs {r4}
801        add sp, sp, #16
802        .seh_stackalloc 16
803        bx lr
804        .seh_nop
805        .seh_endepilogue
806        .seh_endproc
807
808        .seh_proc func21
809func21:
810        push {r0-r3}
811        .seh_save_regs {r0-r3}
812        push {r4}
813        .seh_save_regs {r4}
814        sub sp, sp, #16
815        .seh_stackalloc 16
816        .seh_endprologue
817        nop
818        .seh_startepilogue
819        pop {r0-r4}
820        .seh_save_regs {r0-r4}
821        add sp, sp, #16
822        .seh_stackalloc 16
823        bx lr
824        .seh_nop
825        .seh_endepilogue
826        .seh_endproc
827
828        .seh_proc func22
829func22:
830        .seh_save_regs {r0-r3}
831        .seh_save_regs {r4,lr}
832        .seh_stackalloc_w 512
833        .seh_endprologue_fragment
834        nop
835        nop
836        .seh_startepilogue
837        add.w sp, sp, #512
838        .seh_stackalloc_w 512
839        pop {r4}
840        .seh_save_regs {r4}
841        ldr pc, [sp], #20
842        .seh_save_lr 20
843        .seh_endepilogue
844        .seh_endproc
845
846        .seh_proc func24
847func24:
848        push.w {r2-r7,r11,lr}
849        .seh_save_regs_w {r2-r7,r11,lr}
850        add.w r11, sp, #24
851        .seh_nop_w
852        .seh_endprologue
853        nop
854        .seh_startepilogue
855        add sp, sp, #8
856        .seh_stackalloc 8
857        pop.w {r4-r7,r11,pc}
858        .seh_save_regs_w {r4-r7,r11,pc}
859        .seh_endepilogue
860        .seh_endproc
861
862        .seh_proc func25
863func25:
864        push.w {r4-r7,r11,lr}
865        .seh_save_regs_w {r4-r7,r11,lr}
866        add.w r11, sp, #16
867        .seh_nop_w
868        sub sp, sp, #8
869        .seh_stackalloc 8
870        .seh_endprologue
871        nop
872        .seh_startepilogue
873        pop.w {r2-r7,r11,pc}
874        .seh_save_regs_w {r2-r7,r11,pc}
875        .seh_endepilogue
876        .seh_endproc
877
878        .seh_proc func26
879func26:
880        push {r1-r3}
881        .seh_save_regs {r1-r3}
882        .seh_endprologue
883        nop
884        .seh_startepilogue
885        add sp, sp, #12
886        .seh_stackalloc 12
887        bx lr
888        .seh_nop
889        .seh_endepilogue
890        .seh_endproc
891
892        .seh_proc func27
893func27:
894        sub sp, sp, #12
895        .seh_stackalloc 12
896        .seh_endprologue
897        nop
898        .seh_startepilogue
899        pop {r1-r3}
900        .seh_save_regs {r1-r3}
901        bx lr
902        .seh_nop
903        .seh_endepilogue
904        .seh_endproc
905
906        .seh_proc func28
907func28:
908        push {r0-r3}
909        .seh_save_regs {r0-r3}
910        .seh_endprologue
911        nop
912        .seh_startepilogue
913        add sp, sp, #16
914        .seh_stackalloc 16
915        bx lr
916        .seh_nop
917        .seh_endepilogue
918        .seh_endproc
919
920        .seh_proc func29
921func29:
922        push {r0-r3}
923        .seh_save_regs {r0-r3}
924        push {lr}
925        .seh_save_regs {lr}
926        .seh_endprologue
927        nop
928        .seh_startepilogue
929        ldr pc, [sp], #20
930        .seh_save_lr 20
931        .seh_endepilogue
932        .seh_endproc
933
934        .seh_proc func30
935func30:
936        push {r4-r6,lr}
937        .seh_save_regs {r4-r6,lr}
938        .seh_endprologue
939        nop
940        .seh_startepilogue
941        pop {r4-r6,pc}
942        .seh_save_regs {r4-r6,pc}
943        .seh_endepilogue
944        .seh_endproc
945
946        .seh_proc func31
947func31:
948        push {r4-r6,lr}
949        .seh_save_regs {r4-r6,lr}
950        .seh_endprologue
951        nop
952        .seh_endproc
953
954        .seh_proc notpacked1
955notpacked1:
956        push {r1-r3}
957        .seh_save_regs {r1-r3}
958        .seh_endprologue
959        nop
960        .seh_startepilogue
961        // Mismatch with the folded prologue
962        add sp, sp, #8
963        .seh_stackalloc 8
964        bx lr
965        .seh_nop
966        .seh_endepilogue
967        .seh_endproc
968
969        .seh_proc notpacked2
970notpacked2:
971        sub sp, sp, #8
972        .seh_stackalloc 8
973        .seh_endprologue
974        nop
975        .seh_startepilogue
976        // Folded epilogue is a mismatch to the regular stack adjust in the prologue
977        pop {r1-r3}
978        .seh_save_regs {r1-r3}
979        bx lr
980        .seh_nop
981        .seh_endepilogue
982        .seh_endproc
983
984        .seh_proc notpacked3
985notpacked3:
986        // Can't represent d8-d15 in the packed form
987        vpush {d8-d15}
988        .seh_save_fregs {d8-d15}
989        .seh_endprologue
990        nop
991        .seh_startepilogue
992        vpop {d8-d15}
993        .seh_save_fregs {d8-d15}
994        bx lr
995        .seh_nop
996        .seh_endepilogue
997        .seh_endproc
998
999        .seh_proc notpacked4
1000notpacked4:
1001        push {r2-r7}
1002        .seh_save_regs {r2-r7}
1003        sub sp, sp, #16
1004        .seh_stackalloc 16
1005        // Can't have both a folded stack adjustment and a separate one
1006        .seh_endprologue
1007        nop
1008        .seh_startepilogue
1009        add sp, sp, #16
1010        .seh_stackalloc 16
1011        pop {r2-r7}
1012        .seh_save_regs {r2-r7}
1013        bx lr
1014        .seh_nop
1015        .seh_endepilogue
1016        .seh_endproc
1017
1018        .seh_proc notpacked5
1019notpacked5:
1020        // Can't represent r11 in packed form when it's not contiguous
1021        // with the rest and when it's not chained (missing "add.w r11, sp, #.."
1022        // and .seh_nop_w).
1023        push.w {r4-r7,r11,lr}
1024        .seh_save_regs_w {r4-r7,r11,lr}
1025        sub sp, sp, #8
1026        .seh_stackalloc 8
1027        .seh_endprologue
1028        nop
1029        .seh_startepilogue
1030        pop.w {r2-r7,r11,pc}
1031        .seh_save_regs_w {r2-r7,r11,pc}
1032        .seh_endepilogue
1033        .seh_endproc
1034
1035        .seh_proc notpacked6
1036notpacked6:
1037        // Can't pack non-contiguous registers
1038        push {r4,r7}
1039        .seh_save_regs {r4,r7}
1040        .seh_endprologue
1041        nop
1042        .seh_startepilogue
1043        pop {r4,r7}
1044        .seh_save_regs {r4,r7}
1045        bx lr
1046        .seh_nop
1047        .seh_endepilogue
1048        .seh_endproc
1049
1050        .seh_proc notpacked7
1051notpacked7:
1052        // Can't pack float registers ouside of d8-d14
1053        vpush {d0-d3}
1054        .seh_save_fregs {d0-d3}
1055        .seh_endprologue
1056        nop
1057        .seh_startepilogue
1058        vpop {d0-d3}
1059        .seh_save_fregs {d0-d3}
1060        bx lr
1061        .seh_nop
1062        .seh_endepilogue
1063        .seh_endproc
1064
1065        .seh_proc notpacked8
1066notpacked8:
1067        push {r4-r7,lr}
1068        .seh_save_regs {r4-r7,lr}
1069        .seh_endprologue
1070        nop
1071        .seh_startepilogue
1072        pop {r4-r7,pc}
1073        .seh_save_regs {r4-r7,pc}
1074        .seh_endepilogue
1075        // Epilogue isn't at the end of the function; can't be packed.
1076        nop
1077        .seh_endproc
1078
1079        .seh_proc notpacked9
1080notpacked9:
1081        push {r4-r7,lr}
1082        .seh_save_regs {r4-r7,lr}
1083        .seh_endprologue
1084        nop
1085        .seh_startepilogue
1086        pop {r4-r7,pc}
1087        .seh_save_regs {r4-r7,pc}
1088        .seh_endepilogue
1089        // Multiple epilogues, can't be packed
1090        nop
1091        .seh_startepilogue
1092        pop {r4-r7,pc}
1093        .seh_save_regs {r4-r7,pc}
1094        .seh_endepilogue
1095        .seh_endproc
1096