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 {
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
26 %0 = cleanuppad within none []
27 %isnull = icmp eq ptr %func_ptr, null
28 br i1 %isnull, label %exit, label %callfn
31 %1 = load ptr, ptr %func_ptr, align 8
32 %2 = call i32 %1() #9 [ "funclet"(token %0) ]
36 cleanupret from %0 unwind label %catch.dispatch
42 %3 = catchswitch within none [label %catch] unwind to caller
45 %4 = catchpad within %3 [ptr null, i32 64, ptr null]
46 catchret from %4 to label %try.cont
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)
61 !llvm.module.flags = !{!0}
62 !0 = !{i32 2, !"cfguard", i32 2}