Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 52 additions & 50 deletions llvm/test/CodeGen/AArch64/wineh-pac.ll
Original file line number Diff line number Diff line change
@@ -1,63 +1,65 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc < %s -mtriple=aarch64-windows | FileCheck %s

define dso_local i32 @func(ptr %g, i32 %a) "sign-return-address"="non-leaf" "sign-return-address-key"="b_key" {
; CHECK-LABEL: func:
; CHECK: .seh_proc func
; CHECK-NEXT: // %bb.0: // %entry
; CHECK-NEXT: hint #27
; CHECK-NEXT: .seh_pac_sign_lr
; CHECK-NEXT: str x19, [sp, #-16]! // 8-byte Folded Spill
; CHECK-NEXT: .seh_save_reg_x x19, 16
; CHECK-NEXT: str x30, [sp, #8] // 8-byte Spill
; CHECK-NEXT: .seh_save_reg x30, 8
; CHECK-NEXT: .seh_endprologue
; CHECK-NEXT: mov w19, w1
; CHECK-NEXT: blr x0
; CHECK-NEXT: mov w0, w19
; CHECK-NEXT: .seh_startepilogue
; CHECK-NEXT: ldr x30, [sp, #8] // 8-byte Reload
; CHECK-NEXT: .seh_save_reg x30, 8
; CHECK-NEXT: ldr x19, [sp], #16 // 8-byte Folded Reload
; CHECK-NEXT: .seh_save_reg_x x19, 16
; CHECK-NEXT: hint #31
; CHECK-NEXT: .seh_pac_sign_lr
; CHECK-NEXT: .seh_endepilogue
; CHECK-NEXT: ret
; CHECK-NEXT: .seh_endfunclet
; CHECK-NEXT: .seh_endproc
entry:
tail call void %g() #2
ret i32 %a
}

;; For func2, check that the potentially folded autibsp+ret -> retab
;; is handled correctly - currently we inhibit producing retab here.

define dso_local i32 @func2(ptr %g, i32 %a) "sign-return-address"="non-leaf" "sign-return-address-key"="b_key" "target-features"="+v8.3a" {
; CHECK-LABEL: func2:
; CHECK: .seh_proc func2
; CHECK-NEXT: // %bb.0: // %entry
; CHECK-NEXT: pacibsp
; CHECK-NEXT: .seh_pac_sign_lr
; CHECK-NEXT: str x19, [sp, #-16]! // 8-byte Folded Spill
; CHECK-NEXT: .seh_save_reg_x x19, 16
; CHECK-NEXT: str x30, [sp, #8] // 8-byte Spill
; CHECK-NEXT: .seh_save_reg x30, 8
; CHECK-NEXT: .seh_endprologue
; CHECK-NEXT: mov w19, w1
; CHECK-NEXT: blr x0
; CHECK-NEXT: mov w0, w19
; CHECK-NEXT: .seh_startepilogue
; CHECK-NEXT: ldr x30, [sp, #8] // 8-byte Reload
; CHECK-NEXT: .seh_save_reg x30, 8
; CHECK-NEXT: ldr x19, [sp], #16 // 8-byte Folded Reload
; CHECK-NEXT: .seh_save_reg_x x19, 16
; CHECK-NEXT: autibsp
; CHECK-NEXT: .seh_pac_sign_lr
; CHECK-NEXT: .seh_endepilogue
; CHECK-NEXT: ret
; CHECK-NEXT: .seh_endfunclet
; CHECK-NEXT: .seh_endproc
entry:
tail call void %g() #2
ret i32 %a
}


; CHECK-LABEL: func:
; CHECK-NEXT: .seh_proc func
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: hint #27
; CHECK-NEXT: .seh_pac_sign_lr
; CHECK-NEXT: str x19, [sp, #-16]!
; CHECK-NEXT: .seh_save_reg_x x19, 16
; CHECK-NEXT: str x30, [sp, #8]
; CHECK-NEXT: .seh_save_reg x30, 8
; CHECK-NEXT: .seh_endprologue

; CHECK: .seh_startepilogue
; CHECK-NEXT: ldr x30, [sp, #8]
; CHECK-NEXT: .seh_save_reg x30, 8
; CHECK-NEXT: ldr x19, [sp], #16
; CHECK-NEXT: .seh_save_reg_x x19, 16
; CHECK-NEXT: hint #31
; CHECK-NEXT: .seh_pac_sign_lr
; CHECK-NEXT: .seh_endepilogue
; CHECK-NEXT: ret
; CHECK-NEXT: .seh_endfunclet
; CHECK-NEXT: .seh_endproc

;; For func2, check that the potentially folded autibsp+ret -> retab
;; is handled correctly - currently we inhibit producing retab here.

; CHECK-LABEL: func2:
; CHECK-NEXT: .seh_proc func2
; CHECK-NEXT: // %bb.0:
; CHECK-NEXT: pacibsp
; CHECK-NEXT: .seh_pac_sign_lr
; CHECK-NEXT: str x19, [sp, #-16]!
; CHECK-NEXT: .seh_save_reg_x x19, 16
; CHECK-NEXT: str x30, [sp, #8]
; CHECK-NEXT: .seh_save_reg x30, 8
; CHECK-NEXT: .seh_endprologue

; CHECK: .seh_startepilogue
; CHECK-NEXT: ldr x30, [sp, #8]
; CHECK-NEXT: .seh_save_reg x30, 8
; CHECK-NEXT: ldr x19, [sp], #16
; CHECK-NEXT: .seh_save_reg_x x19, 16
; CHECK-NEXT: autibsp
; CHECK-NEXT: .seh_pac_sign_lr
; CHECK-NEXT: .seh_endepilogue
; CHECK-NEXT: ret
; CHECK-NEXT: .seh_endfunclet
; CHECK-NEXT: .seh_endproc
Loading