[Reland][Runtimes] Merge 'compile_commands.json' files from runtimes build (#116303)
[llvm-project.git] / llvm / test / CodeGen / X86 / cfguard-checks-funclet.ll
blobfa7388e9e59d2dd231bb983c01b35a9f5e3b5187
1 ; RUN: llc < %s -mtriple=i686-pc-windows-msvc | FileCheck %s -check-prefix=X86
2 ; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc | FileCheck %s -check-prefixes=X64
3 ; Control Flow Guard is currently only available on Windows
5 ; funclets only supported in MSVC env.
7 ; Test that Control Flow Guard Checks are added well for targets in try-catch.
10 declare i32 @target_func()
13 %eh.ThrowInfo = type { i32, ptr, ptr, ptr }
15 declare i32 @__CxxFrameHandler3(...)
16 declare void @_CxxThrowException(ptr, ptr)
18 define i32 @func_cf_exception() personality ptr @__CxxFrameHandler3 {
19 entry:
20   %func_ptr = alloca ptr, align 8
21   store ptr @target_func, ptr %func_ptr, align 8
22   invoke void @_CxxThrowException(ptr null, ptr null) #11
23           to label %unreachable unwind label %ehcleanup
25 ehcleanup:
26   %0 = cleanuppad within none []
27   %isnull = icmp eq ptr %func_ptr, null
28   br i1 %isnull, label %exit, label %callfn
30 callfn:
31   %1 = load ptr, ptr %func_ptr, align 8
32   %2 = call i32 %1() #9 [ "funclet"(token %0) ]
33   br label %exit
35 exit:
36   cleanupret from %0 unwind label %catch.dispatch
38 unreachable:
39   unreachable
41 catch.dispatch:
42   %3 = catchswitch within none [label %catch] unwind to caller
44 catch:
45   %4 = catchpad within %3 [ptr null, i32 64, ptr null]
46   catchret from %4 to label %try.cont
48 try.cont:
49   ret i32 0
51   ; X86-LABEL: func_cf_exception
52   ; X86:         calll *___guard_check_icall_fptr
53   ; X86-NEXT:    calll *%ecx
55   ; X64-LABEL: func_cf_exception
56   ; X64:       callq *__guard_dispatch_icall_fptr(%rip)
57   ; X64-NOT:   callq
61 !llvm.module.flags = !{!0}
62 !0 = !{i32 2, !"cfguard", i32 2}