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