blob: 0bf33af9cc75f608fe945bb42da69c6de095354a [file] [log] [blame]
// This test checks that the unwinding opcodes are remapped to more
// efficient ones where possible.
// RUN: llvm-mc -triple aarch64-pc-win32 -filetype=obj %s -o %t.o
// RUN: llvm-readobj -u %t.o | FileCheck %s
// CHECK: UnwindInformation [
// CHECK-NEXT: RuntimeFunction {
// CHECK-NEXT: Function: func
// CHECK-NEXT: ExceptionRecord: .xdata
// CHECK-NEXT: ExceptionData {
// CHECK: Prologue [
// CHECK-NEXT: 0xd882 ; stp d10, d11, [sp, #16]
// CHECK-NEXT: 0xda07 ; stp d8, d9, [sp, #-64]!
// CHECK-NEXT: 0xe6 ; save next
// CHECK-NEXT: 0x28 ; stp x19, x20, [sp, #-64]!
// CHECK-NEXT: 0xca49 ; stp x28, x29, [sp, #72]
// CHECK-NEXT: 0xe6 ; save next
// CHECK-NEXT: 0xe6 ; save next
// CHECK-NEXT: 0xe6 ; save next
// CHECK-NEXT: 0xcc47 ; stp x20, x21, [sp, #-64]!
// CHECK-NEXT: 0x42 ; stp x29, x30, [sp, #16]
// CHECK-NEXT: 0xca02 ; stp x27, x28, [sp, #16]
// CHECK-NEXT: 0x83 ; stp x29, x30, [sp, #-32]!
// CHECK-NEXT: 0xce03 ; stp x27, x28, [sp, #-32]!
// CHECK-NEXT: 0xe1 ; mov fp, sp
// CHECK-NEXT: 0xe201 ; add fp, sp, #8
// CHECK-NEXT: 0xe4 ; end
// CHECK-NEXT: ]
// CHECK-NEXT: EpilogueScopes [
// CHECK-NEXT: EpilogueScope {
// CHECK: Opcodes [
// CHECK-NEXT: 0xc904 ; ldp x23, x24, [sp, #32]
// CHECK-NEXT: 0xe6 ; restore next
// CHECK-NEXT: 0xcc83 ; ldp x21, x22, [sp], #32
// CHECK-NEXT: 0x24 ; ldp x19, x20, [sp], #32
// CHECK-NEXT: 0xcc1f ; ldp x19, x20, [sp], #256
// CHECK-NEXT: 0xe4 ; end
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: ]
// CHECK-NEXT: }
// CHECK-NEXT: }
// CHECK-NEXT: ]
.text
.globl func
.seh_proc func
func:
add x29, sp, #8
.seh_add_fp 8
add x29, sp, #0
.seh_add_fp 0
stp x27, x28, [sp, #-32]!
.seh_save_regp_x x27, 32
stp x29, x30, [sp, #-32]!
.seh_save_regp_x x29, 32
stp x27, x28, [sp, #16]
.seh_save_regp x27, 16
stp x29, x30, [sp, #16]
.seh_save_regp x29, 16
stp x20, x21, [sp, #-64]!
.seh_save_regp_x x20, 64
stp x22, x23, [sp, #16]
.seh_save_regp x22, 16
stp x24, x25, [sp, #32]
.seh_save_next
stp x26, x27, [sp, #48]
.seh_save_regp x26, 48
stp x28, x29, [sp, #72]
.seh_save_regp x28, 72
stp x19, x20, [sp, #-64]!
.seh_save_r19r20_x 64
stp x21, x22, [sp, #16]
.seh_save_regp x21, 16
stp d8, d9, [sp, #-64]!
.seh_save_fregp_x d8, 64
stp d10, d11, [sp, #16]
// This is intentionally not converted into a save_next, to avoid
// bugs in the windows unwinder.
.seh_save_fregp d10, 16
.seh_endprologue
nop
.seh_startepilogue
ldp x27, x28, [sp, #32]
.seh_save_regp x23, 32
ldp x23, x24, [sp, #16]
.seh_save_regp x23, 16
ldp x21, x22, [sp], #32
.seh_save_regp_x x21, 32
ldp x19, x20, [sp], #32
.seh_save_regp_x x19, 32
ldp x19, x20, [sp], #256
.seh_save_regp_x x19, 256
.seh_endepilogue
ret
.seh_endproc