brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · bcb1106 Raw
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