108 lines · plain
1; RUN: llc -mtriple=i686 %s -o - | FileCheck --check-prefixes=CHECK,X86 %s2; RUN: llc -mtriple=x86_64 %s -o - | FileCheck --check-prefixes=CHECK,X64 %s3 4;; -fpatchable-function-entry=0 -fcf-protection=branch5define void @f0() "patchable-function-entry"="0" {6; CHECK-LABEL: f0:7; CHECK-NEXT: .Lfunc_begin0:8; CHECK-NEXT: .cfi_startproc9; CHECK-NEXT: # %bb.0:10; X86-NEXT: endbr3211; X64-NEXT: endbr6412; CHECK-NEXT: ret13; CHECK-NOT: .section __patchable_function_entries14 ret void15}16 17;; -fpatchable-function-entry=1 -fcf-protection=branch18;; For M=0, place the label .Lpatch0 after the initial ENDBR.19;; .cfi_startproc should be placed at the function entry.20define void @f1() "patchable-function-entry"="1" {21; CHECK-LABEL: f1:22; CHECK-NEXT: .Lfunc_begin1:23; CHECK-NEXT: .cfi_startproc24; CHECK-NEXT: # %bb.0:25; X86-NEXT: endbr3226; X64-NEXT: endbr6427; CHECK-NEXT: .Lpatch0:28; CHECK-NEXT: nop29; CHECK-NEXT: ret30; CHECK: .section __patchable_function_entries,"awo",@progbits,f1{{$}}31; X86-NEXT: .p2align 232; X86-NEXT: .long .Lpatch033; X64-NEXT: .p2align 334; X64-NEXT: .quad .Lpatch035 ret void36}37 38;; -fpatchable-function-entry=2,1 -fcf-protection=branch39define void @f2_1() "patchable-function-entry"="1" "patchable-function-prefix"="1" {40; CHECK-LABEL: .type f2_1,@function41; CHECK-NEXT: .Ltmp0:42; CHECK-NEXT: nop43; CHECK-NEXT: f2_1:44; CHECK-NEXT: .Lfunc_begin2:45; CHECK-NEXT: .cfi_startproc46; CHECK-NEXT: # %bb.0:47; X86-NEXT: endbr3248; X64-NEXT: endbr6449; CHECK-NEXT: nop50; CHECK-NEXT: ret51; CHECK: .Lfunc_end2:52; CHECK-NEXT: .size f2_1, .Lfunc_end2-f2_153; CHECK: .section __patchable_function_entries,"awo",@progbits,f2_1{{$}}54; X86-NEXT: .p2align 255; X86-NEXT: .long .Ltmp056; X64-NEXT: .p2align 357; X64-NEXT: .quad .Ltmp058 ret void59}60 61;; -fpatchable-function-entry=1 -fcf-protection=branch62;; For M=0, don't create .Lpatch0 if the initial instruction is not ENDBR,63;; even if other basic blocks may have ENDBR.64@buf = internal global [5 x ptr] zeroinitializer65declare i32 @llvm.eh.sjlj.setjmp(ptr)66 67define internal void @f1i() "patchable-function-entry"="1" {68; CHECK-LABEL: f1i:69; CHECK-NEXT: .Lfunc_begin3:70; CHECK-NEXT: .cfi_startproc71; CHECK-NEXT: # %bb.0:72; CHECK-NEXT: nop73; CHECK-NOT: .Lpatch0:74;; Another basic block has ENDBR, but it doesn't affect our decision to not create .Lpatch075; CHECK: endbr76; CHECK: .section __patchable_function_entries,"awo",@progbits,f1i{{$}}77; X86-NEXT: .p2align 278; X86-NEXT: .long .Lfunc_begin379; X64-NEXT: .p2align 380; X64-NEXT: .quad .Lfunc_begin381entry:82 tail call i32 @llvm.eh.sjlj.setjmp(ptr @buf)83 ret void84}85 86;; Test the interaction with -fsanitize=function.87; CHECK: .type sanitize_function,@function88; CHECK-NEXT: .Ltmp{{.*}}:89; CHECK-NEXT: nop90; CHECK-NEXT: .long 323838233491; CHECK-NEXT: .long 4292; CHECK-NEXT: sanitize_function:93; CHECK-NEXT: .Lfunc_begin{{.*}}:94; CHECK-NEXT: .cfi_startproc95; CHECK-NEXT: # %bb.0:96; X86-NEXT: endbr3297; X64-NEXT: endbr6498; CHECK-NEXT: nop99; CHECK-NEXT: ret100define void @sanitize_function(ptr noundef %x) "patchable-function-prefix"="1" "patchable-function-entry"="1" !func_sanitize !1 {101 ret void102}103 104!llvm.module.flags = !{!0}105 106!0 = !{i32 8, !"cf-protection-branch", i32 1}107!1 = !{i32 3238382334, i32 42}108