brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.4 KiB · 1249163 Raw
149 lines · plain
1; RUN: llc < %s -mtriple=aarch64-pc-windows-msvc | FileCheck %s2; RUN: llc < %s -mtriple=aarch64-w64-windows-gnu | FileCheck %s3; Control Flow Guard is currently only available on Windows4 5; Test that Control Flow Guard checks are correctly added when required.6 7 8declare i32 @target_func()9 10 11; Test that Control Flow Guard checks are not added on calls with the "guard_nocf" attribute.12define i32 @func_guard_nocf() {13entry:14  %func_ptr = alloca ptr, align 815  store ptr @target_func, ptr %func_ptr, align 816  %0 = load ptr, ptr %func_ptr, align 817  %1 = call i32 %0() #018  ret i32 %119 20  ; CHECK-LABEL: func_guard_nocf21  ; CHECK:       adrp x8, target_func22	; CHECK:       add x8, x8, :lo12:target_func23  ; CHECK-NOT:   __guard_check_icall_fptr24	; CHECK:       blr x825}26attributes #0 = { "guard_nocf" }27 28 29; Test that Control Flow Guard checks are added even at -O0.30define i32 @func_optnone_cf() #1 {31entry:32  %func_ptr = alloca ptr, align 833  store ptr @target_func, ptr %func_ptr, align 834  %0 = load ptr, ptr %func_ptr, align 835  %1 = call i32 %0()36  ret i32 %137 38  ; The call to __guard_check_icall_fptr should come immediately before the call to the target function.39  ; CHECK-LABEL: func_optnone_cf40	; CHECK:        adrp x8, target_func41	; CHECK:        add x8, x8, :lo12:target_func42	; CHECK:        adrp x9, __guard_check_icall_fptr43	; CHECK:        add x9, x9, :lo12:__guard_check_icall_fptr44	; CHECK:        ldr x9, [x9]45	; CHECK:        mov x15, x846	; CHECK:        blr x947	; CHECK-NEXT:   blr x848}49attributes #1 = { noinline optnone }50 51 52; Test that Control Flow Guard checks are correctly added in optimized code (common case).53define i32 @func_cf() {54entry:55  %func_ptr = alloca ptr, align 856  store ptr @target_func, ptr %func_ptr, align 857  %0 = load ptr, ptr %func_ptr, align 858  %1 = call i32 %0()59  ret i32 %160 61  ; The call to __guard_check_icall_fptr should come immediately before the call to the target function.62  ; CHECK-LABEL: func_cf63  ; CHECK:        adrp x8, __guard_check_icall_fptr64	; CHECK:        ldr x9, [x8, :lo12:__guard_check_icall_fptr]65	; CHECK:        adrp x8, target_func66	; CHECK:        add x8, x8, :lo12:target_func67	; CHECK:        mov x15, x868	; CHECK: 	     	blr x969	; CHECK-NEXT:   blr x870}71 72 73; Test that Control Flow Guard checks are correctly added on invoke instructions.74define i32 @func_cf_invoke() personality ptr @h {75entry:76  %0 = alloca i32, align 477  %func_ptr = alloca ptr, align 878  store ptr @target_func, ptr %func_ptr, align 879  %1 = load ptr, ptr %func_ptr, align 880  %2 = invoke i32 %1()81          to label %invoke.cont unwind label %lpad82invoke.cont:                                      ; preds = %entry83  ret i32 %284 85lpad:                                             ; preds = %entry86  %tmp = landingpad { ptr, i32 }87          catch ptr null88  ret i32 -189 90  ; The call to __guard_check_icall_fptr should come immediately before the call to the target function.91  ; CHECK-LABEL: func_cf_invoke92  ; CHECK:        adrp x8, __guard_check_icall_fptr93	; CHECK:        ldr x9, [x8, :lo12:__guard_check_icall_fptr]94	; CHECK:        adrp x8, target_func95	; CHECK:        add x8, x8, :lo12:target_func96	; CHECK:        mov x15, x897	; CHECK:        blr x998  ; CHECK-NEXT:   .Ltmp0:99	; CHECK-NEXT:   blr x8100  ; CHECK:       // %common.ret101  ; CHECK:       // %lpad102}103 104declare void @h()105 106 107; Test that longjmp targets have public labels and are included in the .gljmp section.108%struct._SETJMP_FLOAT128 = type { [2 x i64] }109@buf1 = internal global [16 x %struct._SETJMP_FLOAT128] zeroinitializer, align 16110 111define i32 @func_cf_setjmp() {112  %1 = alloca i32, align 4113  %2 = alloca i32, align 4114  store i32 0, ptr %1, align 4115  store i32 -1, ptr %2, align 4116  %3 = call ptr @llvm.frameaddress(i32 0)117  %4 = call i32 @_setjmp(ptr @buf1, ptr %3) #2118 119  ; CHECK-LABEL: func_cf_setjmp120  ; CHECK:       bl _setjmp121  ; CHECK-NEXT:  $cfgsj_func_cf_setjmp0:122 123  %5 = call ptr @llvm.frameaddress(i32 0)124  %6 = call i32 @_setjmp(ptr @buf1, ptr %5) #3125 126  ; CHECK:       bl _setjmp127  ; CHECK-NEXT:  $cfgsj_func_cf_setjmp1:128 129  store i32 1, ptr %2, align 4130  %7 = load i32, ptr %2, align 4131  ret i32 %7132 133  ; CHECK:       .section .gljmp$y,"dr"134  ; CHECK-NEXT:  .symidx $cfgsj_func_cf_setjmp0135  ; CHECK-NEXT:  .symidx $cfgsj_func_cf_setjmp1136}137 138declare ptr @llvm.frameaddress(i32)139 140; Function Attrs: returns_twice141declare dso_local i32 @_setjmp(ptr, ptr) #2142 143attributes #2 = { returns_twice }144attributes #3 = { returns_twice }145 146 147!llvm.module.flags = !{!0}148!0 = !{i32 2, !"cfguard", i32 2}149