Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/MC/AArch64/seh-optimize.s
- This file was added.
// 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 | llvm-readobj -u - | 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: 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 | |||||
.seh_endepilogue | |||||
ret | |||||
.seh_endproc |