1f554e272SFangrui Song; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s 29a24488cSFangrui Song 3a88c722eSMomchil Velikovdefine void @f0() "patchable-function-entry"="0" "branch-target-enforcement"="true" { 49a24488cSFangrui Song; CHECK-LABEL: f0: 59a24488cSFangrui Song; CHECK-NEXT: .Lfunc_begin0: 622467e25SFangrui Song; CHECK: // %bb.0: 7d232c215SFangrui Song; CHECK-NEXT: hint #34 822467e25SFangrui Song; CHECK-NEXT: ret 9d232c215SFangrui Song; CHECK-NOT: .section __patchable_function_entries 1022467e25SFangrui Song ret void 119a24488cSFangrui Song} 129a24488cSFangrui Song 1322467e25SFangrui Song;; -fpatchable-function-entry=1 -mbranch-protection=bti 1406b8e32dSFangrui Song;; For M=0, place the label .Lpatch0 after the initial BTI. 15a88c722eSMomchil Velikovdefine void @f1() "patchable-function-entry"="1" "branch-target-enforcement"="true" { 169a24488cSFangrui Song; CHECK-LABEL: f1: 179a24488cSFangrui Song; CHECK-NEXT: .Lfunc_begin1: 188ff86fcfSFangrui Song; CHECK-NEXT: .cfi_startproc 198ff86fcfSFangrui Song; CHECK-NEXT: // %bb.0: 2006b8e32dSFangrui Song; CHECK-NEXT: hint #34 2106b8e32dSFangrui Song; CHECK-NEXT: .Lpatch0: 229a24488cSFangrui Song; CHECK-NEXT: nop 2322467e25SFangrui Song; CHECK-NEXT: ret 24f554e272SFangrui Song; CHECK: .section __patchable_function_entries,"awo",@progbits,f1{{$}} 259a24488cSFangrui Song; CHECK-NEXT: .p2align 3 2606b8e32dSFangrui Song; CHECK-NEXT: .xword .Lpatch0 2722467e25SFangrui Song ret void 2822467e25SFangrui Song} 2922467e25SFangrui Song 3022467e25SFangrui Song;; -fpatchable-function-entry=2,1 -mbranch-protection=bti 31a88c722eSMomchil Velikovdefine void @f2_1() "patchable-function-entry"="1" "patchable-function-prefix"="1" "branch-target-enforcement"="true" { 3222467e25SFangrui Song; CHECK-LABEL: .type f2_1,@function 3322467e25SFangrui Song; CHECK-NEXT: .Ltmp0: 3422467e25SFangrui Song; CHECK-NEXT: nop 3522467e25SFangrui Song; CHECK-NEXT: f2_1: 3622467e25SFangrui Song; CHECK-NEXT: .Lfunc_begin2: 378ff86fcfSFangrui Song; CHECK-NEXT: .cfi_startproc 388ff86fcfSFangrui Song; CHECK-NEXT: // %bb.0: 3922467e25SFangrui Song; CHECK-NEXT: hint #34 4022467e25SFangrui Song; CHECK-NEXT: nop 4122467e25SFangrui Song; CHECK-NEXT: ret 4222467e25SFangrui Song; CHECK: .Lfunc_end2: 4322467e25SFangrui Song; CHECK-NEXT: .size f2_1, .Lfunc_end2-f2_1 44f554e272SFangrui Song; CHECK: .section __patchable_function_entries,"awo",@progbits,f2_1{{$}} 4522467e25SFangrui Song; CHECK-NEXT: .p2align 3 4622467e25SFangrui Song; CHECK-NEXT: .xword .Ltmp0 4722467e25SFangrui Song ret void 489a24488cSFangrui Song} 4906b8e32dSFangrui Song 5006b8e32dSFangrui Song;; -fpatchable-function-entry=1 -mbranch-protection=bti 51*cca40aa8SPablo Barrio;; We add BTI c even when the function has internal linkage 52a88c722eSMomchil Velikovdefine internal void @f1i(i64 %v) "patchable-function-entry"="1" "branch-target-enforcement"="true" { 5306b8e32dSFangrui Song; CHECK-LABEL: f1i: 5406b8e32dSFangrui Song; CHECK-NEXT: .Lfunc_begin3: 5506b8e32dSFangrui Song; CHECK: // %bb.0: 56*cca40aa8SPablo Barrio; CHECK-NEXT: hint #34 57*cca40aa8SPablo Barrio; CHECK-NEXT: .Lpatch1: 5806b8e32dSFangrui Song; CHECK-NEXT: nop 5906b8e32dSFangrui Song;; Other basic blocks have BTI, but they don't affect our decision to not create .Lpatch0 6006b8e32dSFangrui Song; CHECK: .LBB{{.+}} // %sw.bb1 6106b8e32dSFangrui Song; CHECK-NEXT: hint #36 62f554e272SFangrui Song; CHECK: .section __patchable_function_entries,"awo",@progbits,f1i{{$}} 6306b8e32dSFangrui Song; CHECK-NEXT: .p2align 3 64*cca40aa8SPablo Barrio; CHECK-NEXT: .xword .Lpatch1 6506b8e32dSFangrui Songentry: 6606b8e32dSFangrui Song switch i64 %v, label %sw.bb0 [ 6706b8e32dSFangrui Song i64 1, label %sw.bb1 6806b8e32dSFangrui Song i64 2, label %sw.bb2 6906b8e32dSFangrui Song i64 3, label %sw.bb3 7006b8e32dSFangrui Song i64 4, label %sw.bb4 7106b8e32dSFangrui Song ] 7206b8e32dSFangrui Songsw.bb0: 7306b8e32dSFangrui Song call void asm sideeffect "", ""() 7406b8e32dSFangrui Song ret void 7506b8e32dSFangrui Songsw.bb1: 7606b8e32dSFangrui Song call void asm sideeffect "", ""() 7706b8e32dSFangrui Song ret void 7806b8e32dSFangrui Songsw.bb2: 7906b8e32dSFangrui Song call void asm sideeffect "", ""() 8006b8e32dSFangrui Song ret void 8106b8e32dSFangrui Songsw.bb3: 8206b8e32dSFangrui Song call void asm sideeffect "", ""() 8306b8e32dSFangrui Song ret void 8406b8e32dSFangrui Songsw.bb4: 8506b8e32dSFangrui Song call void asm sideeffect "", ""() 8606b8e32dSFangrui Song ret void 8706b8e32dSFangrui Song} 88