1; RUN: llc -mtriple=aarch64 %s -o - | FileCheck --check-prefixes=CHECK %s 2 3define void @f0() "patchable-function-entry"="0" "branch-target-enforcement" { 4; CHECK-LABEL: f0: 5; CHECK-NEXT: .Lfunc_begin0: 6; CHECK: // %bb.0: 7; CHECK-NEXT: hint #34 8; CHECK-NEXT: ret 9; CHECK-NOT: .section __patchable_function_entries 10 ret void 11} 12 13;; -fpatchable-function-entry=1 -mbranch-protection=bti 14;; For M=0, place the label .Lpatch0 after the initial BTI. 15define void @f1() "patchable-function-entry"="1" "branch-target-enforcement" { 16; CHECK-LABEL: f1: 17; CHECK-NEXT: .Lfunc_begin1: 18; CHECK: // %bb.0: 19; CHECK-NEXT: hint #34 20; CHECK-NEXT: .Lpatch0: 21; CHECK-NEXT: nop 22; CHECK-NEXT: ret 23; CHECK: .section __patchable_function_entries,"awo",@progbits,f1,unique,0 24; CHECK-NEXT: .p2align 3 25; CHECK-NEXT: .xword .Lpatch0 26 ret void 27} 28 29;; -fpatchable-function-entry=2,1 -mbranch-protection=bti 30define void @f2_1() "patchable-function-entry"="1" "patchable-function-prefix"="1" "branch-target-enforcement" { 31; CHECK-LABEL: .type f2_1,@function 32; CHECK-NEXT: .Ltmp0: 33; CHECK-NEXT: nop 34; CHECK-NEXT: f2_1: 35; CHECK-NEXT: .Lfunc_begin2: 36; CHECK: // %bb.0: 37; CHECK-NEXT: hint #34 38; CHECK-NEXT: nop 39; CHECK-NEXT: ret 40; CHECK: .Lfunc_end2: 41; CHECK-NEXT: .size f2_1, .Lfunc_end2-f2_1 42; CHECK: .section __patchable_function_entries,"awo",@progbits,f1,unique,0 43; CHECK-NEXT: .p2align 3 44; CHECK-NEXT: .xword .Ltmp0 45 ret void 46} 47 48;; -fpatchable-function-entry=1 -mbranch-protection=bti 49;; For M=0, don't create .Lpatch0 if the initial instruction is not BTI, 50;; even if other basic blocks may have BTI. 51define internal void @f1i(i64 %v) "patchable-function-entry"="1" "branch-target-enforcement" { 52; CHECK-LABEL: f1i: 53; CHECK-NEXT: .Lfunc_begin3: 54; CHECK: // %bb.0: 55; CHECK-NEXT: nop 56;; Other basic blocks have BTI, but they don't affect our decision to not create .Lpatch0 57; CHECK: .LBB{{.+}} // %sw.bb1 58; CHECK-NEXT: hint #36 59; CHECK: .section __patchable_function_entries,"awo",@progbits,f1,unique,0 60; CHECK-NEXT: .p2align 3 61; CHECK-NEXT: .xword .Lfunc_begin3 62entry: 63 switch i64 %v, label %sw.bb0 [ 64 i64 1, label %sw.bb1 65 i64 2, label %sw.bb2 66 i64 3, label %sw.bb3 67 i64 4, label %sw.bb4 68 ] 69sw.bb0: 70 call void asm sideeffect "", ""() 71 ret void 72sw.bb1: 73 call void asm sideeffect "", ""() 74 ret void 75sw.bb2: 76 call void asm sideeffect "", ""() 77 ret void 78sw.bb3: 79 call void asm sideeffect "", ""() 80 ret void 81sw.bb4: 82 call void asm sideeffect "", ""() 83 ret void 84} 85