191 lines · plain
1; RUN: llc -mtriple=aarch64 -asm-verbose=0 < %s | FileCheck -DAUTIASP="hint #29" --check-prefixes=COMMON %s2; RUN: llc -mtriple=aarch64 -asm-verbose=0 -aarch64-authenticated-lr-check-method=load < %s | FileCheck -DAUTIASP="hint #29" --check-prefixes=COMMON,LDR %s3; RUN: llc -mtriple=aarch64 -asm-verbose=0 -aarch64-authenticated-lr-check-method=high-bits-notbi < %s | FileCheck -DAUTIASP="hint #29" --check-prefixes=COMMON,BITS-NOTBI,BRK %s4; RUN: llc -mtriple=aarch64 -asm-verbose=0 -aarch64-authenticated-lr-check-method=xpac-hint < %s | FileCheck -DAUTIASP="hint #29" -DXPACLRI="hint #7" --check-prefixes=COMMON,XPAC,BRK %s5; RUN: llc -mtriple=aarch64 -asm-verbose=0 -aarch64-authenticated-lr-check-method=xpac-hint -mattr=v8.3a < %s | FileCheck -DAUTIASP="autiasp" -DXPACLRI="xpaclri" --check-prefixes=COMMON,XPAC,BRK %s6; RUN: llc -mtriple=aarch64 -asm-verbose=0 -aarch64-authenticated-lr-check-method=xpac -mattr=v8.3a < %s | FileCheck -DAUTIASP="autiasp" --check-prefixes=COMMON,XPAC83,BRK %s7 8define i32 @tailcall_direct() "sign-return-address"="non-leaf" {9; COMMON-LABEL: tailcall_direct:10; COMMON: str x30, [sp, #-16]!11; COMMON: ldr x30, [sp], #1612;13; COMMON-NEXT: [[AUTIASP]]14;15; LDR-NEXT: ldr w16, [x30]16;17; BITS-NOTBI-NEXT: eor x16, x30, x30, lsl #118; BITS-NOTBI-NEXT: tbz x16, #62, .[[GOOD:Lauth_success[_0-9]+]]19;20; XPAC-NEXT: mov x16, x3021; XPAC-NEXT: [[XPACLRI]]22; XPAC-NEXT: cmp x30, x1623; XPAC-NEXT: b.eq .[[GOOD:Lauth_success[_0-9]+]]24;25; XPAC83-NEXT: mov x16, x3026; XPAC83-NEXT: xpaci x1627; XPAC83-NEXT: cmp x30, x1628; XPAC83-NEXT: b.eq .[[GOOD:Lauth_success[_0-9]+]]29;30; BRK-NEXT: brk #0xc47031; BRK-NEXT: .[[GOOD]]:32; COMMON-NEXT: b callee33 tail call void asm sideeffect "", "~{lr}"()34 %call = tail call i32 @callee()35 ret i32 %call36}37 38define i32 @tailcall_indirect(ptr %fptr) "sign-return-address"="non-leaf" {39; COMMON-LABEL: tailcall_indirect:40; COMMON: str x30, [sp, #-16]!41; COMMON: ldr x30, [sp], #1642;43; COMMON-NEXT: [[AUTIASP]]44;45; LDR-NEXT: ldr w16, [x30]46;47; BITS-NOTBI-NEXT: eor x16, x30, x30, lsl #148; BITS-NOTBI-NEXT: tbz x16, #62, .[[GOOD:Lauth_success[_0-9]+]]49;50; XPAC-NEXT: mov x16, x3051; XPAC-NEXT: [[XPACLRI]]52; XPAC-NEXT: cmp x30, x1653; XPAC-NEXT: b.eq .[[GOOD:Lauth_success[_0-9]+]]54;55; XPAC83-NEXT: mov x16, x3056; XPAC83-NEXT: xpaci x1657; XPAC83-NEXT: cmp x30, x1658; XPAC83-NEXT: b.eq .[[GOOD:Lauth_success[_0-9]+]]59;60; BRK-NEXT: brk #0xc47061; BRK-NEXT: .[[GOOD]]:62; COMMON-NEXT: br x063 tail call void asm sideeffect "", "~{lr}"()64 %call = tail call i32 %fptr()65 ret i32 %call66}67 68define i32 @tailcall_direct_noframe() "sign-return-address"="non-leaf" {69; COMMON-LABEL: tailcall_direct_noframe:70; COMMON-NEXT: .cfi_startproc71; COMMON-NEXT: b callee72 %call = tail call i32 @callee()73 ret i32 %call74}75 76define i32 @tailcall_indirect_noframe(ptr %fptr) "sign-return-address"="non-leaf" {77; COMMON-LABEL: tailcall_indirect_noframe:78; COMMON-NEXT: .cfi_startproc79; COMMON-NEXT: br x080 %call = tail call i32 %fptr()81 ret i32 %call82}83 84define i32 @tailcall_direct_noframe_sign_all() "sign-return-address"="all" {85; COMMON-LABEL: tailcall_direct_noframe_sign_all:86; COMMON-NOT: str{{.*}}x3087; COMMON-NOT: ldr{{.*}}x3088;89; COMMON: [[AUTIASP]]90;91; LDR-NEXT: ldr w16, [x30]92;93; BITS-NOTBI-NEXT: eor x16, x30, x30, lsl #194; BITS-NOTBI-NEXT: tbz x16, #62, .[[GOOD:Lauth_success[_0-9]+]]95;96; XPAC-NEXT: mov x16, x3097; XPAC-NEXT: [[XPACLRI]]98; XPAC-NEXT: cmp x30, x1699; XPAC-NEXT: b.eq .[[GOOD:Lauth_success[_0-9]+]]100;101; XPAC83-NEXT: mov x16, x30102; XPAC83-NEXT: xpaci x16103; XPAC83-NEXT: cmp x30, x16104; XPAC83-NEXT: b.eq .[[GOOD:Lauth_success[_0-9]+]]105;106; BRK-NEXT: brk #0xc470107; BRK-NEXT: .[[GOOD]]:108; COMMON-NEXT: b callee109 %call = tail call i32 @callee()110 ret i32 %call111}112 113define i32 @tailcall_indirect_noframe_sign_all(ptr %fptr) "sign-return-address"="all" {114; COMMON-LABEL: tailcall_indirect_noframe_sign_all:115; COMMON-NOT: str{{.*}}x30116; COMMON-NOT: ldr{{.*}}x30117;118; COMMON: [[AUTIASP]]119;120; LDR-NEXT: ldr w16, [x30]121;122; BITS-NOTBI-NEXT: eor x16, x30, x30, lsl #1123; BITS-NOTBI-NEXT: tbz x16, #62, .[[GOOD:Lauth_success[_0-9]+]]124;125; XPAC-NEXT: mov x16, x30126; XPAC-NEXT: [[XPACLRI]]127; XPAC-NEXT: cmp x30, x16128; XPAC-NEXT: b.eq .[[GOOD:Lauth_success[_0-9]+]]129;130; XPAC83-NEXT: mov x16, x30131; XPAC83-NEXT: xpaci x16132; XPAC83-NEXT: cmp x30, x16133; XPAC83-NEXT: b.eq .[[GOOD:Lauth_success[_0-9]+]]134;135; BRK-NEXT: brk #0xc470136; BRK-NEXT: .[[GOOD]]:137; COMMON-NEXT: br x0138 %call = tail call i32 %fptr()139 ret i32 %call140}141 142define i32 @tailcall_ib_key() "sign-return-address"="all" "sign-return-address-key"="b_key" {143; COMMON-LABEL: tailcall_ib_key:144;145; BRK: brk #0xc471146; BRK-NEXT: .{{Lauth_success.*}}:147; COMMON: b callee148 tail call void asm sideeffect "", "~{lr}"()149 %call = tail call i32 @callee()150 ret i32 %call151}152 153define i32 @tailcall_two_branches(i1 %0) "sign-return-address"="all" {154; COMMON-LABEL: tailcall_two_branches:155; COMMON: tbz w0, #0, .[[ELSE:LBB[_0-9]+]]156; COMMON: str x30, [sp, #-16]!157; COMMON: bl callee2158; COMMON: ldr x30, [sp], #16159; COMMON-NEXT: .[[ELSE]]:160; COMMON-NEXT: [[AUTIASP]]161 162; LDR-NEXT: ldr w16, [x30]163;164; BITS-NOTBI-NEXT: eor x16, x30, x30, lsl #1165; BITS-NOTBI-NEXT: tbz x16, #62, .[[GOOD:Lauth_success[_0-9]+]]166;167; XPAC-NEXT: mov x16, x30168; XPAC-NEXT: [[XPACLRI]]169; XPAC-NEXT: cmp x30, x16170; XPAC-NEXT: b.eq .[[GOOD:Lauth_success[_0-9]+]]171;172; XPAC83-NEXT: mov x16, x30173; XPAC83-NEXT: xpaci x16174; XPAC83-NEXT: cmp x30, x16175; XPAC83-NEXT: b.eq .[[GOOD:Lauth_success[_0-9]+]]176;177; BRK-NEXT: brk #0xc470178; BRK-NEXT: .[[GOOD]]:179; COMMON-NEXT: b callee180 br i1 %0, label %2, label %31812:182 call void @callee2()183 br label %31843:185 %call = tail call i32 @callee()186 ret i32 %call187}188 189declare i32 @callee()190declare void @callee2()191