| // This test checks that we emit allow multiple consecutive epilogs without |
| // triggering failed asserts.unwind info correctly for epilogs that: |
| // RUN: llvm-mc -triple aarch64-pc-win32 -filetype=obj %s -o %t.o |
| // RUN: llvm-readobj -u %t.o | FileCheck %s |
| |
| // CHECK-LABEL:UnwindInformation [ |
| // CHECK-NEXT: RuntimeFunction { |
| // CHECK-NEXT: Function: multi_epilog (0x0) |
| // CHECK-NEXT: ExceptionRecord: .xdata (0x0) |
| // CHECK-NEXT: ExceptionData { |
| // CHECK-NEXT: FunctionLength: 20 |
| // CHECK-NEXT: Version: 0 |
| // CHECK-NEXT: ExceptionData: No |
| // CHECK-NEXT: EpiloguePacked: No |
| // CHECK-NEXT: EpilogueScopes: 2 |
| // CHECK-NEXT: ByteCodeLength: 4 |
| // CHECK-NEXT: Prologue [ |
| // CHECK-NEXT: 0x81 ; stp x29, x30, [sp, #-16]! |
| // CHECK-NEXT: 0xe4 ; end |
| // CHECK-NEXT: ] |
| // CHECK-NEXT: EpilogueScopes [ |
| // CHECK-NEXT: EpilogueScope { |
| // CHECK-NEXT: StartOffset: 2 |
| // CHECK-NEXT: EpilogueStartIndex: 0 |
| // CHECK-NEXT: Opcodes [ |
| // CHECK-NEXT: 0x81 ; ldp x29, x30, [sp], #16 |
| // CHECK-NEXT: 0xe4 ; end |
| // CHECK-NEXT: ] |
| // CHECK-NEXT: } |
| // CHECK-NEXT: EpilogueScope { |
| // CHECK-NEXT: StartOffset: 3 |
| // CHECK-NEXT: EpilogueStartIndex: 0 |
| // CHECK-NEXT: Opcodes [ |
| // CHECK-NEXT: 0x81 ; ldp x29, x30, [sp], #16 |
| // CHECK-NEXT: 0xe4 ; end |
| // CHECK-NEXT: ] |
| // CHECK-NEXT: } |
| // CHECK-NEXT: ] |
| // CHECK-NEXT: } |
| // CHECK-NEXT: } |
| // CHECK-NEXT:] |
| |
| .text |
| .global multi_epilog |
| .p2align 2 |
| .seh_proc multi_epilog |
| multi_epilog: |
| stp x29, lr, [sp, #-16]! |
| .seh_save_fplr_x 16 |
| .seh_endprologue |
| nop |
| .seh_startepilogue |
| ldp x29, lr, [sp], #16 |
| .seh_save_fplr_x 16 |
| .seh_endepilogue |
| .seh_startepilogue |
| ldp x29, lr, [sp], #16 |
| .seh_save_fplr_x 16 |
| .seh_endepilogue |
| ret |
| .seh_endfunclet |
| .seh_endproc |