blob: fac71d5ec4a59a97e6c9b8e133d7817d5805797e [file]
; RUN: llc -mtriple=aarch64 < %s | FileCheck --check-prefixes=CHECK,COMPAT %s
; RUN: llc -mtriple=aarch64 -mattr=v8.3a < %s | FileCheck --check-prefixes=CHECK,V83A %s
; RUN: llc -mtriple=aarch64 -mattr=v9a -mattr=pauth-lr < %s | FileCheck --check-prefixes=CHECK,V9A %s
; RUN: sed 's/"branch-protection-pauth-lr" //g' %s \
; RUN: | llc -mtriple=aarch64 -mattr=v9a \
; RUN: | FileCheck --check-prefixes=CHECK,PAUTH %s
;
; Test tail calls with return address signing across all three modes
; (COMPAT, V83A, V9A) and both FPDiff==0 and FPDiff!=0 cases,
; with A-key and B-key variants, for both direct and indirect tail calls.
declare swifttailcc void @callee_stack_args(ptr swiftasync %ctx, i64, i64, i64, i64, i64, i64, i64, i64, i64)
declare swifttailcc void @callee_no_stack_args(ptr swiftasync %ctx)
; FPDiff != 0, A-key: callee has stack args that this function doesn't.
define swifttailcc void @tail_call_fpdiff_a_key(ptr swiftasync %ctx) "branch-protection-pauth-lr" "sign-return-address"="all" "frame-pointer"="all" uwtable(async) {
; CHECK-LABEL: tail_call_fpdiff_a_key:
; CHECK: // %bb.0:
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: .cfi_negate_ra_state_with_pc
; COMPAT-NEXT: .Ltmp0:
; COMPAT-NEXT: hint #25
; V83A-NEXT: hint #39
; V83A-NEXT: .cfi_negate_ra_state_with_pc
; V83A-NEXT: .Ltmp0:
; V83A-NEXT: paciasp
; V9A-NEXT: .cfi_negate_ra_state_with_pc
; V9A-NEXT: .Ltmp0:
; V9A-NEXT: paciasppc
; PAUTH-NEXT: paciasp
; PAUTH-NEXT: .cfi_negate_ra_state
; CHECK: orr x29, x29, #0x1000000000000000
; CHECK-NEXT: sub sp, sp, #48
; CHECK-NEXT: .cfi_def_cfa_offset 48
; CHECK-NEXT: stp x29, x30, [sp, #16] // 16-byte Folded Spill
; CHECK-NEXT: str x22, [sp, #8]
; CHECK-NEXT: add x29, sp, #16
; CHECK-NEXT: .cfi_def_cfa w29, 32
; CHECK-NEXT: .cfi_offset w30, -24
; CHECK-NEXT: .cfi_offset w29, -32
; CHECK-NEXT: mov w8, #9 // =0x9
; CHECK-NEXT: mov w0, #1 // =0x1
; CHECK-NEXT: mov w1, #2 // =0x2
; CHECK-NEXT: str x8, [x29, #16]
; CHECK-NEXT: mov w2, #3 // =0x3
; CHECK-NEXT: mov w3, #4 // =0x4
; CHECK-NEXT: mov w4, #5 // =0x5
; CHECK-NEXT: mov w5, #6 // =0x6
; CHECK-NEXT: mov w6, #7 // =0x7
; CHECK-NEXT: mov w7, #8 // =0x8
; CHECK-NEXT: .cfi_def_cfa wsp, 48
; CHECK-NEXT: ldp x29, x30, [sp, #16] // 16-byte Folded Reload
; CHECK-NEXT: and x29, x29, #0xefffffffffffffff
; CHECK-NEXT: add sp, sp, #32
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: .cfi_restore w30
; CHECK-NEXT: .cfi_restore w29
; CHECK-NEXT: add x16, sp, #16
; CHECK-NEXT: mov x17, x30
; COMPAT-NEXT: adrp x15, .Ltmp0
; COMPAT-NEXT: add x15, x15, :lo12:.Ltmp0
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: hint #12
; V83A-NEXT: adrp x15, .Ltmp0
; V83A-NEXT: add x15, x15, :lo12:.Ltmp0
; V83A-NEXT: hint #39
; V83A-NEXT: autia1716
; V9A-NEXT: adrp x15, .Ltmp0
; V9A-NEXT: add x15, x15, :lo12:.Ltmp0
; V9A-NEXT: autia171615
; PAUTH-NEXT: autia1716
; PAUTH-NEXT: .cfi_negate_ra_state
; CHECK-NEXT: mov x30, x17
; CHECK-NEXT: b callee_stack_args
musttail call swifttailcc void @callee_stack_args(ptr swiftasync %ctx, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9)
ret void
}
; FPDiff != 0, B-key: callee has stack args that this function doesn't.
define swifttailcc void @tail_call_fpdiff_b_key(ptr swiftasync %ctx) "branch-protection-pauth-lr" "sign-return-address"="all" "sign-return-address-key"="b_key" "frame-pointer"="all" uwtable(async) {
; CHECK-LABEL: tail_call_fpdiff_b_key:
; CHECK: // %bb.0:
; CHECK-NEXT: .cfi_b_key_frame
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: .cfi_negate_ra_state_with_pc
; COMPAT-NEXT: .Ltmp1:
; COMPAT-NEXT: hint #27
; V83A-NEXT: hint #39
; V83A-NEXT: .cfi_negate_ra_state_with_pc
; V83A-NEXT: .Ltmp1:
; V83A-NEXT: pacibsp
; V9A-NEXT: .cfi_negate_ra_state_with_pc
; V9A-NEXT: .Ltmp1:
; V9A-NEXT: pacibsppc
; PAUTH-NEXT: pacibsp
; PAUTH-NEXT: .cfi_negate_ra_state
; CHECK-NEXT: orr x29, x29, #0x1000000000000000
; CHECK-NEXT: sub sp, sp, #48
; CHECK-NEXT: .cfi_def_cfa_offset 48
; CHECK-NEXT: stp x29, x30, [sp, #16] // 16-byte Folded Spill
; CHECK-NEXT: str x22, [sp, #8]
; CHECK-NEXT: add x29, sp, #16
; CHECK-NEXT: .cfi_def_cfa w29, 32
; CHECK-NEXT: .cfi_offset w30, -24
; CHECK-NEXT: .cfi_offset w29, -32
; CHECK-NEXT: mov w8, #9 // =0x9
; CHECK-NEXT: mov w0, #1 // =0x1
; CHECK-NEXT: mov w1, #2 // =0x2
; CHECK-NEXT: str x8, [x29, #16]
; CHECK-NEXT: mov w2, #3 // =0x3
; CHECK-NEXT: mov w3, #4 // =0x4
; CHECK-NEXT: mov w4, #5 // =0x5
; CHECK-NEXT: mov w5, #6 // =0x6
; CHECK-NEXT: mov w6, #7 // =0x7
; CHECK-NEXT: mov w7, #8 // =0x8
; CHECK-NEXT: .cfi_def_cfa wsp, 48
; CHECK-NEXT: ldp x29, x30, [sp, #16] // 16-byte Folded Reload
; CHECK-NEXT: and x29, x29, #0xefffffffffffffff
; CHECK-NEXT: add sp, sp, #32
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: .cfi_restore w30
; CHECK-NEXT: .cfi_restore w29
; CHECK-NEXT: add x16, sp, #16
; CHECK-NEXT: mov x17, x30
; COMPAT-NEXT: adrp x15, .Ltmp1
; COMPAT-NEXT: add x15, x15, :lo12:.Ltmp1
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: hint #14
; V83A-NEXT: adrp x15, .Ltmp1
; V83A-NEXT: add x15, x15, :lo12:.Ltmp1
; V83A-NEXT: hint #39
; V83A-NEXT: autib1716
; V9A-NEXT: adrp x15, .Ltmp1
; V9A-NEXT: add x15, x15, :lo12:.Ltmp1
; V9A-NEXT: autib171615
; PAUTH-NEXT: autib1716
; PAUTH-NEXT: .cfi_negate_ra_state
; CHECK-NEXT: mov x30, x17
; CHECK-NEXT: b callee_stack_args
musttail call swifttailcc void @callee_stack_args(ptr swiftasync %ctx, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9)
ret void
}
; FPDiff == 0, A-key: callee has same calling convention, no extra stack args.
define swifttailcc void @tail_call_no_fpdiff_a_key(ptr swiftasync %ctx) "branch-protection-pauth-lr" "sign-return-address"="all" "frame-pointer"="all" uwtable(async) {
; CHECK-LABEL: tail_call_no_fpdiff_a_key:
; CHECK: // %bb.0:
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: .cfi_negate_ra_state_with_pc
; COMPAT-NEXT: .Ltmp2:
; COMPAT-NEXT: hint #25
; V83A-NEXT: hint #39
; V83A-NEXT: .cfi_negate_ra_state_with_pc
; V83A-NEXT: .Ltmp2:
; V83A-NEXT: paciasp
; V9A-NEXT: .cfi_negate_ra_state_with_pc
; V9A-NEXT: .Ltmp2:
; V9A-NEXT: paciasppc
; PAUTH-NEXT: paciasp
; PAUTH-NEXT: .cfi_negate_ra_state
; CHECK: orr x29, x29, #0x1000000000000000
; CHECK-NEXT: sub sp, sp, #32
; CHECK-NEXT: .cfi_def_cfa_offset 32
; CHECK-NEXT: stp x29, x30, [sp, #16] // 16-byte Folded Spill
; CHECK-NEXT: str x22, [sp, #8]
; CHECK-NEXT: add x29, sp, #16
; CHECK-NEXT: .cfi_def_cfa w29, 16
; CHECK-NEXT: .cfi_offset w30, -8
; CHECK-NEXT: .cfi_offset w29, -16
; CHECK-NEXT: .cfi_def_cfa wsp, 32
; CHECK-NEXT: ldp x29, x30, [sp, #16] // 16-byte Folded Reload
; CHECK-NEXT: and x29, x29, #0xefffffffffffffff
; CHECK-NEXT: add sp, sp, #32
; CHECK-NEXT: .cfi_def_cfa_offset 0
; CHECK-NEXT: .cfi_restore w30
; CHECK-NEXT: .cfi_restore w29
; COMPAT-NEXT: adrp x16, .Ltmp2
; COMPAT-NEXT: add x16, x16, :lo12:.Ltmp2
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: hint #29
; V83A-NEXT: adrp x16, .Ltmp2
; V83A-NEXT: add x16, x16, :lo12:.Ltmp2
; V83A-NEXT: hint #39
; V83A-NEXT: autiasp
; V9A-NEXT: autiasppc .Ltmp2
; PAUTH-NEXT: autiasp
; PAUTH-NEXT: .cfi_negate_ra_state
; CHECK-NEXT: b callee_no_stack_args
musttail call swifttailcc void @callee_no_stack_args(ptr swiftasync %ctx)
ret void
}
; FPDiff == 0, B-key: callee has same calling convention, no extra stack args.
define swifttailcc void @tail_call_no_fpdiff_b_key(ptr swiftasync %ctx) "branch-protection-pauth-lr" "sign-return-address"="all" "sign-return-address-key"="b_key" "frame-pointer"="all" uwtable(async) {
; CHECK-LABEL: tail_call_no_fpdiff_b_key:
; CHECK: // %bb.0:
; CHECK-NEXT: .cfi_b_key_frame
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: .cfi_negate_ra_state_with_pc
; COMPAT-NEXT: .Ltmp3:
; COMPAT-NEXT: hint #27
; V83A-NEXT: hint #39
; V83A-NEXT: .cfi_negate_ra_state_with_pc
; V83A-NEXT: .Ltmp3:
; V83A-NEXT: pacibsp
; V9A-NEXT: .cfi_negate_ra_state_with_pc
; V9A-NEXT: .Ltmp3:
; V9A-NEXT: pacibsppc
; PAUTH-NEXT: pacibsp
; PAUTH-NEXT: .cfi_negate_ra_state
; CHECK-NEXT: orr x29, x29, #0x1000000000000000
; CHECK-NEXT: sub sp, sp, #32
; CHECK-NEXT: .cfi_def_cfa_offset 32
; CHECK-NEXT: stp x29, x30, [sp, #16] // 16-byte Folded Spill
; CHECK-NEXT: str x22, [sp, #8]
; CHECK-NEXT: add x29, sp, #16
; CHECK-NEXT: .cfi_def_cfa w29, 16
; CHECK-NEXT: .cfi_offset w30, -8
; CHECK-NEXT: .cfi_offset w29, -16
; CHECK-NEXT: .cfi_def_cfa wsp, 32
; CHECK-NEXT: ldp x29, x30, [sp, #16] // 16-byte Folded Reload
; CHECK-NEXT: and x29, x29, #0xefffffffffffffff
; CHECK-NEXT: add sp, sp, #32
; CHECK-NEXT: .cfi_def_cfa_offset 0
; CHECK-NEXT: .cfi_restore w30
; CHECK-NEXT: .cfi_restore w29
; COMPAT-NEXT: adrp x16, .Ltmp3
; COMPAT-NEXT: add x16, x16, :lo12:.Ltmp3
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: hint #31
; V83A-NEXT: adrp x16, .Ltmp3
; V83A-NEXT: add x16, x16, :lo12:.Ltmp3
; V83A-NEXT: hint #39
; V83A-NEXT: autibsp
; V9A-NEXT: autibsppc .Ltmp3
; PAUTH-NEXT: autibsp
; PAUTH-NEXT: .cfi_negate_ra_state
; CHECK-NEXT: b callee_no_stack_args
musttail call swifttailcc void @callee_no_stack_args(ptr swiftasync %ctx)
ret void
}
; FPDiff != 0, A-key, indirect call: callee ptr passed as argument.
define swifttailcc void @indirect_tail_call_fpdiff_a_key(ptr swiftasync %ctx, ptr %callee) "branch-protection-pauth-lr" "sign-return-address"="all" "frame-pointer"="all" uwtable(async) {
; CHECK-LABEL: indirect_tail_call_fpdiff_a_key:
; CHECK: // %bb.0:
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: .cfi_negate_ra_state_with_pc
; COMPAT-NEXT: .Ltmp4:
; COMPAT-NEXT: hint #25
; V83A-NEXT: hint #39
; V83A-NEXT: .cfi_negate_ra_state_with_pc
; V83A-NEXT: .Ltmp4:
; V83A-NEXT: paciasp
; V9A-NEXT: .cfi_negate_ra_state_with_pc
; V9A-NEXT: .Ltmp4:
; V9A-NEXT: paciasppc
; PAUTH-NEXT: paciasp
; PAUTH-NEXT: .cfi_negate_ra_state
; CHECK: orr x29, x29, #0x1000000000000000
; CHECK-NEXT: sub sp, sp, #48
; CHECK-NEXT: .cfi_def_cfa_offset 48
; CHECK-NEXT: stp x29, x30, [sp, #16] // 16-byte Folded Spill
; CHECK-NEXT: str x22, [sp, #8]
; CHECK-NEXT: add x29, sp, #16
; CHECK-NEXT: .cfi_def_cfa w29, 32
; CHECK-NEXT: .cfi_offset w30, -24
; CHECK-NEXT: .cfi_offset w29, -32
; CHECK-NEXT: mov w9, #9 // =0x9
; CHECK-NEXT: mov x8, x0
; CHECK-NEXT: mov w0, #1 // =0x1
; CHECK-NEXT: str x9, [x29, #16]
; CHECK-NEXT: mov w1, #2 // =0x2
; CHECK-NEXT: mov w2, #3 // =0x3
; CHECK-NEXT: mov w3, #4 // =0x4
; CHECK-NEXT: mov w4, #5 // =0x5
; CHECK-NEXT: mov w5, #6 // =0x6
; CHECK-NEXT: mov w6, #7 // =0x7
; CHECK-NEXT: mov w7, #8 // =0x8
; CHECK-NEXT: .cfi_def_cfa wsp, 48
; CHECK-NEXT: ldp x29, x30, [sp, #16] // 16-byte Folded Reload
; CHECK-NEXT: and x29, x29, #0xefffffffffffffff
; CHECK-NEXT: add sp, sp, #32
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: .cfi_restore w30
; CHECK-NEXT: .cfi_restore w29
; CHECK-NEXT: add x16, sp, #16
; CHECK-NEXT: mov x17, x30
; COMPAT-NEXT: adrp x15, .Ltmp4
; COMPAT-NEXT: add x15, x15, :lo12:.Ltmp4
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: hint #12
; V83A-NEXT: adrp x15, .Ltmp4
; V83A-NEXT: add x15, x15, :lo12:.Ltmp4
; V83A-NEXT: hint #39
; V83A-NEXT: autia1716
; V9A-NEXT: adrp x15, .Ltmp4
; V9A-NEXT: add x15, x15, :lo12:.Ltmp4
; V9A-NEXT: autia171615
; PAUTH-NEXT: autia1716
; PAUTH-NEXT: .cfi_negate_ra_state
; CHECK-NEXT: mov x30, x17
; CHECK-NEXT: br x8
musttail call swifttailcc void %callee(ptr swiftasync %ctx, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9)
ret void
}
; FPDiff != 0, B-key, indirect call: callee ptr passed as argument.
define swifttailcc void @indirect_tail_call_fpdiff_b_key(ptr swiftasync %ctx, ptr %callee) "branch-protection-pauth-lr" "sign-return-address"="all" "sign-return-address-key"="b_key" "frame-pointer"="all" uwtable(async) {
; CHECK-LABEL: indirect_tail_call_fpdiff_b_key:
; CHECK: // %bb.0:
; CHECK-NEXT: .cfi_b_key_frame
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: .cfi_negate_ra_state_with_pc
; COMPAT-NEXT: .Ltmp5:
; COMPAT-NEXT: hint #27
; V83A-NEXT: hint #39
; V83A-NEXT: .cfi_negate_ra_state_with_pc
; V83A-NEXT: .Ltmp5:
; V83A-NEXT: pacibsp
; V9A-NEXT: .cfi_negate_ra_state_with_pc
; V9A-NEXT: .Ltmp5:
; V9A-NEXT: pacibsppc
; PAUTH-NEXT: pacibsp
; PAUTH-NEXT: .cfi_negate_ra_state
; CHECK: orr x29, x29, #0x1000000000000000
; CHECK-NEXT: sub sp, sp, #48
; CHECK-NEXT: .cfi_def_cfa_offset 48
; CHECK-NEXT: stp x29, x30, [sp, #16] // 16-byte Folded Spill
; CHECK-NEXT: str x22, [sp, #8]
; CHECK-NEXT: add x29, sp, #16
; CHECK-NEXT: .cfi_def_cfa w29, 32
; CHECK-NEXT: .cfi_offset w30, -24
; CHECK-NEXT: .cfi_offset w29, -32
; CHECK-NEXT: mov w9, #9 // =0x9
; CHECK-NEXT: mov x8, x0
; CHECK-NEXT: mov w0, #1 // =0x1
; CHECK-NEXT: str x9, [x29, #16]
; CHECK-NEXT: mov w1, #2 // =0x2
; CHECK-NEXT: mov w2, #3 // =0x3
; CHECK-NEXT: mov w3, #4 // =0x4
; CHECK-NEXT: mov w4, #5 // =0x5
; CHECK-NEXT: mov w5, #6 // =0x6
; CHECK-NEXT: mov w6, #7 // =0x7
; CHECK-NEXT: mov w7, #8 // =0x8
; CHECK-NEXT: .cfi_def_cfa wsp, 48
; CHECK-NEXT: ldp x29, x30, [sp, #16] // 16-byte Folded Reload
; CHECK-NEXT: and x29, x29, #0xefffffffffffffff
; CHECK-NEXT: add sp, sp, #32
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: .cfi_restore w30
; CHECK-NEXT: .cfi_restore w29
; CHECK-NEXT: add x16, sp, #16
; CHECK-NEXT: mov x17, x30
; COMPAT-NEXT: adrp x15, .Ltmp5
; COMPAT-NEXT: add x15, x15, :lo12:.Ltmp5
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: hint #14
; V83A-NEXT: adrp x15, .Ltmp5
; V83A-NEXT: add x15, x15, :lo12:.Ltmp5
; V83A-NEXT: hint #39
; V83A-NEXT: autib1716
; V9A-NEXT: adrp x15, .Ltmp5
; V9A-NEXT: add x15, x15, :lo12:.Ltmp5
; V9A-NEXT: autib171615
; PAUTH-NEXT: autib1716
; PAUTH-NEXT: .cfi_negate_ra_state
; CHECK-NEXT: mov x30, x17
; CHECK-NEXT: br x8
musttail call swifttailcc void %callee(ptr swiftasync %ctx, i64 1, i64 2, i64 3, i64 4, i64 5, i64 6, i64 7, i64 8, i64 9)
ret void
}
; FPDiff == 0, A-key, indirect call: callee ptr passed as argument, no extra stack args.
define swifttailcc void @indirect_tail_call_no_fpdiff_a_key(ptr swiftasync %ctx, ptr %callee) "branch-protection-pauth-lr" "sign-return-address"="all" "frame-pointer"="all" uwtable(async) {
; CHECK-LABEL: indirect_tail_call_no_fpdiff_a_key:
; CHECK: // %bb.0:
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: .cfi_negate_ra_state_with_pc
; COMPAT-NEXT: .Ltmp6:
; COMPAT-NEXT: hint #25
; V83A-NEXT: hint #39
; V83A-NEXT: .cfi_negate_ra_state_with_pc
; V83A-NEXT: .Ltmp6:
; V83A-NEXT: paciasp
; V9A-NEXT: .cfi_negate_ra_state_with_pc
; V9A-NEXT: .Ltmp6:
; V9A-NEXT: paciasppc
; PAUTH-NEXT: paciasp
; PAUTH-NEXT: .cfi_negate_ra_state
; CHECK: orr x29, x29, #0x1000000000000000
; CHECK-NEXT: sub sp, sp, #32
; CHECK-NEXT: .cfi_def_cfa_offset 32
; CHECK-NEXT: stp x29, x30, [sp, #16] // 16-byte Folded Spill
; CHECK-NEXT: str x22, [sp, #8]
; CHECK-NEXT: add x29, sp, #16
; CHECK-NEXT: .cfi_def_cfa w29, 16
; CHECK-NEXT: .cfi_offset w30, -8
; CHECK-NEXT: .cfi_offset w29, -16
; CHECK-NEXT: .cfi_def_cfa wsp, 32
; CHECK-NEXT: ldp x29, x30, [sp, #16] // 16-byte Folded Reload
; CHECK-NEXT: and x29, x29, #0xefffffffffffffff
; CHECK-NEXT: add sp, sp, #32
; CHECK-NEXT: .cfi_def_cfa_offset 0
; CHECK-NEXT: .cfi_restore w30
; CHECK-NEXT: .cfi_restore w29
; COMPAT-NEXT: adrp x16, .Ltmp6
; COMPAT-NEXT: add x16, x16, :lo12:.Ltmp6
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: hint #29
; V83A-NEXT: adrp x16, .Ltmp6
; V83A-NEXT: add x16, x16, :lo12:.Ltmp6
; V83A-NEXT: hint #39
; V83A-NEXT: autiasp
; V9A-NEXT: autiasppc .Ltmp6
; PAUTH-NEXT: autiasp
; PAUTH-NEXT: .cfi_negate_ra_state
; CHECK-NEXT: br x0
musttail call swifttailcc void %callee(ptr swiftasync %ctx)
ret void
}
; FPDiff == 0, B-key, indirect call: callee ptr passed as argument, no extra stack args.
define swifttailcc void @indirect_tail_call_no_fpdiff_b_key(ptr swiftasync %ctx, ptr %callee) "branch-protection-pauth-lr" "sign-return-address"="all" "sign-return-address-key"="b_key" "frame-pointer"="all" uwtable(async) {
; CHECK-LABEL: indirect_tail_call_no_fpdiff_b_key:
; CHECK: // %bb.0:
; CHECK-NEXT: .cfi_b_key_frame
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: .cfi_negate_ra_state_with_pc
; COMPAT-NEXT: .Ltmp7:
; COMPAT-NEXT: hint #27
; V83A-NEXT: hint #39
; V83A-NEXT: .cfi_negate_ra_state_with_pc
; V83A-NEXT: .Ltmp7:
; V83A-NEXT: pacibsp
; V9A-NEXT: .cfi_negate_ra_state_with_pc
; V9A-NEXT: .Ltmp7:
; V9A-NEXT: pacibsppc
; PAUTH-NEXT: pacibsp
; PAUTH-NEXT: .cfi_negate_ra_state
; CHECK-NEXT: orr x29, x29, #0x1000000000000000
; CHECK-NEXT: sub sp, sp, #32
; CHECK-NEXT: .cfi_def_cfa_offset 32
; CHECK-NEXT: stp x29, x30, [sp, #16] // 16-byte Folded Spill
; CHECK-NEXT: str x22, [sp, #8]
; CHECK-NEXT: add x29, sp, #16
; CHECK-NEXT: .cfi_def_cfa w29, 16
; CHECK-NEXT: .cfi_offset w30, -8
; CHECK-NEXT: .cfi_offset w29, -16
; CHECK-NEXT: .cfi_def_cfa wsp, 32
; CHECK-NEXT: ldp x29, x30, [sp, #16] // 16-byte Folded Reload
; CHECK-NEXT: and x29, x29, #0xefffffffffffffff
; CHECK-NEXT: add sp, sp, #32
; CHECK-NEXT: .cfi_def_cfa_offset 0
; CHECK-NEXT: .cfi_restore w30
; CHECK-NEXT: .cfi_restore w29
; COMPAT-NEXT: adrp x16, .Ltmp7
; COMPAT-NEXT: add x16, x16, :lo12:.Ltmp7
; COMPAT-NEXT: hint #39
; COMPAT-NEXT: hint #31
; V83A-NEXT: adrp x16, .Ltmp7
; V83A-NEXT: add x16, x16, :lo12:.Ltmp7
; V83A-NEXT: hint #39
; V83A-NEXT: autibsp
; V9A-NEXT: autibsppc .Ltmp7
; PAUTH-NEXT: autibsp
; PAUTH-NEXT: .cfi_negate_ra_state
; CHECK-NEXT: br x0
musttail call swifttailcc void %callee(ptr swiftasync %ctx)
ret void
}