xref: /llvm-project/llvm/test/MC/AArch64/seh-multi-epilog.s (revision 0c52ab39688e8e107487b8cee00f509fe092f40a)
1// This test checks that we emit allow multiple consecutive epilogs without
2// triggering failed asserts.unwind info correctly for epilogs that:
3// RUN: llvm-mc -triple aarch64-pc-win32 -filetype=obj %s -o %t.o
4// RUN: llvm-readobj -u %t.o | FileCheck %s
5
6// CHECK-LABEL:UnwindInformation [
7// CHECK-NEXT:  RuntimeFunction {
8// CHECK-NEXT:    Function: multi_epilog (0x0)
9// CHECK-NEXT:    ExceptionRecord: .xdata (0x0)
10// CHECK-NEXT:    ExceptionData {
11// CHECK-NEXT:      FunctionLength: 20
12// CHECK-NEXT:      Version: 0
13// CHECK-NEXT:      ExceptionData: No
14// CHECK-NEXT:      EpiloguePacked: No
15// CHECK-NEXT:      EpilogueScopes: 2
16// CHECK-NEXT:      ByteCodeLength: 4
17// CHECK-NEXT:      Prologue [
18// CHECK-NEXT:        0x81                ; stp x29, x30, [sp, #-16]!
19// CHECK-NEXT:        0xe4                ; end
20// CHECK-NEXT:      ]
21// CHECK-NEXT:      EpilogueScopes [
22// CHECK-NEXT:        EpilogueScope {
23// CHECK-NEXT:          StartOffset: 2
24// CHECK-NEXT:          EpilogueStartIndex: 0
25// CHECK-NEXT:          Opcodes [
26// CHECK-NEXT:            0x81                ; ldp x29, x30, [sp], #16
27// CHECK-NEXT:            0xe4                ; end
28// CHECK-NEXT:          ]
29// CHECK-NEXT:        }
30// CHECK-NEXT:        EpilogueScope {
31// CHECK-NEXT:          StartOffset: 3
32// CHECK-NEXT:          EpilogueStartIndex: 0
33// CHECK-NEXT:          Opcodes [
34// CHECK-NEXT:            0x81                ; ldp x29, x30, [sp], #16
35// CHECK-NEXT:            0xe4                ; end
36// CHECK-NEXT:          ]
37// CHECK-NEXT:        }
38// CHECK-NEXT:      ]
39// CHECK-NEXT:    }
40// CHECK-NEXT:  }
41// CHECK-NEXT:]
42
43	.text
44	.global	multi_epilog
45	.p2align	2
46	.seh_proc multi_epilog
47multi_epilog:
48	stp	x29, lr, [sp, #-16]!
49	.seh_save_fplr_x 16
50	.seh_endprologue
51        nop
52	.seh_startepilogue
53	ldp	x29, lr, [sp], #16
54	.seh_save_fplr_x 16
55	.seh_endepilogue
56	.seh_startepilogue
57	ldp	x29, lr, [sp], #16
58	.seh_save_fplr_x 16
59	.seh_endepilogue
60	ret
61	.seh_endfunclet
62	.seh_endproc
63